ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTTRIGGERMENUITEM_H
#define ALIHLTTRIGGERMENUITEM_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   AliHLTTriggerMenuItem.h
/// @author Artur Szostak <artursz@iafrica.com>
/// @date   19 Dec 2008
/// @brief  Declaration of the AliHLTTriggerMenuItem class.

#include "TObject.h"
#include "TString.h"
#include "TArrayL.h"

/**
 * \class AliHLTTriggerMenuItem
 * A trigger menu item is used to store the information for a single entry in the
 * HLT global trigger menu AliHLTTriggerMenu.
 * It stores information about the trigger condition, trigger domain merging
 * expression, trigger priority, trigger scale-down and the prescalar to apply.
 * The trigger condition is an expression which indicates what must be true
 * for the trigger menu entry to be fired. A fired item will then use the trigger
 * domain merging expression for the computation of the final global trigger domain.
 * All expressions must be valid C++.
 *
 * The symbols used in the trigger condition expressions are assumed to be AliHLTTrigger
 * names, unless they are predefined in the trigger menu symbols table. All symbols
 * should be valid C++ symbol names. However, the '-' and '.' characters are allowed
 * as a special extention. Neither the '-', nor '.' characters can be the first
 * character of the symbol and there cannot be any spaces between it and the
 * alphanumeric characters. If there are any spaces then the '-' or '.' character is
 * treated as the normal C++ minus or dereferencing operator respectively.
 * For example, "abc-xyz" is a single whole symbol, while "abc - xyz" are two symbols,
 * abc and xyz, separated by a minus operator.
 *
 * Merging expressions can use all the symbols defined in the trigger menu symbols table
 * including all the implicit symbols used in the trigger conditions which are assumed
 * to be AliHLTTrigger names. If a AliHLTTrigger name is not used in a trigger condition
 * expression, but one wants to use the trigger domain in a merging expression, then a
 * predefined symbol must be added to the trigger menu symbol table. As an example, in
 * the following manner:
 * \code
 * AliHLTGlobalTriggerConfig config("test config");
 * config.AddSymbol("myTriggerName", "bool", "this->Result()", "0", "AliHLTTriggerDecision");
 * \endcode
 * The trigger name "myTriggerName" should be replaced with the actual name of the
 * AliHLTTrigger from which one wants to use the trigger domain result.
 * Symbols with the '-' sign are be handled automatically and will be replaced
 * by their appropriate versions with the minus signs replaced by underscores.
 * This means that a minus sign in any other location is always treated as an operator.
 * If uncertain then just put spaces around the minus operator.
 *
 * \note The following symbol names are reserved and should not be used in either
 * the trigger condition or merging expressions:
 *   _trigger_result_
 *   _domain_
 *   _description_
 *   _item_result_
 *   _group_result_
 *   _previous_match_
 *   _trigger_matched_
 *   FillFromMenu
 *   NewEvent
 *   Add
 *   CalculateTriggerDecision
 *   GetCounters
 *   SetCounters
 *   CreateNew
 */
class AliHLTTriggerMenuItem : public TObject
{
 public:
  
  /**
   * Default constructor.
   */
  AliHLTTriggerMenuItem();
  
  /**
   * Default destructor.
   */
  virtual ~AliHLTTriggerMenuItem();
  
  /**
   * Inherited from TObject, this prints the contents of the menu item.
   * \param option  Can be "compact", which will print in the compact format.
   */
  virtual void Print(Option_t* option = "") const;
  
  /**
   * Returns the optional comment string.
   */
  const char* Description() const { return fDescription.Data(); }
  
  /**
   * Set the optional comment string.
   */
  void Description(const char* value) { fDescription = value; }
  
  /**
   * Returns the trigger condition expression.
   */
  const char* TriggerCondition() const { return fConditionExpr.Data(); }
  
  /**
   * Set the trigger condition expression.
   */
  void TriggerCondition(const char* value) { fConditionExpr = value; }
  
  /**
   * Returns the trigger domain merging expression.
   */
  const char* MergeExpression() const { return fDomainExpr.Data(); }
  
  /**
   * Set the trigger domain merging expression.
   */
  void MergeExpression(const char* value) { fDomainExpr = value; }
  
  /**
   * Returns the pre-scalar value.
   */
  UInt_t PreScalar() const { return fPrescalar; }
  
  /**
   * Set the pre-scalar value. A value of zero turns off the prescalar.
   * \param value Indicates that only every n'th trigger should be passed.
   *     HLT triggers will be scaled down by the amount 1/value.
   * \note If both the prescalar and the scale-down factors are set then the
   *     trigger rate reduction r will be higher and can be calculated by:
   *        r = 1/n * s
   *     where n is the prescalar value (an integer) and s is the scale down
   *     factor, which is a floating point number in the range [0..1].
   */
  void PreScalar(UInt_t value) { fPrescalar = value; }
  
  /**
   * Returns the priority value.
   */
  UInt_t Priority() const { return fPriority; }
  
  /**
   * Set the priority value. Higher values give a higher priority.
   */
  void Priority(UInt_t value) { fPriority = value; }
  
  /**
   * Returns the scale down factor in the range [0..1].
   */
  Double_t ScaleDown() const { return fScaleDown; }
  
  /**
   * Set the scale down factor.
   * \param value The scale down to set. Valid values are in the range [0..1].
   *     If <i>value</i> is outside the valid range it will be truncated the
   *     nearest valid value in the range.
   * \note A scale-down of 0 indicates no triggers are passes through, 1 indicates
   *     all triggers are passed through and all values between this range will
   *     cause the triggers to be vetoed randomally so as to reproduce:
   *       triggers passed / triggers dropped = scale-down
   */
  void ScaleDown(Double_t value) { fScaleDown = (value < 0 ? 0 : (value > 1 ? 1 : value)); }
  
  /**
   * Returns the default result for the global trigger if this item is matched.
   */
  bool DefaultResult() const { return TestBit(BIT(15)) == 1; }
  
  /**
   * Set the default result for the global trigger if this item is matched.
   */
  void DefaultResult(bool value) { SetBit(BIT(15), value); }

 private:
  
  TString fDescription;  /// Optional description or comment string.
  TString fConditionExpr;  /// The trigger condition expression.
  TString fDomainExpr;  /// Trigger domain merging expression.
  UInt_t fPrescalar;  /// Pre-scalar value used to optionally reduce the trigger rate. Every modulus n'th event is triggered, where n equals the pre-scalar value.
  UInt_t fPriority;  /// Priority of the trigger menu item. Higher values have higher priority.
  Double_t fScaleDown;  /// Trigger scale-down factor to apply to this item. Valid values are in the range [0..1].
  
  ClassDef(AliHLTTriggerMenuItem, 4) // Trigger menu item for global HLT trigger.
};

#endif // ALIHLTTRIGGERMENUITEM_H

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