]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EMCAL/AliEMCALSurvey.cxx
Updating responsibles for nightly tests (adding Hans Beck).
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALSurvey.cxx
CommitLineData
289cc8a7 1/**************************************************************************
2 * Copyright(c) 1998-1999, 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
18// Objects of this class read txt file with survey data
19// and convert the data into AliAlignObjParams of alignable EMCAL volumes.
20// AliEMCALSurvey inherits TObject only to use AliLog "functions".
21//
68711871 22// Dummy functions originally written before EMCAL installation and
23// survey are kept for backward compatibility, but now they are not
24// used.
54a4c3a6 25//
26// Surveyed points on the EMCAL support rails were used with the CATIA
27// 3D graphics program to determine the positions of the bottom
28// corners of the active area for each supermodule. These numbers are
29// read in from file and converted to position of the center and roll,
30// pitch, yaw angles of each installed SM.
289cc8a7 31//
32// J.L. Klay - Cal Poly
54a4c3a6 33// 21-May-2010
289cc8a7 34//
35
36#include <fstream>
37
38#include <TClonesArray.h>
39#include <TGeoManager.h>
40#include <TString.h>
41#include <TMath.h>
42
43#include "AliSurveyObj.h"
68711871 44#include "AliSurveyPoint.h"
289cc8a7 45
46#include "AliAlignObjParams.h"
47#include "AliEMCALGeometry.h"
48#include "AliEMCALSurvey.h"
49#include "AliLog.h"
50
51ClassImp(AliEMCALSurvey)
52
53//____________________________________________________________________________
54AliEMCALSurvey::AliEMCALSurvey()
54a4c3a6 55 : fNSuperModule(0),
56 fSuperModuleData(0),
57 fDataType(kSurvey)
289cc8a7 58{
59 //Default constructor.
60}
61
62namespace {
63
68711871 64 //Coordinates for each SM described in survey reports
289cc8a7 65
66 struct AliEMCALSuperModuleCoords {
68711871 67 Double_t fX1; //x coordinate of the center of supermodule
68 Double_t fY1; //y coordinate of the center of supermodule
69 Double_t fZ1; //z coordinate of the center of supermodule
68711871 70 Double_t fPsi; //yaw (psi) of supermodule
54a4c3a6 71 Double_t fTheta; //pitch (theta) of supermodule
72 Double_t fPhi; //roll angle (phi) of supermodule
73
289cc8a7 74 };
75
76}
77
78//____________________________________________________________________________
54a4c3a6 79AliEMCALSurvey::AliEMCALSurvey(const TString &txtFileName,const SurveyDataType_t type)
80 : fNSuperModule(0),
81 fSuperModuleData(0),
82 fDataType(type)
289cc8a7 83{
54a4c3a6 84 //Get the geometry object and then attempt to
85 //read survey data from a file, depending on which
86 //method (kSurvey or kDummy) is selected.
7e1d9a9b 87
289cc8a7 88 const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
89 if (!geom) {
90 AliError("Cannot obtain AliEMCALGeometry instance.");
91 return;
92 }
7e1d9a9b 93
54a4c3a6 94 fNSuperModule = geom->GetNumberOfSuperModules();
7e1d9a9b 95
54a4c3a6 96 if(fDataType == kSurvey) {
7e1d9a9b 97
54a4c3a6 98 AliSurveyObj *s1 = new AliSurveyObj();
99 s1->FillFromLocalFile(txtFileName);
100 TObjArray* points = s1->GetData();
101 InitSuperModuleData(points);
7e1d9a9b 102
54a4c3a6 103 } else {
7e1d9a9b 104
54a4c3a6 105 //Use a dummy file that stores x,y,z of the center of each SM
106 //useful for testing...
107 std::ifstream inputFile(txtFileName.Data());
108 if (!inputFile) {
109 AliError(("Cannot open the survey file " + txtFileName).Data());
110 return;
111 }
7e1d9a9b 112
54a4c3a6 113 Int_t dummyInt = 0;
7e1d9a9b 114 Double_t *xReal = new Double_t[fNSuperModule];
115 Double_t *yReal = new Double_t[fNSuperModule];
116 Double_t *zReal = new Double_t[fNSuperModule];
117 Double_t *psiReal = new Double_t[fNSuperModule];
54a4c3a6 118 Double_t *thetaReal = new Double_t[fNSuperModule];
7e1d9a9b 119 Double_t *phiReal = new Double_t[fNSuperModule];
120 //init the arrays
121 memset(xReal, 0,sizeof(Int_t)*fNSuperModule);
122 memset(yReal, 0,sizeof(Int_t)*fNSuperModule);
123 memset(zReal, 0,sizeof(Int_t)*fNSuperModule);
124 memset(psiReal, 0,sizeof(Int_t)*fNSuperModule);
125 memset(thetaReal, 0,sizeof(Int_t)*fNSuperModule);
126 memset(phiReal, 0,sizeof(Int_t)*fNSuperModule);
127
128
54a4c3a6 129 for (Int_t i = 0; i < fNSuperModule; ++i) {
130 if (!inputFile) {
7e1d9a9b 131 AliError("Error while reading input file.");
132 delete [] xReal;
133 delete [] yReal;
134 delete [] zReal;
135 delete [] psiReal;
136 delete [] thetaReal;
137 delete [] phiReal;
138 return;
54a4c3a6 139 }
140 inputFile>>dummyInt>>xReal[i]>>yReal[i]>>zReal[i]>>psiReal[i]>>thetaReal[i]>>phiReal[i];
141 }
7e1d9a9b 142
54a4c3a6 143 InitSuperModuleData(xReal, yReal, zReal, psiReal, thetaReal, phiReal);
7e1d9a9b 144
54a4c3a6 145 delete [] xReal;
146 delete [] yReal;
147 delete [] zReal;
148 delete [] psiReal;
149 delete [] thetaReal;
150 delete [] phiReal;
7e1d9a9b 151
54a4c3a6 152 } //kDummy way of doing it
7e1d9a9b 153
289cc8a7 154}
155
156//____________________________________________________________________________
157AliEMCALSurvey::~AliEMCALSurvey()
158{
68711871 159 //destructor
289cc8a7 160 delete [] fSuperModuleData;
161}
162
163//____________________________________________________________________________
164void AliEMCALSurvey::CreateAliAlignObjParams(TClonesArray &array)
165{
166 //Create AliAlignObjParams.
167 const AliEMCALGeometry * geom = AliEMCALGeometry::GetInstance();
168 if (!geom) {
169 AliError("Cannot obtain AliEMCALGeometry instance.");
170 return;
171 }
172
173 if (!gGeoManager) {
174 AliWarning("Cannot create local transformations for supermodules - gGeoManager does not exist.");
175 AliInfo("Null shifts and rotations will be created instead.");
176 return CreateNullObjects(array, geom);
177 }
178
179 Int_t arrayInd = array.GetEntries(), iIndex = 0;
180 AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
181 UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
4cc00494 182 AliAlignObjParams* myobj = 0x0;
289cc8a7 183
184 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
185 TString smodName(TString::Format("EMCAL/FullSupermodule%d", smodnum+1));
186 if(geom->GetKey110DEG() && smodnum >= 10) {
187 smodName = "EMCAL/HalfSupermodule";
188 smodName += (smodnum-10+1);
189 }
190 AliEMCALSuperModuleDelta t(GetSuperModuleTransformation(smodnum));
1a7ec0fa 191
192 ///////////////////////////////
193 // JLK 13-July-2010
194 //
195 // VERY IMPORTANT!!!!
196 //
197 // All numbers were calculated in ALICE global c.s., which means
198 // that the last argument in the creation of AliAlignObjParams
199 // MUST BE set to true
200 //////////////////////////////
289cc8a7 201 new(array[arrayInd])
202 AliAlignObjParams(
203 smodName.Data(), volid,
204 t.fXShift, t.fYShift, t.fZShift,
205 -t.fPsi, -t.fTheta, -t.fPhi,
1a7ec0fa 206 true
289cc8a7 207 );
208 ++arrayInd;
4cc00494 209 myobj = (AliAlignObjParams*)array.UncheckedAt(smodnum);
210 printf("==== AliAlignObjParams for SM %d ====\n",smodnum);
211 myobj->Print("");
68711871 212
289cc8a7 213 }
214
215}
216
217//____________________________________________________________________________
218void AliEMCALSurvey::CreateNullObjects(TClonesArray &array, const AliEMCALGeometry *geom)const
219{
220 //Create null shifts and rotations.
221 Int_t arrayInd = array.GetEntries(), iIndex = 0;
222 AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
223 UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
224
225 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
226 TString smodName(TString::Format("EMCAL/FullSupermodule%d", smodnum+1));
227 if(geom->GetKey110DEG() && smodnum >= 10) {
228 smodName = "EMCAL/HalfSupermodule";
229 smodName += (smodnum-10+1);
230 }
231 new(array[arrayInd]) AliAlignObjParams(smodName.Data(), volid, 0., 0., 0., 0., 0., 0., true);
232 ++arrayInd;
233 }
234}
235
236//____________________________________________________________________________
237AliEMCALSurvey::AliEMCALSuperModuleDelta AliEMCALSurvey::GetSuperModuleTransformation(Int_t supModIndex)const
238{
239 //Supermodule transformation.
240 AliEMCALSuperModuleDelta t = {0., 0., 0., 0., 0., 0.};
241 if (!fSuperModuleData)
242 return t;
243
244 return fSuperModuleData[supModIndex];
245}
246
247//____________________________________________________________________________
68711871 248void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
289cc8a7 249{
54a4c3a6 250 //This method uses the data points from the EMCAL survey and CATIA program to
251 //create the alignment matrices. Only valid for (installed)
68711871 252 //SM, others will have null objects
7e1d9a9b 253
54a4c3a6 254 /*--------------------------------------
7e1d9a9b 255 The bottom edges of the strip modules
256 define the active area of the EMCAL, but
257 in software we have a box to hold them which
258 is longer than that. We need to convert
259 info about the position of the corners of the
260 bottom of the active area to the center of
261 the software box that contains the strip
262 modules.
263
264 View from beam axis up to EMCAL
265 Ai Ci
266
267 0,1 0,0 1,0 1,1
268 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
269 x x x x x x
270 x x % * x x * % x x
271 x x x x x x
272 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
273 1,1 1,0 0,0 0,1
274 <--> = added length <--> = added length
275
276 * represents the center of the active area
277 % represents the center of the full box (with added length)
278
279 View from side of topmost SM
280
281 Ai Ci
282
283 0,1 0,0 1,0 1,1
284 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
285 x x % * x x % * x x
286 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
287 1,1 1,0 0,0 0,1
288 <--> = added length <--> = added length
289
290 * represents the center of the active area
291 % represents the center of the full box (with added length)
292
293 -------------------------------------*/
294
68711871 295 AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
296 //Center of supermodules
297 Float_t *pars = geom->GetSuperModulesPars();
298 Double_t rpos = (geom->GetEnvelop(0) + geom->GetEnvelop(1))/2.;
53e430a3 299 Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
7e1d9a9b 300
68711871 301 AliEMCALSuperModuleCoords *idealSM = new AliEMCALSuperModuleCoords[fNSuperModule];
302 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
303 AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
304 phiRad = geom->GetPhiCenterOfSM(smodnum); //comes in radians
305 phi = phiRad*180./TMath::Pi(); //need degrees for AliAlignObjParams
306 xpos = rpos * TMath::Cos(phiRad);
307 ypos = rpos * TMath::Sin(phiRad);
308 zpos = pars[2];
309 if(geom->GetKey110DEG() && smodnum >= 10) {
310 xpos += (pars[1]/2. * TMath::Sin(phiRad));
311 ypos -= (pars[1]/2. * TMath::Cos(phiRad));
312 }
313 smc.fX1 = xpos;
314 smc.fY1 = ypos;
315 smc.fPhi = phi; //degrees
316 smc.fTheta = 0.; //degrees
317 smc.fPsi = 0.; //degrees
318 if(smodnum%2==0) {
319 smc.fZ1 = zpos;
320 } else {
321 smc.fZ1 = -zpos;
322 }
7e1d9a9b 323
54a4c3a6 324 //printf("PHI OF IDEAL SM = %.2f\n",smc.fPhi);
7e1d9a9b 325
68711871 326 }
7e1d9a9b 327
68711871 328 //Real coordinates of center and rotation angles need to be computed
54a4c3a6 329 //from the survey/CATIA points
7e1d9a9b 330 const Int_t buffersize = 255;
331 char substr[buffersize];
68711871 332 AliEMCALSuperModuleCoords *realSM = new AliEMCALSuperModuleCoords[fNSuperModule];
333 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
334 AliEMCALSuperModuleCoords &smc = realSM[smodnum];
54a4c3a6 335 Double_t zLength = pars[2]*2.; //length of SM in z from software
336 Double_t halfHeight = pars[0]; //half the height of the SM in y direction
7e1d9a9b 337
338 snprintf(substr,buffersize,"4096%d",smodnum);
68711871 339 //retrieve components of four face points and determine average position of center
340 //in x,y,z
7e1d9a9b 341
68711871 342 std::vector<Double_t> xval;
343 std::vector<Double_t> yval;
344 std::vector<Double_t> zval;
345
346 for(Int_t i = 0; i < svypts->GetEntries(); i++) {
347 AliSurveyPoint* pt = (AliSurveyPoint*)svypts->At(i);
348 TString ptname = pt->GetPointName();
349 if(ptname.Contains(substr)) {
7e1d9a9b 350 //Note: order of values is 00, 01, 10, 11
351 xval.push_back(pt->GetX()*100.); //convert m to cm
352 yval.push_back(pt->GetY()*100.);
353 zval.push_back(pt->GetZ()*100.);
68711871 354 }
355 }
7e1d9a9b 356
54a4c3a6 357 //compute center of active area of each SM on bottome face from survey points
358 Double_t activeX = ((xval[0] + (xval[2] - xval[0])/2.) //x00 and x10
7e1d9a9b 359 +(xval[1] + (xval[3] - xval[1])/2.) ) /2.; //x01 and x11
54a4c3a6 360
7e1d9a9b 361 // Double_t activeY = ((yval[0] + (yval[2] - yval[0])/2.)
362 // +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
363 //
364 // Double_t activeZ = ((zval[0] + (zval[2] - zval[0])/2.)
365 // +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
54a4c3a6 366
367 //printf("Bottom Center of active area of SM %s: %.2f, %.2f, %.2f\n",substr,activeX,activeY,activeZ);
368
369 //compute angles for each SM
370 //rotation about each axis
371 //phi = angle in x-y plane
372
373 Double_t realphi = 0.;
374 //Note: this is phi wrt y axis. To get phi wrt to x, add pi/2
375 if(smodnum%2 == 0) {
376 realphi = (TMath::ATan((yval[2] - yval[0])/(xval[2] - xval[0]))
7e1d9a9b 377 +TMath::ATan((yval[3] - yval[1])/(xval[3] - xval[1])) )/2.;
54a4c3a6 378 } else {
379 realphi = (TMath::ATan((yval[0] - yval[2])/(xval[0] - xval[2]))
7e1d9a9b 380 +TMath::ATan((yval[1] - yval[3])/(xval[1] - xval[3])) )/2.;
68711871 381 }
7e1d9a9b 382
54a4c3a6 383 //NOTE: Psi angle is always zero because the two z values being
384 //subtracted are exactly the same, but just in case that could change...
385 //psi = angle in x-z plane
386 Double_t realpsi = (TMath::ATan((zval[0] - zval[2])/(xval[2] - xval[0]))
7e1d9a9b 387 +TMath::ATan((zval[1] - zval[3])/(xval[3] - xval[1])) )/2.;
54a4c3a6 388
389 //theta = angle in y-z plane
390 Double_t realtheta = TMath::Pi()/2.
7e1d9a9b 391 - (TMath::ATan((zval[2] - zval[3])/(yval[3] - yval[2]))
392 +TMath::ATan((zval[0] - zval[1])/(yval[1] - yval[0])) )/2.;
393
54a4c3a6 394 //printf("Old edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
395 //printf("Old edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
7e1d9a9b 396
54a4c3a6 397 //Now calculate the center of the box in z with length added to the 01
398 //and 11 corners, corrected by the theta angle
399 Double_t activeLength = TMath::Abs(((zval[1] - zval[0]) + (zval[3] - zval[2]))/2.);
400 //printf("ACTIVE LENGTH = %.2f\n",activeLength);
401 if(smodnum%2 == 0) {
402 yval[1] += (zLength - activeLength)*sin(realtheta);
403 yval[3] += (zLength - activeLength)*sin(realtheta);
404 zval[1] += (zLength - activeLength)*cos(realtheta);
405 zval[3] += (zLength - activeLength)*cos(realtheta);
406 } else {
407 yval[1] -= (zLength - activeLength)*sin(realtheta);
408 yval[3] -= (zLength - activeLength)*sin(realtheta);
409 zval[1] -= (zLength - activeLength)*cos(realtheta);
410 zval[3] -= (zLength - activeLength)*cos(realtheta);
68711871 411 }
7e1d9a9b 412
54a4c3a6 413 //printf("New extended edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
414 //printf("New extended edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
7e1d9a9b 415
54a4c3a6 416 //Compute the center of the bottom of the box in x,y,z
417 Double_t realX = activeX;
418 Double_t realY = ((yval[0] + (yval[2] - yval[0])/2.)
7e1d9a9b 419 +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
54a4c3a6 420 Double_t realZ = ((zval[0] + (zval[2] - zval[0])/2.)
7e1d9a9b 421 +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
422
423
54a4c3a6 424 //printf("Bottom Center of SM %s Box: %.2f, %.2f, %.2f\n",substr,realX,realY,realZ);
7e1d9a9b 425
54a4c3a6 426 //correct the SM centers so that we have the center of the box in
427 //x,y using the phi,theta angles
428 realX += halfHeight*TMath::Cos(TMath::Pi()/2+realphi);
429 realY += halfHeight*(TMath::Sin(TMath::Pi()/2+realphi) + TMath::Sin(realtheta));
430 realZ += halfHeight*TMath::Cos(TMath::Pi()/2-realtheta);
7e1d9a9b 431
54a4c3a6 432 //printf("Rotation angles of SM %s: %.4f, %.4f, %.4f\n",substr,realphi*TMath::RadToDeg(),realpsi*TMath::RadToDeg(),realtheta*TMath::RadToDeg());
433 //printf("Middle of SM %s: %.2f, %.2f, %.2f\n\n",substr,realX,realY,realZ);
7e1d9a9b 434
54a4c3a6 435 smc.fX1 = realX;
436 smc.fY1 = realY;
437 smc.fZ1 = realZ;
7e1d9a9b 438
54a4c3a6 439 smc.fPhi = 90. + realphi*TMath::RadToDeg();
440 smc.fTheta = 0. + realtheta*TMath::RadToDeg();
441 smc.fPsi = 0. + realpsi*TMath::RadToDeg();
7e1d9a9b 442
68711871 443 }//loop over supermodules
444
445 fSuperModuleData = new AliEMCALSuperModuleDelta[fNSuperModule];
446
447 for (Int_t i = 0; i < fNSuperModule; ++i) {
448 const AliEMCALSuperModuleCoords &real = realSM[i];
449 const AliEMCALSuperModuleCoords &ideal = idealSM[i];
450 AliEMCALSuperModuleDelta &t = fSuperModuleData[i];
451 t.fXShift = real.fX1 - ideal.fX1;
452 t.fYShift = real.fY1 - ideal.fY1;
4cc00494 453 t.fZShift = real.fZ1 - ideal.fZ1;
68711871 454 t.fPhi = real.fPhi - ideal.fPhi;
455 t.fTheta = real.fTheta - ideal.fTheta;
456 t.fPsi = real.fPsi - ideal.fPsi;
7e1d9a9b 457
68711871 458 printf("===================== SM %d =======================\n",i);
459 printf("real x (%.2f) - ideal x (%.2f) = shift in x (%.2f)\n",real.fX1,ideal.fX1,t.fXShift);
460 printf("real y (%.2f) - ideal y (%.2f) = shift in y (%.2f)\n",real.fY1,ideal.fY1,t.fYShift);
461 printf("real z (%.2f) - ideal z (%.2f) = shift in z (%.2f)\n",real.fZ1,ideal.fZ1,t.fZShift);
462 printf("real theta (%.2f) - ideal theta (%.2f) = shift in theta %.2f\n",real.fTheta,ideal.fTheta,t.fTheta);
463 printf("real psi (%.2f) - ideal psi (%.2f) = shift in psi %.2f\n",real.fPsi,ideal.fPsi,t.fPsi);
464 printf("real phi (%.2f) - ideal phi (%.2f) = shift in phi %.2f\n",real.fPhi,ideal.fPhi,t.fPhi);
465 printf("===================================================\n");
466 }
7e1d9a9b 467
68711871 468 delete [] realSM;
469 delete [] idealSM;
470}
471
472
473//____________________________________________________________________________
54a4c3a6 474void AliEMCALSurvey::InitSuperModuleData(const Double_t *xReal, const Double_t *yReal,
475 const Double_t *zReal, const Double_t *psiReal,
476 const Double_t *thetaReal, const Double_t *phiReal)
68711871 477{
478 ///////////////////////////////////////
54a4c3a6 479 //Dummy method just takes the inputted values and applies them
480 //
481 //Useful for testing small changes
68711871 482 //////////////////////////////////////
289cc8a7 483 AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
484 //Center of supermodules
485 Float_t *pars = geom->GetSuperModulesPars();
486 Double_t rpos = (geom->GetEnvelop(0) + geom->GetEnvelop(1))/2.;
53e430a3 487 Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
289cc8a7 488
54a4c3a6 489 zpos = pars[2];
490
289cc8a7 491 AliEMCALSuperModuleCoords *idealSM = new AliEMCALSuperModuleCoords[fNSuperModule];
492 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
493 AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
494 phiRad = geom->GetPhiCenterOfSM(smodnum); //comes in radians
495 phi = phiRad*180./TMath::Pi(); //need degrees for AliAlignObjParams
496 xpos = rpos * TMath::Cos(phiRad);
497 ypos = rpos * TMath::Sin(phiRad);
289cc8a7 498 if(geom->GetKey110DEG() && smodnum >= 10) {
499 xpos += (pars[1]/2. * TMath::Sin(phiRad));
500 ypos -= (pars[1]/2. * TMath::Cos(phiRad));
501 }
502 smc.fX1 = xpos;
503 smc.fY1 = ypos;
54a4c3a6 504
505 smc.fPhi = phi; //degrees
506 smc.fTheta = 0.; //degrees
507 smc.fPsi = 0.; //degrees
508
289cc8a7 509 if(smodnum%2==0) {
510 smc.fZ1 = zpos;
511 } else {
512 smc.fZ1 = -zpos;
513 }
514
515 }
3ddecb84 516
289cc8a7 517 AliEMCALSuperModuleCoords *realSM = new AliEMCALSuperModuleCoords[fNSuperModule];
518 for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
519 AliEMCALSuperModuleCoords &smc = realSM[smodnum];
54a4c3a6 520 smc.fX1 = xReal[smodnum];
521 smc.fY1 = yReal[smodnum];
522 smc.fZ1 = zReal[smodnum];
523 smc.fTheta = thetaReal[smodnum];
524 smc.fPsi = psiReal[smodnum];
525 smc.fPhi = phiReal[smodnum];
289cc8a7 526 }
527
528 fSuperModuleData = new AliEMCALSuperModuleDelta[fNSuperModule];
529
530 for (Int_t i = 0; i < fNSuperModule; ++i) {
531 const AliEMCALSuperModuleCoords &real = realSM[i];
532 const AliEMCALSuperModuleCoords &ideal = idealSM[i];
533 AliEMCALSuperModuleDelta &t = fSuperModuleData[i];
54a4c3a6 534 t.fTheta = real.fTheta - ideal.fTheta;
289cc8a7 535 t.fPsi = 0.;
54a4c3a6 536 t.fPhi = real.fPhi - ideal.fPhi;
289cc8a7 537 t.fXShift = real.fX1 - ideal.fX1;
538 t.fYShift = real.fY1 - ideal.fY1;
539 t.fZShift = real.fZ1 - ideal.fZ1;
540
68711871 541 printf("===================== SM %d =======================\n",i);
542 printf("real x (%.2f) - ideal x (%.2f) = shift in x (%.2f)\n",real.fX1,ideal.fX1,t.fXShift);
543 printf("real y (%.2f) - ideal y (%.2f) = shift in y (%.2f)\n",real.fY1,ideal.fY1,t.fYShift);
544 printf("real z (%.2f) - ideal z (%.2f) = shift in z (%.2f)\n",real.fZ1,ideal.fZ1,t.fZShift);
54a4c3a6 545 printf("real theta (%.2f) - ideal theta (%.2f) = shift in theta %.2f\n",real.fTheta,ideal.fTheta,t.fTheta);
546 printf("real psi (%.2f) - ideal psi (%.2f) = shift in psi %.2f\n",real.fPsi,ideal.fPsi,t.fPsi);
547 printf("real phi (%.2f) - ideal phi (%.2f) = shift in phi %.2f\n",real.fPhi,ideal.fPhi,t.fPhi);
68711871 548 printf("===================================================\n");
289cc8a7 549 }
550
551 delete [] realSM;
552 delete [] idealSM;
553}
68711871 554