// Eric only allowed 3 : x,y,theta_xy, but in principle z and the other
// two angles are alignable as well.
-
-
#include "AliMUONGeometryMisAligner.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONGeometryModuleTransformer.h"
#include "AliMUONGeometryDetElement.h"
#include "AliMUONGeometryStore.h"
#include "AliMUONGeometryBuilder.h"
+
+#include "AliLog.h"
+
#include <TGeoManager.h>
#include <Riostream.h>
#include <TObjArray.h>
#include <TMath.h>
#include <TRandom.h>
-#include "AliLog.h"
-
#include <sstream>
ClassImp(AliMUONGeometryMisAligner)
new AliMUONGeometryModuleTransformer(iMt);
newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
- const TGeoCombiTrans *kModuleTransform =
- kModuleTransformer->GetTransformation();
- TGeoCombiTrans *newModuleTransform = new TGeoCombiTrans(*kModuleTransform); // same module transform as the previous one
- newModuleTransformer->SetTransformation(*kModuleTransform);
+ TGeoCombiTrans moduleTransform =
+ TGeoCombiTrans(*kModuleTransformer->GetTransformation());
+ TGeoCombiTrans *newModuleTransform = new TGeoCombiTrans(moduleTransform);
+ // same module transform as the previous one
+ // no mis align object created
+ newModuleTransformer->SetTransformation(moduleTransform);
AliMUONGeometryStore *detElements =
kModuleTransformer->GetDetElementStore();
if (!detElement)
AliFatal("Detection element not found.");
- // local transformation of this detection element.
- const TGeoCombiTrans *kLocalTransform =
- detElement->GetLocalTransformation();
- TGeoCombiTrans newLocalTransform = MisAlign(*kLocalTransform);
-
- /// make a new detection element with this local transform
+ /// make a new detection element
AliMUONGeometryDetElement *newDetElement =
new AliMUONGeometryDetElement(detElement->GetId(),
- detElement->GetAlignedVolume(),
- newLocalTransform);
+ detElement->GetVolumePath());
- TGeoHMatrix newGlobalTransform =
- AliMUONGeometryBuilder::Multiply(newLocalTransform,
- *newModuleTransform);
+ // local transformation of this detection element.
+ TGeoCombiTrans localTransform
+ = TGeoCombiTrans(*detElement->GetLocalTransformation());
+ TGeoCombiTrans newLocalTransform = MisAlign(localTransform);
+ newDetElement->SetLocalTransformation(newLocalTransform);
+ // global transformation
+ TGeoHMatrix newGlobalTransform =
+ AliMUONGeometryBuilder::Multiply(*newModuleTransform,
+ newLocalTransform);
newDetElement->SetGlobalTransformation(newGlobalTransform);
- if (verbose)
- AliInfo("GlobalTransforms:");
- newModuleTransformer->GetDetElementStore()->Add(
- newDetElement->GetId(),
+
+ // add this det element to module
+ newModuleTransformer->GetDetElementStore()->Add(newDetElement->GetId(),
newDetElement);
+ // Get delta transformation:
+ // Tdelta = Tnew * Told.inverse
+ TGeoHMatrix deltaTransform
+ = AliMUONGeometryBuilder::Multiply(
+ newGlobalTransform,
+ detElement->GetGlobalTransformation()->Inverse());
+
+ // Create mis alignment matrix
+ newGeometryTransformer
+ ->AddMisAlignDetElement(detElement->GetId(), deltaTransform);
}
if (verbose)
AliInfo(Form("Added module transformer %i to the transformer", iMt));
#include <TObject.h>
#include <TGeoMatrix.h>
-class TRandom;
class AliMUONGeometryTransformer;
+class TRandom;
+
class AliMUONGeometryMisAligner:public TObject
{
public:
// methods
// return a misaligned geometry obtained from the existing one.
- AliMUONGeometryTransformer* MisAlign(const AliMUONGeometryTransformer* transformer, Bool_t verbose = kFALSE);
+ AliMUONGeometryTransformer* MisAlign(const AliMUONGeometryTransformer* transformer,
+ Bool_t verbose = kFALSE);
- // return a misaligned transformation
- TGeoCombiTrans MisAlign(const TGeoCombiTrans& transform) const;
-
void SetMaxCartMisAlig(Double_t offset)
{fMaxCartMisAlig = offset ;}
AliMUONGeometryMisAligner & operator =(const AliMUONGeometryMisAligner &right);
private:
+ // return a misaligned transformation
+ TGeoCombiTrans MisAlign(const TGeoCombiTrans& transform) const;
+
Double_t fMaxCartMisAlig; // cartesian displacement range, set by SetMaxCartMisAlig (translations)
Double_t fMaxAngMisAlig; // Angular displacement range (rotations)
Double_t fXYAngMisAligFactor; // factor (<1) to apply to angular misalignment range since range of motion is restricted out of the xy plane