- bug fix in tracklet fit due to moving away from TLinearFitter
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 18 Nov 2009 09:23:41 +0000 (09:23 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 18 Nov 2009 09:23:41 +0000 (09:23 +0000)
- bug fix in cluster error usage
- added various protections in tracklet fitting procedure

TRD/AliTRDseedV1.cxx
TRD/AliTRDseedV1.h
TRD/AliTRDtrackerV1.cxx
TRD/AliTRDtrackerV1.h
TRD/TRDrecLinkDef.h

index c7f0eef..390abd0 100644 (file)
@@ -837,6 +837,9 @@ void AliTRDseedV1::Calibrate()
   fExB   = AliTRDCommonParam::Instance()->GetOmegaTau(fVD);
   AliTRDCommonParam::Instance()->GetDiffCoeff(fDiffL,
   fDiffT, fVD);
+  AliDebug(4, Form("Calibration params for Det[%3d] Col[%3d] Row[%2d]\n  t0[%f]  vd[%f]  s2PRF[%f]  ExB[%f]  Dl[%f]  Dt[%f]", fDet, col, row, fT0, fVD, fS2PRF, fExB, fDiffL, fDiffT));
+
+
   SetBit(kCalib, kTRUE);
 }
 
@@ -1351,7 +1354,7 @@ Bool_t AliTRDseedV1::Fit(Bool_t tilt, Bool_t zcorr)
     //optional tilt correction
     if(tilt) yc[n] -= (GetTilt()*(zc[n] - zt)); 
 
-    fitterY.AddPoint(&xc[n], yc[n], TMath::Sqrt(sy[n]));
+    fitterY.AddPoint(&xc[n], yc[n], sy[n]);
     if(IsRowCross()) fitterZ.AddPoint(&xc[n], qc[n], 1.);
     n++;
   }
@@ -1360,18 +1363,27 @@ Bool_t AliTRDseedV1::Fit(Bool_t tilt, Bool_t zcorr)
   if (n < kClmin) return kFALSE; 
 
   // fit XY
-  fitterY.Eval();
+  if(!fitterY.Eval()){
+    SetErrorMsg(kFitFailed);
+    return kFALSE;
+  }
   fYfit[0] = fitterY.GetFunctionParameter(0);
   fYfit[1] = -fitterY.GetFunctionParameter(1);
   // store covariance
   Double_t p[3];
   fitterY.GetCovarianceMatrix(p);
-  fCov[0] = p[0]; // variance of y0
+  fCov[0] = p[1]; // variance of y0
   fCov[1] = p[2]; // covariance of y0, dydx
-  fCov[2] = p[1]; // variance of dydx
+  fCov[2] = p[0]; // variance of dydx
   // the ref radial position is set at the minimum of 
   // the y variance of the tracklet
   fX   = -fCov[1]/fCov[2];
+  Float_t xs=fX+.5*AliTRDgeometry::CamHght();
+  if(xs < 0. || xs > AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght()){
+    AliDebug(1, Form("Ref radial position ouside chamber x[%5.2f].", fX));
+    SetErrorMsg(kFitOutside);
+    return kFALSE;
+  }
 
   // collect second row clusters
   Int_t m(0);
index 2fd5fe7..8b00eae 100644 (file)
@@ -75,6 +75,8 @@ public:
    ,kAttachRow          // found 3 rows
    ,kAttachMultipleCl   // multiple clusters attached to time bin
    ,kAttachClAttach     // not enough clusters attached
+   ,kFitFailed          // fit failed det=0
+   ,kFitOutside         // ref radial position outside chamber - wrong covariance
   };
 
   AliTRDseedV1(Int_t det = -1);
index 30922d7..6a9f5eb 100644 (file)
@@ -58,6 +58,8 @@
 #include "AliTRDchamberTimeBin.h"
 
 ClassImp(AliTRDtrackerV1)
+ClassImp(AliTRDtrackerV1::AliTRDLeastSquare)
+ClassImp(AliTRDtrackerV1::AliTRDtrackFitterRieman)
 
 const  Float_t  AliTRDtrackerV1::fgkMinClustersInTrack =  0.5;  //
 const  Float_t  AliTRDtrackerV1::fgkLabelFraction      =  0.8;  //
@@ -3671,9 +3673,26 @@ Double_t AliTRDtrackerV1::FitTiltedRiemanV1(AliTRDseedV1 *const tracklets){
 
 //_____________________________________________________________________________
 AliTRDtrackerV1::AliTRDLeastSquare::AliTRDLeastSquare(){
-  //
-  // Constructor of the nested class AliTRDtrackFitterLeastSquare
-  //
+//
+// Constructor of the nested class AliTRDtrackFitterLeastSquare
+//
+// Fast solving linear regresion in 2D
+//         y=ax+b
+// The data members have the following meaning
+// fParams[0] : b
+// fParams[1] : a
+// 
+// fSums[0] : S
+// fSums[1] : Sx
+// fSums[2] : Sy
+// fSums[3] : Sxy
+// fSums[4] : Sxx
+// fSums[5] : Syy
+// 
+// fCovarianceMatrix[0] : s2b
+// fCovarianceMatrix[1] : s2a
+// fCovarianceMatrix[2] : cov(ab)
+
   memset(fParams, 0, sizeof(Double_t) * 2);
   memset(fSums, 0, sizeof(Double_t) * 6);
   memset(fCovarianceMatrix, 0, sizeof(Double_t) * 3);
@@ -3716,27 +3735,28 @@ void AliTRDtrackerV1::AliTRDLeastSquare::RemovePoint(const Double_t *const x, Do
 }
 
 //_____________________________________________________________________________
-void AliTRDtrackerV1::AliTRDLeastSquare::Eval(){
+Bool_t AliTRDtrackerV1::AliTRDLeastSquare::Eval(){
   //
   // Evaluation of the fit:
   // Calculation of the parameters
   // Calculation of the covariance matrix
   //
   
-  Double_t denominator = fSums[0] * fSums[4] - fSums[1] *fSums[1];
-  if(denominator==0) return;
+  Double_t det = fSums[0] * fSums[4] - fSums[1] *fSums[1];
+  if(det==0) return kFALSE;
 
   //   for(Int_t isum = 0; isum < 5; isum++)
   //           printf("fSums[%d] = %f\n", isum, fSums[isum]);
   //   printf("denominator = %f\n", denominator);
-  fParams[0] = (fSums[2] * fSums[4] - fSums[1] * fSums[3])/ denominator;
-  fParams[1] = (fSums[0] * fSums[3] - fSums[1] * fSums[2]) / denominator;
+  fParams[0] = (fSums[2] * fSums[4] - fSums[1] * fSums[3])/det;
+  fParams[1] = (fSums[0] * fSums[3] - fSums[1] * fSums[2])/det;
   //   printf("fParams[0] = %f, fParams[1] = %f\n", fParams[0], fParams[1]);
   
   // Covariance matrix
   fCovarianceMatrix[0] = fSums[4] / fSums[0] - fSums[1] * fSums[1] / (fSums[0] * fSums[0]);
   fCovarianceMatrix[1] = fSums[5] / fSums[0] - fSums[2] * fSums[2] / (fSums[0] * fSums[0]);
   fCovarianceMatrix[2] = fSums[3] / fSums[0] - fSums[1] * fSums[2] / (fSums[0] * fSums[0]);
+  return kTRUE;
 }
 
 //_____________________________________________________________________________
index a1b0686..597c114 100644 (file)
@@ -119,20 +119,20 @@ public:
     AliTRDLeastSquare();
     ~AliTRDLeastSquare(){};
     
-    void               AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY);
-    void               RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY);
-    void               Eval();
-    void    Reset();
+    void          AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY);
+    void          RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY);
+    Bool_t        Eval();
+    void          Reset();
     
-    Double_t   GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];}
-    Double_t   GetFunctionValue(const Double_t * const xpos) const;
-    void               GetCovarianceMatrix(Double_t *storage) const;
+    Double_t      GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];}
+    Double_t      GetFunctionValue(const Double_t * const xpos) const;
+    void          GetCovarianceMatrix(Double_t *storage) const;
   private:
     AliTRDLeastSquare(const AliTRDLeastSquare &);
     AliTRDLeastSquare& operator=(const AliTRDLeastSquare &);
-    Double_t   fParams[2];                                             // Fitparameter 
-    Double_t   fCovarianceMatrix[3];                   // Covariance Matrix
-    Double_t   fSums[6];                                               // Sums
+    Double_t      fParams[2];           // Fitparameter        
+    Double_t      fCovarianceMatrix[3]; // Covariance Matrix
+    Double_t      fSums[6];             // Sums
   };
 
   class AliTRDtrackFitterRieman{
index 78b71ae..e77fef5 100644 (file)
@@ -26,6 +26,8 @@
 #pragma link C++ class  AliTRDseedV1+;
 #pragma link C++ class  AliTRDtrackV1+;
 #pragma link C++ class  AliTRDtrackerV1+;
+#pragma link C++ class  AliTRDtrackerV1::AliTRDLeastSquare+;
+#pragma link C++ class  AliTRDtrackerV1::AliTRDtrackFitterRieman+;
 #pragma link C++ class  AliTRDtrackerDebug+;
 #pragma link C++ class  AliTRDtrackingSector+;
 #pragma link C++ class  AliTRDtrackingChamber+;