Changing once more (hopefully we get it correct this time...) the logic to trig the...
[u/mrichter/AliRoot.git] / ITS / AliITSTriggerFOProcessor.cxx
1 /////////////////////////////////////////////////////////////////////
2 // Author: Henrik Tydesjo                                          //
3 //                                                                 //
4 // This class takes care of simulating the output from the pixel   //
5 // trigger system.                                                 //
6 // The fast-or signals are given as input and they are processed   //
7 // to see which algorithm will give a signal to the central        //
8 // trigger system. To avoid doing the same operations many times,  //
9 // there is a method called PreprocessFOSignals, which should      //
10 // always be called for each event before the processing of        //
11 // each individual algorithm is done.                              //
12 //                                                                 //
13 // As soon as a new algorithm has been implemented online, a       //
14 // corresponding method should be implemented here. Which method   //
15 // should be used for a given trigger label is taken care of in    //
16 // ProcessFOSignalsLabel method.                                   //
17 //                                                                 //
18 /////////////////////////////////////////////////////////////////////
19
20 #include "AliITSTriggerFOProcessor.h"
21 #include "AliITSTriggerConditions.h"
22 #include <TError.h>
23
24 /* $Id$ */
25
26 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor() :
27   fFOInner(0), fFOOuter(0), fTriggerCond(NULL)
28 {
29   // default constructor
30 }
31 //______________________________________________________________________
32 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor(AliITSTriggerConditions* ocdbCond) :
33   fFOInner(0), fFOOuter(0), fTriggerCond(ocdbCond)
34 {
35   // constructor
36 }
37 //______________________________________________________________________
38 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor(const AliITSTriggerFOProcessor& handle): 
39   fFOInner(handle.fFOInner), fFOOuter(handle.fFOOuter), fTriggerCond(handle.fTriggerCond)
40 {
41   // copy constructor
42 }
43 //______________________________________________________________________
44 AliITSTriggerFOProcessor::~AliITSTriggerFOProcessor() {
45   // destructor
46 }
47 //______________________________________________________________________
48 AliITSTriggerFOProcessor& AliITSTriggerFOProcessor::operator=(const AliITSTriggerFOProcessor& handle) {
49   // assignment operator
50   if (this!=&handle) {
51     fFOInner = handle.fFOInner;
52     fFOOuter = handle.fFOOuter;
53     fTriggerCond = handle.fTriggerCond;
54   }
55   return *this;
56 }
57 //______________________________________________________________________
58 void AliITSTriggerFOProcessor::SetTriggerConditions(AliITSTriggerConditions* ocdbCond) {
59   // Method to give pointer to the OCDB conditions entry
60   fTriggerCond = ocdbCond;
61 }
62 //______________________________________________________________________
63 UInt_t AliITSTriggerFOProcessor::GetNumOutputs() const {
64   // return number of outputs (algorithms) in use
65   if (fTriggerCond==NULL) {
66     Error("AliITSTriggerFOProcessor::GetNumOutputs","Trigger conditions entry not yet given.");
67     return 0;
68   }
69   return fTriggerCond->GetNumAlgo();
70 }
71 //______________________________________________________________________
72 const Char_t* AliITSTriggerFOProcessor::GetOutputLabel(Short_t index) const {
73   // return the label of the index'th algorithm in use
74   if (fTriggerCond==NULL) {
75     Error("AliITSTriggerFOProcessor::GetOutputLabel","Trigger conditions entry not yet given.");
76     return "";
77   }
78   return fTriggerCond->GetAlgoLabelI(index);
79 }
80 //______________________________________________________________________
81 void AliITSTriggerFOProcessor::PreprocessFOSignals(AliITSFOSignalsSPD* signals) {
82   // Pre-process the fast-or signals to retrieve some data needed by most algorithms
83   if (fTriggerCond==NULL) {
84     Error("AliITSTriggerFOProcessor::PreprocessFOSignals","Trigger conditions entry not yet given.");
85     return;
86   }
87   fFOInner = 0;
88   fFOOuter = 0;
89
90   Int_t eq   = -1;
91   Int_t hs   = -1;
92   Int_t chip = -1;
93   while (signals->GetNextSignal(eq,hs,chip)) {
94     if (fTriggerCond->IsChipActive( (UInt_t)eq, (UInt_t)hs, (UInt_t)chip) ) {
95       if (hs<=1) fFOInner++;
96       else       fFOOuter++;
97     }
98   }
99 }
100 //______________________________________________________________________
101 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsIndex(Short_t index, AliITSFOSignalsSPD* signals) {
102   // NB: For every event - Always call PreprocessFOSignals before calling this method
103   // Process index'th algorithm - returns true if output active
104   return ProcessFOSignalsLabel(GetOutputLabel(index), signals);
105 }
106 //______________________________________________________________________
107 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsLabel(const Char_t* label, AliITSFOSignalsSPD* signals) {
108   // NB: For every event - Always call PreprocessFOSignals before calling this method
109   // Process algorithm with label ... - returns true if output active 
110   if (fTriggerCond==NULL) {
111     Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel","Trigger conditions entry not yet given.");
112     return kFALSE;
113   }
114
115   Short_t index = fTriggerCond->GetAlgoIndexL(label);
116   if (index<0) {
117     Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel", "No conditions for label '%s'.",label);
118     return kFALSE;
119   }
120   
121   if      (strcmp(label, "0SMB") == 0) return ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(index, signals);
122   else if (strcmp(label, "0SH1") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);//ok
123   else if (strcmp(label, "0SH2") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);//ok
124   else if (strcmp(label, "0SH3") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);//ok
125   else if (strcmp(label, "0SH4") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);//
126   else if (strcmp(label, "0SPF") == 0) return ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(index, signals);//ok
127   else if (strcmp(label, "0SBK") == 0) return ProcessFOSignalsInnerGTOuterPlusOffset(index, signals);
128   else if (strcmp(label, "0SX1") == 0) return ProcessFOSignalsOuterGTInnerPlusOffset(index, signals);
129   else if (strcmp(label, "0SX2") == 0) return ProcessFOSignalsTHRTotal(index, signals);
130   else if (strcmp(label, "0SCO") == 0) return ProcessFOSignalsCosmic(index, signals);
131
132   else {
133     Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel", "Algorithm not yet implemented for label '%s'.",label);
134     return kFALSE;
135   }
136 }
137 //______________________________________________________________________
138 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
139   // NB: For every event - Always call PreprocessFOSignals before calling this method
140   // Process algorithm ' I+O > thr && I > thr && O > thr ' (index is needed to get the correct parameters from the ocdb object)
141   if (fTriggerCond==NULL) {
142     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Trigger conditions entry not yet given.");
143     return kFALSE;
144   }
145   
146   // Get parameter values:
147   Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold");
148   if (thIO<0) {
149     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'total_threshold' not defined");
150     return kFALSE;
151   }
152   Int_t thI = fTriggerCond->GetAlgoParamValueIN(index, "inner_threshold");
153   if (thI<0) {
154     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'inner_threshold' not defined");
155     return kFALSE;
156   }
157   Int_t thO = fTriggerCond->GetAlgoParamValueIN(index, "outer_threshold");
158   if (thO<0) {
159     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'outer_threshold' not defined");
160     return kFALSE;
161   }
162
163   // Evaluate:
164   return (fFOInner+fFOOuter >= thIO && fFOInner >= thI && fFOOuter >= thO);
165 }
166 //______________________________________________________________________
167 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
168   // NB: For every event - Always call PreprocessFOSignals before calling this method
169   // Process algorithm ' I > thr && O > thr ' (index is needed to get the correct parameters from the ocdb object)
170   if (fTriggerCond==NULL) {
171     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Trigger conditions entry not yet given.");
172     return kFALSE;
173   }
174   
175   // Get parameter values:
176   Int_t thI = fTriggerCond->GetAlgoParamValueIN(index, "inner_threshold");
177   if (thI<0) {
178     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Parameter 'inner_threshold' not defined");
179     return kFALSE;
180   }
181   Int_t thO = fTriggerCond->GetAlgoParamValueIN(index, "outer_threshold");
182   if (thO<0) {
183     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Parameter 'outer_threshold' not defined");
184     return kFALSE;
185   }
186
187   // Evaluate:
188   return (fFOInner >= thI && fFOOuter >= thO);
189 }
190 //______________________________________________________________________
191 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
192   // NB: For every event - Always call PreprocessFOSignals before calling this method
193   // Process algorithm ' I+O > thr' (index is needed to get the correct parameters from the ocdb object)
194   if (fTriggerCond==NULL) {
195     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal","Trigger conditions entry not yet given.");
196     return kFALSE;
197   }
198   
199   // Get parameter values:
200   //Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold");
201   Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "offset");
202   if (thIO<0) {
203     Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal","Parameter 'total_threshold' not defined");
204     return kFALSE;
205   }
206
207   // Evaluate:
208   return (fFOInner + fFOOuter >= thIO);
209 }
210 //______________________________________________________________________
211 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsInnerGTOuterPlusOffset(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
212   // NB: For every event - Always call PreprocessFOSignals before calling this method
213   // Process algorithm ' I > O+offset ' (index is needed to get the correct parameters from the ocdb object)
214   if (fTriggerCond==NULL) {
215     Error("AliITSTriggerFOProcessor::ProcessFOSignalsGTOuterPlusOffset","Trigger conditions entry not yet given.");
216     return kFALSE;
217   }
218   
219   // Get parameter values:
220   Int_t offset = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold");
221   if (offset<0) {
222     Error("AliITSTriggerFOProcessor::ProcessFOSignalsInnerGTOuterPlusOffset","Parameter 'offset' not defined");
223     return kFALSE;
224   }
225
226   // Evaluate:
227   return (fFOInner >=  fFOOuter + offset);
228 }
229 //______________________________________________________________________
230 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsOuterGTInnerPlusOffset(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
231   // NB: For every event - Always call PreprocessFOSignals before calling this method
232   // Process algorithm ' O > I+offset ' (index is needed to get the correct parameters from the ocdb object)
233   if (fTriggerCond==NULL) {
234     Error("AliITSTriggerFOProcessor::ProcessFOSignalsGTOuterPlusOffset","Trigger conditions entry not yet given.");
235     return kFALSE;
236   }
237   
238   // Get parameter values:
239   Int_t offset = fTriggerCond->GetAlgoParamValueIN(index, "offset");
240   if (offset<0) {
241     Error("AliITSTriggerFOProcessor::ProcessFOSignalsOuterGTInnerPlusOffset","Parameter 'offset' not defined");
242     return kFALSE;
243   }
244
245   // Evaluate:
246   return (fFOOuter >=  fFOInner + offset);
247 }
248 //______________________________________________________________________
249 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsCosmic(Short_t index, AliITSFOSignalsSPD* signals) {
250   // NB: For every event - Always call PreprocessFOSignals before calling this method
251   // Process algorithm 'cosmic' (index is needed to get the correct parameters from the ocdb object)
252   if (fTriggerCond==NULL) {
253     Error("AliITSTriggerFOProcessor::ProcessFOSignalsCosmic","Trigger conditions entry not yet given.");
254     return kFALSE;
255   }
256
257   // Get parameter values:
258   Int_t cosmicParam = fTriggerCond->GetAlgoParamValueIN(index, "cosmic_mode");
259   if (cosmicParam<0) {
260     Error("AliITSTriggerFOProcessor::ProcessFOSignalsCosmic","Parameter 'cosmic_mode' not defined");
261     return kFALSE;
262   }
263
264   // Evaluate:
265
266   UShort_t topOuter = 0;
267   UShort_t topInner = 0;
268   UShort_t bottomOuter = 0;
269   UShort_t bottomInner = 0;
270
271   Int_t eq   = -1;
272   Int_t hs   = -1;
273   Int_t chip = -1;
274   while (signals->GetNextSignal(eq,hs,chip)) {
275     if (fTriggerCond->IsChipActive( (UInt_t)eq, (UInt_t)hs, (UInt_t)chip) ) {
276       if (hs<=1) {
277         if (eq%10 < 5) topInner++;
278         else        bottomInner++;
279       }
280       else {
281         if (eq%10 < 5) topOuter++;
282         else        bottomOuter++;
283       }
284     }
285   }
286
287   // top outer & bottom outer
288   if (cosmicParam == 0) return (topOuter>0 && bottomOuter>0);
289   // inner & outer
290   if (cosmicParam == 1) return (fFOInner>0 && fFOOuter>0);
291   // double layer ( >=2 of top inner, top outer, bottom inner, bottom outer )
292   if (cosmicParam == 2) {
293     UShort_t nHalfLayers = 0;
294     if (topOuter>0)    nHalfLayers++;
295     if (topInner>0)    nHalfLayers++;
296     if (bottomOuter>0) nHalfLayers++;
297     if (bottomInner>0) nHalfLayers++;
298     return (nHalfLayers>=2);
299   }
300   // top outer & top inner & bottom outer & bottom inner
301   if (cosmicParam == 3) return (topOuter>0 && topInner>0 && bottomOuter>0 && bottomInner>0);
302   // top outer & bottom outer & inner
303   if (cosmicParam == 4) return (topOuter>0 && bottomOuter>0 && fFOInner>0);
304   // global or
305   if (cosmicParam == 5) return (fFOOuter>0 || fFOInner>0);
306
307   Error("AliITSTriggerFOProcessor::ProcessFOSignalsCosmic",Form("'cosmic_algorithm_parameter' = %d not defined",cosmicParam));
308   return kFALSE;
309 }
310