FlyoDoc_2011 Pisa 2011 by GmP --- 011
Defines | Functions

flyopunta/src/src_main/main.cpp File Reference

#include "flyoh.h"
#include "flyoana.h"
#include "fase3max.h"

Go to the source code of this file.

Functions

void Get_Data_Gen ()
void Compatibility ()
int main (int argc, char *argv[])

Detailed Description

Flyo è un montecarlo veloce, scritto completamente in C++, compatibile con Root e con Paw, particolarmente adatto per la simulazione di eventi di fisica delle alte energia in apparati di forme complesse ed arbitrarie.

main:

Nota
La elaborazione degli eventi accumulati è in genere sincrona con i trigger, mentre nel caso che sia on il Pileup la simulazione fine dei device [flyosimuladev()],l'analisi e la scrittura sono eseguiti in modo asincrono alla generazione. In particolare l'analisi sugli eventi, accumulati nel buffer circolare, parte solo dopo un lasso di tempo, (per esempio Tpipe=250 ns) per da agio alle informazioni via, via generate di popolare le time slot della pipeline (qui di 25 ns) prima e dopo adiacenti all'evento che ha generato il trigger come accede nella realtà.

Author:
Giuseppe Pierazzini

Definition in file main.cpp.


Function Documentation

void Compatibility ( )

Compabilità tra le procedure richieste

Definition at line 181 of file main.cpp.

{
    // compatibility....
    if ( Pipeline==1 &&  Luce!=0 )
    {
        Gout<<"\n ****  Pipeline and Illumina  incompatibilty... attention ..."<< endl;
        cout<<"\n ****  Pipeline and Illumina  incompatibilty... attention ..."<< endl;
        exit ( 0 );
    }
    if ( Pipeline==1 && Radio!=0 )
    {
        Gout<<"\n ****  Pipeline and Radx  incompatibilty... attention! ..."<< endl;
        cout<<"\n ****  Pipeline and Radx  incompatibilty... attention! ..."<< endl;
        exit ( 0 );
    }
    // triger of low level on....
    if ( Trigger_low_on==1 ) Gout<<"\n ***** -> trgtest <-  set up... did you test the Trigger->Calcola procedure?"<<endl;
}
void Get_Data_Gen ( )

Seleziona i dev da usare o da escludere nella procedura di simulazione.

Definition at line 168 of file main.cpp.

{
    Device *dev=Apparato;
    while ( dev!=0 )
    {
        if ( dev->escludi!=1 ) dev->Fill_Default();
        dev= dev->next;
    }
}
int main ( int  argc,
char *  argv[] 
)

in Get_DatiOut(); si copiano i dati misurati ( M_Hits ) nelle variabili standard per Root altre variabili per Root possono essere state definite altrove... (in SimulaDev per esempio!) ricordarsi di azzerare le variabili Root aggiunte in Reset_RootData();

Definition at line 36 of file main.cpp.

{
    gargc=argc;
    gargv=argv;

    //  all init..
    flyoinit();
    Gout<<"\n Flyoinit done. "<<flush;

    //==========
// test on comnpatibility...
    Compatibility();
    //==========
//init fits, and the data out_file
    FitsControl ( 0 );
    Gout<<"\n FitsControl(0) done. "<<flush;
    Scrivi_Dati ( 0 );
    Gout<<"\n Scrivi_nt(0)) done. "<<flush;


// ========================================================

//***********************************************************
//***********************   L O O P   ***********************
//***********************************************************

    SelRea=0;


//  main do loop
    while ( Eventi_Fatti<evento_.Mxev )
    {
        // reset reazioni e  devices...
        if ( SelRea!=0 ) SelRea->Reset_Rea();
        Reset_Devices();

        Eventi_Fatti++;
        evento_.Gen.Event=Eventi_Fatti;

// flyoevento() ritorna un numero che dipende dai dev colpiti
// se un detector colpito ha il flag veto, si termina la generazione e si va al prossimo evento...
// attenzione la flag veto non è compatibile con pipelin on poichè l'evento non viene tracciato completamente!!!!

//  ==== E V E N T      G E N E R A T I O N   ====
        evento_.Gen.trigger_flag=flyoevento();  //done no zero if at least  one dev has been hit...
//  ==== E V E N T     D O N E   ====

        if ( evento_.Gen.trigger_flag<=0 ) continue; // if no detector was shot skip to the next event.

        if ( Luce!=0 ) Luce->Store_Illumina();// better if Luce  activated without the pipeline. See Compatibility()

        evento_.Define_Standard_Header();      // event title and basic parameters...
        if ( Pipeline==1 ) evento_.Put_Header_into_Buffer();


//=====================================================
//-----------------------------------------------------
// inizio loop  per la elaborazione degli eventi memorizzati nel buffer circolare.
// che hanno generato un trigger di basso livello: almeno un device toccato (done).
// La elaborazione dei trigger è asincrona rispetto alla generazione,
// si elaborano comunque tutti gli eventi con  trigger generati Tpipe ns prima dell'ultimo evento generato.
// se la pipeline non è attivata la loop è dummy....


        static double triggerpast=0.0;
        while ( 1 )
        {
            if ( Pipeline==1 )
            {
// estraggo i titoli dal buffer degli header...
// estraggo i dati delle pipeline dei dev in una finestra di
// +- Tpipe attorno al tempo del trigger
// il trigger dev essere almeno "Tpipe" ns prima del tempo attuale.
                if ( evento_.Get_Header_from_Buffer() <0 ) break; //if no more events ... skip...
            }
            else Get_Data_Gen();  // semplicemente copia i dati generati nel buffer  M_Hits

// if Trigger_box is on .. check the level 0 trigger.
            if ( Trigger!=0 )
            {
                evento_.Gen.trigger_flag=Trigger->Level0();
                if (evento_.Gen.trigger_flag==0 ) break;   // if not... skip and look for a new trigger
                evento_.Gen.ttrigdif=evento_.Gen.tempo-triggerpast; // redefinition .. see event0.cpp
                triggerpast=evento_.Gen.tempo;
            }

//==================================== S I M U L A ===========================
            flyosimuladev();
//==================================== E N D      S I M U L A ===========================

            Device *pv;
            pv=Apparato;
            while ( pv!=0 )
            {
                if ( pv->escludi==0 ) pv->Get_DatiOut();
                pv=pv->next;
            }
            if ( Radio!=0 ) Radio->Store_Radx(); //take a radiografy of the apparatus!!!
//===============================================================
// si procede all'analisi dei dati misurati se richiesto
            if ( Primofit!=0 )   FitsControl ( 1 );

// e si scrive tutto sul file di uscita
            Scrivi_Dati ( 1 );

// se la pipeline è off non itero...passo alla generazione del prossimo evento...
            if ( Pipeline==0 ) break;
        }
    }  
//=====end event main loop  ======

//==== closing the simulation ===============
//==================
//  program ends.....

    if ( Fasemx!=0 ) Fasemx->Info();
    Gout<<"\n\n ======>>>  E n d      p r o g r a m    s u m m a r y "<<endl;
    if ( Primofit!=0 ) FitsControl ( 2 );
    Scrivi_Dati ( 2 );
    flyoend();
    cout<<"\n\n ======>>>  E n d      p r o g r a m  "<<endl;
    return 0;
}
 All Classes Namespaces Files Functions Variables