Extra header added to the list
[u/mrichter/AliRoot.git] / HMPID / HMPIDbase / AliHMPIDHit.h
1 #ifndef AliHMPIDHit_h
2 #define AliHMPIDHit_h
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5 //.
6 // HMPID base class to produce hits
7 //.
8 //.
9 #include <AliHit.h>           //base class
10 #include <TVector3.h>         //ctor
11 #include "AliHMPIDDigit.h"    //QdcTot() 
12
13 #include <TRandom.h>
14
15 class AliHMPIDHit : public AliHit //   TObject-AliHit-AliHMPIDHit
16 {
17 public:
18 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
19 AliHMPIDHit():
20     AliHit(),
21     fCh(-1),
22     fPid(-1),
23     fQ(-1),
24     fLx(0),
25     fLy(0),
26     fT(0) 
27     {} //default ctor
28 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
29 AliHMPIDHit(Int_t c,Float_t &e,Int_t pid,Int_t tid,Float_t x,Float_t y, Float_t time, const TVector3 &p):
30   AliHit(0,tid),
31   fCh(c),
32   fPid(pid),
33   fQ(0 ),
34   fLx(x),
35   fLy(y),
36   fT(time) 
37   {e=QdcTot(e,time);fX=p.X();fY=p.Y();fZ=p.Z();}
38 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
39 AliHMPIDHit(Int_t c,Float_t &e,Int_t pid,Int_t tid,Float_t x,Float_t y, Float_t time):
40   AliHit(),
41   fCh(c),
42   fPid(pid),
43   fQ(0),
44   fLx(x),
45   fLy(y),
46   fT(time)
47   {e=QdcTot(e,time);fTrack=tid;}//manual ctor
48 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
49 AliHMPIDHit& operator=(const AliHMPIDHit& h)
50 {
51   //
52   // Assignment operator
53   //
54   if(this!=&h){
55     AliHit::operator=(h);
56     fCh = h.fCh;
57     fPid = h.fPid;
58     fQ = h.fQ;
59     fLx = h.fLx;
60     fLy = h.fLy;
61     fT = h.fT;
62   }
63   return *this;    
64 }    
65 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     
66 AliHMPIDHit(const AliHMPIDHit &h):
67   AliHit(h),
68   fCh(h.fCh),
69   fPid(h.fPid),
70   fQ(h.fQ),
71   fLx(h.fLx),
72   fLy(h.fLy),
73   fT(h.fT) 
74   {}//copy ctor
75 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
76 virtual ~AliHMPIDHit()       {}
77 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   
78 //framework part
79          void    Print(Option_t *opt="")const;                                                    //from TObject to print current status
80          void    Draw (Option_t *opt="");                                                         //from TObject to Draw this hit
81 //private part  
82          Int_t   Ch     (                               )const{return fCh;                                    }       //Chamber
83          void    Hit2Sdi(TClonesArray *pSdiLst,Int_t n=1)const;                                                       //add sdigits of this hit to the list 
84          Float_t LorsX  (                               )const{return fLx;                                    }       //hit X position in LORS, [cm]
85          Float_t LorsY  (                               )const{return fLy;                                    }       //hit Y position in LORS, [cm]
86          Float_t HitTime(                               )const{return fT;                                     }       //hit formation time, [sec]
87          Int_t   Pid    (                               )const{return fPid;                                   }       //PID
88          Float_t Q      (                               )const{return fQ;                                     }       //total charge, [QDC]
89   inline Float_t QdcTot (Float_t e, Float_t time        );                                                            //calculate total charge of the hit          
90          Int_t   Tid    (                               )const{return fTrack;                                 }       //TID
91          void    SetQ   (Float_t q                      )     {fQ=q;                                          }       //for debugging...
92 protected:                                                                     //AliHit has fTrack,fX,fY,fZ 
93   Int_t    fCh;                                                                //Chamber
94   Int_t    fPid;                                                               //PID
95   Float_t  fQ;                                                                 //total charge [QDC]
96   Float_t  fLx;                                                                //hit X position in chamber LORS, [cm]
97   Float_t  fLy;                                                                //hit Y position in chamber LORS, [cm]
98   Float_t  fT;                                                                 //hit formation time, [sec] 
99   ClassDef(AliHMPIDHit,5)                                                      //HMPID hit class 
100 };//class AliHMPIDhit
101 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
102 Float_t AliHMPIDHit::QdcTot(Float_t e, Float_t time)
103 {
104 // Samples total charge of the hit
105 // Arguments: e- hit energy [GeV] for mip Eloss for photon Etot   
106 //   Returns: total QDC
107   Int_t pc,px,py;
108   AliHMPIDParam::Lors2Pad(fLx,fLy,pc,px,py); 
109   if(py<0) fQ=0;
110  else {
111   Float_t y=AliHMPIDParam::LorsY(pc,py);  
112   fLy=((y-fLy)>0)?y-0.2:y+0.2;                                                                       //shift to the nearest anod wire   
113   
114   Float_t  x=(fLx > 66.6)? fLx-66.6:fLx;                                                             //sagita is for PC (0-64) and not for chamber   
115   Float_t  qdcEle=34.06311+0.2337070*x+5.807476e-3*x*x-2.956471e-04*x*x*x+2.310001e-06*x*x*x*x;      //reparametrised from DiMauro
116   
117   Int_t iNele=Int_t(e/26e-9);  if(iNele<1) iNele = 1;                                                //number of electrons created by hit, if photon e=0 implies iNele=1
118   fQ=0;
119   for(Int_t i=1;i<=iNele;i++){
120     Double_t rnd=gRandom->Rndm(); if(rnd==0) rnd=1e-12;                                              //1e-12 is a protection against 0 from rndm  
121     fQ-=qdcEle*TMath::Log(rnd);                
122   }
123  }
124   if(time>1.2e-6) fQ=0;
125  
126   return fQ;
127 }  
128 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129       
130 #endif