1 /**************************************************************************
2 * Copyright(c) 1998-2006, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //_________________________________________________________________________
19 // Main class for "twist" geometry of Shish-Kebab case.
20 // Author: Aleksei Pavlinov(WSU).
22 // See web page with description of Shish-Kebab geometries:
23 // http://pdsfweb01.nersc.gov/~pavlinov/ALICE/SHISHKEBAB/RES/shishkebabALICE.html
24 //_________________________________________________________________________
26 #include "AliEMCALShishKebabModule.h"
27 #include "AliEMCALGeometry.h"
31 ClassImp(AliEMCALShishKebabModule)
33 AliEMCALGeometry *AliEMCALShishKebabModule::fgGeometry=0;
34 Double_t AliEMCALShishKebabModule::fga=0.;
35 Double_t AliEMCALShishKebabModule::fgb=0.;
36 Double_t AliEMCALShishKebabModule::fgr=0.;
38 AliEMCALShishKebabModule::AliEMCALShishKebabModule() : TNamed()
40 // theta in radians ; first object shold be with theta=pi/2.
42 fTheta = TMath::PiOver2();
48 Warning("AliEMCALShishKebabModule(theta)","You should call this constractor just once !!");
52 AliEMCALShishKebabModule::AliEMCALShishKebabModule(AliEMCALShishKebabModule &leftNeighbor) : TNamed()
55 TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1);
56 Init(leftNeighbor.GetA(),leftNeighbor.GetB());
59 void AliEMCALShishKebabModule::Init(Double_t A, Double_t B)
62 // Initialisation method
64 Double_t thetaMin, thetaMax, par[4];
67 // DefineSecondModuleFirstAssumption();
68 thetaMax = TMath::ATan2(fgr, 1.4*fga);
69 thetaMin = TMath::ATan2(fgr, 1.6*fga);
70 fTheta = Solve(AliEMCALShishKebabModule::Y2, thetaMin,thetaMax,npar,par);
78 thetaMax = TMath::ATan2(fgr,x + 0.5*fga);
79 thetaMin = TMath::ATan2(fgr,x + 1.5*fga);
80 fTheta = Solve(AliEMCALShishKebabModule::YALL, thetaMin,thetaMax,npar,par);
83 Double_t rOK = fgr / TMath::Sin(fTheta) + (fga/2.)/TMath::Tan(fTheta) + fgb/2.;
84 fOK.SetMagPhi(rOK, fTheta);
85 // have to define A and B
86 fA = TMath::Tan(fTheta);
87 fB = -fga/(2.*TMath::Cos(fTheta));
91 void AliEMCALShishKebabModule::DefineFirstModule()
93 // Define first module
94 fOK.Set(fga/2., fgr + fgb/2.); // position the center of module vs o
97 fA = -999.; // fA=infinite in this case
98 TObject::SetUniqueID(1); //
101 void AliEMCALShishKebabModule::DefineSecondModuleFirstAssumption()
102 { // Keep for testing and checking
103 // cos(theta) << 1, theta ~ pi/2.; a/r = 11.4/462.54 = 0.0246465 << 1;
104 // theta=1.53382 from this case; theta=1.533869 from TGraph::Zero
105 Double_t x = (3.*fga)/(2.*fgr);
106 fTheta = TMath::ACos(x);
108 Double_t rOK = fgr / TMath::Sin(fTheta) + (fga/2.)/TMath::Tan(fTheta) + fgb/2.;
109 fOK.SetMagPhi(rOK, fTheta);
110 // have to define A and B
111 fA = TMath::Tan(fTheta);
112 fB = -fga/(2.*TMath::Cos(fTheta));
117 Double_t AliEMCALShishKebabModule::Solve(Double_t (*fcn)(Double_t*,Double_t*),
118 Double_t xmin, Double_t xmax, Int_t npar, Double_t *par, Double_t eps, Int_t maxIter)
120 // Find out "zero" using TGraph method
121 if(npar); // unused now
125 gr.Zero(k, xmin,xmax, eps, x,y, maxIter); // remember initial interval
128 gr.Zero(k, xmin,xmax, eps, x,y, maxIter);
133 Double_t AliEMCALShishKebabModule::Y2(Double_t *x, Double_t *par)
135 // For position calulation of second module
137 Double_t theta = x[0];
138 Double_t cos = TMath::Cos(theta);
139 Double_t sin = TMath::Sin(theta);
140 Double_t y1 = fgr*cos/sin + fga/(2.*sin) - fga*sin;
141 Double_t y2 = fga, y = y1-y2;;
142 // printf(" theta %f Y %12.5e \n", theta, y);
146 Double_t AliEMCALShishKebabModule::YALL(Double_t *x, Double_t *par)
148 // For position calulation of 3th, 4th to 30th modules
149 Double_t a=par[0], r=par[1], aa=par[2], bb=par[3];
150 Double_t theta = x[0];
151 Double_t cos = TMath::Cos(theta);
152 Double_t sin = TMath::Sin(theta);
154 Double_t y1 = r + a*cos;
155 Double_t y2 = aa*(r*cos/sin + a/(2.*sin) - a*sin) + bb;
157 // printf(" theta %f Y %12.5e \n", theta, y);
161 void AliEMCALShishKebabModule::DefineName(Double_t theta)
163 // Define name of object
164 SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg()));
167 Bool_t AliEMCALShishKebabModule::GetParameters()
169 // Get needing module parameters from EMCAL geometry
170 fgGeometry = AliEMCALGeometry::GetInstance();
172 Warning("GetParameters()"," No geometry ");
176 fga = (Double_t)fgGeometry->GetPhiModuleSize();
177 fgb = (Double_t)fgGeometry->GetLongModuleSize();
178 fgr = (Double_t)(fgGeometry->GetIPDistance() + fgGeometry->GetSteelFrontThickness());
183 void AliEMCALShishKebabModule::PrintShish(Int_t pri) const
187 Info("PrintShish()", " a %7.2f | b %7.2f | r %7.2f ", fga, fgb, fgr);
188 printf(" fTheta %f : %5.2f : cos(theta) %f\n", fTheta, GetThetaInDegree(),TMath::Cos(fTheta));
190 printf("%i %s | theta %f -> %f\n", GetUniqueID(), GetName(), fTheta, fOK.Phi());
191 printf(" A %f B %f \n", fA, fB);
198 Double_t AliEMCALShishKebabModule::GetThetaInDegree() const
200 return fTheta*TMath::RadToDeg();