First attempt to use systemtically TFolders: the geometry object posts itself to...
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGeometry.cxx
index bb9c4c0..35fd78b 100644 (file)
@@ -30,6 +30,8 @@
 
 #include "TVector3.h"
 #include "TRotation.h" 
+#include "TFolder.h" 
+#include "TROOT.h" 
 
 // --- Standard library ---
 
 // --- AliRoot header files ---
 
 #include "AliPHOSGeometry.h"
+#include "AliPHOSEMCAGeometry.h" 
 #include "AliPHOSPpsdRecPoint.h"
 #include "AliConst.h"
 
 ClassImp(AliPHOSGeometry) ;
 
+// these initialisations are needed for a singleton
 AliPHOSGeometry * AliPHOSGeometry::fgGeom = 0 ;
 Bool_t            AliPHOSGeometry::fgInit = kFALSE ;
 
@@ -54,24 +58,44 @@ AliPHOSGeometry::~AliPHOSGeometry(void)
   if (fRotMatrixArray) fRotMatrixArray->Delete() ; 
   if (fRotMatrixArray) delete fRotMatrixArray ; 
   if (fPHOSAngle     ) delete fPHOSAngle ; 
-//    if (fGeometryEMCA  ) detete fGeometryEMCA;
-//    if (fGeometryCPV   ) detete fGeometryCPV ;
 }
 
 //____________________________________________________________________________
 
 void AliPHOSGeometry::Init(void)
 {
-  // Initializes the PHOS parameters
-
-  if ( ((strcmp( fName, "default" )) == 0) || 
-       ((strcmp( fName, "GPS2" ))    == 0) ||
-       ((strcmp( fName, "IHEP" ))    == 0) ) {
+  // Initializes the PHOS parameters :
+  //  IHEP is the Protvino CPV (cathode pad chambers)
+  //  GPS2 is the Subatech Pre-Shower (two micromegas sandwiching a passive lead converter)
+  //  MIXT 4 PHOS modules withe the IHEP CPV qnd one PHOS module with the Subatche Pre-Shower
+
+  if ( ((strcmp( fName, "GPS2" ))    == 0) ||
+       ((strcmp( fName, "IHEP" ))    == 0) ||
+       ((strcmp( fName, "MIXT" ))    == 0) ) {
     fgInit     = kTRUE ; 
-                                             fGeometryEMCA = new AliPHOSEMCAGeometry();
-    if ( ((strcmp( fName, "GPS2" ))  == 0) ) fGeometryCPV  = new AliPHOSPPSDGeometry();
-    if ( ((strcmp( fName, "IHEP" ))  == 0) ) fGeometryCPV  = new AliPHOSCPVGeometry ();
-    fNModules = 5;
+
+    fNModules     = 5;
+    fNPPSDModules = 0;
+    fAngle        = 20;
+
+      fGeometryEMCA = new AliPHOSEMCAGeometry();
+    if      ( ((strcmp( fName, "GPS2" ))  == 0) ) {
+      fGeometryPPSD = new AliPHOSPPSDGeometry();
+      fGeometryCPV  = 0;
+      fNPPSDModules = fNModules;
+    }
+    else if ( ((strcmp( fName, "IHEP" ))  == 0) ) {
+      fGeometryCPV  = new AliPHOSCPVGeometry ();
+      fGeometryPPSD = 0;
+      fNPPSDModules = 0;
+    }
+    else if ( ((strcmp( fName, "MIXT" ))  == 0) ) {
+      fGeometryCPV  = new AliPHOSCPVGeometry ();
+      fGeometryPPSD = new AliPHOSPPSDGeometry();
+      fNPPSDModules = 1;
+    }
+      fGeometrySUPP = new AliPHOSSupportGeometry();
+
     fPHOSAngle = new Float_t[fNModules] ;
     Int_t index ;
     for ( index = 0; index < fNModules; index++ )
@@ -79,17 +103,41 @@ void AliPHOSGeometry::Init(void)
 
     this->SetPHOSAngles() ; 
     fRotMatrixArray = new TObjArray(fNModules) ; 
+
+    // post the geometry into the appropriate folder
+    //  get the alice folder
+    TFolder * alice = (TFolder*)gROOT->GetListOfBrowsables()->FindObject("YSAlice") ;
+    //  the folder that contains the alarms for PHOS   
+    TFolder * folder = (TFolder*)alice->FindObject("folders/Geometry/PHOS");   
+    folder->SetOwner() ;
+    folder->Add(this) ; 
+  }
+  else {
+    fgInit = kFALSE ; 
+    cout << "PHOS Geometry setup: option not defined " << fName << endl ; 
   }
- else {
-   fgInit = kFALSE ; 
-   cout << "PHOS Geometry setup: option not defined " << fName << endl ; 
- }
 }
 
 //____________________________________________________________________________
+Float_t AliPHOSGeometry::GetCPVBoxSize(Int_t index)  const
+{
+  // returns the coarse dimension CPV depending on the CPV option set
+  
+    if      (strcmp(fName,"GPS2") ==0 ) 
+      return fGeometryPPSD->GetCPVBoxSize(index);
+    else if (strcmp(fName,"IHEP")==0) 
+      return fGeometryCPV ->GetCPVBoxSize(index);
+    else if (strcmp(fName,"MIXT")==0) 
+      return TMath::Max(fGeometryCPV ->GetCPVBoxSize(index), fGeometryPPSD->GetCPVBoxSize(index));
+    else                              
+      return 0;
+}  
+
+//____________________________________________________________________________
 AliPHOSGeometry *  AliPHOSGeometry::GetInstance() 
 { 
-  // Returns the pointer of the unique instance
+  // Returns the pointer of the unique instance; singleton specific
+  
   return (AliPHOSGeometry *) fgGeom ; 
 }
 
@@ -97,6 +145,8 @@ AliPHOSGeometry *  AliPHOSGeometry::GetInstance()
 AliPHOSGeometry *  AliPHOSGeometry::GetInstance(const Text_t* name, const Text_t* title) 
 {
   // Returns the pointer of the unique instance
+  // Creates it with the specified options (name, title) if it does not exist yet
+
   AliPHOSGeometry * rv = 0  ; 
   if ( fgGeom == 0 ) {
     if ( strcmp(name,"") == 0 ) 
@@ -126,14 +176,16 @@ AliPHOSGeometry *  AliPHOSGeometry::GetInstance(const Text_t* name, const Text_t
 //____________________________________________________________________________
 void AliPHOSGeometry::SetPHOSAngles() 
 { 
-  // Calculates the position in ALICE of the PHOS modules
+  // Calculates the position of the PHOS modules in ALICE global coordinate system
   
   Double_t const kRADDEG = 180.0 / kPI ;
-  Float_t pphi =  TMath::ATan( GetOuterBoxSize(0)  / ( 2.0 * GetIPtoOuterCoverDistance() ) ) ;
+  Float_t pphi =  2 * TMath::ATan( GetOuterBoxSize(0)  / ( 2.0 * GetIPtoOuterCoverDistance() ) ) ;
   pphi *= kRADDEG ;
+  if (pphi > fAngle) cout << "AliPHOSGeometry: PHOS modules overlap!\n";
+  pphi = fAngle;
   
   for( Int_t i = 1; i <= fNModules ; i++ ) {
-    Float_t angle = pphi * 2 * ( i - fNModules / 2.0 - 0.5 ) ;
+    Float_t angle = pphi * ( i - fNModules / 2.0 - 0.5 ) ;
     fPHOSAngle[i-1] = -  angle ;
   } 
 }
@@ -167,11 +219,34 @@ Bool_t AliPHOSGeometry::AbsToRelNumbering(const Int_t AbsId, Int_t * relid)
     }
     else if ( strcmp(fName,"IHEP") == 0 ) {
       id -=  GetNPhi() * GetNZ() *  GetNModules() ; 
-      relid[0] = (Int_t) TMath::Ceil( id / ( GetNumberOfPadsPhi() * GetNumberOfPadsZ() ) ) ;
+      Float_t nCPV  = GetNumberOfCPVPadsPhi() * GetNumberOfCPVPadsZ() ;
+      relid[0] = (Int_t) TMath::Ceil( id / nCPV ) ;
       relid[1] = 1 ;
-      id -= ( relid[0] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ()  ; 
-      relid[2] = (Int_t) TMath::Ceil( id / GetNumberOfPadsZ() ) ;
-      relid[3] = (Int_t) ( id - ( relid[2] - 1 ) * GetNumberOfPadsZ() ) ; 
+      id -= ( relid[0] - 1 ) * nCPV ; 
+      relid[2] = (Int_t) TMath::Ceil( id / GetNumberOfCPVPadsZ() ) ;
+      relid[3] = (Int_t) ( id - ( relid[2] - 1 ) * GetNumberOfCPVPadsZ() ) ; 
+    }
+    else if ( strcmp(fName,"MIXT") == 0 ) {
+      id -=  GetNPhi() * GetNZ() *  GetNModules() ; 
+      Float_t nPPSD = 2 * GetNumberOfModulesPhi() * GetNumberOfModulesZ() *  GetNumberOfPadsPhi() * GetNumberOfPadsZ() ; 
+      Float_t nCPV  = GetNumberOfCPVPadsPhi() * GetNumberOfCPVPadsZ() ;
+      if (id <= nCPV*GetNCPVModules()) { // this pad belons to CPV
+       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 {                             // this pad belons to PPSD
+       id -= nCPV*GetNCPVModules();
+       relid[0] = (Int_t)TMath::Ceil( id / nPPSD ); 
+       id -= ( relid[0] - 1 ) * nPPSD ;
+       relid[0] += GetNCPVModules();
+       relid[1] = (Int_t)TMath::Ceil( id / ( GetNumberOfPadsPhi() * GetNumberOfPadsZ() ) ) ; 
+       id -= ( relid[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ() ;
+       relid[2] = (Int_t)TMath::Ceil( id / GetNumberOfPadsPhi() ) ;
+       relid[3] = (Int_t) ( id - ( relid[2] - 1 )  * GetNumberOfPadsPhi() ) ; 
+      }
     }
   } 
   else { // its a PW04 crystal
@@ -188,7 +263,7 @@ Bool_t AliPHOSGeometry::AbsToRelNumbering(const Int_t AbsId, Int_t * relid)
 //____________________________________________________________________________  
 void AliPHOSGeometry::EmcModuleCoverage(const Int_t mod, Double_t & tm, Double_t & tM, Double_t & pm, Double_t & pM, Option_t * opt) 
 {
-  // calculates the angular coverage in theta and phi of a EMC module
+  // calculates the angular coverage in theta and phi of one EMC (=PHOS) module
 
  Double_t conv ; 
   if ( opt == Radian() ) 
@@ -222,7 +297,7 @@ void AliPHOSGeometry::EmcModuleCoverage(const Int_t mod, Double_t & tm, Double_t
 //____________________________________________________________________________  
 void AliPHOSGeometry::EmcXtalCoverage(Double_t & theta, Double_t & phi, Option_t * opt) 
 {
-  // calculates the angular coverage in theta and phi of a single crystal in a EMC module
+  // calculates the angular coverage in theta and phi of a single crystal in a EMC(=PHOS) module
 
   Double_t conv ; 
   if ( opt == Radian() ) 
@@ -244,7 +319,7 @@ void AliPHOSGeometry::EmcXtalCoverage(Double_t & theta, Double_t & phi, Option_t
 //____________________________________________________________________________
 void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos, TMatrix & gmat) const
 {
-  // Calculates the ALICE global coordinates of a RecPoint and the error matrix
+  // Calculates the coordinates of a RecPoint and the error matrix in the ALICE global coordinate system
  
   AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;  
   TVector3 localposition ;
@@ -285,7 +360,7 @@ void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos, TM
 //____________________________________________________________________________
 void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos) const 
 {
-  // Calculates the ALICE global coordinates of a RecPoint 
+  // Calculates the coordinates of a RecPoint in the ALICE global coordinate system 
 
   AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;  
   TVector3 localposition ;
@@ -323,8 +398,8 @@ void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos) co
 //____________________________________________________________________________
 void AliPHOSGeometry::ImpactOnEmc(const Double_t theta, const Double_t phi, Int_t & ModuleNumber, Double_t & z, Double_t & x) 
 {
-  // calculates the impact coordinates of a neutral particle  
-  // emitted in direction theta and phi in ALICE
+  // calculates the impact coordinates on PHOS of a neutral particle  
+  // emitted in the direction theta and phi in the ALICE global coordinate system
 
   // searches for the PHOS EMC module
   ModuleNumber = 0 ; 
@@ -351,21 +426,36 @@ void AliPHOSGeometry::ImpactOnEmc(const Double_t theta, const Double_t phi, Int_
 Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * relid, Int_t &  AbsId)
 {
   // Converts the relative numbering into the absolute numbering
-  //  AbsId = 1 to fNModules * fNPhi * fNZ                                                                       -> PbWO4
-  //  AbsId = N(total PHOS crystals) +
-  //          1 to fNModules * 2 * (fNumberOfModulesPhi * fNumberOfModulesZ) * fNumberOfPadsPhi * fNumberOfPadsZ -> PPSD
-  //  AbsId = N(total PHOS crystals) +
-  //          1:fNModules * fNumberOfCPVPadsPhi * fNumberOfCPVPadsZ                                              -> CPV
+  // EMCA crystals:
+  //  AbsId = from 1 to fNModules * fNPhi * fNZ
+  // PPSD gas cell:
+  //  AbsId = from N(total EMCA crystals) + 1
+  //          to NCPVModules * fNumberOfCPVPadsPhi * fNumberOfCPVPadsZ +
+  //          fNModules * 2 * (fNumberOfModulesPhi * fNumberOfModulesZ) * fNumberOfPadsPhi * fNumberOfPadsZ
+  // CPV pad:
+  //  AbsId = from N(total PHOS crystals) + 1
+  //          to NCPVModules * fNumberOfCPVPadsPhi * fNumberOfCPVPadsZ
 
   Bool_t rv = kTRUE ; 
  
-  if      ( relid[1]  >  0 ) { // it is a PPSD pad
-    AbsId =    GetNPhi() * GetNZ() *  GetNModules()                          // the offset to separate EMCA crystals from PPSD pads
-      + ( relid[0] - 1 ) * GetNumberOfModulesPhi() * GetNumberOfModulesZ()   // the pads offset of PHOS modules 
+  if      ( relid[1] > 0 && strcmp(fName,"GPS2")==0) { // it is a PPSD pad
+    AbsId =    GetNPhi() * GetNZ() * GetNModules()                         // the offset to separate EMCA crystals from PPSD pads
+      + ( relid[0] - 1 ) * GetNumberOfModulesPhi() * GetNumberOfModulesZ() // the pads offset of PPSD modules 
                          * GetNumberOfPadsPhi() * GetNumberOfPadsZ() * 2
-      + ( relid[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ()         // the pads offset of PPSD modules 
-      + ( relid[2] - 1 ) * GetNumberOfPadsPhi()                              // the pads offset of a PPSD row
-      +   relid[3] ;                                                         // the column number
+      + ( relid[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ()       // the pads offset of PPSD modules 
+      + ( relid[2] - 1 ) * GetNumberOfPadsPhi()                            // the pads offset of a PPSD row
+      +   relid[3] ;                                                       // the column number
+  } 
+
+  else if ( relid[1] > 0 && strcmp(fName,"MIXT")==0) { // it is a PPSD pad
+    AbsId =    GetNPhi() * GetNZ() * GetNModules()                         // the offset to separate EMCA crystals from PPSD pads
+      + GetNCPVModules() * GetNumberOfCPVPadsPhi() * GetNumberOfCPVPadsZ() // the pads offset of CPV modules if any
+      + ( relid[0] - 1 - GetNCPVModules())
+                         * GetNumberOfModulesPhi() * GetNumberOfModulesZ() // the pads offset of PPSD modules 
+                         * GetNumberOfPadsPhi() * GetNumberOfPadsZ() * 2
+      + ( relid[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ()       // the pads offset of PPSD modules 
+      + ( relid[2] - 1 ) * GetNumberOfPadsPhi()                            // the pads offset of a PPSD row
+      +   relid[3] ;                                                       // the column number
   } 
 
   else if ( relid[1] ==  0 ) { // it is a Phos crystal
@@ -377,8 +467,8 @@ Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * relid, Int_t &  AbsId)
 
   else if ( relid[1] == -1 ) { // it is a CPV pad
     AbsId =    GetNPhi() * GetNZ() *  GetNModules()                          // the offset to separate EMCA crystals from CPV pads
-      + ( relid[0] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ()         // the pads offset of PHOS modules 
-      + ( relid[2] - 1 ) * GetNumberOfPadsZ()                                // the pads offset of a CPV row
+      + ( 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
   }
   
@@ -389,57 +479,57 @@ Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * relid, Int_t &  AbsId)
 
 void AliPHOSGeometry::RelPosInAlice(const Int_t id, TVector3 & pos ) 
 {
-  // Converts the absolute numbering into the global ALICE coordinates
+  // Converts the absolute numbering into the global ALICE coordinate system
+  // It works only for the GPS2 geometry
   
-   if (id > 0) { 
-
-  Int_t relid[4] ;
-  AbsToRelNumbering(id , relid) ;
-
-  Int_t phosmodule = relid[0] ; 
-
-  Float_t y0 = 0 ; 
-
-  if ( relid[1] == 0 ) // it is a PbW04 crystal 
-  {  y0 =  -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness()
-      + GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness())  ;  
-  }
-  if ( relid[1] > 0 ) { // its a PPSD pad
-    if ( relid[1] >  GetNumberOfModulesPhi() *  GetNumberOfModulesZ() ) // its an bottom module
-     {
-       y0 = -( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0)  ;
-     } 
-    else // its an upper module
-      y0 = -( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() - GetLeadToMicro2Gap()
-       -  GetLeadConverterThickness() -  GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0) ; 
-  }
-
-  Float_t x, z ; 
-  RelPosInModule(relid, x, z) ; 
-
-  pos.SetX(x) ;
-  pos.SetZ(z) ;
-  pos.SetY( TMath::Sqrt(x*x + z*z + y0*y0) ) ; 
-
-
-
-   Float_t phi           = GetPHOSAngle( phosmodule) ; 
-   Double_t const kRADDEG = 180.0 / kPI ;
-   Float_t rphi          = phi / kRADDEG ; 
-
-   TRotation rot ;
-   rot.RotateZ(-rphi) ; // a rotation around Z by angle  
-  
-   TRotation dummy = rot.Invert() ;  // to transform from original frame to rotate frame
-  
-   pos.Transform(rot) ; // rotate the baby 
+  if (id > 0 && strcmp(fName,"GPS2")==0) { 
+    
+    Int_t relid[4] ;
+    
+    AbsToRelNumbering(id , relid) ;
+    
+    Int_t phosmodule = relid[0] ; 
+    
+    Float_t y0 = 0 ; 
+    
+    if ( relid[1] == 0 ) { // it is a PbW04 crystal 
+      y0 =  -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness()
+             + GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness())  ;  
+    }
+    if ( relid[1] > 0 ) { // its a PPSD pad
+      if ( relid[1] >  GetNumberOfModulesPhi() *  GetNumberOfModulesZ() ) { // its an bottom module
+       y0 = -( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0)  ;
+      } 
+      else // its an upper module
+       y0 = -( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() - GetLeadToMicro2Gap()
+               -  GetLeadConverterThickness() -  GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0) ; 
+    }
+    
+    Float_t x, z ; 
+    RelPosInModule(relid, x, z) ; 
+    
+    pos.SetX(x) ;
+    pos.SetZ(z) ;
+    pos.SetY( TMath::Sqrt(x*x + z*z + y0*y0) ) ; 
+    
+    
+    
+    Float_t phi           = GetPHOSAngle( phosmodule) ; 
+    Double_t const kRADDEG = 180.0 / kPI ;
+    Float_t rphi          = phi / kRADDEG ; 
+    
+    TRotation rot ;
+    rot.RotateZ(-rphi) ; // a rotation around Z by angle  
+    
+    TRotation dummy = rot.Invert() ;  // to transform from original frame to rotate frame
+    
+    pos.Transform(rot) ; // rotate the baby 
   }
   else {
- pos.SetX(0.);
- pos.SetY(0.);
- pos.SetZ(0.);
-       }
+    pos.SetX(0.);
+    pos.SetY(0.);
+    pos.SetZ(0.);
+  }
 } 
 
 //____________________________________________________________________________
@@ -447,34 +537,53 @@ void AliPHOSGeometry::RelPosInModule(const Int_t * relid, Float_t & x, Float_t &
 {
   // 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)
+
+  Bool_t padOfCPV  = (strcmp(fName,"IHEP")==0) ||
+                    ((strcmp(fName,"MIXT")==0) && relid[0]<=GetNCPVModules()) ;
+  Bool_t padOfPPSD = (strcmp(fName,"GPS2")==0) ||
+                    ((strcmp(fName,"MIXT")==0) && relid[0]> GetNCPVModules()) ;
   
   Int_t ppsdmodule  ; 
   Float_t x0,z0;
   Int_t row        = relid[2] ; //offset along x axiz
   Int_t column     = relid[3] ; //offset along z axiz
 
-  Float_t padsizeZ = GetPadSizeZ();
-  Float_t padsizeX = GetPadSizePhi();
-
+  Float_t padsizeZ = 0;
+  Float_t padsizeX = 0;
+  Int_t   nOfPadsPhi = 0;
+  Int_t   nOfPadsZ   = 0;
+  if      ( padOfPPSD ) {
+    padsizeZ   = GetPPSDModuleSize(2) / GetNumberOfPadsZ();
+    padsizeX   = GetPPSDModuleSize(0) / GetNumberOfPadsPhi();
+    nOfPadsPhi = GetNumberOfPadsPhi();
+    nOfPadsZ   = GetNumberOfPadsZ();
+  }
+  else if ( padOfCPV  ) {
+    padsizeZ   = GetPadSizeZ();
+    padsizeX   = GetPadSizePhi();
+    nOfPadsPhi = GetNumberOfCPVPadsPhi();
+    nOfPadsZ   = GetNumberOfCPVPadsZ();
+  }
+  
   if ( relid[1] == 0 ) { // its a PbW04 crystal 
     x = - ( GetNPhi()/2. - row    + 0.5 ) *  GetCrystalSize(0) ; // position ox Xtal with respect
     z =   ( GetNZ()  /2. - column + 0.5 ) *  GetCrystalSize(2) ; // of center of PHOS module  
   }  
   else  {    
-    if ( relid[1] >  GetNumberOfModulesPhi() *  GetNumberOfModulesZ() )
-      ppsdmodule =  relid[1]-GetNumberOfModulesPhi() *  GetNumberOfModulesZ(); 
-    else
-      ppsdmodule =  relid[1] ;
-    Int_t modrow = 1+(Int_t)TMath::Ceil( (Float_t)ppsdmodule / GetNumberOfModulesPhi()-1. ) ; 
-    Int_t modcol = ppsdmodule -  ( modrow - 1 ) * GetNumberOfModulesPhi() ;     
-    if ( ((strcmp( fName, "GPS2" ))  == 0) ) {
+    if ( padOfPPSD ) {
+      if ( relid[1] >  GetNumberOfModulesPhi() *  GetNumberOfModulesZ() )
+       ppsdmodule =  relid[1]-GetNumberOfModulesPhi() *  GetNumberOfModulesZ(); 
+      else
+       ppsdmodule =  relid[1] ;
+      Int_t modrow = 1+(Int_t)TMath::Ceil( (Float_t)ppsdmodule / GetNumberOfModulesPhi()-1. ) ; 
+      Int_t modcol = ppsdmodule -  ( modrow - 1 ) * GetNumberOfModulesPhi() ;     
       x0 = (  GetNumberOfModulesPhi() / 2.  - modrow  + 0.5 ) * GetPPSDModuleSize(0) ;
       z0 = (  GetNumberOfModulesZ()   / 2.  - modcol  + 0.5 ) * GetPPSDModuleSize(2)  ;     
     } else {
       x0 = 0;
       z0 = 0;
     }
-    x = - ( GetNumberOfPadsPhi()/2. - row    - 0.5 ) * padsizeX + x0 ; // position of pad  with respect
-    z =   ( GetNumberOfPadsZ()  /2. - column - 0.5 ) * padsizeZ - z0 ; // of center of PHOS module  
+    x = - ( nOfPadsPhi/2. - row    - 0.5 ) * padsizeX + x0 ; // position of pad  with respect
+    z =   ( nOfPadsZ  /2. - column - 0.5 ) * padsizeZ - z0 ; // of center of PHOS module  
   }
 }