Addition of getter/setter of the reduced covariance matrix data members by means...
authorrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 16 Oct 2007 14:39:53 +0000 (14:39 +0000)
committerrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 16 Oct 2007 14:39:53 +0000 (14:39 +0000)
STEER/AliAlignObj.cxx
STEER/AliAlignObj.h

index f805fb58ea60f5b391b7a448e63c6a3474277847..117b430b36286727947f563189ff2aa93727265d 100644 (file)
@@ -203,6 +203,27 @@ void AliAlignObj::GetCovMatrix(Double_t *cmat) const
     // Diagonal elements
     cmat[i*(i+1)/2+i] = (fDiag[i] >= 0.) ? fDiag[i]*fDiag[i] : -999.;
   }
+
+  return;
+}
+
+//______________________________________________________________________________
+void AliAlignObj::GetCovMatrix(TMatrixDSym& mcov) const
+{
+  // Fills the matrix m passed as argument as the covariance matrix calculated
+  // from the coefficients of the reduced covariance matrix data members
+  //
+
+  for(Int_t i=0; i<6; ++i) {
+    // Off diagonal elements
+    for(Int_t j=0; j<i; ++j) {
+      mcov(j,i) = mcov(i,j) = (fDiag[j] >= 0. && fDiag[i] >= 0.) ? fODia[(i-1)*i/2+j]*fDiag[j]*fDiag[i]: -999.;
+    }
+
+    // Diagonal elements
+    mcov(i,i) = (fDiag[i] >= 0.) ? fDiag[i]*fDiag[i] : -999.;
+  }
+
 }
 
 //______________________________________________________________________________
@@ -234,6 +255,35 @@ void AliAlignObj::SetCorrMatrix(Double_t *cmat)
   return;
 }
 
+//______________________________________________________________________________
+void AliAlignObj::SetCorrMatrix(TMatrixDSym& mcov)
+{
+  // Sets the correlation matrix data member from the covariance matrix mcov passed
+  // passed as argument. 
+  //
+  if(mcov.IsValid()) {
+
+    // Diagonal elements first
+    for(Int_t i=0; i<6; ++i) {
+      fDiag[i] = (mcov(i,i) >= 0.) ? TMath::Sqrt(mcov(i,i)) : -999.;
+    }
+
+    // ... then the ones off diagonal
+    for(Int_t i=0; i<6; ++i)
+      // Off diagonal elements
+      for(Int_t j=0; j<i; ++j) {
+       fODia[(i-1)*i/2+j] = (fDiag[i] > 0. && fDiag[j] > 0.) ? mcov(i,j)/(fDiag[j]*fDiag[i]) : 0.;       // check for division by zero (due to diagonal element of 0) and for fDiag != -999. (due to negative input diagonal element).
+       if (fODia[(i-1)*i/2+j]>1.)  fODia[(i-1)*i/2+j] =  1.; // check upper boundary
+       if (fODia[(i-1)*i/2+j]<-1.) fODia[(i-1)*i/2+j] = -1.; // check lower boundary
+      }
+  } else {
+    for(Int_t i=0; i< 6; ++i) fDiag[i]=-999.;
+    for(Int_t i=0; i< 6*(6-1)/2; ++i) fODia[i]=0.;
+  }
+
+  return;
+}
+
 //_____________________________________________________________________________
 void AliAlignObj::AnglesToMatrix(const Double_t *angles, Double_t *rot) const
 {
index 61dc08dd90b268c87ae2e8cbe6f551192d6e9e17..d5c89c03678c552320f8a17da5f14fc9945fe167 100644 (file)
 //      name for alignable volumes, in form of a TGeo path otherwise,    *
 //      and as a unique integer identifier                               *
 //************************************************************************
-#include "TObject.h"
-#include "TString.h"
-#include "TGeoMatrix.h"
+#include <TObject.h>
+#include <TString.h>
+#include <TGeoMatrix.h>
 #include <Rtypes.h>
 #include <TMath.h>
+#include <TMatrixDSym.h>
 #include "AliGeomManager.h"
 
 
@@ -54,6 +55,7 @@ class AliAlignObj : public TObject {
   void  SetVolUID(UShort_t voluid) {fVolUID=voluid;}
   void  SetVolUID(AliGeomManager::ELayerID layerId, Int_t modId);
   void  SetCorrMatrix(Double_t *cov);
+  void  SetCorrMatrix(TMatrixDSym& mcov);
 
   //Getters
   const char  *GetSymName()    const {return fVolPath.Data();}
@@ -68,6 +70,7 @@ class AliAlignObj : public TObject {
   virtual void GetMatrix(TGeoHMatrix& m) const=0;
   virtual Bool_t GetLocalMatrix(TGeoHMatrix& m) const;
   void  GetCovMatrix(Double_t *cov) const;
+  void  GetCovMatrix(TMatrixDSym& mcov) const;
 
   Bool_t   IsSortable() const {return kTRUE;}
   Int_t         GetLevel() const;