+//_____________________________________________________________________________
+void AliMUONGeometryTransformer::AddMisAlignModule(Int_t moduleId,
+ const TGeoHMatrix& matrix)
+{
+/// Build AliAlignObjMatrix with module ID, its volumePaths
+/// and the given delta transformation matrix
+
+ if ( ! fMisAlignArray )
+ fMisAlignArray = new TClonesArray("AliAlignObjMatrix", 200);
+
+ const AliMUONGeometryModuleTransformer* kTransformer
+ = GetModuleTransformer(moduleId);
+ if ( ! kTransformer ) {
+ AliErrorStream() << "Module " << moduleId << " not found." << endl;
+ 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,
+ const_cast<TGeoHMatrix&>(matrix));
+}
+
+//_____________________________________________________________________________
+void AliMUONGeometryTransformer::AddMisAlignDetElement(Int_t detElemId,
+ const TGeoHMatrix& matrix)
+{
+/// Build AliAlignObjMatrix with detection element ID, its volumePaths
+/// and the given delta transformation matrix
+
+ if ( ! fMisAlignArray )
+ fMisAlignArray = new TClonesArray("AliAlignObjMatrix", 200);
+
+ const AliMUONGeometryDetElement* kDetElement
+ = GetDetElement(detElemId);
+
+ if ( ! kDetElement ) {
+ AliErrorStream() << "Det element " << detElemId << " not found." << endl;
+ 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,
+ const_cast<TGeoHMatrix&>(matrix));
+}
+
+//_____________________________________________________________________________
+TClonesArray* AliMUONGeometryTransformer::CreateZeroAlignmentData() const
+{
+/// Create array with zero alignment data
+
+ // Create array for zero-alignment objects
+ TClonesArray* array = new TClonesArray("AliAlignObjMatrix", 200);
+ TClonesArray& refArray =*array;
+ array->SetOwner(true);
+
+ // Identity matrix
+ TGeoHMatrix matrix;
+
+ // Modules
+ for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
+ AliMUONGeometryModuleTransformer* module
+ = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
+
+ TString path = module->GetVolumePath();
+ Int_t moduleId = module->GetModuleId();
+
+ // Align object ID
+ Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, moduleId);
+
+ // Create mis align matrix
+ Int_t pos = array->GetEntriesFast();
+ new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId, matrix);
+ }
+
+ // Detection elements
+ for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
+ AliMUONGeometryModuleTransformer* moduleTransformer
+ = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
+ AliMUONGeometryStore* detElements
+ = moduleTransformer->GetDetElementStore();
+
+ for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+ AliMUONGeometryDetElement* detElement
+ = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
+
+ TString path = detElement->GetVolumePath();
+ Int_t detElemId = detElement->GetId();
+
+ // Align object ID
+ Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, detElemId);
+
+ // Create mis align matrix
+ Int_t pos = array->GetEntriesFast();
+ new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId, matrix);
+ }
+ }
+
+ return array;
+}
+