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