]>
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" | |
5a806c0e | 31 | |
4aa41877 | 32 | ClassImp(AliHLTTrigger) |
5a806c0e | 33 | |
5a806c0e | 34 | |
a9670afe | 35 | AliHLTTrigger::AliHLTTrigger() : |
36 | AliHLTProcessor(), | |
37 | fEventData(NULL), | |
38 | fTriggerData(NULL), | |
39 | fDecisionMade(false), | |
acc7214e | 40 | fClearInfo(true), |
4adf50d6 | 41 | fTriggerEventResult(0), |
1b9a175e | 42 | fDescription(), |
43 | fReadoutList(), | |
44 | fTriggerDomain() | |
5a806c0e | 45 | { |
5d79eb88 | 46 | // Default constructor sets pointers to NULL. |
5a806c0e | 47 | } |
48 | ||
5a806c0e | 49 | |
a9670afe | 50 | AliHLTTrigger::~AliHLTTrigger() |
5a806c0e | 51 | { |
5d79eb88 | 52 | // Default destructor. |
4adf50d6 | 53 | } |
54 | ||
55 | ||
025443e0 | 56 | void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) const |
57 | { | |
58 | // Returns the kAliHLTAnyDataType type as input. | |
59 | list.push_back(kAliHLTAnyDataType); | |
60 | } | |
61 | ||
62 | ||
63 | void AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) const | |
64 | { | |
65 | // Returns the kAliHLTDataTypeTriggerDecision type as output. | |
66 | list.push_back(kAliHLTDataTypeTriggerDecision); | |
67 | } | |
68 | ||
69 | ||
4adf50d6 | 70 | void AliHLTTrigger::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) |
71 | { | |
5d79eb88 | 72 | // Returns output data size estimate. |
73 | // See header file for more details. | |
4adf50d6 | 74 | |
61074420 | 75 | // Matthias 2009-07-03 this is presumably to small as the streamed object might be |
76 | // bigger. This is actually the case in root v5-24-00 | |
77 | // Just take 2x the size of the object | |
78 | constBase = 2*sizeof(AliHLTTriggerDecision); | |
4adf50d6 | 79 | inputMultiplier = 1; |
5a806c0e | 80 | } |
81 | ||
5a806c0e | 82 | |
a9670afe | 83 | int AliHLTTrigger::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData) |
5a806c0e | 84 | { |
5d79eb88 | 85 | // Sets the pointers to the evtData and trigData, then calls the DoTrigger to |
86 | // execute the actual trigger algorithm. | |
5a806c0e | 87 | |
a9670afe | 88 | fEventData = &evtData; |
89 | fTriggerData = &trigData; | |
90 | fDecisionMade = false; | |
91 | fTriggerEventResult = 0; | |
acc7214e | 92 | // Reset the description, readout list and trigger domain used by TriggerEvent |
93 | // if requested to do so. | |
94 | if (fClearInfo) | |
95 | { | |
96 | fDescription = ""; | |
97 | fReadoutList.Clear(); | |
98 | fTriggerDomain.Clear(); | |
99 | } | |
a9670afe | 100 | |
101 | int result = DoTrigger(); | |
102 | if (result != 0) return result; | |
103 | ||
104 | // Fill in a default decision of false if none was made. | |
105 | if (not fDecisionMade) | |
106 | { | |
107 | TriggerEvent(false); | |
108 | } | |
4adf50d6 | 109 | |
a9670afe | 110 | // Cleanup |
111 | fEventData = NULL; | |
112 | fTriggerData = NULL; | |
113 | return fTriggerEventResult; | |
5a806c0e | 114 | } |
115 | ||
5a806c0e | 116 | |
4654280e | 117 | int AliHLTTrigger::TriggerEvent(bool value) |
5a806c0e | 118 | { |
5d79eb88 | 119 | // Sets the trigger decision for the current event. |
120 | // See header file for more details. | |
5a806c0e | 121 | |
4654280e | 122 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
52f67e50 | 123 | AliHLTTriggerDecision triggerResult(value, GetTriggerName(), fTriggerDomain, fDescription); |
8b745301 | 124 | // Append the readout list if it contains anything. |
125 | triggerResult.TriggerDomain().Add(fReadoutList); | |
72e31932 | 126 | return TriggerEvent(&triggerResult, kAliHLTDataTypeTObject|kAliHLTDataOriginOut); |
5d79eb88 | 127 | } |
128 | ||
129 | ||
4654280e | 130 | int AliHLTTrigger::TriggerEvent( |
5d79eb88 | 131 | AliHLTTriggerDecision* result, const AliHLTComponentDataType& type, |
132 | AliHLTUInt32_t spec | |
133 | ) | |
134 | { | |
135 | // Sets a custom trigger decision for the current event. | |
136 | // See header file for more details. | |
137 | ||
4654280e | 138 | if (fTriggerEventResult != 0) return fTriggerEventResult; // Do not do anything if a previous call failed. |
5d79eb88 | 139 | fTriggerEventResult = PushBack(result, type, spec); |
f320d378 | 140 | if (fTriggerEventResult == 0) { |
025443e0 | 141 | fTriggerEventResult = PushBack(result->ReadoutList().Buffer(), result->ReadoutList().BufferSize(), kAliHLTDataTypeReadoutList); |
15ede44e | 142 | } |
143 | ||
5d79eb88 | 144 | if (fTriggerEventResult == 0) fDecisionMade = true; |
4654280e | 145 | return fTriggerEventResult; |
5d79eb88 | 146 | } |
147 | ||
148 | ||
149 | void AliHLTTrigger::GetInputDataTypes(AliHLTComponentDataTypeList& list) | |
150 | { | |
151 | // Calls the const version of this method. | |
152 | ||
153 | // Assign to const temporary variable to make sure we call the constant version | |
154 | // of the GetOutputDataTypes method. | |
155 | const AliHLTTrigger* t = this; | |
4a0b19b6 | 156 | t->GetInputDataTypes(list); |
5d79eb88 | 157 | } |
158 | ||
159 | ||
160 | int AliHLTTrigger::GetOutputDataTypes(AliHLTComponentDataTypeList& list) | |
161 | { | |
162 | // Calls the const version of this method. | |
163 | ||
164 | // Assign to const temporary variable to make sure we call the constant version | |
165 | // of the GetOutputDataTypes method. | |
166 | const AliHLTTrigger* t = this; | |
167 | t->GetOutputDataTypes(list); | |
025443e0 | 168 | list.push_back(kAliHLTDataTypeReadoutList); |
5d79eb88 | 169 | return list.size(); |
5a806c0e | 170 | } |
171 | ||
2974f8dc | 172 | int AliHLTTrigger::CreateEventDoneReadoutFilter(const AliHLTTriggerDomain& domain, unsigned type) |
173 | { | |
174 | // add a readout filter to the EventDoneData | |
175 | int iResult=0; | |
7b638b2a | 176 | unsigned nofEntries=domain.GetNofEntries(); |
2974f8dc | 177 | // we need: |
178 | // 1 word eventually for the monitor event command | |
179 | // 1 word for the readout filter command | |
180 | // 1 word for the readout filter size | |
181 | // 4*n words for the filter list | |
7b638b2a | 182 | if ((iResult=ReserveEventDoneData((nofEntries*4 + 3) * sizeof(AliHLTUInt32_t)))<0) return iResult; |
2974f8dc | 183 | AliHLTUInt32_t eddbuffer[4]; |
184 | if (type==4) { | |
185 | // in the case of the monitoring filter we also add the monitor event command | |
186 | eddbuffer[0]=5; | |
187 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
188 | } | |
189 | ||
190 | // now the readout list command and the block count | |
191 | eddbuffer[0]=type; | |
192 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
2974f8dc | 193 | |
7b638b2a | 194 | // find the valid entries |
195 | unsigned block=0; | |
196 | vector<const AliHLTDomainEntry*> entries; | |
197 | for (block=0; block<nofEntries; block++) { | |
2974f8dc | 198 | // skip all DAQ readout entries as they are handled by the readout list |
199 | if (domain[block]==AliHLTDomainEntry(kAliHLTDataTypeDAQRDOUT)) continue; | |
200 | if (domain[block].Exclusive()) { | |
201 | HLTWarning("exclusive trigger domain entries are currently not handled, skipping entry %s", domain[block].AsString().Data()); | |
202 | continue; | |
203 | } | |
7b638b2a | 204 | entries.push_back(&(domain[block])); |
205 | } | |
206 | eddbuffer[0]=entries.size(); | |
207 | if ((iResult=PushEventDoneData(eddbuffer[0]))<0) return iResult; | |
208 | ||
209 | for (vector<const AliHLTDomainEntry*>::iterator entry=entries.begin(); | |
210 | entry!=entries.end(); entry++) { | |
211 | (*entry)->AsBinary(eddbuffer); | |
2974f8dc | 212 | for (int n=0; n<4; n++) |
213 | if ((iResult=PushEventDoneData(eddbuffer[n]))<0) return iResult; | |
214 | } | |
215 | return iResult; | |
216 | } |