ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//
// This class which defines the trigger classes objects
//
//
///////////////////////////////////////////////////////////////////////////////
#include <Riostream.h>
#include <TMath.h>

#include "AliLog.h"
#include "AliTriggerClass.h"
#include "AliTriggerConfiguration.h"
#include "AliTriggerDescriptor.h"
#include "AliTriggerCluster.h"
#include "AliTriggerPFProtection.h"
#include "AliTriggerBCMask.h"

using std::endl;
using std::cout;
using std::hex;
using std::dec;
ClassImp(AliTriggerClass)

//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass():
  TNamed(),
  fClassMask(0),
  fClassMaskNext50(0),
  fIndex(0),
  fDescriptor(NULL),
  fCluster(NULL),
  fPFProtection(NULL),
  fPrescaler(0),
  fAllRare(kFALSE),
  fStatus(kFALSE),
  fTimeGroup(0),
  fTimeWindow(0)
{
  // Default constructor
  for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0; 
}

//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass( TString & name, UChar_t index,
				  AliTriggerDescriptor *desc, AliTriggerCluster *clus,
				  AliTriggerPFProtection *pfp, AliTriggerBCMask *mask,
				  UInt_t prescaler, Bool_t allrare) :
  TNamed( name, name ),
  fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
  fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
  fIndex(index),
  fDescriptor( desc ),
  fCluster( clus ),
  fPFProtection( pfp ),
  fPrescaler( prescaler ),
  fAllRare( allrare ),
  fStatus(kFALSE),
  fTimeGroup(0),
  fTimeWindow(0)
{
  // Constructor
  // This should be used with old version of config
  for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0; 
  fMask[0]=mask;
}

//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass( AliTriggerConfiguration *config,
				  TString & name, UChar_t index,
				  TString &desc, TString &clus,
				  TString &pfp, TString &mask,
				  UInt_t prescaler, Bool_t allrare) :
  TNamed( name, name ),
  fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
  fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
  fIndex(index),
  fDescriptor( NULL ),
  fCluster( NULL ),
  fPFProtection( NULL ),
  fPrescaler( prescaler ),
  fAllRare( allrare ),
  fStatus(kFALSE),
  fTimeGroup(0),
  fTimeWindow(0)
{
  // This should be used with old version of config
  fDescriptor = (AliTriggerDescriptor*)config->GetDescriptors().FindObject(desc);
  fCluster = (AliTriggerCluster*)config->GetClusters().FindObject(clus);
  pfp.ReplaceAll("{","");
  pfp.ReplaceAll("}","");
  fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
  // BC masks
  for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
  mask.ReplaceAll("{","");
  mask.ReplaceAll("}","");
  fMask[0] = (AliTriggerBCMask*)config->GetMasks().FindObject(mask);
}
//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass( AliTriggerConfiguration *config,
				  TString & name, UChar_t index,
				  TString &desc, TString &clus,
				  TString &pfp,
				  UInt_t prescaler, Bool_t allrare,
				  UInt_t timegroup,UInt_t timewindow) :
  TNamed( name, name ),
  fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
  fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
  fIndex(index),
  fDescriptor( NULL ),
  fCluster( NULL ),
  fPFProtection( NULL ),
  fPrescaler( prescaler ),
  fAllRare( allrare ),
  fStatus(kFALSE),
  fTimeGroup(timegroup),
  fTimeWindow(timewindow)
{
  fDescriptor = (AliTriggerDescriptor*)config->GetDescriptors().FindObject(desc);
  fCluster = (AliTriggerCluster*)config->GetClusters().FindObject(clus);
  pfp.ReplaceAll("{","");
  pfp.ReplaceAll("}","");
  fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
  // masks are added by seter
  for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
}
//_____________________________________________________________________________
AliTriggerClass::~AliTriggerClass() 
{ 
  // Destructor
}
//_____________________________________________________________________________
AliTriggerClass::AliTriggerClass( const AliTriggerClass& trclass ):
  TNamed( trclass ),
  fClassMask(trclass.fClassMask),
  fClassMaskNext50(trclass.fClassMaskNext50),
  fIndex(trclass.fIndex),
  fDescriptor(trclass.fDescriptor),
  fCluster(trclass.fCluster),
  fPFProtection(trclass.fPFProtection),
  fPrescaler(trclass.fPrescaler),
  fAllRare(trclass.fAllRare),
  fStatus(trclass.fStatus),
  fTimeGroup(trclass.fTimeGroup),
  fTimeWindow(trclass.fTimeWindow)
{
   // Copy constructor
   for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
}
//______________________________________________________________________________
AliTriggerClass& AliTriggerClass::operator=(const AliTriggerClass& trclass)
{
   // AliTriggerClass assignment operator.

   if (this != &trclass) {
      TNamed::operator=(trclass);
      fClassMask = trclass.fClassMask;
      fClassMaskNext50 = trclass.fClassMaskNext50;
      fIndex=trclass.fIndex;
      fDescriptor = trclass.fDescriptor;
      fCluster = trclass.fCluster;
      fPFProtection = trclass.fPFProtection;
      for(Int_t i=0; i< kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
      fPrescaler = trclass.fPrescaler;
      fAllRare = trclass.fAllRare;
      fStatus = trclass.fStatus;
      fTimeGroup = trclass.fTimeGroup;
      fTimeWindow = trclass.fTimeWindow;
   }
   return *this;
}
//_____________________________________________________________________________
Bool_t AliTriggerClass::SetMasks(AliTriggerConfiguration* config,TString& masks)
{
 masks.ReplaceAll("{","");
 masks.ReplaceAll("}","");
 masks.ReplaceAll(" ","");
 masks.ReplaceAll("\t","");
 TObjArray *tokens = masks.Tokenize(",");
 Int_t ntokens = tokens->GetEntriesFast();
 if(ntokens==0){
   delete tokens;
   AliError(Form("The class (%s) has invalid mask pattern: (%s)",GetName(),masks.Data()));
   return kFALSE;
 }
 Int_t nmask=0;
 while(fMask[nmask])nmask++;
 if(nmask+ntokens>=kNMaxMasks){
   delete tokens;
   AliError(Form("The class (%s) exceeds %i masks",GetName(),kNMaxMasks));
   return kFALSE;
 }
 for(Int_t i=nmask; i<nmask+ntokens; i++){
    fMask[i] = (AliTriggerBCMask*)config->GetMasks().FindObject(((TObjString*)tokens->At(i-nmask))->String());
    if(!fMask[i]){
      AliError(Form("The class (%s) unknown mask %s",GetName(),(((TObjString*)tokens->At(i-nmask))->String().Data())));
      return kFALSE;
    }
 }
 delete tokens;
 return kTRUE;
}
//_____________________________________________________________________________
Bool_t AliTriggerClass::CheckClass(AliTriggerConfiguration* config) const
{
  // Check the existance of trigger inputs and functions
  // and the logic used.
  // Return false in case of wrong class
  // definition.

  if (!fClassMask && !fClassMaskNext50) {
    AliError(Form("The class (%s) has invalid mask pattern !",GetName()));
    return kFALSE;
  }

  // check consistency of index and mask

  if (!config->GetDescriptors().FindObject(fDescriptor)) {
    AliError(Form("The class (%s) contains invalid descriptor !",GetName()));
    return kFALSE;
  }
  else {
    if (!(fDescriptor->CheckInputsAndFunctions(config->GetInputs(),config->GetFunctions()))) {
      AliError(Form("The class (%s) contains bad descriptor !",GetName()));
      return kFALSE;
    }
  }

  if (!config->GetClusters().FindObject(fCluster)) {
    AliError(Form("The class (%s) contains invalid cluster !",GetName()));
    return kFALSE;
  }

  if (!config->GetPFProtections().FindObject(fPFProtection)) {
    AliError(Form("The class (%s) contains invalid past-future protection !",GetName()));
    return kFALSE;
  }
  
  for(Int_t i=0; i< kNMaxMasks; i++){
     if(fMask[i]){
        if (!config->GetMasks().FindObject(fMask[i])) {
           AliError(Form("The class (%s) contains invalid BC mask !",GetName()));
           return kFALSE;
       }
     }
  }
  return kTRUE;
}

//_____________________________________________________________________________
void AliTriggerClass::Trigger( const TObjArray& inputs , const TObjArray& functions)
{
   // Check if the inputs satify the trigger class conditions
  fStatus = fDescriptor->Trigger(inputs,functions);
}

//_____________________________________________________________________________
Bool_t AliTriggerClass::IsActive( const TObjArray& inputs, const TObjArray& functions) const
{
   // Check if the inputs satify the trigger class conditions
  if (fDescriptor)
    return fDescriptor->IsActive(inputs,functions);

  return kFALSE;
}

//_____________________________________________________________________________
void AliTriggerClass::Print( const Option_t* ) const
{
   // Print
  cout << "Trigger Class:" << endl;
  cout << "  Name:         " << GetName() << endl;
  cout << "  ClassBit:    1..50 0x" << hex << fClassMask << " 51..10 0x" << fClassMaskNext50 << dec << endl;
  cout << "  Index:        " <<  (UInt_t)fIndex <<  endl;
  cout << "  Descriptor:   " << fDescriptor->GetName() << endl;
  cout << "  Cluster:      " << fCluster->GetName() << endl;
  cout << "  PF Protection:" << fPFProtection->GetName() << endl;
  cout << "  BC Mask:      " ;
  for(Int_t i=0; i< kNMaxMasks; i++)if(fMask[i])cout << fMask[i]->GetName() << " ";
  cout << endl;
  cout << "  Prescaler:    " << fPrescaler << endl;
  cout << "  AllRare:      " << fAllRare << endl;
  cout << "  Time Group:      " << fTimeGroup << endl;
  cout << "  Time Window:      " << fTimeWindow << endl;
  if (fStatus)
     cout << "   Class is fired      " << endl;
   else
     cout << "   Class is not fired  " << endl;
}
//______________________________________________________________________
 Int_t AliTriggerClass::GetDownscaleFactor(Double_t& ds) const 
{
 // There are 2 types of downscaling:
 // - Random time veto downscale (option=0 <=> bit 31=0)
 // - Class busy veto (option=1 <=> bit 31=1)
 // 
 Int_t option=0;
 if(fPrescaler&(1<<31)) option=1;
 if(option){
   ds = (fPrescaler&0x1ffffff)/100.; // class busy in milisec
 }else{
   ds = 1.- fPrescaler/2097151.;     // reduction factor in %
 }
 return option;
}

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