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