FlyoDoc_2011 Pisa 2011 by GmP --- 011
Public Member Functions | Public Attributes | Protected Attributes | Friends

Device Class Reference

#include <device.h>

Inheritance diagram for Device:
DevCln DevRt DevSfera DevCedar DevClRt DevCrn Devkabes DevSector DevGtk DevOt DevRtCl DevRtRt DevSac DevXTax

List of all members.

Public Member Functions

 Device ()
void Leggi_schede_dev ()
char * Get_Nome ()
char * Get_NickName ()
int Get_Idev ()
const char * Get_Vede (int i)
void Make_working_buffer (int)
void Make_measur_buffer (int)
int Fill_Default ()
virtual void Reset_RootData ()
int Get_DatiOut ()
double Get_Zsize ()
void Change_sign_Field ()
void Set_Field (double B)
void Set_Rivela (Particella *)
void Reset_Dev ()
void Reset_Pos ()
void Dev_summary ()
void SpiaPr (char *, int, int, double)
void Set_X_dev (gvet gv)
gvetGet_X_dev ()
gvetGet_Centro ()
gvetGet_Cface ()
gvetGet_Lout ()
gvetGet_Lin ()
double Get_Kik ()
void Get_Materiali ()
void GetWindowHits (double)
virtual int SimulaDev ()
virtual gvetLab2Dev (gvet &)
virtual gvetLab2cDev (gvet &)
virtual gvetDev2Lab (gvet &)
virtual gvetDevc2Lab (gvet &)
virtual int Posizione ()
virtual double CamEster ()
virtual double CamInter ()
virtual double CamBuco ()
virtual void ScrvColpi (Particella *)
virtual int Traccia (Particella *)
 ================ T R A C C I A ====================================
virtual gvetGet_Field (gvet &x)
virtual gvetGet_Field ()
virtual int Mscatter (Particella *, double)
virtual void DataSmear ()
virtual double Msperdita (double)
virtual double Get_Res ()
virtual int Get_Structinfo ()
void PrgeomId ()
virtual void Prgeom ()
void Get_Pointers ()
DeviceGet_Pointer (const char *)
DeviceGet_camm (Particella *)

Public Attributes

int maxBrems
int maxPair
int Brem_done
int Pair_done
int gnhit
int ghcir
int ghit_last
int nhit
int mhit
int Start_Hit
double eDev
BufdevHits
int working_buffer
int circular_buffer
BufdevG_Hits
BufdevM_Hits
int hit_recorded
int * index
int * mid
int * structinfo
int * mdead
unsigned long long * devstory
float emDev
float * mxd
float * myd
float * mzd
float * mdd
float * me
float * mxl
float * myl
float * mzl
float * gpx
float * gpy
float * gpz
float * ge
double * dtemp
Particellapr_dev
int nowpos
int prevpos
int accedi
int escludi
int rivela
int Idsee
int wrout
int Tot_seen
int Part_hit [40]
Deviceup
Devicenext

Protected Attributes

int devtype
std::string devclass
int idev
char nome [9]
char nickname [9]
const char * fun
int nvede
int assorb [30]
const char * vede [30]
int registra
gvet Centro
gvet Centrin
gvet Cface
gvet Nx
gvet Ny
gvet Nz
gvet Lout
gvet Lin
gvet Fortax
gvet X_dev
gvet V_dev
double OpenSector
double Rqsize
std::string mattint
std::string mattbuc
int Zint
int Zbuc
double Aint
double Abuc
double liint
double libuc
double Roint
double Robuc
double Dedxint
double Dedxbuc
double lradi
double lradb
double lrad
double nrad
double Ro
double Dedx
double lint
double reckik
gvet Field
int campo
double Bref
double Dbref
gvet Field_sav
double time_now
double t_dead_mem
double cost
double sint
double sinf
double cosf
double txplane
double typlane
double tet0
double xplane
double yplane
double z1
double z2
double Last_distq
double dcs
double path
double tratto
double camm
int posok
int pos

Friends

class Particella
class TriggerBox
class Radiografia

Detailed Description

device è la classe base di tutte la classi che descrivono i rivelatori. Per convenzione le classi dei rivelatori iniziano con "dev". In device appaiono:

Author:
Giuseppe Pierazzini

Definition at line 96 of file device.h.


Constructor & Destructor Documentation

Device::Device ( )

Class base per i rivelatori. Il costruttore Device() legge i file ( di solito di tipo .app) degli apparati con le definizioni geometriche e dei materiali dei rivelatori.

Definition at line 35 of file device.cpp.

{
    working_buffer=MemoryBuffer;
    Make_working_buffer ( working_buffer );
    Make_measur_buffer ( working_buffer );
    // create e new device
    tot_device++;
    idev = tot_device;
    devtype=TypDevice;  //=0
    if ( last_device== 0 ) Apparato=this;
    else             last_device->next = this;   // linking
    up=last_device;
    last_device = this;
    this->next = 0;   // end linking

    // default orientation and zero setting
    Nx.setvn ( 1.,0.,0. );
    Ny.setvn ( 0.,1.,0. );
    Nz.setvn ( 0.,0.,1. );
    Tot_seen=0;
    for ( int i=0;i<40;i++ ) Part_hit[i]=0;
    nhit =ghcir= gnhit=nvede = -1;
    ghit_last=mhit=0;

    nowpos=prevpos=6;
    wrout=accedi=escludi=rivela=Zint=Zbuc=0;
    registra=1;
    campo=-1;
    reckik=-1. ; // reconstruction Kik non defined
    mattint="";
    mattbuc="";
    maxBrems=maxPair=0;    //if >1 enable bremsstrhalung  and pair production
    Brem_done=Pair_done=0;
    eDev=t_dead_mem =time_now=Ro =Dedx =0.0;
    Roint=Robuc=Dedxint=Dedxbuc=0.0;
    Aint=Abuc=lradi = lradb=lrad= 0.0;
    fun=Nodef;       // set default function at None...

// legge i dati di definizione del dev
    Leggi_schede_dev();
}

Member Function Documentation

int Device::Fill_Default ( )

Se il Pipeline non è attivo si caricano i dati da G_Hits in M_Hits in successione sincrona con la generazione.

Definition at line 674 of file device.cpp.

{
    mhit=nhit+1;
//  Gout<<"\n Default copy Ev "<< evento_.Gen.Event<<" dev "<<nome<< " hits "<< mhit;

    for ( int i=0;i<mhit;i++ )
    {
        M_Hits[i] =Hits[i];
    }
    return mhit;
}
Device * Device::Get_camm ( Particella pr)

Procedura per calcolare il cammino libero di una particella prima di colpire la superficie, esterna o interna di un device. Ritorna il puntatore al device, il cammino libero e definisce due flags di posizione: uno relativo alla posizione di provenienza ed uno alla posizione attuale.
Vedi la tabella in cui gli indici mostrano la posizione della particella prima di iniziare la tracciatura (prevpos) e la posizione attuale (nowpos) rispetto al device restituito.

prevpos nowpos definizione
3 1 da posizione non definita (appena nata) ora esterna al dev
1 1 da posizione esterna ancora esterna
3 0 da posizione non def ora interna.
1 0 da posizione esterna ora interna
0 0 da posizione interna ancora interna
0 -1 da posizione interna ora nel buco
-1 -1 da posizione nel buco ancora nel buco

In particolare il significato dell'indice:

  • 3 = posizione non definita; è il caso di una particella appena nata
  • 1 = esterna al rivelatore o device
  • 0 = interna al rivelatore
  • -1 = internamente al "buco" del rivelatore; per esempio nel buco dove passa la pipe!

Definition at line 1282 of file device.cpp.

{
    //  double tratto,path;  ...in device.h
    //  int posok,pos;
    //  double Last_distq=1.e+12;
    Device *Dvk,*Dev;
    //
    path=1.e+10;
    Dvk=0;
    Dev=this;    // device di partenza per la loop
    posok=3;


    while ( Dev!=0 )
    {


        if ( Dev->accedi>0|| Dev->escludi>0||
                Dev->rivela<0 )      // dev non visibile o non vede
        {

            if ( Dev == Devloop ) Devloop = Devloop->next; //  aggiorno Devloop
            Dev=Dev->next;
            continue;
        }



        //--------------------=================----------------
        Dev->pr_dev=pr;
        Dev->X_dev=Dev->Lab2cDev ( pr->X ); // trasla al centro dev e ruota
        Dev->V_dev=Dev->Lab2Dev ( pr->Vers ); // routa il versore.... att. aggiornato!

        Dev->X_dev.Norma();
        if ( Dev->X_dev.normaq>Dev->Rqsize )  // test grossolano ma veloce  per dev esterno
        {
            dcs=Dev->X_dev%Dev->V_dev;   // dist. dal centro dev proiet. sul cammino
            if ( dcs>=0.0 )  // dev superato
            {
                if ( Dev == Devloop ) Devloop = Devloop->next; //  aggiorno Devloop
                Dev->accedi=13;

                Dev=Dev->next;
                continue;
            }
            else if ( Dev->X_dev.normaq-dcs*dcs>Dev->Rqsize )
            {
                //  Dev->accedi=12;   //no! se lo scattering o un campo cambia la direzione di volo!

                Dev=Dev->next;
                continue;
            }
        }
        // check position carefullly.....


        pos = Dev->Posizione();

//    if ( pr->idm==14 ) Dev->SpiaPr ( " Posiz ", 49,49 ,-99.);





        if ( pos==1 )              //Esterno
        {
            // calcolo il cammino per colpire il dev.....
            Dev->tratto=Dev->CamEster();
            //    if ( pr->idm==14 ) Dev->SpiaPr ( " Esterno ", 49,49 , Dev->tratto);



            if ( Dev->tratto>Dev->X_dev.norma ) Dev->tratto=Dev->X_dev.norma;
//      if ( pr->idm==14 ) Dev->SpiaPr ( " Ester ", 48,48 );

            if ( Dev->tratto<0.0001 )          // Dev not accessible or just crossed
            {
                Dev->accedi = 14;
                if ( Dev == Devloop ) Devloop = Devloop->next; //  aggiorno Devloop
                Dev=Dev->next;
                continue;
            }
            else if ( Dev->tratto<path )    // viaggia verso il dev...
            {
                path=Dev->tratto+0.01;
                if ( posok>0 )
                {
                    Dvk=Dev;
                    posok=pos;
                }
            }
        }

        else if ( pos==0 )               //Interno ..
        {
            // calcolo la dist dalle parete di uscita. o da un dev  interno
            Dev->tratto=Dev->CamInter();
            if ( Dev->tratto<path ) path=Dev->tratto+0.01;  // corretto
            Dvk=Dev;
            posok=pos;
//      if ( pr->idm==14 ) Dev->SpiaPr ( " Inter ", 48,48 );

            //qui cambiato??????????????????????????????????????
            //       break;  se non ci sono device interni si potrebbe uscire subito

        }
        else if ( pos==-1 )   //nel buco...  anxhe qui attenzione ai dev interni ......
        {
            Dev->tratto=Dev->CamBuco();
            if ( Dev->nowpos>-1 )
            {
                Dvk=Dev;
                posok=pos;
            }
            if ( Dev->tratto<path )  // corretto
            {
                path=Dev->tratto+0.01;
                if ( posok>-1 )
                {
                    Dvk=Dev;
                    posok=pos;
                }
            }

        }


        Dev=Dev->next;
    }       // end loop

    if ( Dvk!=0 )
    {


        Dvk->pr_dev=pr;   // ricordo l'indirizzo della particella in tracing..
        Dvk->camm= path+CEPSI;
        Dvk->prevpos=Dvk->nowpos;
        Dvk->nowpos=posok;
//  Dvk->SpiaPr ( " Scelt ", 2,4, Dvk->camm );
    }
    return Dvk;
}
int Device::Get_DatiOut ( )

Copia i dati ricostruiti (flags, coordinate e parametri cinematici), da M.Hits nelle variabili per il file Root di uscita.

  • int hit_recorded, mid[30]
  • double mxd[30],myd[30],mzd[30],me[30],... etcc.

che sono i buffer utili alla fine evento per riempire gli istogrammi in root. Vedi la procedura Outnt().

Attenzione questa routine deve essere chiamata dopo DataSmear() e SimulaDev().
Se SimulaDev() è dummy... mhit deve essere comunque definito correttamente; Vedi Fill_Default().

Definition at line 687 of file device.cpp.

{
    hit_recorded=mhit;

    emDev=0.;
    if ( mhit>0 )
    {
// test on the total hits
        if ( mhit>working_buffer )
        {
            Gout<<"\n Ev "<< Eventi_Fatti<<" <Measur_buffer> too low  in "<<nome<< " Detected hits: "<<mhit
            << " cut to  "<<working_buffer;
            mhit=working_buffer;
        }

        hit_recorded=mhit;
        for ( int hts=0;hts<hit_recorded;hts++ )
        {
            index[hts]=M_Hits[hts].id;
            mid[hts]=M_Hits[hts].idm;
            mdead[hts]=M_Hits[hts].idead;
            structinfo[hts]=M_Hits[hts].structinfo;
            devstory[hts]=M_Hits[hts].devstory;
            M_Hits[hts].Xdev.putv ( mxd[hts],myd[hts],mzd[hts] );
            mdd[hts]= M_Hits[hts].Xdev.XYNorma();
            me[hts]=M_Hits[hts].e_rivela;
            M_Hits[hts].Xlab.putv ( mxl[hts],myl[hts],mzl[hts] );
            M_Hits[hts].Pdev.putq ( gpx[hts],gpy[hts],gpz[hts],ge[hts] );
            dtemp[hts]=M_Hits[hts].tempo-evento_.Gen.tempo;
            emDev+=me[hts];

        }
    }

    return hit_recorded;
}
Device * Device::Get_Pointer ( const char *  word)

Trova il pointer di un particolare device, dato il nome.
Vedi anche la procedura in overloading Get_Pointer ().

Definition at line 881 of file device.cpp.

{
    Device *dv,*dvok=0;
    dv=Apparato;
    while ( dv!=0 )
    {
        if ( dv->escludi==0 &&
                strcmp ( dv->nome,word ) ==0 ) dvok= dv;
        dv=dv->next;
    }
    Gout<<"\n Device "<< setw ( 9 ) <<word<<" pointer "<< ( dvok?" found":" === not ===  found or excluded" );
    return dvok;
}
void Device::Get_Pointers ( )

Definisce alcuni pointer di device ritenuti utili nell'eseguire più velocemente la simulazione.
Attenzione questi pointers sono di tipo device e quindi puntano alle variabili definite in device.h e non conoscono i parametri definiti nelle classi derivate, mentre possono chiamare le procedure virtuali di ciascuna classe derivata e via questi i parmetri delle classe derivate.

Definition at line 776 of file device.cpp.

{


    // to be updated according to the device names....
    // get dev pointers
    Gout<<"\n Device::Get_pointers() : get the device pointers to speed up the simulation..."
    <<"\n The user must adjust the device labels occording to names as defined in  .app file \n";


    collo=   Apparato->Get_Pointer ( "Collo" );
    xch02=   Apparato->Get_Pointer ( "XCH02" );
    spione0 = Apparato->Get_Pointer ( "spione0" );
    spione1 = Apparato->Get_Pointer ( "spione1" );
    vtappo = Apparato->Get_Pointer ( "Vtappo" );

    dectubo= Apparato->Get_Pointer ( "dectubo" );
    kabs1= (Devkabes*)  Apparato->Get_Pointer ( "Spibes1" );
    kabs2= (Devkabes*)  Apparato->Get_Pointer ( "Spibes2" );
    kabs3= (Devkabes*)  Apparato->Get_Pointer ( "Spibes3" );

    giga1=  (DevGtk*) Apparato->Get_Pointer ( "Gtk1" );
    giga2=  (DevGtk*) Apparato->Get_Pointer ( "Gtk2" );
    giga3=  (DevGtk*) Apparato->Get_Pointer ( "Gtk3" );
         cedar=  (DevCedar*) Apparato->Get_Pointer ( "cedar" );
    mgb1 =   Apparato->Get_Pointer ( "MCB80" );   // magnet pointers of acromat 2
    mgb2 =   Apparato->Get_Pointer ( "MCB84" );
    mgb3 =   Apparato->Get_Pointer ( "MCB95" );
    mgb4 =   Apparato->Get_Pointer ( "MCB97" );
    mgb5 =   Apparato->Get_Pointer ( "MDX99" );

    Chanti =   (DevChanti*) Apparato->Get_Pointer ( "chanti" );

    // get anticounter pointers...

    anti[0]=  (DevLav*) Apparato->Get_Pointer ( "Ant1" );
    anti[1]=  (DevLav*) Apparato->Get_Pointer ( "Ant2" );
    anti[2]=  (DevLav*) Apparato->Get_Pointer ( "Ant3" );
    anti[3]=  (DevLav*) Apparato->Get_Pointer ( "Ant4" );
    anti[4]=  (DevLav*) Apparato->Get_Pointer ( "Ant5" );
    anti[5]=  (DevLav*) Apparato->Get_Pointer ( "Ant6" );
    anti[6]=  (DevLav*) Apparato->Get_Pointer ( "Ant7" );
    anti[7]=  (DevLav*) Apparato->Get_Pointer ( "Ant8" );
    anti[8]=  (DevLav*) Apparato->Get_Pointer ( "Ant9" );
    anti[9]=  (DevLav*) Apparato->Get_Pointer ( "Ant10" );
    anti[10]= (DevLav*) Apparato->Get_Pointer ( "Ant11" );
    anti[11]= (DevLav*) Apparato->Get_Pointer ( "Ant12" );


    Cam1= (DevMwc*)  Apparato->Get_Pointer ( "Cam1" );
    Cam2= (DevMwc*)  Apparato->Get_Pointer ( "Cam2" );
    Cam3= (DevMwc*)  Apparato->Get_Pointer ( "Cam3" );
    Cam4= (DevMwc*)  Apparato->Get_Pointer ( "Cam4" );

    Rich= (DevRich*)   Apparato->Get_Pointer ( "Rich" );

    St1x= (DevStraw*)  Apparato->Get_Pointer ( "St1x" );  // la coordinata è parallela ai fili attenzione
    St1y= (DevStraw*)  Apparato->Get_Pointer ( "St1y" );
    St1u= (DevStraw*)  Apparato->Get_Pointer ( "St1u" );
    St1v= (DevStraw*)  Apparato->Get_Pointer ( "St1v" );
    St2x= (DevStraw*)  Apparato->Get_Pointer ( "St2x" );
    St2y= (DevStraw*)  Apparato->Get_Pointer ( "St2y" );
    St2u= (DevStraw*)  Apparato->Get_Pointer ( "St2u" );
    St2v= (DevStraw*)  Apparato->Get_Pointer ( "St2v" );
    St3x= (DevStraw*)  Apparato->Get_Pointer ( "St3x" );
    St3y= (DevStraw*)  Apparato->Get_Pointer ( "St3y" );
    St3u= (DevStraw*)  Apparato->Get_Pointer ( "St3u" );
    St3v= (DevStraw*)  Apparato->Get_Pointer ( "St3v" );
    St4x= (DevStraw*)  Apparato->Get_Pointer ( "St4x" );
    St4y= (DevStraw*)  Apparato->Get_Pointer ( "St4y" );
    St4u= (DevStraw*)  Apparato->Get_Pointer ( "St4u" );
    St4v= (DevStraw*)  Apparato->Get_Pointer ( "St4v" );

    mnp1 = (DevMagn*) Apparato->Get_Pointer ( "Mnp1" );
    mnp2 = (DevMagn*)  Apparato->Get_Pointer ( "Mnp2" );
    Mag48= (DevMagn*)  Apparato->Get_Pointer ( "Magn" );
    Mnp33= (DevMagn*)  Apparato->Get_Pointer ( "Mnp33" );
    hodo =  (DevChod*) Apparato->Get_Pointer ( "Hodo" );
    hodox = (DevChod*) Apparato->Get_Pointer ( "Hodx" );
    hodoy = (DevChod*) Apparato->Get_Pointer ( "Hody" );

    hadc =  (DevHac*)  Apparato->Get_Pointer ( "HACM" );
    iron  =  Apparato->Get_Pointer ( "Ironwall" );
    muvet1= (DevMuv*) Apparato->Get_Pointer ( "MUVET1" );
    muvet2= (DevMuv*) Apparato->Get_Pointer ( "MUVET2" );
    muvet3= (DevMuv*) Apparato->Get_Pointer ( "MUVET3" );
    monit = Apparato->Get_Pointer ( "Moni" );
    mamud=   Apparato->Get_Pointer ( "Mamu" );

    sacdev= (DevSac*)Apparato->Get_Pointer ( "Sac" );
    ircdev=(DevIrc*)Apparato->Get_Pointer ( "IRC" );
    lkry=   (DevLkr*) Apparato->Get_Pointer ( "Lkry" );
    if ( lkry==0 ) lkry= (DevLkr*)Apparato->Get_Pointer ( "Lkr" );


}
void Device::GetWindowHits ( double  trigger_time)

La procedura è attivata se la flag Pipeline is on, per recuperare l'evento successivo dal Buffer circolare G_Hits e copiarlo in M.Hits.
L'evento viene poi elaborato da procedure di analisi e sottoposto a programmi di plotting (root/paw).

Definition at line 607 of file device.cpp.

{



    double dtm, adtm;
    int pipe=0;
    nhit=-1;
    mhit=0;


    if ( gnhit<0 ) return;  // gnhit: total hit seen up to now memorized in the circular buffer

    double tmorto=t_dead_mem;  // get dead time of the device
    if ( tmorto>0.0 ) tmorto=t_dead_mem +0.001;
    else tmorto=0.001;   //if zero set to 0.001 ns

    int ghit=ghit_last; // get the last hit
    ghit_last=0;

// Gout<<"\n In Dev " <<nome << " for  trig_time  " <<trigger_time;
// cout<<"\n In Dev " <<nome << " for  trig_time  " <<trigger_time;

    int ih=0;
    while ( ih<circular_buffer )
    {
        ghit=ghit%circular_buffer;
        if ( G_Hits[ghit].tempo<-9. ) break; // test on last hit to break the loop...
        dtm = trigger_time -G_Hits[ghit].tempo;  // difference between trigger_time and hit_time...
        adtm=fabs ( dtm );

        if ( adtm<=tmorto )  //Test if the hit is inside the dead_time....
        {
            pipe=0;
            nhit++;
            if ( adtm>0.001 )
            {
                pipe=1;
                evento_.Gen.Pipev=1;
            }
            M_Hits[nhit]=G_Hits[ghit];   //copy from circular buffer into M_Hits...
            M_Hits[nhit].Pileup=pipe;
            if ( ghit_last==0 ) ghit_last=ghit;

        }
        else if ( dtm>0.0 ) ghit_last=ghit;
        else if ( dtm<0.0 ) break;

//      Gout<<" Lasthit "<<setw(5)<<ghit_last<<"  pipe "<<pipe ;

        if ( nhit> ( working_buffer-2 ) )
        {
            Gout<<"\n Ev "<< evento_.Gen.Event<<"  Too many hits in dev " << nome<< "  see GetWindowHits()... exit" <<endl;
            exit ( 0 );
        }
        ghit++;
        ih++;
    }
    mhit=nhit+1;
    //   if(mhit>0)Gout<<"\n Ev "<< Eventi_Fatti<<"  In dev "<<nome<<"  Collected hits "<<mhit;
}
void Device::Reset_Dev ( )

Reset del device: chiamata da Reset_Devices().

Definition at line 494 of file device.cpp.

{
// attenzione dove si mette questo reset... si suppone all'inizio evento
// quando si conosce il tempo di generazione del nouvo evento ....

    nowpos=prevpos=6;  //posizione non definita
    accedi=0;
    rivela=0;
    eDev=0.0;
    Brem_done=Pair_done=0;
    nhit=-1;
    mhit = 0;

    if ( Pipeline==0 )
    {
        gnhit = -1;  // hits generati
    }
}
void Device::Reset_Pos ( )

Reset della posizione della particella rispetto al device.

Definition at line 468 of file device.cpp.

{
    // start from the tree top
    Device *pdev=Apparato;
    while ( pdev!=0 )
    {
        nowpos=prevpos=6;
        pdev=pdev->next;
    }
}
void Device::ScrvColpi ( Particella pr) [virtual]

Memorizza gli hits delle particelle nel buffer del rivelatore interessato e cioè nel buffer di evento Hits.... Nel caso delle accidentali (flag Pipeline on) copia i dati nel buffer circolare G_Hits!

RIVELA:

  • -1 = pr non seen
  • 0 = pr seen
  • 1 = pr all energy memorized but tracing goes on
  • 2 = pr seen and dump and stop tracing
  • 3 = pr seen but not registered
  • 4 = pr dump but not registered

Definition at line 521 of file device.cpp.

{
//  cout<<"\n Ev Scrv "<<Eventi_Fatti<< " dev "<<nome<< " pr "<<pr->nome<<" colpo "<<colpo<<" visto "<<visto;

    if ( nhit> ( working_buffer-2 ) ) //verifica la size del buffer!
    {
        Gout<<"\n Ev "<< Eventi_Fatti<<"  In dev "<<nome<<" too many particles "<< nhit<< "  get out! "<<endl;
        Scrivi_Dati ( 2 );
        flyoend();
        exit ( 0 );
    }


// aggiorna il contatore di dev per le particelle che lo attraversano
    Part_hit[Idsee]++;
    Tot_seen++;

    pr->devhit=idev;  //memorizzo l'ultimo indice del dev colpito.

    // salva in formato codificato i devices colpiti dalla particell
    // il bit acceso corrisponde al device colpito
    // attenzione memorizza solo i primi 64 device.
    pr->Update_Devstory ( idev );


    if ( rivela>2 ) return;   // non registered
// attenzione si evita anche  di registrare  gli hits per i dev che non sono esplicitamente
// usati nella analisi successiva. registra=(0,1)==(no,si)
    if ( registra==0 ) return;

    nhit++;       // remember nhit starts from -1 that corrisponds to no  hits...

    Bufdev  *bf = &Hits[nhit];
    bf->Pr=             pr;
    bf->tempo=          evento_.Gen.tempo;
    bf->idead=          pr->Ifato;
    bf->devstory=       pr->devstory;
    bf->last_path=      pr->last_path;
    bf->pnome =         pr->nome;
    bf->id=             pr->id;
    bf->idm=            pr->idm;
    bf->Vers=           pr->Vers;
    bf->Xlab=           pr->X;
    bf->Xdev=           Lab2cDev ( pr->X );
    bf->Pdev=           pr->P;
    bf->structinfo= Get_Structinfo();

//  ----------------------
    if ( rivela>0 ) bf->e_rivela=pr->P.e;
    else bf->e_rivela=0.0;   //it is done anyway if multiplescattering if required...

//  ------------- pipeline test -------
    if ( Pipeline==0 ) return;

// pipeline is on! copies the hits in the circular buffer

    gnhit++;       // hits index up to now...
    ghcir=gnhit%circular_buffer;  //attention... Circular buffer
    G_Hits[ghcir]=bf[0];
    G_Hits[ ( ghcir+1 ) %circular_buffer].tempo=-10;  //set to -10 next hit not yet arrived....

//    Gout<<"\n Eve_gen "<<evento_.Gen.Event<<" dev "<<nome<< " hit "<<gnhit<<" "<<ghcir<<" tempo "<< G_Hits[ghcir].tempo
//     <<" " << G_Hits[(ghcir+1)%circular_buffer].tempo;
    ;

};
void Device::Set_Rivela ( Particella pr)

RIVELA:

  • -1 = pr non seen
  • 0 = pr seen
  • 1 = pr all energy memorized but tracing goes on
  • 2 = pr seen and dump and stop tracing
  • 3 = pr seen but not registered
  • 4 = pr dump but not registered

Definition at line 1067 of file device.cpp.

{
    int isee;
    const char *label;



    if ( escludi!=1 )
    {
        // dev visibile
        accedi=0;
        rivela=-1;
        // test if the dev sees the particle ...first by name
        isee = nvede;
        while ( isee >= 0 )
        {
            label = vede[isee];
            if ( label == pr->nome )
            {
                rivela=assorb[isee];
                Idsee=isee;
                break;
            }
            isee--;
        }
        // ... and now  by type
        if ( rivela==-1 )

        {
            isee = nvede;
            while ( isee >= 0 )
            {
                label = vede[isee];
                if ( label == All ||label == pr->type ||
                        ( label == Char && pr->charg!=0. ) )
                {
                    rivela=assorb[isee];
                    Idsee=isee;
                    break;
                }
                isee--;
            }
        }
    }

// if(idev>1&&idev<4)
// Gout<<"\n Riv "<< nome <<" "<<pr->nome<<" " <<accedi << " " <<rivela;


}
int Device::Traccia ( Particella pr) [virtual]

================ T R A C C I A ====================================

Traccia le particelle nell'apparato per un tratto come definito in Get_camm(). Nel tracciare la particella si tiene conto della possibilita' della pair production e del bremsstrhalung.

Reimplemented in DevFlt, DevFluka, DevLkr, and DevMagn.

Definition at line 950 of file device.cpp.

{
    int iter=0;
    // impulso ==0 no tracing ... return;
    if ( pr->P.norma == 0.0 ) return 1;

    lint=nowpos?libuc:liint; //get the interaction length


    if ( fun==Bersaglio&& pr->rg!=0&&lint>0.0&&nowpos<1 )
    {   // se qui è un caso particolare... particelle si distrugge  nel dev 
        // Il dev fa da bersaglio 
        // ed è interna o nel buco ( è qui c'è di default)
        // e la lunghezza di interazione è definita non nulla!
        // si ridefisce il cammino se interagisce nel bersaglio
        pr->Get_Bersaglio ( this,lint );
        if ( pr->Ifato==-3 )
        { // la particella è stata distrutta!!!
            pr->Move ( pr->pathok );  // nuovo path (ma vedere meglio)
            pr->last_path=pr->pathok;
            pr->rg->dw->X=pr->rg->X=pr->X;    // definisco la posizione del C.M.
            pr->rg->dw->Gx=pr->rg->Gx=pr->X;
            return -3;   // la bullet muore nel dev
        }
    }

    double tratok=pr->pathok;
    lrad=nowpos?lradb:lradi; //get the radiation  length
    if ( lrad==0. )     // no radiation...
    {
        // free flight
        pr->Move ( tratok );
        pr->last_path=tratok;
        return 0;
    }

// qui lrad != 0

    if ( pr->charg ==0.0 )
    {

// se è un gamma fa Pair_Production
        if ( pr->Pair_Production>0&& Pair_done<maxPair ) //        Pair production activated?
        {
            if ( pr->P.e<0.002 ) // Energy cutoff .... fare meglio
            {
                Hits[nhit].e_rivela+=pr->P.e;  // aggiorno l'energia persa...
                Hits[nhit].idead=-18;
                pr->Ifato=-18;
                pr->P.setqn ( 0.,0.,0.,0. );
                pr->pathok=0.0;
                return -18;
            }
            pr->Get_Pair ( this,tratok,lrad );
            Hits[nhit].idead=pr->Ifato;
            pr->pathok=tratok; //redefine (if nedeed) free path before pair prod..
        }
        pr->Move ( tratok );
        pr->last_path=tratok;
        return 0;
    }
//  qui lrad != 0   ed è carica 
    int crepa;
    double passdone=0.0;
    double passo= lrad;

// fa bremsstrahlung

    while ( passdone<tratok )
    {
        double diff=tratok-passdone;
        if ( diff <passo ) passo =diff+0.001;

        if ( pr->Brems_Production>0 && Brem_done<maxBrems )
        {
            if ( pr->Get_Brems ( this,passo,lrad ) !=0 )
            {
                pr->Move ( passo );  // divido per 2  ??? media
                Mscatter ( pr,passo );
                pr->last_path=passdone+passo;
                Hits[nhit].idead=pr->Ifato;
                return 0;
            }
        }
        // qui se non c'è stato brems...
        pr->Move ( passo );   //forse passo/2  ???!|!!
        if ( ( crepa=Mscatter ( pr,passo ) ) !=0 )
        {
            pr->last_path=passdone+passo;

            Hits[nhit].idead=crepa;
            return crepa;
        }
        passdone+=passo;
        iter++;
    }
    Hits[nhit].idead=pr->Ifato;
    Hits[nhit].last_path =pr->last_path=tratok;
    return 0;

}

Member Data Documentation

I parametri memorizzati in Hits sono relativi agli hits generati nel rivelatore.
Type(0) variables: Hits Dev hit at low level.... just generated..

Definition at line 206 of file device.h.

M_Hits contiene gli hits dei dev copiati nella opportuna finestra di trigger. Questi dati si elaborano con le procedure DataSmear() e Simuladev() e quindi si trasferiscono sul file per analisi root Vedi outnt.cpp.
Type(2) variables: M_Hits Dev hit info at Measured level (with errors)

Definition at line 224 of file device.h.

G_Hits è un buffer circolare,dimensionato max 100 per ogni device, in cui si memorizzano, se pileup è acceso, i dati che sono via, via generati ed hanno colpito il device. In pratica si copiano i dati da Hits in successione temporale. Se si verifica un trigger definito, per esempio in Trigger_Box, secondo un criterio di minima si accede a ciascun buffer circolare e si prelevano, per ogni dev, gli hits da G_Hits in una finestra temporale definita attorno al trigger_time e si memorizzano in M_Hits[30].
Type(1) variables: G_Hits Circular buffer for the hits if pipeline is on.

Definition at line 214 of file device.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables