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