]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONSlatGeometryBuilder.cxx
Move to new mapping
[u/mrichter/AliRoot.git] / MUON / AliMUONSlatGeometryBuilder.cxx
index d600f5b04711799d6bcfd61bb3aa3e5c7e8f59bf..977ce110a15077e021c3e3e516382ce83c79462d 100644 (file)
@@ -1,10 +1,25 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
 // $Id$
 //
 // Class AliMUONSlatGeometryBuilder
 // -------------------------------
 // Abstract base class for geometry construction per chamber.
 //
-// Author: Eric Dumonteil (dumontei@cea.fr)
+
 
 
 // This Builder is designed according to the enveloppe methode. The basic idea is to be able to allow moves 
 #include <TGeoMatrix.h>
 #include <Riostream.h>
 
+#include "AliRun.h"
+#include "AliLog.h"
+
 #include "AliMUONSlatGeometryBuilder.h"
 #include "AliMUON.h"
-#include "AliMUONChamber.h"
-#include "AliMUONChamberGeometry.h"
+#include "AliMUONConstants.h"
+#include "AliMUONGeometryModule.h"
 #include "AliMUONGeometryEnvelopeStore.h"
 #include "AliMUONConstants.h"
-#include "AliRun.h"
 
 ClassImp(AliMUONSlatGeometryBuilder)
 
 
 //______________________________________________________________________________
 AliMUONSlatGeometryBuilder::AliMUONSlatGeometryBuilder(AliMUON* muon)
- : AliMUONVGeometryBuilder("slat.dat",
-                           &muon->Chamber(4), &muon->Chamber(5), 
-                           &muon->Chamber(6), &muon->Chamber(7), 
-                          &muon->Chamber(8), &muon->Chamber(9)),
+ : AliMUONVGeometryBuilder(4, 5, 6, 7, 8, 9),
    fMUON(muon)
 {
 // Standard constructor
@@ -57,8 +71,7 @@ AliMUONSlatGeometryBuilder::AliMUONSlatGeometryBuilder()
 AliMUONSlatGeometryBuilder::AliMUONSlatGeometryBuilder(const AliMUONSlatGeometryBuilder& rhs)
   : AliMUONVGeometryBuilder(rhs)
 {
-  Fatal("Copy constructor", 
-        "Copy constructor is not implemented.");
+  AliFatal("Copy constructor is not implemented.");
 }
 
 //______________________________________________________________________________
@@ -73,8 +86,7 @@ AliMUONSlatGeometryBuilder::operator = (const AliMUONSlatGeometryBuilder& rhs)
   // check assignement to self
   if (this == &rhs) return *this;
 
-  Fatal("operator=", 
-        "Assignment operator is not implemented.");
+  AliFatal("Assignment operator is not implemented.");
     
   return *this;  
 }
@@ -113,7 +125,7 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
   // sensitive area: 40*40 cm**2
   const Float_t kSensLength = 40.; 
   const Float_t kSensHeight = 40.; 
-  const Float_t kSensWidth  = 0.5; // according to TDR fig 2.120 
+  const Float_t kSensWidth  = AliMUONConstants::Pitch()*2;// 0.5 cm, according to TDR fig 2.120 
   const Int_t kSensMaterial = idGas;
   //     const Float_t kYoverlap   = 1.5; 
 
@@ -148,6 +160,9 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
   const Float_t kPanelHeight = kSensHeight; 
   const Float_t kPanelWidth  = 2 * kCarbonWidth + kNomexWidth;
 
+  // Frame along the rounded (spacers) slats 
+  const Float_t kRframeHeight = 2.00; 
+
   // spacer around the slat: 2 sticks along length,2 along height  
   // H: the horizontal ones 
   const Float_t kHframeLength = kPcbLength; 
@@ -177,7 +192,7 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
   const Float_t kSlatHeight = kPcbHeight; 
   const Float_t kSlatWidth  = kSensWidth + 2.*(kPcbWidth + kInsuWidth + kPanelWidth 
                                               + kNomexBWidth); //replaced rohacell with Nomex Ch. Finck 
-  const Int_t   kSlatMaterial = idAir;
+  // const Int_t   kSlatMaterial = idAir;
   const Float_t kDslatLength  = -1.25; // position of the slat respect to the beam plane (half vertical spacer) Ch. Finck
   Float_t zSlat               = AliMUONConstants::DzSlat();// implemented Ch. Finck
   Float_t dzCh                = AliMUONConstants::DzCh();
@@ -212,31 +227,39 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
 
   Int_t* fStations = new Int_t[5];
   for (Int_t i=0; i<5; i++) fStations[i] = 1;
-  fStations[4] = 1;
+  fStations[2] = 1;
      
   if (fStations[2])
     {
       //********************************************************************
-       //                            Station 3                             **
-       //********************************************************************
-       // indices 1 and 2 for first and second chambers in the station
-       // iChamber (first chamber) kept for other quanties than Z,
-       // assumed to be the same in both chambers
+      //                            Station 3                             **
+      //********************************************************************
+      // indices 1 and 2 for first and second chambers in the station
+      // iChamber (first chamber) kept for other quanties than Z,
+      // assumed to be the same in both chambers
 
-       iChamber = GetChamber(4);
+      iChamber = &fMUON->Chamber(4);
       iChamber1 = iChamber;
-      iChamber2 = GetChamber(5);
+      iChamber2 = &fMUON->Chamber(5);
      
-      //iChamber1->GetGeometry()->SetDebug(kTRUE);
-      //iChamber2->GetGeometry()->SetDebug(kTRUE);
-
-      if (gAlice->GetModule("DIPO")) {
-       // if DIPO is preset, the whole station will be placed in DDIP volume
-       iChamber1->GetGeometry()->SetMotherVolume("DDIP");
-       iChamber2->GetGeometry()->SetMotherVolume("DDIP");
+      //GetGeometry(4)->SetDebug(kTRUE);
+      //GetGeometry(5)->SetDebug(kTRUE);
+      if (!gAlice->GetModule("DIPO")) {
+       // Mother volume for each chamber in st3 are only defined if Dipole volue is there.
+       // Outer excess and inner recess for mother volume radius
+       // with respect to ROuter and RInner
+       Float_t dframepIn = kRframeHeight; 
+       Float_t dframepOut= kVframeLength + 37.0; // Additional 37 cm gap is needed to wrap the corners of the slats 
+       Float_t tpar[3];
+       Double_t dstation =  ( (-AliMUONConstants::DefaultChamberZ(5)) -
+                              (-AliMUONConstants::DefaultChamberZ(4)) ) /2.1;
+       tpar[0] = AliMUONConstants::Rmin(2)-dframepIn; 
+       tpar[1] = AliMUONConstants::Rmax(2)+dframepOut;
+       tpar[2] = dstation;
+       gMC->Gsvolu("CH05", "TUBE", idAir, tpar, 3);
+       gMC->Gsvolu("CH06", "TUBE", idAir, tpar, 3);
       }
-
-
       // volumes for slat geometry (xx=5,..,10 chamber id): 
       // Sxx0 Sxx1 Sxx2 Sxx3  -->   Slat Mother volumes 
       // SxxG                          -->   Sensitive volume (gas)
@@ -297,53 +320,53 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
        Float_t dzCh3 = dzCh; 
        Float_t zSlat3 = (i%2 ==0)? -zSlat : zSlat; // seems not that zSlat3 = zSlat4 & 5 refering to plan PQ7EN345-6 ?
 
-       sprintf(idSlatCh5,"LA%d",kNslats3-1+i);
-       gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
-       detElemId = 500 + i + kNslats3-1;
+       sprintf(idSlatCh5,"LA%d",i+kNslats3-1);
+       //gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
+       detElemId = 509 - (i + kNslats3-1-4);
        GetEnvelopes(4)->AddEnvelope(idSlatCh5, detElemId, true, TGeoTranslation(xSlat3, ySlat3, -zSlat3 + dzCh3),
                                     TGeoRotation("rot1",90,angle,90,90+angle,0,0) );
 
        sprintf(idSlatCh5,"LA%d",3*kNslats3-2+i);
-       gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
-       detElemId = 550 + i + kNslats3-1;
+       //gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
+       detElemId = 500 + (i + kNslats3-1-4);
        GetEnvelopes(4)->AddEnvelope(idSlatCh5, detElemId, true, TGeoTranslation(-xSlat3, ySlat3, zSlat3 - dzCh3),
                                     TGeoRotation("rot2",90,180+angle,90,90+angle,180,0) );
 
        if (i > 0) { 
          sprintf(idSlatCh5,"LA%d",kNslats3-1-i);
-         gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
-         detElemId = 500 - i + kNslats3-1;
+         // gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
+         detElemId = 509 + (i + kNslats3-1-4);
          GetEnvelopes(4)->AddEnvelope(idSlatCh5, detElemId, true, TGeoTranslation(xSlat3, -ySlat3, -zSlat3 + dzCh3), 
                                       TGeoRotation("rot3",90,angle,90,270+angle,180,0) );
 
          sprintf(idSlatCh5,"LA%d",3*kNslats3-2-i);
-         gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
-         detElemId = 550 - i + kNslats3-1;
+         // gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
+         detElemId = 518 - (i + kNslats3-1-4);
          GetEnvelopes(4)->AddEnvelope(idSlatCh5, detElemId, true, TGeoTranslation(-xSlat3, -ySlat3, zSlat3 - dzCh3),
                                       TGeoRotation("rot4",90,180+angle,90,270+angle,0,0) );
        }
 
        sprintf(idSlatCh6,"LB%d",kNslats3-1+i);  
-       gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
-       detElemId = 600 + i  + kNslats3-1;
+       // gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
+       detElemId = 609 - (i  + kNslats3-1-4);
        GetEnvelopes(5)->AddEnvelope(idSlatCh6, detElemId, true, TGeoTranslation(xSlat3, ySlat3, -zSlat3 + dzCh3),
                                     TGeoRotation("rot5",90,angle,90,90+angle,0,0) );
        sprintf(idSlatCh6,"LB%d",3*kNslats3-2+i);
-       gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
-       detElemId = 650 + i + kNslats3-1;
+       // gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
+       detElemId = 600 + (i + kNslats3-1-4);
        GetEnvelopes(5)->AddEnvelope(idSlatCh6, detElemId, true, TGeoTranslation(-xSlat3, ySlat3, zSlat3 - dzCh3),
                                     TGeoRotation("rot6",90,180+angle,90,90+angle,180,0) );
 
        if (i > 0) { 
          sprintf(idSlatCh6,"LB%d",kNslats3-1-i);
-         gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
-         detElemId = 600 - i + kNslats3-1;
+         //gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
+         detElemId = 609 + (i + kNslats3-1-4);
          GetEnvelopes(5)->AddEnvelope(idSlatCh6, detElemId, true, TGeoTranslation(xSlat3, -ySlat3, -zSlat3 + dzCh3),
                                       TGeoRotation("rot7",90,angle,90,270+angle,180,0) );
 
          sprintf(idSlatCh6,"LB%d",3*kNslats3-2-i);
-         gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
-         detElemId = 650 - i + kNslats3-1;
+         //gMC->Gsvolu(idSlatCh6,"BOX",kSlatMaterial,spar,3);
+         detElemId = 618 - (i + kNslats3-1-4);
          GetEnvelopes(5)->AddEnvelope(idSlatCh6, detElemId, true, TGeoTranslation(-xSlat3, -ySlat3, zSlat3 - dzCh3),
                                       TGeoRotation("rot8",90,180+angle,90,270+angle,0,0) );
        }
@@ -526,25 +549,26 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       }
 
       // position the volumes approximating the circular section of the pipe
-      Float_t yoffs = kSensHeight/2.; 
       Float_t epsilon = 0.001; 
       Int_t ndiv = 6;
+      Int_t imax = 1;
       Double_t divpar[3];
-      Double_t dydiv= kSensHeight/ndiv;
-      Double_t ydiv = yoffs -dydiv/2.;
-      Int_t imax = 0; 
-      imax = 1; 
-      Double_t rmin = 31.5;  // Corrected in sep04 from PQ-LAT-SR2 de CEA-DSM-DAPNIA-SIS/BE ph HARDY 19-Oct-2002 slat 
-      Double_t xdiv = 0.;
-      for (Int_t idiv = 0;idiv < ndiv; idiv++){ 
+      Double_t dydiv = kSensHeight/ndiv;
+      Double_t ydiv  = (kSensHeight - dydiv)/2.;
+      Double_t rmin  = AliMUONConstants::Rmin(2);// Same radius for both chamber in St3
+      Double_t xdiv  = 0.;
+      Float_t xvol;
+      Float_t yvol;
+
+      for (Int_t idiv = 0; idiv < ndiv; idiv++){ 
        ydiv += dydiv;
        xdiv = 0.; 
-       if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
-       divpar[0] = (kPcbLength-xdiv)/2.; 
+       if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos((ydiv-dydiv/2.)/rmin) );
+       divpar[0] = (kPcbLength - xdiv)/2.; 
        divpar[1] = dydiv/2. - epsilon;
        divpar[2] = kSensWidth/2.; 
-       Float_t xvol = (kPcbLength+xdiv)/2.;
-       Float_t yvol = ydiv; 
+       xvol = (kPcbLength + xdiv)/2.;
+       yvol = ydiv; 
 
        // Volumes close to the beam pipe for slat i=1 so 4 slats per chamber
        for (Int_t quadrant = 1; quadrant <= 4; quadrant++) {
@@ -552,10 +576,10 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
          sprintf(idSlatCh6,"LB%d",ConvertSlatNum(1,quadrant,kNslats3-1));
 
          GetEnvelopes(4)->AddEnvelopeConstituentParam("S05G", idSlatCh5, quadrant*100+imax+4*idiv+1,
-                                                      TGeoTranslation(xvol-(kPcbLength * (kNPCB3[1])/2.),yvol-kPcbLength,0.),3,divpar);
+                                                      TGeoTranslation(xvol-(kPcbLength * kNPCB3[1]/2.),yvol-kPcbLength,0.),3,divpar);
 
          GetEnvelopes(5)->AddEnvelopeConstituentParam("S06G", idSlatCh6,  quadrant*100+imax+4*idiv+1,
-                                                      TGeoTranslation(xvol-kPcbLength * kNPCB3[1]/2.,yvol-kPcbLength,0.),3,divpar);
+                                                      TGeoTranslation(xvol-(kPcbLength * kNPCB3[1]/2.),yvol-kPcbLength,0.),3,divpar);
        }
       }
 
@@ -564,18 +588,19 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       // 9 box volumes are used to define the PCB closed to the beam pipe of the slat 122000SR1 of chamber 5 and 6 of St3
       // Accordingly to plan PQ-LAT-SR1 of CEA-DSM-DAPNIA-SIS/BE ph HARDY 8-Oct-2002
       // Rmin = 31.5 cm
-      Double_t rmin_122000SR1 = 31.5; //in cm  
+      rmin = AliMUONConstants::Rmin(2); // Same radius for both chamber in St3
       ndiv  = 9; 
       dydiv = kSensHeight/ndiv;           // Vertical size of the box volume approximating the rounded PCB
       ydiv  = -kSensHeight/2 + dydiv/2.;   // Initializing vertical position of the volume from bottom
       xdiv  = 0.;                         // Initializing horizontal position of the box volumes
-      for (Int_t idiv=0;idiv<ndiv; idiv++){ 
-       xdiv = TMath::Abs( rmin_122000SR1 * TMath::Sin( TMath::ACos(ydiv/rmin_122000SR1) ) );
-       divpar[0] = (kPcbLength-xdiv)/2.; // Dimension of the box volume
+
+      for (Int_t idiv = 0; idiv < ndiv; idiv++){ 
+       xdiv = TMath::Abs( rmin * TMath::Sin( TMath::ACos(ydiv/rmin) ) );
+       divpar[0] = (kPcbLength - xdiv)/2.; // Dimension of the box volume
        divpar[1] = dydiv/2. - epsilon;
        divpar[2] = kSensWidth/2.; 
-       Float_t xvol = (kPcbLength+xdiv)/2.; //2D traslition for positionning of box volume
-       Float_t yvol =  ydiv;
+       xvol = (kPcbLength + xdiv)/2.; //2D traslition for positionning of box volume
+       yvol =  ydiv;
        Int_t side;
        for (side = 1; side <= 2; side++) {
          sprintf(idSlatCh5,"LA%d",4);     
@@ -585,10 +610,10 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
            sprintf(idSlatCh6,"LB%d",13);
          }        
          GetEnvelopes(4)->AddEnvelopeConstituentParam("S05G", idSlatCh5,500+side*100+imax+4*idiv+1,
-                                                      TGeoTranslation(xvol-(kPcbLength * (kNPCB3[0])/2.),yvol,0.),3,divpar);
+                                                      TGeoTranslation(xvol-(kPcbLength * kNPCB3[0]/2.),yvol,0.),3,divpar);
 
          GetEnvelopes(5)->AddEnvelopeConstituentParam("S06G", idSlatCh6,500+side*100+imax+4*idiv+1,
-                                                      TGeoTranslation(xvol-kPcbLength * kNPCB3[0]/2.,yvol,0.),3,divpar);
+                                                      TGeoTranslation(xvol-(kPcbLength * kNPCB3[0]/2.),yvol,0.),3,divpar);
        }
        ydiv += dydiv; // Going from bottom to top
       }
@@ -606,18 +631,33 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     //      // assumed to be the same in both chambers
     //      corrected geometry (JP. Cussonneau, Ch. Finck)
  
-    iChamber = GetChamber(6);
+    iChamber = &fMUON->Chamber(6);
     iChamber1 = iChamber;
-    iChamber2 = GetChamber(7);
+    iChamber2 = &fMUON->Chamber(7);
 
     const Int_t   kNslats4          = 7;  // number of slats per quadrant
     const Int_t   kNPCB4[kNslats4]  = {5, 6, 5, 5, 4, 3, 2}; // n PCB per slat
     const Float_t kXpos4[kNslats4]  = {38.2, 0., 0., 0., 0., 0., 0.};
     const Float_t kYpos41[kNslats4] = {0., 38.2, 34.40, 36.60, 29.3, 37.0, 28.6};
-    const Float_t kYpos42[kNslats4] = {0., 38.2, 37.85, 37.55, 37.0, 29.4, 36.2};
+    const Float_t kYpos42[kNslats4] = {0., 38.2, 37.85, 37.55, 29.4, 37.0, 28.6};
 
     Float_t slatLength4[kNslats4];     
 
+
+    // Mother volume for each chamber
+    // Outer excess and inner recess for mother volume radius
+    // with respect to ROuter and RInner
+    Float_t dframepIn = kRframeHeight; 
+    Float_t dframepOut= kVframeLength + 40.0; // Additional 30 cm gap is needed to wrap the corners of the slats 
+    Float_t tpar[3];
+    Double_t dstation =  ( (-AliMUONConstants::DefaultChamberZ(7)) - 
+                           (-AliMUONConstants::DefaultChamberZ(6)) ) /2.2;
+    tpar[0] = AliMUONConstants::Rmin(3)-dframepIn; 
+    tpar[1] = AliMUONConstants::Rmax(3)+dframepOut;
+    tpar[2] = dstation;
+    gMC->Gsvolu("CH07", "TUBE", idAir, tpar, 3);
+    gMC->Gsvolu("CH08", "TUBE", idAir, tpar, 3);
+    
     // create and position the slat (mother) volumes 
 
     char idSlatCh7[5];
@@ -641,52 +681,52 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       Float_t zSlat4 = (i%2 ==0)? -zSlat : zSlat; 
 
       sprintf(idSlatCh7,"LC%d",kNslats4-1+i);
-      gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
-      detElemId = 700 + i + kNslats4-1;
+      //gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
+      detElemId = 713 - (i + kNslats4-1-6);
       GetEnvelopes(6)->AddEnvelope(idSlatCh7, detElemId, true, TGeoTranslation(xSlat4, ySlat41, -zSlat4 + dzCh4),
                                   TGeoRotation("rot1",90,angle,90,90+angle,0,0) );
 
       sprintf(idSlatCh7,"LC%d",3*kNslats4-2+i);
-      gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
-      detElemId = 750 + i + kNslats4-1;
+      //gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
+      detElemId = 700 + (i + kNslats4-1-6);
       GetEnvelopes(6)->AddEnvelope(idSlatCh7, detElemId, true, TGeoTranslation(-xSlat4, ySlat41, zSlat4 - dzCh4),
                                   TGeoRotation("rot2",90,180+angle,90,90+angle,180,0) );
  
       if (i > 0) { 
        sprintf(idSlatCh7,"LC%d",kNslats4-1-i);
-       gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
-       detElemId = 700 - i + kNslats4-1;
+       //gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
+       detElemId = 713 + (i + kNslats4-1-6);
        GetEnvelopes(6)->AddEnvelope(idSlatCh7, detElemId, true, TGeoTranslation(xSlat4, -ySlat41, -zSlat4 + dzCh4),
                                     TGeoRotation("rot3",90,angle,90,270+angle,180,0) );
 
        sprintf(idSlatCh7,"LC%d",3*kNslats4-2-i);
-       detElemId = 750 - i + kNslats4-1;
-       gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
+       detElemId = 726 - (i + kNslats4-1-6);
+       //gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(6)->AddEnvelope(idSlatCh7, detElemId, true, 
                                     TGeoTranslation(-xSlat4, -ySlat41, zSlat4 - dzCh4),
                                     TGeoRotation("rot4",90,180+angle,90,270+angle,0,0) );
       }
 
       sprintf(idSlatCh8,"LD%d",kNslats4-1+i);
-      gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
-      detElemId = 800 + i + kNslats4-1;
+      //gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+      detElemId = 813 - (i + kNslats4-1-6);
       GetEnvelopes(7)->AddEnvelope(idSlatCh8, detElemId, true, TGeoTranslation(xSlat4, ySlat42, -zSlat4 + dzCh4),
                                   TGeoRotation("rot5",90,angle,90,90+angle,0,0) );
 
       sprintf(idSlatCh8,"LD%d",3*kNslats4-2+i);
-      detElemId = 850 + i + kNslats4-1;
-      gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+      detElemId = 800 + (i + kNslats4-1-6);
+      //gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
       GetEnvelopes(7)->AddEnvelope(idSlatCh8, detElemId, true, TGeoTranslation(-xSlat4, ySlat42, zSlat4 - dzCh4),
                                   TGeoRotation("rot6",90,180+angle,90,90+angle,180,0) );
       if (i > 0) { 
        sprintf(idSlatCh8,"LD%d",kNslats4-1-i);
-       detElemId = 800 - i + kNslats4-1;
-       gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+       detElemId = 813 + (i + kNslats4-1-6);
+       //gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(7)->AddEnvelope(idSlatCh8, detElemId, true, TGeoTranslation(xSlat4, -ySlat42, -zSlat4 + dzCh4),
                                     TGeoRotation("rot7",90,angle,90,270+angle,180,0) );
        sprintf(idSlatCh8,"LD%d",3*kNslats4-2-i);
-       detElemId = 850 - i + kNslats4-1;
-       gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+       detElemId = 826 - (i + kNslats4-1-6);
+       //gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(7)->AddEnvelope(idSlatCh8, detElemId, true, TGeoTranslation(-xSlat4, -ySlat42, zSlat4 - dzCh4),
                                     TGeoRotation("rot8",90,180+angle,90,270+angle,0,0) );
       }
@@ -820,26 +860,28 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
 
     // position the volumes approximating the circular section of the pipe
 
-    Float_t yoffs = kSensHeight/2.; 
     Float_t epsilon = 0.001; 
     Int_t ndiv = 10;
+    Int_t imax = 1; 
     Double_t divpar[3];
-    Double_t dydiv= kSensHeight/ndiv;
-    Double_t ydiv = yoffs -dydiv;
-    Int_t imax=0; 
-    imax = 1; 
-    Float_t rmin = 39.5;
+    Double_t dydiv = kSensHeight/ndiv;
+    Double_t ydiv  = (kSensHeight - dydiv)/2.;
+    Float_t rmin   = AliMUONConstants::Rmin(3); // Same radius for both chamber of St4
+    Float_t xdiv   = 0.; 
+    Float_t xvol;
+    Float_t yvol;
+
     for (Int_t idiv = 0; idiv < ndiv; idiv++){ 
       ydiv += dydiv;
-      Float_t xdiv = 0.; 
-      if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
-      divpar[0] = (kPcbLength-xdiv)/2.; 
+      xdiv = 0.; 
+      if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos((ydiv-dydiv/2.)/rmin) );
+      divpar[0] = (kPcbLength - xdiv)/2.; 
       divpar[1] = dydiv/2. - epsilon;
       divpar[2] = kSensWidth/2.; 
-      Float_t xvol = (kPcbLength+xdiv)/2.;
-      Float_t yvol = ydiv + dydiv/2.;
+      xvol = (kPcbLength + xdiv)/2.;
+      yvol = ydiv ;
        
-      for (Int_t quadrant=1; quadrant<=4; quadrant++) {
+      for (Int_t quadrant = 1; quadrant <= 4; quadrant++) {
        sprintf(idSlatCh7,"LC%d",ConvertSlatNum(1,quadrant,kNslats4-1));
        sprintf(idSlatCh8,"LD%d",ConvertSlatNum(1,quadrant,kNslats4-1));
         
@@ -865,9 +907,9 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     //      // assumed to be the same in both chambers
     //      corrected geometry (JP. Cussonneau, Ch. Finck)
 
-    iChamber = GetChamber(8);
+    iChamber = &fMUON->Chamber(8);
     iChamber1 = iChamber;
-    iChamber2 = GetChamber(9);
+    iChamber2 = &fMUON->Chamber(9);
  
     const Int_t   kNslats5         = 7;  // number of slats per quadrant
     const Int_t   kNPCB5[kNslats5] = {5, 6, 6, 6, 5, 4, 3}; // n PCB per slat
@@ -875,6 +917,20 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     const Float_t kYpos5[kNslats5] = {0., 38.2, 37.9, 37.6, 37.3, 37.05, 36.75};
     Float_t slatLength5[kNslats5]; 
 
+    // Mother volume for each chamber
+    // Outer excess and inner recess for mother volume radius
+    // with respect to ROuter and RInner
+    Float_t dframepIn = kRframeHeight; 
+    Float_t dframepOut= kVframeLength + 40.0; // Additional 40 cm gap is needed to wrap the corners of the slats 
+    Float_t tpar[3];
+    Double_t dstation =  ( (-AliMUONConstants::DefaultChamberZ(9)) - 
+                           (-AliMUONConstants::DefaultChamberZ(8)) ) /2.3;
+    tpar[0] = AliMUONConstants::Rmin(4)-dframepIn; 
+    tpar[1] = AliMUONConstants::Rmax(4)+dframepOut;
+    tpar[2] = dstation;
+    gMC->Gsvolu("CH09", "TUBE", idAir, tpar, 3);
+    gMC->Gsvolu("CH10", "TUBE", idAir, tpar, 3);
+
     // create and position the slat (mother) volumes 
 
     char idSlatCh9[5];
@@ -897,52 +953,52 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       Float_t zSlat5 = (i%2 ==0)? -zSlat : zSlat; 
 
       sprintf(idSlatCh9,"LE%d",kNslats5-1+i);
-      detElemId = 900 + i + kNslats5-1;
-      gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+      detElemId = 913 - (i + kNslats5-1-6);
+      //gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
       GetEnvelopes(8)->AddEnvelope(idSlatCh9, detElemId, true, TGeoTranslation(xSlat5, ySlat5, -zSlat5 + dzCh5),
                                   TGeoRotation("rot1",90,angle,90,90+angle,0,0) );
 
       sprintf(idSlatCh9,"LE%d",3*kNslats5-2+i);
-      detElemId = 950 + i + kNslats5-1;
-      gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+      detElemId = 900 + (i + kNslats5-1-6);
+      //gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
       GetEnvelopes(8)->AddEnvelope(idSlatCh9, detElemId, true, TGeoTranslation(-xSlat5, ySlat5, zSlat5 - dzCh5),
                                   TGeoRotation("rot2",90,180+angle,90,90+angle,180,0) );
  
       if (i > 0) { 
        sprintf(idSlatCh9,"LE%d",kNslats5-1-i);
-       detElemId = 900 - i + kNslats5-1;
-       gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+       detElemId = 913 + (i + kNslats5-1-6);
+       //gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(8)->AddEnvelope(idSlatCh9, detElemId, true, TGeoTranslation(xSlat5, -ySlat5, -zSlat5 + dzCh5),
                                     TGeoRotation("rot3",90,angle,90,270+angle,180,0) );
 
        sprintf(idSlatCh9,"LE%d",3*kNslats5-2-i);
-       detElemId = 950 - i + kNslats5-1;
-       gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+       detElemId = 926 - (i + kNslats5-1-6);
+       //gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(8)->AddEnvelope(idSlatCh9, detElemId, true, TGeoTranslation(-xSlat5, -ySlat5, zSlat5 - dzCh5),
                                     TGeoRotation("rot4",90,180+angle,90,270+angle,0,0)  );
       }
 
       sprintf(idSlatCh10,"LF%d",kNslats5-1+i);
-      detElemId = 1000 + i + kNslats5-1;
-      gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+      detElemId = 1013 - (i + kNslats5-1-6);
+      //gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
       GetEnvelopes(9)->AddEnvelope(idSlatCh10, detElemId, true, TGeoTranslation(xSlat5, ySlat5, -zSlat5 + dzCh5),
                                   TGeoRotation("rot5",90,angle,90,90+angle,0,0) );
 
       sprintf(idSlatCh10,"LF%d",3*kNslats5-2+i);
-      detElemId = 1050 + i + kNslats5-1;
-      gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+      detElemId = 1000 + (i + kNslats5-1-6);
+      //gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
       GetEnvelopes(9)->AddEnvelope(idSlatCh10, detElemId, true, TGeoTranslation(-xSlat5, ySlat5, zSlat5 - dzCh5),
                                   TGeoRotation("rot6",90,180+angle,90,90+angle,180,0) );
 
       if (i > 0) { 
        sprintf(idSlatCh10,"LF%d",kNslats5-1-i);
-       detElemId = 1000 - i + kNslats5-1;
-       gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+       detElemId = 1013 + (i + kNslats5-1-6);
+       //gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(9)->AddEnvelope(idSlatCh10, detElemId, true, TGeoTranslation(xSlat5, -ySlat5, -zSlat5 + dzCh5),
                                     TGeoRotation("rot7",90,angle,90,270+angle,180,0) );
        sprintf(idSlatCh10,"LF%d",3*kNslats5-2-i);
-       detElemId = 1050 - i + kNslats5-1;
-       gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+       detElemId = 1026 - (i + kNslats5-1-6);
+       //gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
        GetEnvelopes(9)->AddEnvelope(idSlatCh10, detElemId, true, TGeoTranslation(-xSlat5, -ySlat5, zSlat5 - dzCh5),
                                     TGeoRotation("rot8",90,180+angle,90,270+angle,0,0) );
       }
@@ -1078,24 +1134,26 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
 
 
     // position the volumes approximating the circular section of the pipe
-    Float_t yoffs = kSensHeight/2.; 
     Float_t epsilon = 0.001; 
     Int_t ndiv = 10;
+    Int_t imax = 1; 
     Double_t divpar[3];
     Double_t dydiv = kSensHeight/ndiv;
-    Double_t ydiv = yoffs -dydiv;
-    Int_t imax = 0; 
-    imax = 1; 
-    Float_t rmin = 40.;
-    for (Int_t idiv = 0;idiv < ndiv; idiv++){ 
+    Double_t ydiv  = (kSensHeight - dydiv)/2.;
+    Float_t rmin   = AliMUONConstants::Rmin(4);
+    Float_t xdiv   = 0.; 
+    Float_t xvol;
+    Float_t yvol; 
+
+    for (Int_t idiv = 0; idiv < ndiv; idiv++){ 
       ydiv += dydiv;
-      Float_t xdiv = 0.; 
-      if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos(ydiv/rmin) );
-      divpar[0] = (kPcbLength-xdiv)/2.; 
+      xdiv = 0.; 
+      if (ydiv < rmin) xdiv = rmin * TMath::Sin( TMath::ACos((ydiv-dydiv/2.)/rmin) );
+      divpar[0] = (kPcbLength - xdiv)/2.; 
       divpar[1] = dydiv/2. - epsilon;
       divpar[2] = kSensWidth/2.; 
-      Float_t xvol = (kPcbLength+xdiv)/2.;
-      Float_t yvol = ydiv + dydiv/2.;
+      xvol = (kPcbLength + xdiv)/2.;
+      yvol = ydiv;
 
       for (Int_t quadrant = 1; quadrant <= 4; quadrant++) {
        sprintf(idSlatCh9,"LE%d",ConvertSlatNum(1,quadrant,kNslats5-1));
@@ -1116,38 +1174,47 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
 //______________________________________________________________________________
 void AliMUONSlatGeometryBuilder::SetTransformations()
 {
-// Defines the transformations for the station2 chambers.
+// Defines the transformations for the station345 chambers.
 // ---
 
-  AliMUONChamber* iChamber1 = GetChamber(4);
-  Double_t zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
+  if (gAlice->GetModule("DIPO")) {
+    // if DIPO is preset, the whole station will be placed in DDIP volume
+    SetMotherVolume(4, "DDIP");
+    SetMotherVolume(5, "DDIP");
+    SetVolume(4, "CH05", true);
+    SetVolume(5, "CH06", true);
+  }    
+  else {
+    SetVolume(4, "CH05");
+    SetVolume(5, "CH06");
+  }  
+  SetVolume(6, "CH07");
+  SetVolume(7, "CH08");
+  SetVolume(8, "CH09");
+  SetVolume(9, "CH10");
+
+// Stations 345 are not perpendicular to the beam axis
+// See AliMUONConstants class
+  TGeoRotation st345inclination("rot99");
+  st345inclination.RotateX(AliMUONConstants::St345Inclination());
+  
+  Double_t zpos1= - AliMUONConstants::DefaultChamberZ(4); 
+  SetTransformation(4, TGeoTranslation(0., 0., zpos1), st345inclination);
 
-  AliMUONChamber* iChamber2 = GetChamber(5);
-  Double_t zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
+  zpos1= - AliMUONConstants::DefaultChamberZ(5); 
+  SetTransformation(5, TGeoTranslation(0., 0., zpos1), st345inclination);
 
- iChamber1 = GetChamber(6);
-  zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
+  zpos1 = - AliMUONConstants::DefaultChamberZ(6); 
+  SetTransformation(6, TGeoTranslation(0., 0., zpos1), st345inclination);
 
-  iChamber2 = GetChamber(7);
-  zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
+  zpos1 = - AliMUONConstants::DefaultChamberZ(7); 
+  SetTransformation(7, TGeoTranslation(0., 0., zpos1), st345inclination );
 
- iChamber1 = GetChamber(8);
-  zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
+  zpos1 = - AliMUONConstants::DefaultChamberZ(8); 
+  SetTransformation(8, TGeoTranslation(0., 0., zpos1), st345inclination);
 
-  iChamber2 = GetChamber(9);
-  zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
+  zpos1 = - AliMUONConstants::DefaultChamberZ(9); 
+  SetTransformation(9, TGeoTranslation(0., 0., zpos1), st345inclination);
 
 }
 
@@ -1157,12 +1224,12 @@ void AliMUONSlatGeometryBuilder::SetSensitiveVolumes()
 // Defines the sensitive volumes for slat stations chambers.
 // ---
 
-  GetChamber(4)->GetGeometry()->SetSensitiveVolume("S05G");
-  GetChamber(5)->GetGeometry()->SetSensitiveVolume("S06G");
-  GetChamber(6)->GetGeometry()->SetSensitiveVolume("S07G");
-  GetChamber(7)->GetGeometry()->SetSensitiveVolume("S08G");
-  GetChamber(8)->GetGeometry()->SetSensitiveVolume("S09G");
-  GetChamber(9)->GetGeometry()->SetSensitiveVolume("S10G");
+  GetGeometry(4)->SetSensitiveVolume("S05G");
+  GetGeometry(5)->SetSensitiveVolume("S06G");
+  GetGeometry(6)->SetSensitiveVolume("S07G");
+  GetGeometry(7)->SetSensitiveVolume("S08G");
+  GetGeometry(8)->SetSensitiveVolume("S09G");
+  GetGeometry(9)->SetSensitiveVolume("S10G");
 }
 
 //______________________________________________________________________________