change order of bookkeeping events
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALSurvey.cxx
index d27f890..086e5b3 100644 (file)
@@ -30,6 +30,7 @@
 // pitch, yaw angles of each installed SM.
 //
 // J.L. Klay - Cal Poly
+// Adapted for DCAL by M.L. Wang CCNU & Subatech Oct-19-2012
 // 21-May-2010
 //
 
@@ -181,12 +182,26 @@ void AliEMCALSurvey::CreateAliAlignObjParams(TClonesArray &array)
   UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
   AliAlignObjParams* myobj = 0x0;
 
+  TString SMName;
+  Int_t tmpType = -1;
+  Int_t SMOrder = 0;
+
   for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
-    TString smodName(TString::Format("EMCAL/FullSupermodule%d", smodnum+1));
-    if(geom->GetKey110DEG() && smodnum >= 10) {
-      smodName = "EMCAL/HalfSupermodule";
-      smodName += (smodnum-10+1);
-    }    
+    if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Standard )      SMName = "FullSupermodule";
+    else if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Half )     SMName = "HalfSupermodule";
+    else if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_3rd )      SMName = "OneThrdSupermodule";
+    else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Standard ) SMName = "DCALSupermodule";
+    else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Ext )      SMName = "DCALExtensionSM";
+    else AliError("Unkown SM Type!!");
+
+    if(geom->GetSMType(smodnum) == tmpType) {
+      SMOrder++;
+    } else {
+      tmpType = geom->GetSMType(smodnum);
+      SMOrder = 1;
+    }
+
+    TString smodName(TString::Format("EMCAL/%s%d", SMName.Data(), SMOrder));
     AliEMCALSuperModuleDelta t(GetSuperModuleTransformation(smodnum));
 
     ///////////////////////////////
@@ -222,12 +237,26 @@ void AliEMCALSurvey::CreateNullObjects(TClonesArray &array, const AliEMCALGeomet
   AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
   UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
 
+  TString SMName;
+  Int_t tmpType = -1;
+  Int_t SMOrder = 0;
+
   for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
-    TString smodName(TString::Format("EMCAL/FullSupermodule%d", smodnum+1));
-    if(geom->GetKey110DEG() && smodnum >= 10) {
-      smodName = "EMCAL/HalfSupermodule";
-      smodName += (smodnum-10+1);
+    if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Standard )      SMName = "FullSupermodule";
+    else if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Half )     SMName = "HalfSupermodule";
+    else if(geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_3rd )      SMName = "OneThrdSupermodule";
+    else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Standard ) SMName = "DCALSupermodule";
+    else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Ext )      SMName = "DCALExtensionSM";
+    else AliError("Unkown SM Type!!");
+
+    if(geom->GetSMType(smodnum) == tmpType) {
+      SMOrder++;
+    } else {
+      tmpType = geom->GetSMType(smodnum);
+      SMOrder = 1;
     }
+    TString smodName(TString::Format("EMCAL/%s%d", SMName.Data(), SMOrder));
+
     new(array[arrayInd]) AliAlignObjParams(smodName.Data(), volid, 0., 0., 0., 0., 0., 0., true);
     ++arrayInd;
   }
@@ -294,22 +323,28 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
   
   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.;
+  Float_t fInnerEdge = geom->GetDCALInnerEdge();
   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];
-    phiRad = geom->GetPhiCenterOfSM(smodnum); //comes in radians
+    phiRad = geom->GetPhiCenterOfSMSec(smodnum); //comes in radians
     phi = phiRad*180./TMath::Pi(); //need degrees for AliAlignObjParams
     xpos = rpos * TMath::Cos(phiRad);
     ypos = rpos * TMath::Sin(phiRad);
     zpos = pars[2];
-    if(geom->GetKey110DEG() && smodnum >= 10) {
+    if(  geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Half 
+      || geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_3rd 
+      || geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Ext ) {
       xpos += (pars[1]/2. * TMath::Sin(phiRad));
       ypos -= (pars[1]/2. * TMath::Cos(phiRad));
+    } else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Standard) {
+        zpos = pars[2] + fInnerEdge/2.;
     }
+
     smc.fX1 = xpos;
     smc.fY1 = ypos;
     smc.fPhi = phi; //degrees
@@ -320,8 +355,7 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     } 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);
     
   }
   
@@ -334,6 +368,9 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     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];
+
+    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
@@ -358,13 +395,13 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     Double_t activeX = ((xval[0] + (xval[2] - xval[0])/2.)        //x00 and x10
                         +(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
@@ -388,16 +425,17 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     
     //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[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("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);
@@ -410,8 +448,8 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
       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;    
@@ -421,7 +459,7 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
                       +(zval[1] + (zval[3] - zval[1])/2.) ) /2.;
     
     
-    //printf("Bottom Center of SM %s Box: %.2f, %.2f, %.2f\n",substr,realX,realY,realZ);
+    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                   
@@ -429,8 +467,8 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     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;
@@ -441,7 +479,28 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     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) {
@@ -454,7 +513,7 @@ void AliEMCALSurvey::InitSuperModuleData(const TObjArray *svypts)
     t.fPhi = real.fPhi - ideal.fPhi;
     t.fTheta = real.fTheta - ideal.fTheta;
     t.fPsi = real.fPsi - ideal.fPsi;
-    
+
     printf("===================== SM %d =======================\n",i);
     printf("real x (%.2f) - ideal x (%.2f) = shift in x (%.2f)\n",real.fX1,ideal.fX1,t.fXShift);
     printf("real y (%.2f) - ideal y (%.2f) = shift in y (%.2f)\n",real.fY1,ideal.fY1,t.fYShift);
@@ -482,8 +541,9 @@ void AliEMCALSurvey::InitSuperModuleData(const Double_t *xReal, const Double_t *
   //////////////////////////////////////
   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.;
+  Float_t fInnerEdge = geom->GetDCALInnerEdge();
   Double_t phi=0, phiRad=0, xpos=0, ypos=0, zpos=0;
 
   zpos = pars[2];
@@ -491,14 +551,20 @@ void AliEMCALSurvey::InitSuperModuleData(const Double_t *xReal, const Double_t *
   AliEMCALSuperModuleCoords *idealSM = new AliEMCALSuperModuleCoords[fNSuperModule];
   for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
     AliEMCALSuperModuleCoords &smc = idealSM[smodnum];
-    phiRad = geom->GetPhiCenterOfSM(smodnum); //comes in radians
+    phiRad = geom->GetPhiCenterOfSMSec(smodnum); //comes in radians
     phi = phiRad*180./TMath::Pi(); //need degrees for AliAlignObjParams
     xpos = rpos * TMath::Cos(phiRad);
     ypos = rpos * TMath::Sin(phiRad);
-    if(geom->GetKey110DEG() && smodnum >= 10) {
+
+    if(  geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_Half
+      || geom->GetSMType(smodnum) == AliEMCALGeometry::kEMCAL_3rd
+      || geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Ext ) {
       xpos += (pars[1]/2. * TMath::Sin(phiRad));
       ypos -= (pars[1]/2. * TMath::Cos(phiRad));
+    } else if( geom->GetSMType(smodnum) == AliEMCALGeometry::kDCAL_Standard) {
+        zpos = pars[2] + fInnerEdge/2.;
     }
+
     smc.fX1 = xpos;
     smc.fY1 = ypos;