New version from Y.Kharlov
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.h
1 #ifndef PHOS_H
2 #define PHOS_H
3 ////////////////////////////////////////////////
4 //  Manager and hits classes for set:PHOS     //
5 ////////////////////////////////////////////////
6  
7 // --- ROOT system ---
8 #include <TArray.h> 
9 #include <TRandom.h> 
10 #include <TH2.h>
11 #include <TVector3.h>
12
13 // --- galice header files ---
14 #include "AliDetector.h"
15 #include "AliHit.h"
16 #include "AliRun.h"
17
18 class AliPHOSgamma : public TObject {
19
20   public:
21                         virtual ~AliPHOSgamma(void) {}
22                         AliPHOSgamma(void) {}
23                         AliPHOSgamma(const AliPHOSgamma &g) { *this=g; }
24                         AliPHOSgamma(Float_t X,  Float_t Y,  Float_t E, 
25                                      Float_t Px, Float_t Py, Float_t Pz,
26                                      Int_t Ipart) :
27                           fX(X),   fY(Y),   fE(E), 
28                           fPx(Px), fPy(Py), fPz(Pz),
29                           fIpart(Ipart)
30                         {}
31
32     Float_t             fX;             // cm. x-coordinate (in beam direction)
33     Float_t             fY;             // cm. y-coordinate (around beam)
34
35     Float_t             fE;             // GeV. energy
36
37     Float_t             fPx;            // GeV. Gamma momentum Px
38     Float_t             fPy;            // GeV. Gamma momentum Py
39     Float_t             fPz;            // GeV. Gamma momentum Pz
40
41     Int_t               fIpart;         // Current particle number (GEANT particle code)
42
43     void                Print(Option_t *options=NULL);
44     AliPHOSgamma       &operator=(const AliPHOSgamma &g);
45
46  private:
47
48     ClassDef(AliPHOSgamma,1)            // Gamma particle in PHOS cradle
49 };
50
51 //______________________________________________________________________________
52
53 class AliPHOShit : public AliHit {
54    
55 public:
56   Int_t     fVolume[5];  //array of volumes
57   Float_t   fELOS;       //ELOS
58  
59 public:
60   AliPHOShit() {}
61   AliPHOShit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits);
62   virtual ~AliPHOShit() {}
63  
64   ClassDef(AliPHOShit,1)  //Hits object for set:PHOS
65 };
66  
67 //______________________________________________________________________________
68
69
70 class AliPHOSCradle : public TObject {
71
72   public:
73
74     virtual            ~AliPHOSCradle(void);
75                         AliPHOSCradle(void);
76                         AliPHOSCradle(int   Geometry           ,
77                                       float CrystalSideSize    ,
78                                       float CrystalLength      ,
79                                       float WrapThickness      ,
80                                       float AirThickness       ,
81                                       float PIN_SideSize       ,
82                                       float PIN_Length         ,
83                                       float Radius             ,
84                                       int   Nz                 ,
85                                       int   Nphi               ,
86                                       float Angle );
87     Float_t             GetCrystalSideSize     (void) const {return fCrystalSideSize;}
88     Float_t             GetCellSideSize        (void) const {return fCrystalSideSize+2*fWrapThickness+2*fAirThickness;}
89     Float_t             GetCrystalLength       (void) const {return fCrystalLength;}
90     Float_t             GetWrapThickness       (void) const {return fWrapThickness;}
91     Float_t             GetAirThickness        (void) const {return fAirThickness;}
92     Float_t             GetPIN_SideSize        (void) const {return fPIN_SideSize;}
93     Float_t             GetPIN_Length          (void) const {return fPIN_Length;}
94     Float_t             GetRadius              (void) const {return fRadius;}
95     Int_t               GetNz                  (void) const {return fNz;}
96     Int_t               GetNphi                (void) const {return fNphi;}
97     Float_t             GetPhi                 (void) const {return fPhi;}
98
99     void                Clear(Option_t *opt="");                            // Clear all data.
100     void                Print(Option_t *opt="");
101     void                Distortion(const TH2F *Noise=NULL, const TH2F *Stochastic=NULL, const TH2F *Calibration=NULL);
102     TH2F               *CreateHistForDistortion(const char *name, const char *title, Int_t Nx, Int_t Ny, 
103                                                  Float_t MU_mu, Float_t MU_sigma, Float_t SIGMA_mu, Float_t SIGMA_sigma);
104     Float_t             GetDistortedValue(const TH2F *h, UInt_t n);
105
106     void                Reconstruction(Float_t signal_step, UInt_t min_signal_reject);
107
108     void                GetXY(const TVector3 &p,const TVector3 &v,float R,float &x,float &y,float &l) const;
109
110     TObjArray          &GetGammasReconstructed (void)       {return fGammasReconstructed;}
111     TObjArray          &GetParticles           (void)       {return fParticles;}
112
113     TH2F                fCellEnergy;                            // GeV. Energy in cells
114     TH2S                fChargedTracksInPIN;                    // amount. hits in PIN
115
116
117   private:
118
119     Int_t               fGeometry;                              // Geometry type: 1 or 2
120     Float_t             fCrystalSideSize;                       // cm.
121     Float_t             fCrystalLength;                         // cm.
122     Float_t             fWrapThickness;                         // cm.
123     Float_t             fAirThickness;                          // cm.
124     Float_t             fPIN_SideSize;                          // cm.
125     Float_t             fPIN_Length;                            // cm.
126
127     Float_t             fRadius;                                // cm. Distance to PHOS
128
129
130     Int_t               fNz;                                    // Cells amount in beam direction
131     Int_t               fNphi;                                  // Cells amount around beam
132
133     Float_t             fPhi;                                   // degree. Position of CRADLE center
134
135     TObjArray           fGammasReconstructed;                   // List of reconstructed gammas
136     TObjArray           fParticles;                             // List of particles in the direction of this cradle
137
138     TRandom             r;                                      //! Random number class, do not stream
139
140 //  friend class AliPHOS;
141
142     ClassDef(AliPHOSCradle,1)   // PHOS cradle
143 };
144
145 class AliPHOS : public AliDetector {
146
147  public:
148
149     enum {CradlesBranch_Bit=1};
150
151                         AliPHOS();
152                         AliPHOS(const char *name, const char *title);
153   virtual              ~AliPHOS();
154   virtual void          AddHit(Int_t, Int_t*, Float_t*);
155   virtual void          BuildGeometry();
156   virtual void          CreateGeometry() {}
157   virtual void          CreateMaterials();
158   Int_t                 DistancetoPrimitive(Int_t px, Int_t py);
159   void                  FinishEvent(void);
160
161   virtual void          Init();
162   virtual Int_t         IsVersion() const =0;
163   void                  MakeBranch(Option_t *option);
164   void                  SetTreeAddress(void);
165   void                  FinishRun(void);
166   void                  ResetDigits(void);
167   void                  Print(Option_t *opt="");
168   AliPHOSCradle        *GetCradleOfTheParticle(const TVector3 &p,const TVector3 &v) const;
169   AliPHOSCradle        &GetCradle(int n) {return *(AliPHOSCradle*)fCradles->operator[](n);}
170   //  AliPHOSCradle        &GetCradle(int n) {return *((AliPHOSCradle*) (*fCradles)[n]) ;}
171   void                  Reconstruction(Float_t signal_step, UInt_t min_signal_reject);
172   virtual void          SetFlags(Float_t p1,Float_t p2=0,Float_t p3=0,Float_t p4=0,
173                                Float_t p5=0,Float_t p6=0,Float_t p7=0,Float_t p8=0,Float_t p9=0);
174   virtual void          SetCell(Float_t p1,Float_t p2=0,Float_t p3=0,Float_t p4=0,
175                                Float_t p5=0,Float_t p6=0,Float_t p7=0,Float_t p8=0,Float_t p9=0);
176   virtual void          SetRadius(Float_t radius);
177   virtual void          SetCradleSize(Int_t nz, Int_t nphi, Int_t ncradles);
178   virtual void          SetCradleA(Float_t angle);
179   virtual void          SetExtra(Float_t p1,Float_t p2=0,Float_t p3=0,Float_t p4=0,
180                                Float_t p5=0,Float_t p6=0,Float_t p7=0,Float_t p8=0,Float_t p9=0);
181   virtual void          SetTextolitWall(Float_t dx, Float_t dy, Float_t dz);
182   virtual void          SetInnerAir(Float_t dx, Float_t dy, Float_t dz);
183   virtual void          SetFoam(Float_t dx, Float_t dy, Float_t dz, Float_t dr);
184   virtual void          StepManager()=0;
185   virtual void          DefPars();
186   virtual void          AddPHOSCradles();
187
188   
189   virtual Int_t GetPHOS_IDTMED_PbWO4         (void){return (*fIdtmed)[0];}
190   virtual Int_t GetPHOS_IDTMED_Al            (void){return (*fIdtmed)[2];}
191   virtual Int_t GetPHOS_IDTMED_Tyvek         (void){return (*fIdtmed)[3];}
192   virtual Int_t GetPHOS_IDTMED_PIN           (void){return (*fIdtmed)[4];}
193   virtual Int_t GetPHOS_IDTMED_AIR           (void){return (*fIdtmed)[99];}
194
195   virtual Int_t   &GetPHOS_Ndiv_magic    (void) {return PHOS_Ndiv_magic;}
196   virtual Float_t  GetCrystalSideSize    (void) const {return PHOScell[0]; }
197   virtual Float_t  GetCrystalLength      (void) const {return PHOScell[1]; }
198   virtual Float_t  GetWrapThickness      (void) const {return PHOScell[2]; }
199   virtual Float_t  GetAirThickness       (void) const {return PHOScell[3]; }
200   virtual Float_t  GetPIN_SideSize       (void) const {return PHOScell[4]; }
201   virtual Float_t  GetPIN_Length         (void) const {return PHOScell[5]; }
202   virtual Float_t  GetRadius             (void) const {return PHOSradius;  }
203   virtual Int_t    GetNz                 (void) const {return PHOSsize[0]; }
204   virtual Int_t    GetNphi               (void) const {return PHOSsize[1]; }
205   virtual Int_t    GetCradlesAmount      (void) const {return PHOSsize[2]; }
206   virtual Float_t  GetAngleBetweenCradles(void) const {return PHOScradlesA;}
207   virtual Float_t  GetPHOS_flag          (Int_t n) const {return PHOSflags[n];}
208   virtual Float_t  GetPHOSextra          (Int_t n) const {return PHOSextra[n];}
209   virtual Float_t  GetPHOSFoam           (Int_t n) const {return PHOSFTI[n];}
210   virtual Float_t  GetPHOStxwall         (Int_t n) const {return PHOSTXW[n];}
211   virtual Float_t  GetPHOSAir            (Int_t n) const {return PHOSAIR[n];}
212   virtual Float_t &GetCradleAngle        (Int_t n) {return PHOSangle[n];}
213
214
215   TObjArray            *fCradles;               //!  Cradles in PHOS
216   Int_t                 fDebugLevel;
217
218   TTree                *fTreePHOS;              //! Pointer to PHOS tree.
219
220 private:
221
222   TString               fBranchNameOfCradles;   // 
223   TString               fTreeName;              // Name of PHOS tree: "PHOS"
224
225 #define MAXCRAD 100
226
227   Float_t PHOSflags[9], PHOScell[9], PHOSradius;
228   Int_t   PHOSsize[3];
229   Float_t PHOScradlesA,PHOSTXW[3],PHOSAIR[3],PHOSFTI[4],PHOSextra[9],
230         PHOSangle[MAXCRAD];
231   Int_t   PHOS_Ndiv_magic;
232
233  ClassDef(AliPHOS,1)  //Hits manager for set:PHOS
234 };
235  
236 #endif
237