]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliTrackPointArray.cxx
Removing obsolete data member
[u/mrichter/AliRoot.git] / STEER / AliTrackPointArray.cxx
index 10b03802ec0ed08c244c280e727e3543b79a435a..92b2b15db0ff3628f9bc1a09c3807ec98ef92356 100644 (file)
 //   cvetan.cheshkov@cern.ch 3/11/2005                                      //
 //////////////////////////////////////////////////////////////////////////////
 
+#include <TMath.h>
+#include <TMatrixDSym.h>
+
 #include "AliTrackPointArray.h"
 
 ClassImp(AliTrackPointArray)
 
 //______________________________________________________________________________
-AliTrackPointArray::AliTrackPointArray()
+AliTrackPointArray::AliTrackPointArray() :
+  TObject(),
+  fNPoints(0),
+  fX(0),
+  fY(0),
+  fZ(0),
+  fSize(0),
+  fCov(0),
+  fVolumeID(0)
 {
-  fNPoints = fSize = 0;
-  fX = fY = fZ = 0;
-  fVolumeID = 0;
-  fCov = 0;
 }
 
 //______________________________________________________________________________
 AliTrackPointArray::AliTrackPointArray(Int_t npoints):
-  fNPoints(npoints)
+  TObject(),
+  fNPoints(npoints),
+  fX(new Float_t[npoints]),
+  fY(new Float_t[npoints]),
+  fZ(new Float_t[npoints]),
+  fSize(6*npoints),
+  fCov(new Float_t[fSize]),
+  fVolumeID(new UShort_t[npoints])
 {
   // Constructor
   //
-  fSize = 6*npoints;
-  fX = new Float_t[npoints];
-  fY = new Float_t[npoints];
-  fZ = new Float_t[npoints];
-  fVolumeID = new UShort_t[npoints];
-  fCov = new Float_t[fSize];
 }
 
 //______________________________________________________________________________
 AliTrackPointArray::AliTrackPointArray(const AliTrackPointArray &array):
-  TObject(array)
+  TObject(array),
+  fNPoints(array.fNPoints),
+  fX(new Float_t[fNPoints]),
+  fY(new Float_t[fNPoints]),
+  fZ(new Float_t[fNPoints]),
+  fSize(array.fSize),
+  fCov(new Float_t[fSize]),
+  fVolumeID(new UShort_t[fNPoints])
 {
   // Copy constructor
   //
-  fNPoints = array.fNPoints;
-  fSize = array.fSize;
-  fX = new Float_t[fNPoints];
-  fY = new Float_t[fNPoints];
-  fZ = new Float_t[fNPoints];
-  fVolumeID = new UShort_t[fNPoints];
-  fCov = new Float_t[fSize];
   memcpy(fX,array.fX,fNPoints*sizeof(Float_t));
   memcpy(fY,array.fY,fNPoints*sizeof(Float_t));
   memcpy(fZ,array.fZ,fNPoints*sizeof(Float_t));
@@ -147,18 +155,26 @@ Bool_t AliTrackPointArray::HasVolumeID(UShort_t volid) const
 ClassImp(AliTrackPoint)
 
 //______________________________________________________________________________
-AliTrackPoint::AliTrackPoint()
+AliTrackPoint::AliTrackPoint() :
+  TObject(),
+  fX(0),
+  fY(0),
+  fZ(0),
+  fVolumeID(0)
 {
   // Default constructor
   //
-  fX = fY = fZ = 0;
-  fVolumeID = 0;
   memset(fCov,0,6*sizeof(Float_t));
 }
 
 
 //______________________________________________________________________________
-AliTrackPoint::AliTrackPoint(Float_t x, Float_t y, Float_t z, const Float_t *cov, UShort_t volid)
+AliTrackPoint::AliTrackPoint(Float_t x, Float_t y, Float_t z, const Float_t *cov, UShort_t volid) :
+  TObject(),
+  fX(0),
+  fY(0),
+  fZ(0),
+  fVolumeID(0)
 {
   // Constructor
   //
@@ -167,7 +183,12 @@ AliTrackPoint::AliTrackPoint(Float_t x, Float_t y, Float_t z, const Float_t *cov
 }
 
 //______________________________________________________________________________
-AliTrackPoint::AliTrackPoint(const Float_t *xyz, const Float_t *cov, UShort_t volid)
+AliTrackPoint::AliTrackPoint(const Float_t *xyz, const Float_t *cov, UShort_t volid) :
+  TObject(),
+  fX(0),
+  fY(0),
+  fZ(0),
+  fVolumeID(0)
 {
   // Constructor
   //
@@ -177,7 +198,11 @@ AliTrackPoint::AliTrackPoint(const Float_t *xyz, const Float_t *cov, UShort_t vo
 
 //______________________________________________________________________________
 AliTrackPoint::AliTrackPoint(const AliTrackPoint &p):
-  TObject(p)
+  TObject(p),
+  fX(0),
+  fY(0),
+  fZ(0),
+  fVolumeID(0)
 {
   // Copy constructor
   //
@@ -228,3 +253,135 @@ void AliTrackPoint::GetXYZ(Float_t *xyz, Float_t *cov) const
   if (cov)
     memcpy(cov,fCov,6*sizeof(Float_t));
 }
+
+//______________________________________________________________________________
+Float_t AliTrackPoint::GetResidual(const AliTrackPoint &p, Bool_t weighted) const
+{
+  // This method calculates the track to space-point residuals. The track
+  // interpolation is also stored as AliTrackPoint. Using the option
+  // 'weighted' one can calculate the residual either with or without
+  // taking into account the covariance matrix of the space-point and
+  // track interpolation. The second case the residual becomes a pull.
+
+  Float_t res = 0;
+
+  if (!weighted) {
+    Float_t xyz[3],xyzp[3];
+    GetXYZ(xyz);
+    p.GetXYZ(xyzp);
+    res = (xyz[0]-xyzp[0])*(xyz[0]-xyzp[0])+
+          (xyz[1]-xyzp[1])*(xyz[1]-xyzp[1])+
+          (xyz[2]-xyzp[2])*(xyz[2]-xyzp[2]);
+  }
+  else {
+    Float_t xyz[3],xyzp[3];
+    Float_t cov[6],covp[6];
+    GetXYZ(xyz,cov);
+    TMatrixDSym mcov(3);
+    mcov(0,0) = cov[0]; mcov(0,1) = cov[1]; mcov(0,2) = cov[2];
+    mcov(1,0) = cov[1]; mcov(1,1) = cov[3]; mcov(1,2) = cov[4];
+    mcov(2,0) = cov[2]; mcov(2,1) = cov[4]; mcov(2,2) = cov[5];
+    p.GetXYZ(xyzp,covp);
+    TMatrixDSym mcovp(3);
+    mcovp(0,0) = covp[0]; mcovp(0,1) = covp[1]; mcovp(0,2) = covp[2];
+    mcovp(1,0) = covp[1]; mcovp(1,1) = covp[3]; mcovp(1,2) = covp[4];
+    mcovp(2,0) = covp[2]; mcovp(2,1) = covp[4]; mcovp(2,2) = covp[5];
+    TMatrixDSym msum = mcov + mcovp;
+    msum.Invert();
+    //    mcov.Print(); mcovp.Print(); msum.Print();
+    if (msum.IsValid()) {
+      for (Int_t i = 0; i < 3; i++)
+       for (Int_t j = 0; j < 3; j++)
+         res += (xyz[i]-xyzp[i])*(xyz[j]-xyzp[j])*msum(i,j);
+    }
+  }
+
+  return res;
+}
+
+//______________________________________________________________________________
+Float_t AliTrackPoint::GetAngle() const
+{
+  // The method uses the covariance matrix of
+  // the space-point in order to extract the
+  // orientation of the detector plane.
+  // The rotation in XY plane only is calculated.
+
+  Float_t phi= TMath::ATan2(TMath::Sqrt(fCov[0]),TMath::Sqrt(fCov[3]));
+  if (fCov[1] > 0) {
+    phi = TMath::Pi() - phi;
+    if ((fY-fX) < 0) phi += TMath::Pi();
+  }
+  else {
+    if ((fX+fY) < 0) phi += TMath::Pi();
+  }
+
+  return phi;
+
+}
+
+//_____________________________________________________________________________
+AliTrackPoint& AliTrackPoint::Rotate(Float_t alpha) const
+{
+  // Transform the space-point coordinates
+  // and covariance matrix from global to
+  // local (detector plane) coordinate system
+  // XY plane rotation only
+
+  static AliTrackPoint p;
+  p = *this;
+
+  Float_t xyz[3],cov[6];
+  GetXYZ(xyz,cov);
+
+  Float_t sin = TMath::Sin(alpha), cos = TMath::Cos(alpha);
+
+  Float_t newxyz[3],newcov[6];
+  newxyz[0] = cos*xyz[0] + sin*xyz[1];
+  newxyz[1] = cos*xyz[1] - sin*xyz[0];
+  newxyz[2] = xyz[2];
+
+  newcov[0] = cov[0]*cos*cos+
+            2*cov[1]*sin*cos+
+              cov[3]*sin*sin;
+  newcov[1] = cov[1]*(cos*cos-sin*sin)+
+             (cov[3]-cov[0])*sin*cos;
+  newcov[2] = cov[2]*cos+
+              cov[4]*sin;
+  newcov[3] = cov[0]*sin*sin-
+            2*cov[1]*sin*cos+
+              cov[3]*cos*cos;
+  newcov[4] = cov[4]*cos-
+              cov[2]*sin;
+  newcov[5] = cov[5];
+
+  p.SetXYZ(newxyz,newcov);
+  p.SetVolumeID(GetVolumeID());
+
+  return p;
+}
+
+//_____________________________________________________________________________
+AliTrackPoint& AliTrackPoint::MasterToLocal() const
+{
+  // Transform the space-point coordinates
+  // and the covariance matrix from the
+  // (master) to the local (tracking)
+  // coordinate system
+
+  Float_t alpha = GetAngle();
+  return Rotate(alpha);
+}
+
+//_____________________________________________________________________________
+void AliTrackPoint::Print(Option_t *) const
+{
+  // Print the space-point coordinates and
+  // covariance matrix
+
+  printf("VolumeID=%d\n", GetVolumeID());
+  printf("X = %12.6f    Tx = %12.6f%12.6f%12.6f\n", fX, fCov[0], fCov[1], fCov[2]);
+  printf("Y = %12.6f    Ty = %12.6f%12.6f%12.6f\n", fY, fCov[1], fCov[3], fCov[4]);
+  printf("Z = %12.6f    Tz = %12.6f%12.6f%12.6f\n", fZ, fCov[2], fCov[4], fCov[5]);
+
+}