1 #ifndef ALIHLTTRIGGERDOMAIN_H
2 #define ALIHLTTRIGGERDOMAIN_H
3 /* This file is property of and copyright by the ALICE HLT Project *
4 * ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice */
7 /// @file AliHLTDomainEntry.h
8 /// @author Artur Szostak <artursz@iafrica.com>
10 /// @brief Declaration of the AliHLTTriggerDomain class used to store the set of data block types to readout.
13 #include "TClonesArray.h"
14 #include "AliHLTDataTypes.h"
16 class AliHLTDomainEntry;
17 class AliHLTReadoutList;
20 * \class AliHLTTriggerDomain
21 * The trigger domain class is the set of HLT raw data block types that should
22 * be readout and sent to HLTOUT.
23 * It is implemented as a list of domain entries, where each domain entry is
24 * like a rule, or pattern to match against. When trying to decide if a given
25 * data block falls within the trigger domain, i.e. is part of the readout, the
26 * domain entries are applied one after the other from top to bottom. Two kinds
27 * of domain entries, inclusive and exclusive are possible, which indicate if a
28 * data block type or range, is part of the trigger domain or not. As we process
29 * the domain entries we update our decision of whether the data block is part
30 * of the trigger domain or not. If the domain entry is an inclusion then we update
31 * the decision to true, if it is an exclusion then we update the decision to false.
32 * The value of the result after applying the last domain entry then indicates
33 * if the data block is part of the trigger domain or not.
34 * In this way we can specify trigger domains as sets to arbitrary complexity
35 * and manipulate them as mathematical sets accordingly.
37 * The other feature of the AliHLTTriggerDomain class is that it overloads the
38 * following operators to provide set like behaviour:
39 * | this provides the set union operation (The + operator does the same).
40 * & this provides the set intersect operation.
41 * - this provides the set difference operation.
42 * ^ this provides an exclusive or (xor) operation. i.e. given two sets A and B
43 * the result C is given by:
44 * C = {x : x elf A and not x elf B, or x elf B and not x elf A}
45 * where 'elf' means "is an element of".
46 * ~ this returns the set complement.
47 * These operators then allow expressions to be formed from trigger domain objects
48 * which behave like sets.
50 class AliHLTTriggerDomain : public TObject
55 * Default constructor.
57 AliHLTTriggerDomain();
60 * Constructs the trigger domain from a list of domain entries.
61 * \param list Comma separated list of domain entries of the form xxx:yyy:zzz
62 * Can optionaly have a '+' or '-' character just in front of the block
63 * type string, xxx in this case, to indicate inclusive or exclusive entries.
64 * \note If inclusive and exclusive entries are specified then they are applied
65 * in the order found in the list, from left to right. This means that subsequent
66 * includes can override previous excludes and visa versa.
68 AliHLTTriggerDomain(const char* list);
71 * Constructor to create a trigger domain from a DDL readout list.
72 * The trigger domain will contain entries of the form "DAQRDOUT:xxxx:yyyy"
73 * where xxxx is the appropriate detector name given by AliDAQ::OnlineName()
74 * and yyyy is the DDL equipment ID number.
75 * \param list The read out list object
77 AliHLTTriggerDomain(const AliHLTReadoutList& list);
80 * Copy constructor performs a deep copy.
81 * \param domain The domain entry to copy from.
83 AliHLTTriggerDomain(const AliHLTTriggerDomain& domain);
88 virtual ~AliHLTTriggerDomain();
91 * Adds entries to the trigger domain to correspond to the DDL readout list.
92 * The trigger domain will contain entries of the form "DAQRDOUT:xxxx:yyyy"
93 * where xxxx is the appropriate detector name given by AliDAQ::OnlineName()
94 * and yyyy is the DDL equipment ID number.
95 * \param list The readout list object
97 void Add(const AliHLTReadoutList& list);
100 * Adds the given entry to this trigger domain as an inclusive entry.
101 * Existing entries are modified as required to optimise the trigger domain
102 * rule / pattern matching list.
103 * \param entry The domain entry object to add.
104 * \note The entry.Exclusive() flag is ignored and is treated as if it was kFALSE.
106 void Add(const AliHLTDomainEntry& entry);
109 * Adds the given data type to the trigger domain such that all data blocks
110 * that match this type will form part of the trigger domain.
111 * \param datatype The data block type and origin to match.
113 void Add(const AliHLTComponentDataType& datatype);
116 * Adds the given data type and origin to the trigger domain such that all data
117 * blocks that match will form part of this trigger domain.
118 * \param blocktype The data block type string of the data block that must match.
119 * The value of kAliHLTAnyDataTypeID can be used to specify the 'any' type
121 * \param origin The origin of the data block, such as the detector name, that
122 * must match. The value of kAliHLTDataOriginAny can be used to specify the
123 * 'any' origin wild card value.
125 void Add(const char* blocktype, const char* origin);
128 * Adds the given data type with particular specification bits to the trigger
129 * domain, such that all data blocks that match these will form part of this
131 * \param datatype The data block type and origin that must match.
132 * \param spec The specification bits that must match.
134 void Add(const AliHLTComponentDataType& datatype, UInt_t spec);
137 * Adds the given data type, origin and specification bits of data blocks that
138 * should form part of this trigger domain.
139 * \param blocktype The data block type string of the data block that must match.
140 * The value of kAliHLTAnyDataTypeID can be used to specify the 'any' type
142 * \param origin The origin of the data block, such as the detector name, that
143 * must match. The value of kAliHLTDataOriginAny can be used to specify the
144 * 'any' origin wild card value.
145 * \param spec The specification bits that must match.
147 void Add(const char* blocktype, const char* origin, UInt_t spec);
150 * Removes entries from the trigger domain that correspond to the DDL readout list.
151 * All entries of the form "DAQRDOUT:xxxx:yyyy" are removed, where xxxx is the
152 * appropriate detector name given by AliDAQ::OnlineName() and yyyy is the DDL
153 * equipment ID number, as long as the corresponding bit is set in the readout
155 * \param list The readout list object
157 void Remove(const AliHLTReadoutList& list);
160 * Removes or modifies all entries from the trigger domain, such that data blocks
161 * that match the given domain entry will not form part of this trigger domain.
162 * Existing entries are modified as required to optimise the trigger domain
163 * rule / pattern matching list.
164 * \param entry The domain entry object to indicating values that should be removed.
165 * \note The entry.Exclusive() flag is ignored and is treated as if it was kTRUE.
167 void Remove(const AliHLTDomainEntry& entry);
170 * Removes the given data type from the trigger domain, such that all data blocks
171 * that match this type will not form part of the trigger domain.
172 * \param datatype The data block type and origin that must match the blocks not
173 * forming part of this trigger domain.
175 void Remove(const AliHLTComponentDataType& datatype);
178 * Removes the given data type and origin from the trigger domain, such that all
179 * data blocks that match these will not form part of the trigger domain.
180 * \param blocktype The data block type string that must match the data blocks
181 * not forming part of this trigger domain.
182 * The value of kAliHLTAnyDataTypeID can be used to specify the 'any' type
184 * \param origin The origin string, such as the detector name, that must match
185 * the data blocks not forming part of this trigger domain.
186 * The value of kAliHLTDataOriginAny can be used to specify the 'any' origin
189 void Remove(const char* blocktype, const char* origin);
192 * Removes the given data type with given specification bit from the trigger
193 * domain, such that all data blocks that match these will not form part of the
195 * \param datatype The data block type and origin that must match the blocks
196 * not forming part of this trigger domain.
197 * \param spec The specification bits that must match for the blocks that do
198 * not form part of this trigger domain.
200 void Remove(const AliHLTComponentDataType& datatype, UInt_t spec);
203 * Removes the given data type, origin and specification from the trigger domain,
204 * such that all data blocks that match these will not form part of the trigger
206 * \param blocktype The data block type string that must match the data blocks
207 * not forming part of this trigger domain.
208 * The value of kAliHLTAnyDataTypeID can be used to specify the 'any' type
210 * \param origin The origin string, such as the detector name, that must match
211 * the data blocks not forming part of this trigger domain.
212 * The value of kAliHLTDataOriginAny can be used to specify the 'any' origin
214 * \param spec The specification bits that must match for the blocks that do
215 * not form part of this trigger domain.
217 void Remove(const char* blocktype, const char* origin, UInt_t spec);
220 * This checks to see if the given entry (or class of entries, if the entry uses
221 * wild card values) is part of the trigger domain.
222 * \param entry This is the entry to check for.
223 * \return true if data blocks that match the entry are part of this
224 * trigger domain and false otherwise.
225 * \note If the block contains the 'any' wild card values for the data type
226 * origin or specification, then the inclusive domains are treated
227 * optimistically and the exclusive domains pessimistically. This means that
228 * the wild card values are assumed to fall within the trigger domain for the
229 * optimistic case, but fall outside the domain for the pessimistic case.
231 bool Contains(const AliHLTDomainEntry& entry) const;
234 * This checks to see if the given data block should be included in the HLT readout.
235 * \param block The data block descriptor to check.
236 * \return true if data block forms part of this trigger domain and should
237 * be part of the readout and false otherwise.
238 * \note If the block contains the 'any' wild card values for the data type
239 * or origin, then the inclusive domains are treated optimistically and the
240 * exclusive domains pessimistically. This means that the wild card values
241 * are assumed to fall within the trigger domain for the optimistic case,
242 * but fall outside the domain for the pessimistic case.
244 bool IncludeInReadout(const AliHLTComponentBlockData* block) const;
247 * This checks to see if the given data block should not be included in the
249 * \param block The data block descriptor to check.
250 * \return true if data block does not form part of this trigger domain and
253 bool ExcludeFromReadout(const AliHLTComponentBlockData* block) const
255 return ! IncludeInReadout(block);
259 * This method removes all entries in the trigger domain list, giving us and
260 * empty trigger domain set.
261 * \param option This is passed onto the internal fEntries TClonesArray.
262 * The method is inherited from TObject.
264 virtual void Clear(Option_t* option = "");
267 * Prints all the domain entries in this trigger domain in the order in which
268 * they are applied and if they are inclusive or exclusive.
269 * \param option This is not used by this method.
270 * The method is inherited from TObject.
272 virtual void Print(Option_t* option = "") const;
275 * Assignment operator performs a deep copy.
276 * \param domain The domain entry to copy from.
277 * \return A reference to this object.
279 AliHLTTriggerDomain& operator = (const AliHLTTriggerDomain& domain);
282 * This operator adds all domain entries in <i>domain</i> to this trigger domain
283 * in such a way, so as to effectively perform a set union.
284 * \param domain The domain object on the right hand side of the operator.
285 * \return A reference to this object.
287 AliHLTTriggerDomain& operator |= (const AliHLTTriggerDomain& domain);
290 * This operator adds all domain entries in <i>domain</i> that do not exist in
291 * this trigger domain, but removes all entries that do exist, effectively
292 * performing an exclusive or (xor) operation.
293 * i.e. given two sets A and B the result C is given by:
294 * C = {x : x elf A and not x elf B, or x elf B and not x elf A}
295 * where 'elf' means "is an element of".
296 * \param domain The domain object on the right hand side of the operator.
297 * \return A reference to this object.
299 AliHLTTriggerDomain& operator ^= (const AliHLTTriggerDomain& domain);
302 * This operator removes all domain entries from this trigger domain that do
303 * not also exist in <i>domain</i>, effectively performing a set intersect.
304 * \param domain The domain object on the right hand side of the operator.
305 * \return A reference to this object.
307 AliHLTTriggerDomain& operator &= (const AliHLTTriggerDomain& domain)
309 return this->operator = (*this & domain);
313 * This operator performs the same operation as the '|=' operator.
314 * \param domain The domain object on the right hand side of the operator.
315 * \return A reference to this object.
317 AliHLTTriggerDomain& operator += (const AliHLTTriggerDomain& domain)
319 return operator |= (domain);
323 * This operator removes all domain entries from this trigger domain that exisit
324 * in <i>domain</i>, effectively implementing a set difference.
325 * \param domain The domain object on the right hand side of the operator.
326 * \return A reference to this object.
328 AliHLTTriggerDomain& operator -= (const AliHLTTriggerDomain& domain);
331 * This operator returns the set complement of the trigger domain.
332 * \return The complement of this trigger domain, such that any data block that
333 * returns true for AliHLTTriggerDomain::IncludeInReadout() for this trigger
334 * domain, will return false for the same method call in the returned object.
336 AliHLTTriggerDomain operator ~ () const;
339 * This operator performs a set union between this trigger domain and <i>domain</i>.
340 * \param domain The domain object on the right hand side of the operator.
341 * \return a trigger domain object R, such that for each data block D, we will have
342 * R.IncludeInReadout(D) == this->IncludeInReadout(D) or domain.IncludeInReadout(D)
344 AliHLTTriggerDomain operator | (const AliHLTTriggerDomain& domain) const
346 AliHLTTriggerDomain result = *this;
347 return result.operator |= (domain);
351 * This operator performs an exclusive or (xor) like operation between this trigger
352 * domain and <i>domain</i>.
353 * \param domain The domain object on the right hand side of the operator.
354 * \return a trigger domain object R, such that for each data block D, we will have
355 * R.IncludeInReadout(D) == this->IncludeInReadout(D) xor domain.IncludeInReadout(D)
357 AliHLTTriggerDomain operator ^ (const AliHLTTriggerDomain& domain) const
359 AliHLTTriggerDomain result = *this;
360 return result.operator ^= (domain);
364 * This operator performs a set intersect operation between this trigger domain
366 * \param domain The domain object on the right hand side of the operator.
367 * \return a trigger domain object R, such that for each data block D, we will have
368 * R.IncludeInReadout(D) == this->IncludeInReadout(D) and domain.IncludeInReadout(D)
370 AliHLTTriggerDomain operator & (const AliHLTTriggerDomain& domain) const;
373 * This operator performs the same operation as the '|' operator.
374 * \param domain The domain object on the right hand side of the operator.
375 * \return a trigger domain object R, such that for each data block D, we will have
376 * R.IncludeInReadout(D) == this->IncludeInReadout(D) or domain.IncludeInReadout(D)
378 AliHLTTriggerDomain operator + (const AliHLTTriggerDomain& domain) const
380 AliHLTTriggerDomain result = *this;
381 return result.operator += (domain);
385 * This operator implements the set difference between this trigger domain and
387 * \param domain The domain object on the right hand side of the operator.
388 * \return a trigger domain object R, such that for each data block D, we will have
389 * R.IncludeInReadout(D) == this->IncludeInReadout(D) and not domain.IncludeInReadout(D)
391 AliHLTTriggerDomain operator - (const AliHLTTriggerDomain& domain) const
393 AliHLTTriggerDomain result = *this;
394 return result.operator -= (domain);
398 * Typecase operator to create a DDL readout list object from the trigger domain.
400 operator AliHLTReadoutList () const;
405 * This method merges the domain entries from <i>domain</i> by copying them into
406 * fEntries, but only the ones not marked for removal in <i>removeDomainEntry</i>.
407 * Any entries that were marked for removal in fEntries are also removed.
408 * \param removeThisEntry Flags which indicate if the corresponding fEntries[i]
410 * \param entriesCount The number of entries in <i>removeThisEntry</i>.
411 * \param removeDomainEntry Flags which indicate if the corresponding domain.fEntries[i]
412 * was marked for removal or not. If marked for removal then it will not be copied
413 * into this trigger domain. The size of the array is given by domain.GetEntriesFast().
414 * \param startOfIntersects This is the start location of the new intersection domain
415 * entries that were added to fEntries. i.e. fEntries[startOfIntersects] is the
416 * first new intersect entry.
419 const bool* removeThisEntry, Int_t entriesCount,
420 const bool* removeDomainEntry, Int_t startOfIntersects,
421 const AliHLTTriggerDomain& domain
425 * Goes throught the list of domain entries in fEntries from the first entry
426 * indicated by 'min' to the end of the list and marks for deletion all entries
427 * in fEntries that are subsets of 'entry'.
428 * The entries are marked by setting the 14'th bit in fBits with a call to
429 * AliHLTDomainEntry::SetBit(14, true).
430 * \param entry The entry that should be the super set of the entries we mark
432 * \param min This is the first entry we consider, all the way up to
433 * fEntries.GetEntriesFast() - 1.
435 void MarkForDeletionSubsetsOf(const AliHLTDomainEntry& entry, Int_t min);
438 * Removes all entries in this trigger domain which were marked for removal.
439 * These are all domain entries that have the 14'th bit set in their fBits field
440 * with a call to AliHLTDomainEntry::SetBit(14, true).
442 void RemoveMarkedEntries();
445 * Removes any redundant trigger domain entries from the fEntries list.
446 * Entries that are subsets of each other are removed. Also exclusive entries
447 * that are not subsets of any inclusive entry are also removed, because we
448 * implicitly assume a data block does not form part of the trigger domain,
449 * unless explicitly included with an inclusive domain entry. So these kinds
450 * of entries are redundant.
454 TClonesArray fEntries; /// The list of domain entries used to decide if a data block forms part of trigger domain set.
456 ClassDef(AliHLTTriggerDomain, 1) // This is a list of internal HLT data block types which should be forwarded for readout.
460 #endif // ALIHLTTRIGGERDOMAIN_H