]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrigger.cxx
New version of SPD raw-data reconstruction. The format now correponds to the actual...
[u/mrichter/AliRoot.git] / TRD / AliTRDtrigger.cxx
index c66342ced43d97be5ccfb3c57a4b4bde86f4dc47..4f01dfaef3ed34f108bededc427fdf54a2c7e99b 100644 (file)
 //                                                                           //
 //  TRD trigger class                                                        //
 //                                                                           //
-///////////////////////////////////////////////////////////////////////////////
-
-#include <TTree.h>
-#include <TBranch.h>
-#include <TMatrixD.h>
-
-#include "AliLog.h"
-#include "AliRun.h"
-#include "AliRunLoader.h"
-#include "AliLoader.h"
-#include "AliHeader.h"
-#include "AliRawReader.h"
-
-#include "AliTRDdigitsManager.h"
-#include "AliTRDgeometry.h"
-#include "AliTRDdataArrayI.h"
-#include "AliTRDcalibDB.h"
-#include "AliTRDCommonParam.h"
-#include "Cal/AliTRDCalPIDLQ.h"
-#include "AliTRDrawData.h"
-
-#include "AliTRDtrigger.h"
-#include "AliTRDmcmTracklet.h"
-#include "AliTRDtrigParam.h"
-#include "AliTRDmcm.h"
-
-ClassImp(AliTRDtrigger)
-ClassImp(AliTRDltuTracklet)
-ClassImp(AliTRDgtuTrack)
-ClassImp(AliTRDmodule)
-
-//_____________________________________________________________________________
-AliTRDltuTracklet::AliTRDltuTracklet(Int_t det, 
-                                    Int_t row, 
-                                    Float_t rowz,
-                                    Float_t slope, 
-                                    Float_t offset, 
-                                    Float_t time, 
-                                    Int_t ncl,
-                                    Int_t label,
-                                    Float_t q) 
-{
-  //
-  // AliTRDltuTracklet constructor
-  //
-
-  fDetector  = det;
-  fRow       = row;
-  fRowz      = rowz;
-  fSlope     = slope;
-  fX         = time;
-  fY         = offset;
-  fNclusters = ncl;
-  fLabel     = label;
-  fQ         = q;
-
-}
-
-//_____________________________________________________________________________
-Float_t AliTRDltuTracklet::GetPt(Float_t field)
-{
-  // transverse momentum calculation
-  // curvature R = (fX*fX + fY*fY) / (2 * sin(alpha))
-  // alpha = angle deviation from "infinite momentum"
-  //
-  // consistent with AliTRDmcmTracklet::GetPt(...)
-
-  Float_t InfSlope = TMath::ATan(fY/fX)/TMath::Pi()*180.0;    
-  Float_t alpha = fSlope - InfSlope;
-  Float_t R = TMath::Sqrt(fX*fX + fY*fY)/(2.0*TMath::Sin(alpha/180.0*TMath::Pi()));
-  
-  Float_t Pt = 0.3 * field * 0.01 * R;
-  return Pt;
-}
-
-//_____________________________________________________________________________
-Int_t AliTRDltuTracklet::Compare(const TObject * o) const
-{
-  //
-  // compare two LTU tracklets according to the intercept point Y1
-  //
-
-  AliTRDltuTracklet *ltutrk = (AliTRDltuTracklet*)o;
-
-  if (fRow      != ltutrk->fRow)      return +1;
-  if (fDetector != ltutrk->fDetector) return +1;
-
-  if (fY <  ltutrk->fY) return -1;
-  if (fY == ltutrk->fY) return  0;
-
-  return 1;
-
-}
-
-//_____________________________________________________________________________
-Float_t AliTRDltuTracklet::GetYproj(Float_t xpl)
-{
-
-  Float_t Yproj;
-
-  Yproj = fY + TMath::Tan(fSlope/180.0*TMath::Pi()) * (xpl - fX);
-
-  return Yproj;
-
-}
-
-//_____________________________________________________________________________
-Float_t AliTRDltuTracklet::GetZproj(Float_t xpl)
-{
-
-  Float_t Zproj;
-
-  Zproj = fRowz * xpl / fX;
-
-  return Zproj;
-
-}
-
-//_____________________________________________________________________________
-AliTRDgtuTrack::AliTRDgtuTrack()
-{
-
-  fYproj = 0.0;
-  fZproj = 0.0;
-  fSlope = 0.0;
-  fDetector = -1;
-  fNtracklets = 0;
-  fNplanes = 0;
-  fNclusters = 0;
-  fPt = 0.0;
-  fPhi = 0.0;
-  fEta = 0.0;
-  fLabel = -1;
-  fPID = 0.0;
-  fIsElectron = kFALSE;
-
-  fTracklets = new TObjArray(400);
-
-}
-
-//_____________________________________________________________________________
-AliTRDgtuTrack::AliTRDgtuTrack(const AliTRDgtuTrack& track):
-  TObject(track),
-  fYproj(track.fYproj),
-  fZproj(track.fZproj),
-  fSlope(track.fSlope),
-  fDetector(track.fDetector),
-  fNtracklets(track.fNtracklets),
-  fNplanes(track.fNplanes),
-  fNclusters(track.fNclusters),
-  fPt(track.fPt),
-  fPhi(track.fPhi),
-  fEta(track.fEta),
-  fLabel(track.fLabel),
-  fPID(track.fPID),
-  fIsElectron(track.fIsElectron)
-{
-  //
-  // copy contructor
-  //
-
-  fTracklets = NULL;
-
-}
-
-//_____________________________________________________________________________
-void AliTRDgtuTrack::AddTracklet(AliTRDltuTracklet *trk)
-{
-
-  Tracklets()->Add(trk);
-
-}
-
-//_____________________________________________________________________________
-AliTRDltuTracklet* AliTRDgtuTrack::GetTracklet(Int_t pos)
-{
-
-  if (fTracklets == 0) return 0;
-  void * trk = fTracklets->UncheckedAt(pos);
-  if (trk == 0) return 0;
-
-  return (AliTRDltuTracklet*)trk;
-
-}
-
-//_____________________________________________________________________________
-Int_t AliTRDgtuTrack::Compare(const TObject * o) const
-{
-
-  AliTRDgtuTrack *gtutrack = (AliTRDgtuTrack*)o;
-
-  if (fYproj <  gtutrack->GetYproj()) return -1;
-  if (fYproj == gtutrack->GetYproj()) return  0;
-
-  return +1;
-
-}
-
-//_____________________________________________________________________________
-void AliTRDgtuTrack::Reset()
-{
-
-  fYproj = 0.0;
-  fZproj = 0.0;
-  fSlope = 0.0;
-  fDetector = -1;
-  fNtracklets = 0;
-  fNplanes = 0;
-  fNclusters = 0;
-  fPt = 0.0;
-  fPhi = 0.0;
-  fEta = 0.0;
-  fLabel = -1;
-  fPID = 0.0;
-  fIsElectron = kFALSE;
-  
-}
-
-//_____________________________________________________________________________
-void AliTRDgtuTrack::Track(Float_t xpl, Float_t field)
-{
-
-  AliTRDltuTracklet *trk;
-  Int_t nTracklets = GetNtracklets();
-  Float_t fC[kNmaxTrk][3];            // X, Y, Z  coordinates of segments
-
-  fYproj = 0.0;
-  fZproj = 0.0;
-  fSlope = 0.0;
-  fNclusters = 0;
-  fNplanes = 0;
-  fNtracklets = GetNtracklets();
-  Int_t InDetector[kNplan];
-  for (Int_t i = 0; i < kNplan; i++) InDetector[i] = -1;
-  Int_t iDet, nDet = 0;
-  Bool_t NewDetector;
-  for (Int_t i = 0; i < nTracklets; i++) {
-
-    trk = GetTracklet(i);
-    fYproj += trk->GetYproj(xpl);
-    fZproj += trk->GetZproj(xpl);
-    fSlope += trk->GetSlope();
-    fNclusters += trk->GetNclusters();
-    iDet = trk->GetDetector();
-
-    NewDetector = kTRUE;
-    for (Int_t id = 0; id < nDet; id++) {
-      if (iDet == InDetector[id]) {
-       NewDetector = kFALSE;
-       break;
-      }
-    }
-    if (NewDetector) {
-      InDetector[nDet++] = iDet;
-      fNplanes++;
-    }
-
-    fC[i][0] = trk->GetTime0();
-    fC[i][1] = trk->GetOffset();
-    fC[i][2] = trk->GetRowz();
-
-  }
-  fYproj /= (Float_t)nTracklets;
-  fZproj /= (Float_t)nTracklets;
-  fSlope /= (Float_t)nTracklets;
-
-  Float_t X[kNmaxTrk+1], Y[kNmaxTrk+1], Z[kNmaxTrk+1];
-  Bool_t count[kNmaxTrk];
-  for (Int_t i = 0; i < kNmaxTrk; i++) count[i] = kFALSE;
-
-  Int_t iXmin = -1;
-  Int_t j = 0;
-  X[0] = Y[0] = Z[0] = 0.0;
-  while (j < nTracklets) {
-    iXmin = -1;
-    for (Int_t i = 0; i < nTracklets; i++) {
-      if (count[i]) continue;
-      if (iXmin == -1) {
-       iXmin = i;
-       continue;
-      }
-      if (fC[i][0] < fC[iXmin][0]) iXmin = i;
-    }
-    X[j+1] = fC[iXmin][0];
-    Y[j+1] = fC[iXmin][1];
-    Z[j+1] = fC[iXmin][2];
-    j++;
-    count[iXmin] = kTRUE;
-  }
-
-  TMatrixD smatrix(2,2);
-  TMatrixD sums(2,1);
-  TMatrixD res(2,1);
-  Double_t x, y;
-  Float_t A, B;
-
-  smatrix.Zero();
-  sums.Zero();
-  for (Int_t i = 0; i < nTracklets; i++) {
-    x = (Double_t)X[i+1];
-    y = (Double_t)Y[i+1];
-    smatrix(0,0) += 1.0;
-    smatrix(1,1) += x*x;
-    smatrix(0,1) += x;
-    smatrix(1,0) += x;
-    sums(0,0)    += y;
-    sums(1,0)    += x*y;
-  }
-  res = smatrix.Invert() * sums;
-  A = res(0,0);
-  B = res(1,0);
-
-  Float_t dist = AliTRDgeometry::GetTime0(1) - AliTRDgeometry::GetTime0(0);
-
-  Float_t fX1 = X[1]          + dist * (Float_t)(nTracklets-1)/6.0;
-  Float_t fY1 = A + B * fX1;
-  Float_t fX2 = X[nTracklets] - dist * (Float_t)(nTracklets-1)/6.0;
-  Float_t fY2 = A + B * fX2;
-  Float_t D12 = TMath::Sqrt((fX2-fX1)*(fX2-fX1)+(fY2-fY1)*(fY2-fY1));
-  Float_t Alpha = TMath::ATan(fY2/fX2) - TMath::ATan(fY1/fX1);
-  Float_t R = (D12/2.0)/TMath::Sin(Alpha);
-
-  fPt = 0.3 * field * 0.01 * R;
-
-  Float_t D1 = fX1*fX1+fY1*fY1;
-  Float_t D2 = fX2*fX2+fY2*fY2;
-  Float_t D  = fX1*fY2-fX2*fY1;
-  
-  Float_t Xc = (D1*fY2-D2*fY1)/(2*D);
-  Float_t Yc = (D2*fX1-D1*fX2)/(2*D);
-
-  if (Yc != 0.0) {
-    fPhi = TMath::ATan(Xc/Yc);
-  } else {
-    fPhi = TMath::PiOver2();
-  }
-
-  fPhi *= 180.0/TMath::Pi();
-
-  smatrix.Zero();
-  sums.Zero();
-  for (Int_t i = 0; i < nTracklets+1; i++) {
-    x = (Double_t)Z[i];
-    y = (Double_t)X[i];
-    smatrix(0,0) += 1.0;
-    smatrix(1,1) += x*x;
-    smatrix(0,1) += x;
-    smatrix(1,0) += x;
-    sums(0,0)    += y;
-    sums(1,0)    += x*y;
-  }
-  res = smatrix.Invert() * sums;
-  A = res(0,0);
-  B = res(1,0);
-  Float_t theta = TMath::ATan(B);
-  
-  if (theta < 0.0) theta = TMath::Pi() + theta;
-  
-  if (theta == 0.0) {
-    fEta = 0.0;
-  } else {
-    fEta = -TMath::Log(TMath::Tan(theta/2.0));
-  }
-  
-}
-
-//_____________________________________________________________________________
-void AliTRDgtuTrack::MakePID()
-{
-
-  //
-  // Electron likelihood signal
-  //
-
-  AliTRDcalibDB* calibration = AliTRDcalibDB::Instance();
-  if (!calibration)
-  {
-    Error("MakePID","No instance of AliTRDcalibDB.");
-    return;  
-  }
-  const AliTRDCalPIDLQ *pd = calibration->GetPIDLQObject();
-  
-  AliTRDltuTracklet *trk;
-  Int_t nTracklets = GetNtracklets();
-  Int_t det, pla;
-  Float_t sl, th, q, probPio = 1.0, probEle = 1.0;
-  for (Int_t i = 0; i < nTracklets; i++) {
-
-    trk = GetTracklet(i);
-
-    sl = TMath::Abs(trk->GetSlope());     // tracklet inclination in X-y plane
-    th = trk->GetRowz()/trk->GetTime0();  // tracklet inclination in X-z plane
-    th = TMath::ATan(TMath::Abs(th));
-
-    q = trk->GetQ() 
-      * TMath::Cos(sl/180.0*TMath::Pi()) 
-      * TMath::Cos(th/180.0*TMath::Pi());
-
-    det = trk->GetDetector();
-    pla = trk->GetPlane(det);
-
-    // unclear yet factor to match the PS distributions = 5.8
-    // not explained only by the tail filter ...
-
-    // AliRoot v4-03-07 , v4-03-Release
-    //q = q * 5.8;
-
-    // Temporary (B. Vulpescu):
-    // The charge distributions do not match the new changes in simulation (A. Bercuci),
-    // which are nevertheless now in agreement with the beam tests.
-    // Some tricks will be used to still have reasonable results
-    // To match the existing charge distributions, the charge per layer has to be modified
-    // as folows:
-    /*
-      if (k == 0) {
-      // electrons
-      q = 4.3 * q + 95.0;
-      } else {
-      // others
-      q = 4.2 * q + 70.0;
-      }
-    */
-    // Since at tracking time we have no information on the particle type, we will modify
-    // instead the charge distributions accordingly. This will slow down the sampling.
-    // The modified distributions are in TRDdEdxHistogramsV1_BV.root and the CDB has
-    // been regenerated with AliTRDCreateDummyCDB.C
-    // The new PIDLQ data base has the version :
-    // I-AliCDBLocal::Get: CDB object retrieved: path "TRD/Calib/PIDLQ"; run range [0,0];
-    // version v0_s1
-
-    probEle *= pd->GetProbability(0,TMath::Abs(fPt),q);
-    probPio *= pd->GetProbability(2,TMath::Abs(fPt),q);
-
-  }
-
-  if ((probEle+probPio) > 0.0) {
-    fPID = probEle/(probEle+probPio);
-  } else {
-    fPID = 0.0;
-  }
-
-  // Thresholds for LQ cut at 90% electron efficiency (from AliRoot v4-03-07)
-  // P [GeV/c]  fPIDcut (between 0 and 1)
-  // 2          0.925
-  // 3          0.915
-  // 4          0.875
-  // 5          0.855
-  // 6          0.845
-  // 8          0.785
-  // 10         0.735
-  //
-  // PIDcut = 0.978 - 0.024 * P[GeV/c]
-  //Float_t PIDcut = 0.978 - 0.024 * TMath::Abs(fPt);
-
-  // HEAD28Mar06 with modified distributions (A. Bercuci changes, P. Shukla distributions)
-  Float_t PIDcut = 0.829 - 0.032 * TMath::Abs(fPt);
-
-  fIsElectron = kFALSE;
-  if (fPID >= PIDcut) {
-    fIsElectron = kTRUE;
-  }
-
-}
-
-//_____________________________________________________________________________
-void AliTRDgtuTrack::CookLabel()
-{
-
-  //
-  // Cook the track label from tracklets labels
-  //
-
-  AliTRDltuTracklet *trk;
-
-  const Int_t kMaxTracks = 10;
-  Int_t trackLabel[kMaxTracks];
-  Int_t trackCount[kMaxTracks];
-  for (Int_t it = 0; it < kMaxTracks; it++) {
-    trackLabel[it] = -1;
-    trackCount[it] = 0;
-  }
-
-  Bool_t counted;
-  Int_t label, nTracks = 0;
-  for (Int_t itrk = 0; itrk < fNtracklets; itrk++) {
-
-    trk = GetTracklet(itrk);
-
-    if (trk->GetLabel() == -1) continue;
-
-    label = trk->GetLabel();
-
-    counted = kFALSE;
-    for (Int_t it = 0; it < nTracks; it++) {
-      if (label == trackLabel[it]) {
-       trackCount[it]++;
-       counted = kTRUE;
-       break;
-      }
-    }
-    if (!counted) {
-      trackLabel[nTracks] = label;
-      trackCount[nTracks]++;
-      nTracks++;
-      if (nTracks == kMaxTracks) {
-       Warning("CookLabel","Too many tracks for this tracklet.");
-       nTracks--;
-       break;
-      }
-    }
-    
-  }
-
-  Float_t frac = 4.0/5.0;
-  for (Int_t it = 0; it < kMaxTracks; it++) {
-    if (trackCount[it] >= (Int_t)(frac*fNtracklets)) {
-      fLabel = trackLabel[it];
-      break;
-    }
-  }
-
-}
-
-//_____________________________________________________________________________
-AliTRDmodule::AliTRDmodule(AliTRDtrigParam *trigp) 
-{
-
-  //
-  // AliTRDmodule default constructor
-  //
-
-  fDeltaY     = trigp->GetDeltaY();
-  fDeltaS     = trigp->GetDeltaS();
-  fXprojPlane = trigp->GetXprojPlane();
-  fField      = trigp->GetField();
-  fLTUtrk     = 0;
-  fGTUtrk     = 0;
-  fTracklets  = new TObjArray(400);
-  fTracks     = new TObjArray(400);
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::Reset() 
-{
-
-  ResetTracklets();
-  ResetTracks();
-
-  fLTUtrk     = 0;
-  fGTUtrk     = 0;
-  fTracklets  = new TObjArray(400);
-  fTracks     = new TObjArray(400);
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::ResetTracks() 
-{
-
-  if (fTracks) {
-
-    AliTRDgtuTrack *trk;
-    for (Int_t i = 0; i < GetNtracks(); i++) {
-      
-      trk = GetTrack(i);
-      trk->Reset();
-      
-    }
-
-    fTracks->Delete();
-
-  }
-
-}
-
-//_____________________________________________________________________________
-AliTRDgtuTrack* AliTRDmodule::GetTrack(Int_t pos)
-{
-
-  if (fTracks == 0) return 0;
-  void * trk = fTracks->UncheckedAt(pos);
-  if (trk == 0) return 0;
-
-  return (AliTRDgtuTrack*)trk;
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::RemoveTrack(Int_t pos)
-{
-
-  if (fTracks == 0) return;
-  fTracks->RemoveAt(pos);
-  fTracks->Compress();
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::AddTracklet(Int_t det, 
-                              Int_t row, 
-                              Float_t rowz,
-                              Float_t slope, 
-                              Float_t offset, 
-                              Float_t time, 
-                              Int_t ncl,
-                              Int_t label,
-                              Float_t q) 
-{
-  
-  fLTUtrk = new AliTRDltuTracklet(det,row,rowz,slope,offset,time,ncl,label,q);
-  
-  Tracklets()->Add(fLTUtrk);
-
-}
-
-//_____________________________________________________________________________
-AliTRDltuTracklet* AliTRDmodule::GetTracklet(Int_t pos)
-{
-
-  if (fTracklets == 0) return 0;
-  void * trk = fTracklets->UncheckedAt(pos);
-  if (trk == 0) return 0;
-
-  return (AliTRDltuTracklet*)trk;
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::RemoveTracklet(Int_t pos)
-{
-
-  if (fTracklets == 0) return;
-  fTracklets->RemoveAt(pos);
-  fTracklets->Compress();
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::RemoveMultipleTracklets()
-{
-
-  Float_t OffDiffMin = 0.5;  // [cm]
-
-  AliTRDltuTracklet *trk;
-  Int_t Det1, Det2, Row1, Row2, Ncl1, Ncl2, Label1, Label2;
-  Float_t Off1, Off2;
-  Int_t itrk = 0;
-  while (itrk < (GetNtracklets()-1)) {
-
-    trk = GetTracklet(itrk  );
-
-    Det1 = trk->GetDetector();
-    Row1 = trk->GetRow();
-    Off1 = trk->GetOffset();
-    Ncl1 = trk->GetNclusters();
-    Label1 = trk->GetLabel();
-
-    trk = GetTracklet(itrk+1);
-
-    Det2 = trk->GetDetector();
-    Row2 = trk->GetRow();
-    Off2 = trk->GetOffset();
-    Ncl2 = trk->GetNclusters();
-    Label2 = trk->GetLabel();
-
-    if (Det1 == Det2 && Row1 == Row2) {
-      if ((Off2-Off1) < OffDiffMin) {
-       if (Ncl1 < Ncl2) {
-         RemoveTracklet(itrk  );
-       } else {
-         RemoveTracklet(itrk+1);
-       }
-      }
-    }
-
-    itrk++;
-
-  }
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::SortZ(Int_t cha)
-{
-
-  InitZLUT();
-
-  AliTRDltuTracklet *trk;
-  Int_t row, pla, det;
-  for (Int_t iTrk = 0; iTrk < GetNtracklets(); iTrk++) {
-
-    trk = GetTracklet(iTrk);
-
-    row = trk->GetRow();
-    det = trk->GetDetector();
-    pla = trk->GetPlane(det);
-
-    for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
-      if (fZChannelMap[cha][iZchan][pla][row] == 1) {
-       fZtrkid[pla][fZnchan[pla][iZchan]][iZchan] = iTrk;
-       fZnchan[pla][iZchan]++;
-      }
-    }
-
-  }
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::InitZLUT()
-{
-
-  for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
-    for (Int_t i = 0; i < kNsubZchan; i++) {
-      fZnchan[iPlan][i] = 0;
-      for (Int_t j = 0; j < kNmaxZchan; j++) {
-        fZtrkid[iPlan][j][i] = -1;
-      }
-    }
-  }
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::FindTracks() 
-{
-
-  for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
-    FindTracksCombi(iZchan);
-  }
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::FindTracksCombi(Int_t zchan) 
-{
-
-  //
-  // find tracks by pure combinatorics...
-  //
-  
-  static Int_t TrkTrack[12];
-  
-  Int_t nTracklets, nPlanes;
-  Int_t Ntrk1, TrkId1, Ntrk2, TrkId2;
-  Float_t Y1, Y1min, Y1max, S1, Z1, S1min, S1max, Y2, S2, Z2;
-  AliTRDltuTracklet *Trk1;
-  AliTRDltuTracklet *Trk2;
-  AliTRDltuTracklet *Trk ;
-
-  Bool_t IsPlane[kNplan];
-
-  for (Int_t iPlan1 = 0; iPlan1 < kNplan; iPlan1++) {
-
-    Ntrk1 = fZnchan[iPlan1][zchan];
-
-    for (Int_t iTrk1 = 0; iTrk1 < Ntrk1; iTrk1++) {
-
-      for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) IsPlane[iPlan] = kFALSE;
-
-      TrkId1 = fZtrkid[iPlan1][iTrk1][zchan];
-
-      nTracklets = 0;
-      for (Int_t iList = 0; iList < kNmaxTrk; iList++) {
-       TrkTrack[iList] = -1;
-      }
-
-      TrkTrack[nTracklets++] = TrkId1;
-
-      IsPlane[iPlan1] = kTRUE;
-
-      Trk1 = GetTracklet(TrkId1);
-
-      Y1    = Trk1->GetYproj(fXprojPlane);
-      Y1min = Y1 - fDeltaY;
-      Y1max = Y1 + fDeltaY;
-      S1    = Trk1->GetSlope();
-      S1min = S1 - fDeltaS;
-      S1max = S1 + fDeltaS;
-      Z1    = Trk1->GetZproj(fXprojPlane);      
-
-      for (Int_t iPlan2 = 0; iPlan2 < kNplan; iPlan2++) {
-
-       if (iPlan2 == iPlan1) continue;
-
-       Ntrk2 = fZnchan[iPlan2][zchan];
-
-       for (Int_t iTrk2 = 0; iTrk2 < Ntrk2; iTrk2++) {
-
-         TrkId2 = fZtrkid[iPlan2][iTrk2][zchan];
-
-         if (TrkId2 == TrkId1) continue;
-
-         Trk2 = GetTracklet(TrkId2);
-
-         Y2 = Trk2->GetYproj(fXprojPlane);
-         S2 = Trk2->GetSlope();
-         Z2 = Trk2->GetZproj(fXprojPlane);
-
-         if ((Y1min < Y2 && Y2 < Y1max) && 
-             (S1min < S2 && S2 < S1max)) {
-
-           if (nTracklets >= kNmaxTrk) {
-             Warning("FindTracksCombi","Too many tracklets for this track.");
-           } else {
-             TrkTrack[nTracklets++] = TrkId2;
-             IsPlane[iPlan2] = kTRUE;
-           }
-
-         }
-
-       }  // end trk 2
-
-      }  // end plan 2
-
-      nPlanes = 0;
-      for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
-       nPlanes += (Int_t)IsPlane[iPlan];
-      }
-      
-      if (nPlanes >= 4) {
-
-       Int_t Cha1, Cha2, Npoints1, Npoints2;
-       for (Int_t iList = 0; iList < (nTracklets-1); iList++) {
-
-         if (TrkTrack[iList] == -1 || TrkTrack[iList+1] == -1) continue;
-         Trk1 = GetTracklet(TrkTrack[iList  ]);
-         Trk2 = GetTracklet(TrkTrack[iList+1]);
-
-         Cha1 = Trk1->GetDetector();
-         Cha2 = Trk2->GetDetector();
-         if (Cha1 != Cha2) continue;
-
-         Npoints1 = Trk1->GetNclusters();
-         Npoints2 = Trk2->GetNclusters();
-
-         if (Npoints1 == Npoints2) {
-           TrkTrack[iList] = -1;
-         } else {
-           if (Npoints1 > Npoints2) TrkTrack[iList+1] = -1;
-           if (Npoints1 < Npoints2) TrkTrack[iList  ] = -1;
-         }
-
-       }
-
-       fGTUtrk = new AliTRDgtuTrack();
-       for (Int_t iList = 0; iList < nTracklets; iList++) {
-         if (TrkTrack[iList] == -1) continue;
-         Trk = GetTracklet(TrkTrack[iList]);
-         fGTUtrk->AddTracklet(Trk);
-       }
-       fGTUtrk->Track(fXprojPlane,fField);
-       AddTrack();
-      }
-           
-    }  // end trk 1
-
-  }  // end plan 1
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::AddTrack() 
-{
-  
-  Tracks()->Add(fGTUtrk);
-
-}
-
-//_____________________________________________________________________________
-void AliTRDmodule::RemoveMultipleTracks()
-{
-
-  AliTRDgtuTrack *trk1;
-  AliTRDgtuTrack *trk2;
-
-  Float_t Yproj1, Yproj2, Alpha1, Alpha2;
-  Int_t ntrk1, ntrk2;
-  Int_t iTrack = 0;
-
-  while (iTrack < (GetNtracks()-1)) {
+//  Author:                                                                  //
+//    Bogdan Vulpescu                                                        //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
 
-    trk1 = GetTrack(iTrack  );
-    trk2 = GetTrack(iTrack+1);
+#include <TTree.h>
+#include <TBranch.h>
+#include <TMatrixD.h>
+#include <TClonesArray.h>
+#include <TObjArray.h>
 
-    ntrk1  = trk1->GetNtracklets();
-    Yproj1 = trk1->GetYproj();
-    Alpha1 = trk1->GetSlope();
-    ntrk2  = trk2->GetNtracklets();
-    Yproj2 = trk2->GetYproj();
-    Alpha2 = trk2->GetSlope();
+#include "AliLog.h"
+#include "AliRun.h"
+#include "AliLoader.h"
 
-    if (TMath::Abs(Yproj1-Yproj2) < fDeltaY && TMath::Abs(Alpha1-Alpha2) < fDeltaS) {
-      if (ntrk1 < ntrk2) {
-       RemoveTrack(iTrack  );
-      } else {
-       RemoveTrack(iTrack+1);
-      }
-    } else {
-      iTrack++;
-    }
-    
-  }
+#include "AliTRDdigitsManager.h"
+#include "AliTRDgeometry.h"
+#include "AliTRDdataArrayI.h"
+#include "AliTRDcalibDB.h"
+#include "AliTRDCommonParam.h"
+#include "AliTRDrawData.h"
+#include "AliTRDtrigger.h"
+#include "AliTRDmodule.h"
+#include "AliTRDmcmTracklet.h"
+#include "AliTRDgtuTrack.h"
+#include "AliTRDtrigParam.h"
+#include "AliTRDmcm.h"
+#include "AliTRDzmaps.h"
+#include "AliTRDCalibra.h"
+#include "Cal/AliTRDCalPIDLQ.h"
 
-}
+ClassImp(AliTRDtrigger)
 
 //_____________________________________________________________________________
-AliTRDtrigger::AliTRDtrigger():
-  TNamed(),
-  fTracks("AliTRDgtuTrack",0)
+AliTRDtrigger::AliTRDtrigger()
+  :TNamed()
+  ,fField(0)
+  ,fGeo(NULL)
+  ,fCalib(NULL)
+  ,fCParam(NULL)
+  ,fTrigParam(NULL)
+  ,fRunLoader(NULL)
+  ,fDigitsManager(NULL)
+  ,fTrackletTree(NULL)
+  ,fTracklets(NULL)
+  ,fNROB(0)
+  ,fMCM(NULL)
+  ,fTrk(NULL)
+  ,fTrkTest(NULL)
+  ,fModule(NULL)
+  ,fGTUtrk(NULL)
+  ,fNtracklets(0)
+  ,fDigits(NULL)
+  ,fTrack0(NULL)
+  ,fTrack1(NULL)
+  ,fTrack2(NULL)
+  ,fNPrimary(0)
+  ,fTracks(NULL)
 {
   //
   // AliTRDtrigger default constructor
   //
 
-  fDigitsManager = NULL;
-  fTrackletTree = NULL;
-  fTracklets     = NULL;
-
-  fNROB = 0;
-  fTrigParam = NULL;
-  fMCM = NULL;
-  fTrk = NULL;
-  fGTUtrk = NULL;
-
-  fNtracklets = 0;
-
-  fDigits = NULL;
-  fTrack0 = NULL;
-  fTrack1 = NULL;
-  fTrack2 = NULL;
-
-  fModule = NULL;
-
-  fNPrimary = 0;
-
 }
 
 //_____________________________________________________________________________
-AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title):
-  TNamed(name,title),
-  fTracks("AliTRDgtuTrack",1000)
+AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
+  :TNamed(name,title)
+  ,fField(0)
+  ,fGeo(NULL)
+  ,fCalib(NULL)
+  ,fCParam(NULL)
+  ,fTrigParam(NULL)
+  ,fRunLoader(NULL)
+  ,fDigitsManager(new AliTRDdigitsManager())
+  ,fTrackletTree(NULL)
+  ,fTracklets(new TObjArray(400))
+  ,fNROB(0)
+  ,fMCM(NULL)
+  ,fTrk(NULL)
+  ,fTrkTest(NULL)
+  ,fModule(NULL)
+  ,fGTUtrk(NULL)
+  ,fNtracklets(0)
+  ,fDigits(NULL)
+  ,fTrack0(NULL)
+  ,fTrack1(NULL)
+  ,fTrack2(NULL)
+  ,fNPrimary(0)
+  ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
 {
   //
   // AliTRDtrigger constructor
   //
 
-  fDigitsManager = new AliTRDdigitsManager();
-  fTrackletTree = NULL;
-  fTracklets = new TObjArray(400);
-
-  fNROB = 0;
-  fTrigParam = NULL;
-  fMCM = NULL;
-  fTrk = NULL;
-  fGTUtrk = NULL;
-
-  fNtracklets = 0;
-
-  fDigits = NULL;
-  fTrack0 = NULL;
-  fTrack1 = NULL;
-  fTrack2 = NULL;
-
-  fModule = NULL;
-
-  fNPrimary = 0;
-
 }
 
 //_____________________________________________________________________________
-AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p):TNamed(p)
+AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
+  :TNamed(p)
+  ,fField(p.fField)
+  ,fGeo(NULL)
+  ,fCalib(NULL)
+  ,fCParam(NULL)
+  ,fTrigParam(NULL)
+  ,fRunLoader(NULL)
+  ,fDigitsManager(NULL)
+  ,fTrackletTree(NULL)
+  ,fTracklets(NULL)
+  ,fNROB(p.fNROB)
+  ,fMCM(NULL)
+  ,fTrk(NULL)
+  ,fTrkTest(NULL)
+  ,fModule(NULL)
+  ,fGTUtrk(NULL)
+  ,fNtracklets(p.fNtracklets)
+  ,fDigits(NULL)
+  ,fTrack0(NULL)
+  ,fTrack1(NULL)
+  ,fTrack2(NULL)
+  ,fNPrimary(p.fNPrimary)
+  ,fTracks(NULL)
 {
   //
   // AliTRDtrigger copy constructor
   //
 
-  ((AliTRDtrigger &) p).Copy(*this);
-
 }
 
 ///_____________________________________________________________________________
@@ -1013,7 +158,10 @@ AliTRDtrigger::~AliTRDtrigger()
     delete fTracklets;
   }
 
-  fTracks.Delete();
+  if (fTracks) {
+    fTracks->Delete();
+    delete fTracks;
+  }
 
 }
 
@@ -1045,11 +193,22 @@ void AliTRDtrigger::Init()
 {
 
   fModule = new AliTRDmodule(fTrigParam); 
-  /*
-  AliHeader *header = fRunLoader->GetHeader();
-  fNPrimary = header->GetNprimary();
-  */
-  fTracks.Clear();
+  fTracks->Clear();
+
+  fField  = fTrigParam->GetField();
+  fGeo    = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
+
+  fCalib  = AliTRDcalibDB::Instance();
+  if (!fCalib) {
+    AliError("No instance of AliTRDcalibDB.");
+    return;  
+  }
+
+  fCParam = AliTRDCommonParam::Instance();
+  if (!fCParam) {
+    AliError("No common parameters.");
+    return;
+  }
 
 }
 
@@ -1061,51 +220,31 @@ Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
   //
 
   TString evfoldname = AliConfig::GetDefaultEventFolderName();
-  fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
+  fRunLoader         = AliRunLoader::GetRunLoader(evfoldname);
 
-  if (!fRunLoader)
+  if (!fRunLoader) {
     fRunLoader = AliRunLoader::Open(name);
-
+  }
   if (!fRunLoader) {
-    Error("Open","Can not open session for file %s.",name);
+    AliError(Form("Can not open session for file %s.",name));
     return kFALSE;
   }
 
-  // Open input
-
-  if (fRunLoader->GetAliRun() == 0x0) fRunLoader->LoadgAlice();
-  gAlice = fRunLoader->GetAliRun();
-
-  if (!(gAlice)) {
-    fRunLoader->LoadgAlice();
-    gAlice = fRunLoader->GetAliRun();
-    if (!(gAlice)) {
-      Error("Open","Could not find AliRun object.");
-      return kFALSE;
-    }
-  }
-
   // Import the Trees for the event nEvent in the file
   fRunLoader->GetEvent(nEvent);
 
   // Open output
-
   TObjArray *ioArray = 0;
-
-  AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
+  AliLoader* loader  = fRunLoader->GetLoader("TRDLoader");
   loader->MakeTree("T");
   fTrackletTree = loader->TreeT();
   fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
-
-  fRunLoader->LoadHeader();
-
   Init();
 
   return kTRUE;
 
 }
 
-
 //_____________________________________________________________________________
 Bool_t AliTRDtrigger::ReadDigits() 
 {
@@ -1114,12 +253,17 @@ Bool_t AliTRDtrigger::ReadDigits()
   //
 
   if (!fRunLoader) {
-    Error("ReadDigits","Can not find the Run Loader");
+    AliError("Can not find the Run Loader");
     return kFALSE;
   }
 
   AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
-  if (!loader->TreeD()) loader->LoadDigits();
+  if (!loader->TreeD()) {
+    loader->LoadDigits();
+  }
+  if (!loader->TreeD()) {
+     return kFALSE;
+  }
 
   return (fDigitsManager->ReadDigits(loader->TreeD()));
 
@@ -1133,9 +277,7 @@ Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
   //
 
   AliTRDrawData *raw = new AliTRDrawData();
-  raw->SetDebug(1);
-
-  fDigitsManager = raw->Raw2Digits(rawReader);
+  fDigitsManager     = raw->Raw2Digits(rawReader);
 
   return kTRUE;
 
@@ -1152,35 +294,38 @@ Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
 
   AliLoader *loader = rl->GetLoader("TRDLoader");
   loader->LoadTracks();
-  fTrackletTree = loader->TreeT();
+  fTrackletTree     = loader->TreeT();
 
-  TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
+  TBranch *branch   = fTrackletTree->GetBranch("TRDmcmTracklet");
   if (!branch) {
-    Error("ReadTracklets","Can't get the branch !");
+    AliError("Can't get the branch !");
     return kFALSE;
   }
   TObjArray *tracklets = new TObjArray(400);
   branch->SetAddress(&tracklets);
 
-  Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
-  Int_t iEntry, itrk;
-  Int_t iStack, iStackPrev = -1;
+  Int_t nEntries   = (Int_t) fTrackletTree->GetEntries();
+  Int_t iEntry;
+  Int_t itrk;
+  Int_t iStack;
+  Int_t iStackPrev = -1;
   
   for (iEntry = 0; iEntry < nEntries; iEntry++) {    
+
     fTrackletTree->GetEvent(iEntry);
     
-    for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++){
-
-      fTrk = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
-      
-      idet = fTrk->GetDetector();
+    for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
 
+      fTrk   = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
+      idet   = fTrk->GetDetector();
       iStack = idet / (AliTRDgeometry::Nplan());
+
       if (iStackPrev != iStack) {
        if (iStackPrev == -1) {
          iStackPrev = iStack;
-       } else {
-         MakeTracks(idet-AliTRDgeometry::Nplan());
+       } 
+        else {
+         MakeTracks(idet - AliTRDgeometry::Nplan());
          ResetTracklets();
          iStackPrev = iStack;
        }
@@ -1188,7 +333,8 @@ Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
       
       Tracklets()->Add(fTrk);
 
-      if (iEntry == (nEntries-1) && itrk == (tracklets->GetEntriesFast()-1)) {
+      if ((iEntry == (nEntries-1)) && 
+          (itrk   == (tracklets->GetEntriesFast() - 1))) {
        idet++;
        MakeTracks(idet-AliTRDgeometry::Nplan());
        ResetTracklets();
@@ -1205,87 +351,90 @@ Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
 }
 
 //_____________________________________________________________________________
-Bool_t AliTRDtrigger::MakeTracklets()
+Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
 {
+  //
+  // Create tracklets from digits
+  //
 
-  AliTRDcalibDB* calibration = AliTRDcalibDB::Instance();
-  if (!calibration)
-  {
-    Error("MakeTracklets","No instance of AliTRDcalibDB.");
-    return kFALSE;  
-  }
-  
-  AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance();
-  if (!commonParam)
-  {
-    Error("MakeTracklets","No common params.");
-    return kFALSE;
-  }
-    
-  AliTRDgeometry *geo = AliTRDgeometry::GetGeometry(fRunLoader);
-
-  Int_t    chamBeg = 0;
-  Int_t    chamEnd = AliTRDgeometry::Ncham();
-  Int_t    planBeg = 0;
-  Int_t    planEnd = AliTRDgeometry::Nplan();
-  Int_t    sectBeg = 0;
-  Int_t    sectEnd = AliTRDgeometry::Nsect();
+  Int_t chamBeg = 0;
+  Int_t chamEnd = AliTRDgeometry::Ncham();
+  Int_t planBeg = 0;
+  Int_t planEnd = AliTRDgeometry::Nplan();
+  Int_t sectBeg = 0;
+  Int_t sectEnd = AliTRDgeometry::Nsect();
 
-  fMCM = new AliTRDmcm(fTrigParam,0);
+  fTrkTest = new AliTRDmcmTracklet(0,0,0);
+  fMCM     = new AliTRDmcm(fTrigParam,0);
 
-  Int_t time, col, row, col1, col2;
+  Int_t   time;
+  Int_t   col;
+  Int_t   row;
+  Int_t   col1;
+  Int_t   col2;
+  Int_t   idet       = -1;
+  Int_t   iStack     = -1;
+  Int_t   iStackPrev = -1;
   Float_t amp;
-  Int_t idet, iStack, iStackPrev;
-  iStack     = -1;
-  iStackPrev = -1;
+
   for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
 
     for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
 
-      // number of ROBs in the chamber
-      if( icham == 2 ) {
+      // Number of ROBs in the chamber
+      if(icham == 2) {
        fNROB = 6;
-      } else {
+      } 
+      else {
        fNROB = 8;
       }
 
       for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
 
-        idet = geo->GetDetector(iplan,icham,isect);
+        idet = fGeo->GetDetector(iplan,icham,isect);
        ResetTracklets();
-       /*
-       iStack = idet / (AliTRDgeometry::Nplan());
-       if (iStackPrev != iStack) {
-         if (iStackPrev == -1) {
-           iStackPrev = iStack;
-         } else {
-           MakeTracks(idet-AliTRDgeometry::Nplan());
-           ResetTracklets();
-           iStackPrev = iStack;
+       
+       if (makeTracks) {
+         iStack = idet / (AliTRDgeometry::Nplan());
+         if (iStackPrev != iStack) {
+           if (iStackPrev == -1) {
+             iStackPrev = iStack;
+           } 
+            else {
+             MakeTracks(idet-AliTRDgeometry::Nplan());
+             ResetTracklets();
+             iStackPrev = iStack;
+           }
          }
        }
-       */
-        Int_t    nRowMax     = commonParam->GetRowMax(iplan,icham,isect);
-       Int_t    nColMax     = commonParam->GetColMax(iplan);
-        Int_t    nTimeTotal  = calibration->GetNumberOfTimeBins();
+
+        Int_t nRowMax    = fCParam->GetRowMax(iplan,icham,isect);
+       Int_t nColMax    = fCParam->GetColMax(iplan);
+        Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
 
         // Get the digits
         fDigits = fDigitsManager->GetDigits(idet);
+       if (!fDigits) return kFALSE;
+       // This is to take care of switched off super modules
+        if (fDigits->GetNtime() == 0) {
+          continue;
+       }
         fDigits->Expand();
         fTrack0 = fDigitsManager->GetDictionary(idet,0);
+       if (!fTrack0) return kFALSE;
         fTrack0->Expand();
         fTrack1 = fDigitsManager->GetDictionary(idet,1);
+       if (!fTrack1) return kFALSE;
         fTrack1->Expand();
         fTrack2 = fDigitsManager->GetDictionary(idet,2); 
+       if (!fTrack2) return kFALSE;
         fTrack2->Expand();
 
-
        for (Int_t iRob = 0; iRob < fNROB; iRob++) {
 
          for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
 
            fMCM->Reset();
-
            fMCM->SetRobId(iRob);
            fMCM->SetChaId(idet);
 
@@ -1293,21 +442,22 @@ Bool_t AliTRDtrigger::MakeTracklets()
 
            row = fMCM->GetRow();
 
-           if (row < 0 || row > nRowMax) {
-             Error("MakeTracklets","MCM row number out of range.");
+           if ((row < 0) || (row >= nRowMax)) {
+             AliError("MCM row number out of range.");
+             continue;
            }
 
            fMCM->GetColRange(col1,col2);
            
             for (time = 0; time < nTimeTotal; time++) {
              for (col = col1; col < col2; col++) {
-               if (col >= 0 && col < nColMax) {
+               if ((col >= 0) && (col < nColMax)) {
                  amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
-               } else {
+               } 
+                else {
                  amp = 0.0;
                }
                fMCM->SetADC(col-col1,time,amp);
-
              }
            }
 
@@ -1319,22 +469,17 @@ Bool_t AliTRDtrigger::MakeTracklets()
 
              for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
                
-               if (fMCM->GetSeedCol()[iSeed] < 0) continue;
-
-               if ( fTrigParam->GetDebugLevel() > 1 ) 
-                 printf("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]);
-
-               if ( fTrigParam->GetDebugLevel() == -1 ) {
-                 printf("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]);
-                 for (time = 0; time < nTimeTotal; time++) {
-                   for (col = 0; col < kMcmCol; col++) {                   
-                     printf("%03.0f  ",fMCM->GetADC(col,time));
-                   }
-                   printf("\n");
-                 }
+               if (fMCM->GetSeedCol()[iSeed] < 0) {
+                  continue;
+               }
+
+               if (fTrigParam->GetDebugLevel()   > 1) { 
+                 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
                }
 
-               AddTracklet(idet,row,iSeed,fNtracklets++);
+               if (TestTracklet(idet,row,iSeed,0)) {
+                 AddTracklet(idet,row,iSeed,fNtracklets++);
+               }
 
              }
 
@@ -1356,11 +501,13 @@ Bool_t AliTRDtrigger::MakeTracklets()
      }
     }
   }
-  /*
-  idet++;
-  MakeTracks(idet-AliTRDgeometry::Nplan());
-  ResetTracklets();
-  */
+
+  if (makeTracks) {
+    idet++;
+    MakeTracks(idet - AliTRDgeometry::Nplan());
+    ResetTracklets();
+  }
+
   return kTRUE;
 
 }
@@ -1368,6 +515,9 @@ Bool_t AliTRDtrigger::MakeTracklets()
 //_____________________________________________________________________________
 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
 {
+  //
+  // Configure MCM position in the pad plane
+  //
 
   Int_t robid = fMCM->GetRobId();
 
@@ -1380,31 +530,32 @@ void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
 
   if (robid%kNcolRob == 0) {
 
-    if ( mcmid%kNmcmRob == 0 ) {
+    if (mcmid%kNmcmRob == 0) {
       fMCM->SetColRange(18*0-1,18*1-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 1 ) {
+    if (mcmid%kNmcmRob == 1) {
       fMCM->SetColRange(18*1-1,18*2-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 2 ) {
+    if (mcmid%kNmcmRob == 2) {
       fMCM->SetColRange(18*2-1,18*3-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 3 ) {
+    if (mcmid%kNmcmRob == 3) {
       fMCM->SetColRange(18*3-1,18*4-1+2+1);
     }
 
-  } else {
+  } 
+  else {
 
-    if ( mcmid%kNmcmRob == 0 ) {
+    if (mcmid%kNmcmRob == 0) {
       fMCM->SetColRange(18*4-1,18*5-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 1 ) {
+    if (mcmid%kNmcmRob == 1) {
       fMCM->SetColRange(18*5-1,18*6-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 2 ) {
+    if (mcmid%kNmcmRob == 2) {
       fMCM->SetColRange(18*6-1,18*7-1+2+1);
     }
-    if ( mcmid%kNmcmRob == 3 ) {
+    if (mcmid%kNmcmRob == 3) {
       fMCM->SetColRange(18*7-1,18*8-1+2+1);
     }
 
@@ -1415,20 +566,101 @@ void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
 }
 
 //_____________________________________________________________________________
-void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
+Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
 {
+  //
+  // Check first the tracklet pt
+  //
 
-  Float_t field = fTrigParam->GetField();
-  AliTRDgeometry *geo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
+  Int_t nTimeTotal  = fCalib->GetNumberOfTimeBins();
 
-  AliTRDcalibDB* calibration = AliTRDcalibDB::Instance();
-  if (!calibration)
-  {
-    Error("AddTracklets","No instance of AliTRDcalibDB.");
-    return;  
+  // Calibration fill 2D
+  AliTRDCalibra *calibra = AliTRDCalibra::Instance();
+  if (!calibra) {
+    AliInfo("Could not get Calibra instance\n");
+  }
+
+  fTrkTest->Reset();
+
+  fTrkTest->SetDetector(det);
+  fTrkTest->SetRow(row);
+  fTrkTest->SetN(n);
+
+  Int_t iCol, iCol1, iCol2, track[3];
+  iCol = fMCM->GetSeedCol()[seed];  // 0....20 (MCM)
+  fMCM->GetColRange(iCol1,iCol2);   // range in the pad plane
+           
+  Float_t amp[3];
+  for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
+
+    amp[0] = fMCM->GetADC(iCol-1,iTime);
+    amp[1] = fMCM->GetADC(iCol  ,iTime);
+    amp[2] = fMCM->GetADC(iCol+1,iTime);
+
+    // extract track contribution only from the central pad
+    track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
+    track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
+    track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
+
+    if      (fMCM->IsCluster(iCol,iTime)) {
+
+      fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
+
+    } 
+    else if ((iCol+1+1) < kMcmCol) {
+
+      amp[0] = fMCM->GetADC(iCol-1+1,iTime);
+      amp[1] = fMCM->GetADC(iCol  +1,iTime);
+      amp[2] = fMCM->GetADC(iCol+1+1,iTime);
+
+      if (fMCM->IsCluster(iCol+1,iTime)) {
+
+       // extract track contribution only from the central pad
+       track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
+       track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
+       track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
+
+       fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
+
+      }
+
+    } 
+
+  }
+
+  fTrkTest->CookLabel(0.8);  
+  /*
+  if (fTrkTest->GetLabel() >= fNPrimary) {
+    Info("AddTracklet","Only primaries are stored!");
+    return;
+  }
+  */
+  // LTU Pt cut
+  fTrkTest->MakeTrackletGraph(fGeo,fField);
+
+  // TRD Online calibration
+  if (calibra->GetMcmTracking()) {
+    calibra->UpdateHistogramcm(fTrkTest);
+  }
+
+  fTrkTest->MakeClusAmpGraph();
+
+  if (TMath::Abs(fTrkTest->GetPt()) < fTrigParam->GetLtuPtCut()) {
+    return kFALSE;
   }
   
-  Int_t nTimeTotal  = calibration->GetNumberOfTimeBins();
+  return kTRUE;  
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
+{
+  //
+  // Add a found tracklet
+  //
+
+  Int_t nTimeTotal  = fCalib->GetNumberOfTimeBins();
 
   fTrk = new AliTRDmcmTracklet(det,row,n);
 
@@ -1436,27 +668,28 @@ void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
   iCol = fMCM->GetSeedCol()[seed];  // 0....20 (MCM)
   fMCM->GetColRange(iCol1,iCol2);   // range in the pad plane
            
-  Float_t Amp[3];
+  Float_t amp[3];
   for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
 
-    Amp[0] = fMCM->GetADC(iCol-1,iTime);
-    Amp[1] = fMCM->GetADC(iCol  ,iTime);
-    Amp[2] = fMCM->GetADC(iCol+1,iTime);
+    amp[0] = fMCM->GetADC(iCol-1,iTime);
+    amp[1] = fMCM->GetADC(iCol  ,iTime);
+    amp[2] = fMCM->GetADC(iCol+1,iTime);
 
     // extract track contribution only from the central pad
     track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
     track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
     track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
 
-    if (fMCM->IsCluster(iCol,iTime)) {
+    if      (fMCM->IsCluster(iCol,iTime)) {
 
-      fTrk->AddCluster(iCol+iCol1,iTime,Amp,track);
+      fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
 
-    } else if ((iCol+1+1) < kMcmCol) {
+    } 
+    else if ((iCol+1+1) < kMcmCol) {
 
-      Amp[0] = fMCM->GetADC(iCol-1+1,iTime);
-      Amp[1] = fMCM->GetADC(iCol  +1,iTime);
-      Amp[2] = fMCM->GetADC(iCol+1+1,iTime);
+      amp[0] = fMCM->GetADC(iCol-1+1,iTime);
+      amp[1] = fMCM->GetADC(iCol  +1,iTime);
+      amp[2] = fMCM->GetADC(iCol+1+1,iTime);
 
       if (fMCM->IsCluster(iCol+1,iTime)) {
 
@@ -1465,11 +698,10 @@ void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
        track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
        track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
 
-       fTrk->AddCluster(iCol+1+iCol1,iTime,Amp,track);
+       fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
 
       }
 
-    } else {
     }
 
   }
@@ -1482,9 +714,11 @@ void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
   }
   */
   // LTU Pt cut
-  fTrk->MakeTrackletGraph(geo,field);
+  fTrk->MakeTrackletGraph(fGeo,fField);
   fTrk->MakeClusAmpGraph();
-  if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) return;
+  if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) {
+    return;
+  }
       
   Tracklets()->Add(fTrk);
 
@@ -1499,7 +733,7 @@ Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
   //
 
   if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
-    Error("WriteTracklets","Unexpected detector index %d.",det);
+    AliError(Form("Unexpected detector index %d.",det));
     return kFALSE;
   }
 
@@ -1515,13 +749,13 @@ Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
     TObjArray *detTracklets = new TObjArray(400);
 
     for (Int_t i = 0; i < nTracklets; i++) {
+
       AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
       
       if (det == trk->GetDetector()) {
         detTracklets->AddLast(trk);
       }
-      else {
-      }
+
     }
 
     branch->SetAddress(&detTracklets);
@@ -1535,8 +769,8 @@ Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
 
   if (det == -1) {
 
-    Info("WriteTracklets","Writing the Tracklet tree %s for event %d."
-        ,fTrackletTree->GetName(),fRunLoader->GetEventNumber());
+    AliInfo(Form("Writing the Tracklet tree %s for event %d."
+               ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
 
     AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
     loader->WriteTracks("OVERWRITE");
@@ -1558,19 +792,10 @@ void AliTRDtrigger::MakeTracks(Int_t det)
   
   fModule->Reset();
 
-  AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance();
-  if (!commonParam)
-  {
-    Error("MakeTracks","No common params.");
-    return;
-  }
-    
   Int_t nRowMax, iplan, icham, isect, row;
 
-  AliTRDgeometry *geo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
-
   if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
-    Error("MakeTracks","Unexpected detector index %d.",det);
+    AliError(Form("Unexpected detector index %d.",det));
     return;
   }
   
@@ -1581,11 +806,11 @@ void AliTRDtrigger::MakeTracks(Int_t det)
     
     trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
     
-    iplan = geo->GetPlane(trk->GetDetector());
-    icham = geo->GetChamber(trk->GetDetector());
-    isect = geo->GetSector(trk->GetDetector());
+    iplan = fGeo->GetPlane(trk->GetDetector());
+    icham = fGeo->GetChamber(trk->GetDetector());
+    isect = fGeo->GetSector(trk->GetDetector());
 
-    nRowMax = commonParam->GetRowMax(iplan,icham,isect);
+    nRowMax = fCParam->GetRowMax(iplan,icham,isect);
     row = trk->GetRow();
 
     fModule->AddTracklet(trk->GetDetector(),
@@ -1602,7 +827,7 @@ void AliTRDtrigger::MakeTracks(Int_t det)
 
   fModule->SortTracklets();
   fModule->RemoveMultipleTracklets();
-  fModule->SortZ((Int_t)geo->GetChamber(det));
+  fModule->SortZ((Int_t)fGeo->GetChamber(det));
   fModule->FindTracks();
   fModule->SortTracks();
   fModule->RemoveMultipleTracks();
@@ -1619,4 +844,64 @@ void AliTRDtrigger::MakeTracks(Int_t det)
   
 }
 
+//_____________________________________________________________________________
+void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)  
+{ 
+  //
+  // Add a track to the list
+  //
+
+  AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast())) 
+                          AliTRDgtuTrack(*t);
+  track->SetDetector(det); 
+
+}
+
+//_____________________________________________________________________________
+TObjArray* AliTRDtrigger::Tracklets()
+{ 
+  //
+  // Returns list of tracklets
+  //
+
+  if (!fTracklets) {
+    fTracklets = new TObjArray(400); 
+  }
+  return fTracklets;       
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrigger::ResetTracklets()                              
+{
+  //
+  // Resets the list of tracklets
+  //
+  if (fTracklets) {
+    fTracklets->Delete();             
+  }
+
+}
+
+//_____________________________________________________________________________
+Int_t AliTRDtrigger::GetNumberOfTracks() const                     
+{ 
+  //
+  // Returns number of tracks
+  //
+
+  return fTracks->GetEntriesFast(); 
+                
+}
+
+//_____________________________________________________________________________
+AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const               
+{ 
+  //
+  // Returns a given track from the list
+  //
+
+  return (AliTRDgtuTrack *) fTracks->UncheckedAt(i); 
 
+}