#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"
/// \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)
{
/// 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
{
/// 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);
/// 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
// << "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 {
/// 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;
/// 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;
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();
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()));
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;
}
= (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
// Write data on out
- out << "CH "
+ out << AliMUONGeometryModuleTransformer::GetModuleNamePrefix() << " "
<< setw(4) << moduleTransformer->GetModuleId() << " "
<< moduleTransformer->GetVolumePath() << endl;
}
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;
}
= moduleTransformer->GetTransformation();
// Write data on out
- out << "CH "
- << setw(4) << moduleTransformer->GetModuleId() + 1;
+ out << AliMUONGeometryModuleTransformer::GetModuleNamePrefix() << " "
+ << setw(4) << moduleTransformer->GetModuleId();
WriteTransform(out, transform);
}
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);
}
}
}
+//______________________________________________________________________________
+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
//
{
/// 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);
}
//_____________________________________________________________________________
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);
}
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
{
AliMUONGeometryModuleTransformer* module
= (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
- TString path = module->GetVolumePath();
Int_t moduleId = module->GetModuleId();
// Align object ID
// 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
// 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,
/// 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);
}