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