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"
19 ClassImp(AliMUONDataInterface)
22 AliMUONDataInterface::AliMUONDataInterface()
23 : TObject(), fData(NULL, "MUON", "MUON")
25 // Set all internal pointers to NULL and indices to -1.
30 AliMUONDataInterface::AliMUONDataInterface(const AliMUONDataInterface& rhs)
33 // Protected copy constructor
35 AliFatal("Not implemented.");
38 AliMUONDataInterface::~AliMUONDataInterface()
40 // Delete the runloader when done.
41 // If the runloader is not to be deleted then call Reset just before
42 // the destructor is called.
44 if (fRunloader != NULL)
49 AliMUONDataInterface::operator=(const AliMUONDataInterface& rhs)
51 // Protected assignement operator
53 if (this == &rhs) return *this;
55 AliFatal("Not implemented.");
61 void AliMUONDataInterface::Reset()
63 // Sets all internal pointers to NULL and indices to -1.
64 // Note: No resources are released!
65 // Specificaly AliRunLoader is not deleted.
73 fHitAddressSet = kFALSE;
74 fSDigitAddressSet = kFALSE;
75 fDigitAddressSet = kFALSE;
76 fClusterAddressSet = kFALSE;
77 fTriggerAddressSet = kFALSE;
81 Bool_t AliMUONDataInterface::LoadLoaders(TString filename, TString foldername)
83 // Load the run and muon loaders from the specified file and folder.
84 // kTRUE is returned on success and kFALSE on failure.
86 fRunloader = AliRunLoader::Open(filename, foldername, "READ");
87 if (fRunloader == NULL)
89 AliError(Form("Could not find or load the run loader for the file: %s and folder: %s",
90 (const char*)filename, (const char*)foldername));
93 fMuonloader = fRunloader->GetLoader("MUONLoader");
94 if (fMuonloader == NULL)
96 AliError(Form("Could not find the MUON loader in file: %s and folder: %s",
97 (const char*)filename, (const char*)foldername));
102 // Need to connect the muon loader to the AliMUONData object,
103 // else class to fData will return NULL.
104 fData.SetLoader(fMuonloader);
106 fFilename = filename;
107 fFoldername = foldername;
108 fEventnumber = -1; // Reset the event number to force the event to be loaded.
113 Bool_t AliMUONDataInterface::FetchLoaders(TString filename, TString foldername)
115 // Fetch the run loader and muon loader objects from memory if they already exist,
116 // or from memory if they do not.
117 // If the currently loaded run loader (if any) is not refering to the file and folder
118 // we are interested in then it is deleted and reopened with the required file and
121 if (fRunloader == NULL)
123 fRunloader = AliRunLoader::GetRunLoader();
124 if (fRunloader == NULL)
125 return LoadLoaders(filename, foldername);
127 // Fetch the current file and folder names.
128 fFilename = fRunloader->GetFileName();
129 fFoldername = fRunloader->GetEventFolder()->GetName();
132 // If filename or foldername are not the same as the ones currently selected then
134 if ( filename.CompareTo(fFilename) != 0 || foldername.CompareTo(fFoldername) != 0 )
137 return LoadLoaders(filename, foldername);
143 Bool_t AliMUONDataInterface::FetchEvent(Int_t event)
145 // Fetch the specified event from the runloader and reset all the track, cathode
146 // and address flags to force them to be reloaded.
148 if (fEventnumber < 0)
150 fEventnumber = fRunloader->GetEventNumber();
154 fHitAddressSet = kFALSE;
155 fSDigitAddressSet = kFALSE;
156 fDigitAddressSet = kFALSE;
157 fClusterAddressSet = kFALSE;
158 fTriggerAddressSet = kFALSE;
160 if ( event != fEventnumber )
162 if ( fRunloader->GetEvent(event) < 0 ) return kFALSE;
163 fEventnumber = event;
167 fHitAddressSet = kFALSE;
168 fSDigitAddressSet = kFALSE;
169 fDigitAddressSet = kFALSE;
170 fClusterAddressSet = kFALSE;
171 fTriggerAddressSet = kFALSE;
177 Bool_t AliMUONDataInterface::FetchTreeK()
179 // Fetch the Kine tree from the current run loader.
181 if (fRunloader->TreeK() == NULL)
183 fRunloader->LoadKinematics("READ");
184 if (fRunloader->TreeK() == NULL)
186 AliError("Could not load TreeK.");
194 Bool_t AliMUONDataInterface::FetchTreeH()
196 // Fetch the Hits tree from the current muon loader.
197 // Set all the required addresses etc...
199 if (fMuonloader->TreeH() == NULL)
201 fMuonloader->LoadHits("READ");
202 if (fMuonloader->TreeH() == NULL)
204 AliError("Could not load TreeH.");
207 fData.SetTreeAddress("H");
208 fHitAddressSet = kTRUE;
210 else if ( ! fHitAddressSet )
212 fData.SetTreeAddress("H");
213 fHitAddressSet = kTRUE;
219 Bool_t AliMUONDataInterface::FetchTreeS()
221 // Fetch the S-Digits tree from the current muon loader.
222 // Set all the required addresses etc...
224 if (fMuonloader->TreeS() == NULL)
226 fMuonloader->LoadSDigits("READ");
227 if (fMuonloader->TreeS() == NULL)
229 AliError("Could not load TreeS.");
232 fData.SetTreeAddress("S");
233 fSDigitAddressSet = kTRUE;
235 else if ( ! fSDigitAddressSet )
237 fData.SetTreeAddress("S");
238 fSDigitAddressSet = kTRUE;
244 Bool_t AliMUONDataInterface::FetchTreeD()
246 // Fetch the digits tree from the current muon loader.
247 // Set all the required addresses etc...
249 if (fMuonloader->TreeD() == NULL)
251 fMuonloader->LoadDigits("READ");
252 if (fMuonloader->TreeD() == NULL)
254 AliError("Could not load TreeD.");
257 fData.SetTreeAddress("D");
258 fDigitAddressSet = kTRUE;
260 else if ( ! fDigitAddressSet )
262 fData.SetTreeAddress("D");
263 fDigitAddressSet = kTRUE;
269 Bool_t AliMUONDataInterface::FetchTreeR()
271 // Fetch the reconstructed objects tree from the current muon loader.
272 // Note: The addresses must still be set.
274 if (fMuonloader->TreeR() == NULL)
276 fMuonloader->LoadRecPoints("READ");
277 if (fMuonloader->TreeR() == NULL)
279 AliError("Could not load TreeR.");
283 // Need to reset these flags so that the cluster and trigger address
284 // gets reset after this method.
285 fClusterAddressSet = kFALSE;
286 fTriggerAddressSet = kFALSE;
292 Int_t AliMUONDataInterface::NumberOfEvents(TString filename, TString foldername)
294 // Returns the number of events in the specified file/folder, and -1 on error.
296 if ( ! FetchLoaders(filename, foldername) ) return -1;
297 return fRunloader->GetNumberOfEvents();
301 Int_t AliMUONDataInterface::NumberOfParticles(TString filename, TString foldername, Int_t event)
303 // Returns the number of events in the specified file/folder, and -1 on error.
305 if ( ! FetchLoaders(filename, foldername) ) return -1;
306 if ( ! FetchEvent(event) ) return -1;
307 if ( ! FetchTreeK() ) return -1;
308 return (Int_t) fRunloader->TreeK()->GetEntriesFast();
312 TParticle* AliMUONDataInterface::Particle(
313 TString filename, TString foldername, Int_t event, Int_t particle
316 // Returns the specified particle in the given file, folder and event.
317 // NULL is returned on error.
319 if ( ! FetchLoaders(filename, foldername) ) return NULL;
320 if ( ! FetchEvent(event) ) return NULL;
321 if ( ! FetchTreeK() ) return NULL;
323 TTree* treeK = fRunloader->TreeK();
325 treeK->GetBranch("Particles")->SetAddress(&p);
326 treeK->GetEvent(particle);
331 Int_t AliMUONDataInterface::NumberOfTracks(TString filename, TString foldername, Int_t event)
333 // Returns the number of tracks in the specified file/folder and event.
334 // -1 is returned on error.
336 if ( ! FetchLoaders(filename, foldername) ) return -1;
337 if ( ! FetchEvent(event) ) return -1;
338 if ( ! FetchTreeH() ) return -1;
339 return fData.GetNtracks();
343 Int_t AliMUONDataInterface::NumberOfHits(
344 TString filename, TString foldername, Int_t event, Int_t track
347 // Returns the number of hits in the specified file/folder, event and track.
348 // -1 is returned on error.
350 if ( ! FetchLoaders(filename, foldername) ) return -1;
351 if ( ! FetchEvent(event) ) return -1;
352 if ( ! FetchTreeH() ) return -1;
354 if (fTrack < 0 || fTrack != track)
357 fData.GetTrack(track);
360 return fData.Hits()->GetEntriesFast();
364 AliMUONHit* AliMUONDataInterface::Hit(
365 TString filename, TString foldername, Int_t event,
366 Int_t track, Int_t hit
369 // Returns the specified hit in the given file, folder, event and track.
370 // NULL is returned on error.
372 if ( ! FetchLoaders(filename, foldername) ) return NULL;
373 if ( ! FetchEvent(event) ) return NULL;
374 if ( ! FetchTreeH() ) return NULL;
376 if (fTrack < 0 || fTrack != track)
379 fData.GetTrack(track);
382 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
386 Int_t AliMUONDataInterface::NumberOfSDigits(
387 TString filename, TString foldername, Int_t event,
388 Int_t chamber, Int_t cathode
391 // Returns the number of s-digits in the given file, folder, event,
392 // chamber and cathode. -1 is returned on error.
394 Assert( 0 <= chamber && chamber <= 13 );
395 Assert( 0 <= cathode && cathode <= 1 );
397 if ( ! FetchLoaders(filename, foldername) ) return -1;
398 if ( ! FetchEvent(event) ) return -1;
399 if ( ! FetchTreeS() ) return -1;
401 if ( fSCathode != cathode )
403 fData.ResetSDigits();
407 return fData.SDigits(chamber)->GetEntriesFast();
411 AliMUONDigit* AliMUONDataInterface::SDigit(
412 TString filename, TString foldername, Int_t event,
413 Int_t chamber, Int_t cathode, Int_t sdigit
416 // Returns the specified s-digit in the given file, folder, event,
417 // chamber and cathode. NULL is returned on error.
419 Assert( 0 <= chamber && chamber <= 13 );
420 Assert( 0 <= cathode && cathode <= 1 );
422 if ( ! FetchLoaders(filename, foldername) ) return NULL;
423 if ( ! FetchEvent(event) ) return NULL;
424 if ( ! FetchTreeS() ) return NULL;
426 if ( fSCathode != cathode )
428 fData.ResetSDigits();
432 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
436 Int_t AliMUONDataInterface::NumberOfDigits(
437 TString filename, TString foldername, Int_t event,
438 Int_t chamber, Int_t cathode
441 // Returns the number of digits in the given file, folder, event,
442 // chamber and cathode. -1 is returned on error.
443 Assert( 0 <= chamber && chamber <= 13 );
444 Assert( 0 <= cathode && cathode <= 1 );
446 if ( ! FetchLoaders(filename, foldername) ) return -1;
447 if ( ! FetchEvent(event) ) return -1;
448 if ( ! FetchTreeD() ) return -1;
450 if ( fCathode != cathode )
456 return fData.Digits(chamber)->GetEntriesFast();
460 AliMUONDigit* AliMUONDataInterface::Digit(
461 TString filename, TString foldername, Int_t event,
462 Int_t chamber, Int_t cathode, Int_t digit
465 // Returns the specified digit in the given file, folder, event,
466 // chamber and cathode. NULL is returned on error.
468 Assert( 0 <= chamber && chamber <= 13 );
469 Assert( 0 <= cathode && cathode <= 1 );
471 if ( ! FetchLoaders(filename, foldername) ) return NULL;
472 if ( ! FetchEvent(event) ) return NULL;
473 if ( ! FetchTreeD() ) return NULL;
475 if ( fCathode != cathode )
481 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
485 Int_t AliMUONDataInterface::NumberOfRawClusters(
486 TString filename, TString foldername, Int_t event, Int_t chamber
489 // Returns the number of raw clusters in the specified file, folder, event and chamber.
490 // -1 is returned or error.
492 Assert( 0 <= chamber && chamber <= 13 );
493 if ( ! FetchLoaders(filename, foldername) ) return -1;
494 if ( ! FetchEvent(event) ) return -1;
495 if ( ! FetchTreeR() ) return -1;
496 if ( ! fClusterAddressSet )
498 // If the raw cluster address in TreeR is not set yet then set it now.
499 fData.SetTreeAddress("RC");
500 fData.ResetRawClusters();
501 fData.GetRawClusters();
502 fClusterAddressSet = kTRUE;
504 return fData.RawClusters(chamber)->GetEntriesFast();
508 AliMUONRawCluster* AliMUONDataInterface::RawCluster(
509 TString filename, TString foldername, Int_t event,
510 Int_t chamber, Int_t cluster
513 // Fetch the specified raw cluster from the given file, folder, event and chamber number.
514 // NULL is returned on error.
516 Assert( 0 <= chamber && chamber <= 13 );
517 if ( ! FetchLoaders(filename, foldername) ) return NULL;
518 if ( ! FetchEvent(event) ) return NULL;
519 if ( ! FetchTreeR() ) return NULL;
520 if ( ! fClusterAddressSet )
522 // If the raw cluster address in TreeR is not set yet then set it now.
523 fData.SetTreeAddress("RC");
524 fData.ResetRawClusters();
525 fData.GetRawClusters();
526 fClusterAddressSet = kTRUE;
528 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
532 Int_t AliMUONDataInterface::NumberOfLocalTriggers(TString filename, TString foldername, Int_t event)
534 // Return the number of local trigger objects in the specified file, folder and
535 // event number. -1 is returned on error.
537 if ( ! FetchLoaders(filename, foldername) ) return -1;
538 if ( ! FetchEvent(event) ) return -1;
539 if ( ! FetchTreeR() ) return -1;
540 if ( ! fTriggerAddressSet )
542 // If the local trigger address in TreeR is not set yet then set it now.
543 fData.SetTreeAddress("GLT");
544 fData.ResetTrigger();
546 fTriggerAddressSet = kTRUE;
548 return fData.LocalTrigger()->GetEntriesFast();
552 AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(
553 TString filename, TString foldername, Int_t event, Int_t trigger
556 // Fetch the specified local trigger object from the given file, folder and event number.
557 // NULL is returned on error.
559 if ( ! FetchLoaders(filename, foldername) ) return NULL;
560 if ( ! FetchEvent(event) ) return NULL;
561 if ( ! FetchTreeR() ) return NULL;
562 if ( ! fTriggerAddressSet )
564 // If the local trigger address in TreeR is not set yet then set it now.
565 fData.SetTreeAddress("GLT");
566 fData.ResetTrigger();
568 fTriggerAddressSet = kTRUE;
570 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );
574 Bool_t AliMUONDataInterface::SetFile(TString filename, TString foldername)
576 // Set the current file and folder from which to fetch data.
577 // kTRUE is returned if the run and muon loaders were found, else kFALSE.
579 return FetchLoaders(filename, foldername);
583 Bool_t AliMUONDataInterface::GetEvent(Int_t event)
585 // Select the current event from which to fetch data.
586 // kTRUE is returned if the event was found, else kFALSE is returned.
588 if (fRunloader == NULL)
590 AliError("File not set.");
594 return FetchEvent(event);
598 Int_t AliMUONDataInterface::NumberOfEvents()
600 // Get the number of events in the currently selected file.
601 // -1 is returned on error.
603 if (fRunloader == NULL)
605 AliError("File not set.");
608 return fRunloader->GetNumberOfEvents();
612 Int_t AliMUONDataInterface::NumberOfParticles()
614 // Get the number of particles in the current event.
615 // -1 is returned on error.
617 if (fRunloader == NULL)
619 AliError("File not set.");
622 if ( ! FetchTreeK() ) return -1;
623 return (Int_t) fRunloader->TreeK()->GetEntriesFast();
627 TParticle* AliMUONDataInterface::Particle(Int_t particle)
629 // Fetch the specified particle from the current event.
630 // NULL is returned on error.
632 if (fRunloader == NULL)
634 AliError("File not set.");
637 if (fEventnumber < 0)
639 AliError("Event not chosen.");
642 if ( ! FetchTreeK() ) return NULL;
643 TTree* treeK = fRunloader->TreeK();
645 treeK->GetBranch("Particles")->SetAddress(&p);
646 treeK->GetEvent(particle);
651 Int_t AliMUONDataInterface::NumberOfTracks()
653 // Get the number of tracks in the current event.
654 // -1 is returned on error.
656 if (fRunloader == NULL)
658 AliError("File not set.");
661 if (fEventnumber < 0)
663 AliError( "Event not chosen.");
666 if ( ! FetchTreeH() ) return -1;
667 return fData.GetNtracks();
671 Int_t AliMUONDataInterface::NumberOfHits(Int_t track)
673 // Get the number of hits for the given track in the current event.
674 // -1 is returned on error.
676 if (fRunloader == NULL)
678 AliError("File not set.");
681 if (fEventnumber < 0)
683 AliError("Event not chosen.");
686 if ( ! FetchTreeH() ) return -1;
687 if (fTrack < 0 || fTrack != track)
690 fData.GetTrack(track);
693 return fData.Hits()->GetEntriesFast();
697 AliMUONHit* AliMUONDataInterface::Hit(Int_t track, Int_t hit)
699 // Fetch the specified hit from the current event.
700 // NULL is returned on error.
702 if (fRunloader == NULL)
704 AliError("File not set.");
707 if (fEventnumber < 0)
709 AliError("Event not chosen.");
712 if ( ! FetchTreeH() ) return NULL;
713 if (fTrack < 0 || fTrack != track)
716 fData.GetTrack(track);
719 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
723 Int_t AliMUONDataInterface::NumberOfSDigits(Int_t chamber, Int_t cathode)
725 // Get the number of s-digits on the chamber, cathode in the current event.
726 // -1 is returned on error.
728 Assert( 0 <= chamber && chamber <= 13 );
729 Assert( 0 <= cathode && cathode <= 1 );
731 if (fRunloader == NULL)
733 AliError("File not set.");
736 if (fEventnumber < 0)
738 AliError("Event not chosen.");
742 if ( ! FetchTreeS() ) return -1;
743 if ( fSCathode != cathode )
745 fData.ResetSDigits();
749 return fData.SDigits(chamber)->GetEntriesFast();
753 AliMUONDigit* AliMUONDataInterface::SDigit(Int_t chamber, Int_t cathode, Int_t sdigit)
755 // Fetch the specified s-digits on the chamber, cathode from the current event.
756 // NULL is returned on error.
758 Assert( 0 <= chamber && chamber <= 13 );
759 Assert( 0 <= cathode && cathode <= 1 );
761 if (fRunloader == NULL)
763 AliError("File not set.");
766 if (fEventnumber < 0)
768 AliError("Event not chosen.");
772 if ( ! FetchTreeS() ) return NULL;
773 if ( fSCathode != cathode )
775 fData.ResetSDigits();
779 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
783 Int_t AliMUONDataInterface::NumberOfDigits(Int_t chamber, Int_t cathode)
785 // Get the number of digits on the chamber, cathode in the current event.
786 // -1 is returned on error.
788 Assert( 0 <= chamber && chamber <= 13 );
789 Assert( 0 <= cathode && cathode <= 1 );
791 if (fRunloader == NULL)
793 AliError("File not set.");
796 if (fEventnumber < 0)
798 AliError("Event not chosen.");
802 if ( ! FetchTreeD() ) return -1;
803 if ( fCathode != cathode )
809 return fData.Digits(chamber)->GetEntriesFast();
813 AliMUONDigit* AliMUONDataInterface::Digit(Int_t chamber, Int_t cathode, Int_t digit)
815 // Fetch the specified digits on the chamber, cathode from the current event.
816 // NULL is returned on error.
818 Assert( 0 <= chamber && chamber <= 13 );
819 Assert( 0 <= cathode && cathode <= 1 );
821 if (fRunloader == NULL)
823 AliError("File not set.");
826 if (fEventnumber < 0)
828 AliError("Event not chosen.");
832 if ( ! FetchTreeD() ) return NULL;
833 if ( fCathode != cathode )
839 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
843 Int_t AliMUONDataInterface::NumberOfRawClusters(Int_t chamber)
845 // Get the number of raw clusters on the given chamber in the current event.
846 // -1 is returned on error.
848 Assert( 0 <= chamber && chamber <= 13 );
850 if (fRunloader == NULL)
852 AliError("File not set.");
855 if (fEventnumber < 0)
857 AliError("Event not chosen.");
861 if ( ! FetchTreeR() ) return -1;
862 if ( ! fClusterAddressSet )
864 fData.SetTreeAddress("RC");
865 fData.ResetRawClusters();
866 fData.GetRawClusters();
867 fClusterAddressSet = kTRUE;
869 return fData.RawClusters(chamber)->GetEntriesFast();
873 AliMUONRawCluster* AliMUONDataInterface::RawCluster(Int_t chamber, Int_t cluster)
875 // Fetch the specified raw cluster on the given chamber from the current event.
876 // NULL is returned on error.
878 Assert( 0 <= chamber && chamber <= 13 );
880 if (fRunloader == NULL)
882 AliError("File not set.");
885 if (fEventnumber < 0)
887 AliError("Event not chosen.");
891 if ( ! FetchTreeR() ) return NULL;
892 if ( ! fClusterAddressSet )
894 fData.SetTreeAddress("RC");
895 fData.ResetRawClusters();
896 fData.GetRawClusters();
897 fClusterAddressSet = kTRUE;
899 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
903 Int_t AliMUONDataInterface::NumberOfLocalTriggers()
905 // Get the number of local trigger objects in the current event.
906 // -1 is returned on error.
908 if (fRunloader == NULL)
910 AliError("File not set.");
913 if (fEventnumber < 0)
915 AliError("Event not chosen.");
919 if ( ! FetchTreeR() ) return -1;
920 if ( ! fTriggerAddressSet )
922 fData.SetTreeAddress("GLT");
923 fData.ResetTrigger();
925 fTriggerAddressSet = kTRUE;
927 return fData.LocalTrigger()->GetEntriesFast();
931 AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(Int_t trigger)
933 // Fetch the specified local trigger object from the current event.
934 // NULL is returned on error.
936 if (fRunloader == NULL)
938 AliError("File not set.");
941 if (fEventnumber < 0)
943 AliError( "Event not chosen.");
947 if ( ! FetchTreeR() ) return NULL;
948 if ( ! fTriggerAddressSet )
950 fData.SetTreeAddress("GLT");
951 fData.ResetTrigger();
953 fTriggerAddressSet = kTRUE;
955 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );