]>
Commit | Line | Data |
---|---|---|
2974f8dc | 1 | // $Id$ |
a9670afe | 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 | **************************************************************************/ | |
5a806c0e | 17 | |
1b9a175e | 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 | ||
4aa41877 | 26 | #include "AliHLTTrigger.h" |
1b9a175e | 27 | #include "AliHLTTriggerDecision.h" |
15ede44e | 28 | #include "AliHLTReadoutList.h" |
2974f8dc | 29 | #include "AliHLTTriggerDomain.h" |
30 | #include "AliHLTDomainEntry.h" | |
2f251ae6 | 31 | #include "AliHLTCTPData.h" |
5a806c0e | 32 | |
4aa41877 | 33 | ClassImp(AliHLTTrigger) |
5a806c0e | 34 | |
5a806c0e | 35 | |
a9670afe | 36 | AliHLTTrigger::AliHLTTrigger() : |
37 | AliHLTProcessor(), | |
38 | fEventData(NULL), | |
39 | fTriggerData(NULL), | |
40 | fDecisionMade(false), | |
acc7214e | 41 | fClearInfo(true), |
4adf50d6 | 42 | fTriggerEventResult(0), |
1b9a175e | 43 | fDescription(), |
44 | fReadoutList(), | |
45 | fTriggerDomain() | |
5a806c0e | 46 | { |
5d79eb88 | 47 | // Default constructor sets pointers to NULL. |
5a806c0e | 48 | } |
49 | ||
5a806c0e | 50 | |
a9670afe | 51 | AliHLTTrigger::~AliHLTTrigger() |
5a806c0e | 52 | { |
5d79eb88 | 53 | // Default destructor. |
4adf50d6 | 54 | } |
55 | ||
56 | ||
025443e0 | 57 | void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) const |
58 | { | |
59 | // Returns the kAliHLTAnyDataType type as input. | |
60 | list.push_back(kAliHLTAnyDataType); | |
61 | } | |
62 | ||
63 | ||
64 | void AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const | |
65 | { | |
66 | // Returns the kAliHLTDataTypeTriggerDecision type as output. | |
67 | list.push_back(kAliHLTDataTypeTriggerDecision); | |
68 | } | |
69 | ||
70 | ||
4adf50d6 | 71 | void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) |
72 | { | |
5d79eb88 | 73 | // Returns output data size estimate. |
74 | // See header file for more details. | |
4adf50d6 | 75 | |
61074420 | 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); | |
4adf50d6 | 80 | inputMultiplier = 1; |
5a806c0e | 81 | } |
82 | ||
5a806c0e | 83 | |
a9670afe | 84 | int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData) |
5a806c0e | 85 | { |
5d79eb88 | 86 | // Sets the pointers to the evtData and trigData, then calls the DoTrigger to |
87 | // execute the actual trigger algorithm. | |
5a806c0e | 88 | |
a9670afe | 89 | fEventData = &evtData; |
90 | fTriggerData = &trigData; | |
91 | fDecisionMade = false; | |
92 | fTriggerEventResult = 0; | |
acc7214e | 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 | } | |
a9670afe | 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 | } | |
4adf50d6 | 110 | |
a9670afe | 111 | // Cleanup |
112 | fEventData = NULL; | |
113 | fTriggerData = NULL; | |
114 | return fTriggerEventResult; | |
5a806c0e | 115 | } |
116 | ||
5a806c0e | 117 | |
4654280e | 118 | int AliHLTTrigger::TriggerEvent(bool value) |
5a806c0e | 119 | { |
5d79eb88 | 120 | // Sets the trigger decision for the current event. |
121 | // See header file for more details. | |
5a806c0e | 122 | |
4654280e | 123 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
52f67e50 | 124 | AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription); |
8b745301 | 125 | // Append the readout list if it contains anything. |
126 | triggerResult.TriggerDomain().Add(fReadoutList); | |
52fec07c | 127 | return TriggerEvent(&triggerResult, kAliHLTDataTypeTriggerDecision); |
5d79eb88 | 128 | } |
129 | ||
130 | ||
4654280e | 131 | int AliHLTTrigger::TriggerEvent( |
5d79eb88 | 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 | ||
222238b6 | 139 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
140 | ||
2f251ae6 | 141 | AliHLTReadoutList readoutlist = result->ReadoutList(); |
2f251ae6 | 142 | |
5d79eb88 | 143 | fTriggerEventResult = PushBack(result, type, spec); |
f320d378 | 144 | if (fTriggerEventResult == 0) { |
2f251ae6 | 145 | fTriggerEventResult = PushBack(readoutlist.Buffer(), readoutlist.BufferSize(), kAliHLTDataTypeReadoutList); |
15ede44e | 146 | } |
147 | ||
5d79eb88 | 148 | if (fTriggerEventResult == 0) fDecisionMade = true; |
4654280e | 149 | return fTriggerEventResult; |
5d79eb88 | 150 | } |
151 | ||
152 | ||
153 | void 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; | |
4a0b19b6 | 160 | t->GetInputDataTypes(list); |
5d79eb88 | 161 | } |
162 | ||
163 | ||
164 | int 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); | |
025443e0 | 172 | list.push_back(kAliHLTDataTypeReadoutList); |
5d79eb88 | 173 | return list.size(); |
5a806c0e | 174 | } |
175 | ||
2974f8dc | 176 | int AliHLTTrigger::CreateEventDoneReadoutFilter(const AliHLTTriggerDomain& domain, unsigned type) |
177 | { | |
178 | // add a readout filter to the EventDoneData | |
179 | int iResult=0; | |
0744f75d | 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 | ||
2974f8dc | 196 | // we need: |
0744f75d | 197 | // 1 word for the filter command: readout filter, monitoring filter, monitoring event |
2974f8dc | 198 | // 1 word for the readout filter size |
199 | // 4*n words for the filter list | |
0744f75d | 200 | if ((iResult=ReserveEventDoneData((nofEntries*4 + 2) * sizeof(AliHLTUInt32_t)))<0) return iResult; |
2974f8dc | 201 | AliHLTUInt32_t eddbuffer[4]; |
2974f8dc | 202 | |
0744f75d | 203 | // add the specific command |
2974f8dc | 204 | eddbuffer[0]=type; |
205 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
2974f8dc | 206 | |
7b638b2a | 207 | // find the valid entries |
208 | unsigned block=0; | |
209 | vector<const AliHLTDomainEntry*> entries; | |
210 | for (block=0; block<nofEntries; block++) { | |
2974f8dc | 211 | // skip all DAQ readout entries as they are handled by the readout list |
44568d8a | 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; | |
2974f8dc | 218 | if (domain[block].Exclusive()) { |
44568d8a | 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()); | |
2974f8dc | 223 | continue; |
224 | } | |
7b638b2a | 225 | entries.push_back(&(domain[block])); |
226 | } | |
0744f75d | 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 | } | |
7b638b2a | 233 | |
234 | for (vector<const AliHLTDomainEntry*>::iterator entry=entries.begin(); | |
235 | entry!=entries.end(); entry++) { | |
236 | (*entry)->AsBinary(eddbuffer); | |
2974f8dc | 237 | for (int n=0; n<4; n++) |
238 | if ((iResult=PushEventDoneData(eddbuffer[n]))<0) return iResult; | |
239 | } | |
240 | return iResult; | |
241 | } |