several coverity reports corrected in geometry
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALShishKebabTrd1Module.cxx
CommitLineData
1963b290 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
25ab8a31 18//_________________________________________________________________________
19// Main class for TRD1 geometry of Shish-Kebab case.
20// Author: Aleksei Pavlinov(WSU).
1d46d1f6 21// Sep 20004 - Nov 2006
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{
63 // theta in radians ; first object shold be with theta=pi/2.
7cfcebd3 64 fTheta = TMath::PiOver2();
65 if(GetParameters()) {
66 DefineFirstModule();
67 }
1963b290 68 DefineName(fTheta);
916f1e76 69 AliDebug(1,Form("AliEMCALShishKebabTrd1Module - first module: theta %1.4f geometry %s",fTheta,g->GetName()));
1963b290 70}
71
0a4cb131 72//_____________________________________________________________________________
18a21c7c 73AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor)
74 : TNamed(),
7cfcebd3 75 fGeometry(leftNeighbor.fGeometry),
18a21c7c 76 fOK(),
77 fA(0.),
78 fB(0.),
79 fThetaA(0.),
80 fTheta(0.),
81 fOK1(),
82 fOK2(),
83 fOB(),
84 fOB1(),
1d46d1f6 85 fOB2(),
1ae500a2 86 fThetaOB1(0.),
87 fThetaOB2(0.),
d1ccaddd 88 fOK3X3(),
89 fORB(),
90 fORT()
25ab8a31 91{
1963b290 92 // printf("** Left Neighbor : %s **\n", leftNeighbor.GetName());
1963b290 93 fTheta = leftNeighbor.GetTheta() - fgangle;
1d46d1f6 94
95 TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
96
1963b290 97 Init(leftNeighbor.GetA(),leftNeighbor.GetB());
98}
99
0a4cb131 100//________________________________________________________________
18a21c7c 101AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod)
102 : TNamed(mod.GetName(),mod.GetTitle()),
7cfcebd3 103 fGeometry(mod.fGeometry),
18a21c7c 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),
60d70c4d 113 fOB2(mod.fOB2),
114 fThetaOB1(mod.fThetaOB1),
d1ccaddd 115 fThetaOB2(mod.fThetaOB2),
116 fORB(mod.fORB),
117 fORT(mod.fORT)
0a4cb131 118{
119 //copy ctor
3f66111e 120 for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i];
0a4cb131 121}
122
123//________________________________________________________________
25ab8a31 124void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B)
125{
126 // Define parameter module from parameters A,B from previos.
1963b290 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
1d46d1f6 149 DefineAllStaff();
150}
151
152void AliEMCALShishKebabTrd1Module::DefineAllStaff()
153{
0c5b726e 154 //Define some parameters
1963b290 155 DefineName(fTheta);
1ae500a2 156 // Centers of cells - 2X2 case
1963b290 157 Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2
158
159 Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
e52475ed 160 Double_t yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
1963b290 161 fOK1.Set(xk1,yk1);
162
163 Double_t xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
e52475ed 164 Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
1963b290 165 fOK2.Set(xk2,yk2);
b44d5aa4 166
1ae500a2 167 // Centers of cells - 3X3 case; Nov 9,2006
1d46d1f6 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
1ae500a2 180 // May 15, 2006; position of module(cells) center face
b44d5aa4 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));
1ae500a2 184 // Jul 30, 2007 - for taking into account a position of shower maximum
185 fThetaOB1 = fTheta - fgangle/4.; // ??
186 fThetaOB2 = fTheta + fgangle/4.;
d1ccaddd 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);
1963b290 198}
199
0a4cb131 200//_____________________________________________________________________________
1963b290 201void AliEMCALShishKebabTrd1Module::DefineFirstModule()
202{
25ab8a31 203 // Define first module
1963b290 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
1963b290 212 TObject::SetUniqueID(1); //
1d46d1f6 213
214 DefineAllStaff();
1963b290 215}
216
0a4cb131 217//_____________________________________________________________________________
25ab8a31 218void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta)
1963b290 219{
25ab8a31 220 // Define name of object
221 SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
1963b290 222}
223
0a4cb131 224//_____________________________________________________________________________
1963b290 225Bool_t AliEMCALShishKebabTrd1Module::GetParameters()
226{
0c5b726e 227
228 // Get needing module parameters from EMCAL geometry
a5f0a2ba 229
7cfcebd3 230 if(!fGeometry) {
1963b290 231 Warning("GetParameters()"," No geometry ");
232 return kFALSE;
a5f0a2ba 233 }
234
235 TString sn(fGeometry->GetName()); // 2-Feb-05
236 sn.ToUpper();
0c5b726e 237
7cfcebd3 238 fga = (Double_t)fGeometry->GetEtaModuleSize();
239 fgb = (Double_t)fGeometry->GetLongModuleSize();
240 fgangle = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad();
1963b290 241 fgtanBetta = TMath::Tan(fgangle/2.);
7cfcebd3 242 fgr = (Double_t)fGeometry->GetIPDistance();
1d46d1f6 243
7cfcebd3 244 fgr += fGeometry->GetSteelFrontThickness();
1d46d1f6 245
7cfcebd3 246 fga2 = Double_t(fGeometry->Get2Trd1Dx2());
c4a57092 247 //PH PrintShish(0);
1963b290 248 return kTRUE;
249}
250
251// service methods
0a4cb131 252//_____________________________________________________________________________
c63c3c5d 253void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
1963b290 254{
25ab8a31 255 // service method
1963b290 256 if(pri>=0) {
b44d5aa4 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",
1963b290 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));
e52475ed 261 if(pri>=1) {
b44d5aa4 262 printf(" %i |%s| theta %f : fOK.Phi = %f(%5.2f)\n",
1963b290 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());
1d46d1f6 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());
b44d5aa4 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());
1d46d1f6 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 }
b44d5aa4 276 // fOK.Dump();
1d46d1f6 277 GetMaxEtaOfModule(pri);
1963b290 278 }
279 }
280}
25ab8a31 281
0a4cb131 282//_____________________________________________________________________________
25ab8a31 283Double_t AliEMCALShishKebabTrd1Module::GetThetaInDegree() const
284{
285 return fTheta*TMath::RadToDeg();
286}
287
0a4cb131 288//_____________________________________________________________________________
25ab8a31 289Double_t AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const
290{
291 return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
292}
1d46d1f6 293
d297ef6e 294//_____________________________________________________________________________
1ae500a2 295void 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
1d46d1f6 315//_____________________________________________________________________________
316Double_t AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const
317{
318 // Right bottom point of module
d1ccaddd 319 Double_t thetaBottom = TMath::ATan2(fORB.Y(),fORB.X());
1d46d1f6 320 Double_t etaBottom = ThetaToEta(thetaBottom);
321 // Right top point of module
d1ccaddd 322 Double_t thetaTop = TMath::ATan2(fORT.Y(),fORT.X());
1d46d1f6 323 Double_t etaTop = ThetaToEta(thetaTop);
324
325 if(pri) {
d1ccaddd 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());
1d46d1f6 330 }
331 return etaBottom>etaTop ? etaBottom : etaTop;
332}