a5fe2c41 |
1 | #ifndef ALI_TRANSPORTMONITOR__H |
2 | #define ALI_TRANSPORTMONITOR__H |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
4 | * See cxx source for full Copyright notice */ |
5 | |
6 | #ifndef ROOT_TNamed |
7 | #include "TNamed.h" |
8 | #endif |
9 | |
10 | #include <map> |
11 | |
12 | #ifndef ROOT_TStopwatch |
13 | #include "TStopwatch.h" |
14 | #endif |
15 | |
16 | // Class that can be plugged in the simulation to monitor transport timing per |
17 | // particle for each geometry volume. |
18 | // |
19 | // andrei.gheata@cern.ch |
20 | |
21 | class TH2F; |
22 | |
23 | |
24 | //______________________________________________________________________________ |
25 | class AliTransportMonitor : public TObject { |
26 | public: |
27 | //________________________________________________________________ |
28 | class AliTransportMonitorVol : public TNamed { |
29 | public: |
30 | //___________________________________________________ |
31 | class AliPMonData { |
32 | public: |
33 | Int_t fPDG; // particle PDG |
34 | Double_t fEdt; // Energy * dt integral |
35 | Double_t fTime; // Total transport time for the particle in this volume |
36 | AliPMonData() : fPDG(0), fEdt(0), fTime(0) {} |
37 | virtual ~AliPMonData() {} |
38 | ClassDef(AliPMonData, 1) // Basic monitoring info structure |
39 | }; |
40 | //___________________________________________________ |
41 | AliTransportMonitorVol(); |
42 | virtual ~AliTransportMonitorVol(); |
43 | |
44 | Int_t GetNtypes() const {return fNtypes;} |
45 | void StepInfo(Int_t pdg, |
46 | Double_t energy, |
47 | Double_t dt, |
48 | Double_t x, Double_t y, Double_t z); |
49 | Double_t GetTotalTime() const {return fTotalTime;} |
50 | Double_t GetTime(Int_t itype) const {return fPData[itype].fTime;} |
51 | Double_t GetEmed(Int_t itype) const {return (fTotalTime>0)?fPData[itype].fEdt/fTotalTime : 0.;} |
52 | Int_t GetPDG(Int_t itype) const {return fPData[itype].fPDG;} |
53 | TH2F *GetHistogram() const {return fTimeRZ;} |
54 | private: |
55 | AliPMonData &GetPMonData(Int_t pdg); |
56 | AliTransportMonitorVol(const AliTransportMonitorVol& other) : TNamed(other), fNtypes(0), fTotalTime(0), fPData(0), fTimeRZ(0), fParticles() {} |
57 | AliTransportMonitorVol &operator=(const AliTransportMonitorVol&) {return *this;} |
58 | private: |
59 | Int_t fNtypes; // Number of different particle types |
60 | Double_t fTotalTime; // Total time spent in this volume |
61 | AliPMonData *fPData; //[fNtypes] Array of particle data |
62 | TH2F *fTimeRZ; // Timing R-Z histogram per volume |
63 | typedef std::map<Int_t, Int_t> ParticleMap_t; |
64 | typedef ParticleMap_t::iterator ParticleMapIt_t; |
65 | ParticleMap_t fParticles; //! Map of stored particla data |
66 | |
67 | ClassDef(AliTransportMonitorVol,1) // Helper to hold particle info per volume |
68 | }; |
69 | //________________________________________________________________ |
70 | private: |
71 | AliTransportMonitor(const AliTransportMonitor&other) : TObject(other), fTotalTime(0), fTimer(), fVolumeMon(0) {} |
72 | AliTransportMonitor &operator=(const AliTransportMonitor&) {return *this;} |
73 | public: |
74 | AliTransportMonitor(); |
75 | AliTransportMonitor(Int_t nvolumes); |
76 | virtual ~AliTransportMonitor(); |
77 | |
78 | void StepInfo(Int_t volId, |
79 | Int_t pdg, |
80 | Double_t energy, |
81 | Double_t x, Double_t y, Double_t z); |
82 | void Print(Option_t *volName="") const; |
83 | void DummyStep(); |
84 | void Start(); |
85 | void Stop(); |
86 | void Export(const char *fname); |
87 | static AliTransportMonitor *Import(const char *fname); |
88 | private: |
89 | Double_t fTotalTime; // Total simulation time |
90 | TStopwatch fTimer; //! Global timer |
91 | TObjArray *fVolumeMon; // Array of monitoring objects per volume |
92 | |
93 | ClassDef(AliTransportMonitor,1) // Class to monitor timing per volume |
94 | }; |
95 | //______________________________________________________________________________ |
96 | |
97 | |
98 | #endif //ALI_TRANSPORTMONITOR__H |