]>
Commit | Line | Data |
---|---|---|
ad7f2bfa | 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 | ||
65e04d68 | 24 | /* $Id$ */ |
25 | ||
ad7f2bfa | 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 | } | |
65e04d68 | 120 | |
ad7f2bfa | 121 | if (strcmp(label, "0SMB") == 0) return ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(index, signals); |
65e04d68 | 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 | |
ad7f2bfa | 127 | else if (strcmp(label, "0SBK") == 0) return ProcessFOSignalsInnerGTOuterPlusOffset(index, signals); |
65e04d68 | 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); | |
ad7f2bfa | 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: | |
65e04d68 | 200 | //Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold"); |
201 | Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "offset"); | |
ad7f2bfa | 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: | |
65e04d68 | 220 | Int_t offset = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold"); |
ad7f2bfa | 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 | } | |
65e04d68 | 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 | } | |
ad7f2bfa | 310 |