X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSGeoUtils.cxx;h=0cc8dc16350d0a07644205243814b33876c263c3;hb=f9223476c1758e9109c8a971ded5a47ee32739e7;hp=49cfbbe539119b59b282d6d3e1c4d7bd4f5bc0d1;hpb=e4cc2ca1023994a499306c25fde791a55b1872a6;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSGeoUtils.cxx b/PHOS/AliPHOSGeoUtils.cxx index 49cfbbe5391..0cc8dc16350 100644 --- a/PHOS/AliPHOSGeoUtils.cxx +++ b/PHOS/AliPHOSGeoUtils.cxx @@ -16,11 +16,10 @@ /* $Id: AliPHOSGeometry.cxx 25590 2008-05-06 07:09:11Z prsnko $ */ //_________________________________________________________________________ -// Geometry class for PHOS : singleton +// Geometry class for PHOS // PHOS consists of the electromagnetic calorimeter (EMCA) -// and a charged particle veto either in the Subatech's version (PPSD) -// or in the IHEP's one (CPV). -// The EMCA/PPSD/CPV modules are parametrized so that any configuration +// and a charged particle veto (CPV) +// The EMCA/CPV modules are parametrized so that any configuration // can be easily implemented // The title is used to identify the version of CPV used. // @@ -28,6 +27,7 @@ // --- ROOT system --- +#include "TClonesArray.h" #include "TVector3.h" #include "TParticle.h" #include @@ -36,6 +36,7 @@ // --- Standard library --- // --- AliRoot header files --- +#include "AliLog.h" #include "AliPHOSEMCAGeometry.h" #include "AliPHOSCPVGeometry.h" #include "AliPHOSSupportGeometry.h" @@ -49,12 +50,25 @@ AliPHOSGeoUtils::AliPHOSGeoUtils(): fNModules(0),fNCristalsInModule(0),fNPhi(0),fNZ(0), fNumberOfCPVPadsPhi(0),fNumberOfCPVPadsZ(0), fNCellsXInStrip(0),fNCellsZInStrip(0),fNStripZ(0), - fCrystalShift(0.),fCryCellShift(0.),fCellStep(0.), - fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.) + fCrystalShift(0.),fCryCellShift(0.),fCryStripShift(0.),fCellStep(0.), + fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.),fMisalArray(0x0) { // default ctor // must be kept public for root persistency purposes, but should never be called by the outside world + + fXtlArrSize[0]=0.; + fXtlArrSize[1]=0.; + fXtlArrSize[2]=0.; + + for(Int_t mod=0; mod<5; mod++){ + fEMCMatrix[mod]=0 ; + for(Int_t istrip=0; istrip<224; istrip++) + fStripMatrix[mod][istrip]=0 ; + fCPVMatrix[mod]=0; + fPHOSMatrix[mod]=0 ; + } + } //____________________________________________________________________________ @@ -64,8 +78,8 @@ AliPHOSGeoUtils::AliPHOSGeoUtils(const AliPHOSGeoUtils & rhs) fNModules(0),fNCristalsInModule(0),fNPhi(0),fNZ(0), fNumberOfCPVPadsPhi(0),fNumberOfCPVPadsZ(0), fNCellsXInStrip(0),fNCellsZInStrip(0),fNStripZ(0), - fCrystalShift(0.),fCryCellShift(0.),fCellStep(0.), - fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.) + fCrystalShift(0.),fCryCellShift(0.),fCryStripShift(0.),fCellStep(0.), + fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.),fMisalArray(0x0) { Fatal("cpy ctor", "not implemented") ; } @@ -77,8 +91,8 @@ AliPHOSGeoUtils::AliPHOSGeoUtils(const Text_t* name, const Text_t* title) fNModules(0),fNCristalsInModule(0),fNPhi(0),fNZ(0), fNumberOfCPVPadsPhi(0),fNumberOfCPVPadsZ(0), fNCellsXInStrip(0),fNCellsZInStrip(0),fNStripZ(0), - fCrystalShift(0.),fCryCellShift(0.),fCellStep(0.), - fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.) + fCrystalShift(0.),fCryCellShift(0.),fCryStripShift(0.),fCellStep(0.), + fPadSizePhi(0.),fPadSizeZ(0.),fCPVBoxSizeY(0.),fMisalArray(0x0) { // ctor only for normal usage @@ -98,22 +112,31 @@ AliPHOSGeoUtils::AliPHOSGeoUtils(const Text_t* name, const Text_t* title) fXtlArrSize[2]=fGeometryEMCA->GetInnerThermoHalfSize()[2] ; //Wery close to the zise of the Xtl set //calculate offset to crystal surface - Float_t * inthermo = fGeometryEMCA->GetInnerThermoHalfSize() ; - Float_t * strip = fGeometryEMCA->GetStripHalfSize() ; - Float_t* splate = fGeometryEMCA->GetSupportPlateHalfSize(); - Float_t * crystal = fGeometryEMCA->GetCrystalHalfSize() ; - Float_t * pin = fGeometryEMCA->GetAPDHalfSize() ; - Float_t * preamp = fGeometryEMCA->GetPreampHalfSize() ; + const Float_t * inthermo = fGeometryEMCA->GetInnerThermoHalfSize() ; + const Float_t * strip = fGeometryEMCA->GetStripHalfSize() ; + const Float_t * splate = fGeometryEMCA->GetSupportPlateHalfSize(); + const Float_t * crystal = fGeometryEMCA->GetCrystalHalfSize() ; + const Float_t * pin = fGeometryEMCA->GetAPDHalfSize() ; + const Float_t * preamp = fGeometryEMCA->GetPreampHalfSize() ; fCrystalShift=-inthermo[1]+strip[1]+splate[1]+crystal[1]-fGeometryEMCA->GetAirGapLed()/2.+pin[1]+preamp[1] ; fCryCellShift=crystal[1]-(fGeometryEMCA->GetAirGapLed()-2*pin[1]-2*preamp[1])/2; + fCryStripShift=fCryCellShift+splate[1] ; fCellStep = 2.*fGeometryEMCA->GetAirCellHalfSize()[0] ; - fNumberOfCPVPadsPhi = fGeometryCPV->GetNumberOfCPVPadsPhi() ; fNumberOfCPVPadsZ = fGeometryCPV->GetNumberOfCPVPadsZ() ; fPadSizePhi = fGeometryCPV->GetCPVPadSizePhi() ; fPadSizeZ = fGeometryCPV->GetCPVPadSizeZ() ; fCPVBoxSizeY= fGeometryCPV->GetCPVBoxSize(1) ; + + for(Int_t mod=0; mod<5; mod++){ + fEMCMatrix[mod]=0 ; + for(Int_t istrip=0; istrip<224; istrip++) + fStripMatrix[mod][istrip]=0 ; + fCPVMatrix[mod]=0; + fPHOSMatrix[mod]=0 ; + } + } //____________________________________________________________________________ @@ -136,7 +159,17 @@ AliPHOSGeoUtils::~AliPHOSGeoUtils(void) if(fGeometrySUPP){ delete fGeometrySUPP ; fGeometrySUPP=0 ; } + if(fMisalArray){ + delete fMisalArray; fMisalArray=0 ; + } + for(Int_t mod=0; mod<5; mod++){ + delete fEMCMatrix[mod] ; + for(Int_t istrip=0; istrip<224; istrip++) + delete fStripMatrix[mod][istrip]; + delete fCPVMatrix[mod]; + delete fPHOSMatrix[mod]; + } } //____________________________________________________________________________ Bool_t AliPHOSGeoUtils::AbsToRelNumbering(Int_t absId, Int_t * relid) const @@ -203,12 +236,6 @@ void AliPHOSGeoUtils::RelPosInModule(const Int_t * relid, Float_t & x, Float_t & { // Converts the relative numbering into the local PHOS-module (x, z) coordinates - if (!gGeoManager){ - printf("Geo manager not initialized\n"); - abort() ; - } - //construct module name - char path[100] ; if(relid[1]==0){ //this is PHOS Double_t pos[3]= {0.0,-fCryCellShift,0.}; //Position incide the crystal @@ -217,37 +244,19 @@ void AliPHOSGeoUtils::RelPosInModule(const Int_t * relid, Float_t & x, Float_t & //Shift and possibly apply misalignment corrections Int_t strip=1+((Int_t) TMath::Ceil((Double_t)relid[2]/fNCellsXInStrip))*fNStripZ- (Int_t) TMath::Ceil((Double_t)relid[3]/fNCellsZInStrip) ; - Int_t cellraw= relid[3]%fNCellsZInStrip ; - if(cellraw==0)cellraw=fNCellsZInStrip ; - Int_t cell= ((relid[2]-1)%fNCellsXInStrip)*fNCellsZInStrip + cellraw ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1/PSTR_%d/PCEL_%d", - relid[0],strip,cell) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(pos,posC); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + pos[0]=((relid[2]-1)%fNCellsXInStrip-fNCellsXInStrip/2+0.5)*fCellStep ; + pos[2]=(-(relid[3]-1)%fNCellsZInStrip+fNCellsZInStrip/2-0.5)*fCellStep ; + + Int_t mod = relid[0] ; + const TGeoHMatrix * m2 = GetMatrixForStrip(mod, strip) ; + m2->LocalToMaster(pos,posC); + //Return to PHOS local system - Double_t posL[3]={posC[0],posC[1],posC[2]}; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",relid[0]) ; - // sprintf(path,"/ALIC_1/PHOS_%d",relid[0]) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort(); - } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posC,posL); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } - x=posL[0] ; - z=-posL[2]; + Double_t posL2[3]={posC[0],posC[1],posC[2]}; + const TGeoHMatrix *mPHOS2 = GetMatrixForModule(mod) ; + mPHOS2->MasterToLocal(posC,posL2); + x=posL2[0] ; + z=-posL2[2]; return ; } else{//CPV @@ -260,30 +269,12 @@ void AliPHOSGeoUtils::RelPosInModule(const Int_t * relid, Float_t & x, Float_t & pos[2] = - ( fNumberOfCPVPadsZ /2. - column - 0.5 ) * fPadSizeZ ; // of center of PHOS module //now apply possible shifts and rotations - sprintf(path,"/ALIC_1/PHOS_%d/PCPV_1",relid[0]) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(pos,posC); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + const TGeoHMatrix *m = GetMatrixForCPV(relid[0]) ; + m->LocalToMaster(pos,posC); //Return to PHOS local system Double_t posL[3]={0.,0.,0.,} ; - sprintf(path,"/ALIC_1/PHOS_%d",relid[0]) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; - } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posC,posL); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + const TGeoHMatrix *mPHOS = GetMatrixForPHOS(relid[0]) ; + mPHOS->MasterToLocal(posC,posL); x=posL[0] ; z=posL[1]; return ; @@ -296,6 +287,18 @@ void AliPHOSGeoUtils::RelPosToAbsId(Int_t module, Double_t x, Double_t z, Int_t { // converts local PHOS-module (x, z) coordinates to absId + //Calculate AbsId using ideal geometry. Should be sufficient for primary particles calculation + //(the only place where this method used currently) + Int_t relid[4]={module,0,1,1} ; + relid[2] = static_cast(TMath::Ceil( x/ fCellStep + fNPhi / 2.) ); + relid[3] = fNZ+1-static_cast(TMath::Ceil(-z/ fCellStep + fNZ / 2.) ) ; + if(relid[2]<1)relid[2]=1 ; + if(relid[3]<1)relid[3]=1 ; + if(relid[2]>fNPhi)relid[2]=fNPhi ; + if(relid[3]>fNZ)relid[3]=fNZ ; + RelToAbsNumbering(relid,absId) ; + +/* //find Global position if (!gGeoManager){ printf("Geo manager not initialized\n"); @@ -353,6 +356,7 @@ void AliPHOSGeoUtils::RelPosToAbsId(Int_t module, Double_t x, Double_t z, Int_t row * 2 + (col*fNCellsXInStrip + (icell - 1) / 2)*fNZ - (icell & 1 ? 1 : 0); } +*/ } @@ -381,31 +385,22 @@ void AliPHOSGeoUtils::RelPosInAlice(Int_t id, TVector3 & pos ) const AbsToRelNumbering(id , relid) ; //construct module name - char path[100] ; if(relid[1]==0){ //this is EMC - Double_t ps[3]= {0.0,-fCryCellShift,0.}; //Position incide the crystal + Double_t ps[3]= {0.0,-fCryStripShift,0.}; //Position incide the crystal Double_t psC[3]={0.0,0.0,0.}; //Global position //Shift and possibly apply misalignment corrections Int_t strip=1+((Int_t) TMath::Ceil((Double_t)relid[2]/fNCellsXInStrip))*fNStripZ- (Int_t) TMath::Ceil((Double_t)relid[3]/fNCellsZInStrip) ; - Int_t cellraw= relid[3]%fNCellsZInStrip ; - if(cellraw==0)cellraw=fNCellsZInStrip ; - Int_t cell= ((relid[2]-1)%fNCellsXInStrip)*fNCellsZInStrip + cellraw ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1/PSTR_%d/PCEL_%d", - relid[0],strip,cell) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(ps,psC); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + ps[0]=((relid[2]-1)%fNCellsXInStrip-fNCellsXInStrip/2+0.5)*fCellStep ; + ps[2]=(-(relid[3]-1)%fNCellsZInStrip+fNCellsZInStrip/2-0.5)*fCellStep ; + + Int_t mod = relid[0] ; + const TGeoHMatrix * m2 = GetMatrixForStrip(mod, strip) ; + m2->LocalToMaster(ps,psC); pos.SetXYZ(psC[0],psC[1],psC[2]) ; + } else{ //first calculate position with respect to CPV plain @@ -417,17 +412,8 @@ void AliPHOSGeoUtils::RelPosInAlice(Int_t id, TVector3 & pos ) const pos[2] = - ( fNumberOfCPVPadsZ /2. - column - 0.5 ) * fPadSizeZ ; // of center of PHOS module //now apply possible shifts and rotations - sprintf(path,"/ALIC_1/PHOS_%d/PCPV_1",relid[0]) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort(); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(ps,psC); - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + const TGeoHMatrix *m = GetMatrixForCPV(relid[0]) ; + m->LocalToMaster(ps,psC); pos.SetXYZ(psC[0],psC[1],-psC[2]) ; } } @@ -436,22 +422,10 @@ void AliPHOSGeoUtils::RelPosInAlice(Int_t id, TVector3 & pos ) const void AliPHOSGeoUtils::Local2Global(Int_t mod, Float_t x, Float_t z, TVector3& globalPosition) const { - char path[100] ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",mod) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; - } Double_t posL[3]={x,-fCrystalShift,-z} ; //Only for EMC!!! Double_t posG[3] ; - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS){ - mPHOS->LocalToMaster(posL,posG); - } - else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; - } + const TGeoHMatrix *mPHOS = GetMatrixForModule(mod) ; + mPHOS->LocalToMaster(posL,posG); globalPosition.SetXYZ(posG[0],posG[1],posG[2]) ; } //____________________________________________________________________________ @@ -464,19 +438,14 @@ void AliPHOSGeoUtils::Global2Local(TVector3& localPosition, //Return to PHOS local system Double_t posG[3]={globalPosition.X(),globalPosition.Y(),globalPosition.Z()} ; Double_t posL[3]={0.,0.,0.} ; - char path[100] ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",module) ; - if (!gGeoManager->cd(path)){ - printf("Geo manager can not find path \n"); - abort() ; + const TGeoHMatrix *mPHOS = GetMatrixForModule(module) ; + if(mPHOS){ + mPHOS->MasterToLocal(posG,posL); + localPosition.SetXYZ(posL[0],posL[1]+fCrystalShift,-posL[2]) ; } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posG,posL); else{ - printf("Geo matrixes are not loaded \n") ; - abort() ; + localPosition.SetXYZ(999.,999.,999.) ; //module does not exist in given configuration } - localPosition.SetXYZ(posL[0],posL[1]+fCrystalShift,-posL[2]) ; } //____________________________________________________________________________ @@ -485,7 +454,7 @@ Bool_t AliPHOSGeoUtils::GlobalPos2RelId(TVector3 & global, Int_t * relId){ //returns false if x,z coordinates are beyond PHOS //distande to PHOS surface is NOT calculated TVector3 loc ; - for(Int_t mod=1; modcd(path)){ //Module does not present - continue ; - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); + const TGeoHMatrix *m = GetMatrixForModule(imod) ; + if(!m) //module does not exist in given configuration + continue ; Double_t posG[3]={0.,0.,0.} ; - if (m) m->LocalToMaster(tmp,posG); + m->LocalToMaster(tmp,posG); TVector3 n(posG[0],posG[1],posG[2]) ; Double_t direction=n.Dot(p) ; if(direction<=0.) @@ -572,4 +532,180 @@ void AliPHOSGeoUtils::GetIncidentVector(const TVector3 &vtx, Int_t module, Float Global2Local(vInc,vtx,module) ; vInc.SetXYZ(vInc.X()+x,vInc.Y(),vInc.Z()+z) ; } +//____________________________________________________________________________ +const TGeoHMatrix * AliPHOSGeoUtils::GetMatrixForModule(Int_t mod)const { + //Provides shift-rotation matrix for module mod + + //If GeoManager exists, take matrixes from it + if(gGeoManager){ + char path[255] ; + snprintf(path,255,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",mod) ; + // sprintf(path,"/ALIC_1/PHOS_%d",relid[0]) ; + if (!gGeoManager->cd(path)){ + AliWarning(Form("Geo manager can not find path %s \n",path)); + return 0; + } + return gGeoManager->GetCurrentMatrix(); + } + if(fEMCMatrix[mod-1]){ + return fEMCMatrix[mod-1] ; + } + else{ + AliWarning("Can not find PHOS misalignment matrixes\n") ; + AliWarning("Either import TGeoManager from geometry.root or \n"); + AliWarning("read stored matrixes from AliESD Header: \n") ; + AliWarning("AliPHOSGeoUtils::SetMisalMatrixes(header->GetPHOSMisalMatrix()) \n") ; + return 0 ; + } + return 0 ; +} +//____________________________________________________________________________ +const TGeoHMatrix * AliPHOSGeoUtils::GetMatrixForStrip(Int_t mod, Int_t strip)const { + //Provides shift-rotation matrix for strip unit of the module mod + //If GeoManager exists, take matrixes from it + if(gGeoManager){ + char path[255] ; + snprintf(path,255,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1/PSTR_%d",mod,strip) ; + if (!gGeoManager->cd(path)){ + AliWarning(Form("Geo manager can not find path %s \n",path)); + return 0 ; + } + return gGeoManager->GetCurrentMatrix(); + } + if(fStripMatrix[mod-1][strip-1]){ + return fStripMatrix[mod-1][strip-1] ; + } + else{ + AliWarning("Can not find PHOS misalignment matrixes\n") ; + AliWarning("Either import TGeoManager from geometry.root or \n"); + AliWarning("read stored matrixes from AliESD Header: \n") ; + AliWarning("AliPHOSGeoUtils::SetMisalMatrixes(header->GetPHOSMisalMatrix()) \n") ; + return 0 ; + } + return 0 ; +} +//____________________________________________________________________________ +const TGeoHMatrix * AliPHOSGeoUtils::GetMatrixForCPV(Int_t mod)const { + //Provides shift-rotation matrix for CPV of the module mod + + //If GeoManager exists, take matrixes from it + if(gGeoManager){ + char path[255] ; + //now apply possible shifts and rotations + snprintf(path,255,"/ALIC_1/PHOS_%d/PCPV_1",mod) ; + if (!gGeoManager->cd(path)){ + AliWarning(Form("Geo manager can not find path %s \n",path)); + return 0 ; + } + return gGeoManager->GetCurrentMatrix(); + } + if(fCPVMatrix[mod-1]){ + return fCPVMatrix[mod-1] ; + } + else{ + AliWarning("Can not find PHOS misalignment matrixes\n") ; + AliWarning("Either import TGeoManager from geometry.root or \n"); + AliWarning("read stored matrixes from AliESD Header: \n") ; + AliWarning("AliPHOSGeoUtils::SetMisalMatrixes(header->GetPHOSMisalMatrix()) \n") ; + return 0 ; + } + return 0 ; +} +//____________________________________________________________________________ +const TGeoHMatrix * AliPHOSGeoUtils::GetMatrixForPHOS(Int_t mod)const { + //Provides shift-rotation matrix for PHOS (EMC+CPV) + + //If GeoManager exists, take matrixes from it + if(gGeoManager){ + + char path[255] ; + snprintf(path,255,"/ALIC_1/PHOS_%d",mod) ; + + if (!gGeoManager->cd(path)){ + AliWarning(Form("Geo manager can not find path %s \n",path)); + return 0 ; + } + return gGeoManager->GetCurrentMatrix(); + } + if(fPHOSMatrix[mod-1]){ + return fPHOSMatrix[mod-1] ; + } + else{ + AliWarning("Can not find PHOS misalignment matrixes\n") ; + AliWarning("Either import TGeoManager from geometry.root or \n"); + AliWarning("read stored matrixes from AliESD Header: \n") ; + AliWarning("AliPHOSGeoUtils::SetMisalMatrixes(header->GetPHOSMisalMatrix()) \n") ; + return 0 ; + } + return 0 ; +} +//____________________________________________________________________________ +void AliPHOSGeoUtils::SetMisalMatrix(const TGeoHMatrix * m, Int_t mod){ + //Fills pointers to geo matrixes + + if(fPHOSMatrix[mod]){ //have been set already. Can not be changed any more + return ; + } + if(m==NULL) //Matrix for non-existing modules? Remain zero, no need to re-set + return ; + fPHOSMatrix[mod]= new TGeoHMatrix(*m) ; + + //Calculate maxtrices for PTII + if(!fMisalArray) + fMisalArray = new TClonesArray("TGeoHMatrix",1120+10) ; + Int_t nr = fMisalArray->GetEntriesFast() ; + Double_t rotEMC[9]={1.,0.,0.,0.,0.,-1.,0.,1.,0.} ; + const Float_t * inthermo = fGeometryEMCA->GetInnerThermoHalfSize() ; + const Float_t * strip = fGeometryEMCA->GetStripHalfSize() ; + const Float_t * covparams = fGeometryEMCA->GetAlCoverParams() ; + const Float_t * warmcov = fGeometryEMCA->GetWarmAlCoverHalfSize() ; + Float_t z = fGeometryCPV->GetCPVBoxSize(1) / 2. - warmcov[2] + covparams[3]-inthermo[1] ; + Double_t locTII[3]={0.,0.,z} ; + Double_t globTII[3] ; + + if (fEMCMatrix[mod] == NULL) + fEMCMatrix[mod] = new((*fMisalArray)[nr])TGeoHMatrix() ; + nr++ ; + fEMCMatrix[mod]->SetRotation(rotEMC) ; + fEMCMatrix[mod]->MultiplyLeft(fPHOSMatrix[mod]) ; + fPHOSMatrix[mod]->LocalToMaster(locTII,globTII) ; + fEMCMatrix[mod]->SetTranslation(globTII) ; + + //Now calculate ideal matrixes for strip misalignment. + //For the moment we can not store them in ESDHeader + + Double_t loc[3]={0.,inthermo[1] - strip[1],0.} ; + Double_t glob[3] ; + + Int_t istrip=0 ; + for(Int_t irow = 0; irow < fGeometryEMCA->GetNStripX(); irow ++){ + loc[0] = (2*irow + 1 - fGeometryEMCA->GetNStripX())* strip[0] ; + for(Int_t icol = 0; icol < fGeometryEMCA->GetNStripZ(); icol ++){ + loc[2] = (2*icol + 1 - fGeometryEMCA->GetNStripZ()) * strip[2] ; + fEMCMatrix[mod]->LocalToMaster(loc,glob) ; + if (fStripMatrix[mod][istrip] == NULL) + fStripMatrix[mod][istrip] = new((*fMisalArray)[nr])TGeoHMatrix(*(fEMCMatrix[mod])) ; //Use same rotation as PHOS module + nr++ ; + fStripMatrix[mod][istrip]->SetTranslation(glob) ; + istrip++; + } + } + + //Now calculate CPV matrixes + const Float_t * emcParams = fGeometryEMCA->GetEMCParams() ; + Double_t globCPV[3] ; + Double_t locCPV[3]={0.,0.,- emcParams[3]} ; + Double_t rot[9]={1.,0.,0.,0.,0.,1.,0.,-1.,0.} ; + + if (fCPVMatrix[mod] == NULL) + fCPVMatrix[mod] = new((*fMisalArray)[nr])TGeoHMatrix() ; + nr++ ; + fCPVMatrix[mod]->SetRotation(rot) ; + fCPVMatrix[mod]->MultiplyLeft(fPHOSMatrix[mod]) ; + fCPVMatrix[mod]->ReflectY(kFALSE) ; + fPHOSMatrix[mod]->LocalToMaster(locCPV,globCPV) ; + fCPVMatrix[mod]->SetTranslation(globCPV) ; + +} +