- Three classes by MinJung Kweon AliHFEpriVtx, AliHFEsecVtx and AliHFEmcQA for primar...
[u/mrichter/AliRoot.git] / STEER / AliTriggerConfiguration.cxx
CommitLineData
51f6d619 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16///////////////////////////////////////////////////////////////////////////////
17//
18// This class which defines defines the Trigger Configuration
19//
20// Trigger Configuration defines the trigger setup for a particular run
21// We have default configurations for each running mode (Pb-Pb, p-p, p-A, Calibration, etc).
22// It keep:
23// All the information conained in the CTP configuration file used
24// online during the data taking
25//
26// Configurations could be created and stored in local file.
27// By default the configuration is loaded from the corresponding GRP entry
28// inside the OCDB. There one can have one and only one configuration per run.
29//
30// Example how to create a Trigger Configuration:
31//
32// AliTriggerConfiguration config( "TEST", "Test Configuration" );
33//
34// // Define a Cluster Detector
35// config.AddDetectorCluster( "VZERO ZDC MUON" );
36//
37// // Define the trigger conditions (see AliTriggerCondition.cxx)
38// config.AddCondition( "VZERO_TEST1_L0 & MUON_SPlus_LPt_L0 & ZDC_TEST2_L0", // condition
39// "VO1_M1_ZDC2", // short name
40// "Dummy", // short description
41// 0x0100 ); // class mask (set one bit)
42//
43// config.AddCondition( "VZERO_TEST2_L0 & MUON_SMinus_HPt_L0 & ZDC_TEST1_L0",
44// "VO2_M3_ZDC1",
45// "Dummy",
46// 0x0200 );
47//
48// config.AddCondition( "VZERO_TEST3_L0 | MUON_Unlike_LPt_L0 | ZDC_TEST3_L0",
49// "VO3_M1_ZDC3",
50// "Dummy",
51// 0x0400 );
52// config.CheckInputsConditions("Config.C");
53// config.Print();
54//
55// // save the configuration to file
56// // (default file name $ALICE_ROOT/data/triggerConfigurations.root)
57// config.WriteConfiguration(); or config.WriteConfiguration( filename );
58//
59///////////////////////////////////////////////////////////////////////////////
60#include <Riostream.h>
51f6d619 61
3e2e3ece 62#include <TCint.h>
63#include <TFile.h>
64#include <TKey.h>
65#include <TObjArray.h>
66#include <TObjString.h>
51f6d619 67#include <TObject.h>
3e2e3ece 68#include <TROOT.h>
51f6d619 69#include <TString.h>
51f6d619 70#include <TSystem.h>
51f6d619 71
3e2e3ece 72#include "AliCDBManager.h"
51f6d619 73#include "AliLog.h"
3e2e3ece 74#include "AliMC.h"
75#include "AliModule.h"
76#include "AliPDG.h"
51f6d619 77#include "AliRun.h"
78#include "AliRunLoader.h"
51f6d619 79#include "AliTriggerBCMask.h"
51f6d619 80#include "AliTriggerClass.h"
3e2e3ece 81#include "AliTriggerCluster.h"
51f6d619 82#include "AliTriggerConfiguration.h"
3e2e3ece 83#include "AliTriggerDescriptor.h"
84#include "AliTriggerInput.h"
85#include "AliTriggerInteraction.h"
86#include "AliTriggerPFProtection.h"
51f6d619 87
88ClassImp(AliTriggerConfiguration)
89
90const TString AliTriggerConfiguration::fgkConfigurationFileName("/data/triggerConfigurations.root");
91
92//_____________________________________________________________________________
93AliTriggerConfiguration::AliTriggerConfiguration():
94 TNamed(),
95 fInputs(),
96 fInteractions(),
97 fFunctions(),
98 fPFProtections(),
99 fMasks(),
100 fDescriptors(),
101 fClusters(),
509b7052 102 fClasses(),
103 fVersion(0)
51f6d619 104{
105 // Default constructor
106}
107
108//_____________________________________________________________________________
109AliTriggerConfiguration::AliTriggerConfiguration( TString & name, TString & description ):
110 TNamed( name, description ),
111 fInputs(),
112 fInteractions(),
113 fFunctions(),
114 fPFProtections(),
115 fMasks(),
116 fDescriptors(),
117 fClusters(),
509b7052 118 fClasses(),
119 fVersion(0)
51f6d619 120{
121 // Constructor
122}
123
124//_____________________________________________________________________________
125AliTriggerConfiguration::~AliTriggerConfiguration()
126{
f3eb4d78 127 // Destructor
51f6d619 128 fInputs.SetOwner();
129 fInputs.Delete();
130 fInteractions.SetOwner();
131 fInteractions.Delete();
132 fFunctions.SetOwner();
133 fFunctions.Delete();
134 fPFProtections.SetOwner();
135 fPFProtections.Delete();
136 fMasks.SetOwner();
137 fMasks.Delete();
138 fDescriptors.SetOwner();
139 fDescriptors.Delete();
140 fClusters.SetOwner();
141 fClusters.Delete();
142 fClasses.SetOwner();
143 fClasses.Delete();
144}
145
146//_____________________________________________________________________________
147Bool_t AliTriggerConfiguration::AddInput( AliTriggerInput* input )
148{
f3eb4d78 149 // Add a trigger input to
150 // the list of the trigger inputs
51f6d619 151 if (fInputs.GetEntries() < kNMaxInputs) {
152 fInputs.AddLast( input );
153 return kTRUE;
154 }
155 else {
a5a9f26b 156 AliError("CTP can handle up to 60 inputs ! Impossible to add the required input !");
51f6d619 157 return kFALSE;
158 }
159}
160
161//_____________________________________________________________________________
162AliTriggerInput* AliTriggerConfiguration::AddInput( TString &name, TString &det,
163 UChar_t level, UInt_t signature,
164 UChar_t number )
165{
f3eb4d78 166 // Add a trigger input to
167 // the list of the trigger inputs
51f6d619 168 AliTriggerInput *input = new AliTriggerInput(name,det,level,signature,number);
169 if (!AddInput(input)) {
170 delete input;
171 return NULL;
172 }
173 else
174 return input;
175}
176
177//_____________________________________________________________________________
178AliTriggerInteraction* AliTriggerConfiguration::AddInteraction(TString &name, TString &logic)
179{
f3eb4d78 180 // Add a trigger interaction object to
181 // the list of the trigger interactions
51f6d619 182 AliTriggerInteraction *interact = new AliTriggerInteraction(name,logic);
183 if (!AddInteraction(interact)) {
184 delete interact;
185 return NULL;
186 }
187 else
188 return interact;
189}
190
191//_____________________________________________________________________________
192Bool_t AliTriggerConfiguration::AddInteraction(AliTriggerInteraction *interact)
193{
f3eb4d78 194 // Add a trigger interaction object to
195 // the list of the trigger interactions
51f6d619 196 if (fInteractions.GetEntries() < kNMaxInteractions) {
197 if (interact->CheckInputs(fInputs)) {
198 fInteractions.AddLast( interact );
199 return kTRUE;
200 }
201 else
202 AliError("Invalid interaction ! Impossible to add it !");
203 }
204 else
205 AliError("CTP can handle up to 2 interactions ! Impossible to add the required interaction !");
206
207 return kFALSE;
208}
209
210//_____________________________________________________________________________
211AliTriggerInteraction* AliTriggerConfiguration::AddFunction(TString &name, TString &logic)
212{
f3eb4d78 213 // Add a trigger function object to
214 // the list of the trigger functions
51f6d619 215 AliTriggerInteraction *func = new AliTriggerInteraction(name,logic);
216 if (!AddFunction(func)) {
217 delete func;
218 return NULL;
219 }
220 else
221 return func;
222}
223
224//_____________________________________________________________________________
225Bool_t AliTriggerConfiguration::AddFunction(AliTriggerInteraction *func)
226{
f3eb4d78 227 // Add a trigger function object to
228 // the list of the trigger functions
51f6d619 229 if (fFunctions.GetEntries() < kNMaxFunctions) {
230 if (func->CheckInputs(fInputs)) {
231 fFunctions.AddLast( func );
232 return kTRUE;
233 }
234 else
235 AliError("Invalid logical function ! Impossible to add it !");
236 }
237 else
238 AliError("CTP can handle up to 2 logical functions ! Impossible to add the required interaction !");
239
240 return kFALSE;
241}
242
243//_____________________________________________________________________________
244Bool_t AliTriggerConfiguration::AddPFProtection( AliTriggerPFProtection* pfp )
245{
f3eb4d78 246 // Add a trigger past-future protection object to
247 // the list of the trigger past-future protections
51f6d619 248 if (fPFProtections.GetEntries() < kNMaxPFProtections) {
249 if (pfp->CheckInteractions(fInteractions)) {
250 fPFProtections.AddLast( pfp );
251 return kTRUE;
252 }
253 else
254 AliError("Invalid past-future protection ! Impossible to add it !");
255 }
256 else
257 AliError("CTP can handle up to 4 past-future protections ! Impossible to add the required protection !");
258
259 return kFALSE;
260}
261
262//_____________________________________________________________________________
263AliTriggerBCMask* AliTriggerConfiguration::AddMask( TString &name, TString &mask )
264{
f3eb4d78 265 // Add a trigger bunch-crossing mask object to
266 // the list of the trigger bunch-crossing masks
51f6d619 267 AliTriggerBCMask *bcmask = new AliTriggerBCMask(name,mask);
268 if (!AddMask(bcmask)) {
269 delete bcmask;
270 return NULL;
271 }
272 else
273 return bcmask;
274}
275
276//_____________________________________________________________________________
277Bool_t AliTriggerConfiguration::AddMask( AliTriggerBCMask* mask )
278{
f3eb4d78 279 // Add a trigger bunch-crossing mask object to
280 // the list of the trigger bunch-crossing masks
51f6d619 281 if (fMasks.GetEntries() < kNMaxMasks) {
282 fMasks.AddLast( mask );
283 return kTRUE;
284 }
285 else
286 AliError("CTP can handle up to 4 bunch-crossing masks ! Impossible to add the required mask !");
287
288 return kFALSE;
289}
290
291//_____________________________________________________________________________
292AliTriggerCluster* AliTriggerConfiguration::AddCluster( TString &name, UChar_t index, TString &detectors)
293{
f3eb4d78 294 // Add a trigger detector readout cluster to
295 // the list of the trigger clusters
51f6d619 296 AliTriggerCluster *clust = new AliTriggerCluster(name,index,detectors);
297 if (!AddCluster(clust)) {
298 delete clust;
299 return NULL;
300 }
301 else
302 return clust;
303
304}
305
306//_____________________________________________________________________________
307Bool_t AliTriggerConfiguration::AddCluster( AliTriggerCluster* cluster )
308{
f3eb4d78 309 // Add a trigger detector readout cluster to
310 // the list of the trigger clusters
51f6d619 311 if (fClusters.GetEntries() < kNMaxClusters) {
312 TString dets(cluster->GetDetectorsInCluster());
313 if (!(dets.IsNull())) {
314 fClusters.AddLast( cluster );
315 return kTRUE;
316 }
317 else
318 AliError("Empty trigger cluster ! Impossible to add it !");
319 }
320 else
321 AliError("CTP can handle up to 6 different detector clusters ! Impossible to add the required cluster !");
322
323 return kFALSE;
324}
325
326//_____________________________________________________________________________
327TString AliTriggerConfiguration::GetActiveDetectors() const
328{
f3eb4d78 329 // Return an string with all active detector
330 // from each cluster
51f6d619 331
332 TString activeDet = "";
333
334 Int_t nclus = fClusters.GetEntriesFast();
335 if( !nclus ) return activeDet;
336
605cb8bb 337 for( Int_t j=0; j<nclus; ++j ) {
51f6d619 338 TString detStr = ((AliTriggerCluster*)fClusters.At(j))->GetDetectorsInCluster();
339 TObjArray* det = detStr.Tokenize(" ");
340 Int_t ndet = det->GetEntriesFast();
605cb8bb 341 for( Int_t k=0; k<ndet; ++k ) {
342 if( activeDet.Contains( ((TObjString*)det->At(k))->String() ) )continue;
51f6d619 343 activeDet.Append( " " );
605cb8bb 344 activeDet.Append( ((TObjString*)det->At(k))->String() );
51f6d619 345 }
346 }
347 return activeDet;
348}
349
350//_____________________________________________________________________________
351TString AliTriggerConfiguration::GetTriggeringDetectors() const
352{
f3eb4d78 353 // Return an string with all detectors
354 // used for triggering
51f6d619 355
356 TString trDet = "";
357
358 Int_t ninputs = fInputs.GetEntriesFast();
359 if( !ninputs ) return trDet;
360
361 for( Int_t j=0; j<ninputs; j++ ) {
362 TString detStr = ((AliTriggerInput*)fInputs.At(j))->GetDetector();
363 if( trDet.Contains( detStr ) ) continue;
364 trDet.Append( " " );
365 trDet.Append( detStr );
366 }
367 return trDet;
368}
369
370//_____________________________________________________________________________
371TString AliTriggerConfiguration::GetTriggeringModules() const
372{
373 // Return an string with all detectors (modules in the AliRoot
374 // simulation sense) used for triggering
375
376 TString trDet = "";
377
378 Int_t ninputs = fInputs.GetEntriesFast();
379 if( !ninputs ) return trDet;
380
381 for( Int_t j=0; j<ninputs; j++ ) {
382 TString detStr = ((AliTriggerInput*)fInputs.At(j))->GetModule();
383 if( trDet.Contains( detStr ) ) continue;
384 trDet.Append( " " );
385 trDet.Append( detStr );
386 }
387 return trDet;
388}
389
390//_____________________________________________________________________________
391AliTriggerDescriptor* AliTriggerConfiguration::AddDescriptor( TString &name, TString &cond )
392{
f3eb4d78 393 // Add a trigger descriptor to
394 // the list of the trigger descriptors
51f6d619 395 AliTriggerDescriptor *desc = new AliTriggerDescriptor(name,cond);
396 if (!AddDescriptor(desc)) {
397 delete desc;
398 return NULL;
399 }
400 else
401 return desc;
402}
403
404//_____________________________________________________________________________
405Bool_t AliTriggerConfiguration::AddDescriptor( AliTriggerDescriptor *desc )
406{
f3eb4d78 407 // Add a trigger descriptor to
408 // the list of the trigger descriptors
51f6d619 409 if (fDescriptors.GetEntries() < kNMaxClasses) {
410 if (desc->CheckInputsAndFunctions(fInputs,fFunctions)) {
411 fDescriptors.AddLast( desc );
412 return kTRUE;
413 }
414 else
415 AliError("Invalid trigger desciptor ! Impossible to add it !");
416 }
417 else
418 AliError("CTP can handle up to 50 different descriptors ! Impossible to add the required descriptor !");
419
420 return kFALSE;
421}
422
423//_____________________________________________________________________________
424Bool_t AliTriggerConfiguration::AddClass( AliTriggerClass *trclass )
425{
f3eb4d78 426 // Add a trigger class to
427 // the list of the trigger classes
51f6d619 428 if (fClasses.GetEntries() < kNMaxClasses) {
429 if (trclass->CheckClass(this)) {
430 fClasses.AddLast( trclass );
431 return kTRUE;
432 }
433 else
434 AliError("Invalid trigger class ! Impossible to add it !");
435 }
436 else
437 AliError("CTP can handle up to 50 different classes ! Impossible to add the required class !");
438
439 return kFALSE;
440}
441
442//_____________________________________________________________________________
443AliTriggerClass *AliTriggerConfiguration::AddClass( TString &name, UChar_t index,
444 AliTriggerDescriptor *desc, AliTriggerCluster *clus,
445 AliTriggerPFProtection *pfp, AliTriggerBCMask *mask,
446 UInt_t prescaler, Bool_t allrare)
447{
f3eb4d78 448 // Add a trigger class to
449 // the list of the trigger classes
51f6d619 450 if (!fDescriptors.FindObject(desc)) {
451 AliError("Invalid descriptor ! Impossible to add the class !");
452 return NULL;
453 }
454 if (!fClusters.FindObject(clus)) {
455 AliError("Invalid cluster ! Impossible to add the class !");
456 return NULL;
457 }
458 if (!fPFProtections.FindObject(pfp)) {
459 AliError("Invalid past-future protection ! Impossible to add the class !");
460 return NULL;
461 }
462 if (!fMasks.FindObject(mask)) {
463 AliError("Invalid bunch-crossing mask ! Impossible to add the class !");
464 return NULL;
465 }
466 AliTriggerClass* trclass = new AliTriggerClass( name,index,desc,clus,pfp,mask,prescaler,allrare );
467 if (!AddClass(trclass)) {
468 delete trclass;
469 return NULL;
470 }
471 else
472 return trclass;
473}
474
475//_____________________________________________________________________________
476AliTriggerClass *AliTriggerConfiguration::AddClass( TString &name, UChar_t index,
477 TString &desc, TString &clus,
478 TString &pfp, TString &mask,
479 UInt_t prescaler, Bool_t allrare)
480{
481 // Add a new trigger class
482 if (!fDescriptors.FindObject(desc)) {
483 AliError("Invalid descriptor ! Impossible to add the class !");
484 return NULL;
485 }
486 if (!fClusters.FindObject(clus)) {
487 AliError("Invalid cluster ! Impossible to add the class !");
488 return NULL;
489 }
490 if (!fPFProtections.FindObject(pfp)) {
491 AliError("Invalid past-future protection ! Impossible to add the class !");
492 return NULL;
493 }
494 if (!fMasks.FindObject(mask)) {
495 AliError("Invalid bunch-crossing mask ! Impossible to add the class !");
496 return NULL;
497 }
498 AliTriggerClass* trclass = new AliTriggerClass( this, name,index,desc,clus,pfp,mask,prescaler,allrare );
499 if (!AddClass(trclass)) {
500 delete trclass;
501 return NULL;
502 }
503 else
504 return trclass;
505}
506
507//_____________________________________________________________________________
43afc9d8 508Bool_t AliTriggerConfiguration::ProcessConfigurationLine(const char* line, Int_t& level)
51f6d619 509{
43afc9d8 510 // processes one line of configuration
51f6d619 511
43afc9d8 512 TString strLine(line);
51f6d619 513
43afc9d8 514 if (strLine.BeginsWith("#")) return kTRUE;
509b7052 515 if (strLine.BeginsWith("PARTITION:")) {
516 strLine.ReplaceAll("PARTITION:","");
517 SetName(strLine.Data());
518 return kTRUE;
519 }
520 if (strLine.BeginsWith("VERSION:")) {
521 strLine.ReplaceAll("VERSION:","");
522 fVersion = strLine.Atoi();
523 return kTRUE;
524 }
51f6d619 525 if (strLine.BeginsWith("INPUTS:")) {
526 level = 1;
43afc9d8 527 return kTRUE;
51f6d619 528 }
529 if (strLine.BeginsWith("INTERACTIONS:")) {
530 level = 2;
43afc9d8 531 return kTRUE;
51f6d619 532 }
533 if (strLine.BeginsWith("DESCRIPTORS:")) {
534 level = 3;
43afc9d8 535 return kTRUE;
51f6d619 536 }
537 if (strLine.BeginsWith("CLUSTERS:")) {
538 level = 4;
43afc9d8 539 return kTRUE;
51f6d619 540 }
541 if (strLine.BeginsWith("PFS:")) {
542 level = 5;
43afc9d8 543 return kTRUE;
51f6d619 544 }
545 if (strLine.BeginsWith("BCMASKS:")) {
546 level = 6;
43afc9d8 547 return kTRUE;
51f6d619 548 }
549 if (strLine.BeginsWith("CLASSES:")) {
550 level = 7;
43afc9d8 551 return kTRUE;
51f6d619 552 }
43afc9d8 553
51f6d619 554 strLine.ReplaceAll("*",'!');
31e839aa 555 strLine.ReplaceAll("~",'!');
51f6d619 556 TObjArray *tokens = strLine.Tokenize(" \t");
557 Int_t ntokens = tokens->GetEntriesFast();
43afc9d8 558 if (ntokens == 0)
559 {
560 delete tokens;
561 return kTRUE;
562 }
51f6d619 563 switch (level) {
564 case 1:
565 // Read inputs
566 if (ntokens != 5) {
43afc9d8 567 AliError(Form("Invalid trigger input syntax (%s)!",strLine.Data()));
568 return kFALSE;
51f6d619 569 }
43afc9d8 570 AddInput(((TObjString*)tokens->At(0))->String(),
51f6d619 571 ((TObjString*)tokens->At(1))->String(),
572 ((TObjString*)tokens->At(2))->String().Atoi(),
573 ((TObjString*)tokens->At(3))->String().Atoi(),
574 ((TObjString*)tokens->At(4))->String().Atoi());
575 break;
576 case 2:
43afc9d8 577 // Read interaction
578 if (ntokens != 2) {
579 AliError(Form("Invalid trigger interaction syntax (%s)!",strLine.Data()));
580 return kFALSE;
581 }
582 AddInteraction(((TObjString*)tokens->At(0))->String(),
51f6d619 583 ((TObjString*)tokens->At(1))->String());
584 break;
585 case 3:
586 // Read logical functions and descriptors
43afc9d8 587 if (ntokens < 2) {
e89c03c6 588 if ((((TObjString*)tokens->At(0))->String().CompareTo("EMPTY") == 0) ||
589 (((TObjString*)tokens->At(0))->String().CompareTo("DEMPTY") == 0)) {
590 AddDescriptor(((TObjString*)tokens->At(0))->String(),
591 strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
592 break;
593 }
594 else {
595 AliError(Form("Invalid trigger descriptor syntax (%s)!",strLine.Data()));
596 return kFALSE;
597 }
43afc9d8 598 }
51f6d619 599 if (((TObjString*)tokens->At(0))->String().BeginsWith("l0f")) {
600 // function
43afc9d8 601 AddFunction(((TObjString*)tokens->At(0))->String(),
51f6d619 602 strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
603 }
604 else {
43afc9d8 605 AddDescriptor(((TObjString*)tokens->At(0))->String(),
51f6d619 606 strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
607 }
608 break;
609 case 4:
610 {
43afc9d8 611 if (ntokens < 2) {
612 AliError(Form("Invalid trigger cluster syntax (%s)!",strLine.Data()));
613 return kFALSE;
614 }
51f6d619 615 TString strTemp;
616 for(Int_t i = 2; i < ntokens; i++) {
617 strTemp += ((TObjString*)tokens->At(i))->String();
618 strTemp += " ";
619 }
43afc9d8 620 AddCluster(((TObjString*)tokens->At(0))->String(),
51f6d619 621 ((TObjString*)tokens->At(1))->String().Atoi(),
622 strTemp);
623 }
624 break;
625 case 5:
626 {
627 AliTriggerPFProtection *pfp = NULL;
909d646e 628 if ((((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0) ||
629 (((TObjString*)tokens->At(0))->String().CompareTo("NOPF") == 0)) {
51f6d619 630 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String());
631 }
632 else {
43afc9d8 633 if (ntokens != 10) {
634 AliError(Form("Invalid trigger pfs syntax (%s)!",strLine.Data()));
635 return kFALSE;
636 }
51f6d619 637 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String(),
638 ((TObjString*)tokens->At(1))->String(),
639 ((TObjString*)tokens->At(2))->String(),
640 ((TObjString*)tokens->At(3))->String());
641 pfp->SetNa1(((TObjString*)tokens->At(4))->String().Atoi());
642 pfp->SetNa2(((TObjString*)tokens->At(5))->String().Atoi());
643 pfp->SetNb1(((TObjString*)tokens->At(6))->String().Atoi());
644 pfp->SetNb2(((TObjString*)tokens->At(7))->String().Atoi());
645 pfp->SetTa(((TObjString*)tokens->At(8))->String().Atoi());
646 pfp->SetTb(((TObjString*)tokens->At(9))->String().Atoi());
647 }
43afc9d8 648 AddPFProtection(pfp);
51f6d619 649 }
650 break;
651 case 6:
43afc9d8 652 if (ntokens > 2) {
653 AliError(Form("Invalid trigger bcmasks syntax (%s)!",strLine.Data()));
654 return kFALSE;
655 }
51f6d619 656 if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
43afc9d8 657 AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
51f6d619 658 else {
43afc9d8 659 AddMask(((TObjString*)tokens->At(0))->String(),
51f6d619 660 ((TObjString*)tokens->At(1))->String());
661 }
662 break;
663 case 7:
664 {
43afc9d8 665 if (ntokens != 8) {
666 AliError(Form("Invalid trigger class syntax (%s)!",strLine.Data()));
667 return kFALSE;
668 }
669 AliTriggerClass *trclass = new AliTriggerClass(this,
51f6d619 670 ((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String().Atoi(),
671 ((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
672 ((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
43afc9d8 673 ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()));
674 AddClass(trclass);
51f6d619 675 }
676 default:
677 break;
678 }
679 delete tokens;
43afc9d8 680
681 return kTRUE;
682}
683
684//_____________________________________________________________________________
685AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration(TString & configuration)
686{
687 // Load one pre-created Configurations from database/file that match
688 // with the input string 'configuration'
689 // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
690 // By default the files are stored in GRP/CTP folder.
691 // The filename is constructed as: GRP/CTP/<configuration>.cfg
692
693 // Load the selected configuration
694 TString filename;
695 if (configuration.EndsWith(".cfg") ||
696 configuration.EndsWith(".shuttle")) {
697 filename = configuration;
698 }
699 else {
700 filename = gSystem->Getenv("ALICE_ROOT");
701 filename += "/GRP/CTP/";
702 filename += configuration;
703 filename += ".cfg";
704 }
705
706 if( gSystem->AccessPathName( filename.Data() ) ) {
707 AliErrorClass( Form( "file (%s) not found", filename.Data() ) );
708 return NULL;
709 }
710
711
712 ifstream *file = new ifstream ( filename.Data() );
713 if (!*file) {
714 AliErrorClass(Form("Error opening file (%s) !",filename.Data()));
715 file->close();
716 delete file;
717 return NULL;
718 }
719
720 AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
721
722 Int_t level = 0;
723
724 TString strLine;
725 while (strLine.ReadLine(*file)) {
726 if (cfg->ProcessConfigurationLine(strLine, level) == kFALSE)
727 {
728 delete cfg;
729 cfg = 0;
730 break;
731 }
51f6d619 732 }
733
734 file->close();
735 delete file;
736
737 return cfg;
43afc9d8 738}
51f6d619 739
43afc9d8 740//_____________________________________________________________________________
741AliTriggerConfiguration* AliTriggerConfiguration::LoadConfigurationFromString(const char* configuration)
742{
743 // Loads configuration given as parameter <configuration>
744
745 if (!configuration)
746 return 0;
747
748 AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
749
750 Int_t level = 0;
751
752 TObjArray* tokens = TString(configuration).Tokenize("\n");
753 for (Int_t i=0; i<tokens->GetEntries(); i++)
754 {
755 TObjString* str = dynamic_cast<TObjString*>(tokens->At(i));
756 if (!str)
757 continue;
758
759 if (cfg->ProcessConfigurationLine(str->String(), level) == kFALSE)
760 {
761 delete cfg;
762 cfg = 0;
763 break;
764 }
765 }
766
767 delete tokens;
768
769 return cfg;
51f6d619 770}
771
772//_____________________________________________________________________________
773TObjArray* AliTriggerConfiguration::GetAvailableConfigurations( const char* filename )
774{
775 // Return an array of configuration in the file
776
777 TString path;
778 if( !filename[0] ) {
779 path += gSystem->Getenv( "ALICE_ROOT" );
780 path += fgkConfigurationFileName;
781 }
782 else
783 path += filename;
784
785 if( gSystem->AccessPathName( path.Data() ) ) {
786 AliErrorGeneral( "AliTriggerConfiguration", Form( "file (%s) not found", path.Data() ) );
787 return NULL;
788 }
789
790 TObjArray* desArray = new TObjArray();
791
792 TFile file( path.Data(), "READ" );
793 if( file.IsZombie() ) {
794 AliErrorGeneral( "AliTriggerConfiguration", Form( "Error opening file (%s)", path.Data() ) );
795 return NULL;
796 }
797
798 file.ReadAll();
799
800 TKey* key;
801 TIter next( file.GetListOfKeys() );
802 while( (key = (TKey*)next()) ) {
803 TObject* obj = key->ReadObj();
804 if( obj->InheritsFrom( "AliTriggerConfiguration" ) ) {
805 desArray->AddLast( obj );
806 }
807 }
808 file.Close();
809
810 return desArray;
811}
812
813//_____________________________________________________________________________
814void AliTriggerConfiguration::WriteConfiguration( const char* filename )
815{
816 // Write the configuration
817 TString path;
818 if( !filename[0] ) {
819 path += gSystem->Getenv("ALICE_ROOT");
820 path += fgkConfigurationFileName;
821 }
822 else
823 path += filename;
824
825 TFile file( path.Data(), "UPDATE" );
826 if( file.IsZombie() ) {
827 AliErrorGeneral( "AliTriggerConfiguration",
828 Form( "Can't open file (%s)", path.Data() ) );
829 return;
830 }
831
832 Bool_t result = (Write( GetName(), TObject::kOverwrite ) != 0);
833 if( !result )
834 AliErrorGeneral( "AliTriggerConfiguration",
835 Form( "Can't write entry to file <%s>!", path.Data() ) );
836 file.Close();
837}
838
839//_____________________________________________________________________________
840Bool_t AliTriggerConfiguration::CheckConfiguration( TString& configfile )
841{
842 // To be used on the pre-creation of Configurations to check if the
843 // conditions have valid inputs names.
844 //
845 // Initiate detectors modules from a Config file
846 // Ask to each active module present in the fDetectorCluster
847 // to create a Trigger detector and retrive the inputs from it
848 // to create a list of inputs.
849 // Each condition in the configuration is then checked agains
850 // the list of inputs
851
852
853 if (!gAlice) {
854 AliError( "no gAlice object. Restart aliroot and try again." );
855 return kFALSE;
856 }
857 if (gAlice->Modules()->GetEntries() > 0) {
858 AliError( "gAlice was already run. Restart aliroot and try again." );
859 return kFALSE;
860 }
861
862 AliInfo( Form( "initializing gAlice with config file %s",
863 configfile.Data() ) );
3e2e3ece 864//_______________________________________________________________________
865 gAlice->Announce();
866
867 gROOT->LoadMacro(configfile.Data());
868 gInterpreter->ProcessLine(gAlice->GetConfigFunction());
869
870 if(AliCDBManager::Instance()->GetRun() >= 0) {
33c3c91a 871 AliRunLoader::Instance()->SetRunNumber(AliCDBManager::Instance()->GetRun());
3e2e3ece 872 } else {
873 AliWarning("Run number not initialized!!");
874 }
875
33c3c91a 876 AliRunLoader::Instance()->CdGAFile();
3e2e3ece 877
878 AliPDG::AddParticlesToPdgDataBase();
879
880 gAlice->GetMCApp()->Init();
881
882 //Must be here because some MCs (G4) adds detectors here and not in Config.C
883 gAlice->InitLoaders();
33c3c91a 884 AliRunLoader::Instance()->MakeTree("E");
885 AliRunLoader::Instance()->LoadKinematics("RECREATE");
886 AliRunLoader::Instance()->LoadTrackRefs("RECREATE");
887 AliRunLoader::Instance()->LoadHits("all","RECREATE");
3e2e3ece 888 //
889 // Save stuff at the beginning of the file to avoid file corruption
33c3c91a 890 AliRunLoader::Instance()->CdGAFile();
3e2e3ece 891 gAlice->Write();
51f6d619 892
33c3c91a 893 AliRunLoader* runLoader = AliRunLoader::Instance();
51f6d619 894 if( !runLoader ) {
895 AliError( Form( "gAlice has no run loader object. "
896 "Check your config file: %s", configfile.Data() ) );
897 return kFALSE;
898 }
899
900 // get the possible inputs to check the condition
901 TObjArray inputs;
902 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
903
904 TString detStr = GetTriggeringModules();
905
906 for( Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++ ) {
907 AliModule* det = (AliModule*) detArray->At(iDet);
908 if( !det || !det->IsActive() ) continue;
909 if( IsSelected( det->GetName(), detStr ) ) {
910 AliInfo( Form( "Creating inputs for %s", det->GetName() ) );
911 AliTriggerDetector* dtrg = det->CreateTriggerDetector();
a4d25339 912 dtrg->AssignInputs(GetInputs());
51f6d619 913 TObjArray* detInp = dtrg->GetInputs();
914 for( Int_t i=0; i<detInp->GetEntriesFast(); i++ ) {
915 AliInfo( Form( "Adding input %s", ((AliTriggerInput*)detInp->At(i))->GetName() ) );
916 inputs.AddLast( detInp->At(i) );
917 }
918 }
919 }
920
921 // check if the condition is compatible with the triggers inputs
922 Int_t ndesc = fClasses.GetEntriesFast();
923 Bool_t check = kTRUE;
924 ULong64_t mask = 0L;
925 for( Int_t j=0; j<ndesc; j++ ) {
926 AliTriggerClass *trclass = (AliTriggerClass*)fClasses.At( j );
927 if( !(trclass->CheckClass( this )) ) check = kFALSE;
928 else {
929 if (trclass->IsActive(this->GetInputs(),this->GetFunctions())) {
930 AliInfo( Form( "Trigger Class (%s) OK, class mask (0x%Lx)",
931 trclass->GetName(), trclass->GetMask( ) ) );
932 }
933 else {
934 AliWarning( Form( "Trigger Class (%s) is NOT active, class mask (0x%Lx)",
935 trclass->GetName(), trclass->GetMask( ) ) );
936 }
937 }
938 // check if condition mask is duplicated
939 if( mask & trclass->GetMask() ) {
940 AliError( Form("Class (%s). The class mask (0x%Lx) is ambiguous. It was already defined",
941 trclass->GetName(), trclass->GetMask() ) );
942 check = kFALSE;
943 }
944 mask |= trclass->GetMask();
945 }
946
947 return check;
948}
949
895affe8 950//_____________________________________________________________________________
951void AliTriggerConfiguration::Reset()
952{
953 for( Int_t j=0; j<fInputs.GetEntriesFast(); j++ )
954 ((AliTriggerInput*)fInputs.At(j))->Reset();
955
956 for( Int_t j=0; j<fClasses.GetEntriesFast(); j++ )
957 ((AliTriggerClass*)fClasses.At(j))->Reset();
958}
51f6d619 959
960//_____________________________________________________________________________
961void AliTriggerConfiguration::Print( const Option_t* ) const
962{
963 // Print
964 cout << "#################################################" << endl;
965 cout << "Trigger Configuration:" << endl;
966 cout << " Name: " << GetName() << endl;
967 cout << " Description: " << GetTitle() << endl;
509b7052 968 cout << " Version: " << GetVersion() << endl;
51f6d619 969 cout << " Active Detectors: " << GetActiveDetectors() << endl;
970 cout << " Trigger Detectors: " << GetTriggeringDetectors() << endl;
971
972 cout << "#################################################" << endl;
973 fInputs.Print();
974 cout << "#################################################" << endl;
975 fInteractions.Print();
976 cout << "#################################################" << endl;
977 fFunctions.Print();
978 cout << "#################################################" << endl;
979 fDescriptors.Print();
980 cout << "#################################################" << endl;
981 fClusters.Print();
982 cout << "#################################################" << endl;
983 fPFProtections.Print();
984 cout << "#################################################" << endl;
985 fMasks.Print();
986 cout << "#################################################" << endl;
987 fClasses.Print();
988 cout << "#################################################" << endl;
989
990 cout << endl;
991}
992
993
994//////////////////////////////////////////////////////////////////////////////
995// Helper method
996
997//_____________________________________________________________________________
998Bool_t AliTriggerConfiguration::IsSelected( TString detName, TString& detectors ) const
999{
1000 // check whether detName is contained in detectors
1001 // if yes, it is removed from detectors
1002
1003 // check if all detectors are selected
1004 if( (detectors.CompareTo("ALL") == 0 ) ||
1005 detectors.BeginsWith("ALL ") ||
1006 detectors.EndsWith(" ALL") ||
1007 detectors.Contains(" ALL ") ) {
1008 detectors = "ALL";
1009 return kTRUE;
1010 }
1011
1012 // search for the given detector
1013 Bool_t result = kFALSE;
1014 if( (detectors.CompareTo( detName ) == 0) ||
1015 detectors.BeginsWith( detName+" " ) ||
1016 detectors.EndsWith( " "+detName ) ||
1017 detectors.Contains( " "+detName+" " ) ) {
1018 detectors.ReplaceAll( detName, "" );
1019 result = kTRUE;
1020 }
1021
1022 // clean up the detectors string
1023 while( detectors.Contains(" ") ) detectors.ReplaceAll( " ", " " );
1024 while( detectors.BeginsWith(" ") ) detectors.Remove( 0, 1 );
1025 while( detectors.EndsWith(" ") ) detectors.Remove( detectors.Length()-1, 1 );
1026
1027 return result;
1028}