]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALGeometry.cxx
FILE_ID change for EMCAL DAs (to agree with Preprocessor expectations) + do check...
[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   mod = GetShishKebabModule(ietam);
178   mod->GetPositionAtCenterCellLine(nIeta, distEff, v); 
179   xr = v.Y() - fParSM[0];
180   zr = v.X() - fParSM[2];
181
182   if(nSupMod<10) {
183     yr = fCentersOfCellsPhiDir.At(iphi);
184   } else {
185     yr = fCentersOfCellsPhiDir.At(iphi + kphiIndexShift);
186   }
187   AliDebug(1,Form("absId %i nSupMod %i iphi %i ieta %i xr %f yr %f zr %f ",absId,nSupMod,iphi,ieta,xr,yr,zr));
188
189   return kTRUE;
190 }
191
192 //________________________________________________________________________________________________
193 Bool_t AliEMCALGeometry::RelPosCellInSModule(Int_t absId, Int_t maxAbsId, Double_t distEff, Double_t &xr, Double_t &yr, Double_t &zr) const
194 {
195   // Jul 31, 2007 - taking into account position of shower max and apply coor2.
196   // Look to see what the relative
197   // position inside a given cell is
198   // for a recpoint.
199   // In:
200   // absId     - cell is as in Geant,     0<= absId   < fNCells;
201   // maxAbsId  - abs id of cell with highest energy
202   // e         - cluster energy
203   // OUT:
204   // xr,yr,zr - x,y,z coordinates of cell with absId inside SM 
205
206   // Shift index taking into account the difference between standard SM 
207   // and SM of half size in phi direction
208   const  Int_t kphiIndexShift = fCentersOfCellsPhiDir.GetSize()/4; // Nov 22, 2006; was 6 for cas 2X2
209   static Int_t nSupMod, nModule, nIphi, nIeta, iphi, ieta;
210   static Int_t iphim, ietam;
211   static AliEMCALShishKebabTrd1Module *mod = 0;
212   static TVector2 v;
213
214   static Int_t nSupModM, nModuleM, nIphiM, nIetaM, iphiM, ietaM;
215   static Int_t iphimM, ietamM, maxAbsIdCopy=-1;
216   static AliEMCALShishKebabTrd1Module *modM = 0;
217   static Double_t distCorr;
218
219   if(!CheckAbsCellId(absId)) return kFALSE;
220
221   GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
222   GetModulePhiEtaIndexInSModule(nSupMod, nModule, iphim, ietam);
223   GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi, ieta); 
224   mod = GetShishKebabModule(ietam);
225
226   if(absId != maxAbsId) {
227     distCorr = 0.;
228     if(maxAbsIdCopy != maxAbsId) {
229       GetCellIndex(maxAbsId, nSupModM, nModuleM, nIphiM, nIetaM);
230       GetModulePhiEtaIndexInSModule(nSupModM, nModuleM, iphimM, ietamM);
231       GetCellPhiEtaIndexInSModule(nSupModM,nModuleM,nIphiM,nIetaM, iphiM, ietaM); 
232       modM = GetShishKebabModule(ietamM); // do I need this ?
233       maxAbsIdCopy = maxAbsId;
234     }
235
236     if(ietamM !=0) {
237       distCorr = fEMCGeometry->GetEtaModuleSize()*(ietam-ietamM)/TMath::Tan(modM->GetTheta()); // Stay here
238       //printf(" distCorr %f | dist %f | ietam %i -> etamM %i\n", distCorr, dist, ietam, ietamM);  
239     }
240     // distEff += distCorr;
241   }
242   // Bad resolution in this case, strong bias vs phi
243   // distEff = 0.0; 
244   mod->GetPositionAtCenterCellLine(nIeta, distEff, v); // Stay here
245   xr = v.Y() - fParSM[0];
246   zr = v.X() - fParSM[2];
247
248   if(nSupMod<10) {
249     yr = fCentersOfCellsPhiDir.At(iphi);
250   } else {
251     yr = fCentersOfCellsPhiDir.At(iphi + kphiIndexShift);
252   }
253   AliDebug(1,Form("absId %i nSupMod %i iphi %i ieta %i xr %f yr %f zr %f ",absId,nSupMod,iphi,ieta,xr,yr,zr));
254
255   return kTRUE;
256 }
257
258
259 //
260 // == Shish-kebab cases ==
261 //
262
263
264 //____________________________________________________________________________
265 void AliEMCALGeometry::GetGlobal(const AliRecPoint* /*rp*/, TVector3& /* vglob */) const
266 {
267   AliFatal(Form("Please use GetGlobalEMCAL(recPoint,gpos) instead of GetGlobal!"));
268 }
269
270 //_________________________________________________________________________________
271 void AliEMCALGeometry::GetGlobalEMCAL(const AliEMCALRecPoint *rp, TVector3 &vglob) const
272 {
273   // Figure out the global numbering
274   // of a given supermodule from the
275   // local numbering for RecPoints
276
277   static TVector3 vloc;
278   static Int_t nSupMod, nModule, nIphi, nIeta;
279
280   const AliEMCALRecPoint *rpTmp = rp;
281   const AliEMCALRecPoint *rpEmc = rpTmp;
282
283   GetCellIndex(rpEmc->GetAbsId(0), nSupMod, nModule, nIphi, nIeta);
284   rpTmp->GetLocalPosition(vloc);
285   GetGlobal(vloc, vglob, nSupMod);
286 }
287