//Get the geometry object and then attempt to
//read survey data from a file, depending on which
//method (kSurvey or kDummy) is selected.
-
+
const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
if (!geom) {
AliError("Cannot obtain AliEMCALGeometry instance.");
return;
}
-
+
fNSuperModule = geom->GetNumberOfSuperModules();
-
+
if(fDataType == kSurvey) {
-
+
AliSurveyObj *s1 = new AliSurveyObj();
s1->FillFromLocalFile(txtFileName);
TObjArray* points = s1->GetData();
InitSuperModuleData(points);
-
+
} else {
-
+
//Use a dummy file that stores x,y,z of the center of each SM
//useful for testing...
std::ifstream inputFile(txtFileName.Data());
AliError(("Cannot open the survey file " + txtFileName).Data());
return;
}
+
Int_t dummyInt = 0;
- Double_t *xReal = new Double_t[fNSuperModule];
- Double_t *yReal = new Double_t[fNSuperModule];
- Double_t *zReal = new Double_t[fNSuperModule];
- Double_t *psiReal = new Double_t[fNSuperModule];
+ Double_t *xReal = new Double_t[fNSuperModule];
+ Double_t *yReal = new Double_t[fNSuperModule];
+ Double_t *zReal = new Double_t[fNSuperModule];
+ Double_t *psiReal = new Double_t[fNSuperModule];
Double_t *thetaReal = new Double_t[fNSuperModule];
- Double_t *phiReal = new Double_t[fNSuperModule];
-
+ Double_t *phiReal = new Double_t[fNSuperModule];
+ //init the arrays
+ memset(xReal, 0,sizeof(Int_t)*fNSuperModule);
+ memset(yReal, 0,sizeof(Int_t)*fNSuperModule);
+ memset(zReal, 0,sizeof(Int_t)*fNSuperModule);
+ memset(psiReal, 0,sizeof(Int_t)*fNSuperModule);
+ memset(thetaReal, 0,sizeof(Int_t)*fNSuperModule);
+ memset(phiReal, 0,sizeof(Int_t)*fNSuperModule);
+
+
for (Int_t i = 0; i < fNSuperModule; ++i) {
if (!inputFile) {
- AliError("Error while reading input file.");
- delete [] xReal;
- delete [] yReal;
- delete [] zReal;
- delete [] psiReal;
- delete [] thetaReal;
- delete [] phiReal;
- return;
+ AliError("Error while reading input file.");
+ delete [] xReal;
+ delete [] yReal;
+ delete [] zReal;
+ delete [] psiReal;
+ delete [] thetaReal;
+ delete [] phiReal;
+ return;
}
inputFile>>dummyInt>>xReal[i]>>yReal[i]>>zReal[i]>>psiReal[i]>>thetaReal[i]>>phiReal[i];
}
-
+
InitSuperModuleData(xReal, yReal, zReal, psiReal, thetaReal, phiReal);
-
+
delete [] xReal;
delete [] yReal;
delete [] zReal;
delete [] psiReal;
delete [] thetaReal;
delete [] phiReal;
-
+
} //kDummy way of doing it
-
+
}
//____________________________________________________________________________
Int_t arrayInd = array.GetEntries(), iIndex = 0;
AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
+ AliAlignObjParams* myobj = 0x0;
for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
TString smodName(TString::Format("EMCAL/FullSupermodule%d", smodnum+1));
smodName += (smodnum-10+1);
}
AliEMCALSuperModuleDelta t(GetSuperModuleTransformation(smodnum));
+
+ ///////////////////////////////
+ // JLK 13-July-2010
+ //
+ // VERY IMPORTANT!!!!
+ //
+ // All numbers were calculated in ALICE global c.s., which means
+ // that the last argument in the creation of AliAlignObjParams
+ // MUST BE set to true
+ //////////////////////////////
new(array[arrayInd])
AliAlignObjParams(
smodName.Data(), volid,
t.fXShift, t.fYShift, t.fZShift,
-t.fPsi, -t.fTheta, -t.fPhi,
- false
+ true
);
++arrayInd;
+ myobj = (AliAlignObjParams*)array.UncheckedAt(smodnum);
+ printf("==== AliAlignObjParams for SM %d ====\n",smodnum);
+ myobj->Print("");
}
//This method uses the data points from the EMCAL survey and CATIA program to
//create the alignment matrices. Only valid for (installed)
//SM, others will have null objects
-
+
/*--------------------------------------
- The bottom edges of the strip modules
- define the active area of the EMCAL, but
- in software we have a box to hold them which
- is longer than that. We need to convert
- info about the position of the corners of the
- bottom of the active area to the center of
- the software box that contains the strip
- modules.
-
- View from beam axis up to EMCAL
- Ai Ci
-
- 0,1 0,0 1,0 1,1
- xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
- x x x x x x
- x x % * x x * % x x
- x x x x x x
- xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
- 1,1 1,0 0,0 0,1
- <--> = added length <--> = added length
-
- * represents the center of the active area
- % represents the center of the full box (with added length)
-
- View from side of topmost SM
-
- Ai Ci
-
- 0,1 0,0 1,0 1,1
- xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
- x x % * x x % * x x
- xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
- 1,1 1,0 0,0 0,1
- <--> = added length <--> = added length
-
- * represents the center of the active area
- % represents the center of the full box (with added length)
-
- -------------------------------------*/
-
+ The bottom edges of the strip modules
+ define the active area of the EMCAL, but
+ in software we have a box to hold them which
+ is longer than that. We need to convert
+ info about the position of the corners of the
+ bottom of the active area to the center of
+ the software box that contains the strip
+ modules.
+
+ View from beam axis up to EMCAL
+ Ai Ci
+
+ 0,1 0,0 1,0 1,1
+ xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
+ x x x x x x
+ x x % * x x * % x x
+ x x x x x x
+ xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
+ 1,1 1,0 0,0 0,1
+ <--> = added length <--> = added length
+
+ * represents the center of the active area
+ % represents the center of the full box (with added length)
+
+ View from side of topmost SM
+
+ Ai Ci
+
+ 0,1 0,0 1,0 1,1
+ xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
+ x x % * x x % * x x
+ xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx
+ 1,1 1,0 0,0 0,1
+ <--> = added length <--> = added length
+
+ * represents the center of the active area
+ % represents the center of the full box (with added length)
+
+ -------------------------------------*/
+
AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
//Center of supermodules
- Float_t *pars = geom->GetSuperModulesPars();
+ Float_t pars[] = {geom->GetSuperModulesPar(0),geom->GetSuperModulesPar(1),geom->GetSuperModulesPar(2)};
Double_t rpos = (geom->GetEnvelop(0) + geom->GetEnvelop(1))/2.;
- Double_t phi, phiRad, xpos, ypos, zpos;
-
+ Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
+
AliEMCALSuperModuleCoords *idealSM = new AliEMCALSuperModuleCoords[fNSuperModule];
for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
} else {
smc.fZ1 = -zpos;
}
-
- //printf("PHI OF IDEAL SM = %.2f\n",smc.fPhi);
-
+ 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);
+
}
-
+
//Real coordinates of center and rotation angles need to be computed
//from the survey/CATIA points
-
- char substr[100];
+ const Int_t buffersize = 255;
+ char substr[buffersize];
AliEMCALSuperModuleCoords *realSM = new AliEMCALSuperModuleCoords[fNSuperModule];
for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
AliEMCALSuperModuleCoords &smc = realSM[smodnum];
Double_t zLength = pars[2]*2.; //length of SM in z from software
Double_t halfHeight = pars[0]; //half the height of the SM in y direction
+ Double_t halfWidth = pars[1];
- sprintf(substr,"4096%d",smodnum);
+ printf("AliEMCALGeometry says zlength = %.2f, halfheight = %.2f, halfwidth = %.2f\n",zLength,halfHeight,halfWidth);
+
+ snprintf(substr,buffersize,"4096%d",smodnum);
//retrieve components of four face points and determine average position of center
//in x,y,z
-
+
std::vector<Double_t> xval;
std::vector<Double_t> yval;
std::vector<Double_t> zval;
AliSurveyPoint* pt = (AliSurveyPoint*)svypts->At(i);
TString ptname = pt->GetPointName();
if(ptname.Contains(substr)) {
- //Note: order of values is 00, 01, 10, 11
- xval.push_back(pt->GetX()*100.); //convert m to cm
- yval.push_back(pt->GetY()*100.);
- zval.push_back(pt->GetZ()*100.);
+ //Note: order of values is 00, 01, 10, 11
+ xval.push_back(pt->GetX()*100.); //convert m to cm
+ yval.push_back(pt->GetY()*100.);
+ zval.push_back(pt->GetZ()*100.);
}
}
-
+
//compute center of active area of each SM on bottome face from survey points
Double_t activeX = ((xval[0] + (xval[2] - xval[0])/2.) //x00 and x10
- +(xval[1] + (xval[3] - xval[1])/2.) ) /2.; //x01 and x11
+ +(xval[1] + (xval[3] - xval[1])/2.) ) /2.; //x01 and x11
-// Double_t activeY = ((yval[0] + (yval[2] - yval[0])/2.)
-// +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
-//
-// Double_t activeZ = ((zval[0] + (zval[2] - zval[0])/2.)
-// +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
+ Double_t activeY = ((yval[0] + (yval[2] - yval[0])/2.)
+ +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
+
+ Double_t activeZ = ((zval[0] + (zval[2] - zval[0])/2.)
+ +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
- //printf("Bottom Center of active area of SM %s: %.2f, %.2f, %.2f\n",substr,activeX,activeY,activeZ);
+ printf("Bottom Center of active area of SM %s: %.2f, %.2f, %.2f\n",substr,activeX,activeY,activeZ);
//compute angles for each SM
//rotation about each axis
//Note: this is phi wrt y axis. To get phi wrt to x, add pi/2
if(smodnum%2 == 0) {
realphi = (TMath::ATan((yval[2] - yval[0])/(xval[2] - xval[0]))
- +TMath::ATan((yval[3] - yval[1])/(xval[3] - xval[1])) )/2.;
+ +TMath::ATan((yval[3] - yval[1])/(xval[3] - xval[1])) )/2.;
} else {
realphi = (TMath::ATan((yval[0] - yval[2])/(xval[0] - xval[2]))
- +TMath::ATan((yval[1] - yval[3])/(xval[1] - xval[3])) )/2.;
+ +TMath::ATan((yval[1] - yval[3])/(xval[1] - xval[3])) )/2.;
}
-
+
//NOTE: Psi angle is always zero because the two z values being
//subtracted are exactly the same, but just in case that could change...
//psi = angle in x-z plane
Double_t realpsi = (TMath::ATan((zval[0] - zval[2])/(xval[2] - xval[0]))
- +TMath::ATan((zval[1] - zval[3])/(xval[3] - xval[1])) )/2.;
+ +TMath::ATan((zval[1] - zval[3])/(xval[3] - xval[1])) )/2.;
//theta = angle in y-z plane
Double_t realtheta = TMath::Pi()/2.
- - (TMath::ATan((zval[2] - zval[3])/(yval[3] - yval[2]))
- +TMath::ATan((zval[0] - zval[1])/(yval[1] - yval[0])) )/2.;
-
- //printf("Old edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
- //printf("Old edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
+ + (TMath::ATan((zval[2] - zval[3])/(yval[3] - yval[2]))
+ +TMath::ATan((zval[0] - zval[1])/(yval[1] - yval[0])) )/2.;
+
+ printf("Old edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
+ printf("Old edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
+ printf("Real theta angle (degrees) = %.2f\n",realtheta*TMath::RadToDeg());
//Now calculate the center of the box in z with length added to the 01
//and 11 corners, corrected by the theta angle
Double_t activeLength = TMath::Abs(((zval[1] - zval[0]) + (zval[3] - zval[2]))/2.);
- //printf("ACTIVE LENGTH = %.2f\n",activeLength);
+ printf("ACTIVE LENGTH = %.2f\n",activeLength);
if(smodnum%2 == 0) {
yval[1] += (zLength - activeLength)*sin(realtheta);
yval[3] += (zLength - activeLength)*sin(realtheta);
zval[1] -= (zLength - activeLength)*cos(realtheta);
zval[3] -= (zLength - activeLength)*cos(realtheta);
}
-
- //printf("New extended edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
- //printf("New extended edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
-
+
+ printf("New extended edge of %s 01: %.2f, %.2f, %.2f\n",substr,xval[1],yval[1],zval[1]);
+ printf("New extended edge of %s 11: %.2f, %.2f, %.2f\n",substr,xval[3],yval[3],zval[3]);
+
//Compute the center of the bottom of the box in x,y,z
Double_t realX = activeX;
Double_t realY = ((yval[0] + (yval[2] - yval[0])/2.)
- +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
+ +(yval[1] + (yval[3] - yval[1])/2.) ) /2.;
Double_t realZ = ((zval[0] + (zval[2] - zval[0])/2.)
- +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
-
-
- //printf("Bottom Center of SM %s Box: %.2f, %.2f, %.2f\n",substr,realX,realY,realZ);
-
+ +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
+
+
+ printf("Bottom Center of SM %s Box: %.2f, %.2f, %.2f\n",substr,realX,realY,realZ);
+
//correct the SM centers so that we have the center of the box in
//x,y using the phi,theta angles
realX += halfHeight*TMath::Cos(TMath::Pi()/2+realphi);
realY += halfHeight*(TMath::Sin(TMath::Pi()/2+realphi) + TMath::Sin(realtheta));
realZ += halfHeight*TMath::Cos(TMath::Pi()/2-realtheta);
-
- //printf("Rotation angles of SM %s: %.4f, %.4f, %.4f\n",substr,realphi*TMath::RadToDeg(),realpsi*TMath::RadToDeg(),realtheta*TMath::RadToDeg());
- //printf("Middle of SM %s: %.2f, %.2f, %.2f\n\n",substr,realX,realY,realZ);
-
+
+ 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());
+ printf("Middle of SM %s: %.2f, %.2f, %.2f\n\n",substr,realX,realY,realZ);
+
smc.fX1 = realX;
smc.fY1 = realY;
smc.fZ1 = realZ;
-
+
smc.fPhi = 90. + realphi*TMath::RadToDeg();
smc.fTheta = 0. + realtheta*TMath::RadToDeg();
smc.fPsi = 0. + realpsi*TMath::RadToDeg();
-
+
}//loop over supermodules
-
+
+ //Now take average values for A and C side SMs (0&1,2&3) and set
+ //their values to be equal to that average
+ for (Int_t i = 0; i < fNSuperModule; i++) {
+ if(i%2==0) {
+ AliEMCALSuperModuleCoords &realA = realSM[i];
+ AliEMCALSuperModuleCoords &realC = realSM[i+1];
+ Double_t avgx = (realA.fX1 + realC.fX1)/2.;
+ Double_t avgy = (realA.fY1 + realC.fY1)/2.;
+ Double_t avgphi = (realA.fPhi + realC.fPhi)/2.;
+ Double_t avgtheta = (realA.fTheta + realC.fTheta)/2.;
+ Double_t avgpsi = (realA.fPsi + realC.fPsi)/2.;
+ printf("AVERAGE VALUES: %.2f,%.2f,%.2f,%.2f,%.2f\n",avgx,avgy,avgphi,avgtheta,avgpsi);
+
+ realA.fX1 = avgx; realC.fX1 = avgx;
+ realA.fY1 = avgy; realC.fY1 = avgy;
+ realA.fPhi = avgphi; realC.fPhi = avgphi;
+ realA.fTheta = avgtheta; realC.fTheta = avgtheta;
+ realA.fPsi = avgpsi; realC.fPhi = avgphi;
+ }
+ }
+
fSuperModuleData = new AliEMCALSuperModuleDelta[fNSuperModule];
for (Int_t i = 0; i < fNSuperModule; ++i) {
AliEMCALSuperModuleDelta &t = fSuperModuleData[i];
t.fXShift = real.fX1 - ideal.fX1;
t.fYShift = real.fY1 - ideal.fY1;
- t.fZShift = ideal.fZ1 - real.fZ1; //due to z flip for C side
- if(i%2==0) {
- t.fZShift *= -1.0; //correct shift for C side
- }
+ t.fZShift = real.fZ1 - ideal.fZ1;
t.fPhi = real.fPhi - ideal.fPhi;
t.fTheta = real.fTheta - ideal.fTheta;
t.fPsi = real.fPsi - ideal.fPsi;
printf("real phi (%.2f) - ideal phi (%.2f) = shift in phi %.2f\n",real.fPhi,ideal.fPhi,t.fPhi);
printf("===================================================\n");
}
-
+
delete [] realSM;
delete [] idealSM;
}
//////////////////////////////////////
AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
//Center of supermodules
- Float_t *pars = geom->GetSuperModulesPars();
+ Float_t pars[] = {geom->GetSuperModulesPar(0),geom->GetSuperModulesPar(1),geom->GetSuperModulesPar(2)};
Double_t rpos = (geom->GetEnvelop(0) + geom->GetEnvelop(1))/2.;
- Double_t phi, phiRad, xpos, ypos, zpos;
+ Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
zpos = pars[2];