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

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

#include <map>

#ifndef ROOT_TStopwatch
#include "TStopwatch.h"
#endif

#ifndef ROOT_TH2F
#include "TH2F.h"
#endif

// Class that can be plugged in the simulation to monitor transport timing per 
// particle for each geometry volume.
//
//  andrei.gheata@cern.ch 



//______________________________________________________________________________
class AliTransportMonitor : public TObject {
public:
  //________________________________________________________________
  class AliTransportMonitorVol : public TNamed {
  public:
    //___________________________________________________
    class AliPMonData {
    public:
      Int_t         fPDG;        // particle PDG
      Double_t      fEdt;        // Energy * dt integral
      Double_t      fTime;       // Total transport time for the particle in this volume
      AliPMonData() : fPDG(0), fEdt(0), fTime(0) {}
      virtual ~AliPMonData() {}
      ClassDef(AliPMonData, 1)     // Basic monitoring info structure
    };   
    //___________________________________________________   
    AliTransportMonitorVol();
    virtual ~AliTransportMonitorVol();
    
    Int_t           GetNtypes() const {return fNtypes;}
    void            StepInfo(Int_t    pdg,
                             Double_t energy, 
                             Double_t dt,
                             Double_t x, Double_t y, Double_t z);
    Double_t        GetTotalTime() const       {return fTotalTime;}
    Double_t        GetTime(Int_t itype) const {return fPData[itype].fTime;}
    Double_t        GetEmed(Int_t itype) const {return (fTotalTime>0)?fPData[itype].fEdt/fTotalTime : 0.;}
    Int_t           GetPDG(Int_t itype)  const {return fPData[itype].fPDG;}
    Double_t        GetNSteps() const {return fNSteps;}
    TH2F           *GetHistogram() const {return fTimeRZ;}
    AliPMonData    *GetPMonData(Int_t itype) const {return &(fPData[itype]);} 
    void            Merge(AliTransportMonitorVol* volM);
    private:
      AliPMonData  &GetPMonData(Int_t pdg);
  AliTransportMonitorVol(const AliTransportMonitorVol& other) : TNamed(other), fNtypes(0), fTotalTime(0), fNSteps(0), fPData(0), fTimeRZ(0), fParticles() {}
      AliTransportMonitorVol &operator=(const AliTransportMonitorVol&) {return *this;}
    private:
      Int_t         fNtypes;     // Number of different particle types
      Double_t      fTotalTime;  // Total time spent in this volume
      Double_t      fNSteps;     // Total number of steps
      AliPMonData  *fPData;      //[fNtypes] Array of particle data
      TH2F         *fTimeRZ;     // Timing R-Z histogram per volume
      typedef std::map<Int_t, Int_t>         ParticleMap_t;
      typedef ParticleMap_t::iterator        ParticleMapIt_t;
      ParticleMap_t fParticles;  //! Map of stored particla data  
  
  ClassDef(AliTransportMonitorVol,2)  // Helper to hold particle info per volume
  };
  //________________________________________________________________
private:
  AliTransportMonitor(const AliTransportMonitor&other) : TObject(other), fTotalTime(0), fTimer(), fVolumeMon(0) {}
  AliTransportMonitor &operator=(const AliTransportMonitor&) {return *this;}
public:
  AliTransportMonitor();
  AliTransportMonitor(Int_t nvolumes);
  virtual ~AliTransportMonitor();
  
  void              StepInfo(Int_t    volId,
                             Int_t    pdg,
                             Double_t energy, 
                             Double_t x, Double_t y, Double_t z);
  void              Print(Option_t *volName="") const;
  void              DummyStep();
  void              Start();
  void              Stop();
  void              Export(const char *fname);
  TObjArray*        GetVolumes() const {return fVolumeMon;}
  void              Merge(AliTransportMonitor* mergeMon);
  static AliTransportMonitor *Import(const char *fname);
private:
  Double_t          fTotalTime;  // Total simulation time
  TStopwatch        fTimer;      //! Global timer
  TObjArray        *fVolumeMon;  // Array of monitoring objects per volume
  
ClassDef(AliTransportMonitor,1)  // Class to monitor timing per volume 
};
//______________________________________________________________________________


#endif //ALI_TRANSPORTMONITOR__H
 AliTransportMonitor.h:1
 AliTransportMonitor.h:2
 AliTransportMonitor.h:3
 AliTransportMonitor.h:4
 AliTransportMonitor.h:5
 AliTransportMonitor.h:6
 AliTransportMonitor.h:7
 AliTransportMonitor.h:8
 AliTransportMonitor.h:9
 AliTransportMonitor.h:10
 AliTransportMonitor.h:11
 AliTransportMonitor.h:12
 AliTransportMonitor.h:13
 AliTransportMonitor.h:14
 AliTransportMonitor.h:15
 AliTransportMonitor.h:16
 AliTransportMonitor.h:17
 AliTransportMonitor.h:18
 AliTransportMonitor.h:19
 AliTransportMonitor.h:20
 AliTransportMonitor.h:21
 AliTransportMonitor.h:22
 AliTransportMonitor.h:23
 AliTransportMonitor.h:24
 AliTransportMonitor.h:25
 AliTransportMonitor.h:26
 AliTransportMonitor.h:27
 AliTransportMonitor.h:28
 AliTransportMonitor.h:29
 AliTransportMonitor.h:30
 AliTransportMonitor.h:31
 AliTransportMonitor.h:32
 AliTransportMonitor.h:33
 AliTransportMonitor.h:34
 AliTransportMonitor.h:35
 AliTransportMonitor.h:36
 AliTransportMonitor.h:37
 AliTransportMonitor.h:38
 AliTransportMonitor.h:39
 AliTransportMonitor.h:40
 AliTransportMonitor.h:41
 AliTransportMonitor.h:42
 AliTransportMonitor.h:43
 AliTransportMonitor.h:44
 AliTransportMonitor.h:45
 AliTransportMonitor.h:46
 AliTransportMonitor.h:47
 AliTransportMonitor.h:48
 AliTransportMonitor.h:49
 AliTransportMonitor.h:50
 AliTransportMonitor.h:51
 AliTransportMonitor.h:52
 AliTransportMonitor.h:53
 AliTransportMonitor.h:54
 AliTransportMonitor.h:55
 AliTransportMonitor.h:56
 AliTransportMonitor.h:57
 AliTransportMonitor.h:58
 AliTransportMonitor.h:59
 AliTransportMonitor.h:60
 AliTransportMonitor.h:61
 AliTransportMonitor.h:62
 AliTransportMonitor.h:63
 AliTransportMonitor.h:64
 AliTransportMonitor.h:65
 AliTransportMonitor.h:66
 AliTransportMonitor.h:67
 AliTransportMonitor.h:68
 AliTransportMonitor.h:69
 AliTransportMonitor.h:70
 AliTransportMonitor.h:71
 AliTransportMonitor.h:72
 AliTransportMonitor.h:73
 AliTransportMonitor.h:74
 AliTransportMonitor.h:75
 AliTransportMonitor.h:76
 AliTransportMonitor.h:77
 AliTransportMonitor.h:78
 AliTransportMonitor.h:79
 AliTransportMonitor.h:80
 AliTransportMonitor.h:81
 AliTransportMonitor.h:82
 AliTransportMonitor.h:83
 AliTransportMonitor.h:84
 AliTransportMonitor.h:85
 AliTransportMonitor.h:86
 AliTransportMonitor.h:87
 AliTransportMonitor.h:88
 AliTransportMonitor.h:89
 AliTransportMonitor.h:90
 AliTransportMonitor.h:91
 AliTransportMonitor.h:92
 AliTransportMonitor.h:93
 AliTransportMonitor.h:94
 AliTransportMonitor.h:95
 AliTransportMonitor.h:96
 AliTransportMonitor.h:97
 AliTransportMonitor.h:98
 AliTransportMonitor.h:99
 AliTransportMonitor.h:100
 AliTransportMonitor.h:101
 AliTransportMonitor.h:102
 AliTransportMonitor.h:103
 AliTransportMonitor.h:104
 AliTransportMonitor.h:105
 AliTransportMonitor.h:106
 AliTransportMonitor.h:107