]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGeometryBuilder.cxx
New option to discard mono-cathod clusters (by changing their resolution) and refit...
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryBuilder.cxx
index e11326f69c2249e6ef828e3a1a5aeab34a48e3ff..7fbd5aabb9bd4e2e53ded290090f064a2e47b0e8 100644 (file)
  **************************************************************************/
 
 // $Id$
-//
-// ----------------------------
+
+//-----------------------------------------------------------------------------
 // Class AliMUONGeometryBuilder
 // ----------------------------
 // Manager class for geometry construction via geometry builders.
 // Author: Ivana Hrivnacova, IPN Orsay
+//-----------------------------------------------------------------------------
 
 #include "AliMUONGeometryBuilder.h"
 #include "AliMUONVGeometryBuilder.h"   
 #include "AliMUONGeometryEnvelope.h"   
 #include "AliMUONGeometryEnvelopeStore.h"
 #include "AliMUONGeometryDetElement.h"
-#include "AliMUONGeometryStore.h"
 #include "AliMUONGeometryConstituent.h"
 
+#include "AliMpDEManager.h"
+
 #include "AliModule.h"
+#include "AliSimulation.h"
 #include "AliLog.h"
 #include "AliRun.h"
 
 #include <TVirtualMC.h>
 #include <TGeoManager.h>
 
-// static data members
-const TString  AliMUONGeometryBuilder::fgkDefaultVolPathsFileName = "volpath.dat";   
-const TString  AliMUONGeometryBuilder::fgkDefaultTransformFileName = "transform.dat";   
-const TString  AliMUONGeometryBuilder::fgkDefaultSVMapFileName = "svmap.dat";    
-const TString  AliMUONGeometryBuilder::fgkOutFileNameExtension = ".out";    
-
+using std::endl;
 /// \cond CLASSIMP
 ClassImp(AliMUONGeometryBuilder)
 /// \endcond
 
+//
 // static functions
+//
+
+//______________________________________________________________________________
+const TString& AliMUONGeometryBuilder::GetDefaultTransformFileName()
+{
+  ///< default transformations file name                                     
+  static const TString kDefaultTransformFileName = "transform.dat";   
+  return kDefaultTransformFileName;
+}    
+
+//______________________________________________________________________________
+const TString& AliMUONGeometryBuilder::GetDefaultSVMapFileName() 
+{
+  ///< default svmaps file name                                      
+  static const TString kDefaultSVMapFileName = "svmap.dat";    
+  return kDefaultSVMapFileName;
+}    
+
+//______________________________________________________________________________
+const TString& AliMUONGeometryBuilder::GetOutFileNameExtension()
+{
+  ///< default output file name extension                                    
+  static const TString kOutFileNameExtension = ".out";    
+  return kOutFileNameExtension;
+}    
+
 
 //______________________________________________________________________________
 TGeoHMatrix AliMUONGeometryBuilder::Multiply(const TGeoMatrix& m1, 
@@ -110,13 +134,17 @@ TGeoHMatrix AliMUONGeometryBuilder::Multiply(const TGeoMatrix& m1,
   return m1 * m2 * m3 * m4;
 }
 
+//
+// ctors, dtor
+//
+
 //______________________________________________________________________________
 AliMUONGeometryBuilder::AliMUONGeometryBuilder(AliModule* module)
   : TObject(),
     fModule(module),
     fAlign(false),
-    fTransformFileName(fgkDefaultTransformFileName),
-    fSVMapFileName(fgkDefaultSVMapFileName),
+    fTransformFileName(GetDefaultTransformFileName()),
+    fSVMapFileName(GetDefaultSVMapFileName()),
     fGlobalTransformation(), 
     fGeometryBuilders(0),
     fGeometry(0)
@@ -240,7 +268,7 @@ void AliMUONGeometryBuilder::CreateGeometryWithTGeo()
   if (fAlign) {
     // Read transformations from ASCII data file  
     fGeometry->GetTransformer()
-      ->ReadGeometryData(fgkDefaultVolPathsFileName, fTransformFileName);
+      ->LoadGeometryData(fTransformFileName);
   }    
  
   for (Int_t i=0; i<fGeometryBuilders->GetEntriesFast(); i++) {
@@ -252,6 +280,7 @@ void AliMUONGeometryBuilder::CreateGeometryWithTGeo()
     // Create geometry + envelopes
     //
     builder->CreateGeometry();
+    builder->SetVolumes();
     if (!fAlign) builder->SetTransformations();
     
     // Place module volumes and envelopes
@@ -281,6 +310,20 @@ void AliMUONGeometryBuilder::CreateGeometryWithTGeo()
         AliMUONGeometryEnvelope* env 
          = (AliMUONGeometryEnvelope*)kEnvelopes->At(k);
          
+       // Check consistency of detElemId and module Id
+       if ( env->GetUniqueID() > 0 && 
+            AliMpDEManager::GetGeomModuleId(env->GetUniqueID()) 
+            != geometry->GetModuleId() ) {
+            
+         AliErrorStream() 
+           << "Detection element " << env->GetUniqueID() 
+           << " is being placed in geometry module " << geometry->GetModuleId()
+           << " but should go in " 
+           << AliMpDEManager::GetGeomModuleId(env->GetUniqueID())
+           <<  endl;
+         AliFatal("Inconsistent IDs");
+       }          
+         
         const TGeoCombiTrans* kEnvTrans = env->GetTransformation();
         const char* only = "ONLY";
         if (env->IsMANY()) only = "MANY";
@@ -334,8 +377,7 @@ void AliMUONGeometryBuilder::CreateGeometryWithoutTGeo()
 
   if (fAlign) {
     // Read transformations from ASCII data file  
-    fGeometry->GetTransformer()
-      ->ReadGeometryData(fgkDefaultVolPathsFileName, fTransformFileName);
+    fGeometry->GetTransformer()->LoadGeometryData(fTransformFileName);
   }     
 
   for (Int_t i=0; i<fGeometryBuilders->GetEntriesFast(); i++) {
@@ -378,6 +420,20 @@ void AliMUONGeometryBuilder::CreateGeometryWithoutTGeo()
         AliMUONGeometryEnvelope* env 
          = (AliMUONGeometryEnvelope*)kEnvelopes->At(k);
          
+       // Check consistency of detElemId and module Id
+       if ( env->GetUniqueID() > 0 && 
+            AliMpDEManager::GetGeomModuleId(env->GetUniqueID()) 
+            != geometry->GetModuleId() ) {
+            
+         AliErrorStream() 
+           << "Detection element " << env->GetUniqueID() 
+           << " is being placed in geometry module " << geometry->GetModuleId()
+           << " but should go in " 
+           << AliMpDEManager::GetGeomModuleId(env->GetUniqueID())
+           <<  endl;
+         AliFatal("Inconsistent IDs");
+       }          
+         
         const TGeoCombiTrans* kEnvTrans = env->GetTransformation();
         const char* only = "ONLY";
         if (env->IsMANY()) only = "MANY";
@@ -461,7 +517,7 @@ void AliMUONGeometryBuilder::CreateGeometryWithoutTGeo()
 }
 
 //_____________________________________________________________________________
-void AliMUONGeometryBuilder::SetAlign(AliMUONVGeometryBuilder* builder)
+void AliMUONGeometryBuilder::SetAlignToBuilder(AliMUONVGeometryBuilder* builder) const
 {
 /// Set align option to all geometry modules associated with the builder
 
@@ -492,7 +548,7 @@ void AliMUONGeometryBuilder::AddBuilder(AliMUONVGeometryBuilder* geomBuilder)
   if (geomBuilder->ApplyGlobalTransformation())
     geomBuilder->SetReferenceFrame(fGlobalTransformation);
   
-  SetAlign(geomBuilder);
+  SetAlignToBuilder(geomBuilder);
 }
 
 //______________________________________________________________________________
@@ -500,13 +556,23 @@ void AliMUONGeometryBuilder::CreateGeometry()
 {
 /// Construct geometry using geometry builders.
 
-  if ( gMC->IsRootGeometrySupported() && 
-       TString(gMC->ClassName()) != "TGeant4" ) {
+  if ( gMC->IsRootGeometrySupported() ) {
        
    CreateGeometryWithTGeo();
   } 
   else
    CreateGeometryWithoutTGeo();
+
+  for (Int_t i=0; i<fGeometryBuilders->GetEntriesFast(); i++) {
+
+    // Get the builder
+    AliMUONVGeometryBuilder* builder
+      = (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
+    // Update detection elements from built geometry
+    Bool_t create = ! fAlign;
+    builder->UpdateDetElements(create);
+  }
 }
 
 //_____________________________________________________________________________
@@ -531,16 +597,14 @@ void AliMUONGeometryBuilder::InitGeometry(const TString& svmapFileName)
 /// Initialize geometry
 
   // Load alignement data from geometry if geometry is read from Root file
-  if ( gAlice->IsRootGeometry() ) {
+  if ( AliSimulation::Instance()->IsGeometryFromFile() ) {
     fAlign = true;
-
-    fGeometry->GetTransformer()
-      ->ReadGeometryData(fgkDefaultVolPathsFileName, gGeoManager);
-  }    
+    fGeometry->GetTransformer()->LoadGeometryData();
+ }    
 
   // Read sensitive volume map from a file
   fGeometry->ReadSVMap(svmapFileName);
-      
+
   // Set the chamber (sensitive region) GEANT identifier
   //
   for (Int_t i=0; i<fGeometryBuilders->GetEntriesFast(); i++) {
@@ -551,17 +615,21 @@ void AliMUONGeometryBuilder::InitGeometry(const TString& svmapFileName)
 
     // Set sensitive volumes with each builder
     builder->SetSensitiveVolumes();
-
-    if (!fAlign)  {
-      // Create detection elements from built geometry
-      builder->CreateDetElements();
-    }  
   }  
 }
 
+//________________________________________________________________
+void AliMUONGeometryBuilder::UpdateInternalGeometry()
+{
+/// Update geometry after applying mis-alignment:
+/// reload transformations in geometry builder.
+
+  fGeometry->GetTransformer()->LoadTransformations();
+}
+
 //______________________________________________________________________________
 void AliMUONGeometryBuilder::WriteSVMaps(const TString& fileName, 
-                                         Bool_t rebuild)
+                                         Bool_t rebuild, Bool_t writeEnvelopes)
 {
 /// Write sensitive volume maps into files per builder
 
@@ -573,10 +641,6 @@ void AliMUONGeometryBuilder::WriteSVMaps(const TString& fileName,
       AliMUONVGeometryBuilder* builder
         = (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
 
-      Bool_t writeEnvelopes = false;
-      if ( gMC->IsRootGeometrySupported() &&
-           TString(gMC->ClassName()) != "TGeant4") writeEnvelopes = true;
-
       builder->RebuildSVMaps(writeEnvelopes);
     }  
     
@@ -596,7 +660,7 @@ void AliMUONGeometryBuilder::SetAlign(Bool_t align)
     AliMUONVGeometryBuilder* builder
       = (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
     
-    SetAlign(builder); 
+    SetAlignToBuilder(builder); 
   }   
 }
 
@@ -613,6 +677,6 @@ void AliMUONGeometryBuilder::SetAlign(const TString& fileName, Bool_t align)
     AliMUONVGeometryBuilder* builder
       = (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
     
-    SetAlign(builder); 
+    SetAlignToBuilder(builder); 
   }   
 }