ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTGLOBALTRIGGERDECISION_H
#define ALIHLTGLOBALTRIGGERDECISION_H
/* This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 * See cxx source for full Copyright notice                               */

/// @file   AliHLTGlobalTriggerDecision.h
/// @author Artur Szostak <artursz@iafrica.com>
/// @date   26 Nov 2008
/// @brief  Declaration of the AliHLTGlobalTriggerDecision class storing the global HLT decision.

#include "AliHLTTriggerDecision.h"
#include "TArrayL64.h"
#include "TObjArray.h"

/**
 * \class AliHLTGlobalTriggerDecision
 * The global trigger decision object is generated by the AliHLTGlobalTriggerComponent
 * class during processing of input triggers.
 *
 * Multiple input trigger components deriving from AliHLTTrigger will generate
 * AliHLTTriggerDecision objects and possibly additional summary objects. All these
 * objects are input for the global trigger component AliHLTGlobalTriggerComponent.
 * After processing the input objects based on the trigger menu encoded in AliHLTTriggerMenu,
 * the global trigger will generate and fill an AliHLTGlobalTriggerDecision object
 * based on its decision. The new object will contain all the information a normal
 * AliHLTTriggerDecision object generated by AliHLTTrigger contains. But in addition
 * all the input objects that contributed to the global decision are also stored
 * inside AliHLTGlobalTriggerDecision. The contributing trigger decisions are filled
 * in fContributingTriggers and contributing summary TObjects are filled into fInputObjects.
 * These can be accessed with the following methods:
 *  <i>NumberOfTriggerInputs</i> <i>TriggerInput</i> <i>TriggerInputs</i> for the
 *  trigger inputs;
 *  and <i>NumberOfInputObjects</i> <i>InputObject</i> <i>InputObjects</i> for the
 *  input summary objects.
 *
 * There is also an array of counters stored in the global decision. These are
 * a copy of the internal counters of the global trigger component. There is one
 * counter for every item in the trigger menu, plus a possible additional counter
 * at the end which indicated the total number of events processed by the global
 * trigger component.
 *
 * \note The counters do not necessarily correspond to the actual number of triggers
 * that are recorded in the HLT output data stream. For most simple trigger menu
 * configurations the counters will indeed correspond the the actual number of triggers
 * recorded. But for more complex menus that use non zero prescalar values this may not
 * be the case. The reason is that the counters array returned is the internal counter
 * values (state) of the global trigger component. The counters are used to make the
 * prescalars work. Thus, every time a corresponding trigger condition matches
 * (evaluates to true) the counter is incremented, but the trigger decision might
 * anyway skip the corresponding trigger in the menu since the prescalar is downscaling
 * the trigger rate for that particular trigger menu item. This means that the counter
 * values will be an upper bound.
 * The real count and rate of particular triggers should always be taken by actually
 * counting the trigger decision result.
 */
class AliHLTGlobalTriggerDecision : public AliHLTTriggerDecision
{
 public:
  
  /**
   * Default constructor.
   */
  AliHLTGlobalTriggerDecision();
  
  /**
   * Constructor specifying multiple information fields.
   * \param result  The result of the global trigger decision.
   * \param triggerDomain  The trigger domain for the global trigger decision.
   * \param description  The description of (reason for) the global trigger decision.
   */
  AliHLTGlobalTriggerDecision(
      bool result, const AliHLTTriggerDomain& triggerDomain,
      const char* description = ""
    );
  
  /**
   * Default destructor.
   */
  virtual ~AliHLTGlobalTriggerDecision();

  /**
   * Copy constructor performs a deep copy.
   */
  AliHLTGlobalTriggerDecision(const AliHLTGlobalTriggerDecision& src);

  /**
   * Assignment operator performs a deep copy.
   */
  AliHLTGlobalTriggerDecision& operator=(const AliHLTGlobalTriggerDecision& src);

  /**
   * Inherited from TObject, this prints the contents of the trigger decision.
   * \param option  Can be "short" which will print the short format or "counters"
   *    which will print only the counters or "compact" which will print only the
   *    global information but not the lists of input objects.
   */
  virtual void Print(Option_t* option = "") const;

  /**
   * Inherited from TObject. Copy this to the specified object.
   */
  virtual void Copy(TObject &object) const;
  
  /**
   * Inherited from TObject. Create a new clone.
   */
  virtual TObject *Clone(const char *newname="") const;

  /**
   * Returns the number of trigger inputs that contributed to this global trigger decision.
   */
  Int_t NumberOfTriggerInputs() const { return fContributingTriggers.GetEntriesFast(); }
  
  /**
   * Returns the i'th trigger input object in fContributingTriggers.
   */
  const AliHLTTriggerDecision* TriggerInput(Int_t i) const
  {
    return static_cast<const AliHLTTriggerDecision*>( fContributingTriggers[i] );
  }
  
  /**
   * Returns the list of trigger inputs used when making the global HLT trigger decision.
   */
  const TClonesArray& TriggerInputs() const { return fContributingTriggers; }
  
  /**
   * Adds a trigger input to the list of triggers that were considered when making
   * this global trigger decision.
   * \param decision  The trigger decision object to add.
   */
  void AddTriggerInput(const AliHLTTriggerDecision& decision)
  {
    new (fContributingTriggers[fContributingTriggers.GetEntriesFast()]) AliHLTTriggerDecision(decision);
  }
  
  /**
   * Returns the number of other input objects that contributed to this global trigger decision.
   */
  Int_t NumberOfInputObjects() const { return fInputObjects.GetEntriesFast(); }
  
  /**
   * Returns the i'th input object in fInputObjects.
   */
  const TObject* InputObject(Int_t i) const { return fInputObjects[i]; }
  
  /**
   * Returns the list of other input objects used when making the global HLT trigger decision.
   */
  const TObjArray& InputObjects() const { return fInputObjects; }
  
  /**
   * Adds an input object to the list of input objects that were considered when
   * making this global trigger decision.
   * \param object  The input object to add.
   * \note  A copy of the object is made with TObject::Clone() and added.
   */
  void AddInputObject(const TObject* object);
  
  /**
   * Adds an input object to the list of input objects that were considered when
   * making this global trigger decision.
   * \param object  The input object to add.
   * \param own  If true then the global trigger decision takes ownership of the
   *   object and will delete it when destroyed. The caller must not delete the
   *   object after this method call. The default is false (ownership is not taken).
   * \note Unlike AddInputObject, the object pointer is added directly without creating
   *   a deep copy of the object. This means that the added object can only be deleted
   *   after this global trigger object is no longer using the object, unless <i>own</i>
   *   is true. If <i>own</i> is true then the object must not be deleted by the caller.
   * \note The kCanDelete bit of the object is modified by this method call and is
   *   used to track who the object belongs to. This bit should not be modified for
   *   the object after a call to this method, until the decision object is cleared
   *   or destroyed.
   */
  void AddInputObjectRef(TObject* object, bool own = false);
  
  /**
   * Sets the counter array.
   * If the number of events is specified, an additional counter is added at the end
   * and filled with <i>eventCount</i> which indicates the number of events that have been counted.
   * \param  counters  The array of new counter values that the internal counters should be set to.
   * \param  eventCount  This should be the total number of events processed. If it is
   *     a positive number >= 0 then the extra counter is added to the array and filled
   *     with the value of <i>eventCount</i>.
   */
  void SetCounters(const TArrayL64& counters, Long64_t eventCount = -1);
  
  /**
   * Returns the event trigger counters associated with the global trigger classes.
   * There is one counter for every trigger menu item that the global trigger component
   * was configured with. Thus the first counter will correspond to the first menu item
   * added to the trigger menu, the second counter for the second item added and so on.
   * If the total number of events processed counter is pressent it will be at the
   * end of the array in position N-1 where N is the number of items in the counter
   * array (also this will correspond to N-1 trigger menu items in the global trigger menu).
   *
   * \note The counters do not necessarily correspond to the actual number of trigger
   * that are recorded in the HLT output data stream. For most simple trigger menu
   * configurations the counters will indeed correspond the the actual number of triggers
   * recorded. But for more complex menus which use prescalar values this may not be
   * the case. The reason is that the counters array returned is the internal counter
   * values (state) of the global trigger component. The counters are used to make the
   * prescalars work. Thus every time a corresponding trigger condition matches
   * (evaluates to true) the counter is incremented, but the trigger decision might
   * anyhow skip the corresponding trigger in the menu since the prescalar is downscaling
   * the trigger rate for that particular trigger menu item.
   */
  const TArrayL64& Counters() const { return fCounters; }
  
  /**
   * This method removes clears the trigger domain, sets the decision result to false
   * and clears the input object arrays and counters.
   * \param  option  This is passed onto the internal array clear methods.
   * The method is inherited from TObject.
   */
  virtual void Clear(Option_t* option = "C");
  
  /**
   * Finds a named input object from the list of contributing triggers and other input objects.
   * i.e. Both the arrays returned by TriggerInputs() and InputObjects() will be searched,
   * but the contributing triggers will be searched first.
   * \param  name  The name of the object to match as returned by the objects GetName() method.
   * \returns a pointer to the object found or NULL if none was found.
   * The method is inherited from TObject.
   */
  virtual /*const*/ TObject* FindObject(const char* name) const;
  
  /**
   * Finds a matching object from the list of contributing triggers and other input objects
   * by comparing the given object to objects in the lists with the IsEqual() method.
   * i.e. Both the arrays returned by TriggerInputs() and InputObjects() will be searched,
   * but the contributing triggers will be searched first.
   * \param  obj  The object to match to with the IsEqual() method.
   * \returns a pointer to the object found or NULL if none was found.
   * The method is inherited from TObject.
   */
  virtual /*const*/ TObject* FindObject(const TObject* obj) const;
  
  /**
   * This method is called in the streamer to mark the entries in
   * fInputObjects as owned and deletable.  MUST be public for
   * streamer evolution to work.
   */
  void MarkInputObjectsAsOwned();
 private:
  
  /**
   * Deletes all the input objects in fInputObjects that are marked with kCanDelete
   * and empties the whole array.
   */
  void DeleteInputObjects();
  
  
  TClonesArray fContributingTriggers;  /// The list of contributing trigger decisions from all AliHLTTrigger components that were considered.
  TObjArray fInputObjects;  /// The list of other input objects.
  TArrayL64 fCounters;  /// Event trigger counters. One counter for each trigger class in the global trigger.
  
  ClassDef(AliHLTGlobalTriggerDecision, 1) // Contains the HLT global trigger decision and information contributing to the decision.
};

#endif // ALIHLTGLOBALTRIGGERDECISION_H

 AliHLTGlobalTriggerDecision.h:1
 AliHLTGlobalTriggerDecision.h:2
 AliHLTGlobalTriggerDecision.h:3
 AliHLTGlobalTriggerDecision.h:4
 AliHLTGlobalTriggerDecision.h:5
 AliHLTGlobalTriggerDecision.h:6
 AliHLTGlobalTriggerDecision.h:7
 AliHLTGlobalTriggerDecision.h:8
 AliHLTGlobalTriggerDecision.h:9
 AliHLTGlobalTriggerDecision.h:10
 AliHLTGlobalTriggerDecision.h:11
 AliHLTGlobalTriggerDecision.h:12
 AliHLTGlobalTriggerDecision.h:13
 AliHLTGlobalTriggerDecision.h:14
 AliHLTGlobalTriggerDecision.h:15
 AliHLTGlobalTriggerDecision.h:16
 AliHLTGlobalTriggerDecision.h:17
 AliHLTGlobalTriggerDecision.h:18
 AliHLTGlobalTriggerDecision.h:19
 AliHLTGlobalTriggerDecision.h:20
 AliHLTGlobalTriggerDecision.h:21
 AliHLTGlobalTriggerDecision.h:22
 AliHLTGlobalTriggerDecision.h:23
 AliHLTGlobalTriggerDecision.h:24
 AliHLTGlobalTriggerDecision.h:25
 AliHLTGlobalTriggerDecision.h:26
 AliHLTGlobalTriggerDecision.h:27
 AliHLTGlobalTriggerDecision.h:28
 AliHLTGlobalTriggerDecision.h:29
 AliHLTGlobalTriggerDecision.h:30
 AliHLTGlobalTriggerDecision.h:31
 AliHLTGlobalTriggerDecision.h:32
 AliHLTGlobalTriggerDecision.h:33
 AliHLTGlobalTriggerDecision.h:34
 AliHLTGlobalTriggerDecision.h:35
 AliHLTGlobalTriggerDecision.h:36
 AliHLTGlobalTriggerDecision.h:37
 AliHLTGlobalTriggerDecision.h:38
 AliHLTGlobalTriggerDecision.h:39
 AliHLTGlobalTriggerDecision.h:40
 AliHLTGlobalTriggerDecision.h:41
 AliHLTGlobalTriggerDecision.h:42
 AliHLTGlobalTriggerDecision.h:43
 AliHLTGlobalTriggerDecision.h:44
 AliHLTGlobalTriggerDecision.h:45
 AliHLTGlobalTriggerDecision.h:46
 AliHLTGlobalTriggerDecision.h:47
 AliHLTGlobalTriggerDecision.h:48
 AliHLTGlobalTriggerDecision.h:49
 AliHLTGlobalTriggerDecision.h:50
 AliHLTGlobalTriggerDecision.h:51
 AliHLTGlobalTriggerDecision.h:52
 AliHLTGlobalTriggerDecision.h:53
 AliHLTGlobalTriggerDecision.h:54
 AliHLTGlobalTriggerDecision.h:55
 AliHLTGlobalTriggerDecision.h:56
 AliHLTGlobalTriggerDecision.h:57
 AliHLTGlobalTriggerDecision.h:58
 AliHLTGlobalTriggerDecision.h:59
 AliHLTGlobalTriggerDecision.h:60
 AliHLTGlobalTriggerDecision.h:61
 AliHLTGlobalTriggerDecision.h:62
 AliHLTGlobalTriggerDecision.h:63
 AliHLTGlobalTriggerDecision.h:64
 AliHLTGlobalTriggerDecision.h:65
 AliHLTGlobalTriggerDecision.h:66
 AliHLTGlobalTriggerDecision.h:67
 AliHLTGlobalTriggerDecision.h:68
 AliHLTGlobalTriggerDecision.h:69
 AliHLTGlobalTriggerDecision.h:70
 AliHLTGlobalTriggerDecision.h:71
 AliHLTGlobalTriggerDecision.h:72
 AliHLTGlobalTriggerDecision.h:73
 AliHLTGlobalTriggerDecision.h:74
 AliHLTGlobalTriggerDecision.h:75
 AliHLTGlobalTriggerDecision.h:76
 AliHLTGlobalTriggerDecision.h:77
 AliHLTGlobalTriggerDecision.h:78
 AliHLTGlobalTriggerDecision.h:79
 AliHLTGlobalTriggerDecision.h:80
 AliHLTGlobalTriggerDecision.h:81
 AliHLTGlobalTriggerDecision.h:82
 AliHLTGlobalTriggerDecision.h:83
 AliHLTGlobalTriggerDecision.h:84
 AliHLTGlobalTriggerDecision.h:85
 AliHLTGlobalTriggerDecision.h:86
 AliHLTGlobalTriggerDecision.h:87
 AliHLTGlobalTriggerDecision.h:88
 AliHLTGlobalTriggerDecision.h:89
 AliHLTGlobalTriggerDecision.h:90
 AliHLTGlobalTriggerDecision.h:91
 AliHLTGlobalTriggerDecision.h:92
 AliHLTGlobalTriggerDecision.h:93
 AliHLTGlobalTriggerDecision.h:94
 AliHLTGlobalTriggerDecision.h:95
 AliHLTGlobalTriggerDecision.h:96
 AliHLTGlobalTriggerDecision.h:97
 AliHLTGlobalTriggerDecision.h:98
 AliHLTGlobalTriggerDecision.h:99
 AliHLTGlobalTriggerDecision.h:100
 AliHLTGlobalTriggerDecision.h:101
 AliHLTGlobalTriggerDecision.h:102
 AliHLTGlobalTriggerDecision.h:103
 AliHLTGlobalTriggerDecision.h:104
 AliHLTGlobalTriggerDecision.h:105
 AliHLTGlobalTriggerDecision.h:106
 AliHLTGlobalTriggerDecision.h:107
 AliHLTGlobalTriggerDecision.h:108
 AliHLTGlobalTriggerDecision.h:109
 AliHLTGlobalTriggerDecision.h:110
 AliHLTGlobalTriggerDecision.h:111
 AliHLTGlobalTriggerDecision.h:112
 AliHLTGlobalTriggerDecision.h:113
 AliHLTGlobalTriggerDecision.h:114
 AliHLTGlobalTriggerDecision.h:115
 AliHLTGlobalTriggerDecision.h:116
 AliHLTGlobalTriggerDecision.h:117
 AliHLTGlobalTriggerDecision.h:118
 AliHLTGlobalTriggerDecision.h:119
 AliHLTGlobalTriggerDecision.h:120
 AliHLTGlobalTriggerDecision.h:121
 AliHLTGlobalTriggerDecision.h:122
 AliHLTGlobalTriggerDecision.h:123
 AliHLTGlobalTriggerDecision.h:124
 AliHLTGlobalTriggerDecision.h:125
 AliHLTGlobalTriggerDecision.h:126
 AliHLTGlobalTriggerDecision.h:127
 AliHLTGlobalTriggerDecision.h:128
 AliHLTGlobalTriggerDecision.h:129
 AliHLTGlobalTriggerDecision.h:130
 AliHLTGlobalTriggerDecision.h:131
 AliHLTGlobalTriggerDecision.h:132
 AliHLTGlobalTriggerDecision.h:133
 AliHLTGlobalTriggerDecision.h:134
 AliHLTGlobalTriggerDecision.h:135
 AliHLTGlobalTriggerDecision.h:136
 AliHLTGlobalTriggerDecision.h:137
 AliHLTGlobalTriggerDecision.h:138
 AliHLTGlobalTriggerDecision.h:139
 AliHLTGlobalTriggerDecision.h:140
 AliHLTGlobalTriggerDecision.h:141
 AliHLTGlobalTriggerDecision.h:142
 AliHLTGlobalTriggerDecision.h:143
 AliHLTGlobalTriggerDecision.h:144
 AliHLTGlobalTriggerDecision.h:145
 AliHLTGlobalTriggerDecision.h:146
 AliHLTGlobalTriggerDecision.h:147
 AliHLTGlobalTriggerDecision.h:148
 AliHLTGlobalTriggerDecision.h:149
 AliHLTGlobalTriggerDecision.h:150
 AliHLTGlobalTriggerDecision.h:151
 AliHLTGlobalTriggerDecision.h:152
 AliHLTGlobalTriggerDecision.h:153
 AliHLTGlobalTriggerDecision.h:154
 AliHLTGlobalTriggerDecision.h:155
 AliHLTGlobalTriggerDecision.h:156
 AliHLTGlobalTriggerDecision.h:157
 AliHLTGlobalTriggerDecision.h:158
 AliHLTGlobalTriggerDecision.h:159
 AliHLTGlobalTriggerDecision.h:160
 AliHLTGlobalTriggerDecision.h:161
 AliHLTGlobalTriggerDecision.h:162
 AliHLTGlobalTriggerDecision.h:163
 AliHLTGlobalTriggerDecision.h:164
 AliHLTGlobalTriggerDecision.h:165
 AliHLTGlobalTriggerDecision.h:166
 AliHLTGlobalTriggerDecision.h:167
 AliHLTGlobalTriggerDecision.h:168
 AliHLTGlobalTriggerDecision.h:169
 AliHLTGlobalTriggerDecision.h:170
 AliHLTGlobalTriggerDecision.h:171
 AliHLTGlobalTriggerDecision.h:172
 AliHLTGlobalTriggerDecision.h:173
 AliHLTGlobalTriggerDecision.h:174
 AliHLTGlobalTriggerDecision.h:175
 AliHLTGlobalTriggerDecision.h:176
 AliHLTGlobalTriggerDecision.h:177
 AliHLTGlobalTriggerDecision.h:178
 AliHLTGlobalTriggerDecision.h:179
 AliHLTGlobalTriggerDecision.h:180
 AliHLTGlobalTriggerDecision.h:181
 AliHLTGlobalTriggerDecision.h:182
 AliHLTGlobalTriggerDecision.h:183
 AliHLTGlobalTriggerDecision.h:184
 AliHLTGlobalTriggerDecision.h:185
 AliHLTGlobalTriggerDecision.h:186
 AliHLTGlobalTriggerDecision.h:187
 AliHLTGlobalTriggerDecision.h:188
 AliHLTGlobalTriggerDecision.h:189
 AliHLTGlobalTriggerDecision.h:190
 AliHLTGlobalTriggerDecision.h:191
 AliHLTGlobalTriggerDecision.h:192
 AliHLTGlobalTriggerDecision.h:193
 AliHLTGlobalTriggerDecision.h:194
 AliHLTGlobalTriggerDecision.h:195
 AliHLTGlobalTriggerDecision.h:196
 AliHLTGlobalTriggerDecision.h:197
 AliHLTGlobalTriggerDecision.h:198
 AliHLTGlobalTriggerDecision.h:199
 AliHLTGlobalTriggerDecision.h:200
 AliHLTGlobalTriggerDecision.h:201
 AliHLTGlobalTriggerDecision.h:202
 AliHLTGlobalTriggerDecision.h:203
 AliHLTGlobalTriggerDecision.h:204
 AliHLTGlobalTriggerDecision.h:205
 AliHLTGlobalTriggerDecision.h:206
 AliHLTGlobalTriggerDecision.h:207
 AliHLTGlobalTriggerDecision.h:208
 AliHLTGlobalTriggerDecision.h:209
 AliHLTGlobalTriggerDecision.h:210
 AliHLTGlobalTriggerDecision.h:211
 AliHLTGlobalTriggerDecision.h:212
 AliHLTGlobalTriggerDecision.h:213
 AliHLTGlobalTriggerDecision.h:214
 AliHLTGlobalTriggerDecision.h:215
 AliHLTGlobalTriggerDecision.h:216
 AliHLTGlobalTriggerDecision.h:217
 AliHLTGlobalTriggerDecision.h:218
 AliHLTGlobalTriggerDecision.h:219
 AliHLTGlobalTriggerDecision.h:220
 AliHLTGlobalTriggerDecision.h:221
 AliHLTGlobalTriggerDecision.h:222
 AliHLTGlobalTriggerDecision.h:223
 AliHLTGlobalTriggerDecision.h:224
 AliHLTGlobalTriggerDecision.h:225
 AliHLTGlobalTriggerDecision.h:226
 AliHLTGlobalTriggerDecision.h:227
 AliHLTGlobalTriggerDecision.h:228
 AliHLTGlobalTriggerDecision.h:229
 AliHLTGlobalTriggerDecision.h:230
 AliHLTGlobalTriggerDecision.h:231
 AliHLTGlobalTriggerDecision.h:232
 AliHLTGlobalTriggerDecision.h:233
 AliHLTGlobalTriggerDecision.h:234
 AliHLTGlobalTriggerDecision.h:235
 AliHLTGlobalTriggerDecision.h:236
 AliHLTGlobalTriggerDecision.h:237
 AliHLTGlobalTriggerDecision.h:238
 AliHLTGlobalTriggerDecision.h:239
 AliHLTGlobalTriggerDecision.h:240
 AliHLTGlobalTriggerDecision.h:241
 AliHLTGlobalTriggerDecision.h:242
 AliHLTGlobalTriggerDecision.h:243
 AliHLTGlobalTriggerDecision.h:244
 AliHLTGlobalTriggerDecision.h:245
 AliHLTGlobalTriggerDecision.h:246
 AliHLTGlobalTriggerDecision.h:247
 AliHLTGlobalTriggerDecision.h:248
 AliHLTGlobalTriggerDecision.h:249
 AliHLTGlobalTriggerDecision.h:250
 AliHLTGlobalTriggerDecision.h:251
 AliHLTGlobalTriggerDecision.h:252
 AliHLTGlobalTriggerDecision.h:253
 AliHLTGlobalTriggerDecision.h:254
 AliHLTGlobalTriggerDecision.h:255
 AliHLTGlobalTriggerDecision.h:256
 AliHLTGlobalTriggerDecision.h:257
 AliHLTGlobalTriggerDecision.h:258
 AliHLTGlobalTriggerDecision.h:259
 AliHLTGlobalTriggerDecision.h:260
 AliHLTGlobalTriggerDecision.h:261
 AliHLTGlobalTriggerDecision.h:262
 AliHLTGlobalTriggerDecision.h:263
 AliHLTGlobalTriggerDecision.h:264
 AliHLTGlobalTriggerDecision.h:265
 AliHLTGlobalTriggerDecision.h:266