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