new survey classes for EMCAL - uses dummy parameters for now, will update when detect...
authorjklay <jklay@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 29 Feb 2008 20:44:47 +0000 (20:44 +0000)
committerjklay <jklay@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 29 Feb 2008 20:44:47 +0000 (20:44 +0000)
EMCAL/AliEMCALSurvey.cxx [new file with mode: 0644]
EMCAL/AliEMCALSurvey.h [new file with mode: 0644]
EMCAL/EMCALLinkDefbase.h
EMCAL/MakeEMCALFullMisAlignment.C
EMCAL/MakeEMCALResMisAlignment.C
EMCAL/MakeEMCALZeroMisAlignment.C
EMCAL/emcal_survey_data.txt [new file with mode: 0644]
EMCAL/libEMCALbase.pkg

diff --git a/EMCAL/AliEMCALSurvey.cxx b/EMCAL/AliEMCALSurvey.cxx
new file mode 100644 (file)
index 0000000..d05dddd
--- /dev/null
@@ -0,0 +1,247 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id: $ */
+
+// Objects of this class read txt file with survey data
+// and convert the data into AliAlignObjParams of alignable EMCAL volumes.
+// AliEMCALSurvey inherits TObject only to use AliLog "functions".
+//
+// This whole thing is just a dummy class with dummy variables until
+// the actual survey points are determined.  For now I assumed that
+// the x,y center and starting z value of each supermodule is the only
+// surveyed point
+//
+// J.L. Klay - Cal Poly
+// 28-Feb-2008
+//
+
+#include <fstream>
+
+#include <TClonesArray.h>
+#include <TGeoManager.h>
+#include <TString.h>
+#include <TMath.h>
+
+#include "AliSurveyObj.h"
+
+#include "AliAlignObjParams.h"
+#include "AliEMCALGeometry.h"
+#include "AliEMCALSurvey.h"
+#include "AliLog.h"
+
+ClassImp(AliEMCALSurvey)
+
+//____________________________________________________________________________
+AliEMCALSurvey::AliEMCALSurvey()
+                : fNSuperModule(0),
+                  fSuperModuleData(0)
+{
+  //Default constructor.
+}
+
+namespace {
+
+  //for now, measurements assumed to be taken at x,y center and
+  //nominal starting z value of each supermodule
+
+  struct AliEMCALSuperModuleCoords {
+    Double_t fX1; //x coordinate of the first supermodule point
+    Double_t fY1; //y coordinate of the first supermodule point
+    Double_t fZ1; //z coordinate of the first supermodule point
+  };
+
+}
+
+//____________________________________________________________________________
+AliEMCALSurvey::AliEMCALSurvey(const TString &txtFileName)
+                : fNSuperModule(0),
+                  fSuperModuleData(0)
+{
+  //Read survey data from txt file.
+  const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
+  if (!geom) {
+    AliError("Cannot obtain AliEMCALGeometry instance.");
+    return;
+  }
+
+  std::ifstream inputFile(txtFileName.Data());
+  if (!inputFile) {
+    AliError(("Cannot open the survey file " + txtFileName).Data());
+    return;
+  }
+
+  fNSuperModule = geom->GetNumberOfSuperModules();
+
+  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];
+
+  for (Int_t i = 0; i < fNSuperModule; ++i) {
+    if (!inputFile) {
+      AliError("Error while reading input file.");
+      delete [] xReal;
+      delete [] yReal;
+      delete [] zReal;
+      return;
+    }
+    inputFile>>dummyInt>>xReal[i]>>yReal[i]>>zReal[i];
+  }
+
+  InitSuperModuleData(xReal, yReal, zReal);
+
+  delete [] xReal;
+  delete [] yReal;
+  delete [] zReal;
+}
+
+//____________________________________________________________________________
+AliEMCALSurvey::~AliEMCALSurvey()
+{
+  delete [] fSuperModuleData;
+}
+
+//____________________________________________________________________________
+void AliEMCALSurvey::CreateAliAlignObjParams(TClonesArray &array)
+{
+  //Create AliAlignObjParams.
+  const AliEMCALGeometry * geom = AliEMCALGeometry::GetInstance();
+  if (!geom) {
+    AliError("Cannot obtain AliEMCALGeometry instance.");
+    return;
+  }
+
+  if (!gGeoManager) {
+    AliWarning("Cannot create local transformations for supermodules - gGeoManager does not exist.");
+    AliInfo("Null shifts and rotations will be created instead.");
+    return CreateNullObjects(array, geom);
+  }
+
+  Int_t arrayInd = array.GetEntries(), iIndex = 0;
+  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
+  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
+
+  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);
+    }    
+    AliEMCALSuperModuleDelta t(GetSuperModuleTransformation(smodnum));
+    new(array[arrayInd])
+      AliAlignObjParams(
+                       smodName.Data(), volid, 
+                       t.fXShift, t.fYShift, t.fZShift, 
+                       -t.fPsi, -t.fTheta, -t.fPhi, 
+                       false
+                       );
+    ++arrayInd;
+  }
+
+}
+
+//____________________________________________________________________________
+void AliEMCALSurvey::CreateNullObjects(TClonesArray &array, const AliEMCALGeometry *geom)const
+{
+  //Create null shifts and rotations.
+  Int_t arrayInd = array.GetEntries(), iIndex = 0;
+  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
+  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex);
+
+  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);
+    }
+    new(array[arrayInd]) AliAlignObjParams(smodName.Data(), volid, 0., 0., 0., 0., 0., 0., true);
+    ++arrayInd;
+  }
+}
+
+//____________________________________________________________________________
+AliEMCALSurvey::AliEMCALSuperModuleDelta AliEMCALSurvey::GetSuperModuleTransformation(Int_t supModIndex)const
+{
+  //Supermodule transformation.
+  AliEMCALSuperModuleDelta t = {0., 0., 0., 0., 0., 0.};
+  if (!fSuperModuleData)
+    return t;
+
+  return fSuperModuleData[supModIndex];
+}
+
+//____________________________________________________________________________
+void AliEMCALSurvey::InitSuperModuleData(const Double_t *xReal, const Double_t *yReal, const Double_t *zReal)
+{
+
+  AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
+  //Center of supermodules
+  Float_t *pars = geom->GetSuperModulesPars();
+  Double_t rpos = (geom->GetEnvelop(0) + geom->GetEnvelop(1))/2.;
+  Double_t phi, phiRad, xpos, ypos, zpos;
+
+  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
+    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) {
+      xpos += (pars[1]/2. * TMath::Sin(phiRad));
+      ypos -= (pars[1]/2. * TMath::Cos(phiRad));
+    }
+    smc.fX1 = xpos;
+    smc.fY1 = ypos;
+    if(smodnum%2==0) {
+      smc.fZ1 = zpos;
+    } else {
+      smc.fZ1 = -zpos;
+    }
+
+  }
+  
+  AliEMCALSuperModuleCoords *realSM = new AliEMCALSuperModuleCoords[fNSuperModule];
+  for (Int_t smodnum = 0; smodnum < geom->GetNumberOfSuperModules(); ++smodnum) {
+    AliEMCALSuperModuleCoords &smc = realSM[smodnum];
+    smc.fX1 = xReal[smodnum];  //x and y match
+    smc.fY1 = yReal[smodnum];  //x and y match
+    smc.fZ1 = zReal[smodnum]/2.;  //z measured is along end, need to
+                                 //convert to middle of SM
+  }
+  
+  fSuperModuleData = new AliEMCALSuperModuleDelta[fNSuperModule];
+  
+  for (Int_t i = 0; i < fNSuperModule; ++i) {
+    const AliEMCALSuperModuleCoords &real = realSM[i];
+    const AliEMCALSuperModuleCoords &ideal = idealSM[i];
+    AliEMCALSuperModuleDelta &t = fSuperModuleData[i];
+    t.fTheta = TMath::ATan(real.fZ1  / real.fX1) - 
+               TMath::ATan(ideal.fZ1 / ideal.fX1);
+    t.fTheta *= TMath::RadToDeg();
+    t.fPsi = 0.;
+    t.fPhi = TMath::ATan(real.fY1 / real.fX1) - TMath::ATan(ideal.fY1 / ideal.fX1);
+    t.fPhi *= TMath::RadToDeg();
+    t.fXShift = real.fX1 - ideal.fX1;
+    t.fYShift = real.fY1 - ideal.fY1;
+    t.fZShift = real.fZ1 - ideal.fZ1;
+
+  }
+
+  delete [] realSM;
+  delete [] idealSM;
+}
diff --git a/EMCAL/AliEMCALSurvey.h b/EMCAL/AliEMCALSurvey.h
new file mode 100644 (file)
index 0000000..9356a31
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef ALIEMCALSURVEY_H
+#define ALIEMCALSURVEY_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id: $ */
+
+#include <TObject.h>
+#include <Rtypes.h>
+
+class TClonesArray;
+class TString;
+
+class AliEMCALGeometry;
+
+/*
+  Objects of this class read txt file with survey data
+  and convert the data into AliAlignObjParams of alignable EMCAL volumes.
+  AliEMCALSurvey inherits TObject only to use AliLog "functions".
+*/
+
+class AliEMCALSurvey : public TObject {
+public:
+  AliEMCALSurvey();
+  AliEMCALSurvey(const TString &txtFileName);
+
+  virtual ~AliEMCALSurvey();
+
+  //Create AliAlignObjParams for strips.
+  void CreateAliAlignObjParams(TClonesArray &array);
+  //Create AliAlignObjParams with null shifts and rotations.
+  void CreateNullObjects(TClonesArray &alObj, const AliEMCALGeometry *geom)const;
+
+protected:
+
+  struct AliEMCALSuperModuleDelta {
+    Float_t fXShift; //x shift
+    Float_t fYShift; //y shift
+    Float_t fZShift; //z shift
+    Float_t fPsi;    //psi
+    Float_t fTheta;  //theta
+    Float_t fPhi;    //phi
+  };
+
+  Int_t          fNSuperModule; // Number of supermodules.
+  AliEMCALSuperModuleDelta *fSuperModuleData; // Supermodule transformation data
+
+  void InitSuperModuleData(const Double_t *xReal, const Double_t *yReal, const Double_t *zReal);
+
+private:
+  //Calculate shifts and rotations for supermodule.
+  virtual AliEMCALSuperModuleDelta GetSuperModuleTransformation(Int_t smIndex) const;
+
+  AliEMCALSurvey(const AliEMCALSurvey &);
+  AliEMCALSurvey &operator = (const AliEMCALSurvey &);
+
+  ClassDef(AliEMCALSurvey, 1) //Survey data reader
+};
+
+#endif
index a2f8148..2d7f06d 100644 (file)
@@ -33,4 +33,5 @@
 #pragma link C++ class AliEMCALCellIndexes+;
 //
 #pragma link C++ class AliCaloCalibPedestal+;
+#pragma link C++ class AliEMCALSurvey+;
 #endif
index c89ac02..fcaefcd 100644 (file)
@@ -1,9 +1,14 @@
 void MakeEMCALFullMisAlignment(){
   // Create TClonesArray of full misalignment objects for EMCAL
   //
-  TClonesArray *array = new TClonesArray("AliAlignObjParams",10);
-  TClonesArray &alobj = *array;
   const char* macroname = "MakeEMCALFullMisAlignment.C";
+  const AliEMCALGeometry *emcalGeom = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaulGeometryName(),"");
+  if(!emcalGeom) {
+    Error("MakeEMCALFullMisAlignment","Cannot obtain AliEMCALGeometry singleton\n");
+    return;
+  }
+  TClonesArray *array = new TClonesArray("AliAlignObjParams",emcalGeom->GetNumberOfSuperModules());
+  TClonesArray &alobj = *array;
 
   // Activate CDB storage and load geometry from CDB
   AliCDBManager* cdb = AliCDBManager::Instance();
@@ -30,50 +35,15 @@ void MakeEMCALFullMisAlignment(){
     TGeoManager* geom = (TGeoManager*) entry->GetObject();
     AliGeomManager::SetGeometry(geom);
   }else{
-    AliGeomManager::LoadGeometry(); //load geom from default CDB storage
+    AliGeomManager::LoadGeometry(); //load geom from default CDB
+                                   //storage
   }    
 
-  Double_t dx, dy, dz, dpsi, dtheta, dphi;
-  TRandom *rnd   = new TRandom(4321);
-  Double_t sigmatr = 0.1; // max shift in cm w.r.t. local RS
-  Double_t sigmarot = 0.1; // max rot in degrees w.r.t. local RS
-
-  // null shifts and rotations
 
-  const TString basepath = "EMCAL/FullSupermodule";
-  const TString hbasepath = "EMCAL/HalfSupermodule";
-  TString pathstr;
+  AliEMCALSurvey emcalSurvey("emcal_survey_data.txt");
+  emcalSurvey.CreateAliAlignObjParams(alobj);
 
-  Int_t iIndex=0; //let all modules have index=0 in a layer with no LUT
-  AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
-  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iIndex); //dummy volume identity
-  Int_t i;
-  Int_t j=0;
-
-  for(i=0; i<10; i++){
-    dx = rnd->Gaus(0.,sigmatr);
-    dy = rnd->Gaus(0.,sigmatr);
-    dz = rnd->Gaus(0.,sigmatr);
-    dpsi = rnd->Gaus(0.,sigmarot);
-    dtheta = rnd->Gaus(0.,sigmarot);
-    dphi = rnd->Gaus(0.,sigmarot);
-    pathstr=basepath;
-    pathstr+=(i+1);
-    cout<<pathstr<<"  "<<dx<<"  "<<dy<<"  "<<dz<<"  "<<dpsi<<"  "<<dtheta<<"  "<<dphi<<"\n";
-    new(alobj[j++]) AliAlignObjParams(pathstr, volid, dx, dy, dz, dpsi, dtheta, dphi, kFALSE);
-  }
-
-  for(i=0; i<2; i++){
-    dx = rnd->Gaus(0.,sigmatr);
-    dy = rnd->Gaus(0.,sigmatr);
-    dz = rnd->Gaus(0.,sigmatr);
-    dpsi = rnd->Gaus(0.,sigmarot);
-    dtheta = rnd->Gaus(0.,sigmarot);
-    dphi = rnd->Gaus(0.,sigmarot);
-    pathstr=hbasepath;
-    pathstr+=(i+1);
-    new(alobj[j++]) AliAlignObjParams(pathstr, volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
-  }
+  // *************************    2nd step    ***************
 
   if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
     // save on file
@@ -90,7 +60,7 @@ void MakeEMCALFullMisAlignment(){
   }else{
     // save in CDB storage
     AliCDBMetaData* md = new AliCDBMetaData();
-    md->SetResponsible("Jennifer Clay");
+    md->SetResponsible("Jennifer Klay");
     md->SetComment("Full misalignment for EMCAL");
     md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
     AliCDBId id("EMCAL/Align/Data",0,AliCDBRunRange::Infinity());
index e0b465d..a1f2c76 100644 (file)
@@ -1,9 +1,16 @@
 void MakeEMCALResMisAlignment(){
   // Create TClonesArray of residual misalignment objects for EMCAL
   //
-  TClonesArray *array = new TClonesArray("AliAlignObjParams",10);
-  TClonesArray &alobj = *array;
   const char* macroname = "MakeEMCALResMisAlignment.C";
+  const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaulGeometryName(),"");
+  if(!geom) {
+    Error("MakeEMCALResMisAlignment","Cannot obtain AliEMCALGeometry singleton\n");
+    return;
+  }
+
+  TClonesArray *array = new TClonesArray("AliAlignObjParams",geom->GetNumberOfSuperModules());
+  TClonesArray &alobj = *array;
+
 
   // Activate CDB storage and load geometry from CDB
   AliCDBManager* cdb = AliCDBManager::Instance();
@@ -50,7 +57,7 @@ void MakeEMCALResMisAlignment(){
   // sigma translation = 1mm
   // sigma rotation = 0.1 degree
   TRandom *rnd   = new TRandom(4321);
-  Double_t sigmatr = 0.1; // max shift in cm w.r.t. local RS
+  Double_t sigmatr = 0.05; // max shift in cm w.r.t. local RS
   Double_t sigmarot = 0.1; // max rot in degrees w.r.t. local RS
 
   for(i=0; i<10; i++){
@@ -92,8 +99,8 @@ void MakeEMCALResMisAlignment(){
   }else{
     // save in CDB storage
     AliCDBMetaData* md = new AliCDBMetaData();
-    md->SetResponsible("Jennifer Clay");
-    md->SetComment("Residual misalignment for EMCAL, produced with sigmatr=0.05 and sigmarot=0.3 in the local RS");
+    md->SetResponsible("Jennifer Klay");
+    md->SetComment("Residual misalignment for EMCAL, produced with sigmatr=0.05 and sigmarot=0.1 in the local RS");
     md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
     AliCDBId id("EMCAL/Align/Data",0,AliCDBRunRange::Infinity());
     storage->Put(array,id,md);
index f8e5d49..64b7c9a 100644 (file)
@@ -1,10 +1,17 @@
 void MakeEMCALZeroMisAlignment(){
   // Create TClonesArray of zero misalignment objects for EMCAL
   //
-  TClonesArray *array = new TClonesArray("AliAlignObjParams",10);
-  TClonesArray &alobj = *array;
   const char* macroname = "MakeEMCALZeroMisAlignment.C";
+  const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaulGeometryName(),"");
+  if(!geom) {
+    Error("MakeEMCALZeroMisAlignment","Cannot obtain AliEMCALGeometry singleton\n");
+    return;
+  }
 
+  TClonesArray *array = new TClonesArray("AliAlignObjParams",geom->GetNumberOfSuperModules());
+  TClonesArray &alobj = *array;
+
+  /*
   Double_t dx=0., dy=0., dz=0., dpsi=0., dtheta=0., dphi=0.;
 
   const TString fbasepath = "EMCAL/FullSupermodule";
@@ -29,6 +36,10 @@ void MakeEMCALZeroMisAlignment(){
     pathstr+=(i+1);
     new(alobj[j++]) AliAlignObjParams(pathstr, volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
   }
+  */
+
+  AliEMCALSurvey emcalSurvey;
+  emcalSurvey.CreateNullObjects(alobj,geom);
 
   if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
     // save on file
@@ -58,7 +69,7 @@ void MakeEMCALZeroMisAlignment(){
       return;
     }
     AliCDBMetaData* md = new AliCDBMetaData();
-    md->SetResponsible("Jennifer Clay");
+    md->SetResponsible("Jennifer Klay");
     md->SetComment("Zero misalignment for EMCAL");
     md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
     AliCDBId id("EMCAL/Align/Data",0,AliCDBRunRange::Infinity());
diff --git a/EMCAL/emcal_survey_data.txt b/EMCAL/emcal_survey_data.txt
new file mode 100644 (file)
index 0000000..8daabe6
--- /dev/null
@@ -0,0 +1,12 @@
+40960 0.121 441.969 350.050
+40961 -0.103 441.921 -350.021
+40962 -151.178 415.241 350.101
+40963 -151.088 415.191 -350.088
+40964 -284.068 338.485 350.401
+40965 -284.008 338.421 -350.731
+40966 -382.720 221.005 350.098
+40967 -382.713 220.842 -350.314
+40968 -435.215 76.792 350.104
+40969 -435.053 76.641 -350.065
+40970 -443.382 -3.932 350.021
+40971 -443.247 -3.942 -350.112
index 16e1792..874fd86 100644 (file)
@@ -22,7 +22,8 @@ AliEMCALRawUtils.cxx \
 AliEMCALPi0SelectionParam.cxx \
 AliEMCALCalibCoefs.cxx \
 AliEMCALCellInfo.cxx\
-AliCaloCalibPedestal.cxx
+AliCaloCalibPedestal.cxx\
+AliEMCALSurvey.cxx
 
 HDRS= $(SRCS:.cxx=.h)