#include "AliMUONGeometryModuleTransformer.h"
#include "AliMUONGeometryDetElement.h"
#include "AliMUONGeometryBuilder.h"
-
#include "AliMpExMap.h"
+#include "AliMpExMapIterator.h"
+#include "AliAlignObjMatrix.h"
+#include "AliMathBase.h"
#include "AliLog.h"
+#include <TClonesArray.h>
#include <TGeoMatrix.h>
+#include <TMatrixDSym.h>
#include <TMath.h>
#include <TRandom.h>
#include <Riostream.h>
fUseUni(kFALSE),
fUseGaus(kTRUE),
fXYAngMisAligFactor(0.0),
- fZCartMisAligFactor(0.0),
- fDisplacementGenerator(0)
+ fZCartMisAligFactor(0.0)
{
/// Standard constructor
for (Int_t i=0; i<6; i++){
fDetElemMisAlig[5][0] = angMisAligM;
fDetElemMisAlig[5][1] = angMisAligW;
- fDisplacementGenerator = new TRandom(0);
}
//______________________________________________________________________________
fUseUni(kFALSE),
fUseGaus(kTRUE),
fXYAngMisAligFactor(0.0),
- fZCartMisAligFactor(0.0),
- fDisplacementGenerator(0)
+ fZCartMisAligFactor(0.0)
{
/// Standard constructor
for (Int_t i=0; i<6; i++){
fDetElemMisAlig[5][0] = angMisAligM;
fDetElemMisAlig[5][1] = angMisAligW;
- fDisplacementGenerator = new TRandom(0);
}
//______________________________________________________________________________
fUseUni(kTRUE),
fUseGaus(kFALSE),
fXYAngMisAligFactor(0.0),
- fZCartMisAligFactor(0.0),
- fDisplacementGenerator(0)
+ fZCartMisAligFactor(0.0)
{
/// Standard constructor
for (Int_t i=0; i<6; i++){
fDetElemMisAlig[1][1] = cartMisAlig;
fDetElemMisAlig[5][1] = angMisAlig;
- fDisplacementGenerator = new TRandom(0);
}
//_____________________________________________________________________________
fUseUni(kTRUE),
fUseGaus(kFALSE),
fXYAngMisAligFactor(0.0),
- fZCartMisAligFactor(0.0),
- fDisplacementGenerator(0)
+ fZCartMisAligFactor(0.0)
{
/// Default constructor
for (Int_t i=0; i<6; i++){
{
/// Destructor
- if (fDisplacementGenerator) delete fDisplacementGenerator;
}
//_________________________________________________________________________
fDetElemMisAlig[4][1] = fDetElemMisAlig[5][1]*factor; // compatibility
}
else
- AliError(Form("Invalid XY angular misalign factor, %d", factor));
+ AliError(Form("Invalid XY angular misalign factor, %f", factor));
}
//_________________________________________________________________________
fDetElemMisAlig[2][1] = fDetElemMisAlig[0][1]*factor; // keep backward compatibility
}
else
- AliError(Form("Invalid Z cartesian misalign factor, %d", factor));
+ AliError(Form("Invalid Z cartesian misalign factor, %f", factor));
}
//_________________________________________________________________________
detection elements are on a support structure), while rotation of the x-y
plane is more free.
*/
- cartMisAlig[0] = fDisplacementGenerator->Uniform(-lParMisAlig[0][1]+lParMisAlig[0][0], lParMisAlig[0][0]+lParMisAlig[0][1]);
- cartMisAlig[1] = fDisplacementGenerator->Uniform(-lParMisAlig[1][1]+lParMisAlig[1][0], lParMisAlig[1][0]+lParMisAlig[1][1]);
- cartMisAlig[2] = fDisplacementGenerator->Uniform(-lParMisAlig[2][1]+lParMisAlig[2][0], lParMisAlig[2][0]+lParMisAlig[2][1]);
+ cartMisAlig[0] = gRandom->Uniform(-lParMisAlig[0][1]+lParMisAlig[0][0], lParMisAlig[0][0]+lParMisAlig[0][1]);
+ cartMisAlig[1] = gRandom->Uniform(-lParMisAlig[1][1]+lParMisAlig[1][0], lParMisAlig[1][0]+lParMisAlig[1][1]);
+ cartMisAlig[2] = gRandom->Uniform(-lParMisAlig[2][1]+lParMisAlig[2][0], lParMisAlig[2][0]+lParMisAlig[2][1]);
- angMisAlig[0] = fDisplacementGenerator->Uniform(-lParMisAlig[3][1]+lParMisAlig[3][0], lParMisAlig[3][0]+lParMisAlig[3][1]);
- angMisAlig[1] = fDisplacementGenerator->Uniform(-lParMisAlig[4][1]+lParMisAlig[4][0], lParMisAlig[4][0]+lParMisAlig[4][1]);
- angMisAlig[2] = fDisplacementGenerator->Uniform(-lParMisAlig[5][1]+lParMisAlig[5][0], lParMisAlig[5][0]+lParMisAlig[5][1]); // degrees
+ angMisAlig[0] = gRandom->Uniform(-lParMisAlig[3][1]+lParMisAlig[3][0], lParMisAlig[3][0]+lParMisAlig[3][1]);
+ angMisAlig[1] = gRandom->Uniform(-lParMisAlig[4][1]+lParMisAlig[4][0], lParMisAlig[4][0]+lParMisAlig[4][1]);
+ angMisAlig[2] = gRandom->Uniform(-lParMisAlig[5][1]+lParMisAlig[5][0], lParMisAlig[5][0]+lParMisAlig[5][1]); // degrees
}
//_________________________________________________________________________
detection elements are on a support structure), while rotation of the x-y
plane is more free.
*/
- cartMisAlig[0] = fDisplacementGenerator->Gaus(lParMisAlig[0][0], lParMisAlig[0][1]);
- cartMisAlig[1] = fDisplacementGenerator->Gaus(lParMisAlig[1][0], lParMisAlig[1][1]);
- cartMisAlig[2] = fDisplacementGenerator->Gaus(lParMisAlig[2][0], lParMisAlig[2][1]);
+ cartMisAlig[0] = AliMathBase::TruncatedGaus(lParMisAlig[0][0], lParMisAlig[0][1], 3.*lParMisAlig[0][1]);
+ cartMisAlig[1] = AliMathBase::TruncatedGaus(lParMisAlig[1][0], lParMisAlig[1][1], 3.*lParMisAlig[1][1]);
+ cartMisAlig[2] = AliMathBase::TruncatedGaus(lParMisAlig[2][0], lParMisAlig[2][1], 3.*lParMisAlig[2][1]);
- angMisAlig[0] = fDisplacementGenerator->Gaus(lParMisAlig[3][0], lParMisAlig[3][1]);
- angMisAlig[1] = fDisplacementGenerator->Gaus(lParMisAlig[4][0], lParMisAlig[4][1]);
- angMisAlig[2] = fDisplacementGenerator->Gaus(lParMisAlig[5][0], lParMisAlig[5][1]); // degrees
+ angMisAlig[0] = AliMathBase::TruncatedGaus(lParMisAlig[3][0], lParMisAlig[3][1], 3.*lParMisAlig[3][1]);
+ angMisAlig[1] = AliMathBase::TruncatedGaus(lParMisAlig[4][0], lParMisAlig[4][1], 3.*lParMisAlig[4][1]);
+ angMisAlig[2] = AliMathBase::TruncatedGaus(lParMisAlig[5][0], lParMisAlig[5][1], 3.*lParMisAlig[5][1]); // degrees
}
//_________________________________________________________________________
if (verbose)
AliInfo(Form("%i DEs in old GeometryStore %i",detElements->GetSize(), iMt));
- for (Int_t iDe = 0; iDe < detElements->GetSize(); iDe++)
- { // detection elements.
- AliMUONGeometryDetElement *detElement =
- (AliMUONGeometryDetElement *) detElements->GetObject(iDe);
-
- if (!detElement)
- AliFatal("Detection element not found.");
-
+ TIter next(detElements->CreateIterator());
+ AliMUONGeometryDetElement *detElement;
+
+ while ( ( detElement = static_cast<AliMUONGeometryDetElement*>(next()) ) )
+ {
/// make a new detection element
AliMUONGeometryDetElement *newDetElement =
new AliMUONGeometryDetElement(detElement->GetId(),
}
+void AliMUONGeometryMisAligner::SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t rChId, Double_t rChResX, Double_t rChResY, Double_t rDeResX, Double_t rDeResY){
+
+ Int_t chIdMin = (rChId<0)? 0 : rChId;
+ Int_t chIdMax = (rChId<0)? 9 : rChId;
+ Double_t chResX = (rChResX<0)? fModuleMisAlig[0][1] : rChResX;
+ Double_t chResY = (rChResY<0)? fModuleMisAlig[1][1] : rChResY;
+ Double_t deResX = (rDeResX<0)? fDetElemMisAlig[0][1] : rDeResX;
+ Double_t deResY = (rDeResY<0)? fDetElemMisAlig[1][1] : rDeResY;
+
+ TMatrixDSym mChCorrMatrix(6);
+ mChCorrMatrix[0][0]=chResX*chResX;
+ mChCorrMatrix[1][1]=chResY*chResY;
+ // mChCorrMatrix.Print();
+
+ TMatrixDSym mDECorrMatrix(6);
+ mDECorrMatrix[0][0]=deResX*deResX;
+ mDECorrMatrix[1][1]=deResY*deResY;
+ // mDECorrMatrix.Print();
+
+ AliAlignObjMatrix *alignMat = 0x0;
+
+ for(Int_t chId=chIdMin; chId<=chIdMax; chId++) {
+ TString chName1;
+ TString chName2;
+ if (chId<4){
+ chName1 = Form("GM%d",chId);
+ chName2 = Form("GM%d",chId);
+ } else {
+ chName1 = Form("GM%d",4+(chId-4)*2);
+ chName2 = Form("GM%d",4+(chId-4)*2+1);
+ }
+
+ for (int i=0; i<misAlignArray->GetEntries(); i++) {
+ alignMat = (AliAlignObjMatrix*)misAlignArray->At(i);
+ TString volName(alignMat->GetSymName());
+ if((volName.Contains(chName1)&&
+ ((volName.Last('/')==volName.Index(chName1)+chName1.Length())||
+ (volName.Length()==volName.Index(chName1)+chName1.Length())))||
+ (volName.Contains(chName2)&&
+ ((volName.Last('/')==volName.Index(chName2)+chName2.Length())||
+ (volName.Length()==volName.Index(chName2)+chName2.Length())))){
+ volName.Remove(0,volName.Last('/')+1);
+ if (volName.Contains("GM")) {
+ // alignMat->Print("NULL");
+ alignMat->SetCorrMatrix(mChCorrMatrix);
+ } else if (volName.Contains("DE")) {
+ // alignMat->Print("NULL");
+ alignMat->SetCorrMatrix(mDECorrMatrix);
+ }
+ }
+ }
+ }
+}
+