X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSGeometry.cxx;h=0fae4bfa94c6e4aa879b42b97183d5f64df1f89a;hb=39e7fb3be63957555696b5695ac34524519c9480;hp=dfeb6e2a93c8f5fdcfa87e97d71d653e70779cc8;hpb=19c8ddd0900799e17491844c05c797c6da13bc2c;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSGeometry.cxx b/PHOS/AliPHOSGeometry.cxx index dfeb6e2a93c..0fae4bfa94c 100644 --- a/PHOS/AliPHOSGeometry.cxx +++ b/PHOS/AliPHOSGeometry.cxx @@ -32,6 +32,7 @@ #include "TRotation.h" #include "TParticle.h" #include +#include // --- Standard library --- @@ -49,49 +50,50 @@ Bool_t AliPHOSGeometry::fgInit = kFALSE ; //____________________________________________________________________________ AliPHOSGeometry::AliPHOSGeometry() : - fNModules(0), + AliPHOSGeoUtils(), fAngle(0.f), fPHOSAngle(0), fIPtoUpperCPVsurface(0), - fRotMatrixArray(0), - fGeometryEMCA(0), - fGeometryCPV(0), - fGeometrySUPP(0) + fCrystalShift(0), + fCryCellShift(0), + fRotMatrixArray(0) { // default ctor // must be kept public for root persistency purposes, but should never be called by the outside world fgGeom = 0 ; + + fPHOSParams[0] = 0.; + fPHOSParams[1] = 0.; + fPHOSParams[2] = 0.; + fPHOSParams[3] = 0.; } //____________________________________________________________________________ AliPHOSGeometry::AliPHOSGeometry(const AliPHOSGeometry & rhs) - : AliGeometry(rhs), - fNModules(rhs.fNModules), + : AliPHOSGeoUtils(rhs), fAngle(rhs.fAngle), fPHOSAngle(0), fIPtoUpperCPVsurface(rhs.fIPtoUpperCPVsurface), - fRotMatrixArray(0), - fGeometryEMCA(0), - fGeometryCPV(0), - fGeometrySUPP(0) + fCrystalShift(rhs.fCrystalShift), + fCryCellShift(rhs.fCryCellShift), + fRotMatrixArray(0) { Fatal("cpy ctor", "not implemented") ; } //____________________________________________________________________________ AliPHOSGeometry::AliPHOSGeometry(const Text_t* name, const Text_t* title) - : AliGeometry(name, title), - fNModules(0), + : AliPHOSGeoUtils(name, title), fAngle(0.f), fPHOSAngle(0), fIPtoUpperCPVsurface(0), - fRotMatrixArray(0), - fGeometryEMCA(0), - fGeometryCPV(0), - fGeometrySUPP(0) + fCrystalShift(0), + fCryCellShift(0), + fRotMatrixArray(0) { // ctor only for internal usage (singleton) Init() ; + fgGeom = this; } //____________________________________________________________________________ @@ -110,26 +112,14 @@ void AliPHOSGeometry::Init(void) // Initializes the PHOS parameters : // IHEP is the Protvino CPV (cathode pad chambers) - TString test(GetName()) ; - if (test != "IHEP" && test != "noCPV") { - AliFatal(Form("%s is not a known geometry (choose among IHEP)", - test.Data() )) ; - } - fgInit = kTRUE ; - fNModules = 5; fAngle = 20; - fGeometryEMCA = new AliPHOSEMCAGeometry(); - - fGeometryCPV = new AliPHOSCPVGeometry (); - - fGeometrySUPP = new AliPHOSSupportGeometry(); fPHOSAngle = new Float_t[fNModules] ; - Float_t * emcParams = fGeometryEMCA->GetEMCParams() ; + const Float_t * emcParams = fGeometryEMCA->GetEMCParams() ; fPHOSParams[0] = TMath::Max((Double_t)fGeometryCPV->GetCPVBoxSize(0)/2., (Double_t)(emcParams[0] - (emcParams[1]-emcParams[0])* @@ -139,7 +129,17 @@ void AliPHOSGeometry::Init(void) fPHOSParams[3] = emcParams[3] + fGeometryCPV->GetCPVBoxSize(1)/2. ; fIPtoUpperCPVsurface = fGeometryEMCA->GetIPtoOuterCoverDistance() - fGeometryCPV->GetCPVBoxSize(1) ; - + + //calculate offset to crystal surface + 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; + Int_t index ; for ( index = 0; index < fNModules; index++ ) fPHOSAngle[index] = 0.0 ; // Module position angles are set in CreateGeometry() @@ -226,49 +226,18 @@ void AliPHOSGeometry::SetPHOSAngles() fPHOSAngle[i-1] = - angle ; } } - //____________________________________________________________________________ -Bool_t AliPHOSGeometry::AbsToRelNumbering(Int_t AbsId, Int_t * relid) const +void AliPHOSGeometry::GetGlobal(const AliRecPoint* , TVector3 & ) const { - // Converts the absolute numbering into the following array - // relid[0] = PHOS Module number 1:fNModules - // relid[1] = 0 if PbW04 - // = -1 if CPV - // relid[2] = Row number inside a PHOS module - // relid[3] = Column number inside a PHOS module - - Bool_t rv = kTRUE ; - Float_t id = AbsId ; - - Int_t phosmodulenumber = (Int_t)TMath:: Ceil( id / GetNCristalsInModule() ) ; - - if ( phosmodulenumber > GetNModules() ) { // it is a CPV pad - - id -= GetNPhi() * GetNZ() * GetNModules() ; - Float_t nCPV = GetNumberOfCPVPadsPhi() * GetNumberOfCPVPadsZ() ; - relid[0] = (Int_t) TMath::Ceil( id / nCPV ) ; - relid[1] = -1 ; - id -= ( relid[0] - 1 ) * nCPV ; - relid[2] = (Int_t) TMath::Ceil( id / GetNumberOfCPVPadsZ() ) ; - relid[3] = (Int_t) ( id - ( relid[2] - 1 ) * GetNumberOfCPVPadsZ() ) ; - } - else { // it is a PW04 crystal - - relid[0] = phosmodulenumber ; - relid[1] = 0 ; - id -= ( phosmodulenumber - 1 ) * GetNPhi() * GetNZ() ; - relid[2] = (Int_t)TMath::Ceil( id / GetNZ() ) ; - relid[3] = (Int_t)( id - ( relid[2] - 1 ) * GetNZ() ) ; - } - return rv ; + AliFatal(Form("Please use GetGlobalPHOS(recPoint,gpos) instead of GetGlobal!")); } //____________________________________________________________________________ -void AliPHOSGeometry::GetGlobal(const AliRecPoint* recPoint, TVector3 & gpos) const +void AliPHOSGeometry::GetGlobalPHOS(const AliPHOSRecPoint* recPoint, TVector3 & gpos) const { // Calculates the coordinates of a RecPoint and the error matrix in the ALICE global coordinate system - AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) recPoint ; + const AliPHOSRecPoint * tmpPHOS = recPoint ; TVector3 localposition ; tmpPHOS->GetLocalPosition(gpos) ; @@ -280,347 +249,34 @@ void AliPHOSGeometry::GetGlobal(const AliRecPoint* recPoint, TVector3 & gpos) co char path[100] ; Double_t dy ; if(tmpPHOS->IsEmc()){ - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",tmpPHOS->GetPHOSMod()) ; - //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() ; - dy=-inthermo[1]+strip[1]+splate[1]+crystal[1]-fGeometryEMCA->GetAirGapLed()/2.+pin[1]+preamp[1] ; + TString spath="/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1"; + snprintf(path,spath.Length(),spath.Data(),tmpPHOS->GetPHOSMod()) ; +// sprintf(path,"/ALIC_1/PHOS_%d",tmpPHOS->GetPHOSMod()) ; + dy=fCrystalShift ; } else{ - sprintf(path,"/ALIC_1/PHOS_%d/PCPV_1",tmpPHOS->GetPHOSMod()) ; + TString spath="/ALIC_1/PHOS_%d/PCPV_1"; + snprintf(path,spath.Length(),spath.Data(),tmpPHOS->GetPHOSMod()) ; dy= GetCPVBoxSize(1)/2. ; //center of CPV module } Double_t pos[3]={gpos.X(),gpos.Y()-dy,gpos.Z()} ; - Double_t posC[3]; + if(tmpPHOS->IsEmc()) + pos[2]=-pos[2] ; //Opposite z directions in EMC matrix and local frame!!! + Double_t posC[3] = {}; //now apply possible shifts and rotations if (!gGeoManager->cd(path)){ AliFatal("Geo manager can not find path \n"); } TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(pos,posC); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - if(tmpPHOS->IsEmc()) - gpos.SetXYZ(posC[0],posC[1],-posC[2]) ; - else - gpos.SetXYZ(posC[0],posC[1],posC[2]) ; - -} -//____________________________________________________________________________ -void AliPHOSGeometry::ImpactOnEmc(Double_t * vtx, Double_t theta, Double_t phi, - Int_t & moduleNumber, Double_t & z, Double_t & x) const -{ - // calculates the impact coordinates on PHOS of a neutral particle - // emitted in the vertex vtx[3] with direction theta and phi in the ALICE global coordinate system - TVector3 p(TMath::Sin(theta)*TMath::Cos(phi),TMath::Sin(theta)*TMath::Sin(phi),TMath::Cos(theta)) ; - TVector3 v(vtx[0],vtx[1],vtx[2]) ; - - //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() ; - Float_t dy=-inthermo[1]+strip[1]+splate[1]+crystal[1]-fGeometryEMCA->GetAirGapLed()/2.+pin[1]+preamp[1] ; - - if (!gGeoManager){ - AliFatal("Geo manager not initialized\n"); - } - - for(Int_t imod=1; imod<=GetNModules() ; imod++){ - //create vector from (0,0,0) to center of crystal surface of imod module - Double_t tmp[3]={0.,-dy,0.} ; - - char path[100] ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",imod) ; - if (!gGeoManager->cd(path)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - Double_t posG[3]={0.,0.,0.} ; - if (m) m->LocalToMaster(tmp,posG); - TVector3 n(posG[0],posG[1],-posG[2]) ; - Double_t direction=n.Dot(p) ; - if(direction<=0.) - continue ; //momentum directed FROM module - Double_t fr = (n.Mag2()-n.Dot(v))/direction ; - //Calculate direction in module plain - n-=v+fr*p ; - n*=-1. ; -n.Print() ; - Float_t * sz = fGeometryEMCA->GetInnerThermoHalfSize() ; //Wery close to the zise of the Xtl set - if(TMath::Abs(TMath::Abs(n.Z())Vx(),particle->Vy(),particle->Vz()} ; - Double_t z,x; - ImpactOnEmc(vtx,particle->Theta(),particle->Phi(),moduleNumber,z,x); - if(moduleNumber!=0) - in=kTRUE; - return in; -} - -//____________________________________________________________________________ -Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * relid, Int_t & AbsId) const -{ - // Converts the relative numbering into the absolute numbering - // EMCA crystals: - // AbsId = from 1 to fNModules * fNPhi * fNZ - // CPV pad: - // AbsId = from N(total PHOS crystals) + 1 - // to NCPVModules * fNumberOfCPVPadsPhi * fNumberOfCPVPadsZ - - Bool_t rv = kTRUE ; - - if ( relid[1] == 0 ) { // it is a Phos crystal - AbsId = - ( relid[0] - 1 ) * GetNPhi() * GetNZ() // the offset of PHOS modules - + ( relid[2] - 1 ) * GetNZ() // the offset along phi - + relid[3] ; // the offset along z - } - else { // it is a CPV pad - AbsId = GetNPhi() * GetNZ() * GetNModules() // the offset to separate EMCA crystals from CPV pads - + ( relid[0] - 1 ) * GetNumberOfCPVPadsPhi() * GetNumberOfCPVPadsZ() // the pads offset of PHOS modules - + ( relid[2] - 1 ) * GetNumberOfCPVPadsZ() // the pads offset of a CPV row - + relid[3] ; // the column number - } - - return rv ; -} - -//____________________________________________________________________________ -void AliPHOSGeometry::RelPosInAlice(Int_t id, TVector3 & pos ) const -{ - // Converts the absolute numbering into the global ALICE coordinate system - - if (!gGeoManager){ - AliFatal("Geo manager not initialized\n"); - } - - Int_t relid[4] ; - - AbsToRelNumbering(id , relid) ; - - //construct module name - char path[100] ; - if(relid[1]==0){ //this is EMC - - Float_t * xls = fGeometryEMCA->GetCrystalHalfSize() ; - Double_t ps[3]= {0.0,-xls[1],0.}; //Position incide the crystal - Double_t psC[3]={0.0,0.0,0.}; //Global position - - //Shift and possibly apply misalignment corrections - Int_t nCellsInStrip=fGeometryEMCA->GetNCellsXInStrip() ; - Int_t strip=1+(relid[3]-1)/fGeometryEMCA->GetNCellsZInStrip()+((relid[2]-1)/nCellsInStrip)*fGeometryEMCA->GetNStripZ() ; - Int_t cell=fGeometryEMCA->GetNCellsZInStrip()*(1+(relid[2]-1)%nCellsInStrip)-(relid[3]-1)%fGeometryEMCA->GetNCellsZInStrip() ; - 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)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(ps,psC); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - pos.SetXYZ(psC[0],psC[1],-psC[2]) ; - } - else{ - //first calculate position with respect to CPV plain - Int_t row = relid[2] ; //offset along x axis - Int_t column = relid[3] ; //offset along z axis - Double_t ps[3]= {0.0,GetCPVBoxSize(1)/2.,0.}; //Position on top of CPV - Double_t psC[3]={0.0,0.0,0.}; //Global position - pos[0] = - ( GetNumberOfCPVPadsPhi()/2. - row - 0.5 ) * GetPadSizePhi() ; // position of pad with respect - pos[2] = - ( GetNumberOfCPVPadsZ() /2. - column - 0.5 ) * GetPadSizeZ() ; // 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)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(ps,psC); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - pos.SetXYZ(psC[0],psC[1],-psC[2]) ; - } -} - -//____________________________________________________________________________ -void AliPHOSGeometry::RelPosToAbsId(Int_t module, Double_t x, Double_t z, Int_t & AbsId) const -{ - // converts local PHOS-module (x, z) coordinates to absId - - //find Global position - if (!gGeoManager){ - AliFatal("Geo manager not initialized\n"); - } - Int_t relid[4] ; - char path[100] ; - sprintf(path,"/ALIC_1/PHOS_%d/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1",module) ; - Double_t lpos[3]={x,0.0,z} ; - Double_t gpos[3]={0.,0.,0.} ; - if (!gGeoManager->cd(path)){ - AliFatal("Geo manager can not find path \n"); + if (m){ + m->LocalToMaster(pos,posC); } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(lpos,gpos); else{ AliFatal("Geo matrixes are not loaded \n") ; } - gGeoManager->FindNode(gpos[0],gpos[1],gpos[2]) ; - //Check that path contains PSTR and extract strip number - TString cpath(gGeoManager->GetPath()) ; - Int_t indx = cpath.Index("PCEL") ; - if(indx==-1){ //for the few events when particle hits between srips use ideal geometry - relid[0] = module ; - relid[1] = 0 ; - relid[2] = static_cast(TMath::Ceil( x/ GetCellStep() + GetNPhi() / 2.) ); - relid[3] = static_cast(TMath::Ceil(-z/ GetCellStep() + GetNZ() / 2.) ) ; - if(relid[2]<1)relid[2]=1 ; - if(relid[3]<1)relid[3]=1 ; - if(relid[2]>GetNPhi())relid[2]=GetNPhi() ; - if(relid[3]>GetNZ())relid[3]=GetNZ() ; - } - else{ - Int_t indx2 = cpath.Index("/",indx) ; - if(indx2==-1) - indx2=cpath.Length() ; - TString cell=cpath(indx+5,indx2-indx-5) ; - Int_t icell=cell.Atoi() ; - indx = cpath.Index("PSTR") ; - indx2 = cpath.Index("/",indx) ; - TString strip=cpath(indx+5,indx2-indx-5) ; - Int_t iStrip = strip.Atoi() ; - relid[0] = module ; - relid[1] = 0 ; - Int_t raw = fGeometryEMCA->GetNCellsXInStrip()*((iStrip-1)/fGeometryEMCA->GetNStripZ()) + - 1 + (icell-1)/fGeometryEMCA->GetNCellsZInStrip() ; - Int_t col = fGeometryEMCA->GetNCellsZInStrip()*(1+(iStrip-1)%fGeometryEMCA->GetNStripZ()) - - (icell-1)%fGeometryEMCA->GetNCellsZInStrip() ; - if(col==0) col=GetNZ() ; - relid[2] = raw ; - relid[3] = col ; - } - - RelToAbsNumbering(relid,AbsId) ; -} + gpos.SetXYZ(posC[0],posC[1],posC[2]) ; -//____________________________________________________________________________ -void AliPHOSGeometry::RelPosInModule(const Int_t * relid, Float_t & x, Float_t & z) const -{ - // Converts the relative numbering into the local PHOS-module (x, z) coordinates - // Note: sign of z differs from that in the previous version (Yu.Kharlov, 12 Oct 2000) - - - if (!gGeoManager){ - AliFatal("Geo manager not initialized\n"); - } - //construct module name - char path[100] ; - if(relid[1]==0){ //this is PHOS - -// Calculations using ideal geometry (obsolete) -// x = - ( GetNPhi()/2. - relid[2] + 0.5 ) * GetCellStep() ; // position of Xtal with respect -// z = - ( GetNZ() /2. - relid[3] + 0.5 ) * GetCellStep() ; // of center of PHOS module - - Double_t pos[3]= {0.0,0.0,0.}; //Position incide the crystal (Y coordinalte is not important) - Double_t posC[3]={0.0,0.0,0.}; //Global position - - //Shift and possibly apply misalignment corrections - Int_t nCellsInStrip=fGeometryEMCA->GetNCellsXInStrip() ; - Int_t strip=1+(relid[3]-1)/fGeometryEMCA->GetNCellsZInStrip()+((relid[2]-1)/nCellsInStrip)*fGeometryEMCA->GetNStripZ() ; - Int_t sellRaw = (relid[2]-1)%nCellsInStrip ; - Int_t cell=fGeometryEMCA->GetNCellsZInStrip()*(sellRaw+1) -(relid[3]-1)%fGeometryEMCA->GetNCellsZInStrip() ; - 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)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(pos,posC); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - //Return to PHOS local system - Double_t posL[3]={posC[0],posC[1],posC[2]}; - sprintf(path,"/ALIC_1/PHOS_%d",relid[0]) ; - if (!gGeoManager->cd(path)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posC,posL); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } -//printf("old: x=%f, z=%f \n",x,z); - x=posL[0] ; - z=-posL[1]; -//printf("Geo: x=%f, z=%f \n",x,z); - return ; - } - else{//CPV - //first calculate position with respect to CPV plain - Int_t row = relid[2] ; //offset along x axis - Int_t column = relid[3] ; //offset along z axis - Double_t pos[3]= {0.0,0.0,0.}; //Position incide the CPV printed circuit - Double_t posC[3]={0.0,0.0,0.}; //Global position - pos[0] = - ( GetNumberOfCPVPadsPhi()/2. - row - 0.5 ) * GetPadSizePhi() ; // position of pad with respect - pos[2] = - ( GetNumberOfCPVPadsZ() /2. - column - 0.5 ) * GetPadSizeZ() ; // 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)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); - if (m) m->LocalToMaster(pos,posC); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - //Return to PHOS local system - Double_t posL[3]={0.,0.,0.,} ; - sprintf(path,"/ALIC_1/PHOS_%d",relid[0]) ; - if (!gGeoManager->cd(path)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posC,posL); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - x=posL[0] ; - z=posL[1]; - return ; - - } - } - //____________________________________________________________________________ void AliPHOSGeometry::GetModuleCenter(TVector3& center, @@ -641,71 +297,3 @@ void AliPHOSGeometry::GetModuleCenter(TVector3& center, center.SetXYZ(rDet*TMath::Cos(angle), rDet*TMath::Sin(angle), 0.); } -//____________________________________________________________________________ - -void AliPHOSGeometry::Global2Local(TVector3& localPosition, - const TVector3& globalPosition, - Int_t module) const -{ - // Transforms a global position of the rec.point to the local coordinate system - //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",module) ; - if (!gGeoManager->cd(path)){ - AliFatal("Geo manager can not find path \n"); - } - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->MasterToLocal(posG,posL); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - localPosition.SetXYZ(posL[0],posL[1],posL[2]) ; - -/* - Float_t angle = GetPHOSAngle(module); // (40,20,0,-20,-40) degrees - angle *= TMath::Pi()/180; - angle += 3*TMath::Pi()/2.; - localPosition = globalPosition; - localPosition.RotateZ(-angle); -*/ -} -//____________________________________________________________________________ -void AliPHOSGeometry::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)){ - AliFatal("Geo manager can not find path \n"); - } - //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() ; - Float_t dy=-inthermo[1]+strip[1]+splate[1]+crystal[1]-fGeometryEMCA->GetAirGapLed()/2.+pin[1]+preamp[1] ; - Double_t posL[3]={x,dy,z} ; - Double_t posG[3] ; - TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix(); - if (mPHOS) mPHOS->LocalToMaster(posL,posG); - else{ - AliFatal("Geo matrixes are not loaded \n") ; - } - globalPosition.SetXYZ(posG[0],posG[1],-posG[2]) ; - - -} -//____________________________________________________________________________ -void AliPHOSGeometry::GetIncidentVector(TVector3 &vtx, Int_t module, Float_t x,Float_t z, TVector3 &vInc) const { - //Calculates vector pointing from vertex to current poisition in module local frame - - TVector3 global ; - Local2Global(module,x,z,global) ; - global-=vtx ; - Global2Local(vInc,global,module) ; - -}