]>
Commit | Line | Data |
---|---|---|
2012850d | 1 | #ifndef ALIEMCALGEOMETRY_H |
2 | #define ALIEMCALGEOMETRY_H | |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
4 | * See cxx source for full Copyright notice */ | |
5 | ||
6 | /* $Id$ */ | |
7 | ||
8 | //_________________________________________________________________________ | |
9 | // Geometry class for EMCAL : singleton | |
b13bbe81 | 10 | // EMCAL consists of a layers of scintillator, and lead. |
2012850d | 11 | // |
b13bbe81 | 12 | //*-- Author: Sahal Yacoob (LBL / UCT) |
13 | //*-- and : Yves Schutz (Subatech) | |
ca8f5bd0 | 14 | |
2012850d | 15 | #include <assert.h> |
16 | ||
17 | // --- ROOT system --- | |
b13bbe81 | 18 | #include "TString.h" |
19 | #include "TObjArray.h" | |
20 | #include "TVector3.h" | |
2012850d | 21 | |
2012850d | 22 | // --- AliRoot header files --- |
23 | ||
24 | #include "AliGeometry.h" | |
25 | ||
2012850d | 26 | class AliEMCALGeometry : public AliGeometry { |
ca8f5bd0 | 27 | public: |
28 | AliEMCALGeometry() { | |
29 | // default ctor, must be kept public for root persistency purposes, | |
30 | // but should never be called by the outside world | |
31 | }; | |
32 | AliEMCALGeometry(const AliEMCALGeometry & geom) { | |
33 | // cpy ctor requested by Coding Convention but not yet needed | |
34 | assert(0==1); | |
35 | }; | |
36 | virtual ~AliEMCALGeometry(void) ; | |
37 | static AliEMCALGeometry * GetInstance(const Text_t* name, | |
38 | const Text_t* title="") ; | |
39 | static AliEMCALGeometry * GetInstance() ; | |
40 | AliEMCALGeometry & operator = (const AliEMCALGeometry & rvalue) const { | |
41 | // assignement operator requested by coding convention but not needed | |
42 | assert(0==1) ; | |
43 | return *(GetInstance()) ; | |
44 | }; | |
45 | virtual void GetGlobal(const AliRecPoint *, TVector3 &, TMatrix &) const {} | |
46 | virtual void GetGlobal(const AliRecPoint *, TVector3 &) const {} | |
48d44618 | 47 | virtual Bool_t Impact(const TParticle * particle) const {return kTRUE;} |
ca8f5bd0 | 48 | // General |
49 | Bool_t IsInitialized(void) const { return fgInit ; } | |
50 | // Return EMCA geometrical parameters | |
51 | // geometry | |
52 | const Float_t GetAirGap() const { return fAirGap ; } | |
e908f07f | 53 | const Float_t GetAlFrontThickness() const { return fAlFrontThick;} |
ca8f5bd0 | 54 | const Float_t GetArm1PhiMin() const { return fArm1PhiMin ; } |
55 | const Float_t GetArm1PhiMax() const { return fArm1PhiMax ; } | |
e908f07f | 56 | const Float_t GetArm1EtaMin() const { return fArm1EtaMin;} |
57 | const Float_t GetArm1EtaMax() const { return fArm1EtaMax;} | |
ca8f5bd0 | 58 | const Float_t GetIPDistance() const { return fIPDistance ; } |
59 | const Float_t GetEnvelop(Int_t index) const { return fEnvelop[index] ; } | |
60 | const Float_t GetShellThickness() const { return fShellThickness ; } | |
61 | const Float_t GetZLength() const { return fZLength ; } | |
62 | const Float_t GetGap2Active() const {return fGap2Active ; } | |
e908f07f | 63 | const Float_t GetDeltaEta() const {return (fArm1EtaMax-fArm1EtaMin)/ |
64 | ((Float_t)fNZ);} | |
65 | const Float_t GetDeltaPhi() const {return (fArm1PhiMax-fArm1PhiMin)/ | |
66 | ((Float_t)fNPhi);} | |
ca8f5bd0 | 67 | const Int_t GetNLayers() const {return fNLayers ;} |
68 | const Int_t GetNZ() const {return fNZ ;} | |
e908f07f | 69 | const Int_t GetNEta() const {return fNZ ;} |
ca8f5bd0 | 70 | const Int_t GetNPhi() const {return fNPhi ;} |
6119e5db | 71 | const Int_t GetNTowers() const {return fNPhi * fNZ ;} |
e908f07f | 72 | const Float_t GetPbRadThick(){ // returns Pb radiator thickness in cm. |
73 | return fPbRadThickness; | |
74 | } | |
75 | const Float_t GetFullSintThick(){ // returns Full tower sintilator | |
76 | // thickness in cm. | |
77 | return fFullShowerSintThick; | |
78 | } | |
79 | const Float_t GetPreSintThick(){ // returns PreShower tower sintilator | |
80 | // thickness in cm. | |
81 | return fPreShowerSintThick; | |
82 | } | |
83 | Float_t AngleFromEta(Float_t eta){ // returns angle in radians for a given | |
84 | // pseudorapidity. | |
85 | return 2.0*TMath::ATan(TMath::Exp(-eta)); | |
86 | } | |
87 | Float_t ZFromEtaR(Float_t r,Float_t eta){ // returns z in for a given | |
88 | // pseudorapidity and r=sqrt(x*x+y*y). | |
89 | return r/TMath::Tan(AngleFromEta(eta)); | |
90 | } | |
da98933e | 91 | Int_t TowerIndex(Int_t iz,Int_t iphi,Int_t ipre) const; // returns tower index |
ca8f5bd0 | 92 | // returns tower indexs iz, iphi. |
da98933e | 93 | void TowerIndexes(Int_t index,Int_t &iz,Int_t &iphi,Int_t &ipre) const; |
ca8f5bd0 | 94 | // for a given tower index it returns eta and phi of center of that tower. |
da98933e | 95 | void EtaPhiFromIndex(Int_t index,Float_t &eta,Float_t &phi) const; |
6119e5db | 96 | // returns x, y, and z (cm) on the inner surface of a given EMCAL Cell specified by relid. |
97 | void XYZFromIndex(const Int_t *relid,Float_t &x,Float_t &y, Float_t &z) const; | |
ca8f5bd0 | 98 | // for a given eta and phi in the EMCAL it returns the tower index. |
da98933e | 99 | Int_t TowerIndexFromEtaPhi(Float_t eta,Float_t phi) const; |
ca8f5bd0 | 100 | // for a given eta and phi in the EMCAL it returns the pretower index. |
da98933e | 101 | Int_t PreTowerIndexFromEtaPhi(Float_t eta,Float_t phi) const; |
ca8f5bd0 | 102 | // Returns theta and phi (degree) for a given EMCAL cell indecated by relid |
a34b7b9f | 103 | void PosInAlice(const Int_t *relid,Float_t &theta,Float_t &phi) const ; |
ca8f5bd0 | 104 | // Returns an array indicating the Tower/preshower, iz, and iphi for a |
105 | // specific EMCAL indes. | |
da98933e | 106 | Bool_t AbsToRelNumbering(Int_t AbsId, Int_t *relid) const; |
ca8f5bd0 | 107 | /* |
108 | // Returns kTRUE if the two indexs are neighboring towers or preshowers. | |
da98933e | 109 | Boot_t AliEMCALGeometry::AreNeighbours(Int_t index1,Int_t index2) const; |
ca8f5bd0 | 110 | */ |
111 | ||
112 | protected: | |
113 | AliEMCALGeometry(const Text_t* name, const Text_t* title="") : | |
e908f07f | 114 | AliGeometry(name, title) {// ctor only for internal usage (singleton) |
115 | Init(); | |
ca8f5bd0 | 116 | }; |
117 | void Init(void) ; // initializes the parameters of EMCAL | |
e908f07f | 118 | |
ca8f5bd0 | 119 | private: |
120 | static AliEMCALGeometry * fgGeom ; // pointer to the unique instance | |
121 | // of the singleton | |
e908f07f | 122 | static Bool_t fgInit;// Tells if geometry has been succesfully set up. |
123 | Float_t fAirGap; // Distance between envelop and active material | |
124 | Float_t fAlFrontThick; // Thickness of the front Al face of the support box | |
125 | Float_t fPreShowerSintThick; // Thickness of the sintilator for the | |
126 | // preshower part of the calorimeter | |
127 | Float_t fFullShowerSintThick;// Thickness of the sintilaor for the full | |
128 | // shower part of the calorimeter | |
129 | Float_t fPbRadThickness; // Thickness of Pb radiators cm. | |
130 | Float_t fArm1PhiMin; // Minimum angular position of EMCAL in Phi (degrees) | |
131 | Float_t fArm1PhiMax; // Maximum angular position of EMCAL in Phi (degrees) | |
132 | Float_t fArm1EtaMin; // Minimum pseudorapidity position of EMCAL in Eta | |
133 | Float_t fArm1EtaMax; // Maximum pseudorapidity position of EMCAL in Eta | |
ca8f5bd0 | 134 | |
135 | // It is assumed that Arm1 and Arm2 have the same following parameters | |
e908f07f | 136 | Float_t fEnvelop[3]; // the GEANT TUB for the detector |
137 | Float_t fIPDistance; // Radial Distance of the inner surface of the EMCAL | |
138 | Float_t fShellThickness; // Total thickness in (x,y) direction | |
139 | Float_t fZLength; // Total length in z direction | |
140 | Float_t fGap2Active; // Gap between the envelop and the active material | |
141 | Int_t fNLayers; // Number of layers of material in the R direction | |
142 | Int_t fNZ; // Number of Towers in the Z direction | |
143 | Int_t fNPhi; //Number of Towers in the Phi Direction | |
2012850d | 144 | |
e908f07f | 145 | ClassDef(AliEMCALGeometry,3) // EMCAL geometry class |
2012850d | 146 | |
e908f07f | 147 | }; |
2012850d | 148 | |
149 | #endif // AliEMCALGEOMETRY_H |