]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGeometryTransformer.cxx
Updated list of MUON libraries
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryTransformer.cxx
index f8edc7cae899d74e57a4af55d56c40016727f2a4..9665ec067b4540315f13a8c2327269d544b7cc16 100644 (file)
 #include "AliMUONGeometryTransformer.h"
 #include "AliMUONGeometryModuleTransformer.h"
 #include "AliMUONGeometryDetElement.h"
-#include "AliMUONGeometryStore.h"
 #include "AliMUONGeometryBuilder.h"
 
+#include "AliMpDEManager.h"
+#include "AliMpExMap.h"
+
 #include "AliLog.h"
 #include "AliAlignObjMatrix.h"
 #include "AliAlignObj.h"
@@ -45,21 +47,25 @@ ClassImp(AliMUONGeometryTransformer)
 /// \endcond
  
 //______________________________________________________________________________
-AliMUONGeometryTransformer::AliMUONGeometryTransformer(Bool_t isOwner)
+AliMUONGeometryTransformer::AliMUONGeometryTransformer(Bool_t isOwner,
+                                          const TString& detectorName)
+
   : TObject(),
+    fDetectorName(detectorName),
     fModuleTransformers(0),
     fMisAlignArray(0)
 {
 /// Standard constructor
 
   // Create array for geometry modules
-  fModuleTransformers = new TObjArray();
+  fModuleTransformers = new TObjArray(100);
   fModuleTransformers->SetOwner(isOwner);
 }
 
 //______________________________________________________________________________
 AliMUONGeometryTransformer::AliMUONGeometryTransformer() 
   : TObject(),
+    fDetectorName(),
     fModuleTransformers(0),
     fMisAlignArray(0)
 {
@@ -135,10 +141,10 @@ void AliMUONGeometryTransformer::FillDetElemVolPath(Int_t detElemId,
 /// Create detection element with the given detElemId and volPath
 
   // Module Id
-  Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
+  Int_t moduleId = AliMpDEManager::GetGeomModuleId(detElemId);
 
   // Get detection element store
-  AliMUONGeometryStore* detElements = 
+  AliMpExMap* detElements = 
     GetModuleTransformer(moduleId)->GetDetElementStore();     
 
   // Add detection element
@@ -156,10 +162,6 @@ void AliMUONGeometryTransformer::FillModuleTransform(Int_t moduleId,
 {
 /// Fill the transformation of the module.
 
-  // Get/Create geometry module transformer
-  moduleId--;
-      // Modules numbers in the file are starting from 1
-
   AliMUONGeometryModuleTransformer* moduleTransformer
     = GetModuleTransformerNonConst(moduleId, false);
 
@@ -185,7 +187,7 @@ void AliMUONGeometryTransformer::FillDetElemTransform(
 /// Fill the transformation of the detection element.
 
   // Module Id
-  Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
+  Int_t moduleId = AliMpDEManager::GetGeomModuleId(detElemId);
 
   // Get module transformer
   const AliMUONGeometryModuleTransformer* kModuleTransformer
@@ -236,10 +238,10 @@ AliMUONGeometryTransformer::ReadVolPaths(ifstream& in)
     //          << "volPath= " << volumePath
     //  << endl;   
 
-    if ( key == TString("CH") ) 
+    if ( key == AliMUONGeometryModuleTransformer::GetModuleNamePrefix() ) 
       FillModuleVolPath(id, volumePath);
   
-    else if ( key == TString("DE") )
+    else if ( key == AliMUONGeometryDetElement::GetDENamePrefix() )
       FillDetElemVolPath(id, volumePath);
   
     else {
@@ -258,8 +260,8 @@ TString  AliMUONGeometryTransformer::ReadModuleTransforms(ifstream& in)
 /// Read and fill modules transformations from the stream.
 /// Return true, if reading finished correctly.
 
-  TString key("CH");
-  while ( key == TString("CH") ) {
+  TString key(AliMUONGeometryModuleTransformer::GetModuleNamePrefix());
+  while ( key == AliMUONGeometryModuleTransformer::GetModuleNamePrefix() ) {
     Int_t id;
     Double_t  x, y, z;
     Double_t  a1, a2, a3, a4, a5, a6;
@@ -300,8 +302,8 @@ TString  AliMUONGeometryTransformer::ReadDetElemTransforms(ifstream& in)
 /// Read detection elements transformations from the stream.
 /// Return true, if reading finished correctly.
 
-  TString key("DE");
-  while ( key == TString("DE") ) {
+  TString key(AliMUONGeometryDetElement::GetDENamePrefix());
+  while ( key == AliMUONGeometryDetElement::GetDENamePrefix() ) {
 
     // Input data
     Int_t detElemId;
@@ -371,12 +373,11 @@ AliMUONGeometryTransformer::LoadTransforms(TGeoManager* tgeoManager)
     moduleTransformer->SetTransformation(matrix);
     
     // Loop over detection elements
-    AliMUONGeometryStore* detElements 
-      = moduleTransformer->GetDetElementStore();    
+    AliMpExMap* detElements = moduleTransformer->GetDetElementStore();    
    
-    for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+    for (Int_t j=0; j<detElements->GetSize(); j++) {
       AliMUONGeometryDetElement* detElement
-        = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+        = (AliMUONGeometryDetElement*)detElements->GetObject(j);
 
       // Det element path
       TString dePath = detElement->GetVolumePath();
@@ -451,9 +452,9 @@ AliMUONGeometryTransformer::ReadTransformations(const TString& fileName)
   TString key;
   in >> key;
   while ( !in.eof() ) {
-    if (key == TString("CH")
+    if ( key == AliMUONGeometryModuleTransformer::GetModuleNamePrefix() 
       key = ReadModuleTransforms(in);
-    else if (key == TString("DE"))
+    else if ( key == AliMUONGeometryDetElement::GetDENamePrefix() )
       key = ReadDetElemTransforms(in);
     else {
       AliFatal(Form("%s key not recognized",  key.Data()));
@@ -477,11 +478,13 @@ AliMUONGeometryTransformer::ReadTransformations2(const TString& fileName)
   filePath += fileName;
   
   // Load root geometry
-  TGeoManager* tgeoManager = TGeoManager::Import(fileName);
+  TGeoManager* tgeoManager = gGeoManager;
+  if (!tgeoManager)
+    tgeoManager = TGeoManager::Import(fileName);
 
   // Retrieve matrices
   LoadTransforms(tgeoManager);     
-
+  
   return true;
 }
 
@@ -522,7 +525,7 @@ void AliMUONGeometryTransformer::WriteModuleVolPaths(ofstream& out) const
       = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
 
     // Write data on out
-    out << "CH " 
+    out << AliMUONGeometryModuleTransformer::GetModuleNamePrefix() << " "
         << setw(4) << moduleTransformer->GetModuleId() << "    " 
         << moduleTransformer->GetVolumePath() << endl;
   }     
@@ -538,15 +541,14 @@ void AliMUONGeometryTransformer::WriteDetElemVolPaths(ofstream& out) const
   for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
     AliMUONGeometryModuleTransformer* moduleTransformer 
       = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
-    AliMUONGeometryStore* detElements 
-      = moduleTransformer->GetDetElementStore();    
+    AliMpExMap* detElements = moduleTransformer->GetDetElementStore();    
 
-    for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+    for (Int_t j=0; j<detElements->GetSize(); j++) {
       AliMUONGeometryDetElement* detElement
-        = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+        = (AliMUONGeometryDetElement*)detElements->GetObject(j);
        
       // Write data on out
-      out << "DE " 
+      out << AliMUONGeometryDetElement::GetDENamePrefix() << " " 
           << setw(4) << detElement->GetId() << "    " 
           << detElement->GetVolumePath() << endl;
     }
@@ -566,8 +568,8 @@ void AliMUONGeometryTransformer::WriteModuleTransforms(ofstream& out) const
       = moduleTransformer->GetTransformation();    
 
     // Write data on out
-    out << "CH " 
-        << setw(4) << moduleTransformer->GetModuleId() + 1;
+    out << AliMUONGeometryModuleTransformer::GetModuleNamePrefix() << " " 
+        << setw(4) << moduleTransformer->GetModuleId();
     
     WriteTransform(out, transform);
   }
@@ -583,17 +585,17 @@ void AliMUONGeometryTransformer::WriteDetElemTransforms(ofstream& out) const
   for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
     AliMUONGeometryModuleTransformer* moduleTransformer 
       = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
-    AliMUONGeometryStore* detElements 
-      = moduleTransformer->GetDetElementStore();    
+    AliMpExMap* detElements = moduleTransformer->GetDetElementStore();    
 
-    for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+    for (Int_t j=0; j<detElements->GetSize(); j++) {
       AliMUONGeometryDetElement* detElement
-        = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+        = (AliMUONGeometryDetElement*)detElements->GetObject(j);
       const TGeoMatrix* transform 
         = detElement->GetLocalTransformation(); 
        
       // Write data on out
-      out << "DE " << setw(4) << detElement->GetId();
+      out << AliMUONGeometryDetElement::GetDENamePrefix() << " " 
+          << setw(4) << detElement->GetId();
      
       WriteTransform(out, transform);
     }
@@ -601,6 +603,39 @@ void AliMUONGeometryTransformer::WriteDetElemTransforms(ofstream& out) const
   }     
 }
 
+//______________________________________________________________________________
+TString AliMUONGeometryTransformer::GetModuleSymName(Int_t moduleId) const
+{
+/// Return the module symbolic name (use for alignment)
+
+  const AliMUONGeometryModuleTransformer* kTransformer 
+    = GetModuleTransformer(moduleId);
+  if ( ! kTransformer ) {
+    AliErrorStream() << "Module " << moduleId << " not found." << endl; 
+    return "";
+  }   
+  
+  return "/" + fDetectorName + "/" + kTransformer->GetModuleName();
+}  
+
+//______________________________________________________________________________
+TString AliMUONGeometryTransformer::GetDESymName(Int_t detElemId) const
+{
+/// Return the detection element symbolic name (used for alignment)
+
+  const AliMUONGeometryDetElement* kDetElement 
+    = GetDetElement(detElemId);
+  if ( ! kDetElement ) {
+    AliErrorStream() << "Det element " << detElemId << " not found." << endl; 
+    return "";
+  }   
+  
+  // Module Id
+  Int_t moduleId = AliMpDEManager::GetGeomModuleId(detElemId);
+
+  return GetModuleSymName(moduleId) + "/" + kDetElement->GetDEName();
+}  
+
 //
 // public functions
 //
@@ -769,8 +804,12 @@ void AliMUONGeometryTransformer::AddModuleTransformer(
 {
 /// Add the module transformer to the array
 
-  fModuleTransformers->AddAt(moduleTransformer, 
-                             moduleTransformer->GetModuleId());
+  // Expand the size if not sufficient
+  Int_t moduleId = moduleTransformer->GetModuleId();
+  if (  moduleId >= fModuleTransformers->GetSize() )
+    fModuleTransformers->Expand(moduleId+1);
+
+  fModuleTransformers->AddAt(moduleTransformer, moduleId);
 }
 
 //_____________________________________________________________________________
@@ -790,16 +829,13 @@ void  AliMUONGeometryTransformer::AddMisAlignModule(Int_t moduleId,
     return;
   }   
   
-  // Get path  
-  TString path = kTransformer->GetVolumePath(); 
-  
   // Get unique align object ID
   Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, moduleId); 
 
   // Create mis align matrix
   TClonesArray& refArray =*fMisAlignArray;
   Int_t pos = fMisAlignArray->GetEntriesFast();
-  new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId, 
+  new (refArray[pos]) AliAlignObjMatrix(GetModuleSymName(moduleId), volId, 
                                        const_cast<TGeoHMatrix&>(matrix),kTRUE);
 }
 
@@ -821,19 +857,63 @@ void  AliMUONGeometryTransformer::AddMisAlignDetElement(Int_t detElemId,
     return;
   }   
   
-  // Get path  
-  TString path = kDetElement->GetVolumePath(); 
-  
   // Get unique align object ID
   Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, detElemId); 
 
   // Create mis align matrix
   TClonesArray& refArray =*fMisAlignArray;
   Int_t pos = fMisAlignArray->GetEntriesFast();
-  new(refArray[pos]) AliAlignObjMatrix(path.Data(), volId, 
+  new(refArray[pos]) AliAlignObjMatrix(GetDESymName(detElemId), volId, 
                                       const_cast<TGeoHMatrix&>(matrix),kTRUE);
 }
 
+//_____________________________________________________________________________
+void AliMUONGeometryTransformer::AddAlignableVolumes() const
+{
+/// Set symbolic names and matrices to alignable objects to TGeo
+
+  if ( ! gGeoManager ) {
+    AliWarning("TGeoManager not defined.");
+    return;
+  }  
+
+  // Modules 
+  for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
+    AliMUONGeometryModuleTransformer* module 
+      = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
+
+    // Set module symbolic name
+    TGeoPNEntry* pnEntry
+      = gGeoManager->SetAlignableEntry(GetModuleSymName(module->GetModuleId()), 
+                                       module->GetVolumePath());
+    // Set module matrix
+    pnEntry->SetMatrix(new TGeoHMatrix(*module->GetTransformation()));  
+       // the matrix will be deleted via TGeoManager                                    
+
+    //cout << "Module sym name: " << GetModuleSymName(module->GetModuleId()) 
+    //     << "  volPath: " << module->GetVolumePath() << endl;
+
+    // Detection elements
+    AliMpExMap* detElements = module->GetDetElementStore();    
+
+    for (Int_t j=0; j<detElements->GetSize(); j++) {
+      AliMUONGeometryDetElement* detElement
+        = (AliMUONGeometryDetElement*)detElements->GetObject(j);
+       
+      // Set detection element symbolic name
+      TGeoPNEntry* pnEntry
+        = gGeoManager->SetAlignableEntry(GetDESymName(detElement->GetId()), 
+                                         detElement->GetVolumePath());
+      // Set detection element matrix
+      pnEntry->SetMatrix(new TGeoHMatrix(*detElement->GetGlobalTransformation()));                                      
+       // the matrix will be deleted via TGeoManager                                    
+
+      //cout << "DE name: " << GetDESymName(detElement->GetId()) 
+      //     << "  volPath: " << detElement->GetVolumePath() << endl;
+    }  
+  }     
+}           
+    
 //_____________________________________________________________________________
 TClonesArray* AliMUONGeometryTransformer::CreateZeroAlignmentData() const
 {
@@ -852,7 +932,6 @@ TClonesArray* AliMUONGeometryTransformer::CreateZeroAlignmentData() const
     AliMUONGeometryModuleTransformer* module 
       = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
 
-    TString path = module->GetVolumePath(); 
     Int_t moduleId = module->GetModuleId();
   
     // Align object ID
@@ -860,21 +939,19 @@ TClonesArray* AliMUONGeometryTransformer::CreateZeroAlignmentData() const
 
     // Create mis align matrix
     Int_t pos = array->GetEntriesFast();
-    new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId, matrix, kTRUE);
+    new (refArray[pos]) AliAlignObjMatrix(GetModuleSymName(moduleId), volId, matrix, kTRUE);
   }     
 
   // Detection elements
   for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
     AliMUONGeometryModuleTransformer* moduleTransformer 
       = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
-    AliMUONGeometryStore* detElements 
-      = moduleTransformer->GetDetElementStore();    
+    AliMpExMap* detElements = moduleTransformer->GetDetElementStore();    
 
-    for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+    for (Int_t j=0; j<detElements->GetSize(); j++) {
       AliMUONGeometryDetElement* detElement
-        = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+        = (AliMUONGeometryDetElement*)detElements->GetObject(j);
        
-      TString path = detElement->GetVolumePath(); 
       Int_t detElemId = detElement->GetId();
   
       // Align object ID
@@ -882,13 +959,23 @@ TClonesArray* AliMUONGeometryTransformer::CreateZeroAlignmentData() const
 
       // Create mis align matrix
       Int_t pos = array->GetEntriesFast();
-      new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId, matrix, kTRUE);
+      new (refArray[pos]) AliAlignObjMatrix(GetDESymName(detElemId), volId, matrix, kTRUE);
     }
   }
   
   return array;
 }       
 
+//_____________________________________________________________________________
+void AliMUONGeometryTransformer::ClearMisAlignmentData()
+{
+/// Clear the array of misalignment data
+
+  if ( ! fMisAlignArray ) return;
+  
+  fMisAlignArray->Delete();
+}  
+                              
 //_____________________________________________________________________________
 void AliMUONGeometryTransformer::Global2Local(Int_t detElemId,
                  Float_t xg, Float_t yg, Float_t zg, 
@@ -968,7 +1055,7 @@ AliMUONGeometryTransformer::GetModuleTransformerByDEId(Int_t detElemId,
 /// Return the geometry module transformer specified by detection element ID
 
   // Get module index
-  Int_t index = AliMUONGeometryStore::GetModuleId(detElemId);
+  Int_t index = AliMpDEManager::GetGeomModuleId(detElemId);
 
   return GetModuleTransformer(index, warn);
 }