]>
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(), | |
08105f74 | 45 | fTriggerDomain(), |
46 | fReadoutListSpecBits(kAliHLTVoidDataSpec) | |
5a806c0e | 47 | { |
5d79eb88 | 48 | // Default constructor sets pointers to NULL. |
5a806c0e | 49 | } |
50 | ||
5a806c0e | 51 | |
a9670afe | 52 | AliHLTTrigger::~AliHLTTrigger() |
5a806c0e | 53 | { |
5d79eb88 | 54 | // Default destructor. |
4adf50d6 | 55 | } |
56 | ||
57 | ||
025443e0 | 58 | void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) const |
59 | { | |
60 | // Returns the kAliHLTAnyDataType type as input. | |
61 | list.push_back(kAliHLTAnyDataType); | |
62 | } | |
63 | ||
64 | ||
65 | void AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const | |
66 | { | |
67 | // Returns the kAliHLTDataTypeTriggerDecision type as output. | |
68 | list.push_back(kAliHLTDataTypeTriggerDecision); | |
69 | } | |
70 | ||
71 | ||
4adf50d6 | 72 | void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) |
73 | { | |
5d79eb88 | 74 | // Returns output data size estimate. |
75 | // See header file for more details. | |
4adf50d6 | 76 | |
61074420 | 77 | // Matthias 2009-07-03 this is presumably to small as the streamed object might be |
78 | // bigger. This is actually the case in root v5-24-00 | |
79 | // Just take 2x the size of the object | |
80 | constBase = 2*sizeof(AliHLTTriggerDecision); | |
4adf50d6 | 81 | inputMultiplier = 1; |
5a806c0e | 82 | } |
83 | ||
5a806c0e | 84 | |
a9670afe | 85 | int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData) |
5a806c0e | 86 | { |
5d79eb88 | 87 | // Sets the pointers to the evtData and trigData, then calls the DoTrigger to |
88 | // execute the actual trigger algorithm. | |
5a806c0e | 89 | |
a9670afe | 90 | fEventData = &evtData; |
91 | fTriggerData = &trigData; | |
92 | fDecisionMade = false; | |
93 | fTriggerEventResult = 0; | |
acc7214e | 94 | // Reset the description, readout list and trigger domain used by TriggerEvent |
95 | // if requested to do so. | |
96 | if (fClearInfo) | |
97 | { | |
98 | fDescription = ""; | |
99 | fReadoutList.Clear(); | |
100 | fTriggerDomain.Clear(); | |
101 | } | |
a9670afe | 102 | |
103 | int result = DoTrigger(); | |
104 | if (result != 0) return result; | |
105 | ||
106 | // Fill in a default decision of false if none was made. | |
107 | if (not fDecisionMade) | |
108 | { | |
109 | TriggerEvent(false); | |
110 | } | |
4adf50d6 | 111 | |
a9670afe | 112 | // Cleanup |
113 | fEventData = NULL; | |
114 | fTriggerData = NULL; | |
115 | return fTriggerEventResult; | |
5a806c0e | 116 | } |
117 | ||
5a806c0e | 118 | |
4654280e | 119 | int AliHLTTrigger::TriggerEvent(bool value) |
5a806c0e | 120 | { |
5d79eb88 | 121 | // Sets the trigger decision for the current event. |
122 | // See header file for more details. | |
5a806c0e | 123 | |
4654280e | 124 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
52f67e50 | 125 | AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription); |
8b745301 | 126 | // Append the readout list if it contains anything. |
127 | triggerResult.TriggerDomain().Add(fReadoutList); | |
52fec07c | 128 | return TriggerEvent(&triggerResult, kAliHLTDataTypeTriggerDecision); |
5d79eb88 | 129 | } |
130 | ||
131 | ||
4654280e | 132 | int AliHLTTrigger::TriggerEvent( |
5d79eb88 | 133 | AliHLTTriggerDecision* result, const AliHLTComponentDataType& type, |
134 | AliHLTUInt32_t spec | |
135 | ) | |
136 | { | |
137 | // Sets a custom trigger decision for the current event. | |
138 | // See header file for more details. | |
139 | ||
222238b6 | 140 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
141 | ||
2f251ae6 | 142 | AliHLTReadoutList readoutlist = result->ReadoutList(); |
2f251ae6 | 143 | |
5d79eb88 | 144 | fTriggerEventResult = PushBack(result, type, spec); |
f320d378 | 145 | if (fTriggerEventResult == 0) { |
08105f74 | 146 | fTriggerEventResult = PushBack(readoutlist.Buffer(), readoutlist.BufferSize(), kAliHLTDataTypeReadoutList, fReadoutListSpecBits); |
15ede44e | 147 | } |
148 | ||
5d79eb88 | 149 | if (fTriggerEventResult == 0) fDecisionMade = true; |
4654280e | 150 | return fTriggerEventResult; |
5d79eb88 | 151 | } |
152 | ||
153 | ||
154 | void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) | |
155 | { | |
156 | // Calls the const version of this method. | |
157 | ||
158 | // Assign to const temporary variable to make sure we call the constant version | |
159 | // of the GetOutputDataTypes method. | |
160 | const AliHLTTrigger* t = this; | |
4a0b19b6 | 161 | t->GetInputDataTypes(list); |
5d79eb88 | 162 | } |
163 | ||
164 | ||
165 | int AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) | |
166 | { | |
167 | // Calls the const version of this method. | |
168 | ||
169 | // Assign to const temporary variable to make sure we call the constant version | |
170 | // of the GetOutputDataTypes method. | |
171 | const AliHLTTrigger* t = this; | |
172 | t->GetOutputDataTypes(list); | |
025443e0 | 173 | list.push_back(kAliHLTDataTypeReadoutList); |
5d79eb88 | 174 | return list.size(); |
5a806c0e | 175 | } |
176 | ||
2974f8dc | 177 | int AliHLTTrigger::CreateEventDoneReadoutFilter(const AliHLTTriggerDomain& domain, unsigned type) |
178 | { | |
179 | // add a readout filter to the EventDoneData | |
180 | int iResult=0; | |
0744f75d | 181 | unsigned nofEntries=0; |
182 | switch (type) { | |
183 | /* readout filter */ | |
184 | case 3: | |
185 | /* monitoring filter */ | |
186 | case 4: | |
187 | nofEntries=domain.GetNofEntries(); | |
188 | break; | |
189 | /* monitoring event command */ | |
190 | case 5: | |
191 | break; | |
192 | default: | |
193 | HLTError("unknown event done data command code 0x%08x", type); | |
194 | return -EINVAL; | |
195 | } | |
196 | ||
2974f8dc | 197 | // we need: |
0744f75d | 198 | // 1 word for the filter command: readout filter, monitoring filter, monitoring event |
2974f8dc | 199 | // 1 word for the readout filter size |
200 | // 4*n words for the filter list | |
0744f75d | 201 | if ((iResult=ReserveEventDoneData((nofEntries*4 + 2) * sizeof(AliHLTUInt32_t)))<0) return iResult; |
2974f8dc | 202 | AliHLTUInt32_t eddbuffer[4]; |
2974f8dc | 203 | |
0744f75d | 204 | // add the specific command |
2974f8dc | 205 | eddbuffer[0]=type; |
206 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
2974f8dc | 207 | |
7b638b2a | 208 | // find the valid entries |
209 | unsigned block=0; | |
210 | vector<const AliHLTDomainEntry*> entries; | |
211 | for (block=0; block<nofEntries; block++) { | |
2974f8dc | 212 | // skip all DAQ readout entries as they are handled by the readout list |
44568d8a | 213 | // 2009-12-03: this turned out to cause a bug, since all blocks with data type |
214 | // id 'any' will also match this condition. In fact, it is not necessary to | |
215 | // filter the entries, disable this condition. Code can be cleaned up later | |
216 | // if this schema has been established and tested | |
217 | // https://savannah.cern.ch/bugs/index.php?60082 | |
218 | //if (domain[block]==AliHLTDomainEntry(kAliHLTDataTypeDAQRDOUT)) continue; | |
2974f8dc | 219 | if (domain[block].Exclusive()) { |
44568d8a | 220 | // 2009-12-03 comment out that warning for the moment |
221 | // there are suddenly exclusive entries in the list | |
222 | // https://savannah.cern.ch/bugs/index.php?60083 | |
223 | //HLTWarning("exclusive trigger domain entries are currently not handled, skipping entry %s", domain[block].AsString().Data()); | |
2974f8dc | 224 | continue; |
225 | } | |
7b638b2a | 226 | entries.push_back(&(domain[block])); |
227 | } | |
0744f75d | 228 | |
229 | // add the number of blocks if not monitoring event command | |
230 | if (type!=5) { | |
231 | eddbuffer[0]=entries.size(); | |
232 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
233 | } | |
7b638b2a | 234 | |
235 | for (vector<const AliHLTDomainEntry*>::iterator entry=entries.begin(); | |
236 | entry!=entries.end(); entry++) { | |
237 | (*entry)->AsBinary(eddbuffer); | |
2974f8dc | 238 | for (int n=0; n<4; n++) |
239 | if ((iResult=PushEventDoneData(eddbuffer[n]))<0) return iResult; | |
240 | } | |
241 | return iResult; | |
242 | } |