]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALShishKebabTrd1Module.cxx
warning removal
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALShishKebabTrd1Module.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
16 /* $Id$ */
17
18 //_________________________________________________________________________
19 // Main class for TRD1 geometry of Shish-Kebab case.
20 // Author: Aleksei Pavlinov(WSU).
21 // Sep 20004 - Nov 2006
22 // See web page with description of Shish-Kebab geometries:
23 // http://pdsfweb01.nersc.gov/~pavlinov/ALICE/SHISHKEBAB/RES/shishkebabALICE.html
24 // Nov 9,2006 - added case of 3X3
25 //_________________________________________________________________________
26
27 #include "AliLog.h"
28 #include "AliEMCALShishKebabTrd1Module.h"
29 #include "AliEMCALEMCGeometry.h"
30
31 #include <cassert>
32
33 ClassImp(AliEMCALShishKebabTrd1Module)
34
35   //AliEMCALEMCGeometry *AliEMCALShishKebabTrd1Module::fgGeometry=0; 
36   Double_t AliEMCALShishKebabTrd1Module::fga=0.; 
37   Double_t AliEMCALShishKebabTrd1Module::fga2=0.; 
38   Double_t AliEMCALShishKebabTrd1Module::fgb=0.; 
39   Double_t AliEMCALShishKebabTrd1Module::fgr=0.; 
40   Double_t AliEMCALShishKebabTrd1Module::fgangle=0.;   // around one degree 
41   Double_t AliEMCALShishKebabTrd1Module::fgtanBetta=0; //
42
43 //_____________________________________________________________________________
44 AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALEMCGeometry *g) 
45   : TNamed(),
46     fGeometry(g),
47     fOK(),
48     fA(0.),
49     fB(0.),
50     fThetaA(0.),
51     fTheta(theta),
52     fOK1(),
53     fOK2(),
54     fOB(),
55     fOB1(),
56     fOB2(),
57     fThetaOB1(0.),
58     fThetaOB2(0.),
59     fOK3X3(),
60     fORB(), 
61     fORT()
62
63   // theta in radians ; first object shold be with theta=pi/2.
64   fTheta = TMath::PiOver2();
65   if(GetParameters()) {
66     DefineFirstModule();
67   }
68   DefineName(fTheta);
69   AliDebug(1,Form("AliEMCALShishKebabTrd1Module - first module:  theta %1.4f geometry %s",fTheta,g->GetName()));  
70 }
71
72 //_____________________________________________________________________________
73 AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor) 
74   : TNamed(),
75     fGeometry(leftNeighbor.fGeometry),
76     fOK(),
77     fA(0.),
78     fB(0.),
79     fThetaA(0.),
80     fTheta(0.),
81     fOK1(),
82     fOK2(),
83     fOB(),
84     fOB1(),
85     fOB2(),
86     fThetaOB1(0.),
87     fThetaOB2(0.),
88     fOK3X3(),
89     fORB(), 
90     fORT()
91
92   //  printf("** Left Neighbor : %s **\n", leftNeighbor.GetName());
93   fTheta  = leftNeighbor.GetTheta() - fgangle; 
94
95   TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
96
97   Init(leftNeighbor.GetA(),leftNeighbor.GetB());
98 }
99
100 //________________________________________________________________
101 AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod) 
102   : TNamed(mod.GetName(),mod.GetTitle()),
103     fGeometry(mod.fGeometry),
104     fOK(mod.fOK),
105     fA(mod.fA),
106     fB(mod.fB),
107     fThetaA(mod.fThetaA),
108     fTheta(mod.fTheta),
109     fOK1(mod.fOK1),
110     fOK2(mod.fOK2),
111     fOB(mod.fOB),
112     fOB1(mod.fOB1),
113     fOB2(mod.fOB2),
114     fThetaOB1(mod.fThetaOB1),
115     fThetaOB2(mod.fThetaOB2),
116     fORB(mod.fORB),
117     fORT(mod.fORT)
118 {
119   //copy ctor
120   for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i];
121 }
122
123 //________________________________________________________________
124 void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B)
125
126   // Define parameter module from parameters A,B from previos.
127   Double_t yl = (fgb/2)*TMath::Sin(fTheta) + (fga/2)*TMath::Cos(fTheta) + fgr, y = yl;
128   Double_t xl = (yl - B) / A;     // y=A*x+B
129
130   //  Double_t xp1 = (fga/2. + fgb/2.*fgtanBetta)/(TMath::Sin(fTheta) + fgtanBetta*TMath::Cos(fTheta));
131   //  printf(" xp1 %9.3f \n ", xp1);
132   // xp1 == xp => both methods give the same results - 3-feb-05
133   Double_t alpha = TMath::Pi()/2. + fgangle/2;
134   Double_t xt = (fga+fga2)*TMath::Tan(fTheta)*TMath::Tan(alpha)/(4.*(1.-TMath::Tan(fTheta)*TMath::Tan(alpha)));
135   Double_t yt = xt / TMath::Tan(fTheta), xp = TMath::Sqrt(xt*xt + yt*yt);
136   Double_t x  = xl + xp;
137   fOK.Set(x, y);
138   //  printf(" yl %9.3f | xl %9.3f | xp %9.3f \n", yl, xl, xp);
139
140   // have to define A and B; 
141   Double_t yCprev = fgr + fga*TMath::Cos(fTheta);
142   Double_t xCprev = (yCprev - B) / A;
143   Double_t xA     = xCprev + fga*TMath::Sin(fTheta), yA = fgr;
144
145   fThetaA = fTheta - fgangle/2.;
146   fA = TMath::Tan(fThetaA); // !!
147   fB = yA - fA*xA;
148
149   DefineAllStaff();
150 }
151
152 void AliEMCALShishKebabTrd1Module::DefineAllStaff()
153 {
154   //Define some parameters      
155   DefineName(fTheta);
156   // Centers of cells - 2X2 case
157   Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2 
158
159   Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
160   Double_t yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
161   fOK1.Set(xk1,yk1);
162
163   Double_t xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
164   Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
165   fOK2.Set(xk2,yk2);
166
167   // Centers of cells - 3X3 case; Nov 9,2006
168   fOK3X3[1].Set(fOK.X(), fOK.Y()-fgr); // coincide with module center
169
170   kk1 = ((fga+fga2)/4. + fga/6.)/2.; 
171
172   xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
173   yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
174   fOK3X3[0].Set(xk1,yk1);
175
176   xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
177   yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
178   fOK3X3[2].Set(xk2,yk2);
179
180   // May 15, 2006; position of module(cells) center face 
181   fOB.Set(fOK.X()-fgb/2.*TMath::Cos(fTheta),  fOK.Y()-fgb/2.*TMath::Sin(fTheta)-fgr);
182   fOB1.Set(fOB.X()-fga/4.*TMath::Sin(fTheta), fOB.Y()+fga/4.*TMath::Cos(fTheta));
183   fOB2.Set(fOB.X()+fga/4.*TMath::Sin(fTheta), fOB.Y()-fga/4.*TMath::Cos(fTheta));
184   // Jul 30, 2007 - for taking into account a position of shower maximum
185   fThetaOB1 = fTheta - fgangle/4.; // ??
186   fThetaOB2 = fTheta + fgangle/4.;
187
188   // Position of right/top point of module
189   // Gives the posibility to estimate SM size in z direction
190   Double_t xBottom     = (fgr - fB) / fA;
191   Double_t yBottom     = fgr;
192   fORB.Set(xBottom, yBottom);
193
194   Double_t l = fgb / TMath::Cos(fgangle/2.); // length of lateral module side
195   Double_t xTop = xBottom + l*TMath::Cos(TMath::ATan(fA));
196   Double_t yTop = fA*xTop + fB;
197   fORT.Set(xTop, yTop);
198 }
199
200 //_____________________________________________________________________________
201 void AliEMCALShishKebabTrd1Module::DefineFirstModule()
202 {
203   // Define first module
204   fOK.Set(fga2/2., fgr + fgb/2.); // position the center of module vs o
205
206   // parameters of right line : y = A*z + B in system where zero point is IP.
207   fThetaA = fTheta - fgangle/2.;
208   fA      = TMath::Tan(fThetaA);
209   Double_t xA = fga/2. + fga2/2., yA = fgr;
210   fB = yA - fA*xA;
211
212   TObject::SetUniqueID(1); //
213
214   DefineAllStaff();
215 }
216
217 //_____________________________________________________________________________
218 void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta)
219 {
220   // Define name of object
221   SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
222 }
223
224 //_____________________________________________________________________________
225 Bool_t AliEMCALShishKebabTrd1Module::GetParameters()
226 {
227   
228   // Get needing module parameters from EMCAL geometry
229   TString sn(fGeometry->GetName()); // 2-Feb-05
230   sn.ToUpper();
231   if(!fGeometry) {
232     Warning("GetParameters()"," No geometry ");
233     return kFALSE; 
234   }
235   
236
237   fga        = (Double_t)fGeometry->GetEtaModuleSize();
238   fgb        = (Double_t)fGeometry->GetLongModuleSize();
239   fgangle    = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad();
240   fgtanBetta = TMath::Tan(fgangle/2.);
241   fgr        = (Double_t)fGeometry->GetIPDistance();
242
243   fgr += fGeometry->GetSteelFrontThickness();
244
245   fga2       = Double_t(fGeometry->Get2Trd1Dx2());
246   //PH  PrintShish(0);
247   return kTRUE;
248 }
249
250 // service methods
251 //_____________________________________________________________________________
252 void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
253 {
254   // service method
255   if(pri>=0) {
256     printf("PrintShish() \n a %7.3f:%7.3f | b %7.2f | r %7.2f \n TRD1 angle %7.6f(%5.2f) | tanBetta %7.6f", 
257     fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
258     printf(" fTheta %f : %5.2f : cos(theta) %f\n", 
259     fTheta, GetThetaInDegree(),TMath::Cos(fTheta)); 
260     if(pri>=1) {
261       printf(" %i |%s| theta %f :  fOK.Phi = %f(%5.2f)\n", 
262       GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
263       printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
264       printf(" fOK  : X %9.4f: Y %9.4f : eta  %5.3f\n",  fOK.X(), fOK.Y(), GetEtaOfCenterOfModule());
265       printf(" fOK1 : X %9.4f: Y %9.4f :   (local, ieta=2)\n", fOK1.X(), fOK1.Y());
266       printf(" fOK2 : X %9.4f: Y %9.4f :   (local, ieta=1)\n\n", fOK2.X(), fOK2.Y());
267       printf(" fOB  : X %9.4f: Y %9.4f \n", fOB.X(), fOB.Y());
268       printf(" fOB1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOB1.X(), fOB1.Y());
269       printf(" fOB2 : X %9.4f: Y %9.4f (local, ieta=1)\n", fOB2.X(), fOB2.Y());
270       // 3X3 
271       printf(" 3X3 \n");
272       for(int ieta=0; ieta<3; ieta++) {
273         printf(" fOK3X3[%i] : X %9.4f: Y %9.4f (local) \n", ieta, fOK3X3[ieta].X(), fOK3X3[ieta].Y());
274       }
275       //      fOK.Dump();
276       GetMaxEtaOfModule(pri);
277     }
278   }
279 }
280
281 //_____________________________________________________________________________
282 Double_t  AliEMCALShishKebabTrd1Module::GetThetaInDegree() const 
283 {
284   return fTheta*TMath::RadToDeg();
285 }
286
287 //_____________________________________________________________________________
288 Double_t  AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const 
289
290   return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
291 }
292
293 //_____________________________________________________________________________
294 void AliEMCALShishKebabTrd1Module::GetPositionAtCenterCellLine(Int_t ieta, Double_t dist, TVector2 &v)
295 {
296   // Jul 30, 2007
297   static Double_t theta=0., x=0., y=0.;
298   if(ieta==0) {
299     v     = fOB2;
300     theta = fThetaOB2;
301   } else if(ieta==1) {
302     v     = fOB1;
303     theta = fThetaOB1;
304   } else {
305     assert(0);
306   }
307   x = v.X() + TMath::Cos(theta) * dist;
308   y = v.Y() + TMath::Sin(theta) * dist;
309   v.Set(x,y);
310   //printf(" GetPositionAtCenterCellLine() : dist %f : ieta %i : x %f | y %f \n", dist, ieta, x, y);
311 }  
312
313
314 //_____________________________________________________________________________
315 Double_t  AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const 
316
317   // Right bottom point of module
318   Double_t thetaBottom = TMath::ATan2(fORB.Y(),fORB.X());
319   Double_t etaBottom   = ThetaToEta(thetaBottom);
320   // Right top point of module
321   Double_t thetaTop = TMath::ATan2(fORT.Y(),fORT.X());
322   Double_t etaTop   = ThetaToEta(thetaTop);
323
324   if(pri) { 
325     printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
326            etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg(), fORB.X(), fORB.Y());
327     printf(" Right    top point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
328            etaTop, thetaTop, thetaTop * TMath::RadToDeg(), fORT.X(), fORT.Y());
329   }
330   return etaBottom>etaTop ? etaBottom : etaTop;
331 }