]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTest.cxx
Adding mask handling
[u/mrichter/AliRoot.git] / MUON / AliMUONTest.cxx
index f34bb8b9a1be57366e9804958c8fe3a988f1ee2b..ad4c25aee7ec48216576154f80e06f10d68bd216 100644 (file)
 
 // $Id$
 //
+// -----------------
 // Class AliMUONTest
 // -----------------
-// Class with functions for testing
+// Class with functions for testing segmentations
 //
 // Author: Ivana Hrivnacova, IPN Orsay
 
-#include <TStopwatch.h>
-#include <Riostream.h>
-#include <TH2F.h>
-#include <TPave.h>
-#include <TCanvas.h>
-
-#include "AliRun.h"
-#include "AliSegmentation.h"
-#include "AliLog.h"
-
 #include "AliMUONTest.h"
 #include "AliMUON.h"
 #include "AliMUONConstants.h"
+#include "AliMUONGeometryBuilder.h"
+#include "AliMUONSt1GeometryBuilderV2.h"
+#include "AliMUONSt2GeometryBuilderV2.h"
+#include "AliMUONSlatGeometryBuilder.h"
+#include "AliMUONTriggerGeometryBuilder.h"
+#include "AliMUONSegFactory.h"
+#include "AliMUONGeometryTransformer.h"
 #include "AliMUONGeometryModule.h"
 #include "AliMUONGeometryStore.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONSegmentation.h"
 #include "AliMUONGeometrySegmentation.h"
-#include "AliMUONSt12QuadrantSegmentation.h"
-#include "AliMUONSt345SlatSegmentation.h"
+
+#include "AliRun.h"
+#include "AliLog.h"
+
+#include <TStopwatch.h>
+#include <Riostream.h>
+#include <TH2F.h>
+#include <TPave.h>
+#include <TCanvas.h>
+#include <TGeoMatrix.h>
 
 ClassImp(AliMUONTest)
 
-//__________________________________________________________________
-  AliMUONTest::AliMUONTest(const TString& configMacro)
+//_____________________________________________________________________________
+  AliMUONTest::AliMUONTest(const TString& option)
   : TObject(),
+    fkTransformer(0),
+    fSegmentation(0),
     fCanvas(0)
 {
 // Standard Constructor
 //
-  // Initialize AliRoot
-  gAlice->Init(configMacro.Data());
+
+  if ( option != "default" && 
+       option != "FactoryV2" &&
+       option != "FactoryV3" && 
+       option != "FactoryV4" && 
+       option != "new" )  
+  {
+    BuildWithMUON(option);
+  }
+  else     
+    BuildWithoutMUON(option);
 }
 
-//__________________________________________________________________
+//_____________________________________________________________________________
 AliMUONTest::AliMUONTest()
   : TObject(),
+    fkTransformer(0),
+    fSegmentation(0),
     fCanvas(0)
 {
 // Default Constructor
 //
 }
 
-//____________________________________________________________________
+//_____________________________________________________________________________
 AliMUONTest::AliMUONTest(const AliMUONTest& rhs)
  : TObject(rhs)
 {
@@ -71,7 +92,7 @@ AliMUONTest::AliMUONTest(const AliMUONTest& rhs)
   AliFatal("Not implemented.");
 }
 
-//____________________________________________________________________
+//_____________________________________________________________________________
 AliMUONTest::~AliMUONTest()
 {
 // Destructor
@@ -79,7 +100,7 @@ AliMUONTest::~AliMUONTest()
   delete fCanvas;
 }
 
-//________________________________________________________________________
+//_____________________________________________________________________________
 AliMUONTest& AliMUONTest::operator = (const AliMUONTest& rhs)
 {
 // Protected assignement operator
@@ -94,617 +115,94 @@ AliMUONTest& AliMUONTest::operator = (const AliMUONTest& rhs)
 //
 // private methods
 //
-
-//________________________________________________________________________
-AliMUONGeometrySegmentation*     
-AliMUONTest::CreateSt1Segmentation(Int_t chamberId, Int_t cathod)
+//_____________________________________________________________________________
+void AliMUONTest::BuildWithMUON(const TString& configMacro)
 {
-// Create St1 geometry segmentation for given chamber and cathod
+// Build segmentation via AliMUON initialisation
 
+  gAlice->Init(configMacro.Data());
   AliMUON* muon = (AliMUON*)gAlice->GetModule("MUON");
   if (!muon) {
     AliFatal("MUON detector not defined.");
-    return 0;   
+    return;
   }  
-
-  AliMUONGeometrySegmentation* segmentation
-    = new AliMUONGeometrySegmentation(muon->Chamber(chamberId).GetGeometry());
-    
-  // Quadrant segmentations:
-  AliMUONSt12QuadrantSegmentation* bendSt1
-    = new AliMUONSt12QuadrantSegmentation(kStation1, kBendingPlane);
-  AliMUONSt12QuadrantSegmentation* nonbendSt1
-    = new AliMUONSt12QuadrantSegmentation(kStation1, kNonBendingPlane);
-
-  // The same configuration for both chambers of Station 1
-  Int_t id0 = (chamberId+1)*100;
-
-  // Configure  St1 chamber segmentations
-  if (cathod == 0) {
-    segmentation->Add(id0,      bendSt1);
-    segmentation->Add(id0 +  1, nonbendSt1);
-    segmentation->Add(id0 + 50, bendSt1);
-    segmentation->Add(id0 + 51, nonbendSt1);
-  }
-  else if (cathod == 1) {
-    segmentation->Add(id0,      nonbendSt1);
-    segmentation->Add(id0 +  1, bendSt1);
-    segmentation->Add(id0 + 50, nonbendSt1);
-    segmentation->Add(id0 + 51, bendSt1);
-  }
-  else {
-    AliError("Wrong cathod number");
-    return 0;
-  }
-  
-  return segmentation;
-}      
+  fkTransformer = muon->GetGeometryTransformer();
+  fSegmentation   = muon->GetSegmentation();
+}    
 
 //_____________________________________________________________________________
-AliMUONGeometrySegmentation*     
-AliMUONTest::CreateSlatSegmentation(Int_t chamberId, Int_t cathod)
+void AliMUONTest::BuildWithoutMUON(const TString& option)
 {
-// Create St1 geometry segmentation for given chamber and cathod
+// Fill geometry from transform*.dat files and build segmentation via 
+// SegFactory
 
-  AliMUON* muon = (AliMUON*)gAlice->GetModule("MUON");
-  if (!muon) {
-    AliFatal("MUON detector not defined.");
-    return 0;
-  }  
+  AliMUONSegFactory segFactory("volpaths.dat", "transform.dat");
+  fSegmentation = segFactory.CreateSegmentation(option);
+}  
 
-  AliMUONGeometrySegmentation *chamberSeg = new AliMUONGeometrySegmentation(muon->Chamber(chamberId).GetGeometry());
-
-   //Slats Segmentations
-  AliMUONSt345SlatSegmentation *slatsegB[14]; // Types of segmentation for St3 in this framework
-  AliMUONSt345SlatSegmentation *slatsegNB[14]; // Types of segmentation for St3 in this framework
-                                               // Bending
-  Int_t ndiv[4] ={ 4, 4, 2, 1};  // densities zones 
-  for(Int_t i=0; i<14; i++) {
-    slatsegB[i] = new AliMUONSt345SlatSegmentation(1);
-    slatsegB[i]->SetPadSize(10.,0.5);
-    slatsegB[i]->SetPadDivision(ndiv);
-    slatsegB[i]->SetId(1);
-    slatsegB[i]->SetDAnod(0.25);
-    slatsegNB[i] = new AliMUONSt345SlatSegmentation(0);
-    slatsegNB[i]->SetPadSize(1.,10.); // must be 0.713 !!!
-    slatsegNB[i]->SetPadDivision(ndiv);
-    slatsegNB[i]->SetId(1);
-    slatsegNB[i]->SetDAnod(0.25);
-  }
-  
-  
-  //******************************************************************************************
-  // Station 3
-  //******************************************************************************************
-
-  if (chamberId == 4 || chamberId == 5) {
-    // Type 112200 for 500, 501, 508, 509, 510, 517 in Ch5 (similar for Ch6) for the futur official numbering
-    // Type 112200 for 503, 504, 505, 555, 554, 553 in Ch5 (similar for Ch6) actual numbering in the code to be changed in jan05
-    Int_t n0[4] = { 0, 2, 2, 0 };
-    slatsegB[0]->SetPcbBoards(n0);
-    slatsegB[0]->Init(0);
-    slatsegNB[0]->SetPcbBoards(n0);
-    slatsegNB[0]->Init(0);
-    
-    // Type 122200 for 502, 507, 511, 516 (similar in Ch6) for future official numbering of ALICE
-    // Type 122200 for 502, 506, 556, 552 (similiarin Ch6) for actual numbering in muon code to be changed in jan05
-    Int_t n1[4] = { 0, 1, 3, 0 }; 
-    slatsegB[1]->SetPcbBoards(n1);
-    slatsegB[1]->Init(0); 
-    slatsegNB[1]->SetPcbBoards(n1);
-    slatsegNB[1]->Init(0); 
-    
-    // Type 222000 for 503, 506, 512, 515 (similar in Ch6) for future official numbering of ALICE
-    // Type 222000 for 501, 507, 557, 551 (similiarin Ch6) for actual numbering in muon code to be changed in jan05
-    Int_t n2[4] = { 0, 0, 3, 0 };
-    slatsegB[2]->SetPcbBoards(n2);
-    slatsegB[2]->Init(0);
-    slatsegNB[2]->SetPcbBoards(n2);
-    slatsegNB[2]->Init(0);
-    
-    // Type 220000 for 504, 505, 513, 514 (similar in Ch6) for future official numbering of ALICE
-    // Type 220000 for 500, 508, 558, 550 (similiarin Ch6) for actual numbering in muon code to be changed in jan05
-    Int_t n3[4] = { 0, 0, 2, 0 };
-    slatsegB[3]->SetPcbBoards(n3);
-    slatsegB[3]->Init(0); 
-    slatsegNB[3]->SetPcbBoards(n3);
-    slatsegNB[3]->Init(0); 
-  }
-  
-  
-  //***************************************************************************************
-  // Station 4 & 5
-  //****************************************************************************************
-  
-  if (chamberId >= 6 && chamberId <= 9) {
-    // Type 122330 for 700, 713 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 122330 for 706, 756 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    // Type 122330 for 900, 913 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 122330 for 906, 956 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    
-    Int_t n4[4] = { 0, 1, 2, 2 };
-    slatsegB[4]->SetPcbBoards(n4);
-    slatsegB[4]->Init(0); // 0 detection element id
-    slatsegNB[4]->SetPcbBoards(n4);
-    slatsegNB[4]->Init(0); // 0 detection element id
-    
-    // Type 112233 for 701, 712, 714, 725 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 112233 for 705, 707, 755, 757 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    // Type 112233 for 901, 902, 911, 912, 914, 915, 924, 925 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 112233 for 904, 905, 907, 908, 954, 955, 957, 958 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    Int_t n5[4] = { 0, 2, 2, 2 };
-    slatsegB[5]->SetPcbBoards(n5);
-    slatsegB[5]->Init(0); // 0 detection element id
-    slatsegNB[5]->SetPcbBoards(n5);
-    slatsegNB[5]->Init(0); // 0 detection element id
-    
-    // Type 112230 for 702, 711, 715, 724 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 112230 for 704, 708, 754, 758 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    Int_t n6[4] = { 0, 2, 2, 1 };
-    slatsegB[6]->SetPcbBoards(n6);
-    slatsegB[6]->Init(0); // 0 detection element id
-    slatsegNB[6]->SetPcbBoards(n6);
-    slatsegNB[6]->Init(0); // 0 detection element id
-    
-    // Type 222330 for 703, 710, 716, 723 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 222330 for 703, 709, 753, 759 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    Int_t n7[4] = { 0, 0, 3, 2 };
-    slatsegB[7]->SetPcbBoards(n7);
-    slatsegB[7]->Init(0); // 0 detection element id
-    slatsegNB[7]->SetPcbBoards(n7);
-    slatsegNB[7]->Init(0); // 0 detection element id
-    
-    // Type 223300 for 704, 709, 717, 722 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 223300 for 702, 710, 752, 760 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    Int_t n8[4] = { 0, 0, 2, 2 };
-    slatsegB[8]->SetPcbBoards(n8);
-    slatsegB[8]->Init(0); // 0 detection element id
-    slatsegNB[8]->SetPcbBoards(n8);
-    slatsegNB[8]->Init(0); // 0 detection element id
-    
-    // Type 333000 for 705, 708, 718, 721 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 333000 for 701, 711, 751, 761 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    // Type 333000 for 906, 907, 919, 920 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 333000 for 900, 912, 950, 962 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    Int_t n9[4] = { 0, 0, 0, 3 };
-    slatsegB[9]->SetPcbBoards(n9);
-    slatsegB[9]->Init(0); // 0 detection element id
-    slatsegNB[9]->SetPcbBoards(n9);
-    slatsegNB[9]->Init(0); // 0 detection element id
-    
-    // Type 330000 for 706, 707, 719, 720 in Ch7 (similar for Ch8) for the futur official numbering
-    // Type 330000 for 700, 712, 750, 762 in Ch7 (similar for Ch8) actual numbering in the code to be changed in jan05
-    Int_t n10[4] = { 0, 0, 0, 2 };
-    slatsegB[10]->SetPcbBoards(n10);
-    slatsegB[10]->Init(0); // 0 detection element id
-    slatsegNB[10]->SetPcbBoards(n10);
-    slatsegNB[10]->Init(0); // 0 detection element id
-    
-    // Type 222333 for 903, 910, 916, 923 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 222333 for 903, 909, 953, 959 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    Int_t n11[4] = { 0, 0, 3, 3 };
-    slatsegB[11]->SetPcbBoards(n11);
-    slatsegB[11]->Init(0); // 0 detection element id
-    slatsegNB[11]->SetPcbBoards(n11);
-    slatsegNB[11]->Init(0); // 0 detection element id
-  
-    // Type 223330 for 904, 909, 917, 922 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 223330 for 902, 910, 952, 960 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    Int_t n12[4] = { 0, 0, 2, 3 };
-    slatsegB[12]->SetPcbBoards(n12);
-    slatsegB[12]->Init(0); // 0 detection element id
-    slatsegNB[12]->SetPcbBoards(n12);
-    slatsegNB[12]->Init(0); // 0 detection element id
-    
-    // Type 333300 for 905, 908, 918, 921 in Ch9 (similar for Ch10) for the futur official numbering
-    // Type 333300 for 901, 911, 951, 961 in Ch9 (similar for Ch10) actual numbering in the code to be changed in jan05
-    Int_t n13[4] = { 0, 0, 0, 4 };
-    slatsegB[13]->SetPcbBoards(n13);
-    slatsegB[13]->Init(0); // 0 detection element id
-    slatsegNB[13]->SetPcbBoards(n13);
-    slatsegNB[13]->Init(0); // 0 detection element id
-    
-  }
-
-  Int_t id0 = 0;
-
-  // For St3 
-  if (chamberId == 4 || chamberId == 5) {
-    // Create chamber segmentations  
-
-    id0=(chamberId+1)*100;
-    // type 220000
-    if (cathod == 0) {
-      chamberSeg->Add(id0, slatsegB[3]);
-      chamberSeg->Add(id0+ 8, slatsegB[3]);  
-      chamberSeg->Add(id0+50, slatsegB[3]);  
-      chamberSeg->Add(id0+58, slatsegB[3]);
-    } else {
-      chamberSeg->Add(id0, slatsegNB[3]);
-      chamberSeg->Add(id0+ 8, slatsegNB[3]);  
-      chamberSeg->Add(id0+50, slatsegNB[3]);  
-      chamberSeg->Add(id0+58, slatsegNB[3]);
-    }
-    // type 222000
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 1, slatsegB[2]);
-      chamberSeg->Add(id0+ 7, slatsegB[2]);  
-      chamberSeg->Add(id0+51, slatsegB[2]);  
-      chamberSeg->Add(id0+57, slatsegB[2]);
-    } else {
-      chamberSeg->Add(id0+ 1, slatsegNB[2]);
-      chamberSeg->Add(id0+ 7, slatsegNB[2]);  
-      chamberSeg->Add(id0+51, slatsegNB[2]);  
-      chamberSeg->Add(id0+57, slatsegNB[2]);
-    }
-    // type 122200
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 2, slatsegB[1]);
-      chamberSeg->Add(id0+ 6, slatsegB[1]);  
-      chamberSeg->Add(id0+52, slatsegB[1]);  
-      chamberSeg->Add(id0+56, slatsegB[1]);
-    } else {
-      chamberSeg->Add(id0+ 2, slatsegNB[1]);
-      chamberSeg->Add(id0+ 6, slatsegNB[1]);  
-      chamberSeg->Add(id0+52, slatsegNB[1]);  
-      chamberSeg->Add(id0+56, slatsegNB[1]);
-    }
-    // type 112200
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 3, slatsegB[0]);
-      chamberSeg->Add(id0+ 4, slatsegB[0]);  
-      chamberSeg->Add(id0+ 5, slatsegB[0]);  
-      chamberSeg->Add(id0+53, slatsegB[0]);
-      chamberSeg->Add(id0+54, slatsegB[0]);     
-      chamberSeg->Add(id0+55, slatsegB[0]);
-    } else {
-      chamberSeg->Add(id0+ 3, slatsegNB[0]);
-      chamberSeg->Add(id0+ 4, slatsegNB[0]);  
-      chamberSeg->Add(id0+ 5, slatsegNB[0]);  
-      chamberSeg->Add(id0+53, slatsegNB[0]);
-      chamberSeg->Add(id0+54, slatsegNB[0]);     
-      chamberSeg->Add(id0+55, slatsegNB[0]);
-    }
-
-  }
-  
-  // For St4 
-  if (chamberId == 6 || chamberId == 7) {
-    // Create chamber segmentations  
-    id0=(chamberId+1)*100;
-    // type 122330
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 6, slatsegB[4]);
-      chamberSeg->Add(id0+56, slatsegB[4]);
-    } else {
-      chamberSeg->Add(id0+ 6, slatsegNB[4]);
-      chamberSeg->Add(id0+56, slatsegNB[4]);
-    }
-    // type 112233
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 5, slatsegB[5]);
-      chamberSeg->Add(id0+ 7, slatsegB[5]);  
-      chamberSeg->Add(id0+55, slatsegB[5]);  
-      chamberSeg->Add(id0+57, slatsegB[5]);
-    } else {
-      chamberSeg->Add(id0+ 5, slatsegNB[5]);
-      chamberSeg->Add(id0+ 7, slatsegNB[5]);  
-      chamberSeg->Add(id0+55, slatsegNB[5]);  
-      chamberSeg->Add(id0+57, slatsegNB[5]);
-    }
-    // type 112230
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 4, slatsegB[6]);
-      chamberSeg->Add(id0+ 8, slatsegB[6]);  
-      chamberSeg->Add(id0+54, slatsegB[6]);  
-      chamberSeg->Add(id0+58, slatsegB[6]);
-    } else {
-      chamberSeg->Add(id0+ 4, slatsegNB[6]);
-      chamberSeg->Add(id0+ 8, slatsegNB[6]);  
-      chamberSeg->Add(id0+54, slatsegNB[6]);  
-      chamberSeg->Add(id0+58, slatsegNB[6]);
-    }
-    // type 222330 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 3, slatsegB[7]);
-      chamberSeg->Add(id0+ 9, slatsegB[7]);  
-      chamberSeg->Add(id0+53, slatsegB[7]);
-      chamberSeg->Add(id0+59, slatsegB[7]);
-    } else {
-      chamberSeg->Add(id0+ 3, slatsegNB[7]);
-      chamberSeg->Add(id0+ 9, slatsegNB[7]);  
-      chamberSeg->Add(id0+53, slatsegNB[7]);
-      chamberSeg->Add(id0+59, slatsegNB[7]);
-    }
-    // type 223300 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 2, slatsegB[8]);
-      chamberSeg->Add(id0+10, slatsegB[8]);  
-      chamberSeg->Add(id0+52, slatsegB[8]);
-      chamberSeg->Add(id0+60, slatsegB[8]);
-    } else {
-      chamberSeg->Add(id0+ 2, slatsegNB[8]);
-      chamberSeg->Add(id0+10, slatsegNB[8]);  
-      chamberSeg->Add(id0+52, slatsegNB[8]);
-      chamberSeg->Add(id0+60, slatsegNB[8]);
-    }
-    // type 333000 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 1, slatsegB[9]);
-      chamberSeg->Add(id0+11, slatsegB[9]);  
-      chamberSeg->Add(id0+51, slatsegB[9]);
-      chamberSeg->Add(id0+61, slatsegB[9]);
-    } else {
-      chamberSeg->Add(id0+ 1, slatsegNB[9]);
-      chamberSeg->Add(id0+11, slatsegNB[9]);  
-      chamberSeg->Add(id0+51, slatsegNB[9]);
-      chamberSeg->Add(id0+61, slatsegNB[9]);
-    }
-    // type 330000 
-    if (cathod == 0) {
-      chamberSeg->Add(id0   , slatsegB[10]);
-      chamberSeg->Add(id0+12, slatsegB[10]);  
-      chamberSeg->Add(id0+50, slatsegB[10]);
-      chamberSeg->Add(id0+62, slatsegB[10]);
-    } else {
-      chamberSeg->Add(id0   , slatsegNB[10]);
-      chamberSeg->Add(id0+12, slatsegNB[10]);  
-      chamberSeg->Add(id0+50, slatsegNB[10]);
-      chamberSeg->Add(id0+62, slatsegNB[10]);
-    }
-  }
-
-  // For St5 
-  if (chamberId == 8 || chamberId == 9) {
-    // Create chamber segmentations      
-    id0=(chamberId+1)*100;
-    // type 122330
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 6, slatsegB[4]);
-      chamberSeg->Add(id0+56, slatsegB[4]);
-    } else {
-      chamberSeg->Add(id0+ 6, slatsegNB[4]);
-      chamberSeg->Add(id0+56, slatsegNB[4]);
-    }
-    // type 112233
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 4, slatsegB[5]);
-      chamberSeg->Add(id0+ 5, slatsegB[5]);
-      chamberSeg->Add(id0+ 7, slatsegB[5]);  
-      chamberSeg->Add(id0+ 8, slatsegB[5]);  
-      chamberSeg->Add(id0+54, slatsegB[5]);  
-      chamberSeg->Add(id0+55, slatsegB[5]);  
-      chamberSeg->Add(id0+57, slatsegB[5]);
-      chamberSeg->Add(id0+58, slatsegB[5]);
-    } else {
-      chamberSeg->Add(id0+ 4, slatsegNB[5]);
-      chamberSeg->Add(id0+ 5, slatsegNB[5]);
-      chamberSeg->Add(id0+ 7, slatsegNB[5]);  
-      chamberSeg->Add(id0+ 8, slatsegNB[5]);  
-      chamberSeg->Add(id0+54, slatsegNB[5]);  
-      chamberSeg->Add(id0+55, slatsegNB[5]);  
-      chamberSeg->Add(id0+57, slatsegNB[5]);
-      chamberSeg->Add(id0+58, slatsegNB[5]);
-    }
-    // type 222333 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 3, slatsegB[11]);
-      chamberSeg->Add(id0+ 9, slatsegB[11]);  
-      chamberSeg->Add(id0+53, slatsegB[11]);
-      chamberSeg->Add(id0+59, slatsegB[11]);
-    } else {
-      chamberSeg->Add(id0+ 3, slatsegNB[11]);
-      chamberSeg->Add(id0+ 9, slatsegNB[11]);  
-      chamberSeg->Add(id0+53, slatsegNB[11]);
-      chamberSeg->Add(id0+59, slatsegNB[11]);
-    }
-    // type 223330 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 2, slatsegB[12]);
-      chamberSeg->Add(id0+10, slatsegB[12]);  
-      chamberSeg->Add(id0+52, slatsegB[12]);
-      chamberSeg->Add(id0+60, slatsegB[12]);
-    } else {
-      chamberSeg->Add(id0+ 2, slatsegNB[12]);
-      chamberSeg->Add(id0+10, slatsegNB[12]);  
-      chamberSeg->Add(id0+52, slatsegNB[12]);
-      chamberSeg->Add(id0+60, slatsegNB[12]);
-    }
-    // type 333300 
-    if (cathod == 0) {
-      chamberSeg->Add(id0+ 1, slatsegB[13]);
-      chamberSeg->Add(id0+11, slatsegB[13]);  
-      chamberSeg->Add(id0+51, slatsegB[13]);
-      chamberSeg->Add(id0+61, slatsegB[13]);
-    } else {
-      chamberSeg->Add(id0+ 1, slatsegNB[13]);
-      chamberSeg->Add(id0+11, slatsegNB[13]);  
-      chamberSeg->Add(id0+51, slatsegNB[13]);
-      chamberSeg->Add(id0+61, slatsegNB[13]);
-    }
-    // type 333000 
-    if (cathod == 0) {
-      chamberSeg->Add(id0   , slatsegB[9]);
-      chamberSeg->Add(id0+12, slatsegB[9]);  
-      chamberSeg->Add(id0+50, slatsegB[9]);
-      chamberSeg->Add(id0+62, slatsegB[9]);
-    } else {
-      chamberSeg->Add(id0   , slatsegNB[9]);
-      chamberSeg->Add(id0+12, slatsegNB[9]);  
-      chamberSeg->Add(id0+50, slatsegNB[9]);
-      chamberSeg->Add(id0+62, slatsegNB[9]);
-    }
-  }  
-  
-  if (!id0) {
-    AliWarning(Form("Segmentation for chamber %d , cathod %d is not yet defined",
-                   chamberId, cathod));
-    return 0;
-    
-  }
-  
-  DrawSegmentation(chamberSeg);
-  return chamberSeg;
-  
-} 
 
 //
 // public methods
 //
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 AliMUONGeometrySegmentation* 
-AliMUONTest::CreateSegmentation(Int_t chamberId, Int_t cath)
+AliMUONTest::GetSegmentation(Int_t chamberId, Int_t cath)
 {
 // Create geometry segmentation for the specified chamber and cathod
 
-  switch (chamberId) {
-
-    // Station1
-    case 0: 
-    case 1:
-        return CreateSt1Segmentation(chamberId, cath);
-       break;
-
-    // Station2
-    case 2: 
-    case 3:
-        AliWarning("Not yet implemented");
-       return 0;
-       break;
-
-    // Slat stations
-    case 4: 
-    case 5: 
-    case 6: 
-    case 7: 
-    case 8: 
-    case 9:
-        return CreateSlatSegmentation(chamberId, cath);
-       break;
-               
-    // Trigger stations
-    case 10: 
-    case 11: 
-    case 12: 
-    case 13:
-        //return CreateTriggerSegmentation(chamberId, cath);
-        AliWarning("Not yet implemented");
-       return 0;
-       break;
-
-    default:
-        AliWarning("Wrong chamber Id");
-       return 0;
-       break;
-  }    
+  return fSegmentation->GetModuleSegmentation(chamberId, cath);
 }              
 
-//______________________________________________________________________________
+#include "AliMUONGeometryDetElement.h"
+//_____________________________________________________________________________
 void  AliMUONTest::DetElemTransforms()
 {
 // 
-  AliMUON* muon = (AliMUON*)gAlice->GetModule("MUON");
-  if (!muon) {
-    AliFatal("MUON detector not defined.");
-    return;
-  }  
-  
   // Loop over chambers
   for (Int_t i=0; i<AliMUONConstants::NCh(); i++) {
 
-    AliMUONGeometryModule* geometry = muon->Chamber(i).GetGeometry();
-    AliMUONGeometryStore* detElements = geometry->GetDetElementStore();
+    const AliMUONGeometryModuleTransformer* kModuleTransformer 
+      = fkTransformer->GetModuleTransformer(i);
+      
+    AliMUONGeometryStore* detElements 
+      = kModuleTransformer->GetDetElementStore();
     
     // Loop over detection elements
     for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
        
-      //Int_t detElemId = geometry->GetDetElemId(j);       
+      //Int_t detElemId = kModuleTransformer->GetDetElemId(j);       
       Int_t detElemId = detElements->GetEntry(j)->GetUniqueID();       
       cout << "Detection element Id: " << detElemId << endl;
        
       Double_t x, y, z;
-      geometry->Local2Global(detElemId, 0., 0., 0., x, y, z);
+      kModuleTransformer->Local2Global(detElemId, 0., 0., 0., x, y, z);
       cout << "  Global DE position:            " 
           <<  x << ",  " << y << ",  " << z << endl; 
 
       Double_t x2, y2, z2;
-      geometry->Global2Local(detElemId, 0., 0., 0., x2, y2, z2);
+      kModuleTransformer->Global2Local(detElemId, 0., 0., 0., x2, y2, z2);
       cout << "  ALIC center in the local frame: " 
           <<  x2 << ",  " << y2 << ",  " << z2 << endl; 
             
       Double_t x3, y3, z3;
-      geometry->Global2Local(detElemId, x, y, z, x3, y3, z3);
+      kModuleTransformer->Global2Local(detElemId, x, y, z, x3, y3, z3);
       cout << "  Back in the local frame: " 
            <<  x3 << ",  " << y3 << ",  " << z3 << endl;        
       cout << endl;         
+
+      AliMUONGeometryDetElement* detElem =  
+        (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+      detElem->PrintGlobalTransform(); 
     }
   }
 }       
 
-//________________________________________________________________________
-void AliMUONTest::PrintPadPositionsOld()
-{
-// Iterate over all old chamber segmentations and prints
-// global pad positions
-
-  AliMUON* muon = (AliMUON*)gAlice->GetModule("MUON");
-  if (!muon) {
-    AliFatal("MUON detector not defined.");
-    return;
-  }  
-
-  // Loop over chambers
-  for (Int_t i=0; i<1; i++) {
-
-    // Create chamber segmentations
-    AliSegmentation* seg[2];
-    seg[0] = muon->Chamber(i).SegmentationModel(0);
-    seg[1] = muon->Chamber(i).SegmentationModel(1);
-
-    // Iterate over the whole plane and return pad indices and 
-    // global/local positions
-    cout << "Go to loop over pads" << endl;
-    for (Int_t cath=0; cath<2; cath++) {
-      
-      cout << setw(6) << "Pads in chamber " << i << " cathod " << cath << endl;
-      cout << "===================================" << endl;  
-      TStopwatch timer;
-      timer.Start();  
-
-      Int_t counter = 0;
-      for ( seg[cath]->FirstPad(70., 70., 0., 80., 80.);
-            seg[cath]->MorePads(); 
-            seg[cath]->NextPad() )
-      {
-        cout << setw(6) << "counter " << counter++ << "   ";
-  
-        Int_t ix = seg[cath]->Ix();
-        Int_t iy = seg[cath]->Iy();
-        cout << "Pad indices:  ( " << ix << ", " << iy << " )  " ;
-
-        Float_t x, y, z;
-        seg[cath]->GetPadC(ix, iy, x, y, z);
-        cout << "Pad position: ( " << x << ", " << y << ", " << z << " )" << endl;
-      }
-      timer.Stop();
-      timer.Print();
-    }  
-  }  
-}
-
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::ForWhole(AliMUONTests testCase)
 {
 // Perform test for all chambers and first cathod
 
-  AliMUON* muon = (AliMUON*)gAlice->GetModule("MUON");
-  if (!muon) {
-    AliFatal("MUON detector not defined.");
-    return;
-  }  
-
   TStopwatch timer;
   timer.Start();  
 
@@ -716,7 +214,7 @@ void AliMUONTest::ForWhole(AliMUONTests testCase)
     for (Int_t cath=0; cath<1; cath++) {
 
       AliMUONGeometrySegmentation* segmentation 
-        = CreateSegmentation(iChamber, cath);
+        = GetSegmentation(iChamber, cath);
        
       if (!segmentation) continue;
        
@@ -725,16 +223,13 @@ void AliMUONTest::ForWhole(AliMUONTests testCase)
       cout << "===================================" << endl;  
 
       ForSegmentation(testCase, segmentation);
-           
-      //if (testCase == kDrawPads) {
-      //}      
     }  
   }     
   timer.Stop();
   timer.Print();
 }    
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::ForSegmentation(AliMUONTests testCase,
                                   AliMUONGeometrySegmentation *segmentation)
 {
@@ -748,7 +243,7 @@ void AliMUONTest::ForSegmentation(AliMUONTests testCase,
   // Loop over detection elements
   //
   AliMUONGeometryStore* detElements 
-    = segmentation->GetGeometry()->GetDetElementStore();
+    = segmentation->GetTransformer()->GetDetElementStore();
     
   for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
        
@@ -764,7 +259,7 @@ void AliMUONTest::ForSegmentation(AliMUONTests testCase,
   timer.Print();
 } 
    
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::ForDetElement(AliMUONTests testCase,
                                 Int_t detElemId,
                                 AliMUONGeometrySegmentation *segmentation)
@@ -794,7 +289,7 @@ void AliMUONTest::ForDetElement(AliMUONTests testCase,
     }    
 } 
    
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::Before(AliMUONTests testCase)
 {
 // Do some initialization if necessary
@@ -814,7 +309,7 @@ void AliMUONTest::Before(AliMUONTests testCase)
   }        
 }
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::After(AliMUONTests testCase)
 {
 // Do some cleanup if necessary
@@ -834,7 +329,7 @@ void AliMUONTest::After(AliMUONTests testCase)
   }        
 }
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::PrintPad(Int_t& counter,
                            Int_t detElemId, Int_t ix, Int_t iy,
                            AliMUONGeometrySegmentation* segmentation)
@@ -845,14 +340,23 @@ void AliMUONTest::PrintPad(Int_t& counter,
   Bool_t success
     = segmentation->GetPadC(detElemId, ix, iy, x, y, z);
   
-  if (!success) return;  
-
   cout << setw(6) << "counter " << counter++ << "   ";
   cout << "Pad indices:  ( " << detElemId << "; " << ix << ", " << iy << " )  " ;
-  cout << "Pad position: ( " << x << ", " << y << ", " << z << " )" << endl;
+
+  if (success) {
+    cout << "Pad position: ( " << x << ", " << y << ", " << z << " );  ";
+    Int_t sector = segmentation->Sector(detElemId, ix, iy);
+    Float_t dpx = segmentation->Dpx(detElemId, sector);
+    Float_t dpy = segmentation->Dpy(detElemId, sector);
+    cout << " dimensions: ( " << dpx << ", " << dpy << " )" << endl;
+  }  
+  else  {
+    counter--; 
+    cout << "... no pad " << endl; 
+  }  
 } 
    
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::DrawPad(Int_t& counter,
                           Int_t detElemId, Int_t ix, Int_t iy,
                           AliMUONGeometrySegmentation* segmentation)
@@ -876,12 +380,14 @@ void AliMUONTest::DrawPad(Int_t& counter,
   //printf(" ***** Pad position is ix: %d iy: %d x: %f y: %f sector: %d dpx: %f dpy: %f \n",
   //       ix, iy, x, y, sector, dpx, dpy);
 
+  if (!fCanvas) Before(kDrawPads);
+
   fCanvas->cd();
   TPave* pave = new TPave(x-dpx/2., y-dpy/2., x+dpx/2., y+dpy/2., 1);
   pave->Draw();
 } 
    
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void AliMUONTest::DrawSegmentation(AliMUONGeometrySegmentation *seg)
 {
 // TBR
@@ -892,7 +398,7 @@ void AliMUONTest::DrawSegmentation(AliMUONGeometrySegmentation *seg)
   Float_t dpx, dpy;
 //   TH2F * frame = new TH2F(" "," ",10,-10.,245.,10, -5., 45.);
 //   TH2F * frame = new TH2F(" "," ",10,-300.,300.,10, -300., 300.);
-  TH2F * frame = new TH2F(" "," ",10,-200.,200.,10, -200., 200.);
+  TH2F * frame = new TH2F(" "," ",10,-350.,350.,10, -350., 350.);
   frame->Draw();
 //   (new TPave(  0.,  0., 40., 40.,2))->Draw();
 //   (new TPave( 40.,  0., 80., 40.,2))->Draw();
@@ -904,11 +410,12 @@ void AliMUONTest::DrawSegmentation(AliMUONGeometrySegmentation *seg)
   // Loop over detection elements
   //
   AliMUONGeometryStore* detElements 
-    = seg->GetGeometry()->GetDetElementStore();
+    = seg->GetTransformer()->GetDetElementStore();
     
   for (Int_t iDE=0; iDE<detElements->GetNofEntries(); iDE++) {
     
     deId = detElements->GetEntry(iDE)->GetUniqueID();       
+       
     cout << "Detection element id: " << deId << endl;
     
     
@@ -931,3 +438,5 @@ void AliMUONTest::DrawSegmentation(AliMUONGeometrySegmentation *seg)
   }
 }
 
+
+