]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliTriggerConfiguration.cxx
Removing variable shadowing
[u/mrichter/AliRoot.git] / STEER / AliTriggerConfiguration.cxx
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>
61 //#include <cstdlib>
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>
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
86 ClassImp(AliTriggerConfiguration)
87
88 const TString AliTriggerConfiguration::fgkConfigurationFileName("/data/triggerConfigurations.root");
89
90 //_____________________________________________________________________________
91 AliTriggerConfiguration::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 //_____________________________________________________________________________
106 AliTriggerConfiguration::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 //_____________________________________________________________________________
121 AliTriggerConfiguration::~AliTriggerConfiguration() 
122
123   // Destructor
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 //_____________________________________________________________________________
143 Bool_t AliTriggerConfiguration::AddInput( AliTriggerInput* input )
144 {
145   // Add a trigger input to
146   // the list of the trigger inputs
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 //_____________________________________________________________________________
158 AliTriggerInput* AliTriggerConfiguration::AddInput( TString &name, TString &det,
159                                                     UChar_t level, UInt_t signature,
160                                                     UChar_t number )
161 {
162   // Add a trigger input to
163   // the list of the trigger inputs
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 //_____________________________________________________________________________
174 AliTriggerInteraction* AliTriggerConfiguration::AddInteraction(TString &name, TString &logic)
175 {
176   // Add a trigger interaction object to
177   // the list of the trigger interactions
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 //_____________________________________________________________________________
188 Bool_t  AliTriggerConfiguration::AddInteraction(AliTriggerInteraction *interact)
189 {
190   // Add a trigger interaction object to
191   // the list of the trigger interactions
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 //_____________________________________________________________________________
207 AliTriggerInteraction* AliTriggerConfiguration::AddFunction(TString &name, TString &logic)
208 {
209   // Add a trigger function object to
210   // the list of the trigger functions
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 //_____________________________________________________________________________
221 Bool_t  AliTriggerConfiguration::AddFunction(AliTriggerInteraction *func)
222 {
223   // Add a trigger function object to
224   // the list of the trigger functions
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 //_____________________________________________________________________________
240 Bool_t AliTriggerConfiguration::AddPFProtection( AliTriggerPFProtection* pfp )
241 {
242   // Add a trigger past-future protection object to
243   // the list of the trigger past-future protections
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 //_____________________________________________________________________________
259 AliTriggerBCMask* AliTriggerConfiguration::AddMask( TString &name, TString &mask )
260 {
261   // Add a trigger bunch-crossing mask object to
262   // the list of the trigger bunch-crossing masks
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 //_____________________________________________________________________________
273 Bool_t AliTriggerConfiguration::AddMask( AliTriggerBCMask* mask )
274 {
275   // Add a trigger bunch-crossing mask object to
276   // the list of the trigger bunch-crossing masks
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 //_____________________________________________________________________________
288 AliTriggerCluster* AliTriggerConfiguration::AddCluster( TString &name, UChar_t index, TString &detectors)
289 {
290   // Add a trigger detector readout cluster to
291   // the list of the trigger clusters
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 //_____________________________________________________________________________
303 Bool_t AliTriggerConfiguration::AddCluster( AliTriggerCluster* cluster )
304 {
305   // Add a trigger detector readout cluster to
306   // the list of the trigger clusters
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 //_____________________________________________________________________________
323 TString AliTriggerConfiguration::GetActiveDetectors() const
324 {
325   // Return an string with all active detector
326   // from each cluster
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 k=0; k<ndet; ++k ) {
338          if( activeDet.Contains( ((TObjString*)det->At(k))->String() ) )continue;
339          activeDet.Append( " " );
340          activeDet.Append( ((TObjString*)det->At(k))->String() );
341       }
342    }
343    return activeDet;
344 }
345
346 //_____________________________________________________________________________
347 TString AliTriggerConfiguration::GetTriggeringDetectors() const
348 {
349   // Return an string with all detectors
350   // used for triggering
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 //_____________________________________________________________________________
367 TString 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 //_____________________________________________________________________________
387 AliTriggerDescriptor* AliTriggerConfiguration::AddDescriptor( TString &name, TString &cond )
388 {
389   // Add a trigger descriptor to
390   // the list of the trigger descriptors
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 //_____________________________________________________________________________
401 Bool_t AliTriggerConfiguration::AddDescriptor( AliTriggerDescriptor *desc )
402 {
403   // Add a trigger descriptor to
404   // the list of the trigger descriptors
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 //_____________________________________________________________________________
420 Bool_t AliTriggerConfiguration::AddClass( AliTriggerClass *trclass )
421 {
422   // Add a trigger class to
423   // the list of the trigger classes
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 //_____________________________________________________________________________
439 AliTriggerClass *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 {
444   // Add a trigger class to
445   // the list of the trigger classes
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 //_____________________________________________________________________________
472 AliTriggerClass *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 //_____________________________________________________________________________
504 Bool_t AliTriggerConfiguration::ProcessConfigurationLine(const char* line, Int_t& level)
505 {
506     // processes one line of configuration
507
508      TString strLine(line);
509
510      if (strLine.BeginsWith("#")) return kTRUE;
511      if (strLine.BeginsWith("INPUTS:")) {
512        level = 1;
513        return kTRUE;
514      }
515      if (strLine.BeginsWith("INTERACTIONS:")) {
516        level = 2;
517        return kTRUE;
518      }
519      if (strLine.BeginsWith("DESCRIPTORS:")) {
520        level = 3;
521        return kTRUE;
522      }
523      if (strLine.BeginsWith("CLUSTERS:")) {
524        level = 4;
525        return kTRUE;
526      }
527      if (strLine.BeginsWith("PFS:")) {
528        level = 5;
529        return kTRUE;
530      }
531      if (strLine.BeginsWith("BCMASKS:")) {
532        level = 6;
533        return kTRUE;
534      }
535      if (strLine.BeginsWith("CLASSES:")) {
536        level = 7;
537        return kTRUE;
538      }
539
540      strLine.ReplaceAll("*",'!');
541      TObjArray *tokens = strLine.Tokenize(" \t");
542      Int_t ntokens = tokens->GetEntriesFast();
543      if (ntokens == 0)
544      {
545        delete tokens;
546        return kTRUE;
547      }
548      switch (level) {
549      case 1:
550        // Read inputs
551        if (ntokens != 5) {
552          AliError(Form("Invalid trigger input syntax (%s)!",strLine.Data()));
553          return kFALSE;
554        }
555        AddInput(((TObjString*)tokens->At(0))->String(),
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:
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(),
568                            ((TObjString*)tokens->At(1))->String());
569        break;
570      case 3:
571        // Read logical functions and descriptors
572        if (ntokens < 2) {
573          AliError(Form("Invalid trigger descriptor syntax (%s)!",strLine.Data()));
574          return kFALSE;
575        }
576        if (((TObjString*)tokens->At(0))->String().BeginsWith("l0f")) {
577          // function
578          AddFunction(((TObjString*)tokens->At(0))->String(),
579                           strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
580        }
581        else {
582          AddDescriptor(((TObjString*)tokens->At(0))->String(),
583                             strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
584        }
585        break;
586      case 4:
587        {
588          if (ntokens < 2) {
589            AliError(Form("Invalid trigger cluster syntax (%s)!",strLine.Data()));
590            return kFALSE;
591          }
592          TString strTemp;
593          for(Int_t i = 2; i < ntokens; i++) {
594            strTemp += ((TObjString*)tokens->At(i))->String();
595            strTemp += " ";
596          }
597          AddCluster(((TObjString*)tokens->At(0))->String(),
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 {
609            if (ntokens != 10) {
610              AliError(Form("Invalid trigger pfs syntax (%s)!",strLine.Data()));
611              return kFALSE;
612            }
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          }
624          AddPFProtection(pfp);
625        }
626        break;
627      case 6:
628          if (ntokens > 2) {
629            AliError(Form("Invalid trigger bcmasks syntax (%s)!",strLine.Data()));
630            return kFALSE;
631          }
632        if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
633          AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
634        else {
635          AddMask(((TObjString*)tokens->At(0))->String(),
636                       ((TObjString*)tokens->At(1))->String());
637        }
638        break;
639      case 7:
640        {
641          if (ntokens != 8) {
642            AliError(Form("Invalid trigger class syntax (%s)!",strLine.Data()));
643            return kFALSE;
644          }
645          AliTriggerClass *trclass = new AliTriggerClass(this,
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(),
649                                                         ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()));
650          AddClass(trclass);
651        }
652      default:
653        break;
654      }
655      delete tokens;
656
657      return kTRUE;
658 }
659
660 //_____________________________________________________________________________
661 AliTriggerConfiguration* 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      }
708    }
709
710    file->close();
711    delete file;
712
713    return cfg;
714 }
715
716 //_____________________________________________________________________________
717 AliTriggerConfiguration* 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;
746 }
747
748 //_____________________________________________________________________________
749 TObjArray* 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 //_____________________________________________________________________________
790 void 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 //_____________________________________________________________________________
816 Bool_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
901 //_____________________________________________________________________________
902 void 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 }
910
911 //_____________________________________________________________________________
912 void 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 //_____________________________________________________________________________
948 Bool_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 }