ROOT logo
//-*- Mode: C++ -*-
// $Id$

#ifndef ALIHLTCTPDATA_H
#define ALIHLTCTPDATA_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   AliHLTCTPData.h
    @author Matthias Richter
    @date   2009-08-20
    @brief  Container for CTP trigger classes and counters
*/

#include "TNamed.h"
#include "TClonesArray.h"
#include "TArrayL64.h"
#include "AliHLTLogging.h"
#include "AliHLTDataTypes.h"
#include "AliHLTReadoutList.h"
#include <string>

/**
 * @class AliHLTCTPData
 * This is a container for the CTP trigger classes, the mapping to the bit
 * field, and counters.
 *
 * The class is initialized from CTP_TRIGGER_CLASSES part of the ECS parameters.
 * and stores internally a list of trigger classes holding the information on bit
 * position, class name and involved detectors. The general format og the parameter
 * is as follows:
 * <pre>
 * [bit position]:[Trigger class identifier string]:[detector-id-nr]-[detector-id-nr]-...,[bit position]:.....
 * </pre>
 *
 * The list of participating detectors is converted into an AliHLTReadoutList
 * object named after the trigger class name, and can be used as mask for the
 * readout list generated by a component.
 *
 * The object is also stored as part of the HLTGlobalTriggerDecision
 * @ingroup alihlt_trigger
 */
class AliHLTCTPData: public TNamed, public AliHLTLogging
{
 public:
  /// default constructor
  AliHLTCTPData();
  /// standard constructor including initialization from CTP_TRIGGER_CLASS
  AliHLTCTPData(const char* parameter);
  /// copy constructor
  AliHLTCTPData(const AliHLTCTPData&);
  ///assignment operator
  AliHLTCTPData& operator=(const AliHLTCTPData&);
  /// destructor
  virtual ~AliHLTCTPData();

  /// Add counters
  AliHLTCTPData& operator += (const AliHLTCTPData&);
  /// Add counters
  AliHLTCTPData operator + (const AliHLTCTPData&) const;

  /// Subtract counters
  AliHLTCTPData& operator -= (const AliHLTCTPData&);
  /// Subtract counters
  AliHLTCTPData operator - (const AliHLTCTPData&) const;

  /**
   * Init the class ids and mapping from the CTP_TRIGGER_CLASS parameter.
   * The general format of the parameter is as follows:
   */
  int InitCTPTriggerClasses(const char* ctpString);

  /// etract the active trigger mask from the trigger data
  static AliHLTTriggerMask_t ActiveTriggers(const AliHLTComponentTriggerData& trigData);

  /**
   * Evaluate an expression of trigger class ids with respect to the trigger mask.
   */
  bool EvaluateCTPTriggerClass(const char* expression, const AliHLTComponentTriggerData& trigData) const;

  /**
   * Evaluate an expression of trigger class ids with respect to the trigger mask.
   */
  bool EvaluateCTPTriggerClass(const char* expression, AliHLTTriggerMask_t triggerMask) const;

  /**
   * Evaluate an expression of trigger class ids with respect to the current trigger mask.
   */
  bool EvaluateCTPTriggerClass(const char* expression) const {
    return EvaluateCTPTriggerClass(expression, fTriggers);
  }

  /**
   * Reset all counters
   */
  void ResetCounters();

  /**
   * Get index of a trigger class in the tigger pattern
   */
  int Index(const char* name) const;

  /**
   * Check state of a trigger class.
   * If the class name is not part of the current trigger setup (i.e. ECS parameter
   * does not contain a trigger definition for this class name) the function
   * returns -1
   * @return -1 class name not initialized, 
   *          0 trigger not active
   *          1 trigger active
   */
  int CheckTrigger(const char* name) const;

  /**
   * Increment counter for CTP trigger classes
   * @param classIds  comma separated list of class ids
   */
  void Increment(const char* classIds);

  /**
   * Increment counter for CTP trigger classes
   * @param triggerPattern  corresponds to the 100bit trigger mask in the CDH
   */
  void Increment(AliHLTTriggerMask_t triggerPattern);

  /**
   * Increment counter for a CTP trigger class
   * @param classIdx  index of the class in the 100bit trigger mask
   */
  void Increment(int classIdx);

  /**
   * Increment counters according to the trigger data struct.
   * First extract trigger pattern from the CDH and then
   * increment from the trigger pattern.
   */
  int Increment(AliHLTComponentTriggerData& trigData);

  /**
   * Return a readout list for the active trigger classes.
   * The list is an 'OR' of the active trugger classes.
   */
  AliHLTReadoutList ReadoutList(const AliHLTComponentTriggerData& trigData) const;

  /**
   * Return a readout list for the active trigger classes.
   * The list is an 'OR' of the active trugger classes.
   */
  AliHLTReadoutList ReadoutList(AliHLTTriggerMask_t triggerMask) const;

  /**
   * Return a readout list for the active trigger classes.
   * The list is an 'OR' of the active trugger classes.
   */
  AliHLTReadoutList ReadoutList() const {
    return ReadoutList(fTriggers);
  }

  /**
   * Inherited from TObject, this prints the contents of the trigger decision.
   */
  virtual void Print(Option_t* option = "") const;

  AliHLTTriggerMask_t   Mask() const { return fMask; }
  AliHLTTriggerMask_t   Triggers() const { return fTriggers; }
  void                  SetTriggers(AliHLTTriggerMask_t triggers) { fTriggers=triggers; }
  void                  SetTriggers(AliHLTComponentTriggerData trigData) {SetTriggers(ActiveTriggers(trigData));}
  const TArrayL64&      Counters() const { return fCounters; }
  AliHLTUInt64_t        Counter(int index) const;
  AliHLTUInt64_t        Counter(const char* classId) const;
  const char*           Name(int index) const;

 protected:
 private:
  /// Helper                                                                          
  std::string TriggerMaskToString(AliHLTTriggerMask_t mask) const;

  /**
   * Add counters.
   * Base methods for operators.
   * @param src    instance to add
   * @param factor +1/-1 for addition/subtraction
   * @skipped      target to get the numner of not matching class names
   */
  int Add(const AliHLTCTPData& src, int factor, int &skipped);

  /**
   * Read the map of trigger class indexes
   * The map is used in the generation of the TFormula from the trigger
   * expression in order to handle similar class names correctly.
   * For names like 'base', 'baseA', 'baseB' the class with the longer name
   * has to be replaced first.
   */
  int ReadMap(vector<unsigned> &map) const;

  int ReadMap() {return ReadMap(fMap);}

  AliHLTTriggerMask_t fMask;      /// mask of initialized trigger classes
  AliHLTTriggerMask_t fTriggers;  /// current trigger
  TClonesArray        fClassIds;  /// array of trigger class ids
  TArrayL64           fCounters;  /// trigger class counters
  vector<unsigned>    fMap;     //! index map for trigger expression evaluation

  ClassDef(AliHLTCTPData, 3)
};

#endif
 AliHLTCTPData.h:1
 AliHLTCTPData.h:2
 AliHLTCTPData.h:3
 AliHLTCTPData.h:4
 AliHLTCTPData.h:5
 AliHLTCTPData.h:6
 AliHLTCTPData.h:7
 AliHLTCTPData.h:8
 AliHLTCTPData.h:9
 AliHLTCTPData.h:10
 AliHLTCTPData.h:11
 AliHLTCTPData.h:12
 AliHLTCTPData.h:13
 AliHLTCTPData.h:14
 AliHLTCTPData.h:15
 AliHLTCTPData.h:16
 AliHLTCTPData.h:17
 AliHLTCTPData.h:18
 AliHLTCTPData.h:19
 AliHLTCTPData.h:20
 AliHLTCTPData.h:21
 AliHLTCTPData.h:22
 AliHLTCTPData.h:23
 AliHLTCTPData.h:24
 AliHLTCTPData.h:25
 AliHLTCTPData.h:26
 AliHLTCTPData.h:27
 AliHLTCTPData.h:28
 AliHLTCTPData.h:29
 AliHLTCTPData.h:30
 AliHLTCTPData.h:31
 AliHLTCTPData.h:32
 AliHLTCTPData.h:33
 AliHLTCTPData.h:34
 AliHLTCTPData.h:35
 AliHLTCTPData.h:36
 AliHLTCTPData.h:37
 AliHLTCTPData.h:38
 AliHLTCTPData.h:39
 AliHLTCTPData.h:40
 AliHLTCTPData.h:41
 AliHLTCTPData.h:42
 AliHLTCTPData.h:43
 AliHLTCTPData.h:44
 AliHLTCTPData.h:45
 AliHLTCTPData.h:46
 AliHLTCTPData.h:47
 AliHLTCTPData.h:48
 AliHLTCTPData.h:49
 AliHLTCTPData.h:50
 AliHLTCTPData.h:51
 AliHLTCTPData.h:52
 AliHLTCTPData.h:53
 AliHLTCTPData.h:54
 AliHLTCTPData.h:55
 AliHLTCTPData.h:56
 AliHLTCTPData.h:57
 AliHLTCTPData.h:58
 AliHLTCTPData.h:59
 AliHLTCTPData.h:60
 AliHLTCTPData.h:61
 AliHLTCTPData.h:62
 AliHLTCTPData.h:63
 AliHLTCTPData.h:64
 AliHLTCTPData.h:65
 AliHLTCTPData.h:66
 AliHLTCTPData.h:67
 AliHLTCTPData.h:68
 AliHLTCTPData.h:69
 AliHLTCTPData.h:70
 AliHLTCTPData.h:71
 AliHLTCTPData.h:72
 AliHLTCTPData.h:73
 AliHLTCTPData.h:74
 AliHLTCTPData.h:75
 AliHLTCTPData.h:76
 AliHLTCTPData.h:77
 AliHLTCTPData.h:78
 AliHLTCTPData.h:79
 AliHLTCTPData.h:80
 AliHLTCTPData.h:81
 AliHLTCTPData.h:82
 AliHLTCTPData.h:83
 AliHLTCTPData.h:84
 AliHLTCTPData.h:85
 AliHLTCTPData.h:86
 AliHLTCTPData.h:87
 AliHLTCTPData.h:88
 AliHLTCTPData.h:89
 AliHLTCTPData.h:90
 AliHLTCTPData.h:91
 AliHLTCTPData.h:92
 AliHLTCTPData.h:93
 AliHLTCTPData.h:94
 AliHLTCTPData.h:95
 AliHLTCTPData.h:96
 AliHLTCTPData.h:97
 AliHLTCTPData.h:98
 AliHLTCTPData.h:99
 AliHLTCTPData.h:100
 AliHLTCTPData.h:101
 AliHLTCTPData.h:102
 AliHLTCTPData.h:103
 AliHLTCTPData.h:104
 AliHLTCTPData.h:105
 AliHLTCTPData.h:106
 AliHLTCTPData.h:107
 AliHLTCTPData.h:108
 AliHLTCTPData.h:109
 AliHLTCTPData.h:110
 AliHLTCTPData.h:111
 AliHLTCTPData.h:112
 AliHLTCTPData.h:113
 AliHLTCTPData.h:114
 AliHLTCTPData.h:115
 AliHLTCTPData.h:116
 AliHLTCTPData.h:117
 AliHLTCTPData.h:118
 AliHLTCTPData.h:119
 AliHLTCTPData.h:120
 AliHLTCTPData.h:121
 AliHLTCTPData.h:122
 AliHLTCTPData.h:123
 AliHLTCTPData.h:124
 AliHLTCTPData.h:125
 AliHLTCTPData.h:126
 AliHLTCTPData.h:127
 AliHLTCTPData.h:128
 AliHLTCTPData.h:129
 AliHLTCTPData.h:130
 AliHLTCTPData.h:131
 AliHLTCTPData.h:132
 AliHLTCTPData.h:133
 AliHLTCTPData.h:134
 AliHLTCTPData.h:135
 AliHLTCTPData.h:136
 AliHLTCTPData.h:137
 AliHLTCTPData.h:138
 AliHLTCTPData.h:139
 AliHLTCTPData.h:140
 AliHLTCTPData.h:141
 AliHLTCTPData.h:142
 AliHLTCTPData.h:143
 AliHLTCTPData.h:144
 AliHLTCTPData.h:145
 AliHLTCTPData.h:146
 AliHLTCTPData.h:147
 AliHLTCTPData.h:148
 AliHLTCTPData.h:149
 AliHLTCTPData.h:150
 AliHLTCTPData.h:151
 AliHLTCTPData.h:152
 AliHLTCTPData.h:153
 AliHLTCTPData.h:154
 AliHLTCTPData.h:155
 AliHLTCTPData.h:156
 AliHLTCTPData.h:157
 AliHLTCTPData.h:158
 AliHLTCTPData.h:159
 AliHLTCTPData.h:160
 AliHLTCTPData.h:161
 AliHLTCTPData.h:162
 AliHLTCTPData.h:163
 AliHLTCTPData.h:164
 AliHLTCTPData.h:165
 AliHLTCTPData.h:166
 AliHLTCTPData.h:167
 AliHLTCTPData.h:168
 AliHLTCTPData.h:169
 AliHLTCTPData.h:170
 AliHLTCTPData.h:171
 AliHLTCTPData.h:172
 AliHLTCTPData.h:173
 AliHLTCTPData.h:174
 AliHLTCTPData.h:175
 AliHLTCTPData.h:176
 AliHLTCTPData.h:177
 AliHLTCTPData.h:178
 AliHLTCTPData.h:179
 AliHLTCTPData.h:180
 AliHLTCTPData.h:181
 AliHLTCTPData.h:182
 AliHLTCTPData.h:183
 AliHLTCTPData.h:184
 AliHLTCTPData.h:185
 AliHLTCTPData.h:186
 AliHLTCTPData.h:187
 AliHLTCTPData.h:188
 AliHLTCTPData.h:189
 AliHLTCTPData.h:190
 AliHLTCTPData.h:191
 AliHLTCTPData.h:192
 AliHLTCTPData.h:193
 AliHLTCTPData.h:194
 AliHLTCTPData.h:195
 AliHLTCTPData.h:196
 AliHLTCTPData.h:197
 AliHLTCTPData.h:198
 AliHLTCTPData.h:199
 AliHLTCTPData.h:200
 AliHLTCTPData.h:201
 AliHLTCTPData.h:202
 AliHLTCTPData.h:203
 AliHLTCTPData.h:204
 AliHLTCTPData.h:205
 AliHLTCTPData.h:206
 AliHLTCTPData.h:207
 AliHLTCTPData.h:208