31a95219b480cb30ca3cbf78356dd0bf6104d318
[u/mrichter/AliRoot.git] / VZERO / AliVZEROTrigger.cxx
1 #include "AliRun.h"
2 #include "AliRunLoader.h"
3
4 #include "AliVZEROTrigger.h"
5
6 //______________________________________________________________________
7 ClassImp(AliVZEROTrigger)
8 ////////////////////////////////////////////////////////////////////////
9 //
10 // Version 1
11 //
12 // AliVZEROTrigger: 
13 //
14 ////////////////////////////////////////////////////////////////////////
15
16 //______________________________________________________________________
17 AliVZEROTrigger::AliVZEROTrigger()
18   : AliTriggerDetector()
19 {
20    SetName("VZERO");
21    CreateInputs();
22
23    SetAdcThreshold();
24 }
25
26 //______________________________________________________________________
27 void AliVZEROTrigger::CreateInputs()
28 {
29    // inputs
30
31    // Do not create inputs again!!
32    if( fInputs.GetEntriesFast() > 0 ) return;
33
34    fInputs.AddLast( new AliTriggerInput( "VZERO_LEFT", "At least one hit in the left VZERO", 0x01 ) );
35    fInputs.AddLast( new AliTriggerInput( "VZERO_RIGHT","At least one hit in the right VZERO", 0x02 ) );
36    fInputs.AddLast( new AliTriggerInput( "VZERO_AND",  "At least one hit in the each (left and right) VZERO", 0x04 ) );
37    fInputs.AddLast( new AliTriggerInput( "VZERO_OR",   "At least one hit in the one (left one right) VZERO", 0x08 ) );
38
39    fInputs.AddLast( new AliTriggerInput( "VZERO_BEAMGAS", "Beam gas VZERO trigger ", 0x010 ) );
40 }
41
42 //______________________________________________________________________
43 void AliVZEROTrigger::Trigger()
44 {
45   
46   //  ********** Get run loader for the current event **********
47   AliRunLoader* runLoader = gAlice->GetRunLoader();
48
49   AliVZEROLoader* loader = (AliVZEROLoader* )runLoader->GetLoader( "VZEROLoader" );
50
51   loader->LoadDigits("READ");
52   TTree* vzeroDigitsTree = loader->TreeD();
53   if (!vzeroDigitsTree) return;
54
55   TClonesArray* vzeroDigits = new TClonesArray("AliVZEROdigit",1000);
56   TBranch* digitBranch = vzeroDigitsTree->GetBranch("VZERODigit");
57   digitBranch->SetAddress(&vzeroDigits);
58
59   // number of hits in left/right
60   Int_t nLeftDig  = 0;
61   Int_t nRightDig = 0;
62   
63   // first time 
64   Float_t firstTimeLeft = 9999;
65   Float_t firstTimeRight = 9999;
66
67   // loop over vzero entries
68   Int_t nEntries = (Int_t)vzeroDigitsTree->GetEntries();
69   for (Int_t e=0; e<nEntries; e++) {
70     vzeroDigitsTree->GetEvent(e);
71
72     Int_t nDigits = vzeroDigits->GetEntriesFast();
73     
74     for (Int_t d=0; d<nDigits; d++) {
75       //      vzeroDigitsTree->GetEvent(d);
76       AliVZEROdigit* digit = (AliVZEROdigit*)vzeroDigits->At(d);
77       
78       Int_t   PMNumber   = digit->PMNumber();
79       Float_t adc        = digit->ADC();
80       Float_t tdc        = digit->Time(); // in 100 of picoseconds
81       
82       if (PMNumber<=31 && adc>fAdcThresHold) {
83         nLeftDig++;
84         if (tdc<firstTimeLeft) firstTimeLeft = tdc;
85       } 
86       if (PMNumber>=32 && adc>fAdcThresHold) {
87         nRightDig++;
88         if (tdc<firstTimeRight) firstTimeRight = tdc;
89       }
90     } // end of loop over digits
91   } // end of loop over events in digits tree
92   
93   // Beam gas trigger set from the time difference. The time it takes
94   // to travel between the two counters is ~14.3 ns = 143 * 100 ps.
95   //  NB: this should be defined
96   // from time windows relative to the time of the bunch crossing!
97   // beam gas comming from the left ...
98
99   if (TMath::Abs(TMath::Abs(firstTimeLeft - firstTimeRight)-143) < 20) // time window of 2 ns
100     SetInput( "VZERO_BEAMGAS" );
101
102   if (nLeftDig > 0)
103     SetInput( "VZERO_LEFT" );
104
105   if (nRightDig > 0)
106     SetInput( "VZERO_RIGHT" );
107   
108   if (nLeftDig>0 || nRightDig>0) {
109     SetInput( "VZERO_OR" );
110
111     if (nLeftDig>0 && nRightDig>0) {
112     SetInput( "VZERO_AND" );   
113     }
114   }
115   
116   AliDebug(1,Form("VZERO PMs fired: %d (left) %d (right)", nLeftDig, nRightDig));
117
118   return;
119 }
120
121