2 // Author: Artur Szostak
3 // email: artur@alice.phy.uct.ac.za
8 #include "AliRunLoader.h"
11 #include "AliMUONDataInterface.h"
12 #include "AliMUONLocalTrigger.h"
13 #include "AliMUONHit.h"
14 #include "AliMUONDigit.h"
15 #include "AliMUONRawCluster.h"
18 ClassImp(AliMUONDataInterface)
21 AliMUONDataInterface::AliMUONDataInterface()
22 : TObject(), fData(NULL, "MUON", "MUON")
24 // Set all internal pointers to NULL and indices to -1.
29 AliMUONDataInterface::AliMUONDataInterface(const AliMUONDataInterface& rhs)
32 // Protected copy constructor
34 Fatal("AliMUONDataInterface", "Not implemented.");
37 AliMUONDataInterface::~AliMUONDataInterface()
39 // Delete the runloader when done.
40 // If the runloader is not to be deleted then call Reset just before
41 // the destructor is called.
43 if (fRunloader != NULL)
48 AliMUONDataInterface::operator=(const AliMUONDataInterface& rhs)
50 // Protected assignement operator
52 if (this == &rhs) return *this;
54 Fatal("operator=", "Not implemented.");
60 void AliMUONDataInterface::Reset()
62 // Sets all internal pointers to NULL and indices to -1.
63 // Note: No resources are released!
64 // Specificaly AliRunLoader is not deleted.
72 fHitAddressSet = kFALSE;
73 fSDigitAddressSet = kFALSE;
74 fDigitAddressSet = kFALSE;
75 fClusterAddressSet = kFALSE;
76 fTriggerAddressSet = kFALSE;
80 Bool_t AliMUONDataInterface::LoadLoaders(TString filename, TString foldername)
82 // Load the run and muon loaders from the specified file and folder.
83 // kTRUE is returned on success and kFALSE on failure.
85 fRunloader = AliRunLoader::Open(filename, foldername, "READ");
86 if (fRunloader == NULL)
88 Error("LoadLoaders", "Could not find or load the run loader for the file: %s and folder: %s",
89 (const char*)filename, (const char*)foldername);
92 fMuonloader = fRunloader->GetLoader("MUONLoader");
93 if (fMuonloader == NULL)
95 Error("LoadLoaders", "Could not find the MUON loader in file: %s and folder: %s",
96 (const char*)filename, (const char*)foldername);
101 // Need to connect the muon loader to the AliMUONData object,
102 // else class to fData will return NULL.
103 fData.SetLoader(fMuonloader);
105 fFilename = filename;
106 fFoldername = foldername;
107 fEventnumber = -1; // Reset the event number to force the event to be loaded.
112 Bool_t AliMUONDataInterface::FetchLoaders(TString filename, TString foldername)
114 // Fetch the run loader and muon loader objects from memory if they already exist,
115 // or from memory if they do not.
116 // If the currently loaded run loader (if any) is not refering to the file and folder
117 // we are interested in then it is deleted and reopened with the required file and
120 if (fRunloader == NULL)
122 fRunloader = AliRunLoader::GetRunLoader();
123 if (fRunloader == NULL)
124 return LoadLoaders(filename, foldername);
126 // Fetch the current file and folder names.
127 fFilename = fRunloader->GetFileName();
128 fFoldername = fRunloader->GetEventFolder()->GetName();
131 // If filename or foldername are not the same as the ones currently selected then
133 if ( filename.CompareTo(fFilename) != 0 || foldername.CompareTo(fFoldername) != 0 )
136 return LoadLoaders(filename, foldername);
142 Bool_t AliMUONDataInterface::FetchEvent(Int_t event)
144 // Fetch the specified event from the runloader and reset all the track, cathode
145 // and address flags to force them to be reloaded.
147 if (fEventnumber < 0)
149 fEventnumber = fRunloader->GetEventNumber();
153 fHitAddressSet = kFALSE;
154 fSDigitAddressSet = kFALSE;
155 fDigitAddressSet = kFALSE;
156 fClusterAddressSet = kFALSE;
157 fTriggerAddressSet = kFALSE;
159 if ( event != fEventnumber )
161 if ( fRunloader->GetEvent(event) < 0 ) return kFALSE;
162 fEventnumber = event;
166 fHitAddressSet = kFALSE;
167 fSDigitAddressSet = kFALSE;
168 fDigitAddressSet = kFALSE;
169 fClusterAddressSet = kFALSE;
170 fTriggerAddressSet = kFALSE;
176 Bool_t AliMUONDataInterface::FetchTreeK()
178 // Fetch the Kine tree from the current run loader.
180 if (fRunloader->TreeK() == NULL)
182 fRunloader->LoadKinematics("READ");
183 if (fRunloader->TreeK() == NULL)
185 Error("FetchTreeK", "Could not load TreeK.");
193 Bool_t AliMUONDataInterface::FetchTreeH()
195 // Fetch the Hits tree from the current muon loader.
196 // Set all the required addresses etc...
198 if (fMuonloader->TreeH() == NULL)
200 fMuonloader->LoadHits("READ");
201 if (fMuonloader->TreeH() == NULL)
203 Error("FetchTreeH", "Could not load TreeH.");
206 fData.SetTreeAddress("H");
207 fHitAddressSet = kTRUE;
209 else if ( ! fHitAddressSet )
211 fData.SetTreeAddress("H");
212 fHitAddressSet = kTRUE;
218 Bool_t AliMUONDataInterface::FetchTreeS()
220 // Fetch the S-Digits tree from the current muon loader.
221 // Set all the required addresses etc...
223 if (fMuonloader->TreeS() == NULL)
225 fMuonloader->LoadSDigits("READ");
226 if (fMuonloader->TreeS() == NULL)
228 Error("FetchTreeS", "Could not load TreeS.");
231 fData.SetTreeAddress("S");
232 fSDigitAddressSet = kTRUE;
234 else if ( ! fSDigitAddressSet )
236 fData.SetTreeAddress("S");
237 fSDigitAddressSet = kTRUE;
243 Bool_t AliMUONDataInterface::FetchTreeD()
245 // Fetch the digits tree from the current muon loader.
246 // Set all the required addresses etc...
248 if (fMuonloader->TreeD() == NULL)
250 fMuonloader->LoadDigits("READ");
251 if (fMuonloader->TreeD() == NULL)
253 Error("FetchTreeD", "Could not load TreeD.");
256 fData.SetTreeAddress("D");
257 fDigitAddressSet = kTRUE;
259 else if ( ! fDigitAddressSet )
261 fData.SetTreeAddress("D");
262 fDigitAddressSet = kTRUE;
268 Bool_t AliMUONDataInterface::FetchTreeR()
270 // Fetch the reconstructed objects tree from the current muon loader.
271 // Nore: The addresses must still be set.
273 if (fMuonloader->TreeR() == NULL)
275 fMuonloader->LoadRecPoints("READ");
276 if (fMuonloader->TreeR() == NULL)
278 Error("FetchTreeR", "Could not load TreeR.");
282 // Need to reset these flags so that the cluster and trigger address
283 // gets reset after this method.
284 fClusterAddressSet = kFALSE;
285 fTriggerAddressSet = kFALSE;
291 Int_t AliMUONDataInterface::NumberOfEvents(TString filename, TString foldername)
293 // Returns the number of events in the specified file/folder, and -1 on error.
295 if ( ! FetchLoaders(filename, foldername) ) return -1;
296 return fRunloader->GetNumberOfEvents();
300 Int_t AliMUONDataInterface::NumberOfParticles(TString filename, TString foldername, Int_t event)
302 // Returns the number of events in the specified file/folder, and -1 on error.
304 if ( ! FetchLoaders(filename, foldername) ) return -1;
305 if ( ! FetchEvent(event) ) return -1;
306 if ( ! FetchTreeK() ) return -1;
307 return (Int_t) fRunloader->TreeK()->GetEntriesFast();
311 TParticle* AliMUONDataInterface::Particle(
312 TString filename, TString foldername, Int_t event, Int_t particle
315 // Returns the specified particle in the given file, folder and event.
316 // NULL is returned on error.
318 if ( ! FetchLoaders(filename, foldername) ) return NULL;
319 if ( ! FetchEvent(event) ) return NULL;
320 if ( ! FetchTreeK() ) return NULL;
322 TTree* treeK = fRunloader->TreeK();
324 treeK->GetBranch("Particles")->SetAddress(&p);
325 treeK->GetEvent(particle);
330 Int_t AliMUONDataInterface::NumberOfTracks(TString filename, TString foldername, Int_t event)
332 // Returns the number of tracks in the specified file/folder and event.
333 // -1 is returned on error.
335 if ( ! FetchLoaders(filename, foldername) ) return -1;
336 if ( ! FetchEvent(event) ) return -1;
337 if ( ! FetchTreeH() ) return -1;
338 return fData.GetNtracks();
342 Int_t AliMUONDataInterface::NumberOfHits(
343 TString filename, TString foldername, Int_t event, Int_t track
346 // Returns the number of hits in the specified file/folder, event and track.
347 // -1 is returned on error.
349 if ( ! FetchLoaders(filename, foldername) ) return -1;
350 if ( ! FetchEvent(event) ) return -1;
351 if ( ! FetchTreeH() ) return -1;
353 if (fTrack < 0 || fTrack != track)
356 fData.GetTrack(track);
359 return fData.Hits()->GetEntriesFast();
363 AliMUONHit* AliMUONDataInterface::Hit(
364 TString filename, TString foldername, Int_t event,
365 Int_t track, Int_t hit
368 // Returns the specified hit in the given file, folder, event and track.
369 // NULL is returned on error.
371 if ( ! FetchLoaders(filename, foldername) ) return NULL;
372 if ( ! FetchEvent(event) ) return NULL;
373 if ( ! FetchTreeH() ) return NULL;
375 if (fTrack < 0 || fTrack != track)
378 fData.GetTrack(track);
381 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
385 Int_t AliMUONDataInterface::NumberOfSDigits(
386 TString filename, TString foldername, Int_t event,
387 Int_t chamber, Int_t cathode
390 // Returns the number of s-digits in the given file, folder, event,
391 // chamber and cathode. -1 is returned on error.
393 Assert( 0 <= chamber && chamber <= 13 );
394 Assert( 0 <= cathode && cathode <= 1 );
396 if ( ! FetchLoaders(filename, foldername) ) return -1;
397 if ( ! FetchEvent(event) ) return -1;
398 if ( ! FetchTreeS() ) return -1;
400 if ( fSCathode != cathode )
402 fData.ResetSDigits();
403 fData.GetCathodeS(cathode);
406 return fData.SDigits(chamber)->GetEntriesFast();
410 AliMUONDigit* AliMUONDataInterface::SDigit(
411 TString filename, TString foldername, Int_t event,
412 Int_t chamber, Int_t cathode, Int_t sdigit
415 // Returns the specified s-digit in the given file, folder, event,
416 // chamber and cathode. NULL is returned on error.
418 Assert( 0 <= chamber && chamber <= 13 );
419 Assert( 0 <= cathode && cathode <= 1 );
421 if ( ! FetchLoaders(filename, foldername) ) return NULL;
422 if ( ! FetchEvent(event) ) return NULL;
423 if ( ! FetchTreeS() ) return NULL;
425 if ( fSCathode != cathode )
427 fData.ResetSDigits();
428 fData.GetCathodeS(cathode);
431 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
435 Int_t AliMUONDataInterface::NumberOfDigits(
436 TString filename, TString foldername, Int_t event,
437 Int_t chamber, Int_t cathode
440 // Returns the number of digits in the given file, folder, event,
441 // chamber and cathode. -1 is returned on error.
442 Assert( 0 <= chamber && chamber <= 13 );
443 Assert( 0 <= cathode && cathode <= 1 );
445 if ( ! FetchLoaders(filename, foldername) ) return -1;
446 if ( ! FetchEvent(event) ) return -1;
447 if ( ! FetchTreeD() ) return -1;
449 if ( fCathode != cathode )
452 fData.GetCathode(cathode);
455 return fData.Digits(chamber)->GetEntriesFast();
459 AliMUONDigit* AliMUONDataInterface::Digit(
460 TString filename, TString foldername, Int_t event,
461 Int_t chamber, Int_t cathode, Int_t digit
464 // Returns the specified digit in the given file, folder, event,
465 // chamber and cathode. NULL is returned on error.
467 Assert( 0 <= chamber && chamber <= 13 );
468 Assert( 0 <= cathode && cathode <= 1 );
470 if ( ! FetchLoaders(filename, foldername) ) return NULL;
471 if ( ! FetchEvent(event) ) return NULL;
472 if ( ! FetchTreeD() ) return NULL;
474 if ( fCathode != cathode )
477 fData.GetCathode(cathode);
480 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
484 Int_t AliMUONDataInterface::NumberOfRawClusters(
485 TString filename, TString foldername, Int_t event, Int_t chamber
488 // Returns the number of raw clusters in the specified file, folder, event and chamber.
489 // -1 is returned or error.
491 Assert( 0 <= chamber && chamber <= 13 );
492 if ( ! FetchLoaders(filename, foldername) ) return -1;
493 if ( ! FetchEvent(event) ) return -1;
494 if ( ! FetchTreeR() ) return -1;
495 if ( ! fClusterAddressSet )
497 // If the raw cluster address in TreeR is not set yet then set it now.
498 fData.SetTreeAddress("RC");
499 fData.ResetRawClusters();
500 fData.GetRawClusters();
501 fClusterAddressSet = kTRUE;
503 return fData.RawClusters(chamber)->GetEntriesFast();
507 AliMUONRawCluster* AliMUONDataInterface::RawCluster(
508 TString filename, TString foldername, Int_t event,
509 Int_t chamber, Int_t cluster
512 // Fetch the specified raw cluster from the given file, folder, event and chamber number.
513 // NULL is returned on error.
515 Assert( 0 <= chamber && chamber <= 13 );
516 if ( ! FetchLoaders(filename, foldername) ) return NULL;
517 if ( ! FetchEvent(event) ) return NULL;
518 if ( ! FetchTreeR() ) return NULL;
519 if ( ! fClusterAddressSet )
521 // If the raw cluster address in TreeR is not set yet then set it now.
522 fData.SetTreeAddress("RC");
523 fData.ResetRawClusters();
524 fData.GetRawClusters();
525 fClusterAddressSet = kTRUE;
527 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
531 Int_t AliMUONDataInterface::NumberOfLocalTriggers(TString filename, TString foldername, Int_t event)
533 // Return the number of local trigger objects in the specified file, folder and
534 // event number. -1 is returned on error.
536 if ( ! FetchLoaders(filename, foldername) ) return -1;
537 if ( ! FetchEvent(event) ) return -1;
538 if ( ! FetchTreeR() ) return -1;
539 if ( ! fTriggerAddressSet )
541 // If the local trigger address in TreeR is not set yet then set it now.
542 fData.SetTreeAddress("GLT");
543 fData.ResetTrigger();
545 fTriggerAddressSet = kTRUE;
547 return fData.LocalTrigger()->GetEntriesFast();
551 AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(
552 TString filename, TString foldername, Int_t event, Int_t trigger
555 // Fetch the specified local trigger object from the given file, folder and event number.
556 // NULL is returned on error.
558 if ( ! FetchLoaders(filename, foldername) ) return NULL;
559 if ( ! FetchEvent(event) ) return NULL;
560 if ( ! FetchTreeR() ) return NULL;
561 if ( ! fTriggerAddressSet )
563 // If the local trigger address in TreeR is not set yet then set it now.
564 fData.SetTreeAddress("GLT");
565 fData.ResetTrigger();
567 fTriggerAddressSet = kTRUE;
569 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );
573 Bool_t AliMUONDataInterface::SetFile(TString filename, TString foldername)
575 // Set the current file and folder from which to fetch data.
576 // kTRUE is returned if the run and muon loaders were found, else kFALSE.
578 return FetchLoaders(filename, foldername);
582 Bool_t AliMUONDataInterface::GetEvent(Int_t event)
584 // Select the current event from which to fetch data.
585 // kTRUE is returned if the event was found, else kFALSE is returned.
587 return FetchEvent(event);
591 Int_t AliMUONDataInterface::NumberOfEvents()
593 // Get the number of events in the currently selected file.
594 // -1 is returned on error.
596 if (fRunloader == NULL)
598 Error("NumberOfEvents", "File not set.");
601 return fRunloader->GetNumberOfEvents();
605 Int_t AliMUONDataInterface::NumberOfParticles()
607 // Get the number of particles in the current event.
608 // -1 is returned on error.
610 if (fRunloader == NULL)
612 Error("NumberOfParticles", "File not set.");
615 if ( ! FetchTreeK() ) return -1;
616 return (Int_t) fRunloader->TreeK()->GetEntriesFast();
620 TParticle* AliMUONDataInterface::Particle(Int_t particle)
622 // Fetch the specified particle from the current event.
623 // NULL is returned on error.
625 if (fRunloader == NULL)
627 Error("Particle", "File not set.");
630 if (fEventnumber < 0)
632 Error("Particle", "Event not chosen.");
635 if ( ! FetchTreeK() ) return NULL;
636 TTree* treeK = fRunloader->TreeK();
638 treeK->GetBranch("Particles")->SetAddress(&p);
639 treeK->GetEvent(particle);
644 Int_t AliMUONDataInterface::NumberOfTracks()
646 // Get the number of tracks in the current event.
647 // -1 is returned on error.
649 if (fRunloader == NULL)
651 Error("NumberOfTracks", "File not set.");
654 if (fEventnumber < 0)
656 Error("NumberOfTracks", "Event not chosen.");
659 if ( ! FetchTreeH() ) return -1;
660 return fData.GetNtracks();
664 Int_t AliMUONDataInterface::NumberOfHits(Int_t track)
666 // Get the number of hits for the given track in the current event.
667 // -1 is returned on error.
669 if (fRunloader == NULL)
671 Error("NumberOfHits", "File not set.");
674 if (fEventnumber < 0)
676 Error("NumberOfHits", "Event not chosen.");
679 if ( ! FetchTreeH() ) return -1;
680 if (fTrack < 0 || fTrack != track)
683 fData.GetTrack(track);
686 return fData.Hits()->GetEntriesFast();
690 AliMUONHit* AliMUONDataInterface::Hit(Int_t track, Int_t hit)
692 // Fetch the specified hit from the current event.
693 // NULL is returned on error.
695 if (fRunloader == NULL)
697 Error("Hit", "File not set.");
700 if (fEventnumber < 0)
702 Error("Hit", "Event not chosen.");
705 if ( ! FetchTreeH() ) return NULL;
706 if (fTrack < 0 || fTrack != track)
709 fData.GetTrack(track);
712 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
716 Int_t AliMUONDataInterface::NumberOfSDigits(Int_t chamber, Int_t cathode)
718 // Get the number of s-digits on the chamber, cathode in the current event.
719 // -1 is returned on error.
721 Assert( 0 <= chamber && chamber <= 13 );
722 Assert( 0 <= cathode && cathode <= 1 );
724 if (fRunloader == NULL)
726 Error("NumberOfSDigits", "File not set.");
729 if (fEventnumber < 0)
731 Error("NumberOfSDigits", "Event not chosen.");
735 if ( ! FetchTreeS() ) return -1;
736 if ( fSCathode != cathode )
738 fData.ResetSDigits();
739 fData.GetCathodeS(cathode);
742 return fData.SDigits(chamber)->GetEntriesFast();
746 AliMUONDigit* AliMUONDataInterface::SDigit(Int_t chamber, Int_t cathode, Int_t sdigit)
748 // Fetch the specified s-digits on the chamber, cathode from the current event.
749 // NULL is returned on error.
751 Assert( 0 <= chamber && chamber <= 13 );
752 Assert( 0 <= cathode && cathode <= 1 );
754 if (fRunloader == NULL)
756 Error("SDigit", "File not set.");
759 if (fEventnumber < 0)
761 Error("SDigit", "Event not chosen.");
765 if ( ! FetchTreeS() ) return NULL;
766 if ( fSCathode != cathode )
768 fData.ResetSDigits();
769 fData.GetCathodeS(cathode);
772 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
776 Int_t AliMUONDataInterface::NumberOfDigits(Int_t chamber, Int_t cathode)
778 // Get the number of digits on the chamber, cathode in the current event.
779 // -1 is returned on error.
781 Assert( 0 <= chamber && chamber <= 13 );
782 Assert( 0 <= cathode && cathode <= 1 );
784 if (fRunloader == NULL)
786 Error("NumberOfDigits", "File not set.");
789 if (fEventnumber < 0)
791 Error("NumberOfDigits", "Event not chosen.");
795 if ( ! FetchTreeD() ) return -1;
796 if ( fCathode != cathode )
799 fData.GetCathode(cathode);
802 return fData.Digits(chamber)->GetEntriesFast();
806 AliMUONDigit* AliMUONDataInterface::Digit(Int_t chamber, Int_t cathode, Int_t digit)
808 // Fetch the specified digits on the chamber, cathode from the current event.
809 // NULL is returned on error.
811 Assert( 0 <= chamber && chamber <= 13 );
812 Assert( 0 <= cathode && cathode <= 1 );
814 if (fRunloader == NULL)
816 Error("Digit", "File not set.");
819 if (fEventnumber < 0)
821 Error("Digit", "Event not chosen.");
825 if ( ! FetchTreeD() ) return NULL;
826 if ( fCathode != cathode )
829 fData.GetCathode(cathode);
832 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
836 Int_t AliMUONDataInterface::NumberOfRawClusters(Int_t chamber)
838 // Get the number of raw clusters on the given chamber in the current event.
839 // -1 is returned on error.
841 Assert( 0 <= chamber && chamber <= 13 );
843 if (fRunloader == NULL)
845 Error("NumberOfRawClusters", "File not set.");
848 if (fEventnumber < 0)
850 Error("NumberOfRawClusters", "Event not chosen.");
854 if ( ! FetchTreeR() ) return -1;
855 if ( ! fClusterAddressSet )
857 fData.SetTreeAddress("RC");
858 fData.ResetRawClusters();
859 fData.GetRawClusters();
860 fClusterAddressSet = kTRUE;
862 return fData.RawClusters(chamber)->GetEntriesFast();
866 AliMUONRawCluster* AliMUONDataInterface::RawCluster(Int_t chamber, Int_t cluster)
868 // Fetch the specified raw cluster on the given chamber from the current event.
869 // NULL is returned on error.
871 Assert( 0 <= chamber && chamber <= 13 );
873 if (fRunloader == NULL)
875 Error("RawCluster", "File not set.");
878 if (fEventnumber < 0)
880 Error("RawCluster", "Event not chosen.");
884 if ( ! FetchTreeR() ) return NULL;
885 if ( ! fClusterAddressSet )
887 fData.SetTreeAddress("RC");
888 fData.ResetRawClusters();
889 fData.GetRawClusters();
890 fClusterAddressSet = kTRUE;
892 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
896 Int_t AliMUONDataInterface::NumberOfLocalTriggers()
898 // Get the number of local trigger objects in the current event.
899 // -1 is returned on error.
901 if (fRunloader == NULL)
903 Error("NumberOfLocalTriggers", "File not set.");
906 if (fEventnumber < 0)
908 Error("NumberOfLocalTriggers", "Event not chosen.");
912 if ( ! FetchTreeR() ) return -1;
913 if ( ! fTriggerAddressSet )
915 fData.SetTreeAddress("GLT");
916 fData.ResetTrigger();
918 fTriggerAddressSet = kTRUE;
920 return fData.LocalTrigger()->GetEntriesFast();
924 AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(Int_t trigger)
926 // Fetch the specified local trigger object from the current event.
927 // NULL is returned on error.
929 if (fRunloader == NULL)
931 Error("LocalTrigger", "File not set.");
934 if (fEventnumber < 0)
936 Error("LocalTrigger", "Event not chosen.");
940 if ( ! FetchTreeR() ) return NULL;
941 if ( ! fTriggerAddressSet )
943 fData.SetTreeAddress("GLT");
944 fData.ResetTrigger();
946 fTriggerAddressSet = kTRUE;
948 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );