]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALGeometry.cxx
Bug fix for HMPID bits in readout list.
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALGeometry.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$*/
17
18 //_________________________________________________________________________
19 // Geometry class  for EMCAL : singleton  
20 // EMCAL consists of layers of scintillator and lead
21 // with scintillator fiber arranged as "shish-kebab" skewers 
22 // Places the the Barrel Geometry of The EMCAL at Midrapidity
23 // between 80 and 180(or 190) degrees of Phi and
24 // -0.7 to 0.7 in eta 
25 //
26 //     EMCAL geometry tree:
27 //     EMCAL -> superModule -> module -> tower(cell)
28 //     Indexes
29 //     absId -> nSupMod     -> nModule -> (nIphi,nIeta)
30 //
31 //   Name choices: 
32 //   EMCAL_PDC06 (geometry used for PDC06 simulations, kept for backward compatibility)
33 //      = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG in old notation
34 //   EMCAL_COMPLETE (geometry for expected complete detector)
35 //      = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG scTh=0.176 pbTh=0.144
36 //          in old notation
37 //   EMCAL_WSUC (Wayne State test stand)
38 //      = no definite equivalent in old notation, was only used by
39 //          Aleksei, but kept for testing purposes
40 //
41 //   etc.
42 //
43 //
44 //
45 //*-- Author: Sahal Yacoob (LBL / UCT)
46 //     and  : Yves Schutz (SUBATECH)
47 //     and  : Jennifer Klay (LBL)
48 //     and  : Aleksei Pavlinov (WSU) 
49 //
50
51 //--- Root header files ---
52 #include <TVector2.h>
53 #include <TVector3.h>
54 //-- ALICE Headers.
55 #include "AliLog.h"
56
57 // // --- EMCAL headers
58 #include "AliEMCALGeometry.h"
59 #include "AliEMCALShishKebabTrd1Module.h"
60 #include "AliEMCALRecPoint.h"
61 //#include "AliEMCALHistoUtilities.h"
62
63 ClassImp(AliEMCALGeometry)
64
65 // these initialisations are needed for a singleton
66 AliEMCALGeometry  *AliEMCALGeometry::fgGeom      = 0;
67 const Char_t*      AliEMCALGeometry::fgkDefaultGeometryName = "EMCAL_COMPLETE";
68 //
69 // Usage: 
70 //        You can create the AliEMCALGeometry object independently from anything.
71 //        You have to use just the correct name of geometry. If name is empty string the
72 //        default name of geometry will be used.
73 //         
74 //  AliEMCALGeometry* g = AliEMCALGeometry::GetInstance(name,title); // first time
75 //  ..
76 //  g = AliEMCALGeometry::GetInstance();                             // after first time
77 //
78 //  MC:   If you work with MC data you have to get geometry the next way: 
79 //  ==                                      =============================
80 //  AliRunLoader    *rl   = AliRunLoader::Instance();
81 //  AliEMCALGeometry *geom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
82 //  TGeoManager::Import("geometry.root");
83
84 AliEMCALGeometry::AliEMCALGeometry() 
85   : AliEMCALGeoUtils()
86
87   // default ctor only for internal usage (singleton)
88   // must be kept public for root persistency purposes, 
89   // but should never be called by the outside world    
90
91   AliDebug(2, "AliEMCALGeometry : default ctor ");
92 }
93 //______________________________________________________________________
94 AliEMCALGeometry::AliEMCALGeometry(const Text_t* name, const Text_t* title) 
95   : AliEMCALGeoUtils(name, title)
96 {
97   // ctor only for internal usage (singleton)
98   AliDebug(2, Form("AliEMCALGeometry(%s,%s) ", name,title));
99
100 }
101 //______________________________________________________________________
102 AliEMCALGeometry::AliEMCALGeometry(const AliEMCALGeometry& geom)
103   : AliEMCALGeoUtils(geom)
104 {
105   //copy ctor
106 }
107
108 //______________________________________________________________________
109 AliEMCALGeometry::~AliEMCALGeometry(void){
110     // dtor
111 }
112
113
114 //______________________________________________________________________
115 AliEMCALGeometry *  AliEMCALGeometry::GetInstance(){ 
116   // Returns the pointer of the unique instance
117   
118   AliEMCALGeometry * rv = static_cast<AliEMCALGeometry *>( fgGeom );
119   return rv; 
120 }
121
122 //______________________________________________________________________
123 AliEMCALGeometry* AliEMCALGeometry::GetInstance(const Text_t* name,
124                                                 const Text_t* title){
125     // Returns the pointer of the unique instance
126
127     AliEMCALGeometry * rv = 0; 
128     if ( fgGeom == 0 ) {
129       if ( strcmp(name,"") == 0 ) { // get default geometry
130          fgGeom = new AliEMCALGeometry(fgkDefaultGeometryName, title);
131       } else {
132          fgGeom = new AliEMCALGeometry(name, title);
133       }  // end if strcmp(name,"")
134       if ( AliEMCALEMCGeometry::fgInit ) rv = (AliEMCALGeometry * ) fgGeom;
135       else {
136          rv = 0; 
137          delete fgGeom; 
138          fgGeom = 0; 
139       } // end if fgInit
140     }else{
141         if ( strcmp(fgGeom->GetName(), name) != 0) {
142           printf("\ncurrent geometry is %s : ", fgGeom->GetName());
143           printf(" you cannot call %s ",name);  
144         }else{
145           rv = (AliEMCALGeometry *) fgGeom; 
146         } // end 
147     }  // end if fgGeom
148     return rv; 
149 }
150
151 //________________________________________________________________________________________________
152 Bool_t AliEMCALGeometry::RelPosCellInSModule(Int_t absId, Double_t distEff, Double_t &xr, Double_t &yr, Double_t &zr) const
153 {
154   // Jul 30, 2007 - taking into account position of shower max
155   // Look to see what the relative
156   // position inside a given cell is
157   // for a recpoint.
158   // In:
159   // absId   - cell is as in Geant,     0<= absId   < fNCells;
160   // e       - cluster energy
161   // OUT:
162   // xr,yr,zr - x,y,z coordinates of cell with absId inside SM 
163
164   // Shift index taking into account the difference between standard SM 
165   // and SM of half size in phi direction
166   const  Int_t kphiIndexShift = fCentersOfCellsPhiDir.GetSize()/4; // Nov 22, 2006; was 6 for cas 2X2
167   static Int_t nSupMod, nModule, nIphi, nIeta, iphi, ieta;
168   static Int_t iphim, ietam;
169   static AliEMCALShishKebabTrd1Module *mod = 0;
170   static TVector2 v;
171   if(!CheckAbsCellId(absId)) return kFALSE;
172   
173   GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
174   GetModulePhiEtaIndexInSModule(nSupMod, nModule, iphim, ietam);
175   GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi, ieta); 
176   
177   //Get eta position. Careful with ALICE conventions (increase index decrease eta)      
178   if(nSupMod%2 == 0) {             
179     ietam = (fCentersOfCellsEtaDir.GetSize()/2-1)-ietam;// 47-ietam, revert the ordering on A side in order to keep convention.
180     if(nIeta == 0) nIeta = 1;
181     else           nIeta = 0;
182   }
183   mod = GetShishKebabModule(ietam);
184   mod ->GetPositionAtCenterCellLine(nIeta, distEff, v); 
185   xr = v.Y() - fParSM[0];
186   zr = v.X() - fParSM[2];
187   
188   //Get phi position. Careful with ALICE conventions (increase index increase phi)
189   Int_t iphi2 = iphi;
190   if(nSupMod<10) { 
191     if(nSupMod%2 != 0) 
192       iphi2 = (fCentersOfCellsPhiDir.GetSize()-1)-iphi;// 23-iphi, revert the ordering on C side in order to keep convention.
193     yr = fCentersOfCellsPhiDir.At(iphi2);
194     
195   } else {
196     if(nSupMod%2 != 0) 
197       iphi2 = (fCentersOfCellsPhiDir.GetSize()/2-1)-iphi;// 11-iphi, revert the ordering on C side in order to keep convention.
198     yr = fCentersOfCellsPhiDir.At(iphi2 + kphiIndexShift);
199   }
200   
201   AliDebug(1,Form("absId %i nSupMod %i iphi %i ieta %i xr %f yr %f zr %f ",absId,nSupMod,iphi,ieta,xr,yr,zr));
202   
203   return kTRUE;
204 }
205
206 //________________________________________________________________________________________________
207 Bool_t AliEMCALGeometry::RelPosCellInSModule(Int_t absId, Int_t maxAbsId, Double_t distEff, Double_t &xr, Double_t &yr, Double_t &zr) const
208 {
209   // Jul 31, 2007 - taking into account position of shower max and apply coor2.
210   // Look to see what the relative
211   // position inside a given cell is
212   // for a recpoint.
213   // In:
214   // absId     - cell is as in Geant,     0<= absId   < fNCells;
215   // maxAbsId  - abs id of cell with highest energy
216   // e         - cluster energy
217   // OUT:
218   // xr,yr,zr - x,y,z coordinates of cell with absId inside SM 
219   
220   // Shift index taking into account the difference between standard SM 
221   // and SM of half size in phi direction
222   const  Int_t kphiIndexShift = fCentersOfCellsPhiDir.GetSize()/4; // Nov 22, 2006; was 6 for cas 2X2
223   static Int_t nSupMod, nModule, nIphi, nIeta, iphi, ieta;
224   static Int_t iphim, ietam;
225   static AliEMCALShishKebabTrd1Module *mod = 0;
226   static TVector2 v;
227
228   static Int_t nSupModM, nModuleM, nIphiM, nIetaM, iphiM, ietaM;
229   static Int_t iphimM, ietamM, maxAbsIdCopy=-1;
230   static AliEMCALShishKebabTrd1Module *modM = 0;
231   static Double_t distCorr;
232
233   if(!CheckAbsCellId(absId)) return kFALSE;
234   
235   GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
236   GetModulePhiEtaIndexInSModule(nSupMod, nModule, iphim, ietam);
237   GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi, ieta); 
238   
239   //Get eta position. Careful with ALICE conventions (increase index decrease eta)      
240   if(nSupMod%2 == 0) {             
241     ietam = (fCentersOfCellsEtaDir.GetSize()/2-1)-ietam;// 23-ietam, revert the ordering on A side in order to keep convention.
242     if(nIeta == 0) nIeta = 1;
243     else                   nIeta = 0;
244   }
245   
246   mod = GetShishKebabModule(ietam);
247   
248   if(absId != maxAbsId) {
249     distCorr = 0.;
250     if(maxAbsIdCopy != maxAbsId) {
251       GetCellIndex(maxAbsId, nSupModM, nModuleM, nIphiM, nIetaM);
252       GetModulePhiEtaIndexInSModule(nSupModM, nModuleM, iphimM, ietamM);
253       GetCellPhiEtaIndexInSModule(nSupModM,nModuleM,nIphiM,nIetaM, iphiM, ietaM); 
254       //Careful with ALICE conventions (increase index decrease eta)    
255       if(nSupModM%2 == 0) {             
256         ietamM = (fCentersOfCellsEtaDir.GetSize()/2-1)-ietamM;// 47-ietam, revert the ordering on A side in order to keep convention.
257       }
258       
259       modM = GetShishKebabModule(ietamM); // do I need this ?
260       maxAbsIdCopy = maxAbsId;
261     }
262     
263     if(ietamM !=0) {
264       distCorr = fEMCGeometry->GetEtaModuleSize()*(ietam-ietamM)/TMath::Tan(modM->GetTheta()); // Stay here
265       //printf(" distCorr %f | dist %f | ietam %i -> etamM %i\n", distCorr, dist, ietam, ietamM);  
266     }
267     // distEff += distCorr;
268   }
269   // Bad resolution in this case, strong bias vs phi
270   // distEff = 0.0; 
271   mod->GetPositionAtCenterCellLine(nIeta, distEff, v); // Stay here
272   xr = v.Y() - fParSM[0];
273   zr = v.X() - fParSM[2];
274   
275   //Get phi position. Careful with ALICE conventions (increase index increase phi)
276   Int_t iphi2 = iphi;
277   if(nSupMod<10) { 
278     if(nSupMod%2 != 0) 
279       iphi2 = (fCentersOfCellsPhiDir.GetSize()-1)-iphi;// 23-iphi, revert the ordering on C side in order to keep convention.
280     yr = fCentersOfCellsPhiDir.At(iphi2);
281     
282   } else {
283     if(nSupMod%2 != 0) 
284       iphi2 = (fCentersOfCellsPhiDir.GetSize()/2-1)-iphi;// 11-iphi, revert the ordering on C side in order to keep convention.
285     yr = fCentersOfCellsPhiDir.At(iphi2 + kphiIndexShift);
286   }
287   AliDebug(1,Form("absId %i nSupMod %i iphi %i ieta %i xr %f yr %f zr %f ",absId,nSupMod,iphi,ieta,xr,yr,zr));
288   
289   return kTRUE;
290 }
291
292
293 //
294 // == Shish-kebab cases ==
295 //
296
297
298 //____________________________________________________________________________
299 void AliEMCALGeometry::GetGlobal(const AliRecPoint* /*rp*/, TVector3& /* vglob */) const
300 {
301   AliFatal(Form("Please use GetGlobalEMCAL(recPoint,gpos) instead of GetGlobal!"));
302 }
303
304 //_________________________________________________________________________________
305 void AliEMCALGeometry::GetGlobalEMCAL(const AliEMCALRecPoint *rp, TVector3 &vglob) const
306 {
307   // Figure out the global numbering
308   // of a given supermodule from the
309   // local numbering for RecPoints
310
311   static TVector3 vloc;
312   static Int_t nSupMod, nModule, nIphi, nIeta;
313
314   const AliEMCALRecPoint *rpTmp = rp;
315   const AliEMCALRecPoint *rpEmc = rpTmp;
316
317   GetCellIndex(rpEmc->GetAbsId(0), nSupMod, nModule, nIphi, nIeta);
318   rpTmp->GetLocalPosition(vloc);
319   GetGlobal(vloc, vglob, nSupMod);
320 }
321