EMCAL_FIRSTYEARV1 - geometry for December 2009 to December 2010 run period;
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALShishKebabTrd1Module.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2010, 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: Alexei Pavlinov(WSU).
21 // Sep 20004 - Nov 2006; Apr 2010
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   TString snam(g->GetName());
64   Int_t key=0;
65   if(snam.Contains("FIRSTYEARv1",TString::kIgnoreCase)) key=1;
66   if(GetParameters()) {
67     DefineFirstModule(key);
68   }
69   DefineName(fTheta);
70   printf("AliEMCALShishKebabTrd1Module - first module key=%i:  theta %1.4f geometry %s\n",key,fTheta, g->GetName());
71 }
72
73 //_____________________________________________________________________________
74 AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor) 
75   : TNamed(),
76     fGeometry(leftNeighbor.fGeometry),
77     fOK(),
78     fA(0.),
79     fB(0.),
80     fThetaA(0.),
81     fTheta(0.),
82     fOK1(),
83     fOK2(),
84     fOB(),
85     fOB1(),
86     fOB2(),
87     fThetaOB1(0.),
88     fThetaOB2(0.),
89     fOK3X3(),
90     fORB(), 
91     fORT()
92
93   //  printf("** Left Neighbor : %s **\n", leftNeighbor.GetName());
94   fTheta  = leftNeighbor.GetTheta() - fgangle; 
95
96   TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
97
98   Init(leftNeighbor.GetA(),leftNeighbor.GetB());
99 }
100
101 //________________________________________________________________
102 AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod) 
103   : TNamed(mod.GetName(),mod.GetTitle()),
104     fGeometry(mod.fGeometry),
105     fOK(mod.fOK),
106     fA(mod.fA),
107     fB(mod.fB),
108     fThetaA(mod.fThetaA),
109     fTheta(mod.fTheta),
110     fOK1(mod.fOK1),
111     fOK2(mod.fOK2),
112     fOB(mod.fOB),
113     fOB1(mod.fOB1),
114     fOB2(mod.fOB2),
115     fThetaOB1(mod.fThetaOB1),
116     fThetaOB2(mod.fThetaOB2),
117     fORB(mod.fORB),
118     fORT(mod.fORT)
119 {
120   //copy ctor
121   for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i];
122 }
123
124 //________________________________________________________________
125 void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B)
126
127   // Define parameter module from parameters A,B from previos.
128   Double_t yl = (fgb/2)*TMath::Sin(fTheta) + (fga/2)*TMath::Cos(fTheta) + fgr, y = yl;
129   Double_t xl = (yl - B) / A;     // y=A*x+B
130
131   //  Double_t xp1 = (fga/2. + fgb/2.*fgtanBetta)/(TMath::Sin(fTheta) + fgtanBetta*TMath::Cos(fTheta));
132   //  printf(" xp1 %9.3f \n ", xp1);
133   // xp1 == xp => both methods give the same results - 3-feb-05
134   Double_t alpha = TMath::Pi()/2. + fgangle/2;
135   Double_t xt = (fga+fga2)*TMath::Tan(fTheta)*TMath::Tan(alpha)/(4.*(1.-TMath::Tan(fTheta)*TMath::Tan(alpha)));
136   Double_t yt = xt / TMath::Tan(fTheta), xp = TMath::Sqrt(xt*xt + yt*yt);
137   Double_t x  = xl + xp;
138   fOK.Set(x, y);
139   //  printf(" yl %9.3f | xl %9.3f | xp %9.3f \n", yl, xl, xp);
140
141   // have to define A and B; 
142   Double_t yCprev = fgr + fga*TMath::Cos(fTheta);
143   Double_t xCprev = (yCprev - B) / A;
144   Double_t xA     = xCprev + fga*TMath::Sin(fTheta), yA = fgr;
145
146   fThetaA = fTheta - fgangle/2.;
147   fA = TMath::Tan(fThetaA); // !!
148   fB = yA - fA*xA;
149
150   DefineAllStaff();
151 }
152
153 void AliEMCALShishKebabTrd1Module::DefineAllStaff()
154 {
155   //Define some parameters      
156   DefineName(fTheta);
157   // Centers of cells - 2X2 case
158   Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2 
159
160   Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
161   Double_t yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
162   fOK1.Set(xk1,yk1);
163
164   Double_t xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
165   Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
166   fOK2.Set(xk2,yk2);
167
168   // Centers of cells - 3X3 case; Nov 9,2006
169   fOK3X3[1].Set(fOK.X(), fOK.Y()-fgr); // coincide with module center
170
171   kk1 = ((fga+fga2)/4. + fga/6.)/2.; 
172
173   xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
174   yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
175   fOK3X3[0].Set(xk1,yk1);
176
177   xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
178   yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
179   fOK3X3[2].Set(xk2,yk2);
180
181   // May 15, 2006; position of module(cells) center face 
182   fOB.Set(fOK.X()-fgb/2.*TMath::Cos(fTheta),  fOK.Y()-fgb/2.*TMath::Sin(fTheta)-fgr);
183   fOB1.Set(fOB.X()-fga/4.*TMath::Sin(fTheta), fOB.Y()+fga/4.*TMath::Cos(fTheta));
184   fOB2.Set(fOB.X()+fga/4.*TMath::Sin(fTheta), fOB.Y()-fga/4.*TMath::Cos(fTheta));
185   // Jul 30, 2007 - for taking into account a position of shower maximum
186   fThetaOB1 = fTheta - fgangle/4.; // ??
187   fThetaOB2 = fTheta + fgangle/4.;
188
189   // Position of right/top point of module
190   // Gives the posibility to estimate SM size in z direction
191   Double_t xBottom     = (fgr - fB) / fA;
192   Double_t yBottom     = fgr;
193   fORB.Set(xBottom, yBottom);
194
195   Double_t l = fgb / TMath::Cos(fgangle/2.); // length of lateral module side
196   Double_t xTop = xBottom + l*TMath::Cos(TMath::ATan(fA));
197   Double_t yTop = fA*xTop + fB;
198   fORT.Set(xTop, yTop);
199 }
200
201 //_____________________________________________________________________________
202 void AliEMCALShishKebabTrd1Module::DefineFirstModule(const Int_t key)
203 {
204   //    Oct 23-25, 2010
205   //  key=0 - zero tilt of first module;
206   //  key=1 - angle=fgangle/2 = 0.75 degree.
207   //  This is what we have in produced SM. 
208
209   // Define first module
210   if(key==0) {
211     // theta in radians ; first object theta=pi/2.
212     fTheta = TMath::PiOver2();
213     fOK.Set(fga2/2., fgr + fgb/2.); // position the center of module vs o
214
215     // parameters of right line : y = A*z + B in system where zero point is IP.
216     fThetaA = fTheta - fgangle/2.;
217     fA      = TMath::Tan(fThetaA);
218     Double_t xA = fga/2. + fga2/2.;
219     Double_t yA = fgr;
220     fB = yA - fA*xA;
221
222   } else if(key==1) {
223     // theta in radians ; first object theta = 90-0.75 = 89.25 degree
224     fTheta = 89.25*TMath::DegToRad();
225     Double_t al1 = fgangle/2.;
226     Double_t x = 0.5*(fga*TMath::Cos(al1) + fgb*TMath::Sin(al1));
227     Double_t y = 0.5*(fgb + fga*TMath::Sin(al1))*TMath::Cos(al1);
228     fOK.Set(x, fgr + y);
229     // parameters of right line : y = A*z + B in system where zero point is IP.
230     fThetaA = fTheta - fgangle/2.;
231     fA      = TMath::Tan(fThetaA);
232     Double_t xA = fga*TMath::Cos(al1);
233     Double_t yA = fgr;
234     fB = yA - fA*xA;
235
236   } else {
237     printf("<E> key=%i : wrong case \n",key);
238     assert(0);
239   }
240   TObject::SetUniqueID(1); //
241
242   DefineAllStaff();
243 }
244
245 //_____________________________________________________________________________
246 void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta)
247 {
248   // Define name of object
249   SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
250 }
251
252 //_____________________________________________________________________________
253 Bool_t AliEMCALShishKebabTrd1Module::GetParameters()
254 {
255   
256   // Get needing module parameters from EMCAL geometry
257   
258   if(!fGeometry) {
259     Warning("GetParameters()"," No geometry ");
260     return kFALSE; 
261   }  
262   
263   TString sn(fGeometry->GetName()); // 2-Feb-05
264   sn.ToUpper();
265   
266   fga        = (Double_t)fGeometry->GetEtaModuleSize();
267   fgb        = (Double_t)fGeometry->GetLongModuleSize();
268   fgangle    = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad();
269   fgtanBetta = TMath::Tan(fgangle/2.);
270   fgr        = (Double_t)fGeometry->GetIPDistance();
271
272   fgr += fGeometry->GetSteelFrontThickness();
273
274   fga2       = Double_t(fGeometry->Get2Trd1Dx2());
275   //PH  PrintShish(0);
276   return kTRUE;
277 }
278
279 // service methods
280 //_____________________________________________________________________________
281 void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
282 {
283   // service method
284   if(pri>=0) { 
285     if(pri >= 1) {
286       printf("PrintShish() \n a %7.3f:%7.3f | b %7.2f | r %7.2f \n TRD1 angle %7.6f(%5.2f) | tanBetta %7.6f", 
287       fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
288       printf(" fTheta %f : %5.2f : cos(theta) %f\n", 
289       fTheta, GetThetaInDegree(),TMath::Cos(fTheta)); 
290       printf(" OK : %i |%s| theta %f :  phi = %f(%5.2f) \n", 
291       GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
292     }
293     printf(" y %9.3f x %9.3f xrb %9.3f (right bottom on r=%9.3f ) \n", 
294            fOK.X(), fOK.Y(), fORB.X(),fORB.Y());
295     if(pri>=2) {
296       printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
297       printf(" fOK  : X %9.4f: Y %9.4f : eta  %5.3f\n",  fOK.X(), fOK.Y(), GetEtaOfCenterOfModule());
298       printf(" fOK1 : X %9.4f: Y %9.4f :   (local, ieta=2)\n", fOK1.X(), fOK1.Y());
299       printf(" fOK2 : X %9.4f: Y %9.4f :   (local, ieta=1)\n\n", fOK2.X(), fOK2.Y());
300       printf(" fOB  : X %9.4f: Y %9.4f \n", fOB.X(), fOB.Y());
301       printf(" fOB1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOB1.X(), fOB1.Y());
302       printf(" fOB2 : X %9.4f: Y %9.4f (local, ieta=1)\n", fOB2.X(), fOB2.Y());
303       // 3X3 
304       printf(" 3X3 \n");
305       for(int ieta=0; ieta<3; ieta++) {
306         printf(" fOK3X3[%i] : X %9.4f: Y %9.4f (local) \n", ieta, fOK3X3[ieta].X(), fOK3X3[ieta].Y());
307       }
308       //      fOK.Dump();
309       GetMaxEtaOfModule(pri);
310     }
311   }
312 }
313
314 //_____________________________________________________________________________
315 Double_t  AliEMCALShishKebabTrd1Module::GetThetaInDegree() const 
316 {
317   return fTheta*TMath::RadToDeg();
318 }
319
320 //_____________________________________________________________________________
321 Double_t  AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const 
322
323   return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
324 }
325
326 //_____________________________________________________________________________
327 void AliEMCALShishKebabTrd1Module::GetPositionAtCenterCellLine(Int_t ieta, Double_t dist, TVector2 &v)
328 {
329   // Jul 30, 2007
330   static Double_t theta=0., x=0., y=0.;
331   if(ieta==0) {
332     v     = fOB2;
333     theta = fThetaOB2;
334   } else if(ieta==1) {
335     v     = fOB1;
336     theta = fThetaOB1;
337   } else {
338     assert(0);
339   }
340   x = v.X() + TMath::Cos(theta) * dist;
341   y = v.Y() + TMath::Sin(theta) * dist;
342   //  printf(" GetPositionAtCenterCellLine() %s : dist %f : ieta %i : x %f %f v.X() | y %f %f v.Y() : cos %f sin %f \n", 
343   //GetName(), dist, ieta, v.X(),x, y,v.Y(),TMath::Cos(theta),TMath::Sin(theta));
344   v.Set(x,y);
345 }  
346
347
348 //_____________________________________________________________________________
349 Double_t  AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const 
350
351   // Right bottom point of module
352   Double_t thetaBottom = TMath::ATan2(fORB.Y(),fORB.X());
353   Double_t etaBottom   = ThetaToEta(thetaBottom);
354   // Right top point of module
355   Double_t thetaTop = TMath::ATan2(fORT.Y(),fORT.X());
356   Double_t etaTop   = ThetaToEta(thetaTop);
357
358   if(pri) { 
359     printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
360            etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg(), fORB.X(), fORB.Y());
361     printf(" Right    top point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
362            etaTop, thetaTop, thetaTop * TMath::RadToDeg(), fORT.X(), fORT.Y());
363   }
364   return etaBottom>etaTop ? etaBottom : etaTop;
365 }