#define AliHMPIDHit_h
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice */
-
+//.
+// HMPID base class to produce hits
+//.
+//.
#include <AliHit.h> //base class
#include <TVector3.h> //ctor
+#include "AliHMPIDDigit.h" //QdcTot()
+
+#include <TRandom.h>
class AliHMPIDHit : public AliHit // TObject-AliHit-AliHMPIDHit
{
public:
- AliHMPIDHit( ):AliHit( ),fCh(-1),fPid(-1 ),fE(-1),fLorsX(-1),fLorsY(-1) {} //default ctor
- AliHMPIDHit(Int_t c,Float_t e,Int_t pid,Int_t tid,Float_t xl,Float_t yl,const TVector3 &p):AliHit(0,tid),fCh(c ),fPid(pid),fE(e ),fLorsX(xl),fLorsY(yl) {fX=p.X();fY=p.Y();fZ=p.Z();}
- AliHMPIDHit(Int_t c,Float_t e,Int_t pid,Int_t tid,Float_t xl,Float_t yl ): fCh(c ),fPid(pid),fE(e ),fLorsX(xl),fLorsY(yl) {fTrack=tid;}
- virtual ~AliHMPIDHit() {}
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AliHMPIDHit():
+ AliHit(),
+ fCh(-1),
+ fPid(-1),
+ fQ(-1),
+ fLx(0),
+ fLy(0),
+ fT(0)
+ {} //default ctor
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+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):
+ AliHit(0,tid),
+ fCh(c),
+ fPid(pid),
+ fQ(0 ),
+ fLx(x),
+ fLy(y),
+ fT(time)
+ {e=QdcTot(e,time);fX=p.X();fY=p.Y();fZ=p.Z();}
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AliHMPIDHit(Int_t c,Float_t &e,Int_t pid,Int_t tid,Float_t x,Float_t y, Float_t time):
+ AliHit(),
+ fCh(c),
+ fPid(pid),
+ fQ(0),
+ fLx(x),
+ fLy(y),
+ fT(time)
+ {e=QdcTot(e,time);fTrack=tid;}//manual ctor
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AliHMPIDHit& operator=(const AliHMPIDHit& h)
+{
+ //
+ // Assignment operator
+ //
+ if(this!=&h){
+ AliHit::operator=(h);
+ fCh = h.fCh;
+ fPid = h.fPid;
+ fQ = h.fQ;
+ fLx = h.fLx;
+ fLy = h.fLy;
+ fT = h.fT;
+ }
+ return *this;
+}
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+AliHMPIDHit(const AliHMPIDHit &h):
+ AliHit(h),
+ fCh(h.fCh),
+ fPid(h.fPid),
+ fQ(h.fQ),
+ fLx(h.fLx),
+ fLy(h.fLy),
+ fT(h.fT)
+ {}//copy ctor
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+virtual ~AliHMPIDHit() {}
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//framework part
- void Print(Option_t *option="")const; //from TObject to print current status
+ void Print(Option_t *opt="")const; //from TObject to print current status
+ void Draw (Option_t *opt=""); //from TObject to Draw this hit
//private part
- Int_t Ch ()const{return fCh; } //Chamber
- Float_t E ()const{return fE; } //Eloss for MIP hit or Etot for photon hit, [GeV]
- Float_t LorsX ()const{return fLorsX; } //hit X position in LORS, [cm]
- Float_t LorsY ()const{return fLorsY; } //hit Y position in LORS, [cm]
- Int_t Pid ()const{return fPid; } //PID
- Int_t Tid ()const{return fTrack; } //TID
-
-protected: //AliHit has fTid,fX,fY,fZ
+ Int_t Ch ( )const{return fCh; } //Chamber
+ void Hit2Sdi(TClonesArray *pSdiLst,Int_t n=1)const; //add sdigits of this hit to the list
+ Float_t LorsX ( )const{return fLx; } //hit X position in LORS, [cm]
+ Float_t LorsY ( )const{return fLy; } //hit Y position in LORS, [cm]
+ Float_t HitTime( )const{return fT; } //hit formation time, [sec]
+ Int_t Pid ( )const{return fPid; } //PID
+ Float_t Q ( )const{return fQ; } //total charge, [QDC]
+ inline Float_t QdcTot (Float_t e, Float_t time ); //calculate total charge of the hit
+ Int_t Tid ( )const{return fTrack; } //TID
+ void SetQ (Float_t q ) {fQ=q; } //for debugging...
+protected: //AliHit has fTrack,fX,fY,fZ
Int_t fCh; //Chamber
Int_t fPid; //PID
- Float_t fE; //Eloss for MIP or Etot for photon [GeV]
- Float_t fLorsX; //hit X position in chamber LORS, [cm]
- Float_t fLorsY; //hit Y position in chamber LORS, [cm]
- ClassDef(AliHMPIDHit,4) //HMPID hit class
+ Float_t fQ; //total charge [QDC]
+ Float_t fLx; //hit X position in chamber LORS, [cm]
+ Float_t fLy; //hit Y position in chamber LORS, [cm]
+ Float_t fT; //hit formation time, [sec]
+ ClassDef(AliHMPIDHit,5) //HMPID hit class
};//class AliHMPIDhit
-
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+Float_t AliHMPIDHit::QdcTot(Float_t e, Float_t time)
+{
+// Samples total charge of the hit
+// Arguments: e- hit energy [GeV] for mip Eloss for photon Etot
+// Returns: total QDC
+ Int_t pc,px,py;
+ AliHMPIDParam::Lors2Pad(fLx,fLy,pc,px,py);
+ if(py<0) fQ=0;
+ else {
+ Float_t y=AliHMPIDParam::LorsY(pc,py);
+ fLy=((y-fLy)>0)?y-0.2:y+0.2; //shift to the nearest anod wire
+
+ Float_t x=(fLx > 66.6)? fLx-66.6:fLx; //sagita is for PC (0-64) and not for chamber
+ 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
+
+ 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
+ fQ=0;
+ for(Int_t i=1;i<=iNele;i++){
+ Double_t rnd=gRandom->Rndm(); if(rnd==0) rnd=1e-12; //1e-12 is a protection against 0 from rndm
+ fQ-=qdcEle*TMath::Log(rnd);
+ }
+ }
+ if(time>1.2e-6) fQ=0;
+
+ return fQ;
+}
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
#endif