]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONDataInterface.cxx
Addapting AliMUONEventReconstructor to AliLog framework (Gines)
[u/mrichter/AliRoot.git] / MUON / AliMUONDataInterface.cxx
CommitLineData
48b32e42 1
2// Author: Artur Szostak
3// email: artur@alice.phy.uct.ac.za
4
5#include <TError.h>
30178c30 6#include <TParticle.h>
48b32e42 7
8#include "AliRunLoader.h"
9#include "AliLoader.h"
10
11#include "AliMUONDataInterface.h"
30178c30 12#include "AliMUONLocalTrigger.h"
13#include "AliMUONHit.h"
14#include "AliMUONDigit.h"
15#include "AliMUONRawCluster.h"
8c343c7c 16#include "AliLog.h"
48b32e42 17
18
19ClassImp(AliMUONDataInterface)
20
21
22AliMUONDataInterface::AliMUONDataInterface()
23 : TObject(), fData(NULL, "MUON", "MUON")
24{
25// Set all internal pointers to NULL and indices to -1.
26
27 Reset();
925e6570 28}
48b32e42 29
11ca64ac 30AliMUONDataInterface::AliMUONDataInterface(const AliMUONDataInterface& rhs)
31 : TObject(rhs)
32{
33// Protected copy constructor
34
8c343c7c 35 AliFatal("Not implemented.");
11ca64ac 36}
48b32e42 37
38AliMUONDataInterface::~AliMUONDataInterface()
39{
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.
43
44 if (fRunloader != NULL)
45 delete fRunloader;
925e6570 46}
48b32e42 47
11ca64ac 48AliMUONDataInterface&
49AliMUONDataInterface::operator=(const AliMUONDataInterface& rhs)
50{
51// Protected assignement operator
52
53 if (this == &rhs) return *this;
54
8c343c7c 55 AliFatal("Not implemented.");
11ca64ac 56
57 return *this;
58}
59
48b32e42 60
61void AliMUONDataInterface::Reset()
62{
63// Sets all internal pointers to NULL and indices to -1.
64// Note: No resources are released!
65// Specificaly AliRunLoader is not deleted.
66
67 fRunloader = NULL;
68 fMuonloader = NULL;
69 fEventnumber = -1;
70 fTrack = -1;
71 fSCathode = -1;
72 fCathode = -1;
73 fHitAddressSet = kFALSE;
74 fSDigitAddressSet = kFALSE;
75 fDigitAddressSet = kFALSE;
76 fClusterAddressSet = kFALSE;
77 fTriggerAddressSet = kFALSE;
925e6570 78}
48b32e42 79
80
81Bool_t AliMUONDataInterface::LoadLoaders(TString filename, TString foldername)
82{
83// Load the run and muon loaders from the specified file and folder.
84// kTRUE is returned on success and kFALSE on failure.
85
86 fRunloader = AliRunLoader::Open(filename, foldername, "READ");
87 if (fRunloader == NULL)
88 {
8c343c7c 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));
48b32e42 91 return kFALSE;
925e6570 92 }
48b32e42 93 fMuonloader = fRunloader->GetLoader("MUONLoader");
94 if (fMuonloader == NULL)
95 {
8c343c7c 96 AliError(Form("Could not find the MUON loader in file: %s and folder: %s",
97 (const char*)filename, (const char*)foldername));
48b32e42 98 fRunloader = NULL;
99 return kFALSE;
925e6570 100 }
48b32e42 101
102 // Need to connect the muon loader to the AliMUONData object,
103 // else class to fData will return NULL.
104 fData.SetLoader(fMuonloader);
105
106 fFilename = filename;
107 fFoldername = foldername;
108 fEventnumber = -1; // Reset the event number to force the event to be loaded.
109 return kTRUE;
925e6570 110}
48b32e42 111
112
113Bool_t AliMUONDataInterface::FetchLoaders(TString filename, TString foldername)
114{
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
119// folder names.
120
121 if (fRunloader == NULL)
122 {
123 fRunloader = AliRunLoader::GetRunLoader();
124 if (fRunloader == NULL)
125 return LoadLoaders(filename, foldername);
126
127 // Fetch the current file and folder names.
128 fFilename = fRunloader->GetFileName();
129 fFoldername = fRunloader->GetEventFolder()->GetName();
925e6570 130 }
48b32e42 131
132 // If filename or foldername are not the same as the ones currently selected then
133 // reopen the file.
134 if ( filename.CompareTo(fFilename) != 0 || foldername.CompareTo(fFoldername) != 0 )
135 {
136 delete fRunloader;
137 return LoadLoaders(filename, foldername);
925e6570 138 }
48b32e42 139 return kTRUE;
925e6570 140}
48b32e42 141
142
143Bool_t AliMUONDataInterface::FetchEvent(Int_t event)
144{
145// Fetch the specified event from the runloader and reset all the track, cathode
146// and address flags to force them to be reloaded.
147
148 if (fEventnumber < 0)
149 {
150 fEventnumber = fRunloader->GetEventNumber();
151 fTrack = -1;
152 fSCathode = -1;
153 fCathode = -1;
154 fHitAddressSet = kFALSE;
155 fSDigitAddressSet = kFALSE;
156 fDigitAddressSet = kFALSE;
157 fClusterAddressSet = kFALSE;
158 fTriggerAddressSet = kFALSE;
925e6570 159 }
48b32e42 160 if ( event != fEventnumber )
161 {
162 if ( fRunloader->GetEvent(event) < 0 ) return kFALSE;
163 fEventnumber = event;
164 fTrack = -1;
165 fSCathode = -1;
166 fCathode = -1;
167 fHitAddressSet = kFALSE;
168 fSDigitAddressSet = kFALSE;
169 fDigitAddressSet = kFALSE;
170 fClusterAddressSet = kFALSE;
171 fTriggerAddressSet = kFALSE;
925e6570 172 }
48b32e42 173 return kTRUE;
925e6570 174}
48b32e42 175
176
177Bool_t AliMUONDataInterface::FetchTreeK()
178{
179// Fetch the Kine tree from the current run loader.
180
181 if (fRunloader->TreeK() == NULL)
182 {
183 fRunloader->LoadKinematics("READ");
184 if (fRunloader->TreeK() == NULL)
185 {
8c343c7c 186 AliError("Could not load TreeK.");
48b32e42 187 return kFALSE;
925e6570 188 }
189 }
48b32e42 190 return kTRUE;
925e6570 191}
48b32e42 192
193
194Bool_t AliMUONDataInterface::FetchTreeH()
195{
196// Fetch the Hits tree from the current muon loader.
197// Set all the required addresses etc...
198
199 if (fMuonloader->TreeH() == NULL)
200 {
201 fMuonloader->LoadHits("READ");
202 if (fMuonloader->TreeH() == NULL)
203 {
8c343c7c 204 AliError("Could not load TreeH.");
48b32e42 205 return kFALSE;
925e6570 206 }
48b32e42 207 fData.SetTreeAddress("H");
208 fHitAddressSet = kTRUE;
209 }
210 else if ( ! fHitAddressSet )
211 {
212 fData.SetTreeAddress("H");
213 fHitAddressSet = kTRUE;
925e6570 214 }
48b32e42 215 return kTRUE;
925e6570 216}
48b32e42 217
218
219Bool_t AliMUONDataInterface::FetchTreeS()
220{
221// Fetch the S-Digits tree from the current muon loader.
222// Set all the required addresses etc...
223
224 if (fMuonloader->TreeS() == NULL)
225 {
226 fMuonloader->LoadSDigits("READ");
227 if (fMuonloader->TreeS() == NULL)
228 {
8c343c7c 229 AliError("Could not load TreeS.");
48b32e42 230 return kFALSE;
925e6570 231 }
48b32e42 232 fData.SetTreeAddress("S");
233 fSDigitAddressSet = kTRUE;
234 }
235 else if ( ! fSDigitAddressSet )
236 {
237 fData.SetTreeAddress("S");
238 fSDigitAddressSet = kTRUE;
925e6570 239 }
48b32e42 240 return kTRUE;
925e6570 241}
48b32e42 242
243
244Bool_t AliMUONDataInterface::FetchTreeD()
245{
246// Fetch the digits tree from the current muon loader.
247// Set all the required addresses etc...
248
249 if (fMuonloader->TreeD() == NULL)
250 {
251 fMuonloader->LoadDigits("READ");
252 if (fMuonloader->TreeD() == NULL)
253 {
8c343c7c 254 AliError("Could not load TreeD.");
48b32e42 255 return kFALSE;
925e6570 256 }
48b32e42 257 fData.SetTreeAddress("D");
258 fDigitAddressSet = kTRUE;
259 }
260 else if ( ! fDigitAddressSet )
261 {
262 fData.SetTreeAddress("D");
263 fDigitAddressSet = kTRUE;
925e6570 264 }
48b32e42 265 return kTRUE;
925e6570 266}
48b32e42 267
268
269Bool_t AliMUONDataInterface::FetchTreeR()
270{
271// Fetch the reconstructed objects tree from the current muon loader.
382c2b3f 272// Note: The addresses must still be set.
48b32e42 273
274 if (fMuonloader->TreeR() == NULL)
275 {
276 fMuonloader->LoadRecPoints("READ");
277 if (fMuonloader->TreeR() == NULL)
278 {
8c343c7c 279 AliError("Could not load TreeR.");
48b32e42 280 return kFALSE;
925e6570 281 }
48b32e42 282
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;
925e6570 287 }
48b32e42 288 return kTRUE;
925e6570 289}
48b32e42 290
291
292Int_t AliMUONDataInterface::NumberOfEvents(TString filename, TString foldername)
293{
294// Returns the number of events in the specified file/folder, and -1 on error.
295
296 if ( ! FetchLoaders(filename, foldername) ) return -1;
297 return fRunloader->GetNumberOfEvents();
925e6570 298}
48b32e42 299
300
301Int_t AliMUONDataInterface::NumberOfParticles(TString filename, TString foldername, Int_t event)
302{
303// Returns the number of events in the specified file/folder, and -1 on error.
304
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();
925e6570 309}
48b32e42 310
311
312TParticle* AliMUONDataInterface::Particle(
313 TString filename, TString foldername, Int_t event, Int_t particle
314 )
315{
316// Returns the specified particle in the given file, folder and event.
317// NULL is returned on error.
318
319 if ( ! FetchLoaders(filename, foldername) ) return NULL;
320 if ( ! FetchEvent(event) ) return NULL;
321 if ( ! FetchTreeK() ) return NULL;
322
323 TTree* treeK = fRunloader->TreeK();
324 TParticle* p = NULL;
325 treeK->GetBranch("Particles")->SetAddress(&p);
326 treeK->GetEvent(particle);
327 return p;
925e6570 328}
48b32e42 329
330
331Int_t AliMUONDataInterface::NumberOfTracks(TString filename, TString foldername, Int_t event)
332{
333// Returns the number of tracks in the specified file/folder and event.
334// -1 is returned on error.
335
336 if ( ! FetchLoaders(filename, foldername) ) return -1;
337 if ( ! FetchEvent(event) ) return -1;
338 if ( ! FetchTreeH() ) return -1;
339 return fData.GetNtracks();
925e6570 340}
48b32e42 341
342
343Int_t AliMUONDataInterface::NumberOfHits(
344 TString filename, TString foldername, Int_t event, Int_t track
345 )
346{
347// Returns the number of hits in the specified file/folder, event and track.
348// -1 is returned on error.
349
350 if ( ! FetchLoaders(filename, foldername) ) return -1;
351 if ( ! FetchEvent(event) ) return -1;
352 if ( ! FetchTreeH() ) return -1;
353
354 if (fTrack < 0 || fTrack != track)
355 {
356 fData.ResetHits();
357 fData.GetTrack(track);
358 fTrack = track;
925e6570 359 }
48b32e42 360 return fData.Hits()->GetEntriesFast();
925e6570 361}
48b32e42 362
363
364AliMUONHit* AliMUONDataInterface::Hit(
365 TString filename, TString foldername, Int_t event,
366 Int_t track, Int_t hit
367 )
368{
369// Returns the specified hit in the given file, folder, event and track.
370// NULL is returned on error.
371
372 if ( ! FetchLoaders(filename, foldername) ) return NULL;
373 if ( ! FetchEvent(event) ) return NULL;
374 if ( ! FetchTreeH() ) return NULL;
375
376 if (fTrack < 0 || fTrack != track)
377 {
378 fData.ResetHits();
379 fData.GetTrack(track);
380 fTrack = track;
925e6570 381 }
48b32e42 382 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
925e6570 383}
48b32e42 384
385
386Int_t AliMUONDataInterface::NumberOfSDigits(
387 TString filename, TString foldername, Int_t event,
388 Int_t chamber, Int_t cathode
389 )
390{
391// Returns the number of s-digits in the given file, folder, event,
392// chamber and cathode. -1 is returned on error.
393
394 Assert( 0 <= chamber && chamber <= 13 );
395 Assert( 0 <= cathode && cathode <= 1 );
396
397 if ( ! FetchLoaders(filename, foldername) ) return -1;
398 if ( ! FetchEvent(event) ) return -1;
399 if ( ! FetchTreeS() ) return -1;
400
401 if ( fSCathode != cathode )
402 {
403 fData.ResetSDigits();
404 fData.GetCathodeS(cathode);
405 fSCathode = cathode;
925e6570 406 }
48b32e42 407 return fData.SDigits(chamber)->GetEntriesFast();
925e6570 408}
48b32e42 409
410
411AliMUONDigit* AliMUONDataInterface::SDigit(
412 TString filename, TString foldername, Int_t event,
413 Int_t chamber, Int_t cathode, Int_t sdigit
414 )
415{
416// Returns the specified s-digit in the given file, folder, event,
417// chamber and cathode. NULL is returned on error.
418
419 Assert( 0 <= chamber && chamber <= 13 );
420 Assert( 0 <= cathode && cathode <= 1 );
421
422 if ( ! FetchLoaders(filename, foldername) ) return NULL;
423 if ( ! FetchEvent(event) ) return NULL;
424 if ( ! FetchTreeS() ) return NULL;
425
426 if ( fSCathode != cathode )
427 {
428 fData.ResetSDigits();
429 fData.GetCathodeS(cathode);
430 fSCathode = cathode;
925e6570 431 }
48b32e42 432 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
925e6570 433}
48b32e42 434
435
436Int_t AliMUONDataInterface::NumberOfDigits(
437 TString filename, TString foldername, Int_t event,
438 Int_t chamber, Int_t cathode
439 )
440{
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 );
445
446 if ( ! FetchLoaders(filename, foldername) ) return -1;
447 if ( ! FetchEvent(event) ) return -1;
448 if ( ! FetchTreeD() ) return -1;
449
450 if ( fCathode != cathode )
451 {
452 fData.ResetDigits();
453 fData.GetCathode(cathode);
454 fCathode = cathode;
925e6570 455 }
48b32e42 456 return fData.Digits(chamber)->GetEntriesFast();
925e6570 457}
48b32e42 458
459
460AliMUONDigit* AliMUONDataInterface::Digit(
461 TString filename, TString foldername, Int_t event,
462 Int_t chamber, Int_t cathode, Int_t digit
463 )
464{
465// Returns the specified digit in the given file, folder, event,
466// chamber and cathode. NULL is returned on error.
467
468 Assert( 0 <= chamber && chamber <= 13 );
469 Assert( 0 <= cathode && cathode <= 1 );
470
471 if ( ! FetchLoaders(filename, foldername) ) return NULL;
472 if ( ! FetchEvent(event) ) return NULL;
473 if ( ! FetchTreeD() ) return NULL;
474
475 if ( fCathode != cathode )
476 {
477 fData.ResetDigits();
478 fData.GetCathode(cathode);
479 fCathode = cathode;
925e6570 480 }
48b32e42 481 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
925e6570 482}
48b32e42 483
484
485Int_t AliMUONDataInterface::NumberOfRawClusters(
486 TString filename, TString foldername, Int_t event, Int_t chamber
487 )
488{
489// Returns the number of raw clusters in the specified file, folder, event and chamber.
490// -1 is returned or error.
491
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 )
497 {
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;
925e6570 503 }
48b32e42 504 return fData.RawClusters(chamber)->GetEntriesFast();
925e6570 505}
48b32e42 506
507
508AliMUONRawCluster* AliMUONDataInterface::RawCluster(
509 TString filename, TString foldername, Int_t event,
510 Int_t chamber, Int_t cluster
511 )
512{
513// Fetch the specified raw cluster from the given file, folder, event and chamber number.
514// NULL is returned on error.
515
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 )
521 {
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;
925e6570 527 }
48b32e42 528 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
925e6570 529}
48b32e42 530
531
532Int_t AliMUONDataInterface::NumberOfLocalTriggers(TString filename, TString foldername, Int_t event)
533{
534// Return the number of local trigger objects in the specified file, folder and
535// event number. -1 is returned on error.
536
537 if ( ! FetchLoaders(filename, foldername) ) return -1;
538 if ( ! FetchEvent(event) ) return -1;
2be06f1e 539 if ( ! FetchTreeD() ) return -1;
48b32e42 540 if ( ! fTriggerAddressSet )
541 {
2be06f1e 542 // If the local trigger address in TreeD is not set yet then set it now.
48b32e42 543 fData.SetTreeAddress("GLT");
544 fData.ResetTrigger();
2be06f1e 545 fData.GetTriggerD();
48b32e42 546 fTriggerAddressSet = kTRUE;
925e6570 547 }
48b32e42 548 return fData.LocalTrigger()->GetEntriesFast();
925e6570 549}
48b32e42 550
551
552AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(
553 TString filename, TString foldername, Int_t event, Int_t trigger
554 )
555{
556// Fetch the specified local trigger object from the given file, folder and event number.
557// NULL is returned on error.
558
559 if ( ! FetchLoaders(filename, foldername) ) return NULL;
560 if ( ! FetchEvent(event) ) return NULL;
2be06f1e 561 if ( ! FetchTreeD() ) return NULL;
48b32e42 562 if ( ! fTriggerAddressSet )
563 {
2be06f1e 564 // If the local trigger address in TreeD is not set yet then set it now.
48b32e42 565 fData.SetTreeAddress("GLT");
566 fData.ResetTrigger();
2be06f1e 567 fData.GetTriggerD();
48b32e42 568 fTriggerAddressSet = kTRUE;
925e6570 569 }
48b32e42 570 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );
925e6570 571}
48b32e42 572
573
574Bool_t AliMUONDataInterface::SetFile(TString filename, TString foldername)
575{
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.
578
579 return FetchLoaders(filename, foldername);
925e6570 580}
48b32e42 581
582
583Bool_t AliMUONDataInterface::GetEvent(Int_t event)
584{
585// Select the current event from which to fetch data.
586// kTRUE is returned if the event was found, else kFALSE is returned.
587
382c2b3f 588 if (fRunloader == NULL)
589 {
590 AliError("File not set.");
591 return kFALSE;
592 }
593 else
594 return FetchEvent(event);
925e6570 595}
48b32e42 596
597
598Int_t AliMUONDataInterface::NumberOfEvents()
599{
600// Get the number of events in the currently selected file.
601// -1 is returned on error.
602
603 if (fRunloader == NULL)
604 {
8c343c7c 605 AliError("File not set.");
48b32e42 606 return -1;
925e6570 607 }
48b32e42 608 return fRunloader->GetNumberOfEvents();
925e6570 609}
48b32e42 610
611
612Int_t AliMUONDataInterface::NumberOfParticles()
613{
614// Get the number of particles in the current event.
615// -1 is returned on error.
616
617 if (fRunloader == NULL)
618 {
8c343c7c 619 AliError("File not set.");
48b32e42 620 return -1;
925e6570 621 }
48b32e42 622 if ( ! FetchTreeK() ) return -1;
623 return (Int_t) fRunloader->TreeK()->GetEntriesFast();
925e6570 624}
48b32e42 625
626
627TParticle* AliMUONDataInterface::Particle(Int_t particle)
628{
629// Fetch the specified particle from the current event.
630// NULL is returned on error.
631
632 if (fRunloader == NULL)
633 {
8c343c7c 634 AliError("File not set.");
48b32e42 635 return NULL;
925e6570 636 }
48b32e42 637 if (fEventnumber < 0)
638 {
8c343c7c 639 AliError("Event not chosen.");
48b32e42 640 return NULL;
925e6570 641 }
48b32e42 642 if ( ! FetchTreeK() ) return NULL;
643 TTree* treeK = fRunloader->TreeK();
644 TParticle* p = NULL;
645 treeK->GetBranch("Particles")->SetAddress(&p);
646 treeK->GetEvent(particle);
647 return p;
925e6570 648}
48b32e42 649
650
651Int_t AliMUONDataInterface::NumberOfTracks()
652{
653// Get the number of tracks in the current event.
654// -1 is returned on error.
655
656 if (fRunloader == NULL)
657 {
8c343c7c 658 AliError("File not set.");
48b32e42 659 return -1;
925e6570 660 }
48b32e42 661 if (fEventnumber < 0)
662 {
8c343c7c 663 AliError( "Event not chosen.");
48b32e42 664 return -1;
925e6570 665 }
48b32e42 666 if ( ! FetchTreeH() ) return -1;
667 return fData.GetNtracks();
925e6570 668}
48b32e42 669
670
671Int_t AliMUONDataInterface::NumberOfHits(Int_t track)
672{
673// Get the number of hits for the given track in the current event.
674// -1 is returned on error.
675
676 if (fRunloader == NULL)
677 {
8c343c7c 678 AliError("File not set.");
48b32e42 679 return -1;
925e6570 680 }
48b32e42 681 if (fEventnumber < 0)
682 {
8c343c7c 683 AliError("Event not chosen.");
48b32e42 684 return -1;
925e6570 685 }
48b32e42 686 if ( ! FetchTreeH() ) return -1;
687 if (fTrack < 0 || fTrack != track)
688 {
689 fData.ResetHits();
690 fData.GetTrack(track);
691 fTrack = track;
925e6570 692 }
48b32e42 693 return fData.Hits()->GetEntriesFast();
925e6570 694}
48b32e42 695
696
697AliMUONHit* AliMUONDataInterface::Hit(Int_t track, Int_t hit)
698{
699// Fetch the specified hit from the current event.
700// NULL is returned on error.
701
702 if (fRunloader == NULL)
703 {
8c343c7c 704 AliError("File not set.");
48b32e42 705 return NULL;
925e6570 706 }
48b32e42 707 if (fEventnumber < 0)
708 {
8c343c7c 709 AliError("Event not chosen.");
48b32e42 710 return NULL;
925e6570 711 }
48b32e42 712 if ( ! FetchTreeH() ) return NULL;
713 if (fTrack < 0 || fTrack != track)
714 {
715 fData.ResetHits();
716 fData.GetTrack(track);
717 fTrack = track;
925e6570 718 }
48b32e42 719 return static_cast<AliMUONHit*>( fData.Hits()->At(hit) );
925e6570 720}
48b32e42 721
722
723Int_t AliMUONDataInterface::NumberOfSDigits(Int_t chamber, Int_t cathode)
724{
725// Get the number of s-digits on the chamber, cathode in the current event.
726// -1 is returned on error.
727
728 Assert( 0 <= chamber && chamber <= 13 );
729 Assert( 0 <= cathode && cathode <= 1 );
730
731 if (fRunloader == NULL)
732 {
8c343c7c 733 AliError("File not set.");
48b32e42 734 return -1;
925e6570 735 }
48b32e42 736 if (fEventnumber < 0)
737 {
8c343c7c 738 AliError("Event not chosen.");
48b32e42 739 return -1;
925e6570 740 }
48b32e42 741
742 if ( ! FetchTreeS() ) return -1;
743 if ( fSCathode != cathode )
744 {
745 fData.ResetSDigits();
746 fData.GetCathodeS(cathode);
747 fSCathode = cathode;
925e6570 748 }
48b32e42 749 return fData.SDigits(chamber)->GetEntriesFast();
925e6570 750}
48b32e42 751
752
753AliMUONDigit* AliMUONDataInterface::SDigit(Int_t chamber, Int_t cathode, Int_t sdigit)
754{
755// Fetch the specified s-digits on the chamber, cathode from the current event.
756// NULL is returned on error.
757
758 Assert( 0 <= chamber && chamber <= 13 );
759 Assert( 0 <= cathode && cathode <= 1 );
760
761 if (fRunloader == NULL)
762 {
8c343c7c 763 AliError("File not set.");
48b32e42 764 return NULL;
925e6570 765 }
48b32e42 766 if (fEventnumber < 0)
767 {
8c343c7c 768 AliError("Event not chosen.");
48b32e42 769 return NULL;
925e6570 770 }
48b32e42 771
772 if ( ! FetchTreeS() ) return NULL;
773 if ( fSCathode != cathode )
774 {
775 fData.ResetSDigits();
776 fData.GetCathodeS(cathode);
777 fSCathode = cathode;
925e6570 778 }
48b32e42 779 return static_cast<AliMUONDigit*>( fData.SDigits(chamber)->At(sdigit) );
925e6570 780}
48b32e42 781
782
783Int_t AliMUONDataInterface::NumberOfDigits(Int_t chamber, Int_t cathode)
784{
785// Get the number of digits on the chamber, cathode in the current event.
786// -1 is returned on error.
787
788 Assert( 0 <= chamber && chamber <= 13 );
789 Assert( 0 <= cathode && cathode <= 1 );
790
791 if (fRunloader == NULL)
792 {
8c343c7c 793 AliError("File not set.");
48b32e42 794 return -1;
925e6570 795 }
48b32e42 796 if (fEventnumber < 0)
797 {
8c343c7c 798 AliError("Event not chosen.");
48b32e42 799 return -1;
925e6570 800 }
48b32e42 801
802 if ( ! FetchTreeD() ) return -1;
803 if ( fCathode != cathode )
804 {
805 fData.ResetDigits();
806 fData.GetCathode(cathode);
807 fCathode = cathode;
925e6570 808 }
48b32e42 809 return fData.Digits(chamber)->GetEntriesFast();
925e6570 810}
48b32e42 811
812
813AliMUONDigit* AliMUONDataInterface::Digit(Int_t chamber, Int_t cathode, Int_t digit)
814{
815// Fetch the specified digits on the chamber, cathode from the current event.
816// NULL is returned on error.
817
818 Assert( 0 <= chamber && chamber <= 13 );
819 Assert( 0 <= cathode && cathode <= 1 );
820
821 if (fRunloader == NULL)
822 {
8c343c7c 823 AliError("File not set.");
48b32e42 824 return NULL;
925e6570 825 }
48b32e42 826 if (fEventnumber < 0)
827 {
8c343c7c 828 AliError("Event not chosen.");
48b32e42 829 return NULL;
925e6570 830 }
48b32e42 831
832 if ( ! FetchTreeD() ) return NULL;
833 if ( fCathode != cathode )
834 {
835 fData.ResetDigits();
836 fData.GetCathode(cathode);
837 fCathode = cathode;
925e6570 838 }
48b32e42 839 return static_cast<AliMUONDigit*>( fData.Digits(chamber)->At(digit) );
925e6570 840}
48b32e42 841
842
843Int_t AliMUONDataInterface::NumberOfRawClusters(Int_t chamber)
844{
845// Get the number of raw clusters on the given chamber in the current event.
846// -1 is returned on error.
847
848 Assert( 0 <= chamber && chamber <= 13 );
849
850 if (fRunloader == NULL)
851 {
8c343c7c 852 AliError("File not set.");
48b32e42 853 return -1;
925e6570 854 }
48b32e42 855 if (fEventnumber < 0)
856 {
8c343c7c 857 AliError("Event not chosen.");
48b32e42 858 return -1;
925e6570 859 }
48b32e42 860
861 if ( ! FetchTreeR() ) return -1;
862 if ( ! fClusterAddressSet )
863 {
864 fData.SetTreeAddress("RC");
865 fData.ResetRawClusters();
866 fData.GetRawClusters();
867 fClusterAddressSet = kTRUE;
925e6570 868 }
48b32e42 869 return fData.RawClusters(chamber)->GetEntriesFast();
925e6570 870}
48b32e42 871
872
873AliMUONRawCluster* AliMUONDataInterface::RawCluster(Int_t chamber, Int_t cluster)
874{
875// Fetch the specified raw cluster on the given chamber from the current event.
876// NULL is returned on error.
877
878 Assert( 0 <= chamber && chamber <= 13 );
879
880 if (fRunloader == NULL)
881 {
8c343c7c 882 AliError("File not set.");
48b32e42 883 return NULL;
925e6570 884 }
48b32e42 885 if (fEventnumber < 0)
886 {
8c343c7c 887 AliError("Event not chosen.");
48b32e42 888 return NULL;
925e6570 889 }
48b32e42 890
891 if ( ! FetchTreeR() ) return NULL;
892 if ( ! fClusterAddressSet )
893 {
894 fData.SetTreeAddress("RC");
895 fData.ResetRawClusters();
896 fData.GetRawClusters();
897 fClusterAddressSet = kTRUE;
925e6570 898 }
48b32e42 899 return static_cast<AliMUONRawCluster*>( fData.RawClusters(chamber)->At(cluster) );
925e6570 900}
48b32e42 901
902
903Int_t AliMUONDataInterface::NumberOfLocalTriggers()
904{
905// Get the number of local trigger objects in the current event.
906// -1 is returned on error.
907
908 if (fRunloader == NULL)
909 {
8c343c7c 910 AliError("File not set.");
48b32e42 911 return -1;
925e6570 912 }
48b32e42 913 if (fEventnumber < 0)
914 {
8c343c7c 915 AliError("Event not chosen.");
48b32e42 916 return -1;
925e6570 917 }
48b32e42 918
2be06f1e 919 if ( ! FetchTreeD() ) return -1;
48b32e42 920 if ( ! fTriggerAddressSet )
921 {
922 fData.SetTreeAddress("GLT");
923 fData.ResetTrigger();
2be06f1e 924 fData.GetTriggerD();
48b32e42 925 fTriggerAddressSet = kTRUE;
925e6570 926 }
48b32e42 927 return fData.LocalTrigger()->GetEntriesFast();
925e6570 928}
48b32e42 929
930
931AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(Int_t trigger)
932{
933// Fetch the specified local trigger object from the current event.
934// NULL is returned on error.
935
936 if (fRunloader == NULL)
937 {
8c343c7c 938 AliError("File not set.");
48b32e42 939 return NULL;
925e6570 940 }
48b32e42 941 if (fEventnumber < 0)
942 {
8c343c7c 943 AliError( "Event not chosen.");
48b32e42 944 return NULL;
925e6570 945 }
48b32e42 946
2be06f1e 947 if ( ! FetchTreeD() ) return NULL;
48b32e42 948 if ( ! fTriggerAddressSet )
949 {
950 fData.SetTreeAddress("GLT");
951 fData.ResetTrigger();
2be06f1e 952 fData.GetTriggerD();
48b32e42 953 fTriggerAddressSet = kTRUE;
925e6570 954 }
48b32e42 955 return static_cast<AliMUONLocalTrigger*>( fData.LocalTrigger()->At(trigger) );
925e6570 956}