]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EMCAL/AliEMCALShishKebabTrd1Module.cxx
fixed compilation warning
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALShishKebabTrd1Module.cxx
CommitLineData
1963b290 1/**************************************************************************
3d841a9f 2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
1963b290 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
25ab8a31 18//_________________________________________________________________________
19// Main class for TRD1 geometry of Shish-Kebab case.
3d841a9f 20// Author: Alexei Pavlinov(WSU).
21// Sep 20004 - Nov 2006; Apr 2010
25ab8a31 22// See web page with description of Shish-Kebab geometries:
23// http://pdsfweb01.nersc.gov/~pavlinov/ALICE/SHISHKEBAB/RES/shishkebabALICE.html
1ae500a2 24// Nov 9,2006 - added case of 3X3
25ab8a31 25//_________________________________________________________________________
1963b290 26
b42d4197 27#include "AliLog.h"
1963b290 28#include "AliEMCALShishKebabTrd1Module.h"
0c5b726e 29#include "AliEMCALEMCGeometry.h"
1963b290 30
d1f9a8ab 31#include <cassert>
60d70c4d 32
1963b290 33ClassImp(AliEMCALShishKebabTrd1Module)
34
7cfcebd3 35 //AliEMCALEMCGeometry *AliEMCALShishKebabTrd1Module::fgGeometry=0;
1963b290 36 Double_t AliEMCALShishKebabTrd1Module::fga=0.;
37 Double_t AliEMCALShishKebabTrd1Module::fga2=0.;
38 Double_t AliEMCALShishKebabTrd1Module::fgb=0.;
39 Double_t AliEMCALShishKebabTrd1Module::fgr=0.;
e52475ed 40 Double_t AliEMCALShishKebabTrd1Module::fgangle=0.; // around one degree
1963b290 41 Double_t AliEMCALShishKebabTrd1Module::fgtanBetta=0; //
42
0a4cb131 43//_____________________________________________________________________________
0c5b726e 44AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALEMCGeometry *g)
18a21c7c 45 : TNamed(),
7cfcebd3 46 fGeometry(g),
18a21c7c 47 fOK(),
48 fA(0.),
49 fB(0.),
50 fThetaA(0.),
51 fTheta(theta),
52 fOK1(),
53 fOK2(),
54 fOB(),
55 fOB1(),
1d46d1f6 56 fOB2(),
1ae500a2 57 fThetaOB1(0.),
58 fThetaOB2(0.),
d1ccaddd 59 fOK3X3(),
60 fORB(),
61 fORT()
25ab8a31 62{
3d841a9f 63 TString snam(g->GetName());
64 Int_t key=0;
65 if(snam.Contains("FIRSTYEARv1",TString::kIgnoreCase)) key=1;
7cfcebd3 66 if(GetParameters()) {
3d841a9f 67 DefineFirstModule(key);
7cfcebd3 68 }
1963b290 69 DefineName(fTheta);
3d841a9f 70 printf("AliEMCALShishKebabTrd1Module - first module key=%i: theta %1.4f geometry %s\n",key,fTheta, g->GetName());
1963b290 71}
72
0a4cb131 73//_____________________________________________________________________________
18a21c7c 74AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor)
75 : TNamed(),
7cfcebd3 76 fGeometry(leftNeighbor.fGeometry),
18a21c7c 77 fOK(),
78 fA(0.),
79 fB(0.),
80 fThetaA(0.),
81 fTheta(0.),
82 fOK1(),
83 fOK2(),
84 fOB(),
85 fOB1(),
1d46d1f6 86 fOB2(),
1ae500a2 87 fThetaOB1(0.),
88 fThetaOB2(0.),
d1ccaddd 89 fOK3X3(),
90 fORB(),
91 fORT()
25ab8a31 92{
1963b290 93 // printf("** Left Neighbor : %s **\n", leftNeighbor.GetName());
1963b290 94 fTheta = leftNeighbor.GetTheta() - fgangle;
1d46d1f6 95
96 TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
97
1963b290 98 Init(leftNeighbor.GetA(),leftNeighbor.GetB());
99}
100
0a4cb131 101//________________________________________________________________
18a21c7c 102AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod)
103 : TNamed(mod.GetName(),mod.GetTitle()),
7cfcebd3 104 fGeometry(mod.fGeometry),
18a21c7c 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),
60d70c4d 114 fOB2(mod.fOB2),
115 fThetaOB1(mod.fThetaOB1),
d1ccaddd 116 fThetaOB2(mod.fThetaOB2),
117 fORB(mod.fORB),
118 fORT(mod.fORT)
0a4cb131 119{
120 //copy ctor
3f66111e 121 for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i];
0a4cb131 122}
123
124//________________________________________________________________
25ab8a31 125void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B)
126{
127 // Define parameter module from parameters A,B from previos.
1963b290 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
1d46d1f6 150 DefineAllStaff();
151}
152
153void AliEMCALShishKebabTrd1Module::DefineAllStaff()
154{
0c5b726e 155 //Define some parameters
1963b290 156 DefineName(fTheta);
1ae500a2 157 // Centers of cells - 2X2 case
1963b290 158 Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2
159
160 Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
e52475ed 161 Double_t yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
1963b290 162 fOK1.Set(xk1,yk1);
163
164 Double_t xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
e52475ed 165 Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
1963b290 166 fOK2.Set(xk2,yk2);
b44d5aa4 167
1ae500a2 168 // Centers of cells - 3X3 case; Nov 9,2006
1d46d1f6 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
1ae500a2 181 // May 15, 2006; position of module(cells) center face
b44d5aa4 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));
1ae500a2 185 // Jul 30, 2007 - for taking into account a position of shower maximum
186 fThetaOB1 = fTheta - fgangle/4.; // ??
187 fThetaOB2 = fTheta + fgangle/4.;
d1ccaddd 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);
1963b290 199}
200
0a4cb131 201//_____________________________________________________________________________
3d841a9f 202void AliEMCALShishKebabTrd1Module::DefineFirstModule(const Int_t key)
1963b290 203{
3d841a9f 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.
1963b290 208
3d841a9f 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;
1963b290 235
3d841a9f 236 } else {
237 printf("<E> key=%i : wrong case \n",key);
238 assert(0);
239 }
1963b290 240 TObject::SetUniqueID(1); //
1d46d1f6 241
242 DefineAllStaff();
1963b290 243}
244
0a4cb131 245//_____________________________________________________________________________
25ab8a31 246void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta)
1963b290 247{
25ab8a31 248 // Define name of object
249 SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
1963b290 250}
251
0a4cb131 252//_____________________________________________________________________________
1963b290 253Bool_t AliEMCALShishKebabTrd1Module::GetParameters()
254{
0c5b726e 255
256 // Get needing module parameters from EMCAL geometry
a5f0a2ba 257
7cfcebd3 258 if(!fGeometry) {
1963b290 259 Warning("GetParameters()"," No geometry ");
260 return kFALSE;
a5f0a2ba 261 }
262
263 TString sn(fGeometry->GetName()); // 2-Feb-05
264 sn.ToUpper();
0c5b726e 265
7cfcebd3 266 fga = (Double_t)fGeometry->GetEtaModuleSize();
267 fgb = (Double_t)fGeometry->GetLongModuleSize();
268 fgangle = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad();
1963b290 269 fgtanBetta = TMath::Tan(fgangle/2.);
7cfcebd3 270 fgr = (Double_t)fGeometry->GetIPDistance();
1d46d1f6 271
7cfcebd3 272 fgr += fGeometry->GetSteelFrontThickness();
1d46d1f6 273
7cfcebd3 274 fga2 = Double_t(fGeometry->Get2Trd1Dx2());
c4a57092 275 //PH PrintShish(0);
1963b290 276 return kTRUE;
277}
278
279// service methods
0a4cb131 280//_____________________________________________________________________________
c63c3c5d 281void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
1963b290 282{
25ab8a31 283 // service method
3d841a9f 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",
1963b290 291 GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
3d841a9f 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) {
1963b290 296 printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
1d46d1f6 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());
b44d5aa4 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());
1d46d1f6 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 }
b44d5aa4 308 // fOK.Dump();
1d46d1f6 309 GetMaxEtaOfModule(pri);
1963b290 310 }
311 }
312}
25ab8a31 313
0a4cb131 314//_____________________________________________________________________________
25ab8a31 315Double_t AliEMCALShishKebabTrd1Module::GetThetaInDegree() const
316{
317 return fTheta*TMath::RadToDeg();
318}
319
0a4cb131 320//_____________________________________________________________________________
25ab8a31 321Double_t AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const
322{
323 return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
324}
1d46d1f6 325
d297ef6e 326//_____________________________________________________________________________
1ae500a2 327void 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;
3d841a9f 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));
1ae500a2 344 v.Set(x,y);
1ae500a2 345}
346
347
1d46d1f6 348//_____________________________________________________________________________
349Double_t AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const
350{
351 // Right bottom point of module
d1ccaddd 352 Double_t thetaBottom = TMath::ATan2(fORB.Y(),fORB.X());
1d46d1f6 353 Double_t etaBottom = ThetaToEta(thetaBottom);
354 // Right top point of module
d1ccaddd 355 Double_t thetaTop = TMath::ATan2(fORT.Y(),fORT.X());
1d46d1f6 356 Double_t etaTop = ThetaToEta(thetaTop);
357
358 if(pri) {
d1ccaddd 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());
1d46d1f6 363 }
364 return etaBottom>etaTop ? etaBottom : etaTop;
365}