]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGeometryMisAligner.cxx
Removing leftover return
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryMisAligner.cxx
index 581fe668a7fef66ad495998e5da2e55c7b9d556a..5959fc92b7c759d57d28aef43eaa182d0692d01d 100644 (file)
 #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>
@@ -69,8 +73,7 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartXMisAligM, Dou
     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++){
@@ -86,7 +89,6 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartXMisAligM, Dou
   fDetElemMisAlig[5][0] = angMisAligM; 
   fDetElemMisAlig[5][1] = angMisAligW;
 
-  fDisplacementGenerator = new TRandom(0);
 }
 
 //______________________________________________________________________________
@@ -95,8 +97,7 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAligM, Doub
     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++){
@@ -112,7 +113,6 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAligM, Doub
   fDetElemMisAlig[5][0] = angMisAligM; 
   fDetElemMisAlig[5][1] = angMisAligW;
 
-  fDisplacementGenerator = new TRandom(0);
 }
 
 //______________________________________________________________________________
@@ -121,8 +121,7 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAlig, Doubl
     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++){
@@ -135,7 +134,6 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner(Double_t cartMisAlig, Doubl
   fDetElemMisAlig[1][1] = cartMisAlig; 
   fDetElemMisAlig[5][1] = angMisAlig;
 
-  fDisplacementGenerator = new TRandom(0);
 }
 
 //_____________________________________________________________________________
@@ -144,8 +142,7 @@ AliMUONGeometryMisAligner::AliMUONGeometryMisAligner()
     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++){
@@ -161,7 +158,6 @@ AliMUONGeometryMisAligner::~AliMUONGeometryMisAligner()
 {
 /// Destructor
 
-  if (fDisplacementGenerator) delete fDisplacementGenerator;
 }
 
 //_________________________________________________________________________
@@ -178,7 +174,7 @@ AliMUONGeometryMisAligner::SetXYAngMisAligFactor(Double_t factor)
     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));
 }
 
 //_________________________________________________________________________
@@ -191,7 +187,7 @@ void AliMUONGeometryMisAligner::SetZCartMisAligFactor(Double_t 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));
 }
 
 //_________________________________________________________________________
@@ -207,13 +203,13 @@ void AliMUONGeometryMisAligner::GetUniMisAlign(Double_t cartMisAlig[3], Double_t
     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
 }
 
 //_________________________________________________________________________
@@ -229,13 +225,13 @@ void AliMUONGeometryMisAligner::GetGausMisAlign(Double_t cartMisAlig[3], Double_
     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
 }
 
 //_________________________________________________________________________
@@ -375,14 +371,11 @@ AliMUONGeometryMisAligner::MisAlign(const AliMUONGeometryTransformer *
       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(),
@@ -430,5 +423,59 @@ AliMUONGeometryMisAligner::MisAlign(const AliMUONGeometryTransformer *
 }
 
 
+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);
+       }
+      }
+    }
+  }
+}
+