]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtracker.cxx
AliDCSClient "multiSplit" option added in the DCS configuration
[u/mrichter/AliRoot.git] / TRD / AliTRDtracker.cxx
index 519635323a2a08fdcec7535a36062387809226d8..afb17b3513f3ae44ee92ab07d9bec9e140bddab5 100644 (file)
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+
 #include <Riostream.h>
-#include <TFile.h>
 #include <TBranch.h>
-#include <TTree.h>  
-#include <TObjArray.h> 
-#include <TTreeStream.h>
+#include <TFile.h>
 #include <TGraph.h>
+#include <TH1D.h>
+#include <TH2D.h>
 #include <TLinearFitter.h>
+#include <TObjArray.h> 
+#include <TROOT.h>
+#include <TTree.h>  
+#include <TTreeStream.h>
 
-#include "AliESD.h"
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
 #include "AliAlignObj.h"
 #include "AliRieman.h"
 #include "AliTrackPointArray.h"
 #include "AliTRDCommonParam.h"
 #include "AliTRDtracker.h"
 #include "AliTRDReconstructor.h"
-#include "AliTRDCalibra.h"
+#include "AliTRDCalibraFillHisto.h"
 
-ClassImp(AliTRDtracker) 
+ClassImp(AliTRDtracker)
 
-  const  Float_t  AliTRDtracker::fgkMinClustersInTrack =  0.5;  
-  const  Float_t  AliTRDtracker::fgkLabelFraction      =  0.8;  
-  const  Double_t AliTRDtracker::fgkMaxChi2            = 12.0; 
-  const  Double_t AliTRDtracker::fgkMaxSnp             =  0.95; // Corresponds to tan = 3
-  const  Double_t AliTRDtracker::fgkMaxStep            =  2.0;  // Maximal step size in propagation 
+const  Float_t  AliTRDtracker::fgkMinClustersInTrack =  0.5;  //
+const  Float_t  AliTRDtracker::fgkLabelFraction      =  0.8;  //
+const  Double_t AliTRDtracker::fgkMaxChi2            = 12.0;  //
+const  Double_t AliTRDtracker::fgkMaxSnp             =  0.95; // Corresponds to tan = 3
+const  Double_t AliTRDtracker::fgkMaxStep            =  2.0;  // Maximal step size in propagation 
 
 //_____________________________________________________________________________
 AliTRDtracker::AliTRDtracker()
   :AliTracker()
+  ,fHBackfit(0x0)
+  ,fHClSearch(0x0)
+  ,fHRefit(0x0)
+  ,fHX(0x0)
+  ,fHNCl(0x0)
+  ,fHNClTrack(0x0)
+  ,fHMinYPos(0x0)
+  ,fHMinYNeg(0x0)
+  ,fHMinZ(0x0)
+  ,fHMinD(0x0)
+  ,fHDeltaX(0x0)
+  ,fHXCl(0x0)
   ,fGeom(0)
   ,fNclusters(0)
   ,fClusters(0)
@@ -88,11 +105,25 @@ AliTRDtracker::AliTRDtracker()
     }
   }
 
+  InitLogHists();
+
 } 
 
 //_____________________________________________________________________________
 AliTRDtracker::AliTRDtracker(const AliTRDtracker &t)
   :AliTracker(t)
+  ,fHBackfit(0x0)
+  ,fHClSearch(0x0)
+  ,fHRefit(0x0)
+  ,fHX(0x0)
+  ,fHNCl(0x0)
+  ,fHNClTrack(0x0)
+  ,fHMinYPos(0x0)
+  ,fHMinYNeg(0x0)
+  ,fHMinZ(0x0)
+  ,fHMinD(0x0)
+  ,fHDeltaX(0x0)
+  ,fHXCl(0x0)
   ,fGeom(0)
   ,fNclusters(0)
   ,fClusters(0)
@@ -108,11 +139,24 @@ AliTRDtracker::AliTRDtracker(const AliTRDtracker &t)
   //
   // Copy constructor
   //
+
 }
 
 //_____________________________________________________________________________
-AliTRDtracker::AliTRDtracker(const TFile *geomfile)
+AliTRDtracker::AliTRDtracker(const TFile */*geomfile*/)
   :AliTracker()
+  ,fHBackfit(0x0)
+  ,fHClSearch(0x0)
+  ,fHRefit(0x0)
+  ,fHX(0x0)
+  ,fHNCl(0x0)
+  ,fHNClTrack(0x0)
+  ,fHMinYPos(0x0)
+  ,fHMinYNeg(0x0)
+  ,fHMinZ(0x0)
+  ,fHMinD(0x0)
+  ,fHDeltaX(0x0)
+  ,fHXCl(0x0)
   ,fGeom(0)
   ,fNclusters(0)
   ,fClusters(new TObjArray(2000))
@@ -130,44 +174,34 @@ AliTRDtracker::AliTRDtracker(const TFile *geomfile)
   //  
    
   TDirectory *savedir = gDirectory; 
-  TFile      *in      = (TFile *) geomfile; 
-  if (!in->IsOpen()) {
-    AliWarning("geometry file is not open!\n");
-    AliWarning("FULL TRD geometry and DEFAULT TRD parameter will be used\n");
-  }
-  else {
-    in->cd();  
-    fGeom = (AliTRDgeometry *) in->Get("TRDgeometry");
-  }
-
-  if (!fGeom) {
-    AliWarning("Cannot find TRD geometry!\n");
-    fGeom = new AliTRDgeometry();
-  } 
-  fGeom->ReadGeoMatrices();
 
-  savedir->cd();  
+  fGeom = new AliTRDgeometry();
 
   for (Int_t geomS = 0; geomS < kTrackingSectors; geomS++) {
-    Int_t trS   = CookSectorIndex(geomS);
+    Int_t trS   = geomS;
     fTrSec[trS] = new AliTRDtrackingSector(fGeom,geomS);
     for (Int_t icham = 0; icham < AliTRDgeometry::kNcham; icham++) {
+      // Could also go ...
       fHoles[icham][trS] = fGeom->IsHole(0,icham,geomS);
     }
   }
 
-  AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(0,0);
+  AliTRDpadPlane *padPlane = fGeom->GetPadPlane(0,0);
   Float_t tiltAngle = TMath::Abs(padPlane->GetTiltingAngle());
   if (tiltAngle < 0.1) {
     fNoTilt = kTRUE;
   }
 
-  fTimeBinsPerPlane =  AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
+  if (!AliTRDcalibDB::Instance()) {
+    AliFatal("Could not get calibration object");
+  }
+  fTimeBinsPerPlane = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
 
   fDebugStreamer    = new TTreeSRedirector("TRDdebug.root");
 
   savedir->cd();
+  
+  InitLogHists();
 
 }   
 
@@ -193,7 +227,9 @@ AliTRDtracker::~AliTRDtracker()
     delete fSeeds;
   }
 
-  delete fGeom;  
+  if (fGeom) {
+    delete fGeom;  
+  }
 
   for (Int_t geomS = 0; geomS < kTrackingSectors; geomS++) {
     delete fTrSec[geomS];
@@ -216,30 +252,30 @@ Int_t  AliTRDtracker::LocalToGlobalID(Int_t lid)
   Int_t  ichamber = fGeom->GetChamber(lid);
   Int_t  iplan    = fGeom->GetPlane(lid);
 
-  AliAlignObj::ELayerID iLayer = AliAlignObj::kTRD1;
+  AliGeomManager::ELayerID iLayer = AliGeomManager::kTRD1;
   switch (iplan) {
   case 0:
-    iLayer = AliAlignObj::kTRD1;
+    iLayer = AliGeomManager::kTRD1;
     break;
   case 1:
-    iLayer = AliAlignObj::kTRD2;
+    iLayer = AliGeomManager::kTRD2;
     break;
   case 2:
-    iLayer = AliAlignObj::kTRD3;
+    iLayer = AliGeomManager::kTRD3;
     break;
   case 3:
-    iLayer = AliAlignObj::kTRD4;
+    iLayer = AliGeomManager::kTRD4;
     break;
   case 4:
-    iLayer = AliAlignObj::kTRD5;
+    iLayer = AliGeomManager::kTRD5;
     break;
   case 5:
-    iLayer = AliAlignObj::kTRD6;
+    iLayer = AliGeomManager::kTRD6;
     break;
   };
 
   Int_t    modId = isector * fGeom->Ncham() + ichamber;
-  UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,modId);
+  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,modId);
 
   return volid;
 
@@ -253,29 +289,29 @@ Int_t  AliTRDtracker::GlobalToLocalID(Int_t gid)
   // 
 
   Int_t modId    = 0;
-  AliAlignObj::ELayerID layerId = AliAlignObj::VolUIDToLayer(gid,modId);
+  AliGeomManager::ELayerID layerId = AliGeomManager::VolUIDToLayer(gid,modId);
 
   Int_t isector  = modId / fGeom->Ncham();
   Int_t ichamber = modId % fGeom->Ncham();
   Int_t iLayer   = -1;
 
   switch (layerId) {
-  case AliAlignObj::kTRD1:
+  case AliGeomManager::kTRD1:
     iLayer = 0;
     break;
-  case AliAlignObj::kTRD2:
+  case AliGeomManager::kTRD2:
     iLayer = 1;
     break;
-  case AliAlignObj::kTRD3:
+  case AliGeomManager::kTRD3:
     iLayer = 2;
     break;
-  case AliAlignObj::kTRD4:
+  case AliGeomManager::kTRD4:
     iLayer = 3;
     break;
-  case AliAlignObj::kTRD5:
+  case AliGeomManager::kTRD5:
     iLayer = 4;
     break;
-  case AliAlignObj::kTRD6:
+  case AliGeomManager::kTRD6:
     iLayer = 5;
     break;
   default:
@@ -292,164 +328,6 @@ Int_t  AliTRDtracker::GlobalToLocalID(Int_t gid)
 
 }
 
-//_____________________________________________________________________________
-Bool_t  AliTRDtracker::Transform(AliTRDcluster *cluster)
-{
-  //
-  // Transform something ... whatever ...
-  //
-
-  // Magic constants for geo manager transformation
-  const Double_t kX0shift  = 2.52;
-  const Double_t kX0shift5 = 3.05;
-
-  //
-  // Apply alignment and calibration to transform cluster
-  //
-  Int_t detector = cluster->GetDetector();
-  Int_t plane    = fGeom->GetPlane(cluster->GetDetector());
-  Int_t chamber  = fGeom->GetChamber(cluster->GetDetector());
-  Int_t sector   = fGeom->GetSector(cluster->GetDetector());
-
-  Double_t dxAmp  = (Double_t) fGeom->CamHght();               // Amplification region
-  Double_t driftX = TMath::Max(cluster->GetX()-dxAmp*0.5,0.0); // Drift distance
-
-  //
-  // ExB correction
-  //
-  Double_t vdrift = AliTRDcalibDB::Instance()->GetVdrift(cluster->GetDetector(),0,0);
-  Double_t exB    = AliTRDcalibDB::Instance()->GetOmegaTau(vdrift);
-
-  AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();  
-  AliTRDpadPlane    *padPlane    = commonParam->GetPadPlane(plane,chamber);
-  Double_t zshiftIdeal = 0.5*(padPlane->GetRow0()+padPlane->GetRowEnd());
-  Double_t localPos[3];
-  Double_t localPosTracker[3];
-  localPos[0] = -cluster->GetX();
-  localPos[1] =  cluster->GetY() - driftX * exB;
-  localPos[2] =  cluster->GetZ() - zshiftIdeal;
-
-  cluster->SetY(cluster->GetY() - driftX*exB);
-  Double_t xplane = (Double_t) AliTRDgeometry::GetTime0(plane); 
-  cluster->SetX(xplane- cluster->GetX());
-
-  TGeoHMatrix *matrix =  fGeom->GetCorrectionMatrix(cluster->GetDetector());
-  if (!matrix) {
-    // No matrix found - if somebody used geometry with holes
-    AliError("Invalid Geometry - Default Geometry used\n");
-    return kTRUE;   
-  }
-  matrix->LocalToMaster(localPos,localPosTracker);  
-
-  if (AliTRDReconstructor::StreamLevel() > 1) {
-    (* fDebugStreamer) << "Transform"
-                       << "Cl.="      << cluster
-                       << "matrix.="  << matrix
-                       << "Detector=" << detector
-                       << "Sector="   << sector
-                       << "Plane="    << plane
-                       << "Chamber="  << chamber
-                       << "lx0="      << localPosTracker[0]
-                       << "ly0="      << localPosTracker[1]
-                       << "lz0="      << localPosTracker[2]
-                       << "\n";
-  }
-
-  if (plane == 5) {
-     cluster->SetX(localPosTracker[0]+kX0shift5);
-  }
-  else {
-    cluster->SetX(localPosTracker[0]+kX0shift);
-  }    
-
-  cluster->SetY(localPosTracker[1]);
-  cluster->SetZ(localPosTracker[2]);
-
-  return kTRUE;
-
-}
-
-//_____________________________________________________________________________
-// Bool_t  AliTRDtracker::Transform(AliTRDcluster *cluster)
-//{
-//   //
-//   // Is this still needed ????
-//   //
-//   const Double_t kDriftCorrection  = 1.01;                 // drift coeficient correction
-//   const Double_t kTime0Cor         = 0.32;                 // time0 correction
-//   //
-//   const Double_t kX0shift           = 2.52; 
-//   const Double_t kX0shift5          = 3.05; 
-
-//   //
-//   // apply alignment and calibration to transform cluster
-//   //
-//   //
-//   Int_t detector = cluster->GetDetector();
-//   Int_t plane   = fGeom->GetPlane(cluster->GetDetector());
-//   Int_t chamber = fGeom->GetChamber(cluster->GetDetector());
-//   Int_t sector  = fGeom->GetSector(cluster->GetDetector());
-
-//   Double_t dxAmp  = (Double_t) fGeom->CamHght();          // Amplification region
-//   Double_t driftX = TMath::Max(cluster->GetX()-dxAmp*0.5,0.);  // drift distance
-//   //
-//   // ExB correction
-//   //
-//   Double_t vdrift = AliTRDcalibDB::Instance()->GetVdrift(cluster->GetDetector(),0,0);
-//   Double_t exB =   AliTRDcalibDB::Instance()->GetOmegaTau(vdrift);
-//   //
-
-//   AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance();  
-//   AliTRDpadPlane * padPlane = commonParam->GetPadPlane(plane,chamber);
-//   Double_t zshiftIdeal  = 0.5*(padPlane->GetRow0()+padPlane->GetRowEnd());
-//   Double_t localPos[3], globalPos[3], localPosTracker[3], localPosTracker2[3];
-//   localPos[2] = -cluster->GetX();
-//   localPos[0] =  cluster->GetY() - driftX*exB;
-//   localPos[1] =  cluster->GetZ() -zshiftIdeal;
-//   TGeoHMatrix * matrix =  fGeom->GetGeoMatrix(cluster->GetDetector());
-//   matrix->LocalToMaster(localPos, globalPos);
-  
-//   Double_t sectorAngle = 20.*(sector%18)+10;
-//   TGeoHMatrix  rotSector;
-//   rotSector.RotateZ(sectorAngle);
-//   rotSector.LocalToMaster(globalPos, localPosTracker);
-//   //
-//   //
-//   TGeoHMatrix  matrix2(*matrix);
-//   matrix2.MultiplyLeft(&rotSector);
-//   matrix2.LocalToMaster(localPos,localPosTracker2);
-//   //
-//   //
-//   //
-//   cluster->SetY(cluster->GetY() - driftX*exB);
-//   Double_t xplane = (Double_t) AliTRDgeometry::GetTime0(plane); 
-//   cluster->SetX(xplane- kDriftCorrection*(cluster->GetX()-kTime0Cor));
-//   (*fDebugStreamer)<<"Transform"<<
-//     "Cl.="<<cluster<<
-//     "matrix.="<<matrix<<
-//     "matrix2.="<<&matrix2<<
-//     "Detector="<<detector<<
-//     "Sector="<<sector<<
-//     "Plane="<<plane<<
-//     "Chamber="<<chamber<<
-//     "lx0="<<localPosTracker[0]<<
-//     "ly0="<<localPosTracker[1]<<
-//     "lz0="<<localPosTracker[2]<<
-//     "lx2="<<localPosTracker2[0]<<
-//     "ly2="<<localPosTracker2[1]<<
-//     "lz2="<<localPosTracker2[2]<<
-//     "\n";
-//   //
-//   if (plane==5)
-//      cluster->SetX(localPosTracker[0]+kX0shift5);
-//   else
-//     cluster->SetX(localPosTracker[0]+kX0shift);
-    
-//   cluster->SetY(localPosTracker[1]);
-//   cluster->SetZ(localPosTracker[2]);
-//   return kTRUE;
-// }
-
 //_____________________________________________________________________________
 Bool_t AliTRDtracker::AdjustSector(AliTRDtrack *track) 
 {
@@ -542,7 +420,7 @@ Int_t  AliTRDtracker::GetLastPlane(AliTRDtrack *track)
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDtracker::Clusters2Tracks(AliESD *event)
+Int_t AliTRDtracker::Clusters2Tracks(AliESDEvent *event)
 {
   //
   // Finds tracks within the TRD. The ESD event is expected to contain seeds 
@@ -601,7 +479,7 @@ Int_t AliTRDtracker::Clusters2Tracks(AliESD *event)
 }     
      
 //_____________________________________________________________________________
-Int_t AliTRDtracker::PropagateBack(AliESD *event) 
+Int_t AliTRDtracker::PropagateBack(AliESDEvent *event) 
 {
   //
   // Gets seeds from ESD event. The seeds are AliTPCtrack's found and
@@ -612,7 +490,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
   // by the TPC tracker.   
   //  
 
-  Int_t   found    = 0;  
+  Int_t   found    = 0;     // number of tracks found
   Float_t foundMin = 20.0;
   Int_t   n        = event->GetNumberOfTracks();
 
@@ -624,6 +502,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
     Double_t covariance[15];
     seed->GetExternalCovariance(covariance);
     quality[i] = covariance[0]+covariance[2];      
+    //quality[i] = covariance[0];
   }
   TMath::Sort(n,quality,index,kFALSE);
 
@@ -631,12 +510,16 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
 
     //AliESDtrack *seed = event->GetTrack(i);
     AliESDtrack *seed = event->GetTrack(index[i]);
+    fHBackfit->Fill(0);
 
     ULong_t status = seed->GetStatus();
     if ((status & AliESDtrack::kTPCout) == 0) {
+      fHBackfit->Fill(1);
       continue;
     }
+
     if ((status & AliESDtrack::kTRDout) != 0) {
+      fHBackfit->Fill(2);
       continue;
     }
 
@@ -646,19 +529,44 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
     seed->UpdateTrackParams(track,AliESDtrack::kTRDbackup); // Make backup
     fNseeds++;
     Float_t p4  = track->GetC();
-
     Int_t expectedClr = FollowBackProlongation(*track);
-    if ((TMath::Abs(track->GetC() - p4) / TMath::Abs(p4) < 0.2) || 
-        (TMath::Abs(track->GetPt())                      > 0.8)) {
+    
+    fHBackfit->Fill(3);
+    fHX->Fill(track->GetX());
+
+
+    // store the last measurement
+    /*
+    fHNClTrack->Fill(track->GetNumberOfClusters());
+    if (track->GetNumberOfClusters() >= foundMin) {
+
+      fHBackfit->Fill(4);
+      track->CookdEdx(); 
+      CookdEdxTimBin(*track);
+      CookLabel(track,1 - fgkLabelFraction);
+      if (track->GetBackupTrack()) {
+       //fHBackfit->Fill(5);
+       UseClusters(track->GetBackupTrack());
+       seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup);
+      }
+    }
+    */
 
+    /**/
+    // inter-tracks competition ???
+    if ((TMath::Abs(track->GetC() - p4) / TMath::Abs(p4) < 0.2) || 
+        (track->Pt()                                     > 0.8)) {
+      
+      fHBackfit->Fill(4);
+      
       // 
       // Make backup for back propagation 
       //
-
+      
       Int_t foundClr = track->GetNumberOfClusters();
       if (foundClr >= foundMin) {
        track->CookdEdx(); 
-       CookdEdxTimBin(*track);
+       track->CookdEdxTimBin(seed->GetID()); // A.Bercuci 25.07.07
        CookLabel(track,1 - fgkLabelFraction);
        if (track->GetBackupTrack()) {
           UseClusters(track->GetBackupTrack());
@@ -666,8 +574,8 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
 
         // Sign only gold tracks
        if (track->GetChi2() / track->GetNumberOfClusters() < 4) {   
-         if ((seed->GetKinkIndex(0)      ==   0) &&
-              (TMath::Abs(track->GetPt()) <  1.5)) {
+         if ((seed->GetKinkIndex(0)      ==   0) &&
+              (track->Pt()                <  1.5)) {
             UseClusters(track);
          }
        }
@@ -678,8 +586,10 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
          //seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup);
          if (track->GetBackupTrack()) {
             seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup);
+           
          }
          isGold = kTRUE;
+         //fHBackfit->Fill()
        }
 
         // Almost gold track
@@ -695,30 +605,31 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
 
        if ((!isGold) && 
             (track->GetBackupTrack())) {
-         if ((track->GetBackupTrack()->GetNumberOfClusters()                                          > foundMin) &&
-             ((track->GetBackupTrack()->GetChi2()/(track->GetBackupTrack()->GetNumberOfClusters()+1)) <        7)) {     
+         if ((track->GetBackupTrack()->GetNumberOfClusters() > foundMin) &&
+             ((track->GetBackupTrack()->GetChi2()/(track->GetBackupTrack()->GetNumberOfClusters()+1)) < 7)) {    
            seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup);
            isGold = kTRUE;
          }
        }
 
-       if ((track->StatusForTOF()                                                   >   0) &&
-            (track->GetNCross()                                                     ==   0) && 
+       if ((track->StatusForTOF() > 0) &&
+            (track->GetNCross() == 0) && 
             (Float_t(track->GetNumberOfClusters()) / Float_t(track->GetNExpected())  > 0.4)) {
          //seed->UpdateTrackParams(track->GetBackupTrack(), AliESDtrack::kTRDbackup);
        }
 
       }
-
     }
+    /**/
 
+    /**/
     // Debug part of tracking
     TTreeSRedirector &cstream = *fDebugStreamer;
-    Int_t eventNr = event->GetEventNumber();
+    Int_t eventNrInFile = event->GetEventNumberInFile(); // This is most likely NOT the event number you'd like to use. It has nothing to do with the 'real' event number.
     if (AliTRDReconstructor::StreamLevel() > 0) {
       if (track->GetBackupTrack()) {
        cstream << "Tracks"
-               << "EventNr="  << eventNr
+               << "EventNrInFile="  << eventNrInFile
                << "ESD.="     << seed
                << "trd.="     << track
                << "trdback.=" << track->GetBackupTrack()
@@ -726,51 +637,69 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
       }
       else {
        cstream << "Tracks"
-               << "EventNr="  << eventNr
+               << "EventNrInFile="  << eventNrInFile
                << "ESD.="     << seed
                << "trd.="     << track
                << "trdback.=" << track
                << "\n";
       }
     }
+    /**/
 
     // Propagation to the TOF (I.Belikov)    
     if (track->GetStop() == kFALSE) {
-      
+      fHBackfit->Fill(5);
+
       Double_t xtof  = 371.0;
+      Double_t xTOF0 = 370.0;
+    
       Double_t c2    = track->GetSnp() + track->GetC() * (xtof - track->GetX());
       if (TMath::Abs(c2) >= 0.99) {
+       
+       fHBackfit->Fill(6);
        delete track;
        continue;
       }
-      Double_t xTOF0 = 370.0;          
+      
       PropagateToX(*track,xTOF0,fgkMaxStep);
 
       // Energy losses taken to the account - check one more time
       c2 = track->GetSnp() + track->GetC() * (xtof - track->GetX());
       if (TMath::Abs(c2) >= 0.99) {
+       
+       fHBackfit->Fill(7);
        delete track;
        continue;
       }
+      
+      //if (!PropagateToX(*track,xTOF0,fgkMaxStep)) {
+      //       fHBackfit->Fill(7);
+      //delete track;
+      //       continue;
+      //} 
 
       Double_t ymax = xtof * TMath::Tan(0.5 * AliTRDgeometry::GetAlpha());
       Double_t y; 
       track->GetYAt(xtof,GetBz(),y);
-      if      (y >  ymax) {
+      if (y >  ymax) {
        if (!track->Rotate( AliTRDgeometry::GetAlpha())) {
+         fHBackfit->Fill(8);
          delete track;
          continue;
        }
       } 
       else if (y < -ymax) {
        if (!track->Rotate(-AliTRDgeometry::GetAlpha())) {
+         fHBackfit->Fill(9);
          delete track;
          continue;
        }
       }
-      
+         
       if (track->PropagateTo(xtof)) {
        seed->UpdateTrackParams(track,AliESDtrack::kTRDout);
+       fHBackfit->Fill(10);
+
         for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) {
           for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) {
             seed->SetTRDsignals(track->GetPIDsignals(i,j),i,j);
@@ -779,16 +708,22 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
         }
        //seed->SetTRDtrack(new AliTRDtrack(*track));
        if (track->GetNumberOfClusters() > foundMin) {
+         fHBackfit->Fill(11);
           found++;
        }
       }
 
     }
     else {
-
+      
+      fHBackfit->Fill(12);
+      
       if ((track->GetNumberOfClusters() >              15) &&
           (track->GetNumberOfClusters() > 0.5*expectedClr)) {
+       
        seed->UpdateTrackParams(track,AliESDtrack::kTRDout);
+       fHBackfit->Fill(13);
+
        //seed->SetStatus(AliESDtrack::kTRDStop);    
         for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) {
           for (Int_t j = 0; j <AliESDtrack::kNSlice; j++) {
@@ -805,8 +740,8 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
     seed->SetTRDQuality(track->StatusForTOF());    
     seed->SetTRDBudget(track->GetBudget(0));    
   
+    fHBackfit->Fill(14);
     delete track;
-
   }
 
   AliInfo(Form("Number of seeds: %d",fNseeds));
@@ -823,12 +758,13 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
   delete [] index;
   delete [] quality;
   
+  SaveLogHists();
+  
   return 0;
-
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDtracker::RefitInward(AliESD *event)
+Int_t AliTRDtracker::RefitInward(AliESDEvent *event)
 {
   //
   // Refits tracks within the TRD. The ESD event is expected to contain seeds 
@@ -842,6 +778,7 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
   Float_t foundMin = fgkMinClustersInTrack * timeBins; 
   Int_t   nseed    = 0;
   Int_t   found    = 0;
+  Int_t   pidQ     = 0;
   //Int_t innerTB    = fTrSec[0]->GetInnerTimeBin();
   AliTRDtrack seed2;
   
@@ -850,19 +787,26 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
 
     AliESDtrack *seed = event->GetTrack(i);
     new (&seed2) AliTRDtrack(*seed);
+    fHRefit->Fill(0);
+
     if (seed2.GetX() < 270.0) {
       seed->UpdateTrackParams(&seed2,AliESDtrack::kTRDbackup); // Backup TPC track - only update
+      fHRefit->Fill(1);
       continue;
     }
 
     ULong_t status = seed->GetStatus();
     if ((status & AliESDtrack::kTRDout) == 0) {
+      fHRefit->Fill(2);
       continue;
     }
     if ((status & AliESDtrack::kTRDin)  != 0) {
+      fHRefit->Fill(3);
       continue;
     }
+    
     nseed++; 
+    fHRefit->Fill(4);
 
     seed2.ResetCovariance(50.0); 
 
@@ -884,19 +828,25 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
     }  
         
     //AliTRDtrack *pt = seed2;
-    AliTRDtrack &t = *pt; 
-    FollowProlongation(t); 
-    if (t.GetNumberOfClusters() >= foundMin) {
+    //AliTRDtrack &t = *pt; 
+    FollowProlongation(*pt); 
+    //if (pt->GetNumberOfClusters() >= foundMin) {
       //UseClusters(&t);
       //CookLabel(pt, 1-fgkLabelFraction);
-      t.CookdEdx();
-      CookdEdxTimBin(t);
-    }
+      pt->CookdEdx();
+      pt->CookdEdxTimBin(seed->GetID());
+      pt->SetPIDMethod(AliTRDtrack::kLQ);  //switch between TRD PID methods
+      pt->CookPID(pidQ);
+      //pt->Calibrate(); // slot for calibration
+      //}
     found++;
 
     Double_t xTPC = 250.0;
-    if (PropagateToX(t,xTPC,fgkMaxStep)) {
+    if (PropagateToX(*pt,xTPC,fgkMaxStep)) {
+
       seed->UpdateTrackParams(pt,AliESDtrack::kTRDrefit);
+      fHRefit->Fill(5);
+
       for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) {
         for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) {
           seed->SetTRDsignals(pt->GetPIDsignals(i,j),i,j);
@@ -906,24 +856,36 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
     }
     else {
       // If not prolongation to TPC - propagate without update
+      fHRefit->Fill(5);
       AliTRDtrack *seed2 = new AliTRDtrack(*seed);
       seed2->ResetCovariance(5.0); 
       AliTRDtrack *pt2   = new AliTRDtrack(*seed2,seed2->GetAlpha());
       delete seed2;
       if (PropagateToX(*pt2,xTPC,fgkMaxStep)) { 
         pt2->CookdEdx( ); 
-        CookdEdxTimBin(*pt2);
+        pt2->CookdEdxTimBin(seed->GetID()); 
        seed->UpdateTrackParams(pt2,AliESDtrack::kTRDrefit);
+       fHRefit->Fill(6);
+
         for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) {
           for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) {
             seed->SetTRDsignals(pt2->GetPIDsignals(i,j),i,j);
-         }
+                               }
           seed->SetTRDTimBin(pt2->GetPIDTimBin(i),i);
         }
       }
+
+      // Add TRD track to ESDfriendTrack - maybe this tracks are not useful for post-processing - TODO make decission
+      if (AliTRDReconstructor::StreamLevel() > 0)  {
+        seed->AddCalibObject(new AliTRDtrack(*pt2/*, kTRUE*/));
+      }
       delete pt2;
     }
 
+    // Add TRD track to ESDfriendTrack
+    if (AliTRDReconstructor::StreamLevel() > 0)  {
+      seed->AddCalibObject(new AliTRDtrack(*pt/*, kTRUE*/));
+    }
     delete pt;
 
   }   
@@ -931,148 +893,156 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
   AliInfo(Form("Number of loaded seeds: %d",nseed));
   AliInfo(Form("Number of found tracks from loaded seeds: %d",found));
 
+  SaveLogHists();
   return 0;
-
 }
 
 //_____________________________________________________________________________
 Int_t AliTRDtracker::FollowProlongation(AliTRDtrack &t)
 {
-  //
-  // Starting from current position on track=t this function tries
-  // to extrapolate the track up to timeBin=0 and to confirm prolongation
-  // if a close cluster is found. Returns the number of clusters
-  // expected to be found in sensitive layers
-  // GeoManager used to estimate mean density
-  //
-
-  Int_t    sector;
-  Int_t    lastplane = GetLastPlane(&t);
-  Double_t radLength = 0.0;
-  Double_t rho       = 0.0;
-  Int_t    expectedNumberOfClusters = 0;
-
-  for (Int_t iplane = lastplane; iplane >= 0; iplane--) {
-
-    Int_t row0    = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1);
-    Int_t rowlast = GetGlobalTimeBin(0,iplane,0);
-
-    //
-    // Propagate track close to the plane if neccessary
-    //
-    Double_t currentx  = fTrSec[0]->GetLayer(rowlast)->GetX();
-    if (currentx < (-fgkMaxStep + t.GetX())) {
-      // Propagate closer to chamber - safety space fgkMaxStep      
-      if (!PropagateToX(t,currentx+fgkMaxStep,fgkMaxStep)) {
-        break;
-      }
-    }
-
-    if (!AdjustSector(&t)) {
-      break;
-    }
+       //
+       // Starting from current position on track=t this function tries
+       // to extrapolate the track up to timeBin=0 and to confirm prolongation
+       // if a close cluster is found. Returns the number of clusters
+       // expected to be found in sensitive layers
+       // GeoManager used to estimate mean density
+       //
 
-    //
-    // Get material budget
-    //
-    Double_t xyz0[3];
-    Double_t xyz1[3];
-    Double_t param[7];
-    Double_t x;
-    Double_t y;
-    Double_t z;
+       Int_t    sector;
+       Int_t    lastplane = GetLastPlane(&t);
+       Double_t xx0 = 0.0;
+       Double_t xrho= 0.0;
+       Int_t    expectedNumberOfClusters = 0;
 
-    // Starting global position
-    t.GetXYZ(xyz0);   
-    // End global position
-    x = fTrSec[0]->GetLayer(row0)->GetX();
-    if (!t.GetProlongation(x,y,z)) {
-      break;
-    }
-    xyz1[0] =  x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha()); 
-    xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha());
-    xyz1[2] =  z;
-    AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);       
-    rho       = param[0];
-    radLength = param[1]; // Get mean propagation parameters
+       for (Int_t iplane = lastplane; iplane >= 0; iplane--) {
 
-    //
-    // Propagate and update
-    //
-    sector = t.GetSector();
-    //for (Int_t itime=GetTimeBinsPerPlane()-1;itime>=0;itime--) {
-    for (Int_t itime = 0 ; itime < GetTimeBinsPerPlane(); itime++) {
+               Int_t row0    = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1);
+               Int_t rowlast = GetGlobalTimeBin(0,iplane,0);
 
-      Int_t ilayer = GetGlobalTimeBin(0,iplane,itime);
-      expectedNumberOfClusters++;       
-      t.SetNExpected(t.GetNExpected() + 1);
-      if (t.GetX() > 345.0) {
-        t.SetNExpectedLast(t.GetNExpectedLast() + 1);
-      }
-      AliTRDpropagationLayer &timeBin = *(fTrSec[sector]->GetLayer(ilayer));
-      AliTRDcluster          *cl      = 0;
-      UInt_t   index   = 0;
-      Double_t maxChi2 = fgkMaxChi2;
-      x = timeBin.GetX();
+               //
+               // Propagate track close to the plane if neccessary
+               //
+               Double_t currentx  = fTrSec[0]->GetLayer(rowlast)->GetX();
+               if (currentx < (-fgkMaxStep + t.GetX())) {
+                       // Propagate closer to chamber - safety space fgkMaxStep
+                       if (!PropagateToX(t,currentx+fgkMaxStep,fgkMaxStep)) {
+                               break;
+                       }
+               }
 
-      if (timeBin) {
+               if (!AdjustSector(&t)) {
+                       break;
+               }
 
-       AliTRDcluster *cl0 = timeBin[0];
-       if (!cl0) {
-          // No clusters in given time bin
-          continue;         
-       }
+               //
+               // Get material budget
+               //
+               Double_t xyz0[3];
+               Double_t xyz1[3];
+               Double_t param[7];
+               Double_t x;
+               Double_t y;
+               Double_t z;
+
+               // Starting global position
+               t.GetXYZ(xyz0);
+               // End global position
+               x = fTrSec[0]->GetLayer(row0)->GetX();
+               if (!t.GetProlongation(x,y,z)) {
+                       break;
+               }
+               xyz1[0] =  x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha());
+               xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha());
+               xyz1[2] =  z;
+               AliTracker::MeanMaterialBudget(xyz0,xyz1,param);
+               xrho= param[0]*param[4];
+               xx0 = param[1]; // Get mean propagation parameters
+               // A.Bercuci 25.07.07
+               // Flags for marking the track momentum and direction. The track is
+               // marked only if it has at least 1 cluster picked up in the current
+               // chamber.
+               Bool_t kUPDATED = kFALSE, kMARKED = kFALSE;
 
-       Int_t plane   = fGeom->GetPlane(cl0->GetDetector());
-       if (plane > lastplane) {
-          continue;
+               //
+               // Propagate and update
+               //
+               sector = t.GetSector();
+               //for (Int_t itime=GetTimeBinsPerPlane()-1;itime>=0;itime--) {
+               for (Int_t itime = 0 ; itime < GetTimeBinsPerPlane(); itime++) {
+                       // A.Bercuci 25.07.07
+                       // Mark track kinematics
+                       if(itime > 10 && kUPDATED && !kMARKED){
+                               t.SetTrackSegmentDirMom(iplane);
+                               kMARKED = kTRUE;
+                       }
+
+                       Int_t ilayer = GetGlobalTimeBin(0,iplane,itime);
+                       expectedNumberOfClusters++;
+                       t.SetNExpected(t.GetNExpected() + 1);
+                       if (t.GetX() > 345.0) {
+                               t.SetNExpectedLast(t.GetNExpectedLast() + 1);
+                       }
+                       AliTRDpropagationLayer &timeBin = *(fTrSec[sector]->GetLayer(ilayer));
+                       AliTRDcluster *cl = 0;
+                       UInt_t   index   = 0;
+                       Double_t maxChi2 = fgkMaxChi2;
+                       x = timeBin.GetX();
+
+                       if (timeBin) {
+
+                               AliTRDcluster *cl0 = timeBin[0];
+                               if (!cl0) {
+                                       // No clusters in given time bin
+                                       continue;
+                               }
+
+                               Int_t plane   = fGeom->GetPlane(cl0->GetDetector());
+                               if (plane > lastplane) {
+                                                               continue;
+                               }
+
+                               Int_t timebin = cl0->GetLocalTimeBin();
+                               AliTRDcluster *cl2 = GetCluster(&t,plane,timebin,index);
+
+                               if (cl2) {
+                                       cl = cl2;
+                                       //Double_t h01 = GetTiltFactor(cl);    //I.B's fix
+                                       //maxChi2=t.GetPredictedChi2(cl,h01);
+                               }
+                               if (cl) {
+                                       //if (cl->GetNPads()<5)
+                                       Double_t dxsample = timeBin.GetdX();
+                                       t.SetSampledEdx(TMath::Abs(cl->GetQ()/dxsample));
+                                                               Double_t h01      = GetTiltFactor(cl);
+                                       Int_t    det      = cl->GetDetector();
+                                       Int_t    plane    = fGeom->GetPlane(det);
+                                       if (t.GetX() > 345.0) {
+                                               t.SetNLast(t.GetNLast() + 1);
+                                               t.SetChi2Last(t.GetChi2Last() + maxChi2);
+                                       }
+
+                                       Double_t xcluster = cl->GetX();
+                                       t.PropagateTo(xcluster,xx0,xrho);
+                                       
+                                       if (!AdjustSector(&t)) {
+                                               break;           //I.B's fix
+                                       }
+                                       maxChi2 = t.GetPredictedChi2(cl,h01);
+                                       
+                                       if (maxChi2<1e+10)
+                                               if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) {
+                                                       // ????
+                                               } else {
+                                                       // A.Bercuci 25.07.07
+                                                       //SetCluster(cl, GetNumberOfClusters()-1);
+                                                       kUPDATED = kTRUE;
+                                               }
+                               }
+                       }
+               }
        }
 
-       Int_t timebin = cl0->GetLocalTimeBin();
-       AliTRDcluster *cl2 = GetCluster(&t,plane,timebin,index);
-
-       if (cl2) {
-
-         cl = cl2;     
-         //Double_t h01 = GetTiltFactor(cl);    //I.B's fix
-         //maxChi2=t.GetPredictedChi2(cl,h01);
-
-       }       
-        if (cl) {
-
-         //if (cl->GetNPads()<5) 
-         Double_t dxsample = timeBin.GetdX();
-         t.SetSampledEdx(TMath::Abs(cl->GetQ()/dxsample)); 
-          Double_t h01      = GetTiltFactor(cl);
-         Int_t    det      = cl->GetDetector();    
-         Int_t    plane    = fGeom->GetPlane(det);
-         if (t.GetX() > 345.0) {
-           t.SetNLast(t.GetNLast() + 1);
-           t.SetChi2Last(t.GetChi2Last() + maxChi2);
-         }
-
-         Double_t xcluster = cl->GetX();
-         t.PropagateTo(xcluster,radLength,rho);
-
-          if (!AdjustSector(&t)) {
-            break;           //I.B's fix
-         }
-         maxChi2 = t.GetPredictedChi2(cl,h01);
-          
-         if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) {
-           // ????
-         }
-
-       }                       
-
-      }
-
-    } 
-
-  }
-
-  return expectedNumberOfClusters;  
-
+       return expectedNumberOfClusters;
 }                
 
 //_____________________________________________________________________________
@@ -1085,22 +1055,25 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
   // Returns the number of clusters expected to be found in sensitive layers
   // Use GEO manager for material Description
   //
+  // return number of assigned clusters ? 
+  //
+
 
   Int_t    sector;
   Int_t    clusters[1000];
-  Double_t radLength = 0.0;
-  Double_t rho       = 0.0;
+  Double_t xx0  = 0.0;
+  Double_t xrho = 0.0;
   Int_t    expectedNumberOfClusters = 0;
   Float_t  ratio0    = 0.0;
   AliTRDtracklet tracklet;
 
   // Calibration fill 2D
-  AliTRDCalibra *calibra = AliTRDCalibra::Instance();
+  AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
   if (!calibra) {
     AliInfo("Could not get Calibra instance\n");
   }
-  if (calibra->GetMItracking()) {
-    calibra->Resettrack();
+  if (calibra->GetMITracking()) {
+    calibra->ResetTrack();
   }
 
   for (Int_t i = 0; i < 1000; i++) {
@@ -1109,10 +1082,14 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
 
   for (Int_t iplane = 0; iplane < AliESDtrack::kNPlane; iplane++) {
 
+    int hb = iplane * 10;
+    fHClSearch->Fill(hb);
+
     Int_t    row0     = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1);
     Int_t    rowlast  = GetGlobalTimeBin(0,iplane,0);
     Double_t currentx = fTrSec[0]->GetLayer(row0)->GetX();
     if (currentx < t.GetX()) {
+      fHClSearch->Fill(hb+1);
       continue;
     }
 
@@ -1121,13 +1098,16 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
     //
     if (currentx > (fgkMaxStep + t.GetX())) {
       if (!PropagateToX(t,currentx-fgkMaxStep,fgkMaxStep)) {
+       fHClSearch->Fill(hb+2);
         break;
       }
     }
     if (!AdjustSector(&t)) {
+      fHClSearch->Fill(hb+3);
       break;
     }
     if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) {
+      fHClSearch->Fill(hb+4);
       break;
     }
 
@@ -1145,21 +1125,25 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
     // End global position
     x = fTrSec[0]->GetLayer(rowlast)->GetX();
     if (!t.GetProlongation(x,y,z)) {
+      fHClSearch->Fill(hb+5);
       break;
     }
     xyz1[0] =  x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha()); 
     xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha());
     xyz1[2] =  z;
-    AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);       
-    rho       = param[0];
-    radLength = param[1]; // Get mean propagation parameters
+    AliTracker::MeanMaterialBudget(xyz0,xyz1,param);   
+    xrho = param[0]*param[4];
+    xx0  = param[1]; // Get mean propagation parameters
 
     //
     // Find clusters
     //
     sector = t.GetSector();
     Float_t ncl = FindClusters(sector,row0,rowlast,&t,clusters,tracklet);
+    fHNCl->Fill(tracklet.GetN());
+
     if (tracklet.GetN() < GetTimeBinsPerPlane()/3) {
+      fHClSearch->Fill(hb+6);
       continue;
     }
 
@@ -1175,7 +1159,7 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
         t.SetNExpectedLast(t.GetNExpectedLast() + 1);
       }
       AliTRDpropagationLayer &timeBin = *(fTrSec[sector]->GetLayer(ilayer));
-      AliTRDcluster          *cl      = 0;
+      AliTRDcluster *cl = 0;
       UInt_t   index   = 0;
       Double_t maxChi2 = fgkMaxChi2;
       x = timeBin.GetX();
@@ -1202,16 +1186,18 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
            t.SetChi2Last(t.GetChi2Last() + maxChi2);
          }
          Double_t xcluster = cl->GetX();
-         t.PropagateTo(xcluster,radLength,rho);
+         t.PropagateTo(xcluster,xx0,xrho);
          maxChi2 = t.GetPredictedChi2(cl,h01);
 
-         if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) {
-           if (!t.Update(cl,maxChi2,index,h01)) {
-             // ????
-           }
-          }  
+         if (maxChi2<1e+10)
+           if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) {
+             if (!t.Update(cl,maxChi2,index,h01)) {
+               // ????
+             }
+           } // else SetCluster(cl, GetNumberOfClusters()-1); // A.Bercuci 25.07.07
+  
 
-          if (calibra->GetMItracking()) {
+          if (calibra->GetMITracking()) {
             calibra->UpdateHistograms(cl,&t);
           }
 
@@ -1237,13 +1223,13 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
         (t.GetNCross()           ==    0) && 
         (TMath::Abs(t.GetSnp())  <  0.85) &&
         (t.GetNumberOfClusters() >    20)){
+      //if (ratio0 > 0.8) {
       t.MakeBackupTrack(); // Make backup of the track until is gold
     }
     
   }
 
   return expectedNumberOfClusters;  
-
 }         
 
 //_____________________________________________________________________________
@@ -1282,8 +1268,8 @@ Int_t AliTRDtracker::PropagateToX(AliTRDtrack &t, Double_t xToGo, Double_t maxSt
     xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha());
     xyz1[2] =  z;
 
-    AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);       
-    if (!t.PropagateTo(x,param[1],param[0])) {
+    AliTracker::MeanMaterialBudget(xyz0,xyz1,param);   
+    if (!t.PropagateTo(x,param[1],param[0]*param[4])) {
       return 0;
     }
     AdjustSector(&t);
@@ -1326,14 +1312,14 @@ Int_t AliTRDtracker::LoadClusters(TTree *cTree)
     Int_t localTimeBin   = c->GetLocalTimeBin();
     Int_t sector         = fGeom->GetSector(detector);
     Int_t plane          = fGeom->GetPlane(detector);
-    Int_t trackingSector = CookSectorIndex(sector);
+    Int_t trackingSector = sector;
 
-    if (c->GetLabel(0) > 0) {
+    if (c->GetQ() > 10) {
       Int_t chamber = fGeom->GetChamber(detector);
       fHoles[chamber][trackingSector] = kFALSE;
     }
 
-    Int_t gtb = fTrSec[trackingSector]->CookTimeBinIndex(plane,localTimeBin);
+    Int_t gtb   = fTrSec[trackingSector]->CookTimeBinIndex(plane,localTimeBin);
     if (gtb < 0) {
       continue; 
     }
@@ -1341,8 +1327,9 @@ Int_t AliTRDtracker::LoadClusters(TTree *cTree)
 
     index = ncl;
 
-    // Apply pos correction
-    Transform(c);    
+    fHXCl->Fill(c->GetX());
+
+    fTrSec[trackingSector]->GetLayer(layer)->SetX(c->GetX());
     fTrSec[trackingSector]->GetLayer(layer)->InsertCluster(c,index);
 
   }
@@ -1387,7 +1374,7 @@ void AliTRDtracker::UnloadClusters()
 }
 
 //_____________________________________________________________________________
-void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD *esd)
+void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESDEvent *esd)
 {
   //
   // Creates  seeds using clusters between  position inner plane  and outer plane 
@@ -1440,7 +1427,7 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD *esd)
     }
   }
 
-  AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(0,0);
+  AliTRDpadPlane *padPlane = fGeom->GetPadPlane(0,0);
   Double_t h01 = TMath::Tan(-TMath::Pi() / 180.0 * padPlane->GetTiltingAngle());
   Double_t hL[6];                                                // Tilting angle
   Double_t xcl[6];                                               // X - position of reference cluster
@@ -2490,7 +2477,7 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD *esd)
          }
        }
 
-       Int_t eventNr = esd->GetEventNumber();
+       Int_t eventNrInFile = esd->GetEventNumberInFile(); // This is most likely NOT the event number you'd like to use. It has nothing to do with the 'real' event number.
        TTreeSRedirector &cstream = *fDebugStreamer;
 
        //
@@ -2509,7 +2496,7 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD *esd)
          TTreeSRedirector &cstream = *fDebugStreamer;
          if (AliTRDReconstructor::StreamLevel() > 0) {
            cstream << "Tracks"
-                   << "EventNr="  << eventNr
+                   << "EventNrInFile="  << eventNrInFile
                    << "ESD.="     << &esdtrack
                    << "trd.="     << track
                    << "trdback.=" << track
@@ -2539,7 +2526,7 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD *esd)
                  << "Findable="  << findable
                  << "NUsed="     << nused
                  << "sLayer="    << sLayer
-                 << "EventNr="   << eventNr
+                 << "EventNrInFile="   << eventNrInFile
                  << "\n";
        }
 
@@ -2620,29 +2607,29 @@ Bool_t AliTRDtracker::GetTrackPoint(Int_t index, AliTrackPoint &p) const
   Double_t global[3];
   fGeom->RotateBack(idet,local,global);
   p.SetXYZ(global[0],global[1],global[2]);
-  AliAlignObj::ELayerID iLayer = AliAlignObj::kTRD1;
+  AliGeomManager::ELayerID iLayer = AliGeomManager::kTRD1;
   switch (iplan) {
   case 0:
-    iLayer = AliAlignObj::kTRD1;
+    iLayer = AliGeomManager::kTRD1;
     break;
   case 1:
-    iLayer = AliAlignObj::kTRD2;
+    iLayer = AliGeomManager::kTRD2;
     break;
   case 2:
-    iLayer = AliAlignObj::kTRD3;
+    iLayer = AliGeomManager::kTRD3;
     break;
   case 3:
-    iLayer = AliAlignObj::kTRD4;
+    iLayer = AliGeomManager::kTRD4;
     break;
   case 4:
-    iLayer = AliAlignObj::kTRD5;
+    iLayer = AliGeomManager::kTRD5;
     break;
   case 5:
-    iLayer = AliAlignObj::kTRD6;
+    iLayer = AliGeomManager::kTRD6;
     break;
   };
   Int_t    modId = isector * fGeom->Ncham() + ichamber;
-  UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,modId);
+  UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,modId);
   p.SetVolumeID(volid);
 
   return kTRUE;
@@ -2875,8 +2862,8 @@ AliTRDtracker::AliTRDtrackingSector
   // AliTRDtrackingSector Constructor
   //
 
-  AliTRDpadPlane         *padPlane = 0;
-  AliTRDpropagationLayer *ppl      = 0;
+  AliTRDpadPlane *padPlane = 0;
+  AliTRDpropagationLayer *ppl = 0;
 
   // Get holes description from geometry
   Bool_t holes[AliTRDgeometry::kNcham];
@@ -2904,31 +2891,24 @@ AliTRDtracker::AliTRDtrackingSector
   Double_t *zc            = new Double_t[kNchambers];
   Double_t *zmax          = new Double_t[kNchambers];
   Double_t *zmaxsensitive = new Double_t[kNchambers];  
-
-  AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
-  if (!commonParam) {
-    AliErrorGeneral("AliTRDtrackingSector::Ctor"
-                   ,"Could not get common parameters\n");
-    return;
-  }
     
   for (Int_t plane = 0; plane < AliTRDgeometry::Nplan(); plane++) {
 
     ymax          = fGeom->GetChamberWidth(plane) / 2.0;
-    padPlane      = commonParam->GetPadPlane(plane,0);
+    padPlane      = fGeom->GetPadPlane(plane,0);
     ymaxsensitive = (padPlane->GetColSize(1) * padPlane->GetNcols() - 4.0) / 2.0;    
 
     for (Int_t ch = 0; ch < kNchambers; ch++) {
       zmax[ch]          = fGeom->GetChamberLength(plane,ch) / 2.0;
       Float_t pad       = padPlane->GetRowSize(1);
-      Float_t row0      = commonParam->GetRow0(plane,ch,0);
-      Int_t   nPads     = commonParam->GetRowMax(plane,ch,0);
+      Float_t row0      = fGeom->GetRow0(plane,ch,0);
+      Int_t   nPads     = fGeom->GetRowMax(plane,ch,0);
       zmaxsensitive[ch] = Float_t(nPads) * pad / 2.0;      
       zc[ch]            = -(pad * nPads) / 2.0 + row0;
     }
 
     dx        = AliTRDcalibDB::Instance()->GetVdrift(0,0,0)
-              / AliTRDcalibDB::Instance()->GetSamplingFrequency();
+              / AliTRDCommonParam::Instance()->GetSamplingFrequency();
     rho       = 0.00295 * 0.85; //????
     radLength = 11.0;  
 
@@ -3315,7 +3295,7 @@ Double_t AliTRDtracker::GetTiltFactor(const AliTRDcluster *c)
 
   Int_t    det   = c->GetDetector();    
   Int_t    plane = fGeom->GetPlane(det);
-  AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(plane,0);
+  AliTRDpadPlane *padPlane = fGeom->GetPadPlane(plane,0);
   Double_t h01   = TMath::Tan(-TMath::Pi() / 180.0 * padPlane->GetTiltingAngle());
 
   if (fNoTilt) {
@@ -3326,85 +3306,6 @@ Double_t AliTRDtracker::GetTiltFactor(const AliTRDcluster *c)
 
 }
 
-//_____________________________________________________________________________
-void AliTRDtracker::CookdEdxTimBin(AliTRDtrack &TRDtrack)
-{
-  //
-  // This is setting fdEdxPlane and fTimBinPlane
-  // Sums up the charge in each plane for track TRDtrack and also get the 
-  // Time bin for Max. Cluster
-  // Prashant Shukla (shukla@physi.uni-heidelberg.de)
-  //
-
-  Double_t  clscharge[AliESDtrack::kNPlane][AliESDtrack::kNSlice];
-  Double_t  maxclscharge[AliESDtrack::kNPlane];
-  Int_t     nCluster[AliESDtrack::kNPlane][AliESDtrack::kNSlice];
-  Int_t     timebin[AliESDtrack::kNPlane];
-
-  // Initialization of cluster charge per plane.  
-  for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) {
-    for (Int_t iSlice = 0; iSlice < AliESDtrack::kNSlice; iSlice++) {
-      clscharge[iPlane][iSlice] = 0.0;
-      nCluster[iPlane][iSlice]  = 0;
-    }
-  }
-
-  // Initialization of cluster charge per plane.  
-  for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) {
-    timebin[iPlane]      =  -1;
-    maxclscharge[iPlane] = 0.0;
-  }
-
-  // Loop through all clusters associated to track TRDtrack
-  Int_t nClus = TRDtrack.GetNumberOfClusters();  // from Kalmantrack
-  for (Int_t iClus = 0; iClus < nClus; iClus++) {
-    Double_t charge = TRDtrack.GetClusterdQdl(iClus);
-    Int_t    index  = TRDtrack.GetClusterIndex(iClus);
-    AliTRDcluster *pTRDcluster = (AliTRDcluster *) GetCluster(index); 
-    if (!pTRDcluster) {
-      continue;
-    }
-    Int_t    tb     = pTRDcluster->GetLocalTimeBin();
-    if (!tb) {
-      continue;
-    }
-    Int_t detector  = pTRDcluster->GetDetector();
-    Int_t iPlane    = fGeom->GetPlane(detector);
-    Int_t iSlice    = tb * AliESDtrack::kNSlice / AliTRDtrack::kNtimeBins;
-    clscharge[iPlane][iSlice] = clscharge[iPlane][iSlice] + charge;
-    if (charge > maxclscharge[iPlane]) {
-      maxclscharge[iPlane] = charge;
-      timebin[iPlane]      = tb;
-    }
-    nCluster[iPlane][iSlice]++;
-  } // End of loop over cluster
-
-  // Setting the fdEdxPlane and fTimBinPlane variabales 
-  Double_t totalCharge = 0.0;
-
-  for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) {
-    for (Int_t iSlice = 0; iSlice < AliESDtrack::kNSlice; iSlice++) {
-      if (nCluster[iPlane][iSlice]) {
-        clscharge[iPlane][iSlice] /= nCluster[iPlane][iSlice];
-      }
-      TRDtrack.SetPIDsignals(clscharge[iPlane][iSlice],iPlane,iSlice);
-      totalCharge = totalCharge+clscharge[iPlane][iSlice];
-    }
-    TRDtrack.SetPIDTimBin(timebin[iPlane],iPlane);     
-  }
-
-  // Still needed ????
-  //  Int_t i;
-  //  Int_t nc=TRDtrack.GetNumberOfClusters(); 
-  //  Float_t dedx=0;
-  //  for (i=0; i<nc; i++) dedx += TRDtrack.GetClusterdQdl(i);
-  //  dedx /= nc;
-  //  for (Int_t iPlane = 0; iPlane < kNPlane; iPlane++) {
-  //    TRDtrack.SetPIDsignals(dedx, iPlane);
-  //    TRDtrack.SetPIDTimBin(timbin[iPlane], iPlane);
-  //  }
-
-}
 
 //_____________________________________________________________________________
 Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
@@ -3462,12 +3363,13 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
     tany *= -1.0;
   }
 
-  Double_t sy2       = ExpectedSigmaY2(x0,track->GetTgl(),track->GetPt());
+  Double_t sy2       = ExpectedSigmaY2(x0,track->GetTgl(),track->GetSignedPt());
   Double_t sz2       = ExpectedSigmaZ2(x0,track->GetTgl());
   Double_t road      = 15.0 * TMath::Sqrt(track->GetSigmaY2() + sy2);
   if (road > 6.0) {
     road = 6.0;
   }
+  //road = 20.0;
 
   for (Int_t it = 0; it < t1-t0; it++) {
 
@@ -3491,7 +3393,12 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
     //
     // Find 2 nearest cluster at given time bin
     // 
+    int checkPoint[4] = {0,0,0,0};
+    double minY = 123456789;
+    double minD[2] = {1,1};
+
     for (Int_t i = timeBin.Find(y - road); i < maxn; i++) {
+      //for (Int_t i = 0; i < maxn; i++) {
 
       AliTRDcluster *c = (AliTRDcluster *) (timeBin[i]);
       h01 = GetTiltFactor(c);
@@ -3500,18 +3407,35 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
        plane     = fGeom->GetPlane(det);
        padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0);
       }
+
       //if (c->GetLocalTimeBin()==0) continue;
       if (c->GetY() > (y + road)) {
         break;
       }
-      if ((c->GetZ() - z) * (c->GetZ() - z) > (12.0 * sz2)) {
+
+      fHDeltaX->Fill(c->GetX() - x[it]);
+      //printf("%f\t%f\t%f \n", c->GetX(),  x[it], c->GetX()-x[it]);
+
+      if (TMath::Abs(c->GetY()-y) < TMath::Abs(minY)) {
+       minY = c->GetY()-y;
+       minD[0] = c->GetY()-y;
+       minD[1] = c->GetZ()-z;
+      }
+
+      checkPoint[0]++;
+
+      fHMinZ->Fill(c->GetZ() - z);
+      if ((c->GetZ() - z) * (c->GetZ() - z) > 2 * (12.0 * sz2)) {
         continue;
       }
+      checkPoint[1]++;
 
       Double_t dist = TMath::Abs(c->GetZ() - z);
-      if (dist > (0.5 * padlength + 6.0 * sigmaz)) {
+      if (dist > (0.5 * padlength + 6.0 * sigmaz)) { // 0.5
         continue;   // 6 sigma boundary cut
       }
+      checkPoint[2]++;
+
       Double_t cost = 0.0;
       // Sigma boundary cost function
       if (dist> (0.5 * padlength - sigmaz)){ 
@@ -3531,6 +3455,8 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
       if (chi2 > maxChi2[1]) {
         continue;
       }
+      checkPoint[3]++;
+
       detector = c->GetDetector();
       // Store the clusters in the road
       for (Int_t ih = 2; ih < 9; ih++) {  
@@ -3555,6 +3481,16 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
       indexes[1][it] = timeBin.GetIndex(i); 
 
     }
+    
+    for(int iCheckPoint = 0; iCheckPoint<4; iCheckPoint++)
+      fHFindCl[iCheckPoint]->Fill(checkPoint[iCheckPoint]);
+
+    if (checkPoint[3]) {
+      if (track->GetSignedPt() > 0) fHMinYPos->Fill(minY);
+      else fHMinYNeg->Fill(minY);
+
+    fHMinD->Fill(minD[0], minD[1]);
+     }
 
     if (cl[0][it]) {
       nfound++;
@@ -3608,13 +3544,13 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
     mean[it]       = 0.0;    // Mean value
     angle[it]      = 0.0;    // Angle
 
-    smoffset[it]   = 1.0e10; // Sigma of mean offset
-    smean[it]      = 1.0e10; // Sigma of mean value
-    sangle[it]     = 1.0e10; // Sigma of angle
+    smoffset[it]   = 1.0e5; // Sigma of mean offset
+    smean[it]      = 1.0e5; // Sigma of mean value
+    sangle[it]     = 1.0e5; // Sigma of angle
     smeanangle[it] = 0.0;    // Correlation
 
-    sigmas[it]     = 1.0e10;     
-    tchi2s[it]     = 1.0e10; // Chi2s for tracklet
+    sigmas[it]     = 1.0e5;     
+    tchi2s[it]     = 1.0e5; // Chi2s for tracklet
 
   }
 
@@ -3844,8 +3780,8 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
   //if (tchi2s[bestiter]>25.) sigma2*=tchi2s[bestiter]/25.;
   //if (tchi2s[bestiter]>25.) sigma2=1000.;  // dont'accept
 
-  Double_t exB         = AliTRDcalibDB::Instance()->GetOmegaTau(
-                          AliTRDcalibDB::Instance()->GetVdrift(0,0,0));
+  Double_t exB         = AliTRDcalibDB::Instance()->GetOmegaTau(AliTRDcalibDB::Instance()->GetVdrift(0,0,0)
+                                                               ,-AliTracker::GetBz()*0.1);
   Double_t expectederr = sigma2*sigma2 + 0.01*0.01;
   if (mpads > 3.5) {
     expectederr += (mpads - 3.5) * 0.04;
@@ -4046,6 +3982,10 @@ Int_t AliTRDtracker::Freq(Int_t n, const Int_t *inlist
   // The size of output array has is 2*n 
   //
 
+  if (n <= 0) {
+    return 0;
+  }
+
   Int_t *sindexS = new Int_t[n];   // Temporary array for sorting
   Int_t *sindexF = new Int_t[2*n];   
   for (Int_t i = 0; i < n; i++) {
@@ -4136,7 +4076,8 @@ AliTRDtrack *AliTRDtracker::RegisterSeed(AliTRDseed *seeds, Double_t *params)
                                       ,c
                                       ,params[0]
                                       ,params[6]*alpha+shift);
-  track->PropagateTo(params[0]-5.0);
+       // SetCluster(cl, 0); // A. Bercuci
+       track->PropagateTo(params[0]-5.0);
   track->ResetCovariance(1);
 
   Int_t rc = FollowBackProlongation(*track);
@@ -4146,10 +4087,77 @@ AliTRDtrack *AliTRDtracker::RegisterSeed(AliTRDseed *seeds, Double_t *params)
   }
   else {
     track->CookdEdx();
-    CookdEdxTimBin(*track);
+    track->CookdEdxTimBin(-1);
     CookLabel(track,0.9);
   }
 
   return track;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+void AliTRDtracker::InitLogHists() {
+  fHBackfit = new TH1D("logTRD_backfit", "", 40, -0.5, 39.5);  
+  fHRefit = new TH1D("logTRD_refit", "", 40, -0.5, 39.5);
+  fHClSearch = new TH1D("logTRD_clSearch", "", 60, -0.5, 59.5); 
+  
+  fHX = new TH1D("logTRD_X", ";x (cm)", 200, 50, 400);
+  fHNCl = new TH1D("logTRD_ncl", "", 40, -0.5, 39.5);
+  fHNClTrack = new TH1D("logTRD_nclTrack", "", 180, -0.5, 179.5);
+  
+  fHMinYPos = new TH1D("logTRD_minYPos", ";#delta Y (cm)", 400, -6, 6);
+  fHMinYNeg = new TH1D("logTRD_minYNeg", ";#delta Y (cm)", 400, -6, 6);
+  fHMinZ = new TH1D("logTRD_minZ", ";#delta Z (cm)", 400, -20, 20);
+  fHMinD = new TH2D("logTRD_minD", ";#delta Y (cm);#delta Z (cm)", 100, -6, 6, 100, -50, 50);
+  
+  fHDeltaX = new TH1D("logTRD_deltaX", ";#delta X (cm)", 100, -5, 5);
+  fHXCl = new TH1D("logTRD_xCl", ";cluster x position (cm)", 1000, 280, 380);
+  
+  const char *nameFindCl[4] = {"logTRD_clY", "logTRD_clZ", "logTRD_clB", "logTRD_clG"};
+  
+  for(int i=0; i<4; i++) {
+    fHFindCl[i] = new TH1D(nameFindCl[i], "", 30, -0.5, 29.5);
+  }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+void AliTRDtracker::SaveLogHists() {
+
+  TDirectory *sav = gDirectory;
+  TFile *logFile = 0;
 
+  TSeqCollection *col = gROOT->GetListOfFiles();
+  int N = col->GetEntries();
+  for(int i=0; i<N; i++) {
+    logFile = (TFile*)col->At(i);
+    if (strstr(logFile->GetName(), "AliESDs.root")) break;
+  }
+   
+  logFile->cd();
+  fHBackfit->Write(fHBackfit->GetName(), TObject::kOverwrite);
+  fHRefit->Write(fHRefit->GetName(), TObject::kOverwrite);
+  fHClSearch->Write(fHClSearch->GetName(), TObject::kOverwrite);
+  fHX->Write(fHX->GetName(), TObject::kOverwrite);
+  fHNCl->Write(fHNCl->GetName(), TObject::kOverwrite);
+  fHNClTrack->Write(fHNClTrack->GetName(), TObject::kOverwrite);
+
+  fHMinYPos->Write(fHMinYPos->GetName(), TObject::kOverwrite);
+  fHMinYNeg->Write(fHMinYNeg->GetName(), TObject::kOverwrite);
+  fHMinD->Write(fHMinD->GetName(), TObject::kOverwrite);
+  fHMinZ->Write(fHMinZ->GetName(), TObject::kOverwrite);
+  
+  fHDeltaX->Write(fHDeltaX->GetName(), TObject::kOverwrite);
+  fHXCl->Write(fHXCl->GetName(), TObject::kOverwrite);
+
+
+  for(int i=0; i<4; i++)
+    fHFindCl[i]->Write(fHFindCl[i]->GetName(), TObject::kOverwrite);
+
+  logFile->Flush();
+  
+  sav->cd();
 }
+
+//////////////////////////////////////////////////////////////////////////////////////////