]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAlignObj.cxx
Added some extra CF plots and changed binning for a few histograms (kathrin) anddded...
[u/mrichter/AliRoot.git] / STEER / AliAlignObj.cxx
index 3a651213b599a241238e3d58f6815bb6360b5754..9df415be8d3e703532dff7461a0b5cf92c842b78 100644 (file)
@@ -239,13 +239,13 @@ Bool_t AliAlignObj::GetLocalCovMatrix(TMatrixDSym& lCov) const
   //
   TMatrixD mJ(6,6);// the jacobian of the transformation from local to global parameters
   if(!GetJacobian(mJ)) return kFALSE;
-  TMatrixD invJ = mJ.Invert(); // the inverse of the jacobian matrix
   
   TMatrixDSym gCov(6);
   GetCovMatrix(gCov);
   
-  // Compute the global covariance matrix gcov = mJ lcov mJ-1
-  TMatrixD lCovM = invJ * gCov * mJ;
+  // Compute the local covariance matrix lcov = mJ^T gcov mJ
+  TMatrixD gcovJ(gCov,TMatrixD::kMult,mJ);
+  TMatrixD lCovM(mJ,TMatrixD::kTransposeMult,gcovJ);
   // To be done: somehow check that lCovM is close enough to be symmetric
   for(Int_t i=0; i<6; i++)
   {
@@ -390,10 +390,11 @@ Bool_t AliAlignObj::SetFromLocalCov(TMatrixDSym& lCov)
   //
   TMatrixD mJ(6,6);// the jacobian of the transformation from local to global parameters
   if(!GetJacobian(mJ)) return kFALSE;
-  TMatrixD invJ = mJ.Invert(); // the inverse of the jacobian matrix
   
-  // Compute the global covariance matrix gcov = mJ lcov mJ-1
-  TMatrixD gCovM = mJ * lCov * invJ;
+  // Compute the global covariance matrix gcov = mJ lcov mJ'
+  TMatrixD trJ(TMatrixD::kTransposed, mJ);
+  TMatrixD lcovTrJ(lCov,TMatrixD::kMult,trJ);
+  TMatrixD gCovM(mJ,TMatrixD::kMult,lcovTrJ);
   // To be done: somehow check that gCovM is close enough to be symmetric
   TMatrixDSym gCov(6);
   for(Int_t i=0; i<6; i++)
@@ -726,34 +727,34 @@ Bool_t AliAlignObj::SetLocalMatrix(const TGeoMatrix& m)
   }
 
   const char* symname = GetSymName();
-  TGeoPhysicalNode* node;
+  TGeoHMatrix gprime,gprimeinv;
+  TGeoPhysicalNode* pn = 0;
   TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
-  if(pne){
-    if(!pne->GetPhysicalNode()){
-      node = gGeoManager->MakeAlignablePN(pne);
+  if(pne)
+  {
+    pn = pne->GetPhysicalNode();
+    if(pn){
+      if (pn->IsAligned())
+       AliWarning(Form("Volume %s has been misaligned already!",symname));
+      gprime = *pn->GetMatrix();
     }else{
-      node = pne->GetPhysicalNode();
+      gprime = pne->GetGlobalOrig();
     }
   }else{
     AliWarning(Form("The symbolic volume name %s does not correspond to a physical entry. Using it as volume path!",symname));
-    node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(symname);
-  }
-
-  if (!node) {
-    AliError(Form("Volume name or path %s not valid!",symname));
-    return kFALSE;
+    if(!gGeoManager->cd(symname)) {
+      AliError(Form("Volume name or path %s not valid!",symname));
+      return kFALSE;
+    }
+    gprime = *gGeoManager->GetCurrentMatrix();
   }
-  if (node->IsAligned())
-    AliWarning(Form("Volume %s has been already misaligned!",symname));
 
-  TGeoHMatrix m1;
+  TGeoHMatrix m1; // the TGeoHMatrix copy of the local delta "m"
   const Double_t *tr = m.GetTranslation();
   m1.SetTranslation(tr);
   const Double_t* rot = m.GetRotationMatrix();
   m1.SetRotation(rot);
 
-  TGeoHMatrix align,gprime,gprimeinv;
-  gprime = *node->GetMatrix();
   gprimeinv = gprime.Inverse();
   m1.Multiply(&gprimeinv);
   m1.MultiplyLeft(&gprime);
@@ -845,8 +846,8 @@ Bool_t AliAlignObj::GetLocalMatrix(TGeoHMatrix& m) const
     AliError(Form("Volume name or path %s not valid!",symname));
     return kFALSE;
   }
-  if (node->IsAligned())
-    AliWarning(Form("Volume %s has been already misaligned!",symname));
+//  if (node->IsAligned())
+//    AliWarning(Form("Volume %s has been misaligned already!",symname));
 
   GetMatrix(m);
   TGeoHMatrix gprime,gprimeinv;
@@ -890,7 +891,7 @@ Bool_t AliAlignObj::ApplyToGeometry(Bool_t ovlpcheck)
       return kFALSE;
     }
     if (gGeoManager->GetListOfPhysicalNodes()->FindObject(path)) {
-      AliError(Form("Volume %s has already been misaligned!",path));
+      AliError(Form("Volume %s has been misaligned already!",path));
       return kFALSE;
     }
     node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(path);