Added class to read reconstruction parameters from OCDB (Yuri)
[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
1d46d1f6 24// Nov 9,2006 - added cas of 3X3
25ab8a31 25//_________________________________________________________________________
1963b290 26
b42d4197 27#include "AliLog.h"
1963b290 28#include "AliEMCALShishKebabTrd1Module.h"
25ab8a31 29//#include <assert.h>
1963b290 30#include "AliEMCALGeometry.h"
31
25ab8a31 32#include <Riostream.h>
e52475ed 33
1963b290 34ClassImp(AliEMCALShishKebabTrd1Module)
35
36 AliEMCALGeometry *AliEMCALShishKebabTrd1Module::fgGeometry=0;
37 Double_t AliEMCALShishKebabTrd1Module::fga=0.;
38 Double_t AliEMCALShishKebabTrd1Module::fga2=0.;
39 Double_t AliEMCALShishKebabTrd1Module::fgb=0.;
40 Double_t AliEMCALShishKebabTrd1Module::fgr=0.;
e52475ed 41 Double_t AliEMCALShishKebabTrd1Module::fgangle=0.; // around one degree
1963b290 42 Double_t AliEMCALShishKebabTrd1Module::fgtanBetta=0; //
43
0a4cb131 44//_____________________________________________________________________________
18a21c7c 45AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALGeometry *g)
46 : TNamed(),
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(),
57 fOK3X3()
25ab8a31 58{
59 // theta in radians ; first object shold be with theta=pi/2.
1963b290 60 if(fgGeometry==0) {
25ab8a31 61 fTheta = TMath::PiOver2();
e52475ed 62 fgGeometry = g;
1963b290 63 if(GetParameters()) {
64 DefineFirstModule();
65 }
66 } else Warning("AliEMCALShishKebabTrd1Module(theta)","You should call this constractor just once !!");
67 DefineName(fTheta);
b42d4197 68 AliInfo(Form("AliEMCALShishKebabTrd1Module - first module: theta %1.4f geometry %s",fTheta,g->GetName()));
1963b290 69}
70
0a4cb131 71//_____________________________________________________________________________
18a21c7c 72AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor)
73 : TNamed(),
74 fOK(),
75 fA(0.),
76 fB(0.),
77 fThetaA(0.),
78 fTheta(0.),
79 fOK1(),
80 fOK2(),
81 fOB(),
82 fOB1(),
1d46d1f6 83 fOB2(),
84 fOK3X3()
25ab8a31 85{
1963b290 86 // printf("** Left Neighbor : %s **\n", leftNeighbor.GetName());
1963b290 87 fTheta = leftNeighbor.GetTheta() - fgangle;
1d46d1f6 88
89 TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
90
1963b290 91 Init(leftNeighbor.GetA(),leftNeighbor.GetB());
92}
93
0a4cb131 94//________________________________________________________________
18a21c7c 95AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod)
96 : TNamed(mod.GetName(),mod.GetTitle()),
97 fOK(mod.fOK),
98 fA(mod.fA),
99 fB(mod.fB),
100 fThetaA(mod.fThetaA),
101 fTheta(mod.fTheta),
102 fOK1(mod.fOK1),
103 fOK2(mod.fOK2),
104 fOB(mod.fOB),
105 fOB1(mod.fOB1),
3f66111e 106 fOB2(mod.fOB2)
0a4cb131 107{
108 //copy ctor
3f66111e 109 for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i];
0a4cb131 110}
111
112//________________________________________________________________
25ab8a31 113void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B)
114{
115 // Define parameter module from parameters A,B from previos.
1963b290 116 Double_t yl = (fgb/2)*TMath::Sin(fTheta) + (fga/2)*TMath::Cos(fTheta) + fgr, y = yl;
117 Double_t xl = (yl - B) / A; // y=A*x+B
118
119 // Double_t xp1 = (fga/2. + fgb/2.*fgtanBetta)/(TMath::Sin(fTheta) + fgtanBetta*TMath::Cos(fTheta));
120 // printf(" xp1 %9.3f \n ", xp1);
121 // xp1 == xp => both methods give the same results - 3-feb-05
122 Double_t alpha = TMath::Pi()/2. + fgangle/2;
123 Double_t xt = (fga+fga2)*TMath::Tan(fTheta)*TMath::Tan(alpha)/(4.*(1.-TMath::Tan(fTheta)*TMath::Tan(alpha)));
124 Double_t yt = xt / TMath::Tan(fTheta), xp = TMath::Sqrt(xt*xt + yt*yt);
125 Double_t x = xl + xp;
126 fOK.Set(x, y);
127 // printf(" yl %9.3f | xl %9.3f | xp %9.3f \n", yl, xl, xp);
128
129 // have to define A and B;
130 Double_t yCprev = fgr + fga*TMath::Cos(fTheta);
131 Double_t xCprev = (yCprev - B) / A;
132 Double_t xA = xCprev + fga*TMath::Sin(fTheta), yA = fgr;
133
134 fThetaA = fTheta - fgangle/2.;
135 fA = TMath::Tan(fThetaA); // !!
136 fB = yA - fA*xA;
137
1d46d1f6 138 DefineAllStaff();
139}
140
141void AliEMCALShishKebabTrd1Module::DefineAllStaff()
142{
1963b290 143 DefineName(fTheta);
1d46d1f6 144 // Centers of module - 2X2 case
1963b290 145 Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2
146
147 Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
e52475ed 148 Double_t yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
1963b290 149 fOK1.Set(xk1,yk1);
150
151 Double_t xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
e52475ed 152 Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
1963b290 153 fOK2.Set(xk2,yk2);
b44d5aa4 154
1d46d1f6 155 // Centers of module - 3X3 case; Nov 9,2006
156 fOK3X3[1].Set(fOK.X(), fOK.Y()-fgr); // coincide with module center
157
158 kk1 = ((fga+fga2)/4. + fga/6.)/2.;
159
160 xk1 = fOK.X() - kk1*TMath::Sin(fTheta);
161 yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr;
162 fOK3X3[0].Set(xk1,yk1);
163
164 xk2 = fOK.X() + kk1*TMath::Sin(fTheta);
165 yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr;
166 fOK3X3[2].Set(xk2,yk2);
167
b44d5aa4 168 // May 15, 2006; position of cell face of cells
169 fOB.Set(fOK.X()-fgb/2.*TMath::Cos(fTheta), fOK.Y()-fgb/2.*TMath::Sin(fTheta)-fgr);
170 fOB1.Set(fOB.X()-fga/4.*TMath::Sin(fTheta), fOB.Y()+fga/4.*TMath::Cos(fTheta));
171 fOB2.Set(fOB.X()+fga/4.*TMath::Sin(fTheta), fOB.Y()-fga/4.*TMath::Cos(fTheta));
1d46d1f6 172
1963b290 173}
174
0a4cb131 175//_____________________________________________________________________________
1963b290 176void AliEMCALShishKebabTrd1Module::DefineFirstModule()
177{
25ab8a31 178 // Define first module
1963b290 179 fOK.Set(fga2/2., fgr + fgb/2.); // position the center of module vs o
180
181 // parameters of right line : y = A*z + B in system where zero point is IP.
182 fThetaA = fTheta - fgangle/2.;
183 fA = TMath::Tan(fThetaA);
184 Double_t xA = fga/2. + fga2/2., yA = fgr;
185 fB = yA - fA*xA;
186
1963b290 187 TObject::SetUniqueID(1); //
1d46d1f6 188
189 DefineAllStaff();
1963b290 190}
191
0a4cb131 192//_____________________________________________________________________________
25ab8a31 193void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta)
1963b290 194{
25ab8a31 195 // Define name of object
196 SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
1963b290 197}
198
0a4cb131 199//_____________________________________________________________________________
1963b290 200Bool_t AliEMCALShishKebabTrd1Module::GetParameters()
201{
25ab8a31 202 // Get needing module parameters from EMCAL geometry
e52475ed 203 if(!fgGeometry) fgGeometry = AliEMCALGeometry::GetInstance();
1963b290 204 TString sn(fgGeometry->GetName()); // 2-Feb-05
205 sn.ToUpper();
206 if(!fgGeometry) {
207 Warning("GetParameters()"," No geometry ");
208 return kFALSE;
209 }
210
211 fga = (Double_t)fgGeometry->GetEtaModuleSize();
212 fgb = (Double_t)fgGeometry->GetLongModuleSize();
213 fgangle = Double_t(fgGeometry->GetTrd1Angle())*TMath::DegToRad();
214 fgtanBetta = TMath::Tan(fgangle/2.);
215 fgr = (Double_t)fgGeometry->GetIPDistance();
1d46d1f6 216
1963b290 217 if(!sn.Contains("TRD2")) fgr += fgGeometry->GetSteelFrontThickness();
1d46d1f6 218
1963b290 219 fga2 = Double_t(fgGeometry->Get2Trd1Dx2());
c4a57092 220 //PH PrintShish(0);
1963b290 221 return kTRUE;
222}
223
224// service methods
0a4cb131 225//_____________________________________________________________________________
c63c3c5d 226void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
1963b290 227{
25ab8a31 228 // service method
1963b290 229 if(pri>=0) {
b44d5aa4 230 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 231 fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
232 printf(" fTheta %f : %5.2f : cos(theta) %f\n",
233 fTheta, GetThetaInDegree(),TMath::Cos(fTheta));
e52475ed 234 if(pri>=1) {
b44d5aa4 235 printf(" %i |%s| theta %f : fOK.Phi = %f(%5.2f)\n",
1963b290 236 GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
237 printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
1d46d1f6 238 printf(" fOK : X %9.4f: Y %9.4f : eta %5.3f\n", fOK.X(), fOK.Y(), GetEtaOfCenterOfModule());
239 printf(" fOK1 : X %9.4f: Y %9.4f : (local, ieta=2)\n", fOK1.X(), fOK1.Y());
240 printf(" fOK2 : X %9.4f: Y %9.4f : (local, ieta=1)\n\n", fOK2.X(), fOK2.Y());
b44d5aa4 241 printf(" fOB : X %9.4f: Y %9.4f \n", fOB.X(), fOB.Y());
242 printf(" fOB1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOB1.X(), fOB1.Y());
243 printf(" fOB2 : X %9.4f: Y %9.4f (local, ieta=1)\n", fOB2.X(), fOB2.Y());
1d46d1f6 244 // 3X3
245 printf(" 3X3 \n");
246 for(int ieta=0; ieta<3; ieta++) {
247 printf(" fOK3X3[%i] : X %9.4f: Y %9.4f (local) \n", ieta, fOK3X3[ieta].X(), fOK3X3[ieta].Y());
248 }
b44d5aa4 249 // fOK.Dump();
1d46d1f6 250 GetMaxEtaOfModule(pri);
1963b290 251 }
252 }
253}
25ab8a31 254
0a4cb131 255//_____________________________________________________________________________
25ab8a31 256Double_t AliEMCALShishKebabTrd1Module::GetThetaInDegree() const
257{
258 return fTheta*TMath::RadToDeg();
259}
260
0a4cb131 261//_____________________________________________________________________________
25ab8a31 262Double_t AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const
263{
264 return -TMath::Log(TMath::Tan(fOK.Phi()/2.));
265}
1d46d1f6 266
267//_____________________________________________________________________________
268Double_t AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const
269{
270 // Right bottom point of module
271 Double_t xBottom = (fgr - fB) / fA;
272 Double_t thetaBottom = TMath::ATan2(fgr, xBottom);
273 Double_t etaBottom = ThetaToEta(thetaBottom);
274 // Right top point of module
275 Double_t l = fgb / TMath::Cos(fgangle/2.); // length of lateral module side
276 Double_t xTop = xBottom + l*TMath::Cos(TMath::ATan(fA));
277 Double_t yTop = fA*xTop + fB;
278 Double_t thetaTop = TMath::ATan2(yTop, xTop);
279 Double_t etaTop = ThetaToEta(thetaTop);
280
281 if(pri) {
282 printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) \n",
283 etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg());
284 printf(" Right top point of module : eta %5.4f : theta %6.4f (%6.2f) \n",
285 etaTop, thetaTop, thetaTop * TMath::RadToDeg());
286 }
287 return etaBottom>etaTop ? etaBottom : etaTop;
288}