]>
Commit | Line | Data |
---|---|---|
c580e182 | 1 | //-*- Mode: C++ -*- |
81d62bb4 | 2 | // $Id$ |
e2bb8ddd | 3 | #ifndef ALIHLTTRIGGERMENU_H |
4 | #define ALIHLTTRIGGERMENU_H | |
5 | /* This file is property of and copyright by the ALICE HLT Project * | |
6 | * ALICE Experiment at CERN, All rights reserved. * | |
7 | * See cxx source for full Copyright notice */ | |
8 | ||
9 | /// @file AliHLTTriggerMenu.h | |
10 | /// @author Artur Szostak <artursz@iafrica.com> | |
11 | /// @date 19 Dec 2008 | |
12 | /// @brief Declaration of the AliHLTTriggerMenu base class. | |
13 | ||
14 | #include "TObject.h" | |
15 | #include "TString.h" | |
16 | #include "TClonesArray.h" | |
52f67e50 | 17 | #include "AliHLTTriggerMenuSymbol.h" |
e2bb8ddd | 18 | #include "AliHLTTriggerMenuItem.h" |
acc7214e | 19 | #include "AliHLTTriggerDomain.h" |
e2bb8ddd | 20 | |
21 | /** | |
22 | * \class AliHLTTriggerMenu | |
81d62bb4 | 23 | * The trigger menu specifies the HLT global trigger component configuration. |
24 | * The global trigger has a list of individual input trigger components deriving | |
25 | * from AliHLTTrigger. Each one of these triggers is named. Thus, the trigger menu | |
26 | * is a list of trigger condition expressions, where the variables inside the | |
27 | * expressions are the names of the input triggers. In this way the global trigger | |
28 | * can be configured in a powerful manner using C++ expressions. | |
29 | * Attached to each trigger condition expression is a trigger domain merging | |
30 | * expression, which indicates how the final global trigger domain should be | |
31 | * calculated from the fragments coming from each individual trigger component. | |
32 | * Each entry in the trigger menu has a priority. These are set explicitly and | |
33 | * set to zero by default. The higher the priority number for a menu item the | |
34 | * higher its priority. Multiple items can have the same priority values. | |
35 | * | |
36 | * An important concept is the trigger priority group. This is a number of menu | |
37 | * items that all have the same priority. If all trigger menu items have the | |
38 | * same priority value then there is only one priority group with all the items | |
39 | * being members of the same group. Otherwise there can be any number of priority | |
40 | * groups with any number of one or more trigger menu items in a group. | |
41 | * A trigger menu item belongs to priority group N if it has a priority number equal | |
42 | * to N. The trigger menu is then evaluated by the global trigger component, such | |
43 | * that the highest priority trigger groups (largest N) are evaluated first. | |
44 | * Trigger items within a priority group are then evaluated in the order they | |
45 | * were added to the trigger menu. Thus, the first item added to the menu in group | |
46 | * N is evaluated first, and the last added to group N is evaluated last. | |
47 | * Inside a priority group all trigger menu items have their trigger condition | |
48 | * expressions evaluated. This is equivalent to evaluating the group's trigger | |
49 | * condition expression, where the group's expression is a concatenation of the | |
50 | * individual trigger condition expressions of the items in priority group N. | |
51 | * This means that the trigger conditions expressions (indeed, also the trigger | |
52 | * domain merging expressions) are allowed to have a dangling trailing operator. | |
53 | * The trailing operator will then make sense in the full concatenated expression. | |
54 | * If no such trailing operator is found then the default trigger conditions operator | |
325e5e42 | 55 | * is used implicitly for the concatenation, as defined in the trigger menu. |
81d62bb4 | 56 | * If the full concatenated condition expression evaluates to true then the priority |
57 | * group's result is also true and the output trigger domain can be calculated. | |
58 | * This is done by taking all the merging expressions from only those trigger menu | |
59 | * items whose trigger condition expression fragments were true, and concatenating | |
60 | * those merging expression fragments together to arrive at the full merging expression. | |
61 | * The final trigger domain is calculated by evaluating the merging expression. | |
325e5e42 | 62 | * Note that the concatenation of the merging expression fragments works in the |
81d62bb4 | 63 | * same manner as the trigger condition expressions. So a trailing operator is |
64 | * allowed in each trigger menu item's merging expression, and is implicitly removed | |
325e5e42 | 65 | * if not needed, but used to concatenate with the next triggered expression. |
81d62bb4 | 66 | * The default domain merging operator is used if no trailing operator is present |
67 | * but a concatenation is required. | |
68 | * The evaluation of trigger menu items stops at the first priority group whose | |
69 | * trigger condition expression evaluated to true. This is important to force | |
70 | * mutually exclusive precedence of a higher priority trigger or triggers. | |
71 | * The two extremes of this model are: | |
72 | * - All trigger menu entries have the same priority so they are all part of the | |
73 | * same priority group, and thus every trigger menu item is evaluated. | |
74 | * - Every trigger menu entry has a different priority, so each forms its own priority | |
75 | * group, and the trigger evaluation stops at the first highest priority item | |
76 | * that matches the trigger condition. | |
77 | * Another way to look at the model is that priority groups are mutually exclusive. | |
78 | * Trigger menu items from two different priority groups cannot be active at the same | |
79 | * time. While more than one trigger menu item can be active at the same time if they | |
80 | * are from the same priority group. | |
81 | * Yet another view at the model is that a priority group forms an explicit trigger | |
82 | * condition and trigger domain merging expression, while trigger menu items specify | |
83 | * the expression fragments that are concatenated together implicitly. If there is | |
84 | * just one trigger menu item in a priority group then the groups expressions are | |
85 | * explicit. On the other hand, for multiple items in a group they form implicit | |
86 | * expression fragments. | |
9e14734f | 87 | * |
88 | * \note CTP trigger class names can be used in the trigger menu since the global | |
89 | * trigger will generate and add corresponding trigger decision objects to the | |
90 | * logic on the fly. | |
91 | * In addition, for software triggers, a special SOFTWARE trigger decision is | |
92 | * generated and the SOFTWARE name can be used in the trigger menu for this. | |
93 | * If the software trigger is a calibration event then a trigger decision with | |
94 | * the name CALIBRATION is generated instead. START_OF_DATA and END_OF_DATA | |
95 | * symbols are similarly defined for the start and end of data events respectively. | |
e2bb8ddd | 96 | */ |
97 | class AliHLTTriggerMenu : public TObject | |
98 | { | |
99 | public: | |
100 | ||
101 | /** | |
102 | * Default constructor. | |
103 | */ | |
104 | AliHLTTriggerMenu(); | |
105 | ||
106 | /** | |
107 | * Default destructor. | |
108 | */ | |
109 | virtual ~AliHLTTriggerMenu(); | |
110 | ||
111 | /** | |
112 | * Inherited from TObject, this prints the contents of the trigger menu. | |
113 | * \param option Can be "short" which will print the short format. | |
114 | */ | |
115 | virtual void Print(Option_t* option = "") const; | |
acc7214e | 116 | |
117 | /** | |
118 | * This method removes all items and symbols from the trigger menu. | |
119 | * \note The name and default values are not changed. Only the items and symbol | |
120 | * lists are cleared. | |
121 | * \param option This is passed onto the internal fSymbols and fItems TClonesArrays. | |
122 | * The method is inherited from TObject. | |
123 | */ | |
124 | virtual void Clear(Option_t* option = ""); | |
e2bb8ddd | 125 | |
126 | /** | |
127 | * Copy constructor performs a deep copy of the object. | |
128 | * \param obj Object to copy from. | |
129 | */ | |
130 | AliHLTTriggerMenu(const AliHLTTriggerMenu& obj); | |
131 | ||
132 | /** | |
133 | * Assignment operator performs a deep copy of the object. | |
134 | * \param obj Object to copy from. | |
135 | * \return This object is returned after being replaced by a copy of <i>obj</i>. | |
136 | */ | |
137 | AliHLTTriggerMenu& operator = (const AliHLTTriggerMenu& obj); | |
138 | ||
139 | /** | |
140 | * Inherited from TObject. Returns the name of the trigger menu. | |
141 | */ | |
142 | virtual const char* GetName() const { return fName.Data(); } | |
143 | ||
144 | /** | |
145 | * Returns the name of the trigger menu. | |
146 | */ | |
147 | const char* Name() const { return fName.Data(); } | |
148 | ||
149 | /** | |
150 | * Sets the name of the trigger menu. | |
151 | */ | |
152 | void Name(const char* name) { fName = name; } | |
153 | ||
52f67e50 | 154 | /** |
155 | * Returns the number of symbols in the trigger menu. | |
156 | */ | |
157 | UInt_t NumberOfSymbols() const { return UInt_t(fSymbols.GetEntriesFast()); } | |
158 | ||
159 | /** | |
160 | * Fetches the i'th trigger menu symbol. | |
161 | */ | |
162 | const AliHLTTriggerMenuSymbol* Symbol(UInt_t i) const | |
163 | { | |
164 | if (i >= UInt_t(fSymbols.GetEntriesFast())) return NULL; | |
165 | return static_cast<const AliHLTTriggerMenuSymbol*>( fSymbols.UncheckedAt(Int_t(i)) ); | |
166 | } | |
167 | ||
168 | /** | |
169 | * Fetches the i'th trigger menu symbol for editing. | |
170 | */ | |
171 | AliHLTTriggerMenuSymbol* Symbol(UInt_t i) | |
172 | { | |
173 | if (i >= UInt_t(fSymbols.GetEntriesFast())) return NULL; | |
174 | return static_cast<AliHLTTriggerMenuSymbol*>( fSymbols.UncheckedAt(Int_t(i)) ); | |
175 | } | |
176 | ||
177 | /** | |
81d62bb4 | 178 | * Adds a new symbol to the trigger menu. If the symbol being added already |
179 | * exists in the trigger menu then the new symbol will not be added. | |
180 | * \param entry The new trigger menu symbol being added. | |
52f67e50 | 181 | */ |
81d62bb4 | 182 | void AddSymbol(const AliHLTTriggerMenuSymbol& entry); |
52f67e50 | 183 | |
184 | /** | |
185 | * Returns the array of symbols. | |
186 | */ | |
187 | const TClonesArray& SymbolArray() const { return fSymbols; } | |
188 | ||
e2bb8ddd | 189 | /** |
190 | * Returns the number of items in the trigger menu. | |
191 | */ | |
192 | UInt_t NumberOfItems() const { return UInt_t(fItems.GetEntriesFast()); } | |
193 | ||
194 | /** | |
195 | * Fetches the i'th trigger menu item. | |
196 | */ | |
197 | const AliHLTTriggerMenuItem* Item(UInt_t i) const | |
198 | { | |
199 | if (i >= UInt_t(fItems.GetEntriesFast())) return NULL; | |
200 | return static_cast<const AliHLTTriggerMenuItem*>( fItems.UncheckedAt(Int_t(i)) ); | |
201 | } | |
202 | ||
203 | /** | |
204 | * Fetches the i'th trigger menu item for editing. | |
205 | */ | |
206 | AliHLTTriggerMenuItem* Item(UInt_t i) | |
207 | { | |
208 | if (i >= UInt_t(fItems.GetEntriesFast())) return NULL; | |
209 | return static_cast<AliHLTTriggerMenuItem*>( fItems.UncheckedAt(Int_t(i)) ); | |
210 | } | |
211 | ||
212 | /** | |
213 | * Adds a new entry to the trigger menu. | |
214 | */ | |
215 | void AddItem(const AliHLTTriggerMenuItem& entry) | |
216 | { | |
217 | new (fItems[fItems.GetEntriesFast()]) AliHLTTriggerMenuItem(entry); | |
218 | } | |
219 | ||
52f67e50 | 220 | /** |
221 | * Returns the array of menu items. | |
222 | */ | |
223 | const TClonesArray& ItemsArray() const { return fItems; } | |
224 | ||
acc7214e | 225 | /** |
226 | * Sets the default trigger description to use if the global trigger does not | |
227 | * fire and returns a negative result. | |
228 | */ | |
229 | void DefaultDescription(const char* value) { fDefaultDescription = value; } | |
230 | ||
231 | /** | |
232 | * Returns the default trigger description to use if the global trigger does not | |
233 | * fire and returns a negative result. | |
234 | */ | |
235 | const char* DefaultDescription() const { return fDefaultDescription.Data(); } | |
236 | ||
237 | /** | |
238 | * Sets the default trigger domain to use if the global trigger does not | |
239 | * fire and returns a negative result. | |
240 | */ | |
241 | void DefaultTriggerDomain(const AliHLTTriggerDomain& value) { fDefaultDomain = value; } | |
242 | ||
243 | /** | |
244 | * Returns the default trigger domain to use if the global trigger does not | |
245 | * fire and returns a negative result. | |
246 | */ | |
247 | const AliHLTTriggerDomain& DefaultTriggerDomain() const { return fDefaultDomain; } | |
248 | ||
249 | /** | |
250 | * Returns the default trigger domain for modification. | |
251 | */ | |
252 | AliHLTTriggerDomain& DefaultTriggerDomain() { return fDefaultDomain; } | |
253 | ||
81d62bb4 | 254 | /** |
255 | * Sets the default operator used to merge trigger conditions that are matched from | |
256 | * the same trigger menu priority group. | |
257 | */ | |
258 | void DefaultConditionOperator(const char* value) { fDefaultConditionOperator = value; } | |
259 | ||
260 | /** | |
261 | * Returns the default operator used to merge trigger conditions that are matched from | |
262 | * the same trigger menu priority group. | |
263 | */ | |
264 | const char* DefaultConditionOperator() const { return fDefaultConditionOperator.Data(); } | |
265 | ||
266 | /** | |
267 | * Sets the default operator used to merge trigger domains that are matched from | |
268 | * the same trigger menu priority group. | |
269 | */ | |
270 | void DefaultDomainOperator(const char* value) { fDefaultDomainOperator = value; } | |
271 | ||
272 | /** | |
273 | * Returns the default operator used to merge trigger domains that are matched from | |
274 | * the same trigger menu priority group. | |
275 | */ | |
276 | const char* DefaultDomainOperator() const { return fDefaultDomainOperator.Data(); } | |
277 | ||
f925a066 | 278 | /** |
279 | * Returns the default result for the global trigger if no item is matched. | |
280 | */ | |
281 | bool DefaultResult() const { return TestBit(BIT(15)) == 1; } | |
282 | ||
283 | /** | |
284 | * Set the default result for the global trigger if no item is matched. | |
285 | */ | |
286 | void DefaultResult(bool value) { SetBit(BIT(15), value); } | |
287 | ||
e2bb8ddd | 288 | private: |
289 | ||
290 | TString fName; /// Name of the trigger menu. | |
52f67e50 | 291 | TClonesArray fSymbols; /// List of symbols used in trigger expressions. |
e2bb8ddd | 292 | TClonesArray fItems; /// List of trigger menu items. |
acc7214e | 293 | TString fDefaultDescription; /// The default trigger description to use for negative global triggers. |
294 | AliHLTTriggerDomain fDefaultDomain; /// The default trigger domain to use for negative global triggers. | |
81d62bb4 | 295 | TString fDefaultConditionOperator; /// The default operator to use to merge trigger conditions from the same priority group. |
296 | TString fDefaultDomainOperator; /// The default operator to use to merge trigger domains from the same priority group. | |
e2bb8ddd | 297 | |
f925a066 | 298 | ClassDef(AliHLTTriggerMenu, 4) // Trigger menu for the global HLT trigger. |
e2bb8ddd | 299 | }; |
300 | ||
301 | #endif // ALIHLTTRIGGERMENU_H | |
302 |