Processing SPD Mean Vertex only in PHYSICS runs.
[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 }
af51ca16 615 if (((TObjString*)tokens->At(1))->String().Atoi() <= 0) {
616 AliError(Form("Invalid trigger cluster syntax (%s)!",strLine.Data()));
617 return kFALSE;
618 }
51f6d619 619 TString strTemp;
620 for(Int_t i = 2; i < ntokens; i++) {
621 strTemp += ((TObjString*)tokens->At(i))->String();
622 strTemp += " ";
623 }
43afc9d8 624 AddCluster(((TObjString*)tokens->At(0))->String(),
51f6d619 625 ((TObjString*)tokens->At(1))->String().Atoi(),
626 strTemp);
627 }
628 break;
629 case 5:
630 {
631 AliTriggerPFProtection *pfp = NULL;
909d646e 632 if ((((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0) ||
633 (((TObjString*)tokens->At(0))->String().CompareTo("NOPF") == 0)) {
51f6d619 634 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String());
635 }
636 else {
43afc9d8 637 if (ntokens != 10) {
638 AliError(Form("Invalid trigger pfs syntax (%s)!",strLine.Data()));
639 return kFALSE;
640 }
51f6d619 641 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String(),
642 ((TObjString*)tokens->At(1))->String(),
643 ((TObjString*)tokens->At(2))->String(),
644 ((TObjString*)tokens->At(3))->String());
645 pfp->SetNa1(((TObjString*)tokens->At(4))->String().Atoi());
646 pfp->SetNa2(((TObjString*)tokens->At(5))->String().Atoi());
647 pfp->SetNb1(((TObjString*)tokens->At(6))->String().Atoi());
648 pfp->SetNb2(((TObjString*)tokens->At(7))->String().Atoi());
649 pfp->SetTa(((TObjString*)tokens->At(8))->String().Atoi());
650 pfp->SetTb(((TObjString*)tokens->At(9))->String().Atoi());
651 }
43afc9d8 652 AddPFProtection(pfp);
51f6d619 653 }
654 break;
655 case 6:
43afc9d8 656 if (ntokens > 2) {
657 AliError(Form("Invalid trigger bcmasks syntax (%s)!",strLine.Data()));
658 return kFALSE;
659 }
51f6d619 660 if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
43afc9d8 661 AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
51f6d619 662 else {
43afc9d8 663 AddMask(((TObjString*)tokens->At(0))->String(),
51f6d619 664 ((TObjString*)tokens->At(1))->String());
665 }
666 break;
667 case 7:
668 {
43afc9d8 669 if (ntokens != 8) {
670 AliError(Form("Invalid trigger class syntax (%s)!",strLine.Data()));
671 return kFALSE;
672 }
673 AliTriggerClass *trclass = new AliTriggerClass(this,
51f6d619 674 ((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String().Atoi(),
675 ((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
676 ((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
43afc9d8 677 ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()));
678 AddClass(trclass);
51f6d619 679 }
680 default:
681 break;
682 }
683 delete tokens;
43afc9d8 684
685 return kTRUE;
686}
687
688//_____________________________________________________________________________
689AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration(TString & configuration)
690{
691 // Load one pre-created Configurations from database/file that match
692 // with the input string 'configuration'
693 // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
694 // By default the files are stored in GRP/CTP folder.
695 // The filename is constructed as: GRP/CTP/<configuration>.cfg
696
697 // Load the selected configuration
698 TString filename;
699 if (configuration.EndsWith(".cfg") ||
700 configuration.EndsWith(".shuttle")) {
701 filename = configuration;
702 }
703 else {
704 filename = gSystem->Getenv("ALICE_ROOT");
705 filename += "/GRP/CTP/";
706 filename += configuration;
707 filename += ".cfg";
708 }
709
710 if( gSystem->AccessPathName( filename.Data() ) ) {
711 AliErrorClass( Form( "file (%s) not found", filename.Data() ) );
712 return NULL;
713 }
714
715
716 ifstream *file = new ifstream ( filename.Data() );
717 if (!*file) {
718 AliErrorClass(Form("Error opening file (%s) !",filename.Data()));
719 file->close();
720 delete file;
721 return NULL;
722 }
723
724 AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
725
726 Int_t level = 0;
727
728 TString strLine;
729 while (strLine.ReadLine(*file)) {
730 if (cfg->ProcessConfigurationLine(strLine, level) == kFALSE)
731 {
732 delete cfg;
733 cfg = 0;
734 break;
735 }
51f6d619 736 }
737
738 file->close();
739 delete file;
740
741 return cfg;
43afc9d8 742}
51f6d619 743
43afc9d8 744//_____________________________________________________________________________
745AliTriggerConfiguration* AliTriggerConfiguration::LoadConfigurationFromString(const char* configuration)
746{
747 // Loads configuration given as parameter <configuration>
748
749 if (!configuration)
750 return 0;
751
752 AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
753
754 Int_t level = 0;
755
756 TObjArray* tokens = TString(configuration).Tokenize("\n");
757 for (Int_t i=0; i<tokens->GetEntries(); i++)
758 {
759 TObjString* str = dynamic_cast<TObjString*>(tokens->At(i));
760 if (!str)
761 continue;
762
763 if (cfg->ProcessConfigurationLine(str->String(), level) == kFALSE)
764 {
765 delete cfg;
766 cfg = 0;
767 break;
768 }
769 }
770
771 delete tokens;
772
773 return cfg;
51f6d619 774}
775
776//_____________________________________________________________________________
777TObjArray* AliTriggerConfiguration::GetAvailableConfigurations( const char* filename )
778{
779 // Return an array of configuration in the file
780
781 TString path;
782 if( !filename[0] ) {
783 path += gSystem->Getenv( "ALICE_ROOT" );
784 path += fgkConfigurationFileName;
785 }
786 else
787 path += filename;
788
789 if( gSystem->AccessPathName( path.Data() ) ) {
790 AliErrorGeneral( "AliTriggerConfiguration", Form( "file (%s) not found", path.Data() ) );
791 return NULL;
792 }
793
794 TObjArray* desArray = new TObjArray();
795
796 TFile file( path.Data(), "READ" );
797 if( file.IsZombie() ) {
798 AliErrorGeneral( "AliTriggerConfiguration", Form( "Error opening file (%s)", path.Data() ) );
799 return NULL;
800 }
801
802 file.ReadAll();
803
804 TKey* key;
805 TIter next( file.GetListOfKeys() );
806 while( (key = (TKey*)next()) ) {
807 TObject* obj = key->ReadObj();
808 if( obj->InheritsFrom( "AliTriggerConfiguration" ) ) {
809 desArray->AddLast( obj );
810 }
811 }
812 file.Close();
813
814 return desArray;
815}
816
817//_____________________________________________________________________________
818void AliTriggerConfiguration::WriteConfiguration( const char* filename )
819{
820 // Write the configuration
821 TString path;
822 if( !filename[0] ) {
823 path += gSystem->Getenv("ALICE_ROOT");
824 path += fgkConfigurationFileName;
825 }
826 else
827 path += filename;
828
829 TFile file( path.Data(), "UPDATE" );
830 if( file.IsZombie() ) {
831 AliErrorGeneral( "AliTriggerConfiguration",
832 Form( "Can't open file (%s)", path.Data() ) );
833 return;
834 }
835
836 Bool_t result = (Write( GetName(), TObject::kOverwrite ) != 0);
837 if( !result )
838 AliErrorGeneral( "AliTriggerConfiguration",
839 Form( "Can't write entry to file <%s>!", path.Data() ) );
840 file.Close();
841}
842
843//_____________________________________________________________________________
844Bool_t AliTriggerConfiguration::CheckConfiguration( TString& configfile )
845{
846 // To be used on the pre-creation of Configurations to check if the
847 // conditions have valid inputs names.
848 //
849 // Initiate detectors modules from a Config file
850 // Ask to each active module present in the fDetectorCluster
851 // to create a Trigger detector and retrive the inputs from it
852 // to create a list of inputs.
853 // Each condition in the configuration is then checked agains
854 // the list of inputs
855
856
857 if (!gAlice) {
858 AliError( "no gAlice object. Restart aliroot and try again." );
859 return kFALSE;
860 }
861 if (gAlice->Modules()->GetEntries() > 0) {
862 AliError( "gAlice was already run. Restart aliroot and try again." );
863 return kFALSE;
864 }
865
866 AliInfo( Form( "initializing gAlice with config file %s",
867 configfile.Data() ) );
3e2e3ece 868//_______________________________________________________________________
869 gAlice->Announce();
870
871 gROOT->LoadMacro(configfile.Data());
872 gInterpreter->ProcessLine(gAlice->GetConfigFunction());
873
874 if(AliCDBManager::Instance()->GetRun() >= 0) {
33c3c91a 875 AliRunLoader::Instance()->SetRunNumber(AliCDBManager::Instance()->GetRun());
3e2e3ece 876 } else {
877 AliWarning("Run number not initialized!!");
878 }
879
33c3c91a 880 AliRunLoader::Instance()->CdGAFile();
3e2e3ece 881
882 AliPDG::AddParticlesToPdgDataBase();
883
884 gAlice->GetMCApp()->Init();
885
886 //Must be here because some MCs (G4) adds detectors here and not in Config.C
887 gAlice->InitLoaders();
33c3c91a 888 AliRunLoader::Instance()->MakeTree("E");
889 AliRunLoader::Instance()->LoadKinematics("RECREATE");
890 AliRunLoader::Instance()->LoadTrackRefs("RECREATE");
891 AliRunLoader::Instance()->LoadHits("all","RECREATE");
3e2e3ece 892 //
893 // Save stuff at the beginning of the file to avoid file corruption
33c3c91a 894 AliRunLoader::Instance()->CdGAFile();
3e2e3ece 895 gAlice->Write();
51f6d619 896
33c3c91a 897 AliRunLoader* runLoader = AliRunLoader::Instance();
51f6d619 898 if( !runLoader ) {
899 AliError( Form( "gAlice has no run loader object. "
900 "Check your config file: %s", configfile.Data() ) );
901 return kFALSE;
902 }
903
904 // get the possible inputs to check the condition
905 TObjArray inputs;
906 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
907
908 TString detStr = GetTriggeringModules();
909
910 for( Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++ ) {
911 AliModule* det = (AliModule*) detArray->At(iDet);
912 if( !det || !det->IsActive() ) continue;
913 if( IsSelected( det->GetName(), detStr ) ) {
914 AliInfo( Form( "Creating inputs for %s", det->GetName() ) );
915 AliTriggerDetector* dtrg = det->CreateTriggerDetector();
a4d25339 916 dtrg->AssignInputs(GetInputs());
51f6d619 917 TObjArray* detInp = dtrg->GetInputs();
918 for( Int_t i=0; i<detInp->GetEntriesFast(); i++ ) {
919 AliInfo( Form( "Adding input %s", ((AliTriggerInput*)detInp->At(i))->GetName() ) );
920 inputs.AddLast( detInp->At(i) );
921 }
922 }
923 }
924
925 // check if the condition is compatible with the triggers inputs
926 Int_t ndesc = fClasses.GetEntriesFast();
927 Bool_t check = kTRUE;
928 ULong64_t mask = 0L;
929 for( Int_t j=0; j<ndesc; j++ ) {
930 AliTriggerClass *trclass = (AliTriggerClass*)fClasses.At( j );
931 if( !(trclass->CheckClass( this )) ) check = kFALSE;
932 else {
933 if (trclass->IsActive(this->GetInputs(),this->GetFunctions())) {
934 AliInfo( Form( "Trigger Class (%s) OK, class mask (0x%Lx)",
935 trclass->GetName(), trclass->GetMask( ) ) );
936 }
937 else {
938 AliWarning( Form( "Trigger Class (%s) is NOT active, class mask (0x%Lx)",
939 trclass->GetName(), trclass->GetMask( ) ) );
940 }
941 }
942 // check if condition mask is duplicated
943 if( mask & trclass->GetMask() ) {
944 AliError( Form("Class (%s). The class mask (0x%Lx) is ambiguous. It was already defined",
945 trclass->GetName(), trclass->GetMask() ) );
946 check = kFALSE;
947 }
948 mask |= trclass->GetMask();
949 }
950
951 return check;
952}
953
895affe8 954//_____________________________________________________________________________
955void AliTriggerConfiguration::Reset()
956{
957 for( Int_t j=0; j<fInputs.GetEntriesFast(); j++ )
958 ((AliTriggerInput*)fInputs.At(j))->Reset();
959
960 for( Int_t j=0; j<fClasses.GetEntriesFast(); j++ )
961 ((AliTriggerClass*)fClasses.At(j))->Reset();
962}
51f6d619 963
964//_____________________________________________________________________________
965void AliTriggerConfiguration::Print( const Option_t* ) const
966{
967 // Print
968 cout << "#################################################" << endl;
969 cout << "Trigger Configuration:" << endl;
970 cout << " Name: " << GetName() << endl;
971 cout << " Description: " << GetTitle() << endl;
509b7052 972 cout << " Version: " << GetVersion() << endl;
51f6d619 973 cout << " Active Detectors: " << GetActiveDetectors() << endl;
974 cout << " Trigger Detectors: " << GetTriggeringDetectors() << endl;
975
976 cout << "#################################################" << endl;
977 fInputs.Print();
978 cout << "#################################################" << endl;
979 fInteractions.Print();
980 cout << "#################################################" << endl;
981 fFunctions.Print();
982 cout << "#################################################" << endl;
983 fDescriptors.Print();
984 cout << "#################################################" << endl;
985 fClusters.Print();
986 cout << "#################################################" << endl;
987 fPFProtections.Print();
988 cout << "#################################################" << endl;
989 fMasks.Print();
990 cout << "#################################################" << endl;
991 fClasses.Print();
992 cout << "#################################################" << endl;
993
994 cout << endl;
995}
996
997
998//////////////////////////////////////////////////////////////////////////////
999// Helper method
1000
1001//_____________________________________________________________________________
1002Bool_t AliTriggerConfiguration::IsSelected( TString detName, TString& detectors ) const
1003{
1004 // check whether detName is contained in detectors
1005 // if yes, it is removed from detectors
1006
1007 // check if all detectors are selected
1008 if( (detectors.CompareTo("ALL") == 0 ) ||
1009 detectors.BeginsWith("ALL ") ||
1010 detectors.EndsWith(" ALL") ||
1011 detectors.Contains(" ALL ") ) {
1012 detectors = "ALL";
1013 return kTRUE;
1014 }
1015
1016 // search for the given detector
1017 Bool_t result = kFALSE;
1018 if( (detectors.CompareTo( detName ) == 0) ||
1019 detectors.BeginsWith( detName+" " ) ||
1020 detectors.EndsWith( " "+detName ) ||
1021 detectors.Contains( " "+detName+" " ) ) {
1022 detectors.ReplaceAll( detName, "" );
1023 result = kTRUE;
1024 }
1025
1026 // clean up the detectors string
1027 while( detectors.Contains(" ") ) detectors.ReplaceAll( " ", " " );
1028 while( detectors.BeginsWith(" ") ) detectors.Remove( 0, 1 );
1029 while( detectors.EndsWith(" ") ) detectors.Remove( detectors.Length()-1, 1 );
1030
1031 return result;
1032}