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 **************************************************************************/
17 //-----------------------------------------------------------------------------
18 /// \class AliMUONReconstructor
20 /// Implementation of AliReconstructor for MUON subsystem.
22 /// The clustering mode and the associated parameters can be changed through the
23 /// AliMUONRecoParam object set in the reconstruction macro or read from the CDB
24 /// (see methods in AliMUONRecoParam.h file for details)
28 /// SIMPLEFIT : use the AliMUONClusterFinderSimpleFit clusterizer
30 /// SIMPLEFITV3 : SIMPLEFIT with preclustering=PRECLUSTERV3
32 /// MLEM : use AliMUONClusterFinderMLEM and AliMUONPreClusterFinder for preclustering (default)
33 /// MLEMV2 : MLEM with preclustering=PRECLUSTERV2
34 /// MLEMV3 : MLEM with preclustering=PRECLUSTERV3
36 /// PRECLUSTER : use only AliMUONPreClusterFinder. Only for debug as
37 /// the produced clusters do not have a position, hence the tracking will not
39 /// PRECLUSTERV2 : another version of the preclustering
40 /// PRECLUSTERV3 : yet another version of the preclustering
42 /// COG : use AliMUONClusterFinderCOG clusterizer. Not really a production
43 /// option either, as center-of-gravity is generally not a good estimate
44 /// of the cluster position...
46 /// PEAKCOG : COG cluster finder around local maxima
47 /// PEAKFIT : fit around local maxima with up to 3 peaks, COG otherwise
49 /// NOCLUSTERING : bypass completely the clustering stage
53 /// The behavior of the MUON reconstruction can also be changed, besides
54 /// the usual methods found in AliReconstruction (e.g. to disable tracking)
55 /// by using AliReconstruction::SetOption("MUON",options)
56 /// where options should be a space separated string.
58 /// Valid options are :
60 /// SAVEDIGITS : if you want to save in the TreeD the *calibrated* digits
61 /// that are used for the clustering
63 /// DIGITSTOREV1 : use the V1 implementation of the digitstore
64 /// DIGITSTOREV2R : use the V2R implementation of the digitstore
66 /// NOLOCALRECONSTRUCTION : for debug, to disable local reconstruction (and hence
67 /// "recover" old behavior)
69 /// TRIGGERDISABLE : disable the treatment of MUON trigger
71 /// ENABLEERRORLOGGING : enable error logging (this activates also warnings in RawStreamTracker)
73 /// \author Laurent Aphecetche, Subatech
74 //-----------------------------------------------------------------------------
76 #include "AliMUONReconstructor.h"
78 #include "AliMUONCalibrationData.h"
79 #include "AliMUONClusterFinderCOG.h"
80 #include "AliMUONClusterFinderMLEM.h"
81 #include "AliMUONClusterFinderSimpleFit.h"
82 #include "AliMUONClusterFinderPeakCOG.h"
83 #include "AliMUONClusterFinderPeakFit.h"
84 #include "AliMUONClusterStoreV1.h"
85 #include "AliMUONClusterStoreV2.h"
86 #include "AliMUONConstants.h"
87 #include "AliMUONDigitCalibrator.h"
88 #include "AliMUONDigitMaker.h"
89 #include "AliMUONDigitStoreV1.h"
90 #include "AliMUONDigitStoreV2R.h"
91 #include "AliMUONGeometryTransformer.h"
92 #include "AliMUONPadStatusMaker.h"
93 #include "AliMUONPreClusterFinder.h"
94 #include "AliMUONPreClusterFinderV2.h"
95 #include "AliMUONPreClusterFinderV3.h"
96 #include "AliMUONSimpleClusterServer.h"
97 #include "AliMUONTracker.h"
98 #include "AliMUONTriggerCircuit.h"
99 #include "AliMUONTriggerStoreV1.h"
100 #include "AliMUONVClusterFinder.h"
101 #include "AliMUONVClusterServer.h"
102 #include "AliMUONVTrackStore.h"
103 #include "AliMUONTriggerElectronics.h"
104 #include "AliMUONTriggerUtilities.h"
106 #include "AliMpArea.h"
107 #include "AliMpCDB.h"
108 #include "AliMpConstants.h"
109 #include "AliMpDDLStore.h"
110 #include "AliMpSegmentation.h"
112 #include "AliRawReader.h"
113 #include "AliCDBManager.h"
114 #include "AliCodeTimer.h"
116 #include "AliRunInfo.h"
118 #include <Riostream.h>
119 #include <TObjArray.h>
120 #include <TClonesArray.h>
125 ClassImp(AliMUONReconstructor)
128 //_____________________________________________________________________________
129 AliMUONReconstructor::AliMUONReconstructor() :
132 fTransformer(new AliMUONGeometryTransformer()),
134 fTriggerCircuit(0x0),
135 fCalibrationData(0x0),
136 fDigitCalibrator(0x0),
140 fTriggerProcessor(0x0),
141 fTriggerUtilities(0x0),
144 fShouldCalibrate(kTRUE)
150 // Unload mapping objects
151 // if they have been loaded from the obsolete OCDB mapping objects
153 if ( AliMpDDLStore::Instance(false) ) {
154 AliCDBManager::Instance()->UnloadFromCache("MUON/Calib/DDLStore");
155 delete AliMpDDLStore::Instance();
158 if ( AliMpSegmentation::Instance(false) ) {
159 AliCDBManager::Instance()->UnloadFromCache("MUON/Calib/Mapping");
160 delete AliMpSegmentation::Instance();
164 if ( ! AliMpCDB::LoadDDLStore() ) {
165 AliFatal("Could not access mapping from OCDB !");
168 // Load geometry data
169 fTransformer->LoadGeometryData();
171 fClusterServers.SetOwner(kTRUE);
172 fTrackers.SetOwner(kTRUE);
175 //_____________________________________________________________________________
176 AliMUONReconstructor::~AliMUONReconstructor()
182 delete fDigitCalibrator;
187 delete fTriggerCircuit;
188 delete fTriggerStore;
190 delete fClusterStore;
191 delete fTriggerProcessor;
192 delete fTriggerUtilities;
194 delete AliMpSegmentation::Instance(false);
195 delete AliMpDDLStore::Instance(false);
197 delete fCalibrationData;
200 //_____________________________________________________________________________
202 AliMUONReconstructor::Calibrate(AliMUONVDigitStore& digitStore) const
204 /// Calibrate the digitStore
205 if (!fDigitCalibrator)
210 if ( fShouldCalibrate )
212 AliCodeTimerAuto(Form("%s::Calibrate(AliMUONVDigitStore*)",fDigitCalibrator->ClassName()),0)
213 fDigitCalibrator->Calibrate(digitStore);
217 //_____________________________________________________________________________
219 AliMUONReconstructor::ConvertDigits(AliRawReader* rawReader,
220 AliMUONVDigitStore* digitStore,
221 AliMUONVTriggerStore* triggerStore) const
223 /// Convert raw data into digit and trigger stores
226 // Skip reconstruction if event is Calibration
227 if ( GetRecoParam()->GetEventSpecie() == AliRecoParam::kCalib ) {
228 digitStore->Clear(); // Remove possible digits from previous event
229 triggerStore->Clear(); // Remove possible triggers from previous event
230 AliInfo("Calibration event: do not convert digits");
234 AliCodeTimerStart(Form("%s::Raw2Digits(AliRawReader*,AliMUONVDigitStore*,AliMUONVTriggerStore*)",
235 fDigitMaker->ClassName()))
236 fDigitMaker->Raw2Digits(rawReader,digitStore,triggerStore);
237 AliCodeTimerStop(Form("%s::Raw2Digits(AliRawReader*,AliMUONVDigitStore*,AliMUONVTriggerStore*)",
238 fDigitMaker->ClassName()))
239 Calibrate(*digitStore);
242 //_____________________________________________________________________________
244 AliMUONReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digitsTree) const
246 /// convert raw data into a digit tree
247 AliCodeTimerAuto("",0)
249 Bool_t alone = ( TriggerStore() == 0 );
251 Bool_t ok = DigitStore()->Connect(*digitsTree,alone);
252 if ( TriggerStore() )
254 ok = ok && TriggerStore()->Connect(*digitsTree,kFALSE);
259 AliError("Could not make branches on TreeD");
263 ConvertDigits(rawReader,DigitStore(),TriggerStore());
264 AliCodeTimerStart("Fill digits")
266 AliCodeTimerStop("Fill digits")
267 DigitStore()->Clear();
271 //_____________________________________________________________________________
273 AliMUONReconstructor::CreateDigitMaker() const
275 /// Create (and create if necessary) the digit maker
276 if (fDigitMaker) return;
278 AliCodeTimerAuto("",0)
280 TString option = GetOption();
282 Bool_t enableErrorLogging = kFALSE;
284 if (option.Contains("ENABLEERRORLOGGING"))
286 enableErrorLogging = kTRUE;
289 fDigitMaker = new AliMUONDigitMaker(enableErrorLogging);
292 // Always make trigger digits
293 // (needed when calculating trigger chamber efficiency)
294 fDigitMaker->SetMakeTriggerDigits(kTRUE);
296 if ( GetRecoParam()->TryRecover() )
298 fDigitMaker->SetTryRecover(kTRUE);
302 fDigitMaker->SetTryRecover(kFALSE);
306 //_____________________________________________________________________________
308 AliMUONReconstructor::CreateTriggerCircuit() const
310 /// Return (and create if necessary) the trigger circuit object
311 if (fTriggerCircuit) return;
313 AliCodeTimerAuto("",0)
315 fTriggerCircuit = new AliMUONTriggerCircuit(fTransformer);
319 //_____________________________________________________________________________
321 AliMUONReconstructor::CreateTriggerUtilities() const
323 /// Return (and create if necessary) the trigger utilities object
324 if ( fTriggerUtilities ) return;
326 AliCodeTimerAuto("",0)
328 if ( ! fCalibrationData ) CreateCalibrationData();
330 fTriggerUtilities = new AliMUONTriggerUtilities(fCalibrationData);
333 //_____________________________________________________________________________
335 AliMUONReconstructor::CreateTracker() const
337 /// Create the MUONTracker object
339 CreateTriggerCircuit();
340 CreateTriggerUtilities();
342 const AliMUONRecoParam* rp = GetRecoParam();
344 Int_t es = rp->GetEventSpecie();
346 AliTracker* tracker = static_cast<AliTracker*>(fTrackers.At(es));
350 if ( ! rp->CombineClusterTrackReco() )
352 tracker = new AliMUONTracker(rp,
359 AliInfo(Form("Created tracker %p for recoparam of type %s es=%d",
361 AliRecoParam::GetEventSpecieName(AliRecoParam::Convert(rp->GetEventSpecie())),es));
366 tracker = new AliMUONTracker(rp,
367 CreateClusterServer(*rp),
373 AliInfo(Form("Created (combined) tracker %p for recoparam of type %s es=%d",
375 AliRecoParam::GetEventSpecieName(AliRecoParam::Convert(rp->GetEventSpecie())),es));
378 fTrackers.AddAtAndExpand(tracker,es);
385 //_____________________________________________________________________________
386 AliMUONVClusterFinder*
387 AliMUONReconstructor::CreateClusterFinder(const char* clusterFinderType)
389 /// Create a given cluster finder instance
391 AliCodeTimerAutoGeneral("",0)
393 AliMUONVClusterFinder* clusterFinder(0x0);
395 TString opt(clusterFinderType);
398 if ( strstr(opt,"PRECLUSTERV2") )
400 clusterFinder = new AliMUONPreClusterFinderV2;
402 else if ( strstr(opt,"PRECLUSTERV3") )
404 clusterFinder = new AliMUONPreClusterFinderV3;
406 else if ( strstr(opt,"PRECLUSTER") )
408 clusterFinder = new AliMUONPreClusterFinder;
410 else if ( strstr(opt,"PEAKCOG") )
412 clusterFinder = new AliMUONClusterFinderPeakCOG(kFALSE,new AliMUONPreClusterFinder);
414 else if ( strstr(opt,"PEAKFIT") )
416 clusterFinder = new AliMUONClusterFinderPeakFit(kFALSE,new AliMUONPreClusterFinder);
418 else if ( strstr(opt,"COG") )
420 clusterFinder = new AliMUONClusterFinderCOG(new AliMUONPreClusterFinder);
422 else if ( strstr(opt,"SIMPLEFITV3") )
424 clusterFinder = new AliMUONClusterFinderSimpleFit(new AliMUONClusterFinderCOG(new AliMUONPreClusterFinderV3));
426 else if ( strstr(opt,"SIMPLEFIT") )
428 clusterFinder = new AliMUONClusterFinderSimpleFit(new AliMUONClusterFinderCOG(new AliMUONPreClusterFinder));
430 else if ( strstr(opt,"MLEM:DRAW") )
432 clusterFinder = new AliMUONClusterFinderMLEM(kTRUE,new AliMUONPreClusterFinder);
434 else if ( strstr(opt,"MLEMV3") )
436 clusterFinder = new AliMUONClusterFinderMLEM(kFALSE,new AliMUONPreClusterFinderV3);
438 else if ( strstr(opt,"MLEMV2") )
440 clusterFinder = new AliMUONClusterFinderMLEM(kFALSE,new AliMUONPreClusterFinderV2);
442 else if ( strstr(opt,"MLEM") )
444 clusterFinder = new AliMUONClusterFinderMLEM(kFALSE,new AliMUONPreClusterFinder);
448 AliErrorClass(Form("clustering mode \"%s\" does not exist",opt.Data()));
452 return clusterFinder;
455 //_____________________________________________________________________________
456 AliMUONVClusterServer*
457 AliMUONReconstructor::CreateClusterServer(const AliMUONRecoParam& rp) const
459 /// Create cluster server
461 AliCodeTimerAuto("",0);
463 AliMUONVClusterServer* clusterServer = static_cast<AliMUONVClusterServer*>(fClusterServers.At(rp.GetEventSpecie()));
467 AliMUONVClusterFinder* clusterFinder = CreateClusterFinder(rp.GetClusteringMode());
469 if ( !clusterFinder ) return 0x0;
471 clusterServer = new AliMUONSimpleClusterServer(clusterFinder,*fTransformer);
473 AliInfo(Form("Created AliMUONSimpleClusterServer (%p) for specie %d with clustering = %s (following requesting clustering mode %s)",
474 clusterServer,rp.GetEventSpecie(),clusterFinder->ClassName(),rp.GetClusteringMode()));
476 fClusterServers.AddAtAndExpand(clusterServer,rp.GetEventSpecie());
479 return clusterServer;
482 //_____________________________________________________________________________
484 AliMUONReconstructor::CreateCalibrationData() const
486 /// Create the calibrator
488 AliCodeTimerAuto("",0);
490 Int_t runNumber = AliCDBManager::Instance()->GetRun();
492 fCalibrationData = new AliMUONCalibrationData(runNumber);
493 if ( !fCalibrationData->IsValid() )
495 AliError("Could not retrieve calibrations !");
496 delete fCalibrationData;
497 fCalibrationData = 0x0;
501 // It is now time to check whether we have everything to proceed.
502 // What we need depends on whether both tracker and trigger
503 // are in the readout chain, and what specific "bad channel policy"
506 Bool_t kTracker(kFALSE);
507 Bool_t kTrigger(kFALSE);
509 const AliRunInfo* runInfo = GetRunInfo();
512 AliError("Could not get runinfo ?");
516 TString detectors(runInfo->GetActiveDetectors());
517 if (detectors.Contains("MUONTRK")) kTracker=kTRUE;
518 if (detectors.Contains("MUONTRG")) kTrigger=kTRUE;
521 AliInfo(Form("Run with MUON TRIGGER : %s and MUON TRACKER : %s",
522 kTrigger ? "YES":"NO" ,
523 kTracker ? "YES":"NO"));
527 // Check that we get all the calibrations we'll need
528 if ( !fCalibrationData->Pedestals() ||
529 !fCalibrationData->Gains() )
531 AliFatal(Form("Could not access all required calibration data (PED %p GAIN %p)",
532 fCalibrationData->Pedestals(),fCalibrationData->Gains()));
535 if ( !fCalibrationData->HV() )
537 // Special treatment of HV. We only break if the values
538 // are not there *AND* we cut on them.
539 UInt_t mask = GetRecoParam()->PadGoodnessMask();
540 TString smask(AliMUONPadStatusMaker::AsCondition(mask));
541 if ( smask.Contains("HV") )
543 AliFatal("Could not access all required calibration data (HV)");
549 //_____________________________________________________________________________
551 AliMUONReconstructor::CreateCalibrator() const
553 /// Create the calibrator
555 AliCodeTimerAuto("",0);
557 if ( ! fCalibrationData )
558 CreateCalibrationData();
560 AliInfo("Calibration will occur.");
562 TString opt(GetOption());
565 if ( strstr(opt,"NOSTATUSMAP") )
567 AliWarning("NOSTATUSMAP is obsolete");
570 Bool_t kTracker(kFALSE);
572 const AliRunInfo* runInfo = GetRunInfo();
575 AliError("Could not get runinfo ?");
579 TString detectors(runInfo->GetActiveDetectors());
580 if (detectors.Contains("MUONTRK")) kTracker=kTRUE;
585 fDigitCalibrator = new AliMUONDigitCalibrator(*fCalibrationData,GetRecoParam());
589 AliWarning("Apparently running without MCH so will not instantiante the DigitCalibrator nor read MCH OCDB objects...");
590 fShouldCalibrate=kFALSE;
594 //_____________________________________________________________________________
596 AliMUONReconstructor::ResponseRemovingChambers(AliMUONVTriggerStore* triggerStore) const
598 /// Update trigger information with informatins obtained after
599 /// re-calculation of trigger response
600 AliCodeTimerAuto("",0);
602 if ( ! fCalibrationData )
603 CreateCalibrationData();
605 if ( ! fTriggerProcessor )
606 fTriggerProcessor = new AliMUONTriggerElectronics(fCalibrationData);
608 fTriggerProcessor->ResponseRemovingChambers(*triggerStore);
611 //_____________________________________________________________________________
613 AliMUONReconstructor::DigitStore() const
615 /// Return (and create if necessary) the digit container
618 TString sopt(GetOption());
621 AliInfo(Form("Options=%s",sopt.Data()));
623 if ( sopt.Contains("DIGITSTOREV1") )
625 fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV1");
627 else if ( sopt.Contains("DIGITSTOREV2R") )
629 fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV2R");
631 else if ( sopt.Contains("DIGITSTOREV2S") )
633 fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV2S");
636 if (!fDigitStore) fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV2R");
638 AliInfo(Form("Will use %s to store digits during reconstruction",fDigitStore->ClassName()));
643 //_____________________________________________________________________________
645 AliMUONReconstructor::FillTreeR(AliMUONVTriggerStore* triggerStore,
646 TTree& clustersTree) const
648 /// Write the trigger and cluster information into TreeR
650 AliCodeTimerAuto("",0)
653 Bool_t alone(kTRUE); // is trigger the only info in TreeR ?
655 const AliMUONRecoParam* rp = GetRecoParam();
657 if ( ! rp->CombineClusterTrackReco() )
659 alone = kFALSE; // we'll get both tracker and trigger information in TreeR
664 ResponseRemovingChambers(triggerStore);
665 ok = triggerStore->Connect(clustersTree,alone);
668 AliError("Could not create triggerStore branches in TreeR");
676 fClusterStore = new AliMUONClusterStoreV2;
679 AliMUONVClusterServer* clusterServer = CreateClusterServer(*rp);
681 TIter next(DigitStore()->CreateIterator());
682 clusterServer->UseDigits(next,DigitStore());
686 AliDebug(1,Form("Doing full clusterization in local reconstruction using %s ",clusterServer->ClassName()));
688 for ( Int_t i = 0; i < AliMpConstants::NofTrackingChambers(); ++i )
690 if (rp->UseChamber(i))
692 if ( ( i == 6 || i == 7 ) && rp->BypassSt4() ) continue;
693 if ( ( i == 8 || i == 9 ) && rp->BypassSt5() ) continue;
695 clusterServer->Clusterize(i,*fClusterStore,area,rp);
699 Bool_t cok = fClusterStore->Connect(clustersTree,alone);
701 if (!cok) AliError("Could not connect clusterStore to clusterTree");
703 AliDebug(1,Form("Number of clusters found = %d",fClusterStore->GetSize()));
705 StdoutToAliDebug(1,fClusterStore->Print());
708 if (ok) // at least one type of branches created successfully
713 if (fClusterStore) fClusterStore->Clear();
716 //_____________________________________________________________________________
717 const AliMUONRecoParam* AliMUONReconstructor::GetRecoParam()
719 /// Get the recoparam from reconstruction
720 return dynamic_cast<const AliMUONRecoParam*>(AliReconstructor::GetRecoParam(AliReconstruction::GetDetIndex("MUON")));
724 //_____________________________________________________________________________
726 AliMUONReconstructor::HasDigitConversion() const
728 /// We *do* have digit conversion, but we might advertise it only
729 /// if we want to save the digits.
731 TString opt(GetOption());
733 if ( opt.Contains("SAVEDIGITS" ) && !opt.Contains("NOLOCALRECONSTRUCTION") )
743 //_____________________________________________________________________________
745 AliMUONReconstructor::Reconstruct(AliRawReader* rawReader, TTree* clustersTree) const
747 /// This method is called by AliReconstruction if HasLocalReconstruction()==kTRUE AND
748 /// HasDigitConversion()==kFALSE
752 AliError("clustersTree is 0x0 !");
756 ConvertDigits(rawReader,DigitStore(),TriggerStore());
758 FillTreeR(TriggerStore(),*clustersTree);
761 //_____________________________________________________________________________
763 AliMUONReconstructor::Reconstruct(TTree* digitsTree, TTree* clustersTree) const
765 /// This method is called by AliReconstruction if HasLocalReconstruction()==kTRUE
766 /// AND HasDigitConversion()==kTRUE
768 AliCodeTimerAuto("",0)
772 if (!digitsTree || !clustersTree)
774 AliError(Form("Tree is null : digitsTree=%p clustersTree=%p",
775 digitsTree,clustersTree));
781 fDigitStore = AliMUONVDigitStore::Create(*digitsTree);
784 AliError(Form("Could not get DigitStore from %s",digitsTree->GetName()));
788 AliInfo(Form("Created %s from %s",fDigitStore->ClassName(),digitsTree->GetName()));
793 fTriggerStore = AliMUONVTriggerStore::Create(*digitsTree);
796 AliError(Form("Could not get TriggerStore from %s",digitsTree->GetName()));
800 AliInfo(Form("Created %s from %s",fTriggerStore->ClassName(),digitsTree->GetName()));
804 if (!fTriggerStore && !fDigitStore)
806 AliError("No store at all. Nothing to do.");
810 // insure we start with empty stores
813 fDigitStore->Clear();
814 Bool_t alone = ( fTriggerStore ? kFALSE : kTRUE );
815 Bool_t ok = fDigitStore->Connect(*digitsTree,alone);
818 AliError("Could not connect digitStore to digitsTree");
824 fTriggerStore->Clear();
825 Bool_t alone = ( fDigitStore ? kFALSE : kTRUE );
826 Bool_t ok = fTriggerStore->Connect(*digitsTree,alone);
829 AliError("Could not connect triggerStore to digitsTree");
834 digitsTree->GetEvent(0);
838 // Insure we got calibrated digits (if we reconstruct from pure simulated,
839 // i.e. w/o going through raw data, this will be the case)
840 TIter next(fDigitStore->CreateIterator());
841 AliMUONVDigit* digit = static_cast<AliMUONVDigit*>(next());
842 if (digit && !digit->IsCalibrated())
844 Calibrate(*fDigitStore);
848 FillTreeR(fTriggerStore,*clustersTree);
851 //_____________________________________________________________________________
852 AliMUONVTriggerStore*
853 AliMUONReconstructor::TriggerStore() const
855 /// Return (and create if necessary and allowed) the trigger container
856 TString sopt(GetOption());
859 if (sopt.Contains("TRIGGERDISABLE"))
861 delete fTriggerStore;
868 fTriggerStore = new AliMUONTriggerStoreV1;
871 return fTriggerStore;