1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
18 // This class which defines defines the Trigger Configuration
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).
23 // All the information conained in the CTP configuration file used
24 // online during the data taking
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.
30 // Example how to create a Trigger Configuration:
32 // AliTriggerConfiguration config( "TEST", "Test Configuration" );
34 // // Define a Cluster Detector
35 // config.AddDetectorCluster( "VZERO ZDC MUON" );
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)
43 // config.AddCondition( "VZERO_TEST2_L0 & MUON_SMinus_HPt_L0 & ZDC_TEST1_L0",
48 // config.AddCondition( "VZERO_TEST3_L0 | MUON_Unlike_LPt_L0 | ZDC_TEST3_L0",
52 // config.CheckInputsConditions("Config.C");
55 // // save the configuration to file
56 // // (default file name $ALICE_ROOT/data/triggerConfigurations.root)
57 // config.WriteConfiguration(); or config.WriteConfiguration( filename );
59 ///////////////////////////////////////////////////////////////////////////////
60 #include <Riostream.h>
65 #include <TObjString.h>
66 #include <TObjArray.h>
73 #include "AliRunLoader.h"
74 #include "AliModule.h"
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"
86 ClassImp(AliTriggerConfiguration)
88 const TString AliTriggerConfiguration::fgkConfigurationFileName("/data/triggerConfigurations.root");
90 //_____________________________________________________________________________
91 AliTriggerConfiguration::AliTriggerConfiguration():
102 // Default constructor
105 //_____________________________________________________________________________
106 AliTriggerConfiguration::AliTriggerConfiguration( TString & name, TString & description ):
107 TNamed( name, description ),
120 //_____________________________________________________________________________
121 AliTriggerConfiguration::~AliTriggerConfiguration()
126 fInteractions.SetOwner();
127 fInteractions.Delete();
128 fFunctions.SetOwner();
130 fPFProtections.SetOwner();
131 fPFProtections.Delete();
134 fDescriptors.SetOwner();
135 fDescriptors.Delete();
136 fClusters.SetOwner();
142 //_____________________________________________________________________________
143 Bool_t AliTriggerConfiguration::AddInput( AliTriggerInput* input )
145 // Add a trigger input to
146 // the list of the trigger inputs
147 if (fInputs.GetEntries() < kNMaxInputs) {
148 fInputs.AddLast( input );
152 AliError("CTP can handle up to 50 inputs ! Impossible to add the required input !");
157 //_____________________________________________________________________________
158 AliTriggerInput* AliTriggerConfiguration::AddInput( TString &name, TString &det,
159 UChar_t level, UInt_t signature,
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)) {
173 //_____________________________________________________________________________
174 AliTriggerInteraction* AliTriggerConfiguration::AddInteraction(TString &name, TString &logic)
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)) {
187 //_____________________________________________________________________________
188 Bool_t AliTriggerConfiguration::AddInteraction(AliTriggerInteraction *interact)
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 );
198 AliError("Invalid interaction ! Impossible to add it !");
201 AliError("CTP can handle up to 2 interactions ! Impossible to add the required interaction !");
206 //_____________________________________________________________________________
207 AliTriggerInteraction* AliTriggerConfiguration::AddFunction(TString &name, TString &logic)
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)) {
220 //_____________________________________________________________________________
221 Bool_t AliTriggerConfiguration::AddFunction(AliTriggerInteraction *func)
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 );
231 AliError("Invalid logical function ! Impossible to add it !");
234 AliError("CTP can handle up to 2 logical functions ! Impossible to add the required interaction !");
239 //_____________________________________________________________________________
240 Bool_t AliTriggerConfiguration::AddPFProtection( AliTriggerPFProtection* pfp )
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 );
250 AliError("Invalid past-future protection ! Impossible to add it !");
253 AliError("CTP can handle up to 4 past-future protections ! Impossible to add the required protection !");
258 //_____________________________________________________________________________
259 AliTriggerBCMask* AliTriggerConfiguration::AddMask( TString &name, TString &mask )
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)) {
272 //_____________________________________________________________________________
273 Bool_t AliTriggerConfiguration::AddMask( AliTriggerBCMask* mask )
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 );
282 AliError("CTP can handle up to 4 bunch-crossing masks ! Impossible to add the required mask !");
287 //_____________________________________________________________________________
288 AliTriggerCluster* AliTriggerConfiguration::AddCluster( TString &name, UChar_t index, TString &detectors)
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)) {
302 //_____________________________________________________________________________
303 Bool_t AliTriggerConfiguration::AddCluster( AliTriggerCluster* cluster )
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 );
314 AliError("Empty trigger cluster ! Impossible to add it !");
317 AliError("CTP can handle up to 6 different detector clusters ! Impossible to add the required cluster !");
322 //_____________________________________________________________________________
323 TString AliTriggerConfiguration::GetActiveDetectors() const
325 // Return an string with all active detector
328 TString activeDet = "";
330 Int_t nclus = fClusters.GetEntriesFast();
331 if( !nclus ) return activeDet;
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() );
346 //_____________________________________________________________________________
347 TString AliTriggerConfiguration::GetTriggeringDetectors() const
349 // Return an string with all detectors
350 // used for triggering
354 Int_t ninputs = fInputs.GetEntriesFast();
355 if( !ninputs ) return trDet;
357 for( Int_t j=0; j<ninputs; j++ ) {
358 TString detStr = ((AliTriggerInput*)fInputs.At(j))->GetDetector();
359 if( trDet.Contains( detStr ) ) continue;
361 trDet.Append( detStr );
366 //_____________________________________________________________________________
367 TString AliTriggerConfiguration::GetTriggeringModules() const
369 // Return an string with all detectors (modules in the AliRoot
370 // simulation sense) used for triggering
374 Int_t ninputs = fInputs.GetEntriesFast();
375 if( !ninputs ) return trDet;
377 for( Int_t j=0; j<ninputs; j++ ) {
378 TString detStr = ((AliTriggerInput*)fInputs.At(j))->GetModule();
379 if( trDet.Contains( detStr ) ) continue;
381 trDet.Append( detStr );
386 //_____________________________________________________________________________
387 AliTriggerDescriptor* AliTriggerConfiguration::AddDescriptor( TString &name, TString &cond )
389 // Add a trigger descriptor to
390 // the list of the trigger descriptors
391 AliTriggerDescriptor *desc = new AliTriggerDescriptor(name,cond);
392 if (!AddDescriptor(desc)) {
400 //_____________________________________________________________________________
401 Bool_t AliTriggerConfiguration::AddDescriptor( AliTriggerDescriptor *desc )
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 );
411 AliError("Invalid trigger desciptor ! Impossible to add it !");
414 AliError("CTP can handle up to 50 different descriptors ! Impossible to add the required descriptor !");
419 //_____________________________________________________________________________
420 Bool_t AliTriggerConfiguration::AddClass( AliTriggerClass *trclass )
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 );
430 AliError("Invalid trigger class ! Impossible to add it !");
433 AliError("CTP can handle up to 50 different classes ! Impossible to add the required class !");
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)
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 !");
450 if (!fClusters.FindObject(clus)) {
451 AliError("Invalid cluster ! Impossible to add the class !");
454 if (!fPFProtections.FindObject(pfp)) {
455 AliError("Invalid past-future protection ! Impossible to add the class !");
458 if (!fMasks.FindObject(mask)) {
459 AliError("Invalid bunch-crossing mask ! Impossible to add the class !");
462 AliTriggerClass* trclass = new AliTriggerClass( name,index,desc,clus,pfp,mask,prescaler,allrare );
463 if (!AddClass(trclass)) {
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)
477 // Add a new trigger class
478 if (!fDescriptors.FindObject(desc)) {
479 AliError("Invalid descriptor ! Impossible to add the class !");
482 if (!fClusters.FindObject(clus)) {
483 AliError("Invalid cluster ! Impossible to add the class !");
486 if (!fPFProtections.FindObject(pfp)) {
487 AliError("Invalid past-future protection ! Impossible to add the class !");
490 if (!fMasks.FindObject(mask)) {
491 AliError("Invalid bunch-crossing mask ! Impossible to add the class !");
494 AliTriggerClass* trclass = new AliTriggerClass( this, name,index,desc,clus,pfp,mask,prescaler,allrare );
495 if (!AddClass(trclass)) {
503 //_____________________________________________________________________________
504 AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration( TString & configuration)
506 // Load one pre-created Configurations from database/file that match
507 // with the input string 'configuration'
508 // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
509 // By default the files are stored in GRP/CTP folder.
510 // The filename is constructed as: GRP/CTP/<configuration>.cfg
512 // Load the selected configuration
514 if (configuration.EndsWith(".cfg") ||
515 configuration.EndsWith(".shuttle")) {
516 filename = configuration;
519 filename = gSystem->Getenv("ALICE_ROOT");
520 filename += "/GRP/CTP/";
521 filename += configuration;
525 if( gSystem->AccessPathName( filename.Data() ) ) {
526 AliErrorClass( Form( "file (%s) not found", filename.Data() ) );
531 ifstream *file = new ifstream ( filename.Data() );
533 AliErrorClass(Form("Error opening file (%s) !",filename.Data()));
539 AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
543 while (strLine.ReadLine(*file)) {
544 if (strLine.BeginsWith("#")) continue;
545 if (strLine.BeginsWith("INPUTS:")) {
549 if (strLine.BeginsWith("INTERACTIONS:")) {
553 if (strLine.BeginsWith("DESCRIPTORS:")) {
557 if (strLine.BeginsWith("CLUSTERS:")) {
561 if (strLine.BeginsWith("PFS:")) {
565 if (strLine.BeginsWith("BCMASKS:")) {
569 if (strLine.BeginsWith("CLASSES:")) {
573 strLine.ReplaceAll("*",'!');
574 TObjArray *tokens = strLine.Tokenize(" \t");
575 Int_t ntokens = tokens->GetEntriesFast();
580 AliErrorClass(Form("Invalid trigger input syntax (%s)!",strLine.Data()));
585 cfg->AddInput(((TObjString*)tokens->At(0))->String(),
586 ((TObjString*)tokens->At(1))->String(),
587 ((TObjString*)tokens->At(2))->String().Atoi(),
588 ((TObjString*)tokens->At(3))->String().Atoi(),
589 ((TObjString*)tokens->At(4))->String().Atoi());
592 // Read intreractions
593 cfg->AddInteraction(((TObjString*)tokens->At(0))->String(),
594 ((TObjString*)tokens->At(1))->String());
597 // Read logical functions and descriptors
598 if (((TObjString*)tokens->At(0))->String().BeginsWith("l0f")) {
600 cfg->AddFunction(((TObjString*)tokens->At(0))->String(),
601 strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
604 cfg->AddDescriptor(((TObjString*)tokens->At(0))->String(),
605 strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
611 for(Int_t i = 2; i < ntokens; i++) {
612 strTemp += ((TObjString*)tokens->At(i))->String();
615 cfg->AddCluster(((TObjString*)tokens->At(0))->String(),
616 ((TObjString*)tokens->At(1))->String().Atoi(),
622 AliTriggerPFProtection *pfp = NULL;
623 if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0) {
624 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String());
627 pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String(),
628 ((TObjString*)tokens->At(1))->String(),
629 ((TObjString*)tokens->At(2))->String(),
630 ((TObjString*)tokens->At(3))->String());
631 pfp->SetNa1(((TObjString*)tokens->At(4))->String().Atoi());
632 pfp->SetNa2(((TObjString*)tokens->At(5))->String().Atoi());
633 pfp->SetNb1(((TObjString*)tokens->At(6))->String().Atoi());
634 pfp->SetNb2(((TObjString*)tokens->At(7))->String().Atoi());
635 pfp->SetTa(((TObjString*)tokens->At(8))->String().Atoi());
636 pfp->SetTb(((TObjString*)tokens->At(9))->String().Atoi());
638 cfg->AddPFProtection(pfp);
642 if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
643 cfg->AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
645 cfg->AddMask(((TObjString*)tokens->At(0))->String(),
646 ((TObjString*)tokens->At(1))->String());
651 AliTriggerClass *trclass = new AliTriggerClass(cfg,
652 ((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String().Atoi(),
653 ((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
654 ((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
655 ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(0))->String().Atoi()));
656 cfg->AddClass(trclass);
671 //_____________________________________________________________________________
672 TObjArray* AliTriggerConfiguration::GetAvailableConfigurations( const char* filename )
674 // Return an array of configuration in the file
678 path += gSystem->Getenv( "ALICE_ROOT" );
679 path += fgkConfigurationFileName;
684 if( gSystem->AccessPathName( path.Data() ) ) {
685 AliErrorGeneral( "AliTriggerConfiguration", Form( "file (%s) not found", path.Data() ) );
689 TObjArray* desArray = new TObjArray();
691 TFile file( path.Data(), "READ" );
692 if( file.IsZombie() ) {
693 AliErrorGeneral( "AliTriggerConfiguration", Form( "Error opening file (%s)", path.Data() ) );
700 TIter next( file.GetListOfKeys() );
701 while( (key = (TKey*)next()) ) {
702 TObject* obj = key->ReadObj();
703 if( obj->InheritsFrom( "AliTriggerConfiguration" ) ) {
704 desArray->AddLast( obj );
712 //_____________________________________________________________________________
713 void AliTriggerConfiguration::WriteConfiguration( const char* filename )
715 // Write the configuration
718 path += gSystem->Getenv("ALICE_ROOT");
719 path += fgkConfigurationFileName;
724 TFile file( path.Data(), "UPDATE" );
725 if( file.IsZombie() ) {
726 AliErrorGeneral( "AliTriggerConfiguration",
727 Form( "Can't open file (%s)", path.Data() ) );
731 Bool_t result = (Write( GetName(), TObject::kOverwrite ) != 0);
733 AliErrorGeneral( "AliTriggerConfiguration",
734 Form( "Can't write entry to file <%s>!", path.Data() ) );
738 //_____________________________________________________________________________
739 Bool_t AliTriggerConfiguration::CheckConfiguration( TString& configfile )
741 // To be used on the pre-creation of Configurations to check if the
742 // conditions have valid inputs names.
744 // Initiate detectors modules from a Config file
745 // Ask to each active module present in the fDetectorCluster
746 // to create a Trigger detector and retrive the inputs from it
747 // to create a list of inputs.
748 // Each condition in the configuration is then checked agains
749 // the list of inputs
753 AliError( "no gAlice object. Restart aliroot and try again." );
756 if (gAlice->Modules()->GetEntries() > 0) {
757 AliError( "gAlice was already run. Restart aliroot and try again." );
761 AliInfo( Form( "initializing gAlice with config file %s",
762 configfile.Data() ) );
763 StdoutToAliInfo( StderrToAliError(
764 gAlice->Init( configfile.Data() );
767 AliRunLoader* runLoader = gAlice->GetRunLoader();
769 AliError( Form( "gAlice has no run loader object. "
770 "Check your config file: %s", configfile.Data() ) );
774 // get the possible inputs to check the condition
776 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
778 TString detStr = GetTriggeringModules();
780 for( Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++ ) {
781 AliModule* det = (AliModule*) detArray->At(iDet);
782 if( !det || !det->IsActive() ) continue;
783 if( IsSelected( det->GetName(), detStr ) ) {
784 AliInfo( Form( "Creating inputs for %s", det->GetName() ) );
785 AliTriggerDetector* dtrg = det->CreateTriggerDetector();
786 dtrg->CreateInputs(GetInputs());
787 TObjArray* detInp = dtrg->GetInputs();
788 for( Int_t i=0; i<detInp->GetEntriesFast(); i++ ) {
789 AliInfo( Form( "Adding input %s", ((AliTriggerInput*)detInp->At(i))->GetName() ) );
790 inputs.AddLast( detInp->At(i) );
795 // check if the condition is compatible with the triggers inputs
796 Int_t ndesc = fClasses.GetEntriesFast();
797 Bool_t check = kTRUE;
799 for( Int_t j=0; j<ndesc; j++ ) {
800 AliTriggerClass *trclass = (AliTriggerClass*)fClasses.At( j );
801 if( !(trclass->CheckClass( this )) ) check = kFALSE;
803 if (trclass->IsActive(this->GetInputs(),this->GetFunctions())) {
804 AliInfo( Form( "Trigger Class (%s) OK, class mask (0x%Lx)",
805 trclass->GetName(), trclass->GetMask( ) ) );
808 AliWarning( Form( "Trigger Class (%s) is NOT active, class mask (0x%Lx)",
809 trclass->GetName(), trclass->GetMask( ) ) );
812 // check if condition mask is duplicated
813 if( mask & trclass->GetMask() ) {
814 AliError( Form("Class (%s). The class mask (0x%Lx) is ambiguous. It was already defined",
815 trclass->GetName(), trclass->GetMask() ) );
818 mask |= trclass->GetMask();
824 //_____________________________________________________________________________
825 void AliTriggerConfiguration::Reset()
827 for( Int_t j=0; j<fInputs.GetEntriesFast(); j++ )
828 ((AliTriggerInput*)fInputs.At(j))->Reset();
830 for( Int_t j=0; j<fClasses.GetEntriesFast(); j++ )
831 ((AliTriggerClass*)fClasses.At(j))->Reset();
834 //_____________________________________________________________________________
835 void AliTriggerConfiguration::Print( const Option_t* ) const
838 cout << "#################################################" << endl;
839 cout << "Trigger Configuration:" << endl;
840 cout << " Name: " << GetName() << endl;
841 cout << " Description: " << GetTitle() << endl;
842 cout << " Active Detectors: " << GetActiveDetectors() << endl;
843 cout << " Trigger Detectors: " << GetTriggeringDetectors() << endl;
845 cout << "#################################################" << endl;
847 cout << "#################################################" << endl;
848 fInteractions.Print();
849 cout << "#################################################" << endl;
851 cout << "#################################################" << endl;
852 fDescriptors.Print();
853 cout << "#################################################" << endl;
855 cout << "#################################################" << endl;
856 fPFProtections.Print();
857 cout << "#################################################" << endl;
859 cout << "#################################################" << endl;
861 cout << "#################################################" << endl;
867 //////////////////////////////////////////////////////////////////////////////
870 //_____________________________________________________________________________
871 Bool_t AliTriggerConfiguration::IsSelected( TString detName, TString& detectors ) const
873 // check whether detName is contained in detectors
874 // if yes, it is removed from detectors
876 // check if all detectors are selected
877 if( (detectors.CompareTo("ALL") == 0 ) ||
878 detectors.BeginsWith("ALL ") ||
879 detectors.EndsWith(" ALL") ||
880 detectors.Contains(" ALL ") ) {
885 // search for the given detector
886 Bool_t result = kFALSE;
887 if( (detectors.CompareTo( detName ) == 0) ||
888 detectors.BeginsWith( detName+" " ) ||
889 detectors.EndsWith( " "+detName ) ||
890 detectors.Contains( " "+detName+" " ) ) {
891 detectors.ReplaceAll( detName, "" );
895 // clean up the detectors string
896 while( detectors.Contains(" ") ) detectors.ReplaceAll( " ", " " );
897 while( detectors.BeginsWith(" ") ) detectors.Remove( 0, 1 );
898 while( detectors.EndsWith(" ") ) detectors.Remove( detectors.Length()-1, 1 );