]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliTrackFitterRieman.cxx
Bug corrected.
[u/mrichter/AliRoot.git] / STEER / AliTrackFitterRieman.cxx
index 7a9a3c52f33c8a1a1f7ce95b391343aa79759caa..3406252e1b7d728718ff3badbd03dc1d7a641208 100644 (file)
 //
 //////////////////////////////////////////////////////////////////////////////
 
-#include "TMatrixDSym.h"
-#include "TMatrixD.h"
-#include "TArrayI.h"
-#include "TLinearFitter.h"
-#include "AliTrackFitterRieman.h"
+#include <TArrayI.h>
+#include <TLinearFitter.h>
+#include <TMath.h>
+#include <TMatrixD.h>
+#include <TMatrixDSym.h>
+#include <TRandom.h>
+#include <TTreeStream.h>
+
 #include "AliLog.h"
-#include "TTreeStream.h"
-#include "AliRieman.h"
 #include "AliLog.h"
-#include "TRandom.h"
+#include "AliRieman.h"
+#include "AliTrackFitterRieman.h"
 
 ClassImp(AliTrackFitterRieman)
 
@@ -51,6 +53,8 @@ AliTrackFitterRieman::AliTrackFitterRieman():
   fConv(kFALSE),
   fMaxDelta(3),
   fRieman(new AliRieman(10000)),  // allocate rieman
+  fMinPointRadius(2.),
+  fMaxPointRadius(500.),
   fDebugStream(new TTreeSRedirector("RiemanAlignDebug.root"))
 {
   //
@@ -67,6 +71,8 @@ AliTrackFitterRieman::AliTrackFitterRieman(AliTrackPointArray *array, Bool_t own
   fConv(kFALSE),
   fMaxDelta(3),
   fRieman(new AliRieman(10000)),  //allocate rieman
+  fMinPointRadius(2.),
+  fMaxPointRadius(500.),
   fDebugStream(0)
 {
   //
@@ -83,6 +89,8 @@ AliTrackFitterRieman::AliTrackFitterRieman(const AliTrackFitterRieman &rieman):
   fConv(rieman.fConv),
   fMaxDelta(rieman.fMaxDelta),
   fRieman(new AliRieman(*(rieman.fRieman))),
+  fMinPointRadius(rieman.fMinPointRadius),
+  fMaxPointRadius(rieman.fMaxPointRadius),
   fDebugStream(0)
 {
   //
@@ -106,6 +114,8 @@ AliTrackFitterRieman &AliTrackFitterRieman::operator =(const AliTrackFitterRiema
   fConv   = rieman.fConv;
   fMaxDelta = rieman.fMaxDelta;
   fRieman = new AliRieman(*(rieman.fRieman));
+  fMinPointRadius = rieman.fMinPointRadius;
+  fMaxPointRadius = rieman.fMaxPointRadius;
   fDebugStream = 0;
   if (AliLog::GetDebugLevel("","AliTrackFitterRieman")) fDebugStream = new TTreeSRedirector("RiemanAlignDebug.root");
   return *this;
@@ -133,8 +143,8 @@ void AliTrackFitterRieman::Reset()
 }
 
 Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
-                                AliAlignObj::ELayerID layerRangeMin,
-                        AliAlignObj::ELayerID layerRangeMax)
+                                AliGeomManager::ELayerID layerRangeMin,
+                        AliGeomManager::ELayerID layerRangeMax)
 {
   // Fit the track points. The method takes as an input
   // the set of id's (volids) of the volumes in which
@@ -153,29 +163,28 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
   // found using the covariance matrix of the point
   // (assuming sigma(x)=0 at the reference coordinate system.
   Int_t debugLevel = AliLog::GetDebugLevel("","AliTrackFitterRieman");
-  Float_t debugRatio = 1./(1.+debugLevel);
+  
+  //  Float_t debugRatio = 1./(1.+debugLevel);
+  Float_t debugRatio = debugLevel? 1.0/debugLevel : 1.0;
 
-  const Int_t kMinPoints =1;
   Int_t npoints = fPoints->GetNPoints();
   if ( npoints<fMinNPoints) return kFALSE;
   //
   // fast count points
-  Int_t countFit = 0;  
-  for (Int_t ifit=0; ifit<volIdsFit->GetSize(); ifit++){
-    Int_t volIdFit  = volIdsFit->At(ifit);
-    for (Int_t ipoint = 0; ipoint < npoints; ipoint++)
-      if (volIdFit==fPoints->GetVolumeID()[ipoint]) countFit++;    
-  }
-  if (countFit<fMinNPoints) return kFALSE;
-  //
-  Int_t countPoint = 0;  
-  for (Int_t jpoint=0; jpoint<volIds->GetSize(); jpoint++){
-    Int_t volIdPoint  = volIds->At(jpoint);
-    for (Int_t ipoint = 0; ipoint < npoints; ipoint++)
-      if (volIdPoint==fPoints->GetVolumeID()[ipoint]) countPoint++;    
+  if (volIdsFit != 0x0) {
+    Int_t countFit = 0;
+    Int_t countPoint = 0;
+    for (Int_t ipoint = 0; ipoint < npoints; ipoint++) {
+      if (FindVolId(volIds,fPoints->GetVolumeID()[ipoint]))
+       countPoint++;
+      if (volIdsFit != 0x0) {
+       if (FindVolId(volIdsFit,fPoints->GetVolumeID()[ipoint]))
+         countFit++;
+      }
+    }
+    if (countPoint==0) return kFALSE;
+    if ((countFit<fMinNPoints) && (volIdsFit != 0x0)) return kFALSE;
   }
-  if (countPoint<kMinPoints) return kFALSE;
-  //
   //
 
   Reset();
@@ -213,16 +222,16 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
        if (!FindVolId(volIdsFit,iVolId)) continue;
       }
       else {
-       if (iVolId < AliAlignObj::LayerToVolUID(layerRangeMin,0) ||
-           iVolId > AliAlignObj::LayerToVolUID(layerRangeMax,
-                                               AliAlignObj::LayerSize(layerRangeMax))) continue;
+       if (iVolId < AliGeomManager::LayerToVolUID(layerRangeMin,0) ||
+           iVolId > AliGeomManager::LayerToVolUID(layerRangeMax,
+                                               AliGeomManager::LayerSize(layerRangeMax))) continue;
       }
       if (!isAlphaCalc) {
        fAlpha = p.GetAngle();
        isAlphaCalc = kTRUE;
       }
       plocal = p.Rotate(fAlpha);
-      if (TMath::Abs(plocal.GetX())>500 || TMath::Abs(plocal.GetX())<2 || plocal.GetCov()[3]<=0 ||plocal.GetCov()[5]<=0 ){
+      if (TMath::Abs(plocal.GetX())>fMaxPointRadius || TMath::Abs(plocal.GetX())<fMinPointRadius || plocal.GetCov()[3]<=0 ||plocal.GetCov()[5]<=0 ){
        printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</n");
        p.Dump();
        plocal.Dump();
@@ -304,7 +313,7 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
       fPTrack->GetPoint(pFit,ipoint);
       pFitlocal= pFit.Rotate(lAngle);
       //
-      Float_t xyz[3], cov[3];
+      Float_t xyz[3], cov[6];
       xyz[0] = pFitlocal.GetX();
       xyz[1] = pFitlocal.GetY();
       xyz[2] = pFitlocal.GetZ();
@@ -324,10 +333,10 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
     Int_t nVolFit = volIdsFit->GetSize();
     Int_t volId   = volIds->At(0);   
     Int_t modId   =0;
-    Int_t layer   =  AliAlignObj::VolUIDToLayer(volId,modId);
+    Int_t layer   =  AliGeomManager::VolUIDToLayer(volId,modId);
     Int_t volIdFit   = volIdsFit->At(0);   
     Int_t modIdFit   =0;
-    Int_t layerFit   =  AliAlignObj::VolUIDToLayer(volIdFit,modIdFit);
+    Int_t layerFit   =  AliGeomManager::VolUIDToLayer(volIdFit,modIdFit);
     
     (*fDebugStream)<<"Fit"<<
       "VolId="<<volId<<        // volume ID
@@ -366,7 +375,7 @@ void AliTrackFitterRieman::AddPoint(Float_t x, Float_t y, Float_t z, Float_t sy,
 
 
 
-void AliTrackFitterRieman::Update(){
+Bool_t AliTrackFitterRieman::Update(){
   //
   // 
   //
@@ -399,6 +408,8 @@ void AliTrackFitterRieman::Update(){
   }
   fCorrY[3]=fitY.GetChisquare()/Float_t(fRieman->GetN()-3);   
   fCorrZ[3]=fitZ.GetChisquare()/Float_t(fRieman->GetN()-3);
+
+  return kTRUE;
 }
 
 
@@ -488,9 +499,17 @@ Bool_t AliTrackFitterRieman::GetPCA(const AliTrackPoint &p, AliTrackPoint &p2) c
   if (AliLog::GetDebugLevel("","AliTrackFitterRieman")>0 && gRandom->Rndm()<debugRatio){
     AliTrackPoint lp0(p);
     AliTrackPoint lp2(p2);
+    AliTrackPoint localp0(p);
+    AliTrackPoint localp2(p2);
+    Float_t lAngle = lp0.GetAngle();
+    localp0 = localp0.Rotate(lAngle);
+    localp2 = localp2.Rotate(lAngle);
+
     (*fDebugStream)<<"PCA"<<
-      "P0.="<<&lp0<<
+      "P0.="<<&lp0<<  //global position
       "P2.="<<&lp2<<
+      "LP0.="<<&localp0<<  //local position
+      "LP2.="<<&localp2<<
       "\n";
   }
   return kTRUE;
@@ -546,3 +565,8 @@ Double_t AliTrackFitterRieman::GetErrZ2at(Double_t x) const {
   return TMath::Sqrt(error+correction);
 }
 
+void AliTrackFitterRieman::SetParam(Int_t i, Double_t par) {
+  if (i<0 || i>5) return;
+  fParams[i]=par;
+  fRieman->GetParam()[i]=par;
+}