added EMCAL electron trigger component and related modifications
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTTrigger.cxx
... / ...
CommitLineData
1// $Id$
2/**************************************************************************
3 * This file is property of and copyright by the ALICE HLT Project *
4 * ALICE Experiment at CERN, All rights reserved. *
5 * *
6 * Primary Authors: Artur Szostak <artursz@iafrica.com> *
7 * for The ALICE HLT Project. *
8 * *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
17
18/// @file AliHLTTrigger.h
19/// @author Artur Szostak <artursz@iafrica.com>
20/// @date 12 Aug 2008
21/// @brief Implementation of the AliHLTTrigger base component class.
22///
23/// The AliHLTTrigger class is the base class from which all HLT trigger components
24/// should be derived.
25
26#include "AliHLTTrigger.h"
27#include "AliHLTTriggerDecision.h"
28#include "AliHLTReadoutList.h"
29#include "AliHLTTriggerDomain.h"
30#include "AliHLTDomainEntry.h"
31#include "AliHLTCTPData.h"
32
33ClassImp(AliHLTTrigger)
34
35
36AliHLTTrigger::AliHLTTrigger() :
37 AliHLTProcessor(),
38 fEventData(NULL),
39 fTriggerData(NULL),
40 fDecisionMade(false),
41 fClearInfo(true),
42 fTriggerEventResult(0),
43 fDescription(),
44 fReadoutList(),
45 fTriggerDomain()
46{
47 // Default constructor sets pointers to NULL.
48}
49
50
51AliHLTTrigger::~AliHLTTrigger()
52{
53 // Default destructor.
54}
55
56
57void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) const
58{
59 // Returns the kAliHLTAnyDataType type as input.
60 list.push_back(kAliHLTAnyDataType);
61}
62
63
64void AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const
65{
66 // Returns the kAliHLTDataTypeTriggerDecision type as output.
67 list.push_back(kAliHLTDataTypeTriggerDecision);
68}
69
70
71void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
72{
73 // Returns output data size estimate.
74 // See header file for more details.
75
76 // Matthias 2009-07-03 this is presumably to small as the streamed object might be
77 // bigger. This is actually the case in root v5-24-00
78 // Just take 2x the size of the object
79 constBase = 2*sizeof(AliHLTTriggerDecision);
80 inputMultiplier = 1;
81}
82
83
84int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData)
85{
86 // Sets the pointers to the evtData and trigData, then calls the DoTrigger to
87 // execute the actual trigger algorithm.
88
89 fEventData = &evtData;
90 fTriggerData = &trigData;
91 fDecisionMade = false;
92 fTriggerEventResult = 0;
93 // Reset the description, readout list and trigger domain used by TriggerEvent
94 // if requested to do so.
95 if (fClearInfo)
96 {
97 fDescription = "";
98 fReadoutList.Clear();
99 fTriggerDomain.Clear();
100 }
101
102 int result = DoTrigger();
103 if (result != 0) return result;
104
105 // Fill in a default decision of false if none was made.
106 if (not fDecisionMade)
107 {
108 TriggerEvent(false);
109 }
110
111 // Cleanup
112 fEventData = NULL;
113 fTriggerData = NULL;
114 return fTriggerEventResult;
115}
116
117
118int AliHLTTrigger::TriggerEvent(bool value)
119{
120 // Sets the trigger decision for the current event.
121 // See header file for more details.
122
123 if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed.
124 AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription);
125 // Append the readout list if it contains anything.
126 triggerResult.TriggerDomain().Add(fReadoutList);
127 return TriggerEvent(&triggerResult, kAliHLTDataTypeTriggerDecision);
128}
129
130
131int AliHLTTrigger::TriggerEvent(
132 AliHLTTriggerDecision* result, const AliHLTComponentDataType& type,
133 AliHLTUInt32_t spec
134 )
135{
136 // Sets a custom trigger decision for the current event.
137 // See header file for more details.
138
139 if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed.
140
141 AliHLTReadoutList readoutlist = result->ReadoutList();
142
143 fTriggerEventResult = PushBack(result, type, spec);
144 if (fTriggerEventResult == 0) {
145 fTriggerEventResult = PushBack(readoutlist.Buffer(), readoutlist.BufferSize(), kAliHLTDataTypeReadoutList);
146 }
147
148 if (fTriggerEventResult == 0) fDecisionMade = true;
149 return fTriggerEventResult;
150}
151
152
153void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list)
154{
155 // Calls the const version of this method.
156
157 // Assign to const temporary variable to make sure we call the constant version
158 // of the GetOutputDataTypes method.
159 const AliHLTTrigger* t = this;
160 t->GetInputDataTypes(list);
161}
162
163
164int AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list)
165{
166 // Calls the const version of this method.
167
168 // Assign to const temporary variable to make sure we call the constant version
169 // of the GetOutputDataTypes method.
170 const AliHLTTrigger* t = this;
171 t->GetOutputDataTypes(list);
172 list.push_back(kAliHLTDataTypeReadoutList);
173 return list.size();
174}
175
176int AliHLTTrigger::CreateEventDoneReadoutFilter(const AliHLTTriggerDomain& domain, unsigned type)
177{
178 // add a readout filter to the EventDoneData
179 int iResult=0;
180 unsigned nofEntries=0;
181 switch (type) {
182 /* readout filter */
183 case 3:
184 /* monitoring filter */
185 case 4:
186 nofEntries=domain.GetNofEntries();
187 break;
188 /* monitoring event command */
189 case 5:
190 break;
191 default:
192 HLTError("unknown event done data command code 0x%08x", type);
193 return -EINVAL;
194 }
195
196 // we need:
197 // 1 word for the filter command: readout filter, monitoring filter, monitoring event
198 // 1 word for the readout filter size
199 // 4*n words for the filter list
200 if ((iResult=ReserveEventDoneData((nofEntries*4 + 2) * sizeof(AliHLTUInt32_t)))<0) return iResult;
201 AliHLTUInt32_t eddbuffer[4];
202
203 // add the specific command
204 eddbuffer[0]=type;
205 if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult;
206
207 // find the valid entries
208 unsigned block=0;
209 vector<const AliHLTDomainEntry*> entries;
210 for (block=0; block<nofEntries; block++) {
211 // skip all DAQ readout entries as they are handled by the readout list
212 // 2009-12-03: this turned out to cause a bug, since all blocks with data type
213 // id 'any' will also match this condition. In fact, it is not necessary to
214 // filter the entries, disable this condition. Code can be cleaned up later
215 // if this schema has been established and tested
216 // https://savannah.cern.ch/bugs/index.php?60082
217 //if (domain[block]==AliHLTDomainEntry(kAliHLTDataTypeDAQRDOUT)) continue;
218 if (domain[block].Exclusive()) {
219 // 2009-12-03 comment out that warning for the moment
220 // there are suddenly exclusive entries in the list
221 // https://savannah.cern.ch/bugs/index.php?60083
222 //HLTWarning("exclusive trigger domain entries are currently not handled, skipping entry %s", domain[block].AsString().Data());
223 continue;
224 }
225 entries.push_back(&(domain[block]));
226 }
227
228 // add the number of blocks if not monitoring event command
229 if (type!=5) {
230 eddbuffer[0]=entries.size();
231 if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult;
232 }
233
234 for (vector<const AliHLTDomainEntry*>::iterator entry=entries.begin();
235 entry!=entries.end(); entry++) {
236 (*entry)->AsBinary(eddbuffer);
237 for (int n=0; n<4; n++)
238 if ((iResult=PushEventDoneData(eddbuffer[n]))<0) return iResult;
239 }
240 return iResult;
241}