]> 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 05d410391efb3d10900ab3e10c2c6ad016cf6245..afb17b3513f3ae44ee92ab07d9bec9e140bddab5 100644 (file)
@@ -39,7 +39,8 @@
 #include <TTree.h>  
 #include <TTreeStream.h>
 
-#include "AliESD.h"
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
 #include "AliAlignObj.h"
 #include "AliRieman.h"
 #include "AliTrackPointArray.h"
@@ -58,9 +59,9 @@
 
 ClassImp(AliTRDtracker)
 
-const  Float_t  AliTRDtracker::fgkMinClustersInTrack =  0.5;  
-const  Float_t  AliTRDtracker::fgkLabelFraction      =  0.8;  // ??
-const  Double_t AliTRDtracker::fgkMaxChi2            = 12.0; 
+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 
 
@@ -142,7 +143,7 @@ AliTRDtracker::AliTRDtracker(const AliTRDtracker &t)
 }
 
 //_____________________________________________________________________________
-AliTRDtracker::AliTRDtracker(const TFile *geomfile)
+AliTRDtracker::AliTRDtracker(const TFile */*geomfile*/)
   :AliTracker()
   ,fHBackfit(0x0)
   ,fHClSearch(0x0)
@@ -173,34 +174,19 @@ 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   = 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;
@@ -241,7 +227,9 @@ AliTRDtracker::~AliTRDtracker()
     delete fSeeds;
   }
 
-  delete fGeom;  
+  if (fGeom) {
+    delete fGeom;  
+  }
 
   for (Int_t geomS = 0; geomS < kTrackingSectors; geomS++) {
     delete fTrSec[geomS];
@@ -264,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;
 
@@ -301,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:
@@ -340,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,-AliTracker::GetBz()*0.1);
-
-  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,-AliTracker::GetBz()*0.1);
-//   //
-
-//   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) 
 {
@@ -590,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 
@@ -649,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
@@ -725,7 +555,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
     /**/
     // inter-tracks competition ???
     if ((TMath::Abs(track->GetC() - p4) / TMath::Abs(p4) < 0.2) || 
-        (TMath::Abs(track->GetPt())                      > 0.8)) {
+        (track->Pt()                                     > 0.8)) {
       
       fHBackfit->Fill(4);
       
@@ -736,7 +566,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
       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());
@@ -745,7 +575,7 @@ 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)) {
+              (track->Pt()                <  1.5)) {
             UseClusters(track);
          }
        }
@@ -934,7 +764,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event)
 }
 
 //_____________________________________________________________________________
-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 
@@ -948,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;
   
@@ -997,18 +828,21 @@ 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);
@@ -1029,20 +863,29 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
       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;
 
   }   
@@ -1057,142 +900,149 @@ Int_t AliTRDtracker::RefitInward(AliESD *event)
 //_____________________________________________________________________________
 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--) {
+       //
+       // 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 row0    = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1);
-    Int_t rowlast = GetGlobalTimeBin(0,iplane,0);
+       Int_t    sector;
+       Int_t    lastplane = GetLastPlane(&t);
+       Double_t xx0 = 0.0;
+       Double_t xrho= 0.0;
+       Int_t    expectedNumberOfClusters = 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;
-      }
-    }
+       for (Int_t iplane = lastplane; iplane >= 0; iplane--) {
 
-    if (!AdjustSector(&t)) {
-      break;
-    }
+               Int_t row0    = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1);
+               Int_t rowlast = GetGlobalTimeBin(0,iplane,0);
 
-    //
-    // 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;
-    AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);       
-    rho       = param[0];
-    radLength = param[1]; // Get mean propagation parameters
-
-    //
-    // 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 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 (maxChi2<1e+10)
-           if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) {
-             // ????
-           }
-
-       }                       
-
-      }
-
-    } 
-
-  }
-
-  return expectedNumberOfClusters;  
-
+       return expectedNumberOfClusters;
 }                
 
 //_____________________________________________________________________________
@@ -1211,8 +1061,8 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
 
   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;
@@ -1281,9 +1131,9 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
     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
@@ -1336,7 +1186,7 @@ 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 (maxChi2<1e+10)
@@ -1344,7 +1194,8 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack &t)
              if (!t.Update(cl,maxChi2,index,h01)) {
                // ????
              }
-           }  
+           } // else SetCluster(cl, GetNumberOfClusters()-1); // A.Bercuci 25.07.07
+  
 
           if (calibra->GetMITracking()) {
             calibra->UpdateHistograms(cl,&t);
@@ -1417,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);
@@ -1463,13 +1314,12 @@ Int_t AliTRDtracker::LoadClusters(TTree *cTree)
     Int_t plane          = fGeom->GetPlane(detector);
     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; 
     }
@@ -1477,12 +1327,11 @@ 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);
+
   }
 
   return 0;
@@ -1525,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 
@@ -1578,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
@@ -2758,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;
@@ -3042,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)
-              / commonParam->GetSamplingFrequency();
+              / AliTRDCommonParam::Instance()->GetSamplingFrequency();
     rho       = 0.00295 * 0.85; //????
     radLength = 11.0;  
 
@@ -3453,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) {
@@ -3464,94 +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);
-    if (iPlane >= AliESDtrack::kNPlane) {
-      AliError(Form("Wrong plane %d",iPlane));
-      continue;
-    }
-    Int_t iSlice    = tb * AliESDtrack::kNSlice 
-                         / AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
-    if (iSlice >= AliESDtrack::kNSlice) {
-      AliError(Form("Wrong slice %d",iSlice));
-      continue;
-    }
-    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
@@ -3609,7 +3363,7 @@ 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) {
@@ -3732,7 +3486,7 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1
       fHFindCl[iCheckPoint]->Fill(checkPoint[iCheckPoint]);
 
     if (checkPoint[3]) {
-      if (track->GetPt() > 0) fHMinYPos->Fill(minY);
+      if (track->GetSignedPt() > 0) fHMinYPos->Fill(minY);
       else fHMinYNeg->Fill(minY);
 
     fHMinD->Fill(minD[0], minD[1]);
@@ -4228,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++) {
@@ -4318,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);
@@ -4328,7 +4087,7 @@ AliTRDtrack *AliTRDtracker::RegisterSeed(AliTRDseed *seeds, Double_t *params)
   }
   else {
     track->CookdEdx();
-    CookdEdxTimBin(*track);
+    track->CookdEdxTimBin(-1);
     CookLabel(track,0.9);
   }