19 #include <TClonesArray.h> 20 #include <TGeoManager.h> 48 struct AliEMCALSuperModuleCoords
73 AliError(
"Cannot obtain AliEMCALGeometry instance.");
91 std::ifstream inputFile(txtFileName.Data());
94 AliError((
"Cannot open the survey file " + txtFileName).Data());
108 memset(yReal, 0,
sizeof(Int_t)*fNSuperModule);
109 memset(zReal, 0,
sizeof(Int_t)*fNSuperModule);
110 memset(psiReal, 0,
sizeof(Int_t)*fNSuperModule);
111 memset(thetaReal, 0,
sizeof(Int_t)*fNSuperModule);
112 memset(phiReal, 0,
sizeof(Int_t)*fNSuperModule);
119 AliError(
"Error while reading input file.");
129 inputFile>>dummyInt>>xReal[i]>>yReal[i]>>zReal[i]>>psiReal[i]>>thetaReal[i]>>phiReal[i];
159 AliError(
"Cannot obtain AliEMCALGeometry instance.");
165 AliWarning(
"Cannot create local transformations for supermodules - gGeoManager does not exist.");
166 AliInfo(
"Null shifts and rotations will be created instead.");
170 Int_t arrayInd = array.GetEntries(), iIndex = 0;
198 TString smodName(TString::Format(
"EMCAL/%s%d", SMName.Data(), SMOrder));
212 smodName.Data(), volid,
220 printf(
"==== AliAlignObjParams for SM %d ====\n",smodnum);
231 Int_t arrayInd = array.GetEntries(), iIndex = 0;
258 TString smodName(TString::Format(
"EMCAL/%s%d", SMName.Data(), SMOrder));
260 new(array[arrayInd])
AliAlignObjParams(smodName.Data(), volid, 0., 0., 0., 0., 0., 0.,
true);
332 Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
334 AliEMCALSuperModuleCoords *idealSM =
new AliEMCALSuperModuleCoords[
fNSuperModule];
337 AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
340 phi = phiRad*180./TMath::Pi();
342 xpos = rpos * TMath::Cos(phiRad);
343 ypos = rpos * TMath::Sin(phiRad);
350 xpos += (pars[1]/2. * TMath::Sin(phiRad));
351 ypos -= (pars[1]/2. * TMath::Cos(phiRad));
355 zpos = pars[2] + fInnerEdge/2.;
373 printf(
"<SM %d> IDEAL x,y,z positions: %.2f,%.2f,%.2f, IDEAL phi,theta,psi angles: %.2f,%.2f,%.2f\n",smodnum,smc.fX1,smc.fY1,smc.fZ1,smc.fPhi,smc.fTheta,smc.fPsi);
378 const Int_t buffersize = 255;
379 char substr[buffersize];
380 AliEMCALSuperModuleCoords *realSM =
new AliEMCALSuperModuleCoords[
fNSuperModule];
383 AliEMCALSuperModuleCoords &smc = realSM[smodnum];
384 Double_t zLength = pars[2]*2.;
385 Double_t halfHeight = pars[0];
386 Double_t halfWidth = pars[1];
388 printf(
"AliEMCALGeometry says zlength = %.2f, halfheight = %.2f, halfwidth = %.2f\n",zLength,halfHeight,halfWidth);
390 snprintf(substr,buffersize,
"4096%d",smodnum);
394 std::vector<Double_t> xval;
395 std::vector<Double_t> yval;
396 std::vector<Double_t> zval;
398 for(Int_t i = 0; i < svypts->GetEntries(); i++)
402 if(ptname.Contains(substr))
405 xval.push_back(pt->
GetX()*100.);
406 yval.push_back(pt->
GetY()*100.);
407 zval.push_back(pt->
GetZ()*100.);
412 Double_t activeX = ((xval[0] + (xval[2] - xval[0])/2.)
413 +(xval[1] + (xval[3] - xval[1])/2.) ) /2.;
415 Double_t activeY = ((yval[0] + (yval[2] - yval[0])/2.)
416 +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
418 Double_t activeZ = ((zval[0] + (zval[2] - zval[0])/2.)
419 +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
421 printf(
"Bottom Center of active area of SM %s: %.2f, %.2f, %.2f\n",substr,activeX,activeY,activeZ);
427 Double_t realphi = 0.;
431 realphi = ( TMath::ATan((yval[2] - yval[0])/(xval[2] - xval[0]))
432 +TMath::ATan((yval[3] - yval[1])/(xval[3] - xval[1])) )/2.;
435 realphi = ( TMath::ATan((yval[0] - yval[2])/(xval[0] - xval[2]))
436 +TMath::ATan((yval[1] - yval[3])/(xval[1] - xval[3])) )/2.;
442 Double_t realpsi = ( TMath::ATan((zval[0] - zval[2])/(xval[2] - xval[0]))
443 +TMath::ATan((zval[1] - zval[3])/(xval[3] - xval[1])) )/2.;
446 Double_t realtheta = TMath::Pi()/2.
447 + ( TMath::ATan((zval[2] - zval[3])/(yval[3] - yval[2]))
448 +TMath::ATan((zval[0] - zval[1])/(yval[1] - yval[0])) )/2.;
450 printf(
"Old edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
451 printf(
"Old edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
452 printf(
"Real theta angle (degrees) = %.2f\n",realtheta*TMath::RadToDeg());
456 Double_t activeLength = TMath::Abs(((zval[1] - zval[0]) + (zval[3] - zval[2]))/2.);
457 printf(
"ACTIVE LENGTH = %.2f\n",activeLength);
460 yval[1] += (zLength - activeLength)*sin(realtheta);
461 yval[3] += (zLength - activeLength)*sin(realtheta);
462 zval[1] += (zLength - activeLength)*cos(realtheta);
463 zval[3] += (zLength - activeLength)*cos(realtheta);
465 yval[1] -= (zLength - activeLength)*sin(realtheta);
466 yval[3] -= (zLength - activeLength)*sin(realtheta);
467 zval[1] -= (zLength - activeLength)*cos(realtheta);
468 zval[3] -= (zLength - activeLength)*cos(realtheta);
471 printf(
"New extended edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
472 printf(
"New extended edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
475 Double_t realX = activeX;
476 Double_t realY = ( (yval[0] + (yval[2] - yval[0])/2.)
477 +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
478 Double_t realZ = ( (zval[0] + (zval[2] - zval[0])/2.)
479 +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
482 printf(
"Bottom Center of SM %s Box: %.2f, %.2f, %.2f\n",substr,realX,realY,realZ);
486 realX += halfHeight* TMath::Cos(TMath::Pi()/2+realphi);
487 realY += halfHeight*(TMath::Sin(TMath::Pi()/2+realphi) + TMath::Sin(realtheta));
488 realZ += halfHeight* TMath::Cos(TMath::Pi()/2-realtheta);
490 printf(
"Rotation angles of SM %s (phi,psi,theta) in degrees: %.4f, %.4f, %.4f\n",substr,realphi*TMath::RadToDeg(),realpsi*TMath::RadToDeg(),realtheta*TMath::RadToDeg());
491 printf(
"Middle of SM %s: %.2f, %.2f, %.2f\n\n",substr,realX,realY,realZ);
497 smc.fPhi = 90. + realphi*TMath::RadToDeg();
498 smc.fTheta = 0. + realtheta*TMath::RadToDeg();
499 smc.fPsi = 0. + realpsi*TMath::RadToDeg();
509 AliEMCALSuperModuleCoords &realA = realSM[i];
510 AliEMCALSuperModuleCoords &realC = realSM[i+1];
511 Double_t avgx = (realA.fX1 + realC.fX1)/2.;
512 Double_t avgy = (realA.fY1 + realC.fY1)/2.;
513 Double_t avgphi = (realA.fPhi + realC.fPhi)/2.;
514 Double_t avgtheta = (realA.fTheta + realC.fTheta)/2.;
515 Double_t avgpsi = (realA.fPsi + realC.fPsi)/2.;
516 printf(
"AVERAGE VALUES: %.2f,%.2f,%.2f,%.2f,%.2f\n",avgx,avgy,avgphi,avgtheta,avgpsi);
518 realA.fX1 = avgx; realC.fX1 = avgx;
519 realA.fY1 = avgy; realC.fY1 = avgy;
520 realA.fPhi = avgphi; realC.fPhi = avgphi;
521 realA.fTheta = avgtheta; realC.fTheta = avgtheta;
522 realA.fPsi = avgpsi; realC.fPhi = avgphi;
530 const AliEMCALSuperModuleCoords &real = realSM[i];
531 const AliEMCALSuperModuleCoords &ideal = idealSM[i];
535 t.
fXShift = real.fX1 - ideal.fX1;
536 t.
fYShift = real.fY1 - ideal.fY1;
537 t.
fZShift = real.fZ1 - ideal.fZ1;
538 t.
fPhi = real.fPhi - ideal.fPhi;
539 t.
fTheta = real.fTheta - ideal.fTheta;
540 t.
fPsi = real.fPsi - ideal.fPsi;
542 printf(
"===================== SM %d =======================\n",i);
543 printf(
"real x (%.2f) - ideal x (%.2f) = shift in x (%.2f)\n",real.fX1,ideal.fX1,t.
fXShift);
544 printf(
"real y (%.2f) - ideal y (%.2f) = shift in y (%.2f)\n",real.fY1,ideal.fY1,t.
fYShift);
545 printf(
"real z (%.2f) - ideal z (%.2f) = shift in z (%.2f)\n",real.fZ1,ideal.fZ1,t.
fZShift);
546 printf(
"real theta (%.2f) - ideal theta (%.2f) = shift in theta %.2f\n",real.fTheta,ideal.fTheta,t.
fTheta);
547 printf(
"real psi (%.2f) - ideal psi (%.2f) = shift in psi %.2f\n",real.fPsi,ideal.fPsi,t.
fPsi);
548 printf(
"real phi (%.2f) - ideal phi (%.2f) = shift in phi %.2f\n",real.fPhi,ideal.fPhi,t.
fPhi);
549 printf(
"===================================================\n");
562 const Double_t *zReal,
const Double_t *psiReal,
563 const Double_t *thetaReal,
const Double_t *phiReal)
571 Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
575 AliEMCALSuperModuleCoords *idealSM =
new AliEMCALSuperModuleCoords[
fNSuperModule];
578 AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
580 phi = phiRad*180./TMath::Pi();
581 xpos = rpos * TMath::Cos(phiRad);
582 ypos = rpos * TMath::Sin(phiRad);
588 xpos += (pars[1]/2. * TMath::Sin(phiRad));
589 ypos -= (pars[1]/2. * TMath::Cos(phiRad));
592 zpos = pars[2] + fInnerEdge/2.;
611 AliEMCALSuperModuleCoords *realSM =
new AliEMCALSuperModuleCoords[
fNSuperModule];
614 AliEMCALSuperModuleCoords &smc = realSM[smodnum];
615 smc.fX1 = xReal[smodnum];
616 smc.fY1 = yReal[smodnum];
617 smc.fZ1 = zReal[smodnum];
618 smc.fTheta = thetaReal[smodnum];
619 smc.fPsi = psiReal[smodnum];
620 smc.fPhi = phiReal[smodnum];
627 const AliEMCALSuperModuleCoords &real = realSM[i];
628 const AliEMCALSuperModuleCoords &ideal = idealSM[i];
630 t.
fTheta = real.fTheta - ideal.fTheta;
632 t.
fPhi = real.fPhi - ideal.fPhi;
633 t.
fXShift = real.fX1 - ideal.fX1;
634 t.
fYShift = real.fY1 - ideal.fY1;
635 t.
fZShift = real.fZ1 - ideal.fZ1;
637 printf(
"===================== SM %d =======================\n",i);
638 printf(
"real x (%.2f) - ideal x (%.2f) = shift in x (%.2f)\n",real.fX1,ideal.fX1,t.
fXShift);
639 printf(
"real y (%.2f) - ideal y (%.2f) = shift in y (%.2f)\n",real.fY1,ideal.fY1,t.
fYShift);
640 printf(
"real z (%.2f) - ideal z (%.2f) = shift in z (%.2f)\n",real.fZ1,ideal.fZ1,t.
fZShift);
641 printf(
"real theta (%.2f) - ideal theta (%.2f) = shift in theta %.2f\n",real.fTheta,ideal.fTheta,t.
fTheta);
642 printf(
"real psi (%.2f) - ideal psi (%.2f) = shift in psi %.2f\n",real.fPsi,ideal.fPsi,t.
fPsi);
643 printf(
"real phi (%.2f) - ideal phi (%.2f) = shift in phi %.2f\n",real.fPhi,ideal.fPhi,t.
fPhi);
644 printf(
"===================================================\n");
Float_t GetDCALInnerEdge(void) const
virtual ~AliEMCALSurvey()
Destructor.
use real survey parameters
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void Print(Option_t *) const
void InitSuperModuleData(const Double_t *xReal, const Double_t *yReal, const Double_t *zReal, const Double_t *psiReal, const Double_t *thetaReal, const Double_t *phiReal)
Int_t GetNumberOfSuperModules(void) const
Read survey data and create alignement.
void CreateAliAlignObjParams(TClonesArray &array)
Create AliAlignObjParams.
Float_t GetEnvelop(Int_t index) const
#define AliWarning(message)
Double_t GetPhiCenterOfSMSec(Int_t nsupmod) const
AliEMCALSuperModuleDelta * fSuperModuleData
Supermodule transformation data.
Bool_t FillFromLocalFile(const Char_t *filename)
Int_t fDataType
! which date type (survey or dummy) to use
TObjArray * GetData() const
TGeoManager * gGeoManager
Int_t GetSMType(Int_t nSupMod) const
TString GetPointName() const
AliEMCALSurvey()
Default constructor.
virtual AliEMCALSuperModuleDelta GetSuperModuleTransformation(Int_t smIndex) const
Supermodule transformation.
static UShort_t LayerToVolUID(ELayerID layerId, Int_t modId)
Float_t GetSuperModulesPar(Int_t ipar) const
void CreateNullObjects(TClonesArray &alObj, const AliEMCALGeometry *geom) const
Create null shifts and rotations.
#define AliError(message)
static AliEMCALGeometry * GetInstance()
EMCal geometry, singleton.
Int_t fNSuperModule
Number of supermodules.