1358387acb7dfb06240dc39229f8c440e6bd3edc
[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   
230   if(!fGeometry) {
231     Warning("GetParameters()"," No geometry ");
232     return kFALSE; 
233   }  
234   
235   TString sn(fGeometry->GetName()); // 2-Feb-05
236   sn.ToUpper();
237   
238   fga        = (Double_t)fGeometry->GetEtaModuleSize();
239   fgb        = (Double_t)fGeometry->GetLongModuleSize();
240   fgangle    = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad();
241   fgtanBetta = TMath::Tan(fgangle/2.);
242   fgr        = (Double_t)fGeometry->GetIPDistance();
243
244   fgr += fGeometry->GetSteelFrontThickness();
245
246   fga2       = Double_t(fGeometry->Get2Trd1Dx2());
247   //PH  PrintShish(0);
248   return kTRUE;
249 }
250
251 // service methods
252 //_____________________________________________________________________________
253 void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
254 {
255   // service method
256   if(pri>=0) {
257     printf("PrintShish() \n a %7.3f:%7.3f | b %7.2f | r %7.2f \n TRD1 angle %7.6f(%5.2f) | tanBetta %7.6f", 
258     fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
259     printf(" fTheta %f : %5.2f : cos(theta) %f\n", 
260     fTheta, GetThetaInDegree(),TMath::Cos(fTheta)); 
261     if(pri>=1) {
262       printf(" %i |%s| theta %f :  fOK.Phi = %f(%5.2f)\n", 
263       GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
264       printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
265       printf(" fOK  : X %9.4f: Y %9.4f : eta  %5.3f\n",  fOK.X(), fOK.Y(), GetEtaOfCenterOfModule());
266       printf(" fOK1 : X %9.4f: Y %9.4f :   (local, ieta=2)\n", fOK1.X(), fOK1.Y());
267       printf(" fOK2 : X %9.4f: Y %9.4f :   (local, ieta=1)\n\n", fOK2.X(), fOK2.Y());
268       printf(" fOB  : X %9.4f: Y %9.4f \n", fOB.X(), fOB.Y());
269       printf(" fOB1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOB1.X(), fOB1.Y());
270       printf(" fOB2 : X %9.4f: Y %9.4f (local, ieta=1)\n", fOB2.X(), fOB2.Y());
271       // 3X3 
272       printf(" 3X3 \n");
273       for(int ieta=0; ieta<3; ieta++) {
274         printf(" fOK3X3[%i] : X %9.4f: Y %9.4f (local) \n", ieta, fOK3X3[ieta].X(), fOK3X3[ieta].Y());
275       }
276       //      fOK.Dump();
277       GetMaxEtaOfModule(pri);
278     }
279   }
280 }
281
282 //_____________________________________________________________________________
283 Double_t  AliEMCALShishKebabTrd1Module::GetThetaInDegree() const 
284 {
285   return fTheta*TMath::RadToDeg();
286 }
287
288 //_____________________________________________________________________________
289 Double_t  AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const 
290
291   return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
292 }
293
294 //_____________________________________________________________________________
295 void AliEMCALShishKebabTrd1Module::GetPositionAtCenterCellLine(Int_t ieta, Double_t dist, TVector2 &v)
296 {
297   // Jul 30, 2007
298   static Double_t theta=0., x=0., y=0.;
299   if(ieta==0) {
300     v     = fOB2;
301     theta = fThetaOB2;
302   } else if(ieta==1) {
303     v     = fOB1;
304     theta = fThetaOB1;
305   } else {
306     assert(0);
307   }
308   x = v.X() + TMath::Cos(theta) * dist;
309   y = v.Y() + TMath::Sin(theta) * dist;
310   v.Set(x,y);
311   //printf(" GetPositionAtCenterCellLine() : dist %f : ieta %i : x %f | y %f \n", dist, ieta, x, y);
312 }  
313
314
315 //_____________________________________________________________________________
316 Double_t  AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const 
317
318   // Right bottom point of module
319   Double_t thetaBottom = TMath::ATan2(fORB.Y(),fORB.X());
320   Double_t etaBottom   = ThetaToEta(thetaBottom);
321   // Right top point of module
322   Double_t thetaTop = TMath::ATan2(fORT.Y(),fORT.X());
323   Double_t etaTop   = ThetaToEta(thetaTop);
324
325   if(pri) { 
326     printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
327            etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg(), fORB.X(), fORB.Y());
328     printf(" Right    top point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", 
329            etaTop, thetaTop, thetaTop * TMath::RadToDeg(), fORT.X(), fORT.Y());
330   }
331   return etaBottom>etaTop ? etaBottom : etaTop;
332 }