]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONSlatGeometryBuilder.cxx
- Added handling of tracks and file mask (used when merging different files).
[u/mrichter/AliRoot.git] / MUON / AliMUONSlatGeometryBuilder.cxx
index 3a9f93ec50d0d2b14add411a09e05997f54c4725..977ce110a15077e021c3e3e516382ce83c79462d 100644 (file)
@@ -41,7 +41,7 @@
 
 #include "AliMUONSlatGeometryBuilder.h"
 #include "AliMUON.h"
-#include "AliMUONChamber.h"
+#include "AliMUONConstants.h"
 #include "AliMUONGeometryModule.h"
 #include "AliMUONGeometryEnvelopeStore.h"
 #include "AliMUONConstants.h"
@@ -51,13 +51,7 @@ ClassImp(AliMUONSlatGeometryBuilder)
 
 //______________________________________________________________________________
 AliMUONSlatGeometryBuilder::AliMUONSlatGeometryBuilder(AliMUON* muon)
- : AliMUONVGeometryBuilder("slat.dat",
-                           muon->Chamber(4).GetGeometry(), 
-                          muon->Chamber(5).GetGeometry(), 
-                           muon->Chamber(6).GetGeometry(), 
-                          muon->Chamber(7).GetGeometry(), 
-                          muon->Chamber(8).GetGeometry(), 
-                          muon->Chamber(9).GetGeometry()),
+ : AliMUONVGeometryBuilder(4, 5, 6, 7, 8, 9),
    fMUON(muon)
 {
 // Standard constructor
@@ -198,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();
@@ -248,30 +242,23 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       iChamber1 = iChamber;
       iChamber2 = &fMUON->Chamber(5);
      
-      //iChamber1->GetGeometry()->SetDebug(kTRUE);
-      //iChamber2->GetGeometry()->SetDebug(kTRUE);
+      //GetGeometry(4)->SetDebug(kTRUE);
+      //GetGeometry(5)->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");
-      }
-
       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 dframep_in = kRframeHeight; 
-       Float_t dframep_out= kVframeLength + 37.0; // Additional 37 cm gap is needed to wrap the corners of the slats 
+       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 =  ( (-iChamber2->Z()) - (-iChamber1->Z()) ) /2.1;
-       tpar[0] = iChamber1->RInner()-dframep_in; 
-       tpar[1] = (iChamber1->ROuter()+dframep_out);
+       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);
-       iChamber1->GetGeometry()->SetVolume("CH05");
-       iChamber2->GetGeometry()->SetVolume("CH06");
       }
       // volumes for slat geometry (xx=5,..,10 chamber id): 
       // Sxx0 Sxx1 Sxx2 Sxx3  -->   Slat Mother volumes 
@@ -334,51 +321,51 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
        Float_t zSlat3 = (i%2 ==0)? -zSlat : zSlat; // seems not that zSlat3 = zSlat4 & 5 refering to plan PQ7EN345-6 ?
 
        sprintf(idSlatCh5,"LA%d",i+kNslats3-1);
-       gMC->Gsvolu(idSlatCh5,"BOX",kSlatMaterial,spar2,3);
+       //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);
+       //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);
+         // 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);
+         // 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);
+       // 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);
+       // 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);
+         //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);
+         //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) );
@@ -568,7 +555,7 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
       Double_t divpar[3];
       Double_t dydiv = kSensHeight/ndiv;
       Double_t ydiv  = (kSensHeight - dydiv)/2.;
-      Double_t rmin  = iChamber1->RInner();// Same radius for both chamber in St3
+      Double_t rmin  = AliMUONConstants::Rmin(2);// Same radius for both chamber in St3
       Double_t xdiv  = 0.;
       Float_t xvol;
       Float_t yvol;
@@ -601,7 +588,7 @@ 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
-      rmin = iChamber1->RInner(); // Same radius for both chamber in St3
+      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
@@ -660,17 +647,16 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     // Mother volume for each chamber
     // Outer excess and inner recess for mother volume radius
     // with respect to ROuter and RInner
-    Float_t dframep_in = kRframeHeight; 
-    Float_t dframep_out= kVframeLength + 40.0; // Additional 30 cm gap is needed to wrap the corners of the slats 
+    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 =  ( (-iChamber2->Z()) - (-iChamber1->Z()) ) /2.1;
-    tpar[0] = iChamber1->RInner()-dframep_in; 
-    tpar[1] = (iChamber1->ROuter()+dframep_out);
+    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);
-    iChamber1->GetGeometry()->SetVolume("CH07");
-    iChamber2->GetGeometry()->SetVolume("CH08");
     
     // create and position the slat (mother) volumes 
 
@@ -695,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);
+      //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);
+      //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);
+       //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 = 726 - (i + kNslats4-1-6);
-       gMC->Gsvolu(idSlatCh7,"BOX",kSlatMaterial,spar,3);
+       //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);
+      //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 = 800 + (i + kNslats4-1-6);
-      gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+      //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 = 813 + (i + kNslats4-1-6);
-       gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+       //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 = 826 - (i + kNslats4-1-6);
-       gMC->Gsvolu(idSlatCh8,"BOX",kSlatMaterial,spar,3);
+       //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) );
       }
@@ -880,7 +866,7 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     Double_t divpar[3];
     Double_t dydiv = kSensHeight/ndiv;
     Double_t ydiv  = (kSensHeight - dydiv)/2.;
-    Float_t rmin   = iChamber1->RInner(); // Same radius for both chamber of St4
+    Float_t rmin   = AliMUONConstants::Rmin(3); // Same radius for both chamber of St4
     Float_t xdiv   = 0.; 
     Float_t xvol;
     Float_t yvol;
@@ -934,17 +920,16 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     // Mother volume for each chamber
     // Outer excess and inner recess for mother volume radius
     // with respect to ROuter and RInner
-    Float_t dframep_in = kRframeHeight; 
-    Float_t dframep_out= kVframeLength + 40.0; // Additional 40 cm gap is needed to wrap the corners of the slats 
+    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 =  ( (-iChamber2->Z()) - (-iChamber1->Z()) ) /2.3;
-    tpar[0] = iChamber1->RInner()-dframep_in; 
-    tpar[1] = (iChamber1->ROuter()+dframep_out);
+    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);
-    iChamber1->GetGeometry()->SetVolume("CH09");
-    iChamber2->GetGeometry()->SetVolume("CH10");
 
     // create and position the slat (mother) volumes 
 
@@ -969,51 +954,51 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
 
       sprintf(idSlatCh9,"LE%d",kNslats5-1+i);
       detElemId = 913 - (i + kNslats5-1-6);
-      gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+      //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 = 900 + (i + kNslats5-1-6);
-      gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+      //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 = 913 + (i + kNslats5-1-6);
-       gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+       //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 = 926 - (i + kNslats5-1-6);
-       gMC->Gsvolu(idSlatCh9,"BOX",kSlatMaterial,spar,3);
+       //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 = 1013 - (i + kNslats5-1-6);
-      gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+      //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 = 1000 + (i + kNslats5-1-6);
-      gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+      //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 = 1013 + (i + kNslats5-1-6);
-       gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+       //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 = 1026 - (i + kNslats5-1-6);
-       gMC->Gsvolu(idSlatCh10,"BOX",kSlatMaterial,spar,3);
+       //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) );
       }
@@ -1155,7 +1140,7 @@ void AliMUONSlatGeometryBuilder::CreateGeometry()
     Double_t divpar[3];
     Double_t dydiv = kSensHeight/ndiv;
     Double_t ydiv  = (kSensHeight - dydiv)/2.;
-    Float_t rmin   = iChamber1->RInner();
+    Float_t rmin   = AliMUONConstants::Rmin(4);
     Float_t xdiv   = 0.; 
     Float_t xvol;
     Float_t yvol; 
@@ -1189,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 = &fMUON->Chamber(4);
-  Double_t zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
-
-  AliMUONChamber* iChamber2 = &fMUON->Chamber(5);
-  Double_t zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
-
- iChamber1 = &fMUON->Chamber(6);
-  zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
-
-  iChamber2 = &fMUON->Chamber(7);
-  zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
-
- iChamber1 = &fMUON->Chamber(8);
-  zpos1 = - iChamber1->Z(); 
-  iChamber1->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos1));
-
-  iChamber2 = &fMUON->Chamber(9);
-  zpos2 = - iChamber2->Z(); 
-  iChamber2->GetGeometry()
-    ->SetTranslation(TGeoTranslation(0., 0., zpos2));
+  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);
+
+  zpos1= - AliMUONConstants::DefaultChamberZ(5); 
+  SetTransformation(5, TGeoTranslation(0., 0., zpos1), st345inclination);
+
+  zpos1 = - AliMUONConstants::DefaultChamberZ(6); 
+  SetTransformation(6, TGeoTranslation(0., 0., zpos1), st345inclination);
+
+  zpos1 = - AliMUONConstants::DefaultChamberZ(7); 
+  SetTransformation(7, TGeoTranslation(0., 0., zpos1), st345inclination );
+
+  zpos1 = - AliMUONConstants::DefaultChamberZ(8); 
+  SetTransformation(8, TGeoTranslation(0., 0., zpos1), st345inclination);
+
+  zpos1 = - AliMUONConstants::DefaultChamberZ(9); 
+  SetTransformation(9, TGeoTranslation(0., 0., zpos1), st345inclination);
 
 }