1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
18 // This class which defines the trigger classes objects
21 ///////////////////////////////////////////////////////////////////////////////
22 #include <Riostream.h>
26 #include "AliTriggerClass.h"
27 #include "AliTriggerConfiguration.h"
28 #include "AliTriggerDescriptor.h"
29 #include "AliTriggerCluster.h"
30 #include "AliTriggerPFProtection.h"
31 #include "AliTriggerBCMask.h"
37 ClassImp(AliTriggerClass)
39 //_____________________________________________________________________________
40 AliTriggerClass::AliTriggerClass():
54 // Default constructor
55 for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
58 //_____________________________________________________________________________
59 AliTriggerClass::AliTriggerClass( TString & name, UChar_t index,
60 AliTriggerDescriptor *desc, AliTriggerCluster *clus,
61 AliTriggerPFProtection *pfp, AliTriggerBCMask *mask,
62 UInt_t prescaler, Bool_t allrare) :
64 fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
65 fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
70 fPrescaler( prescaler ),
77 // This should be used with old version of config
78 for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
82 //_____________________________________________________________________________
83 AliTriggerClass::AliTriggerClass( AliTriggerConfiguration *config,
84 TString & name, UChar_t index,
85 TString &desc, TString &clus,
86 TString &pfp, TString &mask,
87 UInt_t prescaler, Bool_t allrare) :
89 fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
90 fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
94 fPFProtection( NULL ),
95 fPrescaler( prescaler ),
101 // This should be used with old version of config
102 fDescriptor = (AliTriggerDescriptor*)config->GetDescriptors().FindObject(desc);
103 fCluster = (AliTriggerCluster*)config->GetClusters().FindObject(clus);
104 pfp.ReplaceAll("{","");
105 pfp.ReplaceAll("}","");
106 fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
108 for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
109 mask.ReplaceAll("{","");
110 mask.ReplaceAll("}","");
111 fMask[0] = (AliTriggerBCMask*)config->GetMasks().FindObject(mask);
113 //_____________________________________________________________________________
114 AliTriggerClass::AliTriggerClass( AliTriggerConfiguration *config,
115 TString & name, UChar_t index,
116 TString &desc, TString &clus,
118 UInt_t prescaler, Bool_t allrare,
119 UInt_t timegroup,UInt_t timewindow) :
120 TNamed( name, name ),
121 fClassMask((index<51) ? (1ull << ULong64_t(index-1)): 0),
122 fClassMaskNext50((index<51) ? 0 :(1ull << ULong64_t(index-51))),
126 fPFProtection( NULL ),
127 fPrescaler( prescaler ),
130 fTimeGroup(timegroup),
131 fTimeWindow(timewindow)
133 fDescriptor = (AliTriggerDescriptor*)config->GetDescriptors().FindObject(desc);
134 fCluster = (AliTriggerCluster*)config->GetClusters().FindObject(clus);
135 pfp.ReplaceAll("{","");
136 pfp.ReplaceAll("}","");
137 fPFProtection = (AliTriggerPFProtection*)config->GetPFProtections().FindObject(pfp);
138 // masks are added by seter
139 for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=0;
141 //_____________________________________________________________________________
142 AliTriggerClass::~AliTriggerClass()
146 //_____________________________________________________________________________
147 AliTriggerClass::AliTriggerClass( const AliTriggerClass& trclass ):
149 fClassMask(trclass.fClassMask),
150 fClassMaskNext50(trclass.fClassMaskNext50),
151 fIndex(trclass.fIndex),
152 fDescriptor(trclass.fDescriptor),
153 fCluster(trclass.fCluster),
154 fPFProtection(trclass.fPFProtection),
155 fPrescaler(trclass.fPrescaler),
156 fAllRare(trclass.fAllRare),
157 fStatus(trclass.fStatus),
158 fTimeGroup(trclass.fTimeGroup),
159 fTimeWindow(trclass.fTimeWindow)
162 for(Int_t i = 0; i < kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
164 //______________________________________________________________________________
165 AliTriggerClass& AliTriggerClass::operator=(const AliTriggerClass& trclass)
167 // AliTriggerClass assignment operator.
169 if (this != &trclass) {
170 TNamed::operator=(trclass);
171 fClassMask = trclass.fClassMask;
172 fClassMaskNext50 = trclass.fClassMaskNext50;
173 fIndex=trclass.fIndex;
174 fDescriptor = trclass.fDescriptor;
175 fCluster = trclass.fCluster;
176 fPFProtection = trclass.fPFProtection;
177 for(Int_t i=0; i< kNMaxMasks; i++)fMask[i]=trclass.fMask[i];
178 fPrescaler = trclass.fPrescaler;
179 fAllRare = trclass.fAllRare;
180 fStatus = trclass.fStatus;
181 fTimeGroup = trclass.fTimeGroup;
182 fTimeWindow = trclass.fTimeWindow;
186 //_____________________________________________________________________________
187 Bool_t AliTriggerClass::SetMasks(AliTriggerConfiguration* config,TString& masks)
189 masks.ReplaceAll("{","");
190 masks.ReplaceAll("}","");
191 masks.ReplaceAll(" ","");
192 masks.ReplaceAll("\t","");
193 TObjArray *tokens = masks.Tokenize(",");
194 Int_t ntokens = tokens->GetEntriesFast();
197 AliError(Form("The class (%s) has invalid mask pattern: (%s)",GetName(),masks.Data()));
201 while(fMask[nmask])nmask++;
202 if(nmask+ntokens>=kNMaxMasks){
204 AliError(Form("The class (%s) exceeds %i masks",GetName(),kNMaxMasks));
207 for(Int_t i=nmask; i<nmask+ntokens; i++){
208 fMask[i] = (AliTriggerBCMask*)config->GetMasks().FindObject(((TObjString*)tokens->At(i-nmask))->String());
210 AliError(Form("The class (%s) unknown mask %s",GetName(),(((TObjString*)tokens->At(i-nmask))->String().Data())));
217 //_____________________________________________________________________________
218 Bool_t AliTriggerClass::CheckClass(AliTriggerConfiguration* config) const
220 // Check the existance of trigger inputs and functions
221 // and the logic used.
222 // Return false in case of wrong class
225 if (!fClassMask && !fClassMaskNext50) {
226 AliError(Form("The class (%s) has invalid mask pattern !",GetName()));
230 // check consistency of index and mask
232 if (!config->GetDescriptors().FindObject(fDescriptor)) {
233 AliError(Form("The class (%s) contains invalid descriptor !",GetName()));
237 if (!(fDescriptor->CheckInputsAndFunctions(config->GetInputs(),config->GetFunctions()))) {
238 AliError(Form("The class (%s) contains bad descriptor !",GetName()));
243 if (!config->GetClusters().FindObject(fCluster)) {
244 AliError(Form("The class (%s) contains invalid cluster !",GetName()));
248 if (!config->GetPFProtections().FindObject(fPFProtection)) {
249 AliError(Form("The class (%s) contains invalid past-future protection !",GetName()));
253 for(Int_t i=0; i< kNMaxMasks; i++){
255 if (!config->GetMasks().FindObject(fMask[i])) {
256 AliError(Form("The class (%s) contains invalid BC mask !",GetName()));
264 //_____________________________________________________________________________
265 void AliTriggerClass::Trigger( const TObjArray& inputs , const TObjArray& functions)
267 // Check if the inputs satify the trigger class conditions
268 fStatus = fDescriptor->Trigger(inputs,functions);
271 //_____________________________________________________________________________
272 Bool_t AliTriggerClass::IsActive( const TObjArray& inputs, const TObjArray& functions) const
274 // Check if the inputs satify the trigger class conditions
276 return fDescriptor->IsActive(inputs,functions);
281 //_____________________________________________________________________________
282 void AliTriggerClass::Print( const Option_t* ) const
285 cout << "Trigger Class:" << endl;
286 cout << " Name: " << GetName() << endl;
287 cout << " ClassBit: 1..50 0x" << hex << fClassMask << " 51..10 0x" << fClassMaskNext50 << dec << endl;
288 cout << " Index: " << (UInt_t)fIndex << endl;
289 cout << " Descriptor: " << fDescriptor->GetName() << endl;
290 cout << " Cluster: " << fCluster->GetName() << endl;
291 cout << " PF Protection:" << fPFProtection->GetName() << endl;
292 cout << " BC Mask: " ;
293 for(Int_t i=0; i< kNMaxMasks; i++)if(fMask[i])cout << fMask[i]->GetName() << " ";
295 cout << " Prescaler: " << fPrescaler << endl;
296 cout << " AllRare: " << fAllRare << endl;
297 cout << " Time Group: " << fTimeGroup << endl;
298 cout << " Time Window: " << fTimeWindow << endl;
300 cout << " Class is fired " << endl;
302 cout << " Class is not fired " << endl;
304 //______________________________________________________________________
305 Int_t AliTriggerClass::GetDownscaleFactor(Double_t& ds) const
307 // There are 2 types of downscaling:
308 // - Random time veto downscale (option=0 <=> bit 31=0)
309 // - Class busy veto (option=1 <=> bit 31=1)
312 if(fPrescaler&(1<<31)) option=1;
314 ds = (fPrescaler&0x1ffffff)/100.; // class busy in milisec
316 ds = 1.- fPrescaler/2097151.; // reduction factor in %