ROOT logo
// $Id$
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Artur Szostak <artursz@iafrica.com>                   *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/// @file   AliHLTTriggerMenu.cxx
/// @author Artur Szostak <artursz@iafrica.com>
/// @date   19 Dec 2008
/// @brief  Implementation of the AliHLTTriggerMenu base class.
///
/// The AliHLTTriggerMenu class implements the HLT global trigger menu,
/// which defines how and on what events the HLT triggers.

#include "AliHLTTriggerMenu.h"
#include "Riostream.h"
#include <sstream>

ClassImp(AliHLTTriggerMenu)


AliHLTTriggerMenu::AliHLTTriggerMenu() :
  TObject(),
  fName("Unknown"),
  fSymbols(AliHLTTriggerMenuSymbol::Class(), 100),
  fItems(AliHLTTriggerMenuItem::Class(), 100),
  fDefaultDescription(),
  fDefaultDomain(),
  fDefaultConditionOperator("||"),
  fDefaultDomainOperator("|")
{
  // Default constructor.
}


AliHLTTriggerMenu::~AliHLTTriggerMenu()
{
  // Default destructor.
}


AliHLTTriggerMenu::AliHLTTriggerMenu(const AliHLTTriggerMenu& obj) :
  TObject(obj),
  fName(obj.fName),
  fSymbols(AliHLTTriggerMenuSymbol::Class(), obj.fSymbols.GetEntriesFast()),
  fItems(AliHLTTriggerMenuItem::Class(), obj.fItems.GetEntriesFast()),
  fDefaultDescription(obj.fDefaultDescription),
  fDefaultDomain(obj.fDefaultDomain),
  fDefaultConditionOperator(obj.fDefaultConditionOperator),
  fDefaultDomainOperator(obj.fDefaultDomainOperator)
{
  // Copy constructor performs a deep copy.
  
  for (UInt_t i = 0; i < obj.NumberOfSymbols(); i++)
  {
    AddSymbol(*obj.Symbol(i));
  }
  for (UInt_t i = 0; i < obj.NumberOfItems(); i++)
  {
    AddItem(*obj.Item(i));
  }
}


AliHLTTriggerMenu& AliHLTTriggerMenu::operator = (const AliHLTTriggerMenu& obj)
{
  // Assignment operator performs a deep copy.
  
  if (this != &obj)
  {
    TObject::operator = (obj);
    fName = obj.fName;
    fSymbols.Clear();
    for (UInt_t i = 0; i < obj.NumberOfSymbols(); i++)
    {
      AddSymbol(*obj.Symbol(i));
    }
    fItems.Clear();
    for (UInt_t i = 0; i < obj.NumberOfItems(); i++)
    {
      AddItem(*obj.Item(i));
    }
    fDefaultDescription = obj.fDefaultDescription;
    fDefaultDomain = obj.fDefaultDomain;
    fDefaultConditionOperator = obj.fDefaultConditionOperator;
    fDefaultDomainOperator = obj.fDefaultDomainOperator;
  }
  return *this;
}


void AliHLTTriggerMenu::Print(Option_t* option) const
{
  // Prints the contents of the trigger menu.
  
  cout << "HLT Trigger Menu: " << fName.Data();
  TString opt = option;
  if (opt.Contains("short"))
  {
    cout << ", contains " << NumberOfItems() << " entries." << endl;
    return;
  }
  cout << endl;
  
  size_t prescalarColWidth = 9;
  size_t scaledownColWidth = 9;
  size_t priorityColWidth = 8;
  size_t resultColWidth = 6;
  size_t conditionColWidth = 17;
  size_t mergexprColWidth = 23;
  size_t descColWidth = 11;
  // Find out the required widths of the columns:
  for (UInt_t i = 0; i < NumberOfItems(); i++)
  {
    std::stringstream buf;
    buf.copyfmt(cout);
    buf << Item(i)->PreScalar();
    if (buf.str().length() > prescalarColWidth) prescalarColWidth = buf.str().length();
    buf.str("");
    buf << Item(i)->ScaleDown();
    if (buf.str().length()+1 > scaledownColWidth) scaledownColWidth = buf.str().length()+1;
    buf.str("");
    buf << Item(i)->Priority();
    if (buf.str().length() > priorityColWidth) priorityColWidth = buf.str().length();
    size_t len = strlen(Item(i)->TriggerCondition());
    if (len > conditionColWidth and len < 128) conditionColWidth = len;
    len = strlen(Item(i)->MergeExpression());
    if (len > mergexprColWidth and len < 128) mergexprColWidth = len;
    len = strlen(Item(i)->Description());
    if (len > descColWidth and len < 128) descColWidth = len;
  }
  cout << setw(prescalarColWidth) << "Prescalar" << " | "
       << setw(scaledownColWidth) << "Scaledown" << " | "
       << setw(priorityColWidth) << "Priority" << " | "
       << setw(resultColWidth) << "Result" << " | "
       << setw(conditionColWidth) << "Trigger condition" << " | "
       << setw(mergexprColWidth) << "Domain merge expression" << " | "
       << setw(descColWidth) << "Description" << setw(0) << endl;
  cout << setfill('-') << setw(prescalarColWidth) << "-" << "-+-"
       << setw(scaledownColWidth) << "-" << "-+-"
       << setw(priorityColWidth) << "-" << "-+-"
       << setw(resultColWidth) << "-" << "-+-"
       << setw(conditionColWidth) << "-" << "-+-"
       << setw(mergexprColWidth) << "-" << "-+-"
       << setw(descColWidth) << "-" << setw(0) << setfill(' ') << endl;
  for (UInt_t i = 0; i < NumberOfItems(); i++)
  {
    if (Item(i)->PreScalar() == 0)
      cout << setw(prescalarColWidth) << "off" << " | ";
    else
      cout << setw(prescalarColWidth) << Item(i)->PreScalar() << " | ";
    if (Item(i)->ScaleDown() == 1)
      cout << setw(scaledownColWidth) << "none" << " | ";
    else
      cout << setw(scaledownColWidth-1) << Item(i)->ScaleDown()*100 << "% | ";
    cout << setw(priorityColWidth) << Item(i)->Priority() << " | "
         << setw(resultColWidth) << (Item(i)->DefaultResult() ? "true" : "false") << " | "
         << setw(conditionColWidth) << Item(i)->TriggerCondition() << " | "
         << setw(mergexprColWidth) << Item(i)->MergeExpression() << " | "
         << setw(descColWidth) << Item(i)->Description() << setw(0) << endl;
  }
  if (NumberOfItems() == 0) cout << "(none)" << endl;
  
  cout << "Symbol list:" << endl;
  size_t nameColWidth = 4;
  size_t typeColWidth = 9;
  size_t classColWidth = 10;
  size_t assignColWidth = 14;
  size_t valueColWidth = 13;
  // Find out the required widths of the columns:
  for (UInt_t i = 0; i < NumberOfSymbols(); i++)
  {
    size_t len = strlen(Symbol(i)->RealName());
    if (len > nameColWidth and len < 128) nameColWidth = len;
    len = strlen(Symbol(i)->Type());
    if (len > typeColWidth and len < 128) typeColWidth = len;
    len = strlen(Symbol(i)->ObjectClass());
    if (len > classColWidth and len < 128) classColWidth = len;
    len = strlen(Symbol(i)->AssignExpression());
    if (len > assignColWidth and len < 128) assignColWidth = len;
    len = strlen(Symbol(i)->DefaultValue());
    if (len > valueColWidth and len < 128) valueColWidth = len;
  }
  cout << setw(nameColWidth) << "Name"
       << " | " << setw(typeColWidth) << "Data type"
       << " | " << setw(24) << "Block type & spec"
       << " | " << setw(classColWidth) << "Class name"
       << " | " << setw(assignColWidth) << "Assigned value"
       << " | " << setw(valueColWidth) << "Default value"
       << setw(0) << endl;
  cout << setw(nameColWidth) << setfill('-') << "-"
       << "-+-" << setw(typeColWidth) << "-"
       << "-+-" << setw(24) << "-"
       << "-+-" << setw(classColWidth) << "-"
       << "-+-" << setw(assignColWidth) << "-"
       << "-+-" << setw(valueColWidth) << "-"
       << setw(0) << setfill(' ') << endl;
  for (UInt_t i = 0; i < NumberOfSymbols(); i++)
  {
    cout << setw(nameColWidth) << Symbol(i)->RealName() << " | "
         << setw(typeColWidth) << Symbol(i)->Type() << " | ";
    Symbol(i)->BlockType().Print("noendl");
    cout << " | " << setw(classColWidth) << Symbol(i)->ObjectClass()
         << " | " << setw(assignColWidth) << Symbol(i)->AssignExpression()
         << " | " << setw(valueColWidth) << Symbol(i)->DefaultValue()
         << setw(0) << endl;
  }
  if (NumberOfSymbols() == 0) cout << "(none)" << endl;
  
  cout << "Default trigger condition operator: " << fDefaultConditionOperator << endl;
  cout << "   Default trigger domain operator: " << fDefaultDomainOperator << endl;
  cout << "       Default trigger description: \"" << fDefaultDescription << "\"" << endl;
  cout << "     Default global trigger result: " << (DefaultResult() ? "true" : "false") << "" << endl;
  cout << "Default "; fDefaultDomain.Print();
}


void AliHLTTriggerMenu::Clear(Option_t* option)
{
  // Clears the internal symbol and items arrays.
  
  fSymbols.Clear(option);
  fItems.Clear(option);
}


void AliHLTTriggerMenu::AddSymbol(const AliHLTTriggerMenuSymbol& entry)
{
  // Adds a new symbol to the trigger menu.
  
  for (Int_t i = 0; i < fSymbols.GetEntriesFast(); i++)
  {
    const char* symbolname = static_cast<AliHLTTriggerMenuSymbol*>(fSymbols.UncheckedAt(i))->Name();
    if ( strcmp(symbolname, entry.Name()) == 0 )
    {
      Warning("AliHLTTriggerMenu::AddSymbol",
              "The symbol '%s' already exists in the trigger menu. Will not add the new entry.",
              entry.RealName()
             );
      return;
    }
  }
  new (fSymbols[fSymbols.GetEntriesFast()]) AliHLTTriggerMenuSymbol(entry);
}

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