ROOT logo
#ifndef ALIMUONMCDATAINTERFACE_H
#define ALIMUONMCDATAINTERFACE_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

// $Id$

/// \ingroup sim
/// \class AliMUONMCDataInterface
/// \brief Easy to use data access to MC information
/// 
// Author Laurent Aphecetche
//
// Moved parts of old AliMUONDataInterface interface to AliMUONMCDataInterface
//  Artur Szostak <artursz@iafrica.com> (University of Cape Town)

#ifndef ROOT_TObject
#  include "TObject.h"
#endif

class AliMUONVStore;
class AliMUONVHitStore;
class AliMUONVDigitStore;
class AliMUONVTriggerStore;
class AliMUONHit;
class AliMUONVDigit;
class AliMUONLocalTrigger;
class AliMUONRegionalTrigger;
class AliMUONGlobalTrigger;

class AliLoader;
class AliStack;

class TIterator;
class TClonesArray;
class TParticle;

class AliMUONMCDataInterface : public TObject
{
public:
  AliMUONMCDataInterface(const char* filename="galice.root");
  virtual ~AliMUONMCDataInterface();

  void Open(const char* filename);
  
  /// Returns true if the data interface was able to open the root file correctly.
  Bool_t IsValid() const { return fIsValid; };

  Int_t NumberOfEvents() const;

  /// Returns the index number of the current event loaded.
  /// This is the event number as was used in the last calls to any of the methods
  /// in this interface that have 'Int_t event' in the parameter list.
  /// GetEvent(Int_t event) for example.
  Int_t   CurrentEvent() const { return fCurrentEvent; }

  Int_t NumberOfTracks(Int_t event);
  Int_t NumberOfTrackRefs(Int_t event);
  
  AliMUONVHitStore* HitStore(Int_t event, Int_t track);
  AliMUONVDigitStore* SDigitStore(Int_t event);
  AliMUONVDigitStore* DigitStore(Int_t event);
  AliStack* Stack(Int_t event);
  TClonesArray* TrackRefs(Int_t event, Int_t track);
  AliMUONVTriggerStore* TriggerStore(Int_t event);
  
  void DumpDigits(Int_t event, Bool_t sorted=kTRUE);
  void DumpSDigits(Int_t event, Bool_t sorted=kTRUE);
  void DumpHits(Int_t event);
  void DumpKine(Int_t event);
  void DumpTrackRefs(Int_t event);
  void DumpTrigger(Int_t event);
  
  Bool_t GetEvent(Int_t event = 0);
  
  // Note the following methods can be extremely slow. Remember they are only
  // here for end user convenience for his/her small tests and macros.
  // If you want speed then don't use these methods. If you really want peak
  // performance then you should be talking to the AliRunLoader and Store
  // objects directly.
  Int_t NumberOfParticles();
  TParticle* Particle(Int_t index);
  Int_t NumberOfTracks();
  Int_t NumberOfHits(Int_t track);
  AliMUONHit* Hit(Int_t track, Int_t index);
  Int_t NumberOfSDigits(Int_t detElemId);
  AliMUONVDigit* SDigit(Int_t detElemId, Int_t index);
  Int_t NumberOfSDigits(Int_t chamber, Int_t cathode);
  AliMUONVDigit* SDigit(Int_t chamber, Int_t cathode, Int_t index);
  Int_t NumberOfDigits(Int_t detElemId);
  AliMUONVDigit* Digit(Int_t detElemId, Int_t index);
  Int_t NumberOfDigits(Int_t chamber, Int_t cathode);
  AliMUONVDigit* Digit(Int_t chamber, Int_t cathode, Int_t index);
  Int_t NumberOfLocalTriggers();
  AliMUONLocalTrigger* LocalTrigger(Int_t index);
  Int_t NumberOfRegionalTriggers();
  AliMUONRegionalTrigger* RegionalTrigger(Int_t index);
  AliMUONGlobalTrigger* GlobalTrigger();
  Int_t NumberOfTrackRefs();
  TClonesArray* TrackRefs(Int_t track);
  
private:

  /// The various identifiers for the type of iterator constructed.
  enum IteratorType
  {
    kNoIterator,  ///< No iterator was constructed.
    kHitIterator,  ///< An iterator to iterate over the hits.
    kSDigitIteratorByDetectorElement,  ///< A summable digit iterator to iterate over the detector elements.
    kSDigitIteratorByChamberAndCathode,  ///< A summable digit iterator to iterate over chambers and cathodes.
    kDigitIteratorByDetectorElement,  ///< An iterator for simulated digits to iterate over the detector elements.
    kDigitIteratorByChamberAndCathode,  ///< An iterator for simulated digits to iterate over chambers and cathodes.
    kLocalTriggerIterator,  ///< An iterator for iterating over the simulated local triggers.
    kRegionalTriggerIterator  ///< An iterator for iterating over the simulated regional triggers.
  };
  
  /// Not implemented
  AliMUONMCDataInterface(const AliMUONMCDataInterface&);
  /// Not implemented
  AliMUONMCDataInterface& operator=(const AliMUONMCDataInterface&);

  void DumpSorted(const AliMUONVStore& store) const;
  Bool_t LoadEvent(Int_t event);
  
  void ResetStores();
  
  TIterator* GetIterator(IteratorType type, Int_t x = 0, Int_t y = 0);
  void ResetIterator();
  
  Int_t CountObjects(TIterator* iter);
  TObject* FetchObject(TIterator* iter, Int_t index);
  
  
  AliLoader* fLoader; //!< Tree accessor
  AliMUONVHitStore* fHitStore; //!< current hit store (owner)
  AliMUONVDigitStore* fSDigitStore; //!< current sdigit store (owner)
  AliMUONVDigitStore* fDigitStore; //!< current digit store (owner)
  AliMUONVTriggerStore* fTriggerStore; //!< current trigger store (owner)
  TClonesArray* fTrackRefs; //!< current trackrefs (owner)
  Int_t fCurrentEvent; //!< Current event we've read in
  Bool_t fIsValid; //!< whether we were initialized properly or not
  
  IteratorType fCurrentIteratorType;  //!< The type of iterator that is currently set.
  Int_t fCurrentIndex;  //!< A current index number maintained for certain iteration operations.
  Int_t fDataX; //!< Extra data parameter about the iterator, can be the chamber number, detector element or track number.
  Int_t fDataY; //!< Extra data parameter about the iterator, can be the cathode number.
  TIterator* fIterator; //!< Iterator for various iteration operations.
  
  static Int_t fgInstanceCounter; //!< To build unique folder name for each instance

  ClassDef(AliMUONMCDataInterface,0) // Easy to use MC data accessor
};

#endif
 AliMUONMCDataInterface.h:1
 AliMUONMCDataInterface.h:2
 AliMUONMCDataInterface.h:3
 AliMUONMCDataInterface.h:4
 AliMUONMCDataInterface.h:5
 AliMUONMCDataInterface.h:6
 AliMUONMCDataInterface.h:7
 AliMUONMCDataInterface.h:8
 AliMUONMCDataInterface.h:9
 AliMUONMCDataInterface.h:10
 AliMUONMCDataInterface.h:11
 AliMUONMCDataInterface.h:12
 AliMUONMCDataInterface.h:13
 AliMUONMCDataInterface.h:14
 AliMUONMCDataInterface.h:15
 AliMUONMCDataInterface.h:16
 AliMUONMCDataInterface.h:17
 AliMUONMCDataInterface.h:18
 AliMUONMCDataInterface.h:19
 AliMUONMCDataInterface.h:20
 AliMUONMCDataInterface.h:21
 AliMUONMCDataInterface.h:22
 AliMUONMCDataInterface.h:23
 AliMUONMCDataInterface.h:24
 AliMUONMCDataInterface.h:25
 AliMUONMCDataInterface.h:26
 AliMUONMCDataInterface.h:27
 AliMUONMCDataInterface.h:28
 AliMUONMCDataInterface.h:29
 AliMUONMCDataInterface.h:30
 AliMUONMCDataInterface.h:31
 AliMUONMCDataInterface.h:32
 AliMUONMCDataInterface.h:33
 AliMUONMCDataInterface.h:34
 AliMUONMCDataInterface.h:35
 AliMUONMCDataInterface.h:36
 AliMUONMCDataInterface.h:37
 AliMUONMCDataInterface.h:38
 AliMUONMCDataInterface.h:39
 AliMUONMCDataInterface.h:40
 AliMUONMCDataInterface.h:41
 AliMUONMCDataInterface.h:42
 AliMUONMCDataInterface.h:43
 AliMUONMCDataInterface.h:44
 AliMUONMCDataInterface.h:45
 AliMUONMCDataInterface.h:46
 AliMUONMCDataInterface.h:47
 AliMUONMCDataInterface.h:48
 AliMUONMCDataInterface.h:49
 AliMUONMCDataInterface.h:50
 AliMUONMCDataInterface.h:51
 AliMUONMCDataInterface.h:52
 AliMUONMCDataInterface.h:53
 AliMUONMCDataInterface.h:54
 AliMUONMCDataInterface.h:55
 AliMUONMCDataInterface.h:56
 AliMUONMCDataInterface.h:57
 AliMUONMCDataInterface.h:58
 AliMUONMCDataInterface.h:59
 AliMUONMCDataInterface.h:60
 AliMUONMCDataInterface.h:61
 AliMUONMCDataInterface.h:62
 AliMUONMCDataInterface.h:63
 AliMUONMCDataInterface.h:64
 AliMUONMCDataInterface.h:65
 AliMUONMCDataInterface.h:66
 AliMUONMCDataInterface.h:67
 AliMUONMCDataInterface.h:68
 AliMUONMCDataInterface.h:69
 AliMUONMCDataInterface.h:70
 AliMUONMCDataInterface.h:71
 AliMUONMCDataInterface.h:72
 AliMUONMCDataInterface.h:73
 AliMUONMCDataInterface.h:74
 AliMUONMCDataInterface.h:75
 AliMUONMCDataInterface.h:76
 AliMUONMCDataInterface.h:77
 AliMUONMCDataInterface.h:78
 AliMUONMCDataInterface.h:79
 AliMUONMCDataInterface.h:80
 AliMUONMCDataInterface.h:81
 AliMUONMCDataInterface.h:82
 AliMUONMCDataInterface.h:83
 AliMUONMCDataInterface.h:84
 AliMUONMCDataInterface.h:85
 AliMUONMCDataInterface.h:86
 AliMUONMCDataInterface.h:87
 AliMUONMCDataInterface.h:88
 AliMUONMCDataInterface.h:89
 AliMUONMCDataInterface.h:90
 AliMUONMCDataInterface.h:91
 AliMUONMCDataInterface.h:92
 AliMUONMCDataInterface.h:93
 AliMUONMCDataInterface.h:94
 AliMUONMCDataInterface.h:95
 AliMUONMCDataInterface.h:96
 AliMUONMCDataInterface.h:97
 AliMUONMCDataInterface.h:98
 AliMUONMCDataInterface.h:99
 AliMUONMCDataInterface.h:100
 AliMUONMCDataInterface.h:101
 AliMUONMCDataInterface.h:102
 AliMUONMCDataInterface.h:103
 AliMUONMCDataInterface.h:104
 AliMUONMCDataInterface.h:105
 AliMUONMCDataInterface.h:106
 AliMUONMCDataInterface.h:107
 AliMUONMCDataInterface.h:108
 AliMUONMCDataInterface.h:109
 AliMUONMCDataInterface.h:110
 AliMUONMCDataInterface.h:111
 AliMUONMCDataInterface.h:112
 AliMUONMCDataInterface.h:113
 AliMUONMCDataInterface.h:114
 AliMUONMCDataInterface.h:115
 AliMUONMCDataInterface.h:116
 AliMUONMCDataInterface.h:117
 AliMUONMCDataInterface.h:118
 AliMUONMCDataInterface.h:119
 AliMUONMCDataInterface.h:120
 AliMUONMCDataInterface.h:121
 AliMUONMCDataInterface.h:122
 AliMUONMCDataInterface.h:123
 AliMUONMCDataInterface.h:124
 AliMUONMCDataInterface.h:125
 AliMUONMCDataInterface.h:126
 AliMUONMCDataInterface.h:127
 AliMUONMCDataInterface.h:128
 AliMUONMCDataInterface.h:129
 AliMUONMCDataInterface.h:130
 AliMUONMCDataInterface.h:131
 AliMUONMCDataInterface.h:132
 AliMUONMCDataInterface.h:133
 AliMUONMCDataInterface.h:134
 AliMUONMCDataInterface.h:135
 AliMUONMCDataInterface.h:136
 AliMUONMCDataInterface.h:137
 AliMUONMCDataInterface.h:138
 AliMUONMCDataInterface.h:139
 AliMUONMCDataInterface.h:140
 AliMUONMCDataInterface.h:141
 AliMUONMCDataInterface.h:142
 AliMUONMCDataInterface.h:143
 AliMUONMCDataInterface.h:144
 AliMUONMCDataInterface.h:145
 AliMUONMCDataInterface.h:146
 AliMUONMCDataInterface.h:147
 AliMUONMCDataInterface.h:148
 AliMUONMCDataInterface.h:149
 AliMUONMCDataInterface.h:150
 AliMUONMCDataInterface.h:151
 AliMUONMCDataInterface.h:152
 AliMUONMCDataInterface.h:153
 AliMUONMCDataInterface.h:154
 AliMUONMCDataInterface.h:155