]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackerV1.cxx
Make use of new method AliRawReader::GetNumberOfEvents() - goinf to the last event...
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackerV1.cxx
index 632aaec98d666fb505c7fd538f3f3c623ee65d13..3106e4db5a56acd8dc8f11040e4944d3582ff7aa 100644 (file)
@@ -80,8 +80,9 @@ TLinearFitter* AliTRDtrackerV1::fgTiltedRieman = 0x0;
 TLinearFitter* AliTRDtrackerV1::fgTiltedRiemanConstrained = 0x0;
 
 //____________________________________________________________________
-AliTRDtrackerV1::AliTRDtrackerV1() 
+AliTRDtrackerV1::AliTRDtrackerV1(AliTRDReconstructor *rec
   :AliTracker()
+  ,fReconstructor(rec)
   ,fGeom(new AliTRDgeometry())
   ,fClusters(0x0)
   ,fTracklets(0x0)
@@ -91,23 +92,24 @@ AliTRDtrackerV1::AliTRDtrackerV1()
   //
   // Default constructor.
   // 
-  if (!AliTRDcalibDB::Instance()) {
+  AliTRDcalibDB *trd = 0x0;
+  if (!(trd = AliTRDcalibDB::Instance())) {
     AliFatal("Could not get calibration object");
   }
-  if(!fgNTimeBins) fgNTimeBins = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
 
-  for (Int_t isector = 0; isector < AliTRDgeometry::kNsect; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
+  if(!fgNTimeBins) fgNTimeBins = trd->GetNumberOfTimeBins();
 
-  if (!AliTRDReconstructor::RecoParam()){
-       AliWarning("RecoParams not set in AliTRDReconstructor. Setting to default LowFluxParam.");
-    AliTRDReconstructor::SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
-  }
+  for (Int_t isector = 0; isector < AliTRDgeometry::kNsector; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
   
+  for(Int_t isl =0; isl<kNSeedPlanes; isl++) fSeedTB[isl] = 0x0;
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
-    TDirectory *savedir = gDirectory; 
-    fgDebugStreamer    = new TTreeSRedirector("TRD.TrackerDebug.root");
-    savedir->cd();
+  // Initialize debug stream
+  if(fReconstructor){
+    if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
+      TDirectory *savedir = gDirectory; 
+      fgDebugStreamer    = new TTreeSRedirector("TRD.TrackerDebug.root");
+      savedir->cd();
+    }
   }
 }
 
@@ -122,6 +124,7 @@ AliTRDtrackerV1::~AliTRDtrackerV1()
   if(fgRieman) delete fgRieman;
   if(fgTiltedRieman) delete fgTiltedRieman;
   if(fgTiltedRiemanConstrained) delete fgTiltedRiemanConstrained;
+  for(Int_t isl =0; isl<kNSeedPlanes; isl++) if(fSeedTB[isl]) delete fSeedTB[isl];
   if(fTracks) {fTracks->Delete(); delete fTracks;}
   if(fTracklets) {fTracklets->Delete(); delete fTracklets;}
   if(fClusters) {fClusters->Delete(); delete fClusters;}
@@ -146,14 +149,14 @@ Int_t AliTRDtrackerV1::Clusters2Tracks(AliESDEvent *esd)
   //    See AliTRDtrackerV1::Clusters2TracksSM() for details.
   //
 
-  if(!AliTRDReconstructor::RecoParam()){
+  if(!fReconstructor->GetRecoParam() ){
     AliError("Reconstruction configuration not initialized. Call first AliTRDReconstructor::SetRecoParam().");
     return 0;
   }
   
   //AliInfo("Start Track Finder ...");
   Int_t ntracks = 0;
-  for(int ism=0; ism<AliTRDgeometry::kNsect; ism++){
+  for(int ism=0; ism<AliTRDgeometry::kNsector; ism++){
     // for(int ism=1; ism<2; ism++){
     //AliInfo(Form("Processing supermodule %i ...", ism));
     ntracks += Clusters2TracksSM(ism, esd);
@@ -168,9 +171,8 @@ Bool_t AliTRDtrackerV1::GetTrackPoint(Int_t index, AliTrackPoint &p) const
 {
   //AliInfo(Form("Asking for tracklet %d", index));
   
-  if(index<0 || index == 0xffff) return kFALSE;
-  AliTRDseedV1 *tracklet = 0x0; 
-  if(!(tracklet = (AliTRDseedV1*)fTracklets->UncheckedAt(index))) return kFALSE;
+  AliTRDseedV1 *tracklet = GetTracklet(index); 
+  if (!tracklet) return kFALSE;
   
   // get detector for this tracklet
   AliTRDcluster *cl = 0x0;
@@ -188,7 +190,7 @@ Bool_t AliTRDtrackerV1::GetTrackPoint(Int_t index, AliTrackPoint &p) const
   
   // setting volume id
   AliGeomManager::ELayerID iLayer = AliGeomManager::kTRD1;
-  switch (fGeom->GetPlane(idet)) {
+  switch (fGeom->GetLayer(idet)) {
   case 0:
     iLayer = AliGeomManager::kTRD1;
     break;
@@ -208,7 +210,7 @@ Bool_t AliTRDtrackerV1::GetTrackPoint(Int_t index, AliTrackPoint &p) const
     iLayer = AliGeomManager::kTRD6;
     break;
   };
-  Int_t    modId = fGeom->GetSector(idet) * fGeom->Ncham() + fGeom->GetChamber(idet);
+  Int_t    modId = fGeom->GetSector(idet) * fGeom->Nstack() + fGeom->GetStack(idet);
   UShort_t volid = AliGeomManager::LayerToVolUID(iLayer, modId);
   p.SetVolumeID(volid);
     
@@ -232,7 +234,7 @@ TLinearFitter* AliTRDtrackerV1::GetTiltedRiemanFitterConstraint()
 //____________________________________________________________________ 
 AliRieman* AliTRDtrackerV1::GetRiemanFitter()
 {
-  if(!fgRieman) fgRieman = new AliRieman(AliTRDtrackingChamber::kNTimeBins * AliTRDgeometry::kNplan);
+  if(!fgRieman) fgRieman = new AliRieman(AliTRDtrackingChamber::kNTimeBins * AliTRDgeometry::kNlayer);
   return fgRieman;
 }
   
@@ -255,23 +257,21 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event)
   Int_t   found    = 0;     // number of tracks found
   Float_t foundMin = 20.0;
   
+  Float_t *quality = 0x0;
+  Int_t   *index   = 0x0;
   Int_t    nSeed   = event->GetNumberOfTracks();
-  if(!nSeed){
-    // run stand alone tracking
-    if (AliTRDReconstructor::RecoParam()->SeedingOn()) Clusters2Tracks(event);
-    return 0;
-  }
-  
-  Float_t *quality = new Float_t[nSeed];
-  Int_t   *index   = new Int_t[nSeed];
-  for (Int_t iSeed = 0; iSeed < nSeed; iSeed++) {
-    AliESDtrack *seed = event->GetTrack(iSeed);
-    Double_t covariance[15];
-    seed->GetExternalCovariance(covariance);
-    quality[iSeed] = covariance[0] + covariance[2];
+  if(nSeed){  
+    quality = new Float_t[nSeed];
+    index   = new Int_t[nSeed];
+    for (Int_t iSeed = 0; iSeed < nSeed; iSeed++) {
+      AliESDtrack *seed = event->GetTrack(iSeed);
+      Double_t covariance[15];
+      seed->GetExternalCovariance(covariance);
+      quality[iSeed] = covariance[0] + covariance[2];
+    }
+    // Sort tracks according to covariance of local Y and Z
+    TMath::Sort(nSeed,quality,index,kFALSE);
   }
-  // Sort tracks according to covariance of local Y and Z
-  TMath::Sort(nSeed,quality,index,kFALSE);
   
   // Backpropagate all seeds
   Int_t   expectedClr;
@@ -293,7 +293,12 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event)
     //track.SetSeedLabel(lbl);
     seed->UpdateTrackParams(&track, AliESDtrack::kTRDbackup); // Make backup
     Float_t p4          = track.GetC();
-    if((expectedClr = FollowBackProlongation(track))){
+    expectedClr = FollowBackProlongation(track);
+
+    if (expectedClr<0) continue; // Back prolongation failed
+
+    if(expectedClr){
+      found++;  
       // computes PID for track
       track.CookPID();
       // update calibration references using this track
@@ -305,7 +310,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event)
         track.UpdateESDtrack(seed);
         
         // Add TRD track to ESDfriendTrack
-        if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){ 
+        if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0 /*&& quality TODO*/){ 
           AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
           calibTrack->SetOwner();
           seed->AddCalibObject(calibTrack);
@@ -368,7 +373,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event)
       Double_t c2    = track.GetSnp() + track.GetC() * (xtof - track.GetX());
       if (TMath::Abs(c2) >= 0.99) continue;
       
-      PropagateToX(track, xTOF0, fgkMaxStep);
+      if (!PropagateToX(track, xTOF0, fgkMaxStep)) continue;
   
       // Energy losses taken to the account - check one more time
       c2 = track.GetSnp() + track.GetC() * (xtof - track.GetX());
@@ -392,41 +397,27 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event)
       if (track.PropagateTo(xtof)) {
         seed->UpdateTrackParams(&track, AliESDtrack::kTRDout);
         track.UpdateESDtrack(seed);
-        
-        // Add TRD track to ESDfriendTrack
-//                             if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){ 
-//                                     AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
-//                                     calibTrack->SetOwner();
-//                                     seed->AddCalibObject(calibTrack);
-//                             }
-        found++;
       }
     } else {                   
       if ((track.GetNumberOfClusters() > 15) && (track.GetNumberOfClusters() > 0.5*expectedClr)) {
         seed->UpdateTrackParams(&track, AliESDtrack::kTRDout);
   
         track.UpdateESDtrack(seed);
-        
-        // Add TRD track to ESDfriendTrack
-//                             if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){ 
-//                                     AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
-//                                     calibTrack->SetOwner();
-//                                     seed->AddCalibObject(calibTrack);
-//                             }
-        found++;
       }
     }
   
     seed->SetTRDQuality(track.StatusForTOF());
     seed->SetTRDBudget(track.GetBudget(0));
   }
+  if(index) delete [] index;
+  if(quality) delete [] quality;
   
 
   AliInfo(Form("Number of seeds: %d", nSeed));
   AliInfo(Form("Number of back propagated TRD tracks: %d", found));
       
-  delete [] index;
-  delete [] quality;
+  // run stand alone tracking
+  if (fReconstructor->IsSeeding()) Clusters2Tracks(event);
   
   return 0;
 }
@@ -488,7 +479,6 @@ Int_t AliTRDtrackerV1::RefitInward(AliESDEvent *event)
   return 0;
 }
 
-
 //____________________________________________________________________
 Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t)
 {
@@ -562,7 +552,7 @@ Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t)
     }
   }
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
     Int_t index;
     for(int iplane=0; iplane<6; iplane++){
       AliTRDseedV1 *tracklet = GetTracklet(&t, iplane, index);
@@ -616,38 +606,39 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
   
   AliTRDseedV1 tracklet, *ptrTracklet = 0x0;
 
-  // Loop through the TRD planes
-  for (Int_t iplane = 0; iplane < AliTRDgeometry::Nplan(); iplane++) {
+  // Loop through the TRD layers
+  for (Int_t ilayer = 0; ilayer < AliTRDgeometry::Nlayer(); ilayer++) {
     // BUILD TRACKLET IF NOT ALREADY BUILT
     Double_t x = 0., y, z, alpha;
-    ptrTracklet  = t.GetTracklet(iplane);
+    ptrTracklet  = t.GetTracklet(ilayer);
     if(!ptrTracklet){
-      ptrTracklet = new(&tracklet) AliTRDseedV1(iplane);
+      ptrTracklet = new(&tracklet) AliTRDseedV1(ilayer);
+      ptrTracklet->SetReconstructor(fReconstructor);
       alpha = t.GetAlpha();
-      Int_t sector = Int_t(alpha/AliTRDgeometry::GetAlpha() + (alpha>0. ? 0 : AliTRDgeometry::kNsect));
+      Int_t sector = Int_t(alpha/AliTRDgeometry::GetAlpha() + (alpha>0. ? 0 : AliTRDgeometry::kNsector));
 
       if(!fTrSec[sector].GetNChambers()) continue;
       
-      if((x = fTrSec[sector].GetX(iplane)) < 1.) continue;
+      if((x = fTrSec[sector].GetX(ilayer)) < 1.) continue;
     
-      if (!t.GetProlongation(x, y, z)) break;
-      Int_t stack = fGeom->GetChamber(z, iplane);
+      if (!t.GetProlongation(x, y, z)) return -nClustersExpected;
+      Int_t stack = fGeom->GetStack(z, ilayer);
       Int_t nCandidates = stack >= 0 ? 1 : 2;
       z -= stack >= 0 ? 0. : 4.; 
       
       for(int icham=0; icham<nCandidates; icham++, z+=8){
-        if((stack = fGeom->GetChamber(z, iplane)) < 0) continue;
+        if((stack = fGeom->GetStack(z, ilayer)) < 0) continue;
       
-        if(!(chamber = fTrSec[sector].GetChamber(stack, iplane))) continue;
+        if(!(chamber = fTrSec[sector].GetChamber(stack, ilayer))) continue;
       
-        if(chamber->GetNClusters() < fgNTimeBins*AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+        if(chamber->GetNClusters() < fgNTimeBins*fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
       
         x = chamber->GetX();
       
-        AliTRDpadPlane *pp = fGeom->GetPadPlane(iplane, stack);
+        AliTRDpadPlane *pp = fGeom->GetPadPlane(ilayer, stack);
         tracklet.SetTilt(TMath::Tan(-TMath::DegToRad()*pp->GetTiltingAngle()));
         tracklet.SetPadLength(pp->GetLengthIPad());
-        tracklet.SetPlane(iplane);
+        tracklet.SetPlane(ilayer);
         tracklet.SetX0(x);
         if(!tracklet.Init(&t)){
           t.SetStopped(kTRUE);
@@ -656,24 +647,24 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
         if(!tracklet.AttachClustersIter(chamber, 1000.)) continue;
         tracklet.Init(&t);
         
-        if(tracklet.GetN() < fgNTimeBins * AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+        if(tracklet.GetN() < fgNTimeBins*fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
       
         break;
       }
     }
     if(!ptrTracklet->IsOK()){
       if(x < 1.) continue; //temporary
-      if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) break;
-      if(!AdjustSector(&t)) break;
-      if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) break;
+      if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -nClustersExpected;
+      if(!AdjustSector(&t)) return -nClustersExpected;
+      if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -nClustersExpected;
       continue;
     }
     
     // Propagate closer to the current chamber if neccessary 
     x -= clength;
-    if (x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) break;
-    if (!AdjustSector(&t)) break;
-    if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) break;
+    if (x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -nClustersExpected;
+    if (!AdjustSector(&t)) return -nClustersExpected;
+    if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -nClustersExpected;
     
     // load tracklet to the tracker and the track
     ptrTracklet = SetTracklet(ptrTracklet);
@@ -686,7 +677,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
     t.GetXYZ(xyz0);
     alpha = t.GetAlpha();
     x = ptrTracklet->GetX0();
-    if (!t.GetProlongation(x, y, z)) break;
+    if (!t.GetProlongation(x, y, z)) return -nClustersExpected;
     Double_t xyz1[3]; // exit point
     xyz1[0] =  x * TMath::Cos(alpha) - y * TMath::Sin(alpha); 
     xyz1[1] = +x * TMath::Sin(alpha) + y * TMath::Cos(alpha);
@@ -698,15 +689,16 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
     Double_t xx0  = param[1]; // radiation length
     
     // Propagate and update track
-    t.PropagateTo(x, xx0, xrho);
-    if (!AdjustSector(&t)) break;
+    if (!t.PropagateTo(x, xx0, xrho)) return -nClustersExpected;
+    if (!AdjustSector(&t)) return -nClustersExpected;
     Double_t maxChi2 = t.GetPredictedChi2(ptrTracklet);
-    if (maxChi2<1e+10 && t.Update(ptrTracklet, maxChi2)){ 
+    if (!t.Update(ptrTracklet, maxChi2)) return -nClustersExpected;
+    if (maxChi2<1e+10) { 
       nClustersExpected += ptrTracklet->GetN();
       //t.SetTracklet(&tracklet, index);
     }
     // Reset material budget if 2 consecutive gold
-    if(iplane>0 && t.GetTracklet(iplane-1) && ptrTracklet->GetN() + t.GetTracklet(iplane-1)->GetN() > 20) t.SetBudget(2, 0.);
+    if(ilayer>0 && t.GetTracklet(ilayer-1) && ptrTracklet->GetN() + t.GetTracklet(ilayer-1)->GetN() > 20) t.SetBudget(2, 0.);
 
     // Make backup of the track until is gold
     // TO DO update quality check of the track.
@@ -729,9 +721,9 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
         (TMath::Abs(t.GetSnp())  <  0.85) &&
         (t.GetNumberOfClusters() >    20)) t.MakeBackupTrack();
     
-  } // end planes loop
+  } // end layers loop
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
     TTreeSRedirector &cstreamer = *fgDebugStreamer;
     Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
     //AliTRDtrackV1 *debugTrack = new AliTRDtrackV1(t);
@@ -855,15 +847,15 @@ Float_t AliTRDtrackerV1::FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Doub
   Float_t x, y, z, w, t, error, tilt;
   Double_t uvt[2];
   Int_t nPoints = 0;
-  for(Int_t ipl = 0; ipl < AliTRDgeometry::kNplan; ipl++){
-    if(!tracklets[ipl].IsOK()) continue;
+  for(Int_t ilr = 0; ilr < AliTRDgeometry::kNlayer; ilr++){
+    if(!tracklets[ilr].IsOK()) continue;
     for(Int_t itb = 0; itb < fgNTimeBins; itb++){
-      if(!tracklets[ipl].IsUsable(itb)) continue;
-      cl = tracklets[ipl].GetClusters(itb);
+      if(!tracklets[ilr].IsUsable(itb)) continue;
+      cl = tracklets[ilr].GetClusters(itb);
       x = cl->GetX();
       y = cl->GetY();
       z = cl->GetZ();
-      tilt = tracklets[ipl].GetTilt();
+      tilt = tracklets[ilr].GetTilt();
       // Transformation
       t = 1./(x * x + y * y);
       uvt[0] = 2. * x * t;
@@ -885,7 +877,7 @@ Float_t AliTRDtrackerV1::FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Doub
   for(Int_t ip = 0; ip < AliTRDtrackerV1::kNPlanes; ip++)
     tracklets[ip].SetCC(curvature);
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 5){
+/*  if(fReconstructor->GetStreamLevel() >= 5){
     //Linear Model on z-direction
     Double_t xref = CalculateReferenceX(tracklets);            // Relative to the middle of the stack
     Double_t slope = fitter->GetParameter(2);
@@ -902,7 +894,7 @@ Float_t AliTRDtrackerV1::FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Doub
     << "Chi2Z="                                                << chi2Z
     << "zref="                                         << zref
     << "\n";
-  }
+  }*/
   return chi2track;
 }
 
@@ -1057,7 +1049,7 @@ Float_t AliTRDtrackerV1::FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigErro
     tracklets[iLayer].SetChi2(chi2track);
   }
   
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
+/*  if(fReconstructor->GetStreamLevel() >=5){
     TTreeSRedirector &cstreamer = *fgDebugStreamer;
     Int_t eventNumber                  = AliTRDtrackerDebug::GetEventNumber();
     Int_t candidateNumber      = AliTRDtrackerDebug::GetCandidateNumber();
@@ -1068,7 +1060,7 @@ Float_t AliTRDtrackerV1::FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigErro
         << "xref="                                             << xref
         << "Chi2Z="                                            << chi2z
         << "\n";
-  }
+  }*/
   return chi2track;
 }
 
@@ -1289,7 +1281,7 @@ Double_t AliTRDtrackerV1::FitRiemanTilt(AliTRDtrackV1 *track, AliTRDseedV1 *trac
     }
   }
   
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
+/*  if(fReconstructor->GetStreamLevel() >=5){
     TTreeSRedirector &cstreamer = *fgDebugStreamer;
     Int_t eventNumber                  = AliTRDtrackerDebug::GetEventNumber();
     Int_t candidateNumber      = AliTRDtrackerDebug::GetCandidateNumber();
@@ -1300,7 +1292,7 @@ Double_t AliTRDtrackerV1::FitRiemanTilt(AliTRDtrackV1 *track, AliTRDseedV1 *trac
         << "xref="                                             << xref
         << "Chi2Z="                                            << chi2z
         << "\n";
-  }
+  }*/
   return chi2;
 }
 
@@ -1320,7 +1312,7 @@ Float_t AliTRDtrackerV1::CalculateChi2Z(AliTRDseedV1 *tracklets, Double_t offset
   // Output:     - The Chi2 value of the track in z-Direction
   //
   Float_t chi2Z = 0, nLayers = 0;
-  for (Int_t iLayer = 0; iLayer < AliTRDgeometry::kNplan; iLayer++) {
+  for (Int_t iLayer = 0; iLayer < AliTRDgeometry::kNlayer; iLayer++) {
     if(!tracklets[iLayer].IsOK()) continue;
     Double_t z = offset + slope * (tracklets[iLayer].GetX0() - xref);
     chi2Z += TMath::Abs(tracklets[iLayer].GetMeanz() - z);
@@ -1471,16 +1463,16 @@ Int_t AliTRDtrackerV1::LoadClusters(TTree *cTree)
     if(c->IsInChamber()) nin++;
     Int_t detector       = c->GetDetector();
     Int_t sector         = fGeom->GetSector(detector);
-    Int_t stack          = fGeom->GetChamber(detector);
-    Int_t plane          = fGeom->GetPlane(detector);
+    Int_t stack          = fGeom->GetStack(detector);
+    Int_t layer          = fGeom->GetLayer(detector);
     
-    fTrSec[sector].GetChamber(stack, plane, kTRUE)->InsertCluster(c, icl);
+    fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, icl);
   }
   AliInfo(Form("Clusters %d in %6.2f %%", ncl, 100.*float(nin)/ncl));
   
-  for(int isector =0; isector<AliTRDgeometry::kNsect; isector++){ 
+  for(int isector =0; isector<AliTRDgeometry::kNsector; isector++){ 
     if(!fTrSec[isector].GetNChambers()) continue;
-    fTrSec[isector].Init();
+    fTrSec[isector].Init(fReconstructor);
   }
   
   return 0;
@@ -1498,7 +1490,7 @@ void AliTRDtrackerV1::UnloadClusters()
   if(fTracklets) fTracklets->Delete();
   if(fClusters) fClusters->Delete();
 
-  for (int i = 0; i < AliTRDgeometry::kNsect; i++) fTrSec[i].Clear();
+  for (int i = 0; i < AliTRDgeometry::kNsector; i++) fTrSec[i].Clear();
 
   // Increment the Event Number
   AliTRDtrackerDebug::SetEventNumber(AliTRDtrackerDebug::GetEventNumber()  + 1);
@@ -1567,7 +1559,7 @@ AliTRDseedV1* AliTRDtrackerV1::SetTracklet(AliTRDseedV1 *tracklet)
   // and adds the new tracklet to the list.
   //
   if(!fTracklets){
-    fTracklets = new TClonesArray("AliTRDseedV1", AliTRDgeometry::Nsect()*kMaxTracksStack);
+    fTracklets = new TClonesArray("AliTRDseedV1", AliTRDgeometry::Nsector()*kMaxTracksStack);
     fTracklets->SetOwner(kTRUE);
   }
   Int_t nentries = fTracklets->GetEntriesFast();
@@ -1590,7 +1582,7 @@ AliTRDtrackV1* AliTRDtrackerV1::SetTrack(AliTRDtrackV1 *track)
   // and adds the new track to the list.
   //
   if(!fTracks){
-    fTracks = new TClonesArray("AliTRDtrackV1", AliTRDgeometry::Nsect()*kMaxTracksStack);
+    fTracks = new TClonesArray("AliTRDtrackV1", AliTRDgeometry::Nsector()*kMaxTracksStack);
     fTracks->SetOwner(kTRUE);
   }
   Int_t nentries = fTracks->GetEntriesFast();
@@ -1628,14 +1620,14 @@ Int_t AliTRDtrackerV1::Clusters2TracksSM(Int_t sector, AliESDEvent *esd)
   Int_t nTracks   = 0;
   Int_t nChambers = 0;
   AliTRDtrackingChamber **stack = 0x0, *chamber = 0x0;
-  for(int istack = 0; istack<AliTRDgeometry::kNcham; istack++){
+  for(int istack = 0; istack<AliTRDgeometry::kNstack; istack++){
     if(!(stack = fTrSec[sector].GetStack(istack))) continue;
     nChambers = 0;
-    for(int iplane=0; iplane<AliTRDgeometry::kNplan; iplane++){
-      if(!(chamber = stack[iplane])) continue;
-      if(chamber->GetNClusters() < fgNTimeBins * AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+    for(int ilayer=0; ilayer<AliTRDgeometry::kNlayer; ilayer++){
+      if(!(chamber = stack[ilayer])) continue;
+      if(chamber->GetNClusters() < fgNTimeBins * fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
       nChambers++;
-      //AliInfo(Form("sector %d stack %d plane %d clusters %d", sector, istack, iplane, chamber->GetNClusters()));
+      //AliInfo(Form("sector %d stack %d layer %d clusters %d", sector, istack, ilayer, chamber->GetNClusters()));
     }
     if(nChambers < 4) continue;
     //AliInfo(Form("Doing stack %d", istack));
@@ -1691,7 +1683,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
   
   // Build initial seeding configurations
   Double_t quality = BuildSeedingConfigs(stack, configs);
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
     AliInfo(Form("Plane config %d %d %d Quality %f"
     , configs[0], configs[1], configs[2], quality));
   }
@@ -1710,7 +1702,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
       ntracks = MakeSeeds(stack, &sseed[6*ntracks], pars);
       if(ntracks == kMaxTracksStack) break;
     }
-    if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1) AliInfo(Form("Candidate TRD tracks %d in iteration %d.", ntracks, fSieveSeeding));
+    if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1) AliInfo(Form("Candidate TRD tracks %d in iteration %d.", ntracks, fSieveSeeding));
     
     if(!ntracks) break;
     
@@ -1874,7 +1866,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
   Int_t ich = 0; while(!(chamber = stack[ich])) ich++;
   trackParams[6] = fGeom->GetSector(chamber->GetDetector());/* *alpha+shift;   // Supermodule*/
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
     AliInfo(Form("Track %d [%d] nlayers %d trackQuality = %e nused %d, yref = %3.3f", itrack, trackIndex, nlayers, fTrackQuality[trackIndex], nused, trackParams[1]));
           
     Int_t nclusters = 0;
@@ -1933,8 +1925,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
   esdTrack.SetLabel(track->GetLabel());
   track->UpdateESDtrack(&esdTrack);
   // write ESD-friends if neccessary
-  if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0){
-    //printf("Creating Calibrations Object\n");
+  if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0){
     AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(*track);
     calibTrack->SetOwner();
     esdTrack.AddCalibObject(calibTrack);
@@ -1954,14 +1945,14 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
 
     // Rebuild plane configurations and indices taking only unused clusters into account
     quality = BuildSeedingConfigs(stack, configs);
-    if(quality < 1.E-7) break; //AliTRDReconstructor::RecoParam()->GetPlaneQualityThreshold()) break;
+    if(quality < 1.E-7) break; //fReconstructor->GetRecoParam() ->GetPlaneQualityThreshold()) break;
     
     for(Int_t ip = 0; ip < kNPlanes; ip++){ 
       if(!(chamber = stack[ip])) continue;
       chamber->Build(fGeom);//Indices(fSieveSeeding);
     }
 
-    if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){ 
+    if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){ 
       AliInfo(Form("Sieve level %d Plane config %d %d %d Quality %f", fSieveSeeding, configs[0], configs[1], configs[2], quality));
     }
   } while(fSieveSeeding<10); // end stack clusters sieve
@@ -2096,7 +2087,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 *ss
   
   // Init chambers geometry
   Int_t ic = 0; while(!(chamber = stack[ic])) ic++;
-  Int_t istack = fGeom->GetChamber(chamber->GetDetector());
+  Int_t istack = fGeom->GetStack(chamber->GetDetector());
   Double_t hL[kNPlanes];       // Tilting angle
   Float_t padlength[kNPlanes]; // pad lenghts
   AliTRDpadPlane *pp = 0x0;
@@ -2106,17 +2097,16 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 *ss
     padlength[iplane] = pp->GetLengthIPad();
   }
   
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
     AliInfo(Form("Making seeds Stack[%d] Config[%d] Tracks[%d]...", istack, config, ntracks));
   }
 
+  ResetSeedTB();
   Int_t nlayers = 0;
-  AliTRDchamberTimeBin *layer[] = {0x0, 0x0, 0x0, 0x0};
   for(int isl=0; isl<kNSeedPlanes; isl++){ 
     if(!(chamber = stack[planes[isl]])) continue;
-    if(!(layer[isl] = chamber->GetSeedingLayer(fGeom))) continue;
+    if(!chamber->GetSeedingLayer(fSeedTB[isl], fGeom, fReconstructor)) continue;
     nlayers++;
-    //AliInfo(Form("seeding plane %d clusters %d", planes[isl], Int_t(*layer[isl])));
   }
   if(nlayers < 4) return 0;
   
@@ -2124,275 +2114,266 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 *ss
   // Start finding seeds
   Double_t cond0[4], cond1[4], cond2[4];
   Int_t icl = 0;
-  while((c[3] = (*layer[3])[icl++])){
+  while((c[3] = (*fSeedTB[3])[icl++])){
     if(!c[3]) continue;
-    layer[0]->BuildCond(c[3], cond0, 0);
-    layer[0]->GetClusters(cond0, index, ncl);
+    fSeedTB[0]->BuildCond(c[3], cond0, 0);
+    fSeedTB[0]->GetClusters(cond0, index, ncl);
     //printf("Found c[3] candidates 0 %d\n", ncl);
     Int_t jcl = 0;
     while(jcl<ncl) {
-      c[0] = (*layer[0])[index[jcl++]];
+      c[0] = (*fSeedTB[0])[index[jcl++]];
       if(!c[0]) continue;
       Double_t dx    = c[3]->GetX() - c[0]->GetX();
       Double_t theta = (c[3]->GetZ() - c[0]->GetZ())/dx;
       Double_t phi   = (c[3]->GetY() - c[0]->GetY())/dx;
-      layer[1]->BuildCond(c[0], cond1, 1, theta, phi);
-      layer[1]->GetClusters(cond1, jndex, mcl);
+      fSeedTB[1]->BuildCond(c[0], cond1, 1, theta, phi);
+      fSeedTB[1]->GetClusters(cond1, jndex, mcl);
       //printf("Found c[0] candidates 1 %d\n", mcl);
 
       Int_t kcl = 0;
       while(kcl<mcl) {
-  c[1] = (*layer[1])[jndex[kcl++]];
-  if(!c[1]) continue;
-  layer[2]->BuildCond(c[1], cond2, 2, theta, phi);
-  c[2] = layer[2]->GetNearestCluster(cond2);
-  //printf("Found c[1] candidate 2 %p\n", c[2]);
-  if(!c[2]) continue;
-        
-  //                           AliInfo("Seeding clusters found. Building seeds ...");
-  //                           for(Int_t i = 0; i < kNSeedPlanes; i++) printf("%i. coordinates: x = %6.3f, y = %6.3f, z = %6.3f\n", i, c[i]->GetX(), c[i]->GetY(), c[i]->GetZ());
-        
-  for (Int_t il = 0; il < 6; il++) cseed[il].Reset();
-
-  FitRieman(c, chi2);
-
-  AliTRDseedV1 *tseed = 0x0;
-  for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
-    Int_t jLayer = planes[iLayer];
-    tseed = &cseed[jLayer];
-    tseed->SetPlane(jLayer);
-    tseed->SetTilt(hL[jLayer]);
-    tseed->SetPadLength(padlength[jLayer]);
-    tseed->SetX0(stack[jLayer]->GetX());
-    tseed->Init(GetRiemanFitter());
-  }
-
-  Bool_t isFake = kFALSE;
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
-    if (c[0]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
-    if (c[1]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
-    if (c[2]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
-
-    Double_t xpos[4];
-    for(Int_t l = 0; l < kNSeedPlanes; l++) xpos[l] = layer[l]->GetX();
-    Float_t yref[4];
-    for(int il=0; il<4; il++) yref[il] = cseed[planes[il]].GetYref(0);
-    Int_t ll = c[3]->GetLabel(0);
-    Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
-    Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
-    AliRieman *rim = GetRiemanFitter();
-    TTreeSRedirector &cs0 = *fgDebugStreamer;
-    cs0 << "MakeSeeds0"
-        <<"EventNumber="               << eventNumber
-        <<"CandidateNumber="   << candidateNumber
-        <<"isFake="                            << isFake
-        <<"config="                            << config
-        <<"label="                             << ll
-        <<"chi2z="                             << chi2[0]
-        <<"chi2y="                             << chi2[1]
-        <<"Y2exp="                             << cond2[0]     
-        <<"Z2exp="                             << cond2[1]
-        <<"X0="                                        << xpos[0] //layer[sLayer]->GetX()
-        <<"X1="                                        << xpos[1] //layer[sLayer + 1]->GetX()
-        <<"X2="                                        << xpos[2] //layer[sLayer + 2]->GetX()
-        <<"X3="                                        << xpos[3] //layer[sLayer + 3]->GetX()
-        <<"yref0="                             << yref[0]
-        <<"yref1="                             << yref[1]
-        <<"yref2="                             << yref[2]
-        <<"yref3="                             << yref[3]
-        <<"c0.="                               << c[0]
-        <<"c1.="                               << c[1]
-        <<"c2.="                               << c[2]
-        <<"c3.="                               << c[3]
-        <<"Seed0.="                            << &cseed[planes[0]]
-        <<"Seed1.="                            << &cseed[planes[1]]
-        <<"Seed2.="                            << &cseed[planes[2]]
-        <<"Seed3.="                            << &cseed[planes[3]]
-        <<"RiemanFitter.="             << rim
-        <<"\n";
-  }
-
-  if(chi2[0] > AliTRDReconstructor::RecoParam()->GetChi2Z()/*7./(3. - sLayer)*//*iter*/){
-    //AliInfo(Form("Failed chi2 filter on chi2Z [%f].", chi2[0]));
-    AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-    continue;
-  }
-  if(chi2[1] > AliTRDReconstructor::RecoParam()->GetChi2Y()/*1./(3. - sLayer)*//*iter*/){
-    //AliInfo(Form("Failed chi2 filter on chi2Y [%f].", chi2[1]));
-    AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-    continue;
-  }
-  //AliInfo("Passed chi2 filter.");
-
-  // try attaching clusters to tracklets
-  Int_t nUsedCl = 0;
-  Int_t mlayers = 0;
-  for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
-    Int_t jLayer = planes[iLayer];
-    if(!cseed[jLayer].AttachClustersIter(stack[jLayer], 5., kFALSE, c[iLayer])) continue;
-    nUsedCl += cseed[jLayer].GetNUsed();
-    if(nUsedCl > 25) break;
-    mlayers++;
-  }
-  if(mlayers < kNSeedPlanes){ 
-    //AliInfo(Form("Failed updating all seeds %d [%d].", mlayers, kNSeedPlanes));
-    AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-    continue;
-  }
-  // fit tracklets and cook likelihood
-  FitTiltedRieman(&cseed[0], kTRUE);// Update Seeds and calculate Likelihood
-  chi2[0] = GetChi2Y(&cseed[0]);
-  chi2[1] = GetChi2Z(&cseed[0]);
-  //Chi2 definitions in testing stage
-  //chi2[0] = GetChi2YTest(&cseed[0]);
-  //chi2[1] = GetChi2ZTest(&cseed[0]);
-  Double_t like = CookLikelihood(&cseed[0], planes, chi2); // to be checked
-
-  if (TMath::Log(1.E-9 + like) < AliTRDReconstructor::RecoParam()->GetTrackLikelihood()){
-    //AliInfo(Form("Failed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
-    AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-    continue;
-  }
-  //AliInfo(Form("Passed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
-
-  // book preliminary results
-  seedQuality[ntracks] = like;
-  fSeedLayer[ntracks]  = config;/*sLayer;*/
-
-  // attach clusters to the extrapolation seeds
-  Int_t lextrap[2];
-  GetExtrapolationConfig(config, lextrap);
-  Int_t nusedf   = 0; // debug value
-  for(int iLayer=0; iLayer<2; iLayer++){
-    Int_t jLayer = lextrap[iLayer];
-    if(!(chamber = stack[jLayer])) continue;
-            
-    // prepare extrapolated seed
-    cseed[jLayer].Reset();
-    cseed[jLayer].SetPlane(jLayer);
-    cseed[jLayer].SetTilt(hL[jLayer]);
-    cseed[jLayer].SetX0(chamber->GetX());
-    cseed[jLayer].SetPadLength(padlength[jLayer]);
-
-    // fit extrapolated seed
-    if ((jLayer == 0) && !(cseed[1].IsOK())) continue;
-    if ((jLayer == 5) && !(cseed[4].IsOK())) continue;
-    AliTRDseedV1 pseed = cseed[jLayer];
-    if(!pseed.AttachClustersIter(chamber, 1000.)) continue;
-    cseed[jLayer] = pseed;
-    nusedf += cseed[jLayer].GetNUsed(); // debug value
-    FitTiltedRieman(cseed,  kTRUE);
-  }
-
-  // AliInfo("Extrapolation done.");
-  // Debug Stream containing all the 6 tracklets
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
-    TTreeSRedirector &cstreamer = *fgDebugStreamer;
-    TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
-    Int_t eventNumber          = AliTRDtrackerDebug::GetEventNumber();
-    Int_t candidateNumber      = AliTRDtrackerDebug::GetCandidateNumber();
-    cstreamer << "MakeSeeds1"
-        << "EventNumber="              << eventNumber
-        << "CandidateNumber="  << candidateNumber
-        << "S0.="                              << &cseed[0]
-        << "S1.="                              << &cseed[1]
-        << "S2.="                              << &cseed[2]
-        << "S3.="                              << &cseed[3]
-        << "S4.="                              << &cseed[4]
-        << "S5.="                              << &cseed[5]
-        << "FitterT.="                 << tiltedRieman
-        << "\n";
-  }
-        
-  if(ImproveSeedQuality(stack, cseed) < 4){
-    AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-    continue;
-  }
-  //AliInfo("Improve seed quality done.");
-
-  // fit full track and cook likelihoods
-  //                           Double_t curv = FitRieman(&cseed[0], chi2);
-  //                           Double_t chi2ZF = chi2[0] / TMath::Max((mlayers - 3.), 1.);
-  //                           Double_t chi2RF = chi2[1] / TMath::Max((mlayers - 3.), 1.);
-
-  // do the final track fitting (Once with vertex constraint and once without vertex constraint)
-  Double_t chi2Vals[3];
-  chi2Vals[0] = FitTiltedRieman(&cseed[0], kFALSE);
-  if(AliTRDReconstructor::RecoParam()->IsVertexConstrained())
-       chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ()); // Do Vertex Constrained fit if desired
-  else
-       chi2Vals[1] = 1.;
-  chi2Vals[2] = GetChi2Z(&cseed[0]) / TMath::Max((mlayers - 3.), 1.);
-  // Chi2 definitions in testing stage
-  //chi2Vals[2] = GetChi2ZTest(&cseed[0]);
-  fTrackQuality[ntracks] = CalculateTrackLikelihood(&cseed[0], &chi2Vals[0]);
-  //AliInfo("Hyperplane fit done\n");
-
-  // finalize tracklets
-  Int_t labels[12];
-  Int_t outlab[24];
-  Int_t nlab = 0;
-  for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
-    if (!cseed[iLayer].IsOK()) continue;
-
-    if (cseed[iLayer].GetLabels(0) >= 0) {
-      labels[nlab] = cseed[iLayer].GetLabels(0);
-      nlab++;
-    }
-
-    if (cseed[iLayer].GetLabels(1) >= 0) {
-      labels[nlab] = cseed[iLayer].GetLabels(1);
-      nlab++;
-    }
-  }
-  Freq(nlab,labels,outlab,kFALSE);
-  Int_t label     = outlab[0];
-  Int_t frequency = outlab[1];
-  for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
-    cseed[iLayer].SetFreq(frequency);
-    cseed[iLayer].SetChi2Z(chi2[1]);
-  }
+        c[1] = (*fSeedTB[1])[jndex[kcl++]];
+        if(!c[1]) continue;
+        fSeedTB[2]->BuildCond(c[1], cond2, 2, theta, phi);
+        c[2] = fSeedTB[2]->GetNearestCluster(cond2);
+        //printf("Found c[1] candidate 2 %p\n", c[2]);
+        if(!c[2]) continue;
+              
+        //                             AliInfo("Seeding clusters found. Building seeds ...");
+        //                             for(Int_t i = 0; i < kNSeedPlanes; i++) printf("%i. coordinates: x = %6.3f, y = %6.3f, z = %6.3f\n", i, c[i]->GetX(), c[i]->GetY(), c[i]->GetZ());
+              
+        for (Int_t il = 0; il < 6; il++) cseed[il].Reset();
       
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
-    TTreeSRedirector &cstreamer = *fgDebugStreamer;
-    Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
-    Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
-    TLinearFitter *fitterTC = GetTiltedRiemanFitterConstraint();
-    TLinearFitter *fitterT = GetTiltedRiemanFitter();
-    cstreamer << "MakeSeeds2"
-        << "EventNumber="              << eventNumber
-        << "CandidateNumber="  << candidateNumber
-        << "Chi2TR="                   << chi2Vals[0]
-        << "Chi2TC="                   << chi2Vals[1]
-        << "Nlayers="                  << mlayers
-        << "NUsedS="                   << nUsedCl
-        << "NUsed="                            << nusedf
-        << "Like="                             << like
-        << "S0.="                              << &cseed[0]
-        << "S1.="                              << &cseed[1]
-        << "S2.="                              << &cseed[2]
-        << "S3.="                              << &cseed[3]
-        << "S4.="                              << &cseed[4]
-        << "S5.="                              << &cseed[5]
-        << "Label="                            << label
-        << "Freq="                             << frequency
-        << "FitterT.="                 << fitterT
-        << "FitterTC.="                        << fitterTC
-        << "\n";
-  }
-        
-  ntracks++;
-  AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
-  if(ntracks == kMaxTracksStack){
-    AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
-    for(int isl=0; isl<4; isl++) delete layer[isl];
-    return ntracks;
-  }
-  cseed += 6;
+        FitRieman(c, chi2);
+      
+        AliTRDseedV1 *tseed = 0x0;
+        for(int iLayer=0; iLayer<kNPlanes; iLayer++){
+          tseed = &cseed[iLayer];
+          tseed->SetPlane(iLayer);
+          tseed->SetTilt(hL[iLayer]);
+          tseed->SetPadLength(padlength[iLayer]);
+          tseed->SetReconstructor(fReconstructor);
+          if(stack[iLayer])tseed->SetX0(stack[iLayer]->GetX());
+          tseed->Init(GetRiemanFitter());
+        }
+      
+        Bool_t isFake = kFALSE;
+        if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+          if (c[0]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+          if (c[1]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+          if (c[2]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+      
+          Double_t xpos[4];
+          for(Int_t l = 0; l < kNSeedPlanes; l++) xpos[l] = fSeedTB[l]->GetX();
+          Float_t yref[4];
+          for(int il=0; il<4; il++) yref[il] = cseed[planes[il]].GetYref(0);
+          Int_t ll = c[3]->GetLabel(0);
+          Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+          Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+          AliRieman *rim = GetRiemanFitter();
+          TTreeSRedirector &cs0 = *fgDebugStreamer;
+          cs0 << "MakeSeeds0"
+              <<"EventNumber="         << eventNumber
+              <<"CandidateNumber="     << candidateNumber
+              <<"isFake="                              << isFake
+              <<"config="                              << config
+              <<"label="                               << ll
+              <<"chi2z="                               << chi2[0]
+              <<"chi2y="                               << chi2[1]
+              <<"Y2exp="                               << cond2[0]     
+              <<"Z2exp="                               << cond2[1]
+              <<"X0="                                  << xpos[0] //layer[sLayer]->GetX()
+              <<"X1="                                  << xpos[1] //layer[sLayer + 1]->GetX()
+              <<"X2="                                  << xpos[2] //layer[sLayer + 2]->GetX()
+              <<"X3="                                  << xpos[3] //layer[sLayer + 3]->GetX()
+              <<"yref0="                               << yref[0]
+              <<"yref1="                               << yref[1]
+              <<"yref2="                               << yref[2]
+              <<"yref3="                               << yref[3]
+              <<"c0.="                         << c[0]
+              <<"c1.="                         << c[1]
+              <<"c2.="                         << c[2]
+              <<"c3.="                         << c[3]
+              <<"Seed0.="                              << &cseed[planes[0]]
+              <<"Seed1.="                              << &cseed[planes[1]]
+              <<"Seed2.="                              << &cseed[planes[2]]
+              <<"Seed3.="                              << &cseed[planes[3]]
+              <<"RiemanFitter.="               << rim
+              <<"\n";
+        }
+      
+        if(chi2[0] > fReconstructor->GetRecoParam() ->GetChi2Z()/*7./(3. - sLayer)*//*iter*/){
+          //AliInfo(Form("Failed chi2 filter on chi2Z [%f].", chi2[0]));
+          AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+          continue;
+        }
+        if(chi2[1] > fReconstructor->GetRecoParam() ->GetChi2Y()/*1./(3. - sLayer)*//*iter*/){
+          //AliInfo(Form("Failed chi2 filter on chi2Y [%f].", chi2[1]));
+          AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+          continue;
+        }
+        //AliInfo("Passed chi2 filter.");
+      
+        // try attaching clusters to tracklets
+        Int_t nUsedCl = 0;
+        Int_t mlayers = 0;
+        for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
+          Int_t jLayer = planes[iLayer];
+          if(!cseed[jLayer].AttachClustersIter(stack[jLayer], 5., kFALSE, c[iLayer])) continue;
+          nUsedCl += cseed[jLayer].GetNUsed();
+          if(nUsedCl > 25) break;
+          mlayers++;
+        }
+        if(mlayers < kNSeedPlanes){ 
+          //AliInfo(Form("Failed updating all seeds %d [%d].", mlayers, kNSeedPlanes));
+          AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+          continue;
+        }
+        // fit tracklets and cook likelihood
+        FitTiltedRieman(&cseed[0], kTRUE);// Update Seeds and calculate Likelihood
+        chi2[0] = GetChi2Y(&cseed[0]);
+        chi2[1] = GetChi2Z(&cseed[0]);
+        //Chi2 definitions in testing stage
+        //chi2[0] = GetChi2YTest(&cseed[0]);
+        //chi2[1] = GetChi2ZTest(&cseed[0]);
+        Double_t like = CookLikelihood(&cseed[0], planes, chi2); // to be checked
+      
+        if (TMath::Log(1.E-9 + like) < fReconstructor->GetRecoParam() ->GetTrackLikelihood()){
+          //AliInfo(Form("Failed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
+          AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+          continue;
+        }
+        //AliInfo(Form("Passed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
+      
+        // book preliminary results
+        seedQuality[ntracks] = like;
+        fSeedLayer[ntracks]  = config;/*sLayer;*/
+      
+        // attach clusters to the extrapolation seeds
+        Int_t lextrap[2];
+        GetExtrapolationConfig(config, lextrap);
+        Int_t nusedf   = 0; // debug value
+        for(int iLayer=0; iLayer<2; iLayer++){
+          Int_t jLayer = lextrap[iLayer];
+          if(!(chamber = stack[jLayer])) continue;
+      
+          // fit extrapolated seed
+          if ((jLayer == 0) && !(cseed[1].IsOK())) continue;
+          if ((jLayer == 5) && !(cseed[4].IsOK())) continue;
+          AliTRDseedV1 pseed = cseed[jLayer];
+          if(!pseed.AttachClustersIter(chamber, 1000.)) continue;
+          cseed[jLayer] = pseed;
+          nusedf += cseed[jLayer].GetNUsed(); // debug value
+          FitTiltedRieman(cseed,  kTRUE);
+        }
+      
+        // AliInfo("Extrapolation done.");
+        // Debug Stream containing all the 6 tracklets
+        if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+          TTreeSRedirector &cstreamer = *fgDebugStreamer;
+          TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
+          Int_t eventNumber            = AliTRDtrackerDebug::GetEventNumber();
+          Int_t candidateNumber        = AliTRDtrackerDebug::GetCandidateNumber();
+          cstreamer << "MakeSeeds1"
+              << "EventNumber="                << eventNumber
+              << "CandidateNumber="    << candidateNumber
+              << "S0.="                                << &cseed[0]
+              << "S1.="                                << &cseed[1]
+              << "S2.="                                << &cseed[2]
+              << "S3.="                                << &cseed[3]
+              << "S4.="                                << &cseed[4]
+              << "S5.="                                << &cseed[5]
+              << "FitterT.="                   << tiltedRieman
+              << "\n";
+        }
+              
+        if(ImproveSeedQuality(stack, cseed) < 4){
+          AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+          continue;
+        }
+        //AliInfo("Improve seed quality done.");
+      
+        // fit full track and cook likelihoods
+        //                             Double_t curv = FitRieman(&cseed[0], chi2);
+        //                             Double_t chi2ZF = chi2[0] / TMath::Max((mlayers - 3.), 1.);
+        //                             Double_t chi2RF = chi2[1] / TMath::Max((mlayers - 3.), 1.);
+      
+        // do the final track fitting (Once with vertex constraint and once without vertex constraint)
+        Double_t chi2Vals[3];
+        chi2Vals[0] = FitTiltedRieman(&cseed[0], kFALSE);
+        if(fReconstructor->GetRecoParam() ->IsVertexConstrained())
+          chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ()); // Do Vertex Constrained fit if desired
+        else
+          chi2Vals[1] = 1.;
+        chi2Vals[2] = GetChi2Z(&cseed[0]) / TMath::Max((mlayers - 3.), 1.);
+        // Chi2 definitions in testing stage
+        //chi2Vals[2] = GetChi2ZTest(&cseed[0]);
+        fTrackQuality[ntracks] = CalculateTrackLikelihood(&cseed[0], &chi2Vals[0]);
+        //AliInfo("Hyperplane fit done\n");
+      
+        // finalize tracklets
+        Int_t labels[12];
+        Int_t outlab[24];
+        Int_t nlab = 0;
+        for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+          if (!cseed[iLayer].IsOK()) continue;
+      
+          if (cseed[iLayer].GetLabels(0) >= 0) {
+            labels[nlab] = cseed[iLayer].GetLabels(0);
+            nlab++;
+          }
+      
+          if (cseed[iLayer].GetLabels(1) >= 0) {
+            labels[nlab] = cseed[iLayer].GetLabels(1);
+            nlab++;
+          }
+        }
+        Freq(nlab,labels,outlab,kFALSE);
+        Int_t label     = outlab[0];
+        Int_t frequency = outlab[1];
+        for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+          cseed[iLayer].SetFreq(frequency);
+          cseed[iLayer].SetChi2Z(chi2[1]);
+        }
+            
+        if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+          TTreeSRedirector &cstreamer = *fgDebugStreamer;
+          Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+          Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+          TLinearFitter *fitterTC = GetTiltedRiemanFitterConstraint();
+          TLinearFitter *fitterT = GetTiltedRiemanFitter();
+          cstreamer << "MakeSeeds2"
+              << "EventNumber="                << eventNumber
+              << "CandidateNumber="    << candidateNumber
+              << "Chi2TR="                     << chi2Vals[0]
+              << "Chi2TC="                     << chi2Vals[1]
+              << "Nlayers="                    << mlayers
+              << "NUsedS="                     << nUsedCl
+              << "NUsed="                              << nusedf
+              << "Like="                               << like
+              << "S0.="                                << &cseed[0]
+              << "S1.="                                << &cseed[1]
+              << "S2.="                                << &cseed[2]
+              << "S3.="                                << &cseed[3]
+              << "S4.="                                << &cseed[4]
+              << "S5.="                                << &cseed[5]
+              << "Label="                              << label
+              << "Freq="                               << frequency
+              << "FitterT.="                   << fitterT
+              << "FitterTC.="                  << fitterTC
+              << "\n";
+        }
+              
+        ntracks++;
+        AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+        if(ntracks == kMaxTracksStack){
+          AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
+          return ntracks;
+        }
+        cseed += 6;
       }
     }
   }
-  for(int isl=0; isl<4; isl++) delete layer[isl];
   
   return ntracks;
 }
@@ -2483,7 +2464,7 @@ Int_t AliTRDtrackerV1::ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDs
     Int_t   sortindexes[6];
 
     for (Int_t jLayer = 0; jLayer < 6; jLayer++) {
-      squality[jLayer]  = bseed[jLayer].IsOK() ? bseed[jLayer].GetQuality(kTRUE) : -1.;
+      squality[jLayer]  = bseed[jLayer].IsOK() ? bseed[jLayer].GetQuality(kTRUE) : 1000.;
       sumquality += squality[jLayer];
     }
     if ((sumquality >= lastquality) || (chi2       >     lastchi2)) break;
@@ -2502,7 +2483,7 @@ Int_t AliTRDtrackerV1::ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDs
     }
 
     chi2 = FitTiltedRieman(bseed, kTRUE);
-    if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 7){
+    if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 7){
       Int_t eventNumber                = AliTRDtrackerDebug::GetEventNumber();
       Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
       TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
@@ -2555,13 +2536,13 @@ Double_t AliTRDtrackerV1::CalculateTrackLikelihood(AliTRDseedV1 *tracklets, Doub
   sumdaf /= Float_t (nLayers - 2.0);
   
   Double_t likeChi2Z  = TMath::Exp(-chi2[2] * 0.14);                   // Chi2Z 
-  Double_t likeChi2TC = (AliTRDReconstructor::RecoParam()->IsVertexConstrained()) ? 
+  Double_t likeChi2TC = (fReconstructor->GetRecoParam() ->IsVertexConstrained()) ? 
                                                                                        TMath::Exp(-chi2[1] * 0.677) : 1;                       // Constrained Tilted Riemann
   Double_t likeChi2TR = TMath::Exp(-chi2[0] * 0.78);                   // Non-constrained Tilted Riemann
   Double_t likeAF     = TMath::Exp(-sumdaf * 3.23);
   Double_t trackLikelihood     = likeChi2Z * likeChi2TR * likeAF;
 
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
     Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
     Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
     TTreeSRedirector &cstreamer = *fgDebugStreamer;
@@ -2608,7 +2589,7 @@ Double_t AliTRDtrackerV1::CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]
   //
 
   // ratio of the total number of clusters/track which are expected to be found by the tracker.
-  Float_t fgFindable = AliTRDReconstructor::RecoParam()->GetFindableClusters();
+  Float_t fgFindable = fReconstructor->GetRecoParam() ->GetFindableClusters();
 
   
   Int_t nclusters = 0;
@@ -2628,7 +2609,7 @@ Double_t AliTRDtrackerV1::CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]
   Double_t like      = likea * likechi2y * likechi2z * likeN;
 
   //   AliInfo(Form("sumda(%f) chi2[0](%f) chi2[1](%f) likea(%f) likechi2y(%f) likechi2z(%f) nclusters(%d) likeN(%f)", sumda, chi2[0], chi2[1], likea, likechi2y, likechi2z, nclusters, likeN));
-  if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
+  if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
     Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
     Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
     // The Debug Stream contains the seed 
@@ -2884,21 +2865,21 @@ void AliTRDtrackerV1::GetExtrapolationConfig(Int_t iconfig, Int_t planes[2])
 AliCluster* AliTRDtrackerV1::GetCluster(Int_t idx) const
 {
   Int_t ncls = fClusters->GetEntriesFast();
-  return idx >= 0 || idx < ncls ? (AliCluster*)fClusters->UncheckedAt(idx) : 0x0;
+  return idx >= 0 && idx < ncls ? (AliCluster*)fClusters->UncheckedAt(idx) : 0x0;
 }
 
 //____________________________________________________________________
 AliTRDseedV1* AliTRDtrackerV1::GetTracklet(Int_t idx) const
 {
   Int_t ntrklt = fTracklets->GetEntriesFast();
-  return idx >= 0 || idx < ntrklt ? (AliTRDseedV1*)fTracklets->UncheckedAt(idx) : 0x0;
+  return idx >= 0 && idx < ntrklt ? (AliTRDseedV1*)fTracklets->UncheckedAt(idx) : 0x0;
 }
 
 //____________________________________________________________________
 AliKalmanTrack* AliTRDtrackerV1::GetTrack(Int_t idx) const
 {
   Int_t ntrk = fTracks->GetEntriesFast();
-  return idx >= 0 || idx < ntrk ? (AliKalmanTrack*)fTracks->UncheckedAt(idx) : 0x0;
+  return idx >= 0 && idx < ntrk ? (AliKalmanTrack*)fTracks->UncheckedAt(idx) : 0x0;
 }
 
 //____________________________________________________________________
@@ -3013,6 +2994,14 @@ Int_t AliTRDtrackerV1::Freq(Int_t n, const Int_t *inlist
 
 }
 
+void AliTRDtrackerV1::SetReconstructor(const AliTRDReconstructor *rec){
+       fReconstructor = rec;
+       if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
+               if(!fgDebugStreamer)
+                       fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
+       }       
+}
+
 //_____________________________________________________________________________
 Float_t AliTRDtrackerV1::GetChi2Y(AliTRDseedV1 *tracklets) const
 {
@@ -3027,6 +3016,18 @@ Float_t AliTRDtrackerV1::GetChi2Y(AliTRDseedV1 *tracklets) const
   return chi2;
 }
 
+//____________________________________________________________________
+void AliTRDtrackerV1::ResetSeedTB()
+{
+// reset buffer for seeding time bin layers. If the time bin 
+// layers are not allocated this function allocates them  
+
+  for(Int_t isl=0; isl<kNSeedPlanes; isl++){
+    if(!fSeedTB[isl]) fSeedTB[isl] = new AliTRDchamberTimeBin();
+    else fSeedTB[isl]->Clear();
+  }
+}
+
 //_____________________________________________________________________________
 Float_t AliTRDtrackerV1::GetChi2Z(AliTRDseedV1 *tracklets) const 
 {