**************************************************************************/
// $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,
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)
// Place the volume
if (npar == 0)
- gMC->Gspos(name, copyNo, mName, xyz[0], xyz[1], xyz[2] , krot, only);
+ TVirtualMC::GetMC()->Gspos(name, copyNo, mName, xyz[0], xyz[1], xyz[2] , krot, only);
else
- gMC->Gsposp(name, copyNo, mName, xyz[0], xyz[1], xyz[2] , krot, only,
+ TVirtualMC::GetMC()->Gsposp(name, copyNo, mName, xyz[0], xyz[1], xyz[2] , krot, only,
param, npar);
}
if (fAlign) {
// Read transformations from ASCII data file
fGeometry->GetTransformer()
- ->ReadGeometryData(fgkDefaultVolPathsFileName, fTransformFileName);
+ ->LoadGeometryData(fTransformFileName);
}
for (Int_t i=0; i<fGeometryBuilders->GetEntriesFast(); i++) {
// Create geometry + envelopes
//
builder->CreateGeometry();
+ builder->SetVolumes();
if (!fAlign) builder->SetTransformations();
// Place module volumes and envelopes
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";
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++) {
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";
}
//_____________________________________________________________________________
-void AliMUONGeometryBuilder::SetAlign(AliMUONVGeometryBuilder* builder)
+void AliMUONGeometryBuilder::SetAlignToBuilder(AliMUONVGeometryBuilder* builder) const
{
/// Set align option to all geometry modules associated with the builder
if (geomBuilder->ApplyGlobalTransformation())
geomBuilder->SetReferenceFrame(fGlobalTransformation);
- SetAlign(geomBuilder);
+ SetAlignToBuilder(geomBuilder);
}
//______________________________________________________________________________
{
/// Construct geometry using geometry builders.
- if ( gMC->IsRootGeometrySupported() &&
- TString(gMC->ClassName()) != "TGeant4" ) {
+ if ( TVirtualMC::GetMC()->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);
+ }
}
//_____________________________________________________________________________
/// 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++) {
// 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
AliMUONVGeometryBuilder* builder
= (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
- Bool_t writeEnvelopes = false;
- if ( gMC->IsRootGeometrySupported() &&
- TString(gMC->ClassName()) != "TGeant4") writeEnvelopes = true;
-
builder->RebuildSVMaps(writeEnvelopes);
}
AliMUONVGeometryBuilder* builder
= (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
- SetAlign(builder);
+ SetAlignToBuilder(builder);
}
}
AliMUONVGeometryBuilder* builder
= (AliMUONVGeometryBuilder*)fGeometryBuilders->At(i);
- SetAlign(builder);
+ SetAlignToBuilder(builder);
}
}