]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSv0.cxx
Time of samples is read from raw data
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv0.cxx
index c77c2034beaab336325f704ea01adcec9cfc2bef..9fe4743a75a75716b0b8bc171ef10bad09ca867a 100644 (file)
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
 /* $Id$ */
 
+/* History of cvs commits:
+ *
+ * $Log$
+ * Revision 1.83  2006/11/14 17:11:15  hristov
+ * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
+ *
+ * Revision 1.82  2006/09/27 19:55:57  kharlov
+ * Alignment object with symbolic volume names are introduced
+ *
+ * Revision 1.81  2006/03/04 20:25:56  kharlov
+ * Set geom parameters from CDB
+ *
+ * Revision 1.80  2005/06/17 07:39:07  hristov
+ * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
+ *
+ * Revision 1.79  2005/05/28 14:19:05  schutz
+ * Compilation warnings fixed by T.P.
+ *
+ */
+
 //_________________________________________________________________________
 // Implementation version v0 of PHOS Manager class 
-// Layout EMC + PPSD has name GPS2  
 // An object of this class does not produce hits nor digits
 // It is the one to use if you do not want to produce outputs in TREEH or TREED
 //                  
-//*-- Author: Yves Schutz (SUBATECH)
+//*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
 
 
 // --- ROOT system ---
 
-#include "TBRIK.h"
-#include "TNode.h"
-#include "TRandom.h"
-#include "TGeometry.h"
-
+#include <TBRIK.h>
+#include <TFolder.h>
+#include <TGeometry.h>
+#include <TNode.h>
+#include <TROOT.h>
+#include <TRandom.h>
+#include <TTRD1.h>
+#include <TTree.h>
+#include <TVirtualMC.h>
+#include <TGeoManager.h>
 
 // --- Standard library ---
 
-#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#include <strstream.h>
 
 // --- AliRoot header files ---
 
+#include "AliConst.h"
+#include "AliPHOSGeometry.h"
+#include "AliPHOSLoader.h"
 #include "AliPHOSv0.h"
 #include "AliRun.h"
-#include "AliConst.h"
-#include "AliMC.h"
+#include "AliLog.h"
 
 ClassImp(AliPHOSv0)
 
@@ -53,13 +76,7 @@ AliPHOSv0::AliPHOSv0(const char *name, const char *title):
   AliPHOS(name,title)
 {
   // ctor : title is used to identify the layout
-  //        GPS2 = 5 modules (EMC + PPSD)   
-  // gets an instance of the geometry parameters class  
-
-  if (strcmp(GetTitle(),"") != 0 ) 
-    fGeom =  AliPHOSGeometry::GetInstance(GetTitle(), "") ; 
-
+  GetGeometry() ; 
 }
 
 //____________________________________________________________________________
@@ -95,385 +112,72 @@ void AliPHOSv0::BuildGeometry()
     </UL>
   */
   //END_HTML  
-
-  this->BuildGeometryforPHOS() ; 
-  if      ( ( strcmp(fGeom->GetName(), "GPS2" ) == 0 ) ) 
-    this->BuildGeometryforPPSD() ;
-  else if ( ( strcmp(fGeom->GetName(), "IHEP" ) == 0 ) ) 
-    this->BuildGeometryforCPV() ;
-  else
-    cout << "AliPHOSv0::BuildGeometry : no charged particle identification system installed" << endl; 
-
+  
+  this->BuildGeometryforEMC() ; 
+  this->BuildGeometryforCPV() ;
+  
 }
 
 //____________________________________________________________________________
-void AliPHOSv0:: BuildGeometryforPHOS(void)
+void AliPHOSv0:: BuildGeometryforEMC(void)
 {
- // Build the PHOS-EMC geometry for the ROOT display
-
 // Build the PHOS-EMC geometry for the ROOT display
+  
   const Int_t kColorPHOS = kRed ;
   const Int_t kColorXTAL = kBlue ;
-
-  Double_t const kRADDEG = 180.0 / kPI ;
-  new TBRIK( "OuterBox", "PHOS box", "void", fGeom->GetOuterBoxSize(0)/2, 
-                                             fGeom->GetOuterBoxSize(1)/2, 
-                                             fGeom->GetOuterBoxSize(2)/2 );
-
-  // Textolit Wall box, position inside PHOS 
   
-  new TBRIK( "TextolitBox", "PHOS Textolit box ", "void", fGeom->GetTextolitBoxSize(0)/2, 
-                                                          fGeom->GetTextolitBoxSize(1)/2, 
-                                                          fGeom->GetTextolitBoxSize(2)/2);
-
-  // Polystyrene Foam Plate
-
-  new TBRIK( "UpperFoamPlate", "PHOS Upper foam plate", "void", fGeom->GetTextolitBoxSize(0)/2, 
-                                                                fGeom->GetSecondUpperPlateThickness()/2, 
-                                                                fGeom->GetTextolitBoxSize(2)/2 ) ; 
-
-  // Air Filled Box
-  new TBRIK( "AirFilledBox", "PHOS air filled box", "void", fGeom->GetAirFilledBoxSize(0)/2, 
-                                                            fGeom->GetAirFilledBoxSize(1)/2, 
-                                                            fGeom->GetAirFilledBoxSize(2)/2 );
+  Double_t const kRADDEG = 180.0 / TMath::Pi() ;
+  
+  AliPHOSGeometry * geom = GetGeometry() ; 
+  AliPHOSEMCAGeometry * emcg = geom->GetEMCAGeometry() ;
+  Float_t * boxparams = emcg->GetEMCParams() ;
 
+  new TTRD1("OuterBox", "PHOS box", "void",boxparams[0],boxparams[1],boxparams[2], boxparams[3] );
+  
+  
   // Crystals Box
-
-  Float_t xtlX = fGeom->GetCrystalSize(0) ; 
-  Float_t xtlY = fGeom->GetCrystalSize(1) ; 
-  Float_t xtlZ = fGeom->GetCrystalSize(2) ; 
-
-  Float_t xl =  fGeom->GetNPhi() * ( xtlX + 2 * fGeom->GetGapBetweenCrystals() ) / 2.0 + fGeom->GetModuleBoxThickness() ;
-  Float_t yl =  ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() + fGeom->GetCrystalHolderThickness() ) / 2.0 
-             + fGeom->GetModuleBoxThickness() / 2.0 ;
-  Float_t zl =  fGeom->GetNZ() * ( xtlZ + 2 * fGeom->GetGapBetweenCrystals() ) / 2.0 +  fGeom->GetModuleBoxThickness() ;
   
-  new TBRIK( "CrystalsBox", "PHOS crystals box", "void", xl, yl, zl ) ;
-
-// position PHOS into ALICE
-
-  Float_t r = fGeom->GetIPtoOuterCoverDistance() + fGeom->GetOuterBoxSize(1) / 2.0 ;
+  Float_t * cribox = emcg->GetInnerThermoHalfSize() ;  
+  new TBRIK( "CrystalsBox", "PHOS crystals box", "void", cribox[0], cribox[2], cribox[1] ) ;
+  
+  // position PHOS into ALICE
+  
+  Float_t r = geom->GetIPtoOuterCoverDistance() + boxparams[3] ;
   Int_t number = 988 ; 
-  Float_t pphi =  TMath::ATan( fGeom->GetOuterBoxSize(0)  / ( 2.0 * fGeom->GetIPtoOuterCoverDistance() ) ) ;
-  pphi *= kRADDEG ;
   TNode * top = gAlice->GetGeometry()->GetNode("alice") ;
+  
   char * nodename = new char[20] ;  
   char * rotname  = new char[20] ; 
 
-  for( Int_t i = 1; i <= fGeom->GetNModules(); i++ ) { 
-   Float_t angle = pphi * 2 * ( i - fGeom->GetNModules() / 2.0 - 0.5 ) ;
-   sprintf(rotname, "%s%d", "rot", number++) ;
-   new TRotMatrix(rotname, rotname, 90, angle, 90, 90 + angle, 0, 0);
-   top->cd();
-   sprintf(nodename,"%s%d", "Module", i) ;    
-   Float_t x =  r * TMath::Sin( angle / kRADDEG ) ;
-   Float_t y = -r * TMath::Cos( angle / kRADDEG ) ;
-   TNode * outerboxnode = new TNode(nodename, nodename, "OuterBox", x, y, 0, rotname ) ;
-   outerboxnode->SetLineColor(kColorPHOS) ;
-   fNodes->Add(outerboxnode) ;
-   outerboxnode->cd() ; 
-   // now inside the outer box the textolit box
-   y = ( fGeom->GetOuterBoxThickness(1) -  fGeom->GetUpperPlateThickness() ) / 2.  ;
-   sprintf(nodename,"%s%d", "TexBox", i) ;  
-   TNode * textolitboxnode = new TNode(nodename, nodename, "TextolitBox", 0, y, 0) ; 
-   textolitboxnode->SetLineColor(kColorPHOS) ;
-   fNodes->Add(textolitboxnode) ;
-   // upper foam plate inside outre box
-   outerboxnode->cd() ; 
-   sprintf(nodename, "%s%d", "UFPlate", i) ;
-   y =  ( fGeom->GetTextolitBoxSize(1) - fGeom->GetSecondUpperPlateThickness() ) / 2.0 ;
-   TNode * upperfoamplatenode = new TNode(nodename, nodename, "UpperFoamPlate", 0, y, 0) ; 
-   upperfoamplatenode->SetLineColor(kColorPHOS) ;
-   fNodes->Add(upperfoamplatenode) ;  
-   // air filled box inside textolit box (not drawn)
-   textolitboxnode->cd();
-   y = ( fGeom->GetTextolitBoxSize(1) - fGeom->GetAirFilledBoxSize(1) ) / 2.0 -  fGeom->GetSecondUpperPlateThickness() ;
-   sprintf(nodename, "%s%d", "AFBox", i) ;
-   TNode * airfilledboxnode = new TNode(nodename, nodename, "AirFilledBox", 0, y, 0) ; 
-   fNodes->Add(airfilledboxnode) ; 
-   // crystals box inside air filled box
-   airfilledboxnode->cd() ; 
-   y = fGeom->GetAirFilledBoxSize(1) / 2.0 - yl 
-       - ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance() - fGeom->GetModuleBoxThickness() 
-       -  fGeom->GetUpperPlateThickness() -  fGeom->GetSecondUpperPlateThickness() ) ; 
-   sprintf(nodename, "%s%d", "XTBox", i) ; 
-   TNode * crystalsboxnode = new TNode(nodename, nodename, "CrystalsBox", 0, y, 0) ;    
-   crystalsboxnode->SetLineColor(kColorXTAL) ; 
-   fNodes->Add(crystalsboxnode) ; 
-  }
+  new TRotMatrix("cribox", "cribox", 90, 0, 90, 90, 0, 0);  
 
-  delete[] rotname ;  
-  delete[] nodename ;
-}
+  for( Int_t i = 1; i <= geom->GetNModules(); i++ ) { 
 
-//____________________________________________________________________________
-void AliPHOSv0:: BuildGeometryforPPSD(void)
-{
- //  Build the PHOS-PPSD geometry for the ROOT display
- //BEGIN_HTML
-  /*
-    <H2>
-     PPSD displayed by root
-    </H2>
-    <UL>
-    <LI> Zoom on PPSD: Front View
-    <P>
-    <CENTER>
-    <IMG Align=BOTTOM ALT="PPSD Front View" SRC="../images/AliPHOSv0PPSDFrontView.gif"> 
-    </CENTER></P></LI>
-    <LI> Zoom on PPSD: Perspective View
-    <P>
-    <CENTER>
-    <IMG Align=BOTTOM ALT="PPSD Prespective View" SRC="../images/AliPHOSv0PPSDPerspectiveView.gif"> 
-    </CENTER></P></LI>
-    </UL>
-  */
-  //END_HTML  
-  Double_t const kRADDEG = 180.0 / kPI ;
-
-  const Int_t kColorPHOS = kRed ;
-  const Int_t kColorPPSD = kGreen ;
-  const Int_t kColorGas  = kBlue ;  
-  const Int_t kColorAir  = kYellow ; 
-
-  // Box for a full PHOS module
-
-  new TBRIK( "PPSDBox", "PPSD box", "void",  fGeom->GetCPVBoxSize(0)/2, 
-                                             fGeom->GetCPVBoxSize(1)/2, 
-                                            fGeom->GetCPVBoxSize(2)/2 );
-
-  // Box containing one micromegas module 
-
-  new TBRIK( "PPSDModule", "PPSD module", "void",  fGeom->GetPPSDModuleSize(0)/2, 
-                                                   fGeom->GetPPSDModuleSize(1)/2, 
-                                                  fGeom->GetPPSDModuleSize(2)/2 );
- // top lid
+    Float_t angle = geom->GetPHOSAngle(i) ;
+    sprintf(rotname, "%s%d", "rot", number++) ;
+    new TRotMatrix(rotname, rotname, 90, angle, 0,  0,  90,  270 + angle);
 
-  new TBRIK ( "TopLid", "Micromegas top lid", "void",  fGeom->GetPPSDModuleSize(0)/2,
-                                                       fGeom->GetLidThickness()/2,
-                                                       fGeom->GetPPSDModuleSize(2)/2 ) ; 
- // composite panel (top and bottom)
-
-  new TBRIK ( "TopPanel", "Composite top panel", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                                            fGeom->GetCompositeThickness()/2,
-                                                          ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ;  
-  
-  new TBRIK ( "BottomPanel", "Composite bottom panel", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                                                  fGeom->GetCompositeThickness()/2,
-                                                                ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ; 
- // gas gap (conversion and avalanche)
-
-  new TBRIK ( "GasGap", "gas gap", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                           ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() )/2,
-                                            ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ; 
-
- // anode and cathode 
-
-  new TBRIK ( "Anode", "Anode", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                           fGeom->GetAnodeThickness()/2,
-                                         ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ; 
-
-  new TBRIK ( "Cathode", "Cathode", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                               fGeom->GetCathodeThickness()/2,
-                                             ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ; 
- // PC  
-
-  new TBRIK ( "PCBoard", "Printed Circuit", "void",  ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() )/2,
-                                                       fGeom->GetPCThickness()/2,
-                                                     ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() )/2 ) ; 
- // Gap between Lead and top micromegas
-
-  new TBRIK ( "LeadToM", "Air Gap top", "void", fGeom->GetCPVBoxSize(0)/2,
-                                                fGeom->GetMicro1ToLeadGap()/2,
-                                                fGeom->GetCPVBoxSize(2)/2  ) ;  
-// Gap between Lead and bottom micromegas
-
-  new TBRIK ( "MToLead", "Air Gap bottom", "void", fGeom->GetCPVBoxSize(0)/2,
-                                                   fGeom->GetLeadToMicro2Gap()/2,
-                                                   fGeom->GetCPVBoxSize(2)/2  ) ; 
- // Lead converter
-   
-  new TBRIK ( "Lead", "Lead converter", "void", fGeom->GetCPVBoxSize(0)/2,
-                                                fGeom->GetLeadConverterThickness()/2,
-                                                fGeom->GetCPVBoxSize(2)/2  ) ; 
-
-     // position PPSD into ALICE
-
-  char * nodename = new char[20] ;  
-  char * rotname  = new char[20] ; 
-
-  Float_t r = fGeom->GetIPtoTopLidDistance() + fGeom->GetCPVBoxSize(1) / 2.0 ;
-  Int_t number = 988 ; 
-  TNode * top = gAlice->GetGeometry()->GetNode("alice") ;
-  for( Int_t i = 1; i <= fGeom->GetNModules(); i++ ) { // the number of PHOS modules
-    Float_t angle = fGeom->GetPHOSAngle(i) ;
-    sprintf(rotname, "%s%d", "rotg", number++) ;
-    new TRotMatrix(rotname, rotname, 90, angle, 90, 90 + angle, 0, 0);
     top->cd();
-    sprintf(nodename, "%s%d", "Moduleg", i) ;    
+    sprintf(nodename,"%s%d", "Module", i) ;    
     Float_t x =  r * TMath::Sin( angle / kRADDEG ) ;
     Float_t y = -r * TMath::Cos( angle / kRADDEG ) ;
-    TNode * ppsdboxnode = new TNode(nodename , nodename ,"PPSDBox", x, y, 0, rotname ) ;
-    ppsdboxnode->SetLineColor(kColorPPSD) ;
-    fNodes->Add(ppsdboxnode) ;
-    ppsdboxnode->cd() ;
-    // inside the PPSD box: 
-    //   1.   fNumberOfModulesPhi x fNumberOfModulesZ top micromegas
-    x = ( fGeom->GetCPVBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. ;  
-    {
-      for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) { // the number of micromegas modules in phi per PHOS module
-       Float_t z = ( fGeom->GetCPVBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2. ;
-       TNode * micro1node ; 
-       for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) { // the number of micromegas modules in z per PHOS module
-         y = ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas1Thickness() ) / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "Mic1", i, iphi, iz) ;
-         micro1node  = new TNode(nodename, nodename, "PPSDModule", x, y, z) ;
-         micro1node->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(micro1node) ; 
-         // inside top micromegas
-         micro1node->cd() ; 
-         //      a. top lid
-         y = ( fGeom->GetMicromegas1Thickness() - fGeom->GetLidThickness() ) / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "Lid", i, iphi, iz) ;
-         TNode * toplidnode = new TNode(nodename, nodename, "TopLid", 0, y, 0) ;
-         toplidnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(toplidnode) ; 
-         //      b. composite panel
-         y = y - fGeom->GetLidThickness() / 2. - fGeom->GetCompositeThickness() / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "CompU", i, iphi, iz) ;
-         TNode * compupnode = new TNode(nodename, nodename, "TopPanel", 0, y, 0) ;
-         compupnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(compupnode) ; 
-         //      c. anode
-         y = y - fGeom->GetCompositeThickness() / 2. - fGeom->GetAnodeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "Ano", i, iphi, iz) ;
-         TNode * anodenode = new TNode(nodename, nodename, "Anode", 0, y, 0) ;
-         anodenode->SetLineColor(kColorPHOS) ;  
-         fNodes->Add(anodenode) ; 
-         //      d.  gas 
-         y = y - fGeom->GetAnodeThickness() / 2. - ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() ) / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "GGap", i, iphi, iz) ;
-         TNode * ggapnode = new TNode(nodename, nodename, "GasGap", 0, y, 0) ;
-         ggapnode->SetLineColor(kColorGas) ;  
-         fNodes->Add(ggapnode) ;          
-         //      f. cathode
-         y = y - ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() ) / 2. - fGeom->GetCathodeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "Cathode", i, iphi, iz) ;
-         TNode * cathodenode = new TNode(nodename, nodename, "Cathode", 0, y, 0) ;
-         cathodenode->SetLineColor(kColorPHOS) ;  
-         fNodes->Add(cathodenode) ;        
-         //      g. printed circuit
-         y = y - fGeom->GetCathodeThickness() / 2. - fGeom->GetPCThickness()  / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "PC", i, iphi, iz) ;
-         TNode * pcnode = new TNode(nodename, nodename, "PCBoard", 0, y, 0) ;
-         pcnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(pcnode) ;        
-         //      h. composite panel
-         y = y - fGeom->GetPCThickness() / 2. - fGeom->GetCompositeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "CompDown", i, iphi, iz) ;
-         TNode * compdownnode = new TNode(nodename, nodename, "BottomPanel", 0, y, 0) ;
-         compdownnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(compdownnode) ;   
-         z = z - fGeom->GetPPSDModuleSize(2) ;
-         ppsdboxnode->cd() ;
-       } // end of Z module loop     
-       x = x -  fGeom->GetPPSDModuleSize(0) ; 
-       ppsdboxnode->cd() ;
-      } // end of phi module loop
-    }
-    //   2. air gap      
-    ppsdboxnode->cd() ;
-    y = ( fGeom->GetCPVBoxSize(1) - 2 * fGeom->GetMicromegas1Thickness() - fGeom->GetMicro1ToLeadGap() ) / 2. ; 
-    sprintf(nodename, "%s%d", "GapUp", i) ;
-    TNode * gapupnode = new TNode(nodename, nodename, "LeadToM", 0, y, 0) ;
-    gapupnode->SetLineColor(kColorAir) ;  
-    fNodes->Add(gapupnode) ;        
-    //   3. lead converter
-    y = y - fGeom->GetMicro1ToLeadGap() / 2. - fGeom->GetLeadConverterThickness() / 2. ; 
-    sprintf(nodename, "%s%d", "LeadC", i) ;
-    TNode * leadcnode = new TNode(nodename, nodename, "Lead", 0, y, 0) ;
-    leadcnode->SetLineColor(kColorPPSD) ;  
-    fNodes->Add(leadcnode) ;        
-    //   4. air gap
-    y = y - fGeom->GetLeadConverterThickness() / 2. - fGeom->GetLeadToMicro2Gap()  / 2. ; 
-    sprintf(nodename, "%s%d", "GapDown", i) ;
-    TNode * gapdownnode = new TNode(nodename, nodename, "MToLead", 0, y, 0) ;
-    gapdownnode->SetLineColor(kColorAir) ;  
-    fNodes->Add(gapdownnode) ;        
-    //    5.  fNumberOfModulesPhi x fNumberOfModulesZ bottom micromegas
-    x = ( fGeom->GetCPVBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. - fGeom->GetPhiDisplacement() ;  
-    {
-      for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) { 
-       Float_t z = ( fGeom->GetCPVBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2.  - fGeom->GetZDisplacement() ;;
-       TNode * micro2node ; 
-       for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) { 
-         y = - ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas2Thickness() ) / 2. ; 
-         sprintf(nodename, "%s%d%d%d", "Mic2", i, iphi, iz) ;
-         micro2node  = new TNode(nodename, nodename, "PPSDModule", x, y, z) ;
-         micro2node->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(micro2node) ; 
-         // inside bottom micromegas
-         micro2node->cd() ; 
-         //      a. top lid
-         y = ( fGeom->GetMicromegas2Thickness() - fGeom->GetLidThickness() ) / 2. ; 
-         sprintf(nodename, "%s%d", "Lidb", i) ;
-         TNode * toplidbnode = new TNode(nodename, nodename, "TopLid", 0, y, 0) ;
-         toplidbnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(toplidbnode) ; 
-         //      b. composite panel
-         y = y - fGeom->GetLidThickness() / 2. - fGeom->GetCompositeThickness() / 2. ; 
-         sprintf(nodename, "%s%d", "CompUb", i) ;
-         TNode * compupbnode = new TNode(nodename, nodename, "TopPanel", 0, y, 0) ;
-         compupbnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(compupbnode) ; 
-         //      c. anode
-         y = y - fGeom->GetCompositeThickness() / 2. - fGeom->GetAnodeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d", "Anob", i) ;
-         TNode * anodebnode = new TNode(nodename, nodename, "Anode", 0, y, 0) ;
-         anodebnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(anodebnode) ; 
-         //      d. conversion gas
-         y = y - fGeom->GetAnodeThickness() / 2. - ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() )  / 2. ; 
-         sprintf(nodename, "%s%d", "GGapb", i) ;
-         TNode * ggapbnode = new TNode(nodename, nodename, "GasGap", 0, y, 0) ;
-         ggapbnode->SetLineColor(kColorGas) ;  
-         fNodes->Add(ggapbnode) ;           
-         //      f. cathode
-         y = y - ( fGeom->GetConversionGap() + fGeom->GetAvalancheGap() ) / 2. - fGeom->GetCathodeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d", "Cathodeb", i) ;
-         TNode * cathodebnode = new TNode(nodename, nodename, "Cathode", 0, y, 0) ;
-         cathodebnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(cathodebnode) ;        
-         //      g. printed circuit
-         y = y - fGeom->GetCathodeThickness() / 2. - fGeom->GetPCThickness()  / 2. ; 
-         sprintf(nodename, "%s%d", "PCb", i) ;
-         TNode * pcbnode = new TNode(nodename, nodename, "PCBoard", 0, y, 0) ;
-         pcbnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(pcbnode) ;        
-         //      h. composite pane
-         y = y - fGeom->GetPCThickness() / 2. - fGeom->GetCompositeThickness()  / 2. ; 
-         sprintf(nodename, "%s%d", "CompDownb", i) ;
-         TNode * compdownbnode = new TNode(nodename, nodename, "BottomPanel", 0, y, 0) ;
-         compdownbnode->SetLineColor(kColorPPSD) ;  
-         fNodes->Add(compdownbnode) ;        
-                 z = z - fGeom->GetPPSDModuleSize(2) ;
-         ppsdboxnode->cd() ;
-       } // end of Z module loop     
-       x = x -  fGeom->GetPPSDModuleSize(0) ; 
-       ppsdboxnode->cd() ;
-      } // end of phi module loop
-    }
-  } // PHOS modules
-  delete[] rotname ;  
-  delete[] nodename ; 
+    TNode * outerboxnode = new TNode(nodename, nodename, "OuterBox", x, y, 0, rotname ) ;
+    outerboxnode->SetLineColor(kColorPHOS) ;
+    fNodes->Add(outerboxnode) ;
+    outerboxnode->cd() ; 
+
+    Float_t z = -boxparams[3] - geom->GetIPtoOuterCoverDistance() + 
+                 cribox[1] +  geom->GetIPtoCrystalSurface() ;
+    TNode * crystalsboxnode = new TNode(nodename, nodename, "CrystalsBox", 0, 0, z) ;    
+    crystalsboxnode->SetLineColor(kColorXTAL) ; 
+    fNodes->Add(crystalsboxnode) ; 
+  }
 
+  delete[] rotname ;  
+  delete[] nodename ;
 }
 
+
 //____________________________________________________________________________
 void AliPHOSv0:: BuildGeometryforCPV(void)
 {
@@ -502,44 +206,50 @@ void AliPHOSv0:: BuildGeometryforCPV(void)
   */
   //END_HTML  
 
-  const Double_t kRADDEG         = 180.0 / kPI ;
+  const Double_t kRADDEG         = 180.0 / TMath::Pi() ;
   const Int_t    kColorCPV       = kGreen ;
   const Int_t    kColorFrame     = kYellow ;
   const Int_t    kColorGassiplex = kRed;
   const Int_t    kColorPCB       = kCyan;
 
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
   // Box for a full PHOS module
 
-  new TBRIK ("CPVBox", "CPV box", "void",                   fGeom->GetCPVBoxSize(0)/2,
-                                                            fGeom->GetCPVBoxSize(1)/2,
-                                                           fGeom->GetCPVBoxSize(2)/2 );
-  new TBRIK ("CPVFrameLR", "CPV frame Left-Right", "void",  fGeom->GetCPVFrameSize(0)/2,
-                                                            fGeom->GetCPVFrameSize(1)/2,
-                                                           fGeom->GetCPVBoxSize(2)/2 );
-  new TBRIK ("CPVFrameUD", "CPV frame Up-Down",    "void",  fGeom->GetCPVBoxSize(0)/2 - fGeom->GetCPVFrameSize(0),
-                                                            fGeom->GetCPVFrameSize(1)/2,
-                                                           fGeom->GetCPVFrameSize(2)/2);
-  new TBRIK ("CPVPCB",    "CPV PCB",               "void",  fGeom->GetCPVActiveSize(0)/2,
-                                                            fGeom->GetCPVTextoliteThickness()/2,
-                                                           fGeom->GetCPVActiveSize(1)/2);
-  new TBRIK ("CPVGassiplex", "CPV Gassiplex PCB",  "void",  fGeom->GetGassiplexChipSize(0)/2,
-                                                            fGeom->GetGassiplexChipSize(1)/2,
-                                                           fGeom->GetGassiplexChipSize(2)/2);
+  new TBRIK ("CPVBox", "CPV box", "void",                   geom->GetCPVBoxSize(0)/2,
+                                                            geom->GetCPVBoxSize(1)/2,
+                                                           geom->GetCPVBoxSize(2)/2 );
+  new TBRIK ("CPVFrameLR", "CPV frame Left-Right", "void",  geom->GetCPVFrameSize(0)/2,
+                                                            geom->GetCPVFrameSize(1)/2,
+                                                           geom->GetCPVBoxSize(2)/2 );
+  new TBRIK ("CPVFrameUD", "CPV frame Up-Down",    "void",  geom->GetCPVBoxSize(0)/2 - geom->GetCPVFrameSize(0),
+                                                            geom->GetCPVFrameSize(1)/2,
+                                                           geom->GetCPVFrameSize(2)/2);
+  new TBRIK ("CPVPCB",    "CPV PCB",               "void",  geom->GetCPVActiveSize(0)/2,
+                                                            geom->GetCPVTextoliteThickness()/2,
+                                                           geom->GetCPVActiveSize(1)/2);
+  new TBRIK ("CPVGassiplex", "CPV Gassiplex PCB",  "void",  geom->GetGassiplexChipSize(0)/2,
+                                                            geom->GetGassiplexChipSize(1)/2,
+                                                           geom->GetGassiplexChipSize(2)/2);
 
   // position CPV into ALICE
 
   char * nodename = new char[25] ;
   char * rotname  = new char[25] ;
   
-  Float_t r = fGeom->GetIPtoCPVDistance() + fGeom->GetCPVBoxSize(1) / 2.0 ;
+  Float_t r = geom->GetIPtoCPVDistance() + geom->GetCPVBoxSize(1) / 2.0 ;
   Int_t number = 988 ; 
   TNode * top = gAlice->GetGeometry()->GetNode("alice") ;
-  for( Int_t i = 1; i <= fGeom->GetNModules(); i++ ) { // the number of PHOS modules
 
+  Int_t lastModule = 0 ;
+  lastModule = geom->GetNModules();
+  
+  for( Int_t i = 1; i <= lastModule; i++ ) { // the number of PHOS modules
+    
     // One CPV module
-
-    Float_t angle = fGeom->GetPHOSAngle(i) ;
-    sprintf(rotname, "%s%d", "rotg", number++) ;
+    
+    Float_t angle = geom->GetPHOSAngle(i) ;
+    sprintf(rotname, "%s%d", "rotg", number+i) ;
     new TRotMatrix(rotname, rotname, 90, angle, 90, 90 + angle, 0, 0);
     top->cd();
     sprintf(nodename, "%s%d", "CPVModule", i) ;    
@@ -554,38 +264,39 @@ void AliPHOSv0:: BuildGeometryforCPV(void)
     // inside each CPV box:
 
     // Frame around CPV
-    for (Int_t j=0; j<=1; j++) {
+    Int_t j;
+    for (j=0; j<=1; j++) {
       sprintf(nodename, "CPVModule%d Frame%d", i, j+1) ;
-      x = TMath::Sign(1,2*j-1) * (fGeom->GetCPVBoxSize(0) - fGeom->GetCPVFrameSize(0)) / 2;
+      x = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(0) - geom->GetCPVFrameSize(0)) / 2;
       TNode * cpvFrameNode = new TNode(nodename , nodename ,"CPVFrameLR", x, 0, 0) ;
       cpvFrameNode->SetLineColor(kColorFrame) ;
       fNodes->Add(cpvFrameNode) ;
 
       sprintf(nodename, "CPVModule%d Frame%d", i, j+3) ;
-      z = TMath::Sign(1,2*j-1) * (fGeom->GetCPVBoxSize(2) - fGeom->GetCPVFrameSize(2)) / 2;
+      z = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(2) - geom->GetCPVFrameSize(2)) / 2;
       cpvFrameNode = new TNode(nodename , nodename ,"CPVFrameUD", 0, 0, z) ;
       cpvFrameNode->SetLineColor(kColorFrame) ;
       fNodes->Add(cpvFrameNode) ;
     }
 
     // 4 printed circuit boards
-    for (Int_t j=0; j<4; j++) {
+    for (j=0; j<4; j++) {
       sprintf(nodename, "CPVModule%d PCB%d", i, j+1) ;
-      y = fGeom->GetCPVFrameSize(1) / 2 - fGeom->GetFTPosition(j) + fGeom->GetCPVTextoliteThickness()/2;
+      y = geom->GetCPVFrameSize(1) / 2 - geom->GetFTPosition(j) + geom->GetCPVTextoliteThickness()/2;
       TNode * cpvPCBNode = new TNode(nodename , nodename ,"CPVPCB", 0, y, 0) ;
       cpvPCBNode->SetLineColor(kColorPCB) ;
       fNodes->Add(cpvPCBNode) ;
     }
 
     // Gassiplex chips
-    Float_t xStep = fGeom->GetCPVActiveSize(0) / (fGeom->GetNumberOfCPVChipsPhi() + 1);
-    Float_t zStep = fGeom->GetCPVActiveSize(1) / (fGeom->GetNumberOfCPVChipsZ()   + 1);
-    y = fGeom->GetCPVFrameSize(1)/2           - fGeom->GetFTPosition(0) +
-        fGeom->GetCPVTextoliteThickness() / 2 + fGeom->GetGassiplexChipSize(1) / 2 + 0.1;
-    for (Int_t ix=0; ix<fGeom->GetNumberOfCPVChipsPhi(); ix++) {
-      x = xStep * (ix+1) - fGeom->GetCPVActiveSize(0)/2;
-      for (Int_t iz=0; iz<fGeom->GetNumberOfCPVChipsZ(); iz++) {
-       z = zStep * (iz+1) - fGeom->GetCPVActiveSize(1)/2;
+    Float_t xStep = geom->GetCPVActiveSize(0) / (geom->GetNumberOfCPVChipsPhi() + 1);
+    Float_t zStep = geom->GetCPVActiveSize(1) / (geom->GetNumberOfCPVChipsZ()   + 1);
+    y = geom->GetCPVFrameSize(1)/2           - geom->GetFTPosition(0) +
+        geom->GetCPVTextoliteThickness() / 2 + geom->GetGassiplexChipSize(1) / 2 + 0.1;
+    for (Int_t ix=0; ix<geom->GetNumberOfCPVChipsPhi(); ix++) {
+      x = xStep * (ix+1) - geom->GetCPVActiveSize(0)/2;
+      for (Int_t iz=0; iz<geom->GetNumberOfCPVChipsZ(); iz++) {
+       z = zStep * (iz+1) - geom->GetCPVActiveSize(1)/2;
        sprintf(nodename, "CPVModule%d Chip(%dx%d)", i, ix+1,iz+1) ;
        TNode * cpvGassiplexNode = new TNode(nodename , nodename ,"CPVGassiplex", x, y, z) ;
        cpvGassiplexNode->SetLineColor(kColorGassiplex) ;
@@ -604,7 +315,7 @@ void AliPHOSv0::CreateGeometry()
 {
   // Create the PHOS geometry for Geant
 
-  AliPHOSv0 *phostmp = (AliPHOSv0*)gAlice->GetModule("PHOS") ;
+  AliPHOSv0 *phostmp = dynamic_cast<AliPHOSv0*>(gAlice->GetModule("PHOS")) ;
 
   if ( phostmp == NULL ) {
     
@@ -612,49 +323,57 @@ void AliPHOSv0::CreateGeometry()
     return;
     
   }
+
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
   // Get pointer to the array containing media indeces
   Int_t *idtmed = fIdtmed->GetArray() - 699 ;
 
-  Float_t bigbox[3] ; 
-  bigbox[0] =   fGeom->GetOuterBoxSize(0) / 2.0 ;
-  bigbox[1] = ( fGeom->GetOuterBoxSize(1) + fGeom->GetCPVBoxSize(1) ) / 2.0 ;
-  bigbox[2] =   fGeom->GetOuterBoxSize(2) / 2.0 ;
+  // Create a PHOS module.
   
-  gMC->Gsvolu("PHOS", "BOX ", idtmed[798], bigbox, 3) ;
+  gMC->Gsvolu("PHOS", "TRD1", idtmed[798], geom->GetPHOSParams(), 4) ;        
   
-  this->CreateGeometryforPHOS() ; 
-  if      ( strcmp( fGeom->GetName(), "GPS2") == 0  ) 
-    this->CreateGeometryforPPSD() ;
-  else if ( strcmp( fGeom->GetName(), "IHEP") == 0  ) 
+  this->CreateGeometryforEMC() ; 
+
+  if (strstr(fTitle.Data(),"noCPV") == 0) 
     this->CreateGeometryforCPV() ;
-  else
-    cout << "AliPHOSv0::CreateGeometry : no charged particle identification system installed" << endl
+  
+  this->CreateGeometryforSupport() 
   
   // --- Position  PHOS mdules in ALICE setup ---
   
   Int_t idrotm[99] ;
-  Double_t const kRADDEG = 180.0 / kPI ;
-  
-  for( Int_t i = 1; i <= fGeom->GetNModules(); i++ ) {
+  Int_t iXYZ,iAngle;
+  for (Int_t iModule = 0; iModule < geom->GetNModules(); iModule++ ) {
     
-    Float_t angle = fGeom->GetPHOSAngle(i) ;
-    AliMatrix(idrotm[i-1], 90.0, angle, 90.0, 90.0+angle, 0.0, 0.0) ;
-    Float_t r = fGeom->GetIPtoOuterCoverDistance() + ( fGeom->GetOuterBoxSize(1) + fGeom->GetCPVBoxSize(1) ) / 2.0 ;
-
-    Float_t xP1 = r * TMath::Sin( angle / kRADDEG ) ;
-    Float_t yP1 = -r * TMath::Cos( angle / kRADDEG ) ;
-
-    gMC->Gspos("PHOS", i, "ALIC", xP1, yP1, 0.0, idrotm[i-1], "ONLY") ;
-  } // for GetNModules
+    Float_t angle[3][2];
+    for (iXYZ=0; iXYZ<3; iXYZ++)
+      for (iAngle=0; iAngle<2; iAngle++)
+       angle[iXYZ][iAngle] = geom->GetModuleAngle(iModule,iXYZ, iAngle);
+    AliMatrix(idrotm[iModule],
+             angle[0][0],angle[0][1],
+             angle[1][0],angle[1][1],
+             angle[2][0],angle[2][1]) ;
+    
+    Float_t pos[3];
+    for (iXYZ=0; iXYZ<3; iXYZ++)
+      pos[iXYZ] = geom->GetModuleCenter(iModule,iXYZ);
+    gMC->Gspos("PHOS", iModule+1, "ALIC", pos[0], pos[1], pos[2],
+              idrotm[iModule], "ONLY") ;
+  }
 
 }
 
 //____________________________________________________________________________
-void AliPHOSv0::CreateGeometryforPHOS()
+void AliPHOSv0::CreateGeometryforEMC()
 {
   // Create the PHOS-EMC geometry for GEANT
+  // Author: Dmitri Peressounko August 2001
+  // The used coordinate system: 
+  //   1. in Module: X along longer side, Y out of beam, Z along shorter side (along beam)
+  //   2. In Strip the same: X along longer side, Y out of beam, Z along shorter side (along beam)
+
+
     //BEGIN_HTML
   /*
     <H2>
@@ -669,465 +388,223 @@ void AliPHOSv0::CreateGeometryforPHOS()
   // Get pointer to the array containing media indexes
   Int_t *idtmed = fIdtmed->GetArray() - 699 ;
 
-  // ---
-  // --- Define PHOS box volume, fPUFPill with thermo insulating foam ---
-  // --- Foam Thermo Insulating outer cover dimensions ---
-  // --- Put it in bigbox = PHOS
-
-  Float_t dphos[3] ; 
-  dphos[0] =  fGeom->GetOuterBoxSize(0) / 2.0 ;
-  dphos[1] =  fGeom->GetOuterBoxSize(1) / 2.0 ;
-  dphos[2] =  fGeom->GetOuterBoxSize(2) / 2.0 ;
-
-  gMC->Gsvolu("EMCA", "BOX ", idtmed[706], dphos, 3) ;
-
-  Float_t yO =  - fGeom->GetCPVBoxSize(1)  / 2.0 ;
-
-  gMC->Gspos("EMCA", 1, "PHOS", 0.0, yO, 0.0, 0, "ONLY") ; 
-
-  // ---
-  // --- Define Textolit Wall box, position inside EMCA ---
-  // --- Textolit Wall box dimentions ---
-  Float_t dptxw[3];
-  dptxw[0] = fGeom->GetTextolitBoxSize(0) / 2.0 ;
-  dptxw[1] = fGeom->GetTextolitBoxSize(1) / 2.0 ;
-  dptxw[2] = fGeom->GetTextolitBoxSize(2) / 2.0 ;
+  AliPHOSGeometry * geom = GetGeometry() ; 
+  AliPHOSEMCAGeometry * emcg = geom->GetEMCAGeometry() ;
 
-  gMC->Gsvolu("PTXW", "BOX ", idtmed[707], dptxw, 3);
+  // ======= Define the strip ===============
 
-  yO =   (  fGeom->GetOuterBoxThickness(1) -   fGeom->GetUpperPlateThickness() ) / 2.  ;
+  gMC->Gsvolu("PSTR", "BOX ", idtmed[716], emcg->GetStripHalfSize(), 3) ;  //Made of stell
    
-  gMC->Gspos("PTXW", 1, "EMCA", 0.0, yO, 0.0, 0, "ONLY") ;
+      // --- define air volume (cell of the honeycomb)
+      gMC->Gsvolu("PCEL", "BOX ", idtmed[798], emcg->GetAirCellHalfSize(), 3);
 
-  // --- 
-  // --- Define Upper Polystyrene Foam Plate, place inside PTXW ---
-  // --- immediately below Foam Thermo Insulation Upper plate ---
+      // --- define wrapped crystal and put it into AirCell
 
-  // --- Upper Polystyrene Foam plate thickness ---
-  Float_t  dpufp[3] ;
-  dpufp[0] = fGeom->GetTextolitBoxSize(0) / 2.0 ; 
-  dpufp[1] = fGeom->GetSecondUpperPlateThickness() / 2. ;
-  dpufp[2] = fGeom->GetTextolitBoxSize(2) /2.0 ; 
-
-  gMC->Gsvolu("PUFP", "BOX ", idtmed[703], dpufp, 3) ;
-  
-  yO = ( fGeom->GetTextolitBoxSize(1) -  fGeom->GetSecondUpperPlateThickness() ) / 2.0 ;
-  
-  gMC->Gspos("PUFP", 1, "PTXW", 0.0, yO, 0.0, 0, "ONLY") ;
-  
-  // ---
-  // --- Define air-filled box, place inside PTXW ---
-  // --- Inner AIR volume dimensions ---
+      gMC->Gsvolu("PWRA", "BOX ", idtmed[702], emcg->GetWrappedHalfSize(), 3);
+      Float_t * pin = emcg->GetAPDHalfSize() ; 
+      Float_t * preamp = emcg->GetPreampHalfSize() ;
+      Float_t y = (emcg->GetAirGapLed()-2*pin[1]-2*preamp[1])/2;
+      gMC->Gspos("PWRA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;
+    
+      // --- Define crystall and put it into wrapped crystall ---
+      gMC->Gsvolu("PXTL", "BOX ", idtmed[699], emcg->GetCrystalHalfSize(), 3) ;
+      gMC->Gspos("PXTL", 1, "PWRA", 0.0, 0.0, 0.0, 0, "ONLY") ;
+      
+      // --- define APD/PIN preamp and put it into AirCell
  
-
-  Float_t  dpair[3] ;
-  dpair[0] = fGeom->GetAirFilledBoxSize(0) / 2.0 ;
-  dpair[1] = fGeom->GetAirFilledBoxSize(1) / 2.0 ;
-  dpair[2] = fGeom->GetAirFilledBoxSize(2) / 2.0 ;
-
-  gMC->Gsvolu("PAIR", "BOX ", idtmed[798], dpair, 3) ;
-  
-  yO = ( fGeom->GetTextolitBoxSize(1) -  fGeom->GetAirFilledBoxSize(1) ) / 2.0 -   fGeom->GetSecondUpperPlateThickness() ;
-  
-  gMC->Gspos("PAIR", 1, "PTXW", 0.0, yO, 0.0, 0, "ONLY") ;
-
-// --- Dimensions of PbWO4 crystal ---
-
-  Float_t xtlX =  fGeom->GetCrystalSize(0) ; 
-  Float_t xtlY =  fGeom->GetCrystalSize(1) ; 
-  Float_t xtlZ =  fGeom->GetCrystalSize(2) ; 
-
-  Float_t dptcb[3] ;  
-  dptcb[0] =  fGeom->GetNPhi() * ( xtlX + 2 *  fGeom->GetGapBetweenCrystals() ) / 2.0 + fGeom->GetModuleBoxThickness() ;
-  dptcb[1] = ( xtlY +  fGeom->GetCrystalSupportHeight() +  fGeom->GetCrystalWrapThickness() + fGeom->GetCrystalHolderThickness() ) / 2.0 
-             + fGeom->GetModuleBoxThickness() / 2.0 ;
-  dptcb[2] = fGeom->GetNZ() * ( xtlZ + 2 * fGeom->GetGapBetweenCrystals() ) / 2.0 +  fGeom->GetModuleBoxThickness() ;
-  
-  gMC->Gsvolu("PTCB", "BOX ", idtmed[706], dptcb, 3) ;
-
-  yO =  fGeom->GetAirFilledBoxSize(1) / 2.0 - dptcb[1] 
-       - ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance() - fGeom->GetModuleBoxThickness() 
-       -  fGeom->GetUpperPlateThickness() -  fGeom->GetSecondUpperPlateThickness() ) ;
-  
-  gMC->Gspos("PTCB", 1, "PAIR", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define Crystal BLock filled with air, position it inside PTCB ---
-  Float_t dpcbl[3] ; 
-  
-  dpcbl[0] = fGeom->GetNPhi() * ( xtlX + 2 * fGeom->GetGapBetweenCrystals() ) / 2.0 ;
-  dpcbl[1] = ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() + fGeom->GetCrystalHolderThickness() ) / 2.0 ;
-  dpcbl[2] = fGeom->GetNZ() * ( xtlZ + 2 * fGeom->GetGapBetweenCrystals() ) / 2.0 ;
-  
-  gMC->Gsvolu("PCBL", "BOX ", idtmed[798], dpcbl, 3) ;
-  
-  // --- Divide PCBL in X (phi) and Z directions --
-  gMC->Gsdvn("PROW", "PCBL", Int_t (fGeom->GetNPhi()), 1) ;
-  gMC->Gsdvn("PCEL", "PROW", Int_t (fGeom->GetNZ()), 3) ;
-
-  yO = -fGeom->GetModuleBoxThickness() / 2.0 ;
-  
-  gMC->Gspos("PCBL", 1, "PTCB", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define STeel (actually, it's titanium) Cover volume, place inside PCEL
-  Float_t  dpstc[3] ; 
-  
-  dpstc[0] = ( xtlX + 2 * fGeom->GetCrystalWrapThickness() ) / 2.0 ;
-  dpstc[1] = ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() + fGeom->GetCrystalHolderThickness() ) / 2.0 ;
-  dpstc[2] = ( xtlZ + 2 * fGeom->GetCrystalWrapThickness()  + 2 *  fGeom->GetCrystalHolderThickness() ) / 2.0 ;
-  
-  gMC->Gsvolu("PSTC", "BOX ", idtmed[704], dpstc, 3) ;
-
-  gMC->Gspos("PSTC", 1, "PCEL", 0.0, 0.0, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define Tyvek volume, place inside PSTC ---
-  Float_t  dppap[3] ;
-
-  dppap[0] = xtlX / 2.0 + fGeom->GetCrystalWrapThickness() ;
-  dppap[1] = ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() ) / 2.0 ;
-  dppap[2] = xtlZ / 2.0 + fGeom->GetCrystalWrapThickness() ;
-  
-  gMC->Gsvolu("PPAP", "BOX ", idtmed[702], dppap, 3) ;
-  
-  yO = ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() ) / 2.0 
-              - ( xtlY +  fGeom->GetCrystalSupportHeight() +  fGeom->GetCrystalWrapThickness() + fGeom->GetCrystalHolderThickness() ) / 2.0 ;
+      gMC->Gsvolu("PPIN", "BOX ", idtmed[705], emcg->GetAPDHalfSize(), 3) ;
+      Float_t * crystal = emcg->GetCrystalHalfSize() ;
+      y = crystal[1] + emcg->GetAirGapLed() /2 - preamp[1]; 
+      gMC->Gspos("PPIN", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;
+
+      gMC->Gsvolu("PREA", "BOX ", idtmed[711], emcg->GetPreampHalfSize(), 3) ;   // Here I assumed preamp
+                                                                                 // as a printed Circuit
+      y = crystal[1] + emcg->GetAirGapLed() /2 + pin[1]  ;                  // May it should be changed
+      gMC->Gspos("PREA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;                    // to ceramics?
    
-  gMC->Gspos("PPAP", 1, "PSTC", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define PbWO4 crystal volume, place inside PPAP ---
-  Float_t  dpxtl[3] ; 
-
-  dpxtl[0] = xtlX / 2.0 ;
-  dpxtl[1] = xtlY / 2.0 ;
-  dpxtl[2] = xtlZ / 2.0 ;
-  
-  gMC->Gsvolu("PXTL", "BOX ", idtmed[699], dpxtl, 3) ;
-
-  yO = ( xtlY + fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() ) / 2.0 - xtlY / 2.0 - fGeom->GetCrystalWrapThickness() ;
-  
-  gMC->Gspos("PXTL", 1, "PPAP", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define crystal support volume, place inside PPAP ---
-  Float_t dpsup[3] ; 
-
-  dpsup[0] = xtlX / 2.0 + fGeom->GetCrystalWrapThickness()  ;
-  dpsup[1] = fGeom->GetCrystalSupportHeight() / 2.0 ;
-  dpsup[2] = xtlZ / 2.0 +  fGeom->GetCrystalWrapThickness() ;
-
-  gMC->Gsvolu("PSUP", "BOX ", idtmed[798], dpsup, 3) ;
-
-  yO =  fGeom->GetCrystalSupportHeight() / 2.0 - ( xtlY +  fGeom->GetCrystalSupportHeight() + fGeom->GetCrystalWrapThickness() ) / 2.0 ;
-
-  gMC->Gspos("PSUP", 1, "PPAP", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define PIN-diode volume and position it inside crystal support ---
-  // --- right behind PbWO4 crystal
-
-  // --- PIN-diode dimensions ---
-
-  Float_t dppin[3] ;
-  dppin[0] = fGeom->GetPinDiodeSize(0) / 2.0 ;
-  dppin[1] = fGeom->GetPinDiodeSize(1) / 2.0 ;
-  dppin[2] = fGeom->GetPinDiodeSize(2) / 2.0 ;
-  gMC->Gsvolu("PPIN", "BOX ", idtmed[705], dppin, 3) ;
-  yO = fGeom->GetCrystalSupportHeight() / 2.0 - fGeom->GetPinDiodeSize(1) / 2.0 ;
-  gMC->Gspos("PPIN", 1, "PSUP", 0.0, yO, 0.0, 0, "ONLY") ;
 
-  // ---
-  // --- Define Upper Cooling Panel, place it on top of PTCB ---
-  Float_t dpucp[3] ;
- // --- Upper Cooling Plate thickness ---
-  dpucp[0] = dptcb[0] ;
-  dpucp[1] = fGeom->GetUpperCoolingPlateThickness() ;
-  dpucp[2] = dptcb[2] ;
-  
-  gMC->Gsvolu("PUCP", "BOX ", idtmed[701], dpucp,3) ;
-  
-  yO = (  fGeom->GetAirFilledBoxSize(1) -  fGeom->GetUpperCoolingPlateThickness() ) / 2. 
-       - ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance() - fGeom->GetModuleBoxThickness()
-           - fGeom->GetUpperPlateThickness() - fGeom->GetSecondUpperPlateThickness() - fGeom->GetUpperCoolingPlateThickness() ) ; 
-  
-  gMC->Gspos("PUCP", 1, "PAIR", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define Al Support Plate, position it inside PAIR ---
-  // --- right beneath PTCB ---
- // --- Al Support Plate thickness ---
-  Float_t dpasp[3] ;
-  dpasp[0] =  fGeom->GetAirFilledBoxSize(0) / 2.0 ;
-  dpasp[1] = fGeom->GetSupportPlateThickness() / 2.0 ;
-  dpasp[2] =  fGeom->GetAirFilledBoxSize(2) / 2.0 ;
-  
-  gMC->Gsvolu("PASP", "BOX ", idtmed[701], dpasp, 3) ;
-  
-  yO = (  fGeom->GetAirFilledBoxSize(1) - fGeom->GetSupportPlateThickness() ) / 2. 
-       -  ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance()
-           - fGeom->GetUpperPlateThickness() - fGeom->GetSecondUpperPlateThickness() + dpcbl[1] * 2 ) ;
-  
-  gMC->Gspos("PASP", 1, "PAIR", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define Thermo Insulating Plate, position it inside PAIR ---
-  // --- right beneath PASP ---
-  // --- Lower Thermo Insulating Plate thickness ---
-  
-  Float_t dptip[3] ;
-  dptip[0] = fGeom->GetAirFilledBoxSize(0) / 2.0 ;
-  dptip[1] = fGeom->GetLowerThermoPlateThickness() / 2.0 ;
-  dptip[2] = fGeom->GetAirFilledBoxSize(2) / 2.0 ;
-
-  gMC->Gsvolu("PTIP", "BOX ", idtmed[706], dptip, 3) ;
-
-  yO =  ( fGeom->GetAirFilledBoxSize(1) - fGeom->GetLowerThermoPlateThickness() ) / 2. 
-       -  ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance() - fGeom->GetUpperPlateThickness() 
-            - fGeom->GetSecondUpperPlateThickness() + dpcbl[1] * 2 + fGeom->GetSupportPlateThickness() ) ;
-
-  gMC->Gspos("PTIP", 1, "PAIR", 0.0, yO, 0.0, 0, "ONLY") ;
-
-  // ---
-  // --- Define Textolit Plate, position it inside PAIR ---
-  // --- right beneath PTIP ---
-  // --- Lower Textolit Plate thickness ---
-  Float_t dptxp[3] ;
-  dptxp[0] = fGeom->GetAirFilledBoxSize(0) / 2.0 ;
-  dptxp[1] = fGeom->GetLowerTextolitPlateThickness() / 2.0 ;
-  dptxp[2] = fGeom->GetAirFilledBoxSize(2) / 2.0 ;
-
-  gMC->Gsvolu("PTXP", "BOX ", idtmed[707], dptxp, 3) ;
-
-  yO =  ( fGeom->GetAirFilledBoxSize(1) - fGeom->GetLowerTextolitPlateThickness() ) / 2. 
-       -  ( fGeom->GetIPtoCrystalSurface() - fGeom->GetIPtoOuterCoverDistance() - fGeom->GetUpperPlateThickness() 
-            - fGeom->GetSecondUpperPlateThickness() + dpcbl[1] * 2 + fGeom->GetSupportPlateThickness() 
-            +  fGeom->GetLowerThermoPlateThickness() ) ;
+      // --- Fill strip with wrapped cristalls in Air Cells
 
-  gMC->Gspos("PTXP", 1, "PAIR", 0.0, yO, 0.0, 0, "ONLY") ;
-
-}
+      Float_t* splate = emcg->GetSupportPlateHalfSize();  
+      y = -splate[1] ;
+      Float_t* acel = emcg->GetAirCellHalfSize() ;
+      Int_t icel ;
+      for(icel = 1; icel <= emcg->GetNCellsInStrip(); icel++){
+       Float_t x = (2*icel - 1 - emcg->GetNCellsInStrip())* acel[0] ;
+       gMC->Gspos("PCEL", icel, "PSTR", x, y, 0.0, 0, "ONLY") ;
+      }
 
-//____________________________________________________________________________
-void AliPHOSv0::CreateGeometryforPPSD()
-{
-  // Create the PHOS-PPSD geometry for GEANT
+      // --- define the support plate, hole in it and position it in strip ----
+      gMC->Gsvolu("PSUP", "BOX ", idtmed[701], emcg->GetSupportPlateHalfSize(), 3) ;
 
-  //BEGIN_HTML
-  /*
-    <H2>
-    Geant3 geometry tree of PHOS-PPSD in ALICE
-    </H2>
-    <P><CENTER>
-    <IMG Align=BOTTOM ALT="PPSD geant tree" SRC="../images/PPSDinAlice.gif"> 
-    </CENTER><P>
-  */
-  //END_HTML  
-
-  // Get pointer to the array containing media indexes
-  Int_t *idtmed = fIdtmed->GetArray() - 699 ;
-  
-  // The box containing all ppsd's for one PHOS module filled with air 
-  Float_t ppsd[3] ; 
-  ppsd[0] = fGeom->GetCPVBoxSize(0) / 2.0 ;  
-  ppsd[1] = fGeom->GetCPVBoxSize(1) / 2.0 ; 
-  ppsd[2] = fGeom->GetCPVBoxSize(2) / 2.0 ;
+      gMC->Gsvolu("PSHO", "BOX ", idtmed[798], emcg->GetSupportPlateInHalfSize(), 3) ;
+      Float_t z = emcg->GetSupportPlateThickness()/2 ;
+      gMC->Gspos("PSHO", 1, "PSUP", 0.0, 0.0, z, 0, "ONLY") ;
 
-  gMC->Gsvolu("PPSD", "BOX ", idtmed[798], ppsd, 3) ;
+      y = acel[1] ;
+      gMC->Gspos("PSUP", 1, "PSTR", 0.0, y, 0.0, 0, "ONLY") ;
 
-  Float_t yO =  fGeom->GetOuterBoxSize(1) / 2.0 ;
 
-  gMC->Gspos("PPSD", 1, "PHOS", 0.0, yO, 0.0, 0, "ONLY") ; 
+    // ========== Fill module with strips and put them into inner thermoinsulation=============
+      gMC->Gsvolu("PTII", "BOX ", idtmed[706], emcg->GetInnerThermoHalfSize(), 3) ;     
 
-  // Now we build a micromegas module
-  // The box containing the whole module filled with epoxy (FR4)
+      Float_t * inthermo = emcg->GetInnerThermoHalfSize() ;
+      Float_t * strip = emcg->GetStripHalfSize() ;
+      y = inthermo[1] - strip[1] ;
+      Int_t irow;
+      Int_t nr = 1 ;
+      Int_t icol ;
 
-  Float_t mppsd[3] ;  
-  mppsd[0] = fGeom->GetPPSDModuleSize(0) / 2.0 ;  
-  mppsd[1] = fGeom->GetPPSDModuleSize(1) / 2.0 ;  
-  mppsd[2] = fGeom->GetPPSDModuleSize(2) / 2.0 ;
+      for(irow = 0; irow < emcg->GetNStripX(); irow ++){
+       Float_t x = (2*irow + 1 - emcg->GetNStripX())* strip[0] ;
+       for(icol = 0; icol < emcg->GetNStripZ(); icol ++){
+         z = (2*icol + 1 - emcg->GetNStripZ()) * strip[2] ;
+         gMC->Gspos("PSTR", nr, "PTII", x, y, z, 0, "ONLY") ;
+         nr++ ;
+       }
+      }
+         
 
-  gMC->Gsvolu("MPPS", "BOX ", idtmed[708], mppsd, 3) ;  
-  // Inside mppsd :
-  // 1. The Top Lid made of epoxy (FR4) 
+   // ------- define the air gap between thermoinsulation and cooler
+      gMC->Gsvolu("PAGA", "BOX ", idtmed[798], emcg->GetAirGapHalfSize(), 3) ;   
+      Float_t * agap = emcg->GetAirGapHalfSize() ;
+      y = agap[1] - inthermo[1]  ;
+      
+      gMC->Gspos("PTII", 1, "PAGA", 0.0, y, 0.0, 0, "ONLY") ;
 
-  Float_t tlppsd[3] ; 
-  tlppsd[0] = fGeom->GetPPSDModuleSize(0) / 2.0 ; 
-  tlppsd[1] = fGeom->GetLidThickness() / 2.0 ;
-  tlppsd[2] = fGeom->GetPPSDModuleSize(2) / 2.0 ;
 
-  gMC->Gsvolu("TLPS", "BOX ", idtmed[708], tlppsd, 3) ; 
 
-  Float_t  y0 = ( fGeom->GetMicromegas1Thickness() - fGeom->GetLidThickness() ) / 2. ; 
+   // ------- define the Al passive cooler 
+      gMC->Gsvolu("PCOR", "BOX ", idtmed[701], emcg->GetCoolerHalfSize(), 3) ;   
+      Float_t * cooler = emcg->GetCoolerHalfSize() ;
+      y = cooler[1] - agap[1]  ;
+      
+      gMC->Gspos("PAGA", 1, "PCOR", 0.0, y, 0.0, 0, "ONLY") ;
 
-  gMC->Gspos("TLPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
-  // 2. the upper panel made of composite material
+   // ------- define the outer thermoinsulating cover
+      gMC->Gsvolu("PTIO", "TRD1", idtmed[706], emcg->GetOuterThermoParams(), 4) ;        
+      Float_t * outparams = emcg->GetOuterThermoParams() ; 
 
-  Float_t upppsd[3] ; 
-  upppsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
-  upppsd[1] = fGeom->GetCompositeThickness() / 2.0 ;
-  upppsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
+      Int_t idrotm[99] ;
+      AliMatrix(idrotm[1], 90.0, 0.0, 0.0, 0.0, 90.0, 270.0) ;
+      // Frame in outer thermoinsulation and so on: z out of beam, y along beam, x across beam
  
-  gMC->Gsvolu("UPPS", "BOX ", idtmed[709], upppsd, 3) ; 
-  
-  y0 = y0 - fGeom->GetLidThickness() / 2. - fGeom->GetCompositeThickness() / 2. ; 
-
-  gMC->Gspos("UPPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
-
-  // 3. the anode made of Copper
-  
-  Float_t anppsd[3] ; 
-  anppsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2.0 ; 
-  anppsd[1] = fGeom->GetAnodeThickness() / 2.0 ; 
-  anppsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0  ; 
-
-  gMC->Gsvolu("ANPS", "BOX ", idtmed[710], anppsd, 3) ; 
-  
-  y0 = y0 - fGeom->GetCompositeThickness() / 2. - fGeom->GetAnodeThickness()  / 2. ; 
-  
-  gMC->Gspos("ANPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
-
-  // 4. the conversion gap + avalanche gap filled with gas
-
-  Float_t ggppsd[3] ; 
-  ggppsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
-  ggppsd[1] = ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() ) / 2.0 ; 
-  ggppsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
-
-  gMC->Gsvolu("GGPS", "BOX ", idtmed[715], ggppsd, 3) ; 
-  
-  // --- Divide GGPP in X (phi) and Z directions --
-  gMC->Gsdvn("GROW", "GGPS", fGeom->GetNumberOfPadsPhi(), 1) ;
-  gMC->Gsdvn("GCEL", "GROW", fGeom->GetNumberOfPadsZ() , 3) ;
-
-  y0 = y0 - fGeom->GetAnodeThickness() / 2.  - ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() ) / 2. ; 
-
-  gMC->Gspos("GGPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
-
-
-  // 6. the cathode made of Copper
-
-  Float_t cappsd[3] ;
-  cappsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
-  cappsd[1] = fGeom->GetCathodeThickness() / 2.0 ; 
-  cappsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0  ;
-
-  gMC->Gsvolu("CAPS", "BOX ", idtmed[710], cappsd, 3) ; 
-
-  y0 = y0 - ( fGeom->GetConversionGap() +  fGeom->GetAvalancheGap() ) / 2. - fGeom->GetCathodeThickness()  / 2. ; 
-
-  gMC->Gspos("CAPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
-
-  // 7. the printed circuit made of G10       
-
-  Float_t pcppsd[3] ; 
-  pcppsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2,.0 ; 
-  pcppsd[1] = fGeom->GetPCThickness() / 2.0 ; 
-  pcppsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
-
-  gMC->Gsvolu("PCPS", "BOX ", idtmed[711], cappsd, 3) ; 
-
-  y0 = y0 - fGeom->GetCathodeThickness() / 2. - fGeom->GetPCThickness()  / 2. ; 
-
-  gMC->Gspos("PCPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
+      z = outparams[3] - cooler[1] ;
+      gMC->Gspos("PCOR", 1, "PTIO", 0., 0.0, z, idrotm[1], "ONLY") ;
+       
+  // -------- Define the outer Aluminium cover -----
+      gMC->Gsvolu("PCOL", "TRD1", idtmed[701], emcg->GetAlCoverParams(), 4) ;        
+      Float_t * covparams = emcg->GetAlCoverParams() ; 
+      z = covparams[3] - outparams[3] ;
+      gMC->Gspos("PTIO", 1, "PCOL", 0., 0.0, z, 0, "ONLY") ;
+
+ // --------- Define front fiberglass cover -----------
+      gMC->Gsvolu("PFGC", "BOX ", idtmed[717], emcg->GetFiberGlassHalfSize(), 3) ;  
+      z = - outparams[3] ;
+      gMC->Gspos("PFGC", 1, "PCOL", 0., 0.0, z, 0, "ONLY") ;
+
+ //=============This is all with cold section==============
+
+
+      //------ Warm Section --------------
+      gMC->Gsvolu("PWAR", "BOX ", idtmed[701], emcg->GetWarmAlCoverHalfSize(), 3) ; 
+      Float_t * warmcov = emcg->GetWarmAlCoverHalfSize() ;
+
+      // --- Define the outer thermoinsulation ---
+      gMC->Gsvolu("PWTI", "BOX ", idtmed[706], emcg->GetWarmThermoHalfSize(), 3) ; 
+      Float_t * warmthermo = emcg->GetWarmThermoHalfSize() ;
+      z = -warmcov[2] + warmthermo[2] ;
+
+      gMC->Gspos("PWTI", 1, "PWAR", 0., 0.0, z, 0, "ONLY") ;     
+
+      // --- Define cables area and put in it T-supports ---- 
+      gMC->Gsvolu("PCA1", "BOX ", idtmed[718], emcg->GetTCables1HalfSize(), 3) ; 
+      Float_t * cbox = emcg->GetTCables1HalfSize() ;
+
+      gMC->Gsvolu("PBE1", "BOX ", idtmed[701], emcg->GetTSupport1HalfSize(), 3) ;
+      Float_t * beams = emcg->GetTSupport1HalfSize() ;
+      Int_t isup ;
+      for(isup = 0; isup < emcg->GetNTSuppots(); isup++){
+       Float_t x = -cbox[0] + beams[0] + (2*beams[0]+emcg->GetTSupportDist())*isup ;
+       gMC->Gspos("PBE1", isup, "PCA1", x, 0.0, 0.0, 0, "ONLY") ;
+      }
 
-  // 8. the lower panel made of composite material
-                                                   
-  Float_t lpppsd[3] ; 
-  lpppsd[0] = ( fGeom->GetPPSDModuleSize(0) - fGeom->GetMicromegasWallThickness() ) / 2.0 ; 
-  lpppsd[1] = fGeom->GetCompositeThickness() / 2.0 ; 
-  lpppsd[2] = ( fGeom->GetPPSDModuleSize(2) - fGeom->GetMicromegasWallThickness() ) / 2.0 ;
+      z = -warmthermo[2] + cbox[2] ;
+      gMC->Gspos("PCA1", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY") ;     
 
-  gMC->Gsvolu("LPPS", "BOX ", idtmed[709], lpppsd, 3) ; 
-  y0 = y0 - fGeom->GetPCThickness() / 2. - fGeom->GetCompositeThickness()  / 2. ; 
+      gMC->Gsvolu("PCA2", "BOX ", idtmed[718], emcg->GetTCables2HalfSize(), 3) ; 
+      Float_t * cbox2 = emcg->GetTCables2HalfSize() ;
 
-  gMC->Gspos("LPPS", 1, "MPPS", 0.0, y0, 0.0, 0, "ONLY") ; 
+      gMC->Gsvolu("PBE2", "BOX ", idtmed[701], emcg->GetTSupport2HalfSize(), 3) ;
+      for(isup = 0; isup < emcg->GetNTSuppots(); isup++){
+       Float_t x = -cbox[0] + beams[0] + (2*beams[0]+emcg->GetTSupportDist())*isup ;
+       gMC->Gspos("PBE2", isup, "PCA2", x, 0.0, 0.0, 0, "ONLY") ;
+      }
 
-  // Position the  fNumberOfModulesPhi x fNumberOfModulesZ modules (mppsd) inside PPSD to cover a PHOS module
-  // the top and bottom one's (which are assumed identical) :
+      z = -warmthermo[2] + 2*cbox[2] + cbox2[2];
+      gMC->Gspos("PCA2", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY") ;     
 
-   Float_t yt = ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas1Thickness() ) / 2. ; 
-   Float_t yb = - ( fGeom->GetCPVBoxSize(1) - fGeom->GetMicromegas2Thickness() ) / 2. ; 
 
-   Int_t copyNumbertop = 0 ; 
-   Int_t copyNumberbot = fGeom->GetNumberOfModulesPhi() *  fGeom->GetNumberOfModulesZ() ; 
+  // --- Define frame ---
+      gMC->Gsvolu("PFRX", "BOX ", idtmed[716], emcg->GetFrameXHalfSize(), 3) ; 
+      Float_t * posit = emcg->GetFrameXPosition() ;
+      gMC->Gspos("PFRX", 1, "PWTI", posit[0],  posit[1], posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFRX", 2, "PWTI", posit[0], -posit[1], posit[2], 0, "ONLY") ;
 
-   Float_t x  = ( fGeom->GetCPVBoxSize(0) - fGeom->GetPPSDModuleSize(0) ) / 2. ;  
+      gMC->Gsvolu("PFRZ", "BOX ", idtmed[716], emcg->GetFrameZHalfSize(), 3) ; 
+      posit = emcg->GetFrameZPosition() ;
+      gMC->Gspos("PFRZ", 1, "PWTI", posit[0], posit[1],  posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFRZ", 2, "PWTI", -posit[0], posit[1], posit[2], 0, "ONLY") ;
 
-   for ( Int_t iphi = 1; iphi <= fGeom->GetNumberOfModulesPhi(); iphi++ ) { // the number of micromegas modules in phi per PHOS module
-      Float_t z = ( fGeom->GetCPVBoxSize(2) - fGeom->GetPPSDModuleSize(2) ) / 2. ;
+ // --- Define Fiber Glass support ---
+      gMC->Gsvolu("PFG1", "BOX ", idtmed[717], emcg->GetFGupXHalfSize(), 3) ; 
+      posit = emcg->GetFGupXPosition() ;
+      gMC->Gspos("PFG1", 1, "PWTI", posit[0],  posit[1], posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFG1", 2, "PWTI", posit[0], -posit[1], posit[2], 0, "ONLY") ;
 
-      for ( Int_t iz = 1; iz <= fGeom->GetNumberOfModulesZ(); iz++ ) { // the number of micromegas modules in z per PHOS module
-       gMC->Gspos("MPPS", ++copyNumbertop, "PPSD", x, yt, z, 0, "ONLY") ;
-       gMC->Gspos("MPPS", ++copyNumberbot, "PPSD", x, yb, z, 0, "ONLY") ; 
-       z = z - fGeom->GetPPSDModuleSize(2) ;
-      } // end of Z module loop   
-      x = x -  fGeom->GetPPSDModuleSize(0) ; 
-    } // end of phi module loop
+      gMC->Gsvolu("PFG2", "BOX ", idtmed[717], emcg->GetFGupZHalfSize(), 3) ; 
+      posit = emcg->GetFGupZPosition() ;
+      gMC->Gspos("PFG2", 1, "PWTI",  posit[0], posit[1], posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFG2", 2, "PWTI", -posit[0], posit[1], posit[2], 0, "ONLY") ;
 
-   // The Lead converter between two air gaps
-   // 1. Upper air gap
+      gMC->Gsvolu("PFG3", "BOX ", idtmed[717], emcg->GetFGlowXHalfSize(), 3) ; 
+      posit = emcg->GetFGlowXPosition() ;
+      gMC->Gspos("PFG3", 1, "PWTI", posit[0],  posit[1], posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFG3", 2, "PWTI", posit[0], -posit[1], posit[2], 0, "ONLY") ;
 
-   Float_t uappsd[3] ;
-   uappsd[0] = fGeom->GetCPVBoxSize(0) / 2.0 ;
-   uappsd[1] = fGeom->GetMicro1ToLeadGap() / 2.0 ; 
-   uappsd[2] = fGeom->GetCPVBoxSize(2) / 2.0 ;
+      gMC->Gsvolu("PFG4", "BOX ", idtmed[717], emcg->GetFGlowZHalfSize(), 3) ; 
+      posit = emcg->GetFGlowZPosition() ;
+      gMC->Gspos("PFG4", 1, "PWTI",  posit[0], posit[1], posit[2], 0, "ONLY") ;
+      gMC->Gspos("PFG4", 2, "PWTI", -posit[0], posit[1], posit[2], 0, "ONLY") ;
 
-  gMC->Gsvolu("UAPPSD", "BOX ", idtmed[798], uappsd, 3) ; 
+      // --- Define Air Gap for FEE electronics ----- 
 
-  y0 = ( fGeom->GetCPVBoxSize(1) - 2 * fGeom->GetMicromegas1Thickness() - fGeom->GetMicro1ToLeadGap() ) / 2. ; 
+      gMC->Gsvolu("PAFE", "BOX ", idtmed[798], emcg->GetFEEAirHalfSize(), 3) ; 
+      posit = emcg->GetFEEAirPosition() ;
+      gMC->Gspos("PAFE", 1, "PWTI",  posit[0], posit[1], posit[2], 0, "ONLY") ;
 
-  gMC->Gspos("UAPPSD", 1, "PPSD", 0.0, y0, 0.0, 0, "ONLY") ; 
+      // Define the EMC module volume and combine Cool and Warm sections
 
-   // 2. Lead converter
-  Float_t lcppsd[3] ; 
-  lcppsd[0] = fGeom->GetCPVBoxSize(0) / 2.0 ;
-  lcppsd[1] = fGeom->GetLeadConverterThickness() / 2.0 ; 
-  lcppsd[2] = fGeom->GetCPVBoxSize(2) / 2.0 ;
-  gMC->Gsvolu("LCPPSD", "BOX ", idtmed[712], lcppsd, 3) ; 
-  
-  y0 = y0 - fGeom->GetMicro1ToLeadGap() / 2. - fGeom->GetLeadConverterThickness() / 2. ; 
+      gMC->Gsvolu("PEMC", "TRD1", idtmed[798], emcg->GetEMCParams(), 4) ;        
 
-  gMC->Gspos("LCPPSD", 1, "PPSD", 0.0, y0, 0.0, 0, "ONLY") ; 
+      z =  - warmcov[2] ;
+      gMC->Gspos("PCOL", 1, "PEMC",  0., 0., z, 0, "ONLY") ;
+      z = covparams[3] ;
+      gMC->Gspos("PWAR", 1, "PEMC",  0., 0., z, 0, "ONLY") ;
 
-  // 3. Lower air gap
 
-  Float_t lappsd[3] ; 
-  lappsd[0] = fGeom->GetCPVBoxSize(0) / 2.0 ; 
-  lappsd[1] = fGeom->GetLeadToMicro2Gap() / 2.0 ; 
-  lappsd[2] = fGeom->GetCPVBoxSize(2) / 2.0 ;
-
-  gMC->Gsvolu("LAPPSD", "BOX ", idtmed[798], lappsd, 3) ; 
-    
-  y0 = y0 - fGeom->GetLeadConverterThickness() / 2. - fGeom->GetLeadToMicro2Gap()  / 2. ; 
-  
-  gMC->Gspos("LAPPSD", 1, "PPSD", 0.0, y0, 0.0, 0, "ONLY") ; 
-   
+      // Put created EMC geometry into PHOS volume
+      
+      z = geom->GetCPVBoxSize(1) / 2. ;
+      gMC->Gspos("PEMC", 1, "PHOS", 0., 0., z, 0, "ONLY") ; 
+            
 }
 
-
 //____________________________________________________________________________
 void AliPHOSv0::CreateGeometryforCPV()
 {
   // Create the PHOS-CPV geometry for GEANT
   // Author: Yuri Kharlov 11 September 2000
-
   //BEGIN_HTML
   /*
     <H2>
@@ -1170,102 +647,313 @@ void AliPHOSv0::CreateGeometryforCPV()
 
   // Get pointer to the array containing media indexes
   Int_t *idtmed = fIdtmed->GetArray() - 699 ;
-  
+
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
   // The box containing all CPV for one PHOS module filled with air 
-  par[0] = fGeom->GetCPVBoxSize(0) / 2.0 ;  
-  par[1] = fGeom->GetCPVBoxSize(1) / 2.0 ; 
-  par[2] = fGeom->GetCPVBoxSize(2) / 2.0 ;
-  gMC->Gsvolu("CPV ", "BOX ", idtmed[798], par, 3) ;
-  
-  y = fGeom->GetOuterBoxSize(1) / 2.0 ;
-  gMC->Gspos("CPV ", 1, "PHOS", 0.0, y, 0.0, 0, "ONLY") ; 
+  par[0] = geom->GetCPVBoxSize(0) / 2.0 ;  
+  par[1] = geom->GetCPVBoxSize(1) / 2.0 ; 
+  par[2] = geom->GetCPVBoxSize(2) / 2.0 ;
+  gMC->Gsvolu("PCPV", "BOX ", idtmed[798], par, 3) ;
+
+  Float_t * emcParams = geom->GetEMCAGeometry()->GetEMCParams() ;
+  z = - emcParams[3] ;
+  Int_t rotm ;
+  AliMatrix(rotm, 90.,0., 0., 0., 90., 90.) ;
+
+  gMC->Gspos("PCPV", 1, "PHOS", 0.0, 0.0, z, rotm, "ONLY") ; 
   
   // Gassiplex board
   
-  par[0] = fGeom->GetGassiplexChipSize(0)/2.;
-  par[1] = fGeom->GetGassiplexChipSize(1)/2.;
-  par[2] = fGeom->GetGassiplexChipSize(2)/2.;
-  gMC->Gsvolu("CPVC","BOX ",idtmed[707],par,3);
+  par[0] = geom->GetGassiplexChipSize(0)/2.;
+  par[1] = geom->GetGassiplexChipSize(1)/2.;
+  par[2] = geom->GetGassiplexChipSize(2)/2.;
+  gMC->Gsvolu("PCPC","BOX ",idtmed[707],par,3);
   
   // Cu+Ni foil covers Gassiplex board
 
-  par[1] = fGeom->GetCPVCuNiFoilThickness()/2;
-  gMC->Gsvolu("CPVD","BOX ",idtmed[710],par,3);
-  y      = -(fGeom->GetGassiplexChipSize(1)/2 - par[1]);
-  gMC->Gspos("CPVD",1,"CPVC",0,y,0,0,"ONLY");
+  par[1] = geom->GetCPVCuNiFoilThickness()/2;
+  gMC->Gsvolu("PCPD","BOX ",idtmed[710],par,3);
+  y      = -(geom->GetGassiplexChipSize(1)/2 - par[1]);
+  gMC->Gspos("PCPD",1,"PCPC",0,y,0,0,"ONLY");
 
   // Position of the chip inside CPV
 
-  Float_t xStep = fGeom->GetCPVActiveSize(0) / (fGeom->GetNumberOfCPVChipsPhi() + 1);
-  Float_t zStep = fGeom->GetCPVActiveSize(1) / (fGeom->GetNumberOfCPVChipsZ()   + 1);
+  Float_t xStep = geom->GetCPVActiveSize(0) / (geom->GetNumberOfCPVChipsPhi() + 1);
+  Float_t zStep = geom->GetCPVActiveSize(1) / (geom->GetNumberOfCPVChipsZ()   + 1);
   Int_t   copy  = 0;
-  y = fGeom->GetCPVFrameSize(1)/2           - fGeom->GetFTPosition(0) +
-    fGeom->GetCPVTextoliteThickness() / 2 + fGeom->GetGassiplexChipSize(1) / 2 + 0.1;
-  for (Int_t ix=0; ix<fGeom->GetNumberOfCPVChipsPhi(); ix++) {
-    x = xStep * (ix+1) - fGeom->GetCPVActiveSize(0)/2;
-    for (Int_t iz=0; iz<fGeom->GetNumberOfCPVChipsZ(); iz++) {
+  y = geom->GetCPVFrameSize(1)/2           - geom->GetFTPosition(0) +
+    geom->GetCPVTextoliteThickness() / 2 + geom->GetGassiplexChipSize(1) / 2 + 0.1;
+  for (Int_t ix=0; ix<geom->GetNumberOfCPVChipsPhi(); ix++) {
+    x = xStep * (ix+1) - geom->GetCPVActiveSize(0)/2;
+    for (Int_t iz=0; iz<geom->GetNumberOfCPVChipsZ(); iz++) {
       copy++;
-      z = zStep * (iz+1) - fGeom->GetCPVActiveSize(1)/2;
-      gMC->Gspos("CPVC",copy,"CPV",x,y,z,0,"ONLY");
+      z = zStep * (iz+1) - geom->GetCPVActiveSize(1)/2;
+      gMC->Gspos("PCPC",copy,"PCPV",x,y,z,0,"ONLY");
     }
   }
 
   // Foiled textolite (1 mm of textolite + 50 mkm of Cu + 6 mkm of Ni)
   
-  par[0] = fGeom->GetCPVActiveSize(0)        / 2;
-  par[1] = fGeom->GetCPVTextoliteThickness() / 2;
-  par[2] = fGeom->GetCPVActiveSize(1)        / 2;
-  gMC->Gsvolu("CPVF","BOX ",idtmed[707],par,3);
+  par[0] = geom->GetCPVActiveSize(0)        / 2;
+  par[1] = geom->GetCPVTextoliteThickness() / 2;
+  par[2] = geom->GetCPVActiveSize(1)        / 2;
+  gMC->Gsvolu("PCPF","BOX ",idtmed[707],par,3);
 
   // Argon gas volume
 
-  par[1] = (fGeom->GetFTPosition(2) - fGeom->GetFTPosition(1) - fGeom->GetCPVTextoliteThickness()) / 2;
-  gMC->Gsvolu("CPVG","BOX ",idtmed[715],par,3);
+  par[1] = (geom->GetFTPosition(2) - geom->GetFTPosition(1) - geom->GetCPVTextoliteThickness()) / 2;
+  gMC->Gsvolu("PCPG","BOX ",idtmed[715],par,3);
 
   for (Int_t i=0; i<4; i++) {
-    y = fGeom->GetCPVFrameSize(1) / 2 - fGeom->GetFTPosition(i) + fGeom->GetCPVTextoliteThickness()/2;
-    gMC->Gspos("CPVF",i+1,"CPV",0,y,0,0,"ONLY");
+    y = geom->GetCPVFrameSize(1) / 2 - geom->GetFTPosition(i) + geom->GetCPVTextoliteThickness()/2;
+    gMC->Gspos("PCPF",i+1,"PCPV",0,y,0,0,"ONLY");
     if(i==1){
-      y-= (fGeom->GetFTPosition(2) - fGeom->GetFTPosition(1)) / 2;
-      gMC->Gspos("CPVG",1,"CPV ",0,y,0,0,"ONLY");
+      y-= (geom->GetFTPosition(2) - geom->GetFTPosition(1)) / 2;
+      gMC->Gspos("PCPG",1,"PCPV ",0,y,0,0,"ONLY");
     }
   }
 
   // Dummy sensitive plane in the middle of argone gas volume
 
   par[1]=0.001;
-  gMC->Gsvolu("CPVQ","BOX ",idtmed[715],par,3);
-  gMC->Gspos ("CPVQ",1,"CPVG",0,0,0,0,"ONLY");
+  gMC->Gsvolu("PCPQ","BOX ",idtmed[715],par,3);
+  gMC->Gspos ("PCPQ",1,"PCPG",0,0,0,0,"ONLY");
 
   // Cu+Ni foil covers textolite
 
-  par[1] = fGeom->GetCPVCuNiFoilThickness() / 2;
-  gMC->Gsvolu("CPV1","BOX ",idtmed[710],par,3);
-  y = fGeom->GetCPVTextoliteThickness()/2 - par[1];
-  gMC->Gspos ("CPV1",1,"CPVF",0,y,0,0,"ONLY");
+  par[1] = geom->GetCPVCuNiFoilThickness() / 2;
+  gMC->Gsvolu("PCP1","BOX ",idtmed[710],par,3);
+  y = geom->GetCPVTextoliteThickness()/2 - par[1];
+  gMC->Gspos ("PCP1",1,"PCPF",0,y,0,0,"ONLY");
 
   // Aluminum frame around CPV
 
-  par[0] = fGeom->GetCPVFrameSize(0)/2;
-  par[1] = fGeom->GetCPVFrameSize(1)/2;
-  par[2] = fGeom->GetCPVBoxSize(2)  /2;
-  gMC->Gsvolu("CFR1","BOX ",idtmed[701],par,3);
+  par[0] = geom->GetCPVFrameSize(0)/2;
+  par[1] = geom->GetCPVFrameSize(1)/2;
+  par[2] = geom->GetCPVBoxSize(2)  /2;
+  gMC->Gsvolu("PCF1","BOX ",idtmed[701],par,3);
 
-  par[0] = fGeom->GetCPVBoxSize(0)/2 - fGeom->GetCPVFrameSize(0);
-  par[1] = fGeom->GetCPVFrameSize(1)/2;
-  par[2] = fGeom->GetCPVFrameSize(2)/2;
-  gMC->Gsvolu("CFR2","BOX ",idtmed[701],par,3);
+  par[0] = geom->GetCPVBoxSize(0)/2 - geom->GetCPVFrameSize(0);
+  par[1] = geom->GetCPVFrameSize(1)/2;
+  par[2] = geom->GetCPVFrameSize(2)/2;
+  gMC->Gsvolu("PCF2","BOX ",idtmed[701],par,3);
 
   for (Int_t j=0; j<=1; j++) {
-    x = TMath::Sign(1,2*j-1) * (fGeom->GetCPVBoxSize(0) - fGeom->GetCPVFrameSize(0)) / 2;
-    gMC->Gspos("CFR1",j+1,"CPV", x,0,0,0,"ONLY");
-    z = TMath::Sign(1,2*j-1) * (fGeom->GetCPVBoxSize(2) - fGeom->GetCPVFrameSize(2)) / 2;
-    gMC->Gspos("CFR2",j+1,"CPV",0, 0,z,0,"ONLY");
+    x = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(0) - geom->GetCPVFrameSize(0)) / 2;
+    gMC->Gspos("PCF1",j+1,"PCPV", x,0,0,0,"ONLY");
+    z = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(2) - geom->GetCPVFrameSize(2)) / 2;
+    gMC->Gspos("PCF2",j+1,"PCPV",0, 0,z,0,"ONLY");
   }
 
 }
 
 
+//____________________________________________________________________________
+void AliPHOSv0::CreateGeometryforSupport()
+{
+  // Create the PHOS' support geometry for GEANT
+    //BEGIN_HTML
+  /*
+    <H2>
+    Geant3 geometry of the PHOS's support
+    </H2>
+    <P><CENTER>
+    <IMG Align=BOTTOM ALT="EMC geant tree" SRC="../images/PHOS_support.gif"> 
+    </CENTER><P>
+  */
+  //END_HTML  
+  
+  Float_t par[5], x0,y0,z0 ; 
+  Int_t   i,j,copy;
+
+  // Get pointer to the array containing media indexes
+  Int_t *idtmed = fIdtmed->GetArray() - 699 ;
+
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
+  // --- Dummy box containing two rails on which PHOS support moves
+  // --- Put these rails to the bottom of the L3 magnet
+
+  par[0] =  geom->GetRailRoadSize(0) / 2.0 ;
+  par[1] =  geom->GetRailRoadSize(1) / 2.0 ;
+  par[2] =  geom->GetRailRoadSize(2) / 2.0 ;
+  gMC->Gsvolu("PRRD", "BOX ", idtmed[798], par, 3) ;
+
+  y0     = -(geom->GetRailsDistanceFromIP() - geom->GetRailRoadSize(1) / 2.0) ;
+  gMC->Gspos("PRRD", 1, "ALIC", 0.0, y0, 0.0, 0, "ONLY") ; 
+
+  // --- Dummy box containing one rail
+
+  par[0] =  geom->GetRailOuterSize(0) / 2.0 ;
+  par[1] =  geom->GetRailOuterSize(1) / 2.0 ;
+  par[2] =  geom->GetRailOuterSize(2) / 2.0 ;
+  gMC->Gsvolu("PRAI", "BOX ", idtmed[798], par, 3) ;
+
+  for (i=0; i<2; i++) {
+    x0     = (2*i-1) * geom->GetDistanceBetwRails()  / 2.0 ;
+    gMC->Gspos("PRAI", i, "PRRD", x0, 0.0, 0.0, 0, "ONLY") ; 
+  }
+
+  // --- Upper and bottom steel parts of the rail
+
+  par[0] =  geom->GetRailPart1(0) / 2.0 ;
+  par[1] =  geom->GetRailPart1(1) / 2.0 ;
+  par[2] =  geom->GetRailPart1(2) / 2.0 ;
+  gMC->Gsvolu("PRP1", "BOX ", idtmed[716], par, 3) ;
+
+  y0     = - (geom->GetRailOuterSize(1) - geom->GetRailPart1(1))  / 2.0 ;
+  gMC->Gspos("PRP1", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
+  y0     =   (geom->GetRailOuterSize(1) - geom->GetRailPart1(1))  / 2.0 - geom->GetRailPart3(1);
+  gMC->Gspos("PRP1", 2, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
+
+  // --- The middle vertical steel parts of the rail
+
+  par[0] =  geom->GetRailPart2(0) / 2.0 ;
+  par[1] =  geom->GetRailPart2(1) / 2.0 ;
+  par[2] =  geom->GetRailPart2(2) / 2.0 ;
+  gMC->Gsvolu("PRP2", "BOX ", idtmed[716], par, 3) ;
+
+  y0     =   - geom->GetRailPart3(1) / 2.0 ;
+  gMC->Gspos("PRP2", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ; 
+
+  // --- The most upper steel parts of the rail
+
+  par[0] =  geom->GetRailPart3(0) / 2.0 ;
+  par[1] =  geom->GetRailPart3(1) / 2.0 ;
+  par[2] =  geom->GetRailPart3(2) / 2.0 ;
+  gMC->Gsvolu("PRP3", "BOX ", idtmed[716], par, 3) ;
+
+  y0     =   (geom->GetRailOuterSize(1) - geom->GetRailPart3(1))  / 2.0 ;
+  gMC->Gspos("PRP3", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ; 
+
+  // --- The wall of the cradle
+  // --- The wall is empty: steel thin walls and air inside
+
+  par[1] =  TMath::Sqrt(TMath::Power((geom->GetIPtoCPVDistance() + geom->GetOuterBoxSize(3)),2) +
+                       TMath::Power((geom->GetOuterBoxSize(1)/2),2))+10. ;
+  par[0] =  par[1] - geom->GetCradleWall(1) ;
+  par[2] =  geom->GetCradleWall(2) / 2.0 ;
+  par[3] =  geom->GetCradleWall(3) ;
+  par[4] =  geom->GetCradleWall(4) ;
+  gMC->Gsvolu("PCRA", "TUBS", idtmed[716], par, 5) ;
+
+  par[0] +=  geom->GetCradleWallThickness() ;
+  par[1] -=  geom->GetCradleWallThickness() ;
+  par[2] -=  geom->GetCradleWallThickness() ;
+  gMC->Gsvolu("PCRE", "TUBS", idtmed[798], par, 5) ;
+  gMC->Gspos ("PCRE", 1, "PCRA", 0.0, 0.0, 0.0, 0, "ONLY") ; 
+
+  for (i=0; i<2; i++) {
+    z0 = (2*i-1) * (geom->GetOuterBoxSize(2) + geom->GetCradleWall(2) )/ 2.0  ;
+        gMC->Gspos("PCRA", i, "ALIC", 0.0, 0.0, z0, 0, "ONLY") ; 
+  }
+
+  // --- The "wheels" of the cradle
+  
+  par[0] = geom->GetCradleWheel(0) / 2;
+  par[1] = geom->GetCradleWheel(1) / 2;
+  par[2] = geom->GetCradleWheel(2) / 2;
+  gMC->Gsvolu("PWHE", "BOX ", idtmed[716], par, 3) ;
+
+  y0 = -(geom->GetRailsDistanceFromIP() - geom->GetRailRoadSize(1) -
+        geom->GetCradleWheel(1)/2) ;
+  for (i=0; i<2; i++) {
+    z0 = (2*i-1) * ((geom->GetOuterBoxSize(2) + geom->GetCradleWheel(2))/ 2.0 +
+                    geom->GetCradleWall(2));
+    for (j=0; j<2; j++) {
+      copy = 2*i + j;
+      x0 = (2*j-1) * geom->GetDistanceBetwRails()  / 2.0 ;
+      gMC->Gspos("PWHE", copy, "ALIC", x0, y0, z0, 0, "ONLY") ; 
+    }
+  }
+
+}
+
+//_____________________________________________________________________________
+void AliPHOSv0::AddAlignableVolumes() const
+{
+  //
+  // Create entries for alignable volumes associating the symbolic volume
+  // name with the corresponding volume path. Needs to be syncronized with
+  // eventual changes in the geometry
+  // Alignable volumes are:
+  // 1) PHOS modules as a whole
+  // 2) Cradle
+  // 3) Cradle wheels
+  // 4) Strip units (group of 2x8 crystals)
+
+  TString volpath, symname;
+
+  // Alignable modules
+  // Volume path /ALIC_1/PHOS_<i> => symbolic name /PHOS/Module<i>, <i>=1,2,3,4,5
+
+  TString physModulePath="/ALIC_1/PHOS_";
+  TString symbModuleName="PHOS/Module";
+  Int_t nModules = GetGeometry()->GetNModules();
+
+  for(Int_t iModule=1; iModule<=nModules; iModule++){
+    volpath = physModulePath;
+    volpath += iModule;
+    symname = symbModuleName;
+    symname += iModule;
+    gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+  }
+
+  // Alignable cradle walls
+  // Volume path /ALIC_1/PCRA_<i> => symbolic name /PHOS/Cradle<i>, <i>=0,1
+
+  TString physCradlePath="/ALIC_1/PCRA_";
+  TString symbCradleName="PHOS/Cradle";
+  Int_t nCradles = 2;
+
+  for(Int_t iCradle=0; iCradle<nCradles; iCradle++){
+    volpath = physCradlePath;
+    volpath += iCradle;
+    symname = symbCradleName;
+    symname += iCradle;
+    gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+  }
+
+  // Alignable wheels
+  // Volume path /ALIC_1/PWHE_<i> => symbolic name /PHOS/Wheel<i>, i=0,1,2,3
+
+  TString physWheelPath="/ALIC_1/PWHE_";
+  TString symbWheelName="PHOS/Wheel";
+  Int_t nWheels = 4;
+
+  for(Int_t iWheel=0; iWheel<nWheels; iWheel++){
+    volpath = physWheelPath;
+    volpath += iWheel;
+    symname = symbWheelName;
+    symname += iWheel;
+    gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+  }
+
+  // Alignable strip units are not implemented yet (27.09.2006)
+
+}
+
+//____________________________________________________________________________
+Float_t AliPHOSv0::ZMin(void) const
+{
+  // Overall dimension of the PHOS (min)
+
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
+  return -geom->GetOuterBoxSize(2)/2.;
+}
+
+//____________________________________________________________________________
+Float_t AliPHOSv0::ZMax(void) const
+{
+  // Overall dimension of the PHOS (max)
+
+  AliPHOSGeometry * geom = GetGeometry() ; 
+
+  return  geom->GetOuterBoxSize(2)/2.;
+}
+
 //____________________________________________________________________________
 void AliPHOSv0::Init(void)
 {
@@ -1273,21 +961,20 @@ void AliPHOSv0::Init(void)
   
   Int_t i;
 
-  printf("\n");
-  for(i=0;i<35;i++) printf("*");
-  printf(" PHOS_INIT ");
-  for(i=0;i<35;i++) printf("*");
-  printf("\n");
+  if(AliLog::GetGlobalDebugLevel()>0) {
+    TString st ; 
+    for(i=0;i<35;i++) 
+      st += "*";
+    Info("Init", "%s", st.Data()) ;  
+    // Here the PHOS initialisation code (if any!)
+    
+    AliPHOSGeometry * geom = GetGeometry() ; 
 
-  // Here the PHOS initialisation code (if any!)
+    if (geom!=0)  
+      Info("Init", "AliPHOS%s: PHOS geometry intialized for %s", Version().Data(), geom->GetName()) ;
+    else
+      Info("Init", "AliPHOS%s: PHOS geometry initialization failed !", Version().Data()) ;       
 
-  if (fGeom!=0)  
-    cout << "AliPHOS" << Version() << " : PHOS geometry intialized for " << fGeom->GetName() << endl ;
-  else
-    cout << "AliPHOS" << Version() << " : PHOS geometry initialization failed !" << endl ;   
-  
-  for(i=0;i<80;i++) printf("*");
-  printf("\n");
-  
+    Info("Init", "%s", st.Data()) ;  
+  }
 }
-