]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALGeometryOfflineTrd1.cxx
Changes required by Effective C++
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALGeometryOfflineTrd1.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2004, 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 // GeometryOfflineTrd1 class  for EMCAL : singleton
16 //  implementation of 
17 //  specific geometry
18 //  for trd 1
19 //
20 //*-- Author: Aleksei Pavlinov (WSU)
21
22 /* $Id$*/
23
24 #include <TBrowser.h>
25 #include <TMath.h>
26 #include <TVector2.h>
27 #include <TVector3.h>
28 #include <TObjArray.h>
29
30 #include "AliEMCALGeometryOfflineTrd1.h"
31 #include "AliEMCALShishKebabTrd1Module.h"
32 #include "AliEMCALGeometry.h"
33
34 ClassImp(AliEMCALGeometryOfflineTrd1)
35
36 AliEMCALGeometryOfflineTrd1* AliEMCALGeometryOfflineTrd1::fgGeomOfflineTrd1=0;
37
38 //___________________________________________________________________________
39 AliEMCALGeometryOfflineTrd1* AliEMCALGeometryOfflineTrd1::GetInstance()
40 {
41   //retrurn instance of the geometry
42   if(fgGeomOfflineTrd1==0) {
43     fgGeomOfflineTrd1 = new AliEMCALGeometryOfflineTrd1();
44   }
45   return fgGeomOfflineTrd1;
46 }
47
48 //___________________________________________________________________________
49 AliEMCALGeometryOfflineTrd1::AliEMCALGeometryOfflineTrd1() : TNamed("geomTRD1","")
50
51   // this private constarctor
52   fGeometry = AliEMCALGeometry::GetInstance("SHISH_62_TRD1");
53   Init();
54 }
55
56 //___________________________________________________________________________
57 AliEMCALGeometryOfflineTrd1::AliEMCALGeometryOfflineTrd1(const AliEMCALGeometryOfflineTrd1& geom):TNamed(geom.GetName(),geom.GetTitle())
58 {
59   //copy ctor
60   fGeometry = geom.fGeometry;
61   fMaxInEta = geom.fMaxInEta;
62
63   for(Int_t mod = 0; mod < 26; mod++) fTrd1Modules[mod] = geom.fTrd1Modules[mod];
64
65   fSMMaxEta = geom.fSMMaxEta;
66   for(Int_t i = 0; i < fSMMaxEta; i++) fSMPositionEta[i] = geom.fSMPositionEta[i];
67   
68   fSMPositionPhi = geom.fSMPositionPhi;
69   fShiftOnPhi = geom.fShiftOnPhi;
70   fNPhiSuperModule = geom.fNPhiSuperModule;
71   for(Int_t rot = 0; rot < 6; rot++) {
72     fSuperModuleRotationZ[rot] = geom.fSuperModuleRotationZ[rot];
73     fNameSuperModuleRotationZ[rot] = geom.fNameSuperModuleRotationZ[rot];
74   }
75   fSuperModuleRotationX = geom.fSuperModuleRotationX;
76   for(Int_t rot = 0; rot < 12; rot++) fSuperModuleRotation[rot] = geom.fSuperModuleRotation[rot];
77   fXYZofCells = geom.fXYZofCells;
78
79 }
80
81 //___________________________________________________________________________
82 void AliEMCALGeometryOfflineTrd1::Init()
83 {
84   // Super module
85   // ETA direction
86   fMaxInEta = fGeometry->GetNZ();
87   fTrd1Modules[0] =  new AliEMCALShishKebabTrd1Module();
88   fSMMaxEta = 2*fMaxInEta;
89   fSMPositionEta = new TVector2[fSMMaxEta];
90   fSMPositionEta[0] = fTrd1Modules[0]->GetCenterOfCellInLocalCoordinateofSM(1);
91   fSMPositionEta[1] = fTrd1Modules[0]->GetCenterOfCellInLocalCoordinateofSM(2);
92   for(Int_t i=1; i<fMaxInEta; i++) {
93     fTrd1Modules[i] = new AliEMCALShishKebabTrd1Module(*(fTrd1Modules[i-1]));
94     fSMPositionEta[2*i]   = fTrd1Modules[i]->GetCenterOfCellInLocalCoordinateofSM(1);
95     fSMPositionEta[2*i+1] = fTrd1Modules[i]->GetCenterOfCellInLocalCoordinateofSM(2);
96   }
97   // PHI direction
98   fSMPositionPhi.Set(2*fGeometry->GetNPhi());
99   fShiftOnPhi = -fGeometry->GetPhiModuleSize()*fGeometry->GetNPhi()/2;
100   for(Int_t i=0; i<fGeometry->GetNPhi(); i++) {
101     fSMPositionPhi[2*i]   = fGeometry->GetPhiModuleSize() * (double(i) + 0.25);
102     fSMPositionPhi[2*i+1] = fGeometry->GetPhiTileSize()   + fSMPositionPhi[2*i];
103   }
104   
105   // Super Module rotations
106   fNPhiSuperModule = fGeometry->GetNPhiSuperModule(); // see AliEMCALv0
107   double dphi = (fGeometry->GetArm1PhiMax() - fGeometry->GetArm1PhiMin()) / fNPhiSuperModule;
108   double phi, phiRad;
109   fSuperModuleRotationX.RotateX(TMath::Pi()); // matrix looks not so nice
110   for(Int_t i=0; i<fNPhiSuperModule; i++){
111     // rotations arround Z
112     phi    = fGeometry->GetArm1PhiMin() + dphi*(2*i+1)/2.; // phi= 70, 90, 110, 130, 150, 170
113     phiRad = phi*TMath::DegToRad();
114     if(i==1) phiRad = TMath::PiOver2();
115     fSuperModuleRotationZ[i].RotateZ(phiRad);
116     TString ntmp("rotationZ_");
117     ntmp += int(phi);
118     fNameSuperModuleRotationZ[i] = ntmp;
119     // Super Module rotation
120     fSuperModuleRotation[2*i]   = fSuperModuleRotationZ[i]; // Z
121     fSuperModuleRotation[2*i+1] = fSuperModuleRotationZ[i] * fSuperModuleRotationX; // Z*X
122   }
123   // Fill fXYZofCells
124   fXYZofCells = new TObjArray(fGeometry->GetNCells());
125   fXYZofCells->SetName("CellsInGC"); 
126   Int_t nSupMod, nTower, nIphi, nIeta, iphi, ieta;
127   for(Int_t absId=1; absId<=fGeometry->GetNCells(); absId++){
128     if(fGeometry->GetCellIndex(absId, nSupMod,nTower,nIphi,nIeta)){
129       fGeometry->GetCellPhiEtaIndexInSModule(nSupMod,nTower,nIphi,nIeta, iphi,ieta);
130       TVector3 *v = new TVector3;
131       v->SetX(fSMPositionEta[ieta-1].Y()); 
132       v->SetZ(fSMPositionEta[ieta-1].X()); 
133       v->SetY(fSMPositionPhi[iphi-1] + fShiftOnPhi);
134       v->Transform(fSuperModuleRotation[nSupMod-1]);
135       fXYZofCells->AddAt(v,absId-1);
136     }
137   }
138 }
139
140 //___________________________________________________________________________
141 TVector3& AliEMCALGeometryOfflineTrd1::PosInSuperModule(int nSupMod, Int_t nTower, Int_t nIphi, Int_t nIeta)
142
143   //return location of position within supermodule
144   // 10-nov-04
145   static Int_t iphi, ieta;
146   static TVector3 v;
147   fGeometry->GetCellPhiEtaIndexInSModule(nSupMod, nTower,nIphi,nIeta, iphi,ieta);
148
149   // x-radius; y-phi; eta-z;
150   v.SetXYZ(fSMPositionEta[ieta].Y(), fSMPositionPhi[iphi], fSMPositionEta[ieta].X());
151   return v;
152
153
154 //___________________________________________________________________________
155 void AliEMCALGeometryOfflineTrd1::PositionInSuperModule(Int_t iphi, Int_t ieta, 
156 double &lphi, double &leta)
157
158   //return location of position within supermodule
159
160   static Int_t ie=0;
161   lphi = fSMPositionPhi[iphi-1];
162   ie = ieta - 1;
163   if(ie<0) ie = 0;
164   if(ie>fSMMaxEta-1) ie = fSMMaxEta-1;
165   leta = fSMPositionEta[ie].X();
166 }
167
168 //___________________________________________________________________________
169 void AliEMCALGeometryOfflineTrd1::PositionInSuperModule(int nSupMod, Int_t nTower, Int_t nIphi, Int_t nIeta,
170 double &lphi, double &leta)
171 {
172   //return location of position within supermodule
173
174   static Int_t iphi,ieta;
175   fGeometry->GetCellPhiEtaIndexInSModule(nSupMod, nTower,nIphi,nIeta,iphi,ieta);
176   PositionInSuperModule(iphi,ieta, lphi,leta);
177 }
178
179 //___________________________________________________________________________
180 TRotation* AliEMCALGeometryOfflineTrd1::Rotation(Int_t module)
181
182   //return rotation matrix for module
183   // module chabge from 1 to 12
184   if(module<1)  module=1;
185   if(module>12) module=12;
186   return &fSuperModuleRotation[module];
187 }
188
189 //___________________________________________________________________________
190 TVector3* AliEMCALGeometryOfflineTrd1::CellPosition(int absId)
191
192   //return cell position given absoluted cell id
193   // 15-nov-04
194   if(absId<1 || absId>fXYZofCells->GetSize()) return 0;
195   return (TVector3*)fXYZofCells->At(absId-1);
196 }
197
198 //___________________________________________________________________________
199 void AliEMCALGeometryOfflineTrd1::PrintSuperModule()
200 {
201   //utility method for printing supermodule info
202   // 12-nov-04
203   printf(" ** Super module ** fSMMaxEta %i fSMMaxPHI %i\n ETA     eta(Z)          (X)\n",
204   fSMMaxEta,fSMPositionPhi.GetSize());
205   for(Int_t i=0; i<fSMMaxEta; i++) {
206     printf("%3i | %8.3f         %8.3f\n", i+1,fSMPositionEta[i].X(), fSMPositionEta[i].Y());
207   }
208   printf("\n PHI      (Y)\n");
209   for(Int_t i=0; i<fSMPositionPhi.GetSize(); i++) {
210     printf("%3i | %8.3f\n",i+1, fSMPositionPhi[i]);
211   }
212 }
213
214 //___________________________________________________________________________
215 void AliEMCALGeometryOfflineTrd1::PrintCell(Int_t absId)
216 {
217   //utility method for printing cell info
218   Int_t nSupMod, nTower, nIphi, nIeta, iphi, ieta;
219   if(fGeometry->GetCellIndex(absId, nSupMod,nTower,nIphi,nIeta)){
220      fGeometry->GetCellPhiEtaIndexInSModule(nSupMod,nTower,nIphi,nIeta, iphi,ieta);
221      TVector3 *v = CellPosition(absId);
222      printf("(%5i) X %8.3f Y %8.3f Z %8.3f | #sup.Mod %2i #tower %3i nIphi %1i nIeta %1i | iphi %2i ieta %2i\n",
223             absId, v->X(),v->Y(),v->Z(), nSupMod,nTower,nIphi,nIeta, iphi,ieta);
224   } else {
225     Warning("PrintCell","Wrong abs id %i\n",absId); 
226   }
227 }
228
229 //___________________________________________________________________________
230 void AliEMCALGeometryOfflineTrd1::Browse(TBrowser* b)
231 {
232   //Browse the geometry
233   if(fGeometry) b->Add(fGeometry);
234
235   for(Int_t i=0; i<fMaxInEta; i++)  if(fTrd1Modules[i]>0) b->Add(fTrd1Modules[i]);
236
237   for(Int_t i=0; i<fNPhiSuperModule; i++){ 
238     b->Add(&fSuperModuleRotationZ[i], fNameSuperModuleRotationZ[i].Data());
239     for(Int_t j=0; j<2; j++) {
240       TString name("rotationM_"); name += (2*i+j);
241       b->Add(&fSuperModuleRotation[2*i+j], name.Data());
242     }
243   }
244
245   b->Add(&fSuperModuleRotationX, "rotationX_180");
246
247   b->Add(fXYZofCells);
248 }
249
250 //___________________________________________________________________________
251 Bool_t AliEMCALGeometryOfflineTrd1::IsFolder() const
252 {
253   //folder check
254   return kTRUE;
255 }