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 descriptor objects
//
//
///////////////////////////////////////////////////////////////////////////////

#include <Riostream.h>
#include <TObjArray.h>
#include <TObjString.h>

#include "AliLog.h"
#include "AliTriggerDescriptor.h"
#include "AliTriggerInput.h"
#include "AliTriggerInteraction.h"

using std::endl;
using std::cout;
ClassImp(AliTriggerDescriptor)

//_____________________________________________________________________________
AliTriggerDescriptor::AliTriggerDescriptor():
  TNamed()
{
  // Default constructor
}

//_____________________________________________________________________________
AliTriggerDescriptor::AliTriggerDescriptor( TString & name, TString &cond ):
  TNamed( name, cond )
{
  // Constructor
}
//_____________________________________________________________________________
AliTriggerDescriptor::~AliTriggerDescriptor() 
{ 
  // Destructor
}
//_____________________________________________________________________________
AliTriggerDescriptor::AliTriggerDescriptor( const AliTriggerDescriptor& desc ):
  TNamed( desc )
{
   // Copy constructor
}

//______________________________________________________________________________
AliTriggerDescriptor& AliTriggerDescriptor::operator=(const AliTriggerDescriptor& desc)
{
   // AliTriggerDescriptor assignment operator.

   if (this != &desc) {
      TNamed::operator=(desc);
   }
   return *this;
}

//_____________________________________________________________________________
Bool_t AliTriggerDescriptor::CheckInputsAndFunctions(const TObjArray &inputs, const TObjArray &functions) const
{
  // Check the existance of trigger inputs and functions
  // and the logic used.
  // Return false in case of wrong interaction
  // definition.

   TString condition( GetTitle() );
   TObjArray* tokens = condition.Tokenize(" !&|()\t");

   Bool_t IsInput = kFALSE;

   Int_t ntokens = tokens->GetEntriesFast();
   for( Int_t i=0; i<ntokens; i++ ) {
      TObjString* iname = (TObjString*)tokens->At( i );
      if (functions.FindObject(iname->String())) {
	// Logical function of the first 4 inputs
	if (IsInput) {
	  AliError("Logical functions can not follow inputs, they are always declared first !");
	  delete tokens;
	  return kFALSE;
	}
	IsInput = kFALSE;
	continue;
      }
      if (inputs.FindObject(iname->String())) {
	// already a trigger input
	IsInput = kTRUE;
	continue;
      }
      AliError(Form("Invalid trigger input or function (%s)",iname->String().Data()));
      delete tokens;
      return kFALSE;
   }

   delete tokens;
   return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliTriggerDescriptor::IsActive(const TObjArray &inputs, const TObjArray &functions) const
{
  // Check if the trigger inputs and functions
  // are active
  // Return false in case one or more inputs
  // are disabled
   TString condition( GetTitle() );
   TObjArray* tokens = condition.Tokenize(" !&|()\t");

   Int_t ntokens = tokens->GetEntriesFast();
   for( Int_t i=0; i<ntokens; i++ ) {
      TObjString* iname = (TObjString*)tokens->At( i );
      AliTriggerInteraction *interact = (AliTriggerInteraction *)functions.FindObject(iname->String());
      if (interact) {
	if (!interact->IsActive(inputs)) {
	  AliWarning(Form("The descriptor (%s) will be disabled, because the function (%s) is disabled",
			  GetName(),iname->String().Data()));
	  delete tokens;
	  return kFALSE;
	}
	continue;
      }
      AliTriggerInput *inp = (AliTriggerInput *)inputs.FindObject(iname->String());
      if (inp) {
	if (!inp->IsActive()) {
	  AliWarning(Form("The descriptor (%s) will be disabled, because the input (%s) is disabled",
			  GetName(),iname->String().Data()));
	  delete tokens;
	  return kFALSE;
	}
	continue;
      }
      AliError(Form("Desciptor (%s) contains invalid trigger input or function (%s)",
		    GetName(),iname->String().Data()));
      delete tokens;
      return kFALSE;
   }

   delete tokens;
   return kTRUE;

}

//_____________________________________________________________________________
Bool_t AliTriggerDescriptor::Trigger( const TObjArray &inputs, const TObjArray &functions) const
{
  // Check if the inputs and functions 
  // satify the descriptor conditions 

  TString condition( GetTitle() );
  TObjArray* tokens = condition.Tokenize(" !&|()\t");

  Int_t ntokens = tokens->GetEntriesFast();
  for( Int_t i=0; i<ntokens; i++ ) {
    TObjString* iname = (TObjString*)tokens->At( i );
    AliTriggerInteraction *interact = (AliTriggerInteraction *)functions.FindObject(iname->String());
    if (interact) {
      if (!interact->Trigger(inputs)) {
	delete tokens;
	return kFALSE;
      }
      continue;
    }
    AliTriggerInput *inp = (AliTriggerInput *)inputs.FindObject(iname->String());
    if (inp) {
      if (!inp->Status()) {
	delete tokens;
	return kFALSE;
      }
      continue;
    }
    AliError(Form("Desciptor (%s) contains invalid trigger input or function (%s)",
		  GetName(),iname->String().Data()));
    delete tokens;
    return kFALSE;
  }

  delete tokens;
  return kTRUE;

}

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