1 /////////////////////////////////////////////////////////////////////
2 // Author: Henrik Tydesjo //
4 // This class takes care of simulating the output from the pixel //
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. //
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. //
18 /////////////////////////////////////////////////////////////////////
20 #include "AliITSTriggerFOProcessor.h"
21 #include "AliITSTriggerConditions.h"
24 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor() :
25 fFOInner(0), fFOOuter(0), fTriggerCond(NULL)
27 // default constructor
29 //______________________________________________________________________
30 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor(AliITSTriggerConditions* ocdbCond) :
31 fFOInner(0), fFOOuter(0), fTriggerCond(ocdbCond)
35 //______________________________________________________________________
36 AliITSTriggerFOProcessor::AliITSTriggerFOProcessor(const AliITSTriggerFOProcessor& handle):
37 fFOInner(handle.fFOInner), fFOOuter(handle.fFOOuter), fTriggerCond(handle.fTriggerCond)
41 //______________________________________________________________________
42 AliITSTriggerFOProcessor::~AliITSTriggerFOProcessor() {
45 //______________________________________________________________________
46 AliITSTriggerFOProcessor& AliITSTriggerFOProcessor::operator=(const AliITSTriggerFOProcessor& handle) {
47 // assignment operator
49 fFOInner = handle.fFOInner;
50 fFOOuter = handle.fFOOuter;
51 fTriggerCond = handle.fTriggerCond;
55 //______________________________________________________________________
56 void AliITSTriggerFOProcessor::SetTriggerConditions(AliITSTriggerConditions* ocdbCond) {
57 // Method to give pointer to the OCDB conditions entry
58 fTriggerCond = ocdbCond;
60 //______________________________________________________________________
61 UInt_t AliITSTriggerFOProcessor::GetNumOutputs() const {
62 // return number of outputs (algorithms) in use
63 if (fTriggerCond==NULL) {
64 Error("AliITSTriggerFOProcessor::GetNumOutputs","Trigger conditions entry not yet given.");
67 return fTriggerCond->GetNumAlgo();
69 //______________________________________________________________________
70 const Char_t* AliITSTriggerFOProcessor::GetOutputLabel(Short_t index) const {
71 // return the label of the index'th algorithm in use
72 if (fTriggerCond==NULL) {
73 Error("AliITSTriggerFOProcessor::GetOutputLabel","Trigger conditions entry not yet given.");
76 return fTriggerCond->GetAlgoLabelI(index);
78 //______________________________________________________________________
79 void AliITSTriggerFOProcessor::PreprocessFOSignals(AliITSFOSignalsSPD* signals) {
80 // Pre-process the fast-or signals to retrieve some data needed by most algorithms
81 if (fTriggerCond==NULL) {
82 Error("AliITSTriggerFOProcessor::PreprocessFOSignals","Trigger conditions entry not yet given.");
91 while (signals->GetNextSignal(eq,hs,chip)) {
92 if (fTriggerCond->IsChipActive( (UInt_t)eq, (UInt_t)hs, (UInt_t)chip) ) {
93 if (hs<=1) fFOInner++;
98 //______________________________________________________________________
99 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsIndex(Short_t index, AliITSFOSignalsSPD* signals) {
100 // NB: For every event - Always call PreprocessFOSignals before calling this method
101 // Process index'th algorithm - returns true if output active
102 return ProcessFOSignalsLabel(GetOutputLabel(index), signals);
104 //______________________________________________________________________
105 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsLabel(const Char_t* label, AliITSFOSignalsSPD* signals) {
106 // NB: For every event - Always call PreprocessFOSignals before calling this method
107 // Process algorithm with label ... - returns true if output active
108 if (fTriggerCond==NULL) {
109 Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel","Trigger conditions entry not yet given.");
113 Short_t index = fTriggerCond->GetAlgoIndexL(label);
115 Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel", "No conditions for label '%s'.",label);
119 if (strcmp(label, "0SMB") == 0) return ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(index, signals);
120 else if (strcmp(label, "0SH1") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);
121 else if (strcmp(label, "0SH2") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);
122 else if (strcmp(label, "0SH3") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);
123 else if (strcmp(label, "0SH4") == 0) return ProcessFOSignalsTHRInnerAndTHROuter(index, signals);
124 else if (strcmp(label, "0SPF") == 0) return ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(index, signals);
125 else if (strcmp(label, "0SBK") == 0) return ProcessFOSignalsInnerGTOuterPlusOffset(index, signals);
126 else if (strcmp(label, "0SBK") == 0) return ProcessFOSignalsOuterGTInnerPlusOffset(index, signals);
127 else if (strcmp(label, "0SBK") == 0) return ProcessFOSignalsTHRTotal(index, signals);
128 else if (strcmp(label, "SPD_GFO_L0") == 0) return ProcessFOSignalsTHRTotal(index, signals);
129 else if (strcmp(label, "SPD_HMULT_L0") == 0) return ProcessFOSignalsTHRTotal(index, signals);
132 Error("AliITSTriggerFOProcessor::ProcessFOSignalsLabel", "Algorithm not yet implemented for label '%s'.",label);
136 //______________________________________________________________________
137 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
138 // NB: For every event - Always call PreprocessFOSignals before calling this method
139 // Process algorithm ' I+O > thr && I > thr && O > thr ' (index is needed to get the correct parameters from the ocdb object)
140 if (fTriggerCond==NULL) {
141 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Trigger conditions entry not yet given.");
145 // Get parameter values:
146 Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold");
148 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'total_threshold' not defined");
151 Int_t thI = fTriggerCond->GetAlgoParamValueIN(index, "inner_threshold");
153 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'inner_threshold' not defined");
156 Int_t thO = fTriggerCond->GetAlgoParamValueIN(index, "outer_threshold");
158 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotalAndTHRInnerAndTHROuter","Parameter 'outer_threshold' not defined");
163 return (fFOInner+fFOOuter >= thIO && fFOInner >= thI && fFOOuter >= thO);
165 //______________________________________________________________________
166 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
167 // NB: For every event - Always call PreprocessFOSignals before calling this method
168 // Process algorithm ' I > thr && O > thr ' (index is needed to get the correct parameters from the ocdb object)
169 if (fTriggerCond==NULL) {
170 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Trigger conditions entry not yet given.");
174 // Get parameter values:
175 Int_t thI = fTriggerCond->GetAlgoParamValueIN(index, "inner_threshold");
177 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Parameter 'inner_threshold' not defined");
180 Int_t thO = fTriggerCond->GetAlgoParamValueIN(index, "outer_threshold");
182 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRInnerAndTHROuter","Parameter 'outer_threshold' not defined");
187 return (fFOInner >= thI && fFOOuter >= thO);
189 //______________________________________________________________________
190 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
191 // NB: For every event - Always call PreprocessFOSignals before calling this method
192 // Process algorithm ' I+O > thr' (index is needed to get the correct parameters from the ocdb object)
193 if (fTriggerCond==NULL) {
194 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal","Trigger conditions entry not yet given.");
198 // Get parameter values:
199 Int_t thIO = fTriggerCond->GetAlgoParamValueIN(index, "total_threshold");
201 Error("AliITSTriggerFOProcessor::ProcessFOSignalsTHRTotal","Parameter 'total_threshold' not defined");
206 return (fFOInner + fFOOuter >= thIO);
208 //______________________________________________________________________
209 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsInnerGTOuterPlusOffset(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
210 // NB: For every event - Always call PreprocessFOSignals before calling this method
211 // Process algorithm ' I > O+offset ' (index is needed to get the correct parameters from the ocdb object)
212 if (fTriggerCond==NULL) {
213 Error("AliITSTriggerFOProcessor::ProcessFOSignalsGTOuterPlusOffset","Trigger conditions entry not yet given.");
217 // Get parameter values:
218 Int_t offset = fTriggerCond->GetAlgoParamValueIN(index, "offset");
220 Error("AliITSTriggerFOProcessor::ProcessFOSignalsInnerGTOuterPlusOffset","Parameter 'offset' not defined");
225 return (fFOInner >= fFOOuter + offset);
227 //______________________________________________________________________
228 Bool_t AliITSTriggerFOProcessor::ProcessFOSignalsOuterGTInnerPlusOffset(Short_t index, AliITSFOSignalsSPD* /*signals*/) {
229 // NB: For every event - Always call PreprocessFOSignals before calling this method
230 // Process algorithm ' O > I+offset ' (index is needed to get the correct parameters from the ocdb object)
231 if (fTriggerCond==NULL) {
232 Error("AliITSTriggerFOProcessor::ProcessFOSignalsGTOuterPlusOffset","Trigger conditions entry not yet given.");
236 // Get parameter values:
237 Int_t offset = fTriggerCond->GetAlgoParamValueIN(index, "offset");
239 Error("AliITSTriggerFOProcessor::ProcessFOSignalsOuterGTInnerPlusOffset","Parameter 'offset' not defined");
244 return (fFOOuter >= fFOInner + offset);