updates to track matching by Rongrong
authormploskon <mploskon@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 7 Jun 2011 15:27:24 +0000 (15:27 +0000)
committermploskon <mploskon@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 7 Jun 2011 15:27:24 +0000 (15:27 +0000)
EMCAL/AliEMCALRecParam.cxx
EMCAL/AliEMCALRecParam.h
EMCAL/AliEMCALReconstructor.cxx
EMCAL/AliEMCALReconstructor.h
EMCAL/AliEMCALTracker.cxx
EMCAL/AliEMCALTracker.h

index 675911c..fe33c03 100644 (file)
@@ -47,15 +47,12 @@ AliEMCALRecParam::AliEMCALRecParam() :
   fTimeMin(-1.),// small value, accept all
   fTimeMax(1.),// high value, accept all//clustering
   fClusterizerFlag(AliEMCALRecParam::kClusterizerv1),
-  fTrkCutX(6.0), 
-  fTrkCutY(6.0), 
-  fTrkCutZ(6.0),  
-  fTrkCutR(10.0),
-  fTrkCutAlphaMin(-50.0), 
-  fTrkCutAlphaMax(50.0), 
-  fTrkCutAngle(10000.0),
-  fTrkCutNITS(3.0),
-  fTrkCutNTPC(20.0), //track matching
+  fMthCutEta(0.025), 
+  fMthCutPhi(0.05),
+  fStep(50),
+  fTrkCutPt(0.0),
+  fTrkCutNITS(0.0),
+  fTrkCutNTPC(50.0), //track matching
   fHighLowGainFactor(16.0), 
   fOrderParameter(2), 
   fTau(2.35), 
@@ -251,13 +248,10 @@ AliEMCALRecParam::AliEMCALRecParam(const AliEMCALRecParam& rp) :
   fTimeMin(rp.fTimeMin),
   fTimeMax(rp.fTimeMax),//clustering
   fClusterizerFlag(rp.fClusterizerFlag),
-  fTrkCutX(rp.fTrkCutX), 
-  fTrkCutY(rp.fTrkCutY), 
-  fTrkCutZ(rp.fTrkCutZ),  
-  fTrkCutR(rp.fTrkCutR),
-  fTrkCutAlphaMin(rp.fTrkCutAlphaMin), 
-  fTrkCutAlphaMax(rp.fTrkCutAlphaMax), 
-  fTrkCutAngle(rp.fTrkCutAngle), 
+  fMthCutEta(rp.fMthCutEta), 
+  fMthCutPhi(rp.fMthCutPhi),
+  fStep(rp.fStep),
+  fTrkCutPt(rp.fTrkCutPt),
   fTrkCutNITS(rp.fTrkCutNITS),
   fTrkCutNTPC(rp.fTrkCutNTPC), // track matching
   fHighLowGainFactor(rp.fHighLowGainFactor), 
@@ -313,16 +307,13 @@ AliEMCALRecParam& AliEMCALRecParam::operator = (const AliEMCALRecParam& rp)
     fTimeCut   = rp.fTimeCut;
     fTimeMax   = rp.fTimeMax;
     fTimeMin   = rp.fTimeMin;//clustering
-    fClusterizerFlag = rp.fClusterizerFlag;
-    fTrkCutX   = rp.fTrkCutX;
-    fTrkCutY   = rp.fTrkCutY;
-    fTrkCutZ   = rp.fTrkCutZ;
-    fTrkCutR   = rp.fTrkCutR;
-    fTrkCutAlphaMin = rp.fTrkCutAlphaMin;
-    fTrkCutAlphaMax = rp.fTrkCutAlphaMax;
-    fTrkCutAngle    = rp.fTrkCutAngle; 
-    fTrkCutNITS     = rp.fTrkCutNITS;
-    fTrkCutNTPC     = rp.fTrkCutNTPC; //track matching
+    fClusterizerFlag   = rp.fClusterizerFlag;
+    fMthCutEta         = rp.fMthCutEta;
+    fMthCutPhi         = rp.fMthCutPhi;
+    fStep              = rp.fStep;
+    fTrkCutPt          = rp.fTrkCutPt;
+    fTrkCutNITS        = rp.fTrkCutNITS;
+    fTrkCutNTPC        = rp.fTrkCutNTPC; //track matching
     fHighLowGainFactor = rp.fHighLowGainFactor; 
     fOrderParameter    = rp.fOrderParameter;
     fTau               = rp.fTau;
@@ -577,6 +568,7 @@ AliEMCALRecParam* AliEMCALRecParam::GetHighFluxParam()
   params->SetName("High Flux - Pb+Pb");
   params->SetTitle("High Flux - Pb+Pb");
   params->SetEventSpecie(AliRecoParam::kHighMult);
+  params->SetTrkCutPt(0.15);//This value can be higher if necessary
   
   return params;
   
@@ -593,8 +585,8 @@ void AliEMCALRecParam::Print(Option_t * opt) const
     AliInfo(Form("Clusterization parameters :\n fClusteringThreshold=%.3f,\n fW0=%.3f,\n fMinECut=%.3f,\n fUnfold=%d,\n fLocMaxCut=%.3f,\n fTimeCut=%2.1f ns\n fTimeMin=%2.1f ns\n fTimeMax=%2.1f ns\n",
                 fClusteringThreshold,fW0,fMinECut,fUnfold,fLocMaxCut,fTimeCut*1.e9,fTimeMin*1e9,fTimeMax*1e9));
     
-    AliInfo(Form("Track-matching cuts :\n x %f, y %f, z %f, R %f \n alphaMin %f, alphaMax %f, Angle %f, NITS %f, NTPC %f\n", 
-                                fTrkCutX, fTrkCutY, fTrkCutZ, fTrkCutR,fTrkCutAlphaMin,fTrkCutAlphaMax, fTrkCutAngle,fTrkCutNITS,fTrkCutNTPC));
+    AliInfo(Form("Track-matching cuts :\n dEta<%f, dPhi<%f, step=%f[cm], pT>%f, NITS>%f, NTPC>%f\n", 
+                fMthCutEta, fMthCutPhi, fStep, fTrkCutPt, fTrkCutNITS,fTrkCutNTPC));
 
     AliInfo(Form("Unfolding parameters, Shower shape function :\n")); 
     for(Int_t i = 0; i < 8; i++){
index b9c379b..8fa10a8 100644 (file)
@@ -74,27 +74,21 @@ class AliEMCALRecParam : public AliDetectorRecoParam
   void SetPiZero(Int_t i, Int_t j,Double_t param)       {fPiZero[i][j]=param;}
   void SetPiZeroEnergyProb(Int_t i,Double_t param)      {fPiZeroEnergyProb[i]=param;}
   
-  //Track Matching (Alberto)
+  //Track Matching (Alberto; Revised by Rongrong)
   /* track matching cut setters */
-  void SetTrkCutX(Double_t value)        {fTrkCutX = value;}
-  void SetTrkCutY(Double_t value)        {fTrkCutY = value;}
-  void SetTrkCutZ(Double_t value)        {fTrkCutZ = value;}
-  void SetTrkCutR(Double_t value)        {fTrkCutR = value;}
-  void SetTrkCutAlphaMin(Double_t value) {fTrkCutAlphaMin = value;}
-  void SetTrkCutAlphaMax(Double_t value) {fTrkCutAlphaMax = value;}
-  void SetTrkCutAngle(Double_t value)    {fTrkCutAngle = value;}
-  void SetTrkCutNITS(Double_t value)     {fTrkCutNITS = value;}
-  void SetTrkCutNTPC(Double_t value)     {fTrkCutNTPC = value;}
+  void SetMthCutEta(Double_t value)        {fMthCutEta = value;}
+  void SetMthCutPhi(Double_t value)        {fMthCutPhi = value;}
+  void SetExtrapolateStep(Double_t value)  {fStep = value;}
+  void SetTrkCutPt(Double_t value)         {fTrkCutPt = value;}
+  void SetTrkCutNITS(Double_t value)       {fTrkCutNITS = value;}
+  void SetTrkCutNTPC(Double_t value)       {fTrkCutNTPC = value;}
   /* track matching cut getters */
-  Double_t GetTrkCutX() const        {return fTrkCutX;}
-  Double_t GetTrkCutY() const        {return fTrkCutY;}
-  Double_t GetTrkCutZ() const        {return fTrkCutZ;}
-  Double_t GetTrkCutR() const        {return fTrkCutR;}
-  Double_t GetTrkCutAlphaMin() const {return fTrkCutAlphaMin;}
-  Double_t GetTrkCutAlphaMax() const {return fTrkCutAlphaMax;}
-  Double_t GetTrkCutAngle() const    {return fTrkCutAngle;}
-  Double_t GetTrkCutNITS() const     {return fTrkCutNITS;}
-  Double_t GetTrkCutNTPC() const     {return fTrkCutNTPC;}
+  Double_t GetMthCutEta() const         {return fMthCutEta;}
+  Double_t GetMthCutPhi() const         {return fMthCutPhi;}
+  Double_t GetExtrapolateStep() const   {return fStep;}
+  Double_t GetTrkCutPt() const          {return fTrkCutPt;}
+  Double_t GetTrkCutNITS() const        {return fTrkCutNITS;}
+  Double_t GetTrkCutNTPC() const        {return fTrkCutNTPC;}
   
   //Raw signal fitting (Jenn)
   /* raw signal setters */
@@ -165,14 +159,11 @@ class AliEMCALRecParam : public AliDetectorRecoParam
   Double_t fPiZero[6][6];        // Parameter to Compute PID for pi0    
   
   
-  //Track-Matching (Alberto)
-  Double_t  fTrkCutX;              // X-difference cut for track matching
-  Double_t  fTrkCutY;              // Y-difference cut for track matching
-  Double_t  fTrkCutZ;              // Z-difference cut for track matching
-  Double_t  fTrkCutR;              // cut on allowed track-cluster distance
-  Double_t  fTrkCutAlphaMin;       // cut on 'alpha' parameter for track matching (min)
-  Double_t  fTrkCutAlphaMax;       // cut on 'alpha' parameter for track matching (min)
-  Double_t  fTrkCutAngle;          // cut on relative angle between different track points for track matching
+  //Track-Matching (Alberto; Revised by Rongrong)
+  Double_t  fMthCutEta;            // eta-difference cut for track matching
+  Double_t  fMthCutPhi;            // phi-difference cut for track matching
+  Double_t  fStep;                 // Extrapolate length of each step
+  Double_t  fTrkCutPt;             // Minimum pT cut on tracks. Needed for Pb-Pb runs
   Double_t  fTrkCutNITS;           // Number of ITS hits for track matching
   Double_t  fTrkCutNTPC;           // Number of TPC hits for track matching
   
@@ -194,7 +185,7 @@ class AliEMCALRecParam : public AliDetectorRecoParam
 
   static TObjArray* fgkMaps;       // ALTRO mappings for RCU0..RCUX
   
-  ClassDef(AliEMCALRecParam,14)     // Reconstruction parameters
+  ClassDef(AliEMCALRecParam,15)     // Reconstruction parameters
     
     } ;
 
index bd3ff34..4abd1f8 100644 (file)
@@ -68,7 +68,7 @@
 
 ClassImp(AliEMCALReconstructor) 
   
- const AliEMCALRecParam*     AliEMCALReconstructor::fgkRecParam        = 0;   // EMCAL rec. parameters
+const AliEMCALRecParam*     AliEMCALReconstructor::fgkRecParam        = 0;   // EMCAL rec. parameters
 AliEMCALRawUtils*           AliEMCALReconstructor::fgRawUtils         = 0;   // EMCAL raw utilities class
 AliEMCALClusterizer*        AliEMCALReconstructor::fgClusterizer      = 0;   // EMCAL clusterizer class
 TClonesArray*               AliEMCALReconstructor::fgDigitsArr        = 0;   // list of digits, to be used multiple times
@@ -77,7 +77,7 @@ TClonesArray*               AliEMCALReconstructor::fgTriggerDigits    = 0;   //
 AliEMCALTriggerElectronics* AliEMCALReconstructor::fgTriggerProcessor = 0x0;
 //____________________________________________________________________________
 AliEMCALReconstructor::AliEMCALReconstructor() 
-  : fGeom(0),fCalibData(0),fPedestalData(0),fTriggerData(0x0) 
+  : fGeom(0),fCalibData(0),fPedestalData(0),fTriggerData(0x0), fMatches(0x0)
 {
   // ctor
   
@@ -133,6 +133,10 @@ AliEMCALReconstructor::AliEMCALReconstructor()
   fgDigitsArr     = new TClonesArray("AliEMCALDigit",1000);
   fgClustersArr   = new TObjArray(1000);
   fgTriggerDigits = new TClonesArray("AliEMCALTriggerRawDigit",1000);  
+
+  //Track matching
+  fMatches = new TList();
+  fMatches->SetOwner(kTRUE);
 } 
 
 //____________________________________________________________________________
@@ -165,6 +169,8 @@ AliEMCALReconstructor::~AliEMCALReconstructor()
   if(fgClusterizer)      delete fgClusterizer;
   if(fgTriggerProcessor) delete fgTriggerProcessor;
   
+  if(fMatches) { fMatches->Delete(); delete fMatches; fMatches = 0;}
+  
   AliCodeTimer::Instance()->Print();
 } 
 
@@ -444,31 +450,14 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree,
   
   Int_t nClusters = fgClustersArr->GetEntries(),  nClustersNew=0;
   AliDebug(1,Form("%d clusters",nClusters));
-  
-  //######################################################
-  //#######################TRACK MATCHING###############
-  //######################################################
-  //Fill list of integers, each one is index of track to which the cluster belongs.
-  
-  // step 1 - initialize array of matched track indexes
-  Int_t *matchedTrack = new Int_t[nClusters];
-  for (Int_t iclus = 0; iclus < nClusters; iclus++)
-    matchedTrack[iclus] = -1;  // neg. index --> no matched track
-  
-  // step 2, change the flag for all matched clusters found in tracks
-  Int_t iemcalMatch = -1;
-  Int_t endtpc = esd->GetNumberOfTracks();
-  for (Int_t itrack = 0; itrack < endtpc; itrack++) {
-    AliESDtrack * track = esd->GetTrack(itrack) ; // retrieve track
-    iemcalMatch = track->GetEMCALcluster();
-    if(iemcalMatch >= 0) matchedTrack[iemcalMatch] = itrack;
-  } 
+
   
   //########################################
   //##############Fill CaloClusters#############
   //########################################
   for (Int_t iClust = 0 ; iClust < nClusters ; iClust++) {
     const AliEMCALRecPoint * clust = (const AliEMCALRecPoint*)fgClustersArr->At(iClust);
+    if(!clust) continue;
     //if(clust->GetClusterType()== AliVCluster::kEMCALClusterv1) nRP++; else nPC++;
     // clust->Print(); //For debugging
     // Get information from EMCAL reconstruction points
@@ -536,22 +525,74 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree,
       ec->SetM20(elipAxis[1]*elipAxis[1]) ;
       ec->SetTOF(clust->GetTime()) ; //time-of-fligh
       ec->SetNExMax(clust->GetNExMax());          //number of local maxima
-      TArrayI arrayTrackMatched(1);// Only one track, temporal solution.
-      arrayTrackMatched[0]= matchedTrack[iClust];
-      ec->AddTracksMatched(arrayTrackMatched);
+  
       
       TArrayI arrayParents(parentMult,parentList);
       ec->AddLabels(arrayParents);
-      
-      // add the cluster to the esd object
+      //
+      //Track matching
+      //
+      fMatches->Clear();
+      Int_t nTracks = esd->GetNumberOfTracks();
+      for (Int_t itrack = 0; itrack < nTracks; itrack++)
+       {
+         AliESDtrack * track = esd->GetTrack(itrack) ; // retrieve track
+         if(track->GetEMCALcluster()==iClust)
+           {
+             Double_t dEta=-999, dPhi=-999;
+             Bool_t isMatch =  CalculateResidual(track, ec, dEta, dPhi);
+             if(!isMatch) 
+               {
+                 continue;
+                 cout<<"Not good"<<endl;
+               }
+             AliEMCALMatch *match = new AliEMCALMatch();
+             match->SetIndexT(itrack);
+             match->SetDistance(TMath::Sqrt(dEta*dEta+dPhi*dPhi));
+             match->SetdEta(dEta);
+             match->SetdPhi(dPhi);
+             fMatches->Add(match);
+           }
+       } 
+      fMatches->Sort(kSortAscending); //Sort matched tracks from closest to furthest
+      Int_t nMatch = fMatches->GetEntries();
+      TArrayI arrayTrackMatched(nMatch);
+      for(Int_t imatch=0; imatch<nMatch; imatch++)
+       {
+         AliEMCALMatch *match = (AliEMCALMatch*)fMatches->At(imatch);
+         arrayTrackMatched[imatch] = match->GetIndexT();
+         if(imatch==0)
+           {
+             ec->SetTrackDistance(match->GetdPhi(), match->GetdEta());
+           }
+       }
+      ec->AddTracksMatched(arrayTrackMatched);
+    
+      //add the cluster to the esd object
       esd->AddCaloCluster(ec);
+
       delete ec;
       delete [] newAbsIdList ;
       delete [] newFracList ;
     }
   } // cycle on clusters
+
+  //
+  //Reset the index of matched cluster for tracks
+  //to the one in CaloCluster array
+  Int_t ncls = esd->GetNumberOfCaloClusters();
+  for(Int_t icl=0; icl<ncls; icl++)
+    {
+      AliESDCaloCluster *cluster = esd->GetCaloCluster(icl);
+      if(!cluster || !cluster->IsEMCAL()) continue;
+      TArrayI *trackIndex = cluster->GetTracksMatched();
+      for(Int_t itr=0; itr<trackIndex->GetSize(); itr++)
+       {
+         AliESDtrack *track = esd->GetTrack(trackIndex->At(itr));
+         track->SetEMCALcluster(cluster->GetID());
+       }
+    }
   
-  delete [] matchedTrack;
   
   //Fill ESDCaloCluster with PID weights
   AliEMCALPID *pid = new AliEMCALPID;
@@ -629,4 +670,98 @@ void AliEMCALReconstructor::ReadDigitsArrayFromTree(TTree *digitsTree) const
   branch->GetEntry(0);
 }
 
+//==================================================================================
+Bool_t AliEMCALReconstructor::CalculateResidual(AliESDtrack *track, AliESDCaloCluster *cluster, Double_t &dEta, Double_t &dPhi)const
+{
+  //
+  // calculate the residual between track and cluster
+  //
+
+  // If the esdFriend is available, use the TPCOuter point as the starting point of extrapolation
+  // Otherwise use the TPCInner point
+  AliExternalTrackParam *trkParam;
+  const AliESDfriendTrack*  friendTrack = track->GetFriendTrack();
+  if(friendTrack && friendTrack->GetTPCOut())
+    trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
+  else
+    trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+  if(!trkParam) return kFALSE;
+
+  //Perform extrapolation
+  Double_t trkPos[3];
+  Float_t  clsPos[3];
+
+  AliExternalTrackParam *trkParamTmp = new AliExternalTrackParam(*trkParam);
+  cluster->GetPosition(clsPos);
+  TVector3 vec(clsPos[0],clsPos[1],clsPos[2]);
+  Double_t alpha =  ((int)(vec.Phi()*TMath::RadToDeg()/20)+0.5)*20*TMath::DegToRad();
+  //Rotate to proper local coordinate
+  vec.RotateZ(-alpha); 
+  trkParamTmp->Rotate(alpha); 
+  //extrapolation is done here
+  if(!AliTrackerBase::PropagateTrackToBxByBz(trkParamTmp, vec.X(), track->GetMass(), GetRecParam()->GetExtrapolateStep(), kFALSE)) 
+    return kFALSE; 
+
+  //Calculate the residuals
+  trkParamTmp->GetXYZ(trkPos);     
+  delete trkParamTmp;
+   
+  TVector3 clsPosVec(clsPos[0],clsPos[1],clsPos[2]);
+  TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
+      
+  Double_t clsPhi = clsPosVec.Phi();
+  if(clsPhi<0) clsPhi+=2*TMath::Pi();
+  Double_t trkPhi = trkPosVec.Phi();
+  if(trkPhi<0) trkPhi+=2*TMath::Pi();
+
+  dPhi = clsPhi-trkPhi;
+  dEta = clsPosVec.Eta()-trkPosVec.Eta();
+
+  return kTRUE;
+}
+
+//
+//==================================================================================
+//
+AliEMCALReconstructor::AliEMCALMatch::AliEMCALMatch() 
+  : TObject(),  
+    fIndexT(-1), 
+    fDistance(-999.),
+    fdEta(-999.),
+    fdPhi(-999.)
+{
+  //default constructor
 
+}
+
+//
+//==================================================================================
+//
+AliEMCALReconstructor::AliEMCALMatch::AliEMCALMatch(const AliEMCALMatch& copy)
+  : TObject(),
+    fIndexT(copy.fIndexT),
+    fDistance(copy.fDistance),
+    fdEta(copy.fdEta),
+    fdPhi(copy.fdPhi)
+{
+  //copy ctor
+}
+
+//
+//==================================================================================
+//
+Int_t AliEMCALReconstructor::AliEMCALMatch::Compare(const TObject *obj) const 
+{
+  //
+  // Compare wrt the residual
+  //
+       
+  AliEMCALReconstructor::AliEMCALMatch *that = (AliEMCALReconstructor::AliEMCALMatch*)obj;
+       
+  Double_t thisDist = fDistance;//fDistance;
+  Double_t thatDist = that->fDistance;//that->GetDistance();
+       
+  if (thisDist > thatDist) return 1;
+  else if (thisDist < thatDist) return -1;
+  return 0;
+}
index e34902c..68f347e 100644 (file)
@@ -66,6 +66,32 @@ class AliEMCALReconstructor : public AliReconstructor {
   static TClonesArray* GetDigitsArr() {return fgDigitsArr;}
   
   void           FillMisalMatrixes(AliESDEvent* esd)const ;
+
+  //New class used to sort the matched tracks
+  class  AliEMCALMatch : public TObject
+  {
+  public:
+    AliEMCALMatch();
+    AliEMCALMatch(const AliEMCALMatch& copy);
+    virtual ~AliEMCALMatch() { }
+    //----------------------------------------------------------------------------
+    Int_t     Compare(const TObject *obj) const;
+    Bool_t    IsSortable() const {return kTRUE;}
+    Double_t  GetDistance() const {return fDistance;}
+    Double_t  GetdEta() const {return fdEta;}
+    Double_t  GetdPhi() const {return fdPhi;}
+    Int_t     GetIndexT() const {return fIndexT;}
+    void      SetIndexT(Int_t itr) {fIndexT=itr;}
+    void      SetDistance(Double_t dist) {fDistance=dist;}
+    void      SetdEta(Double_t dEta) {fdEta=dEta;}
+    void      SetdPhi(Double_t dPhi) {fdPhi=dPhi;}
+  private:
+    Int_t      fIndexT;      // track index in 'fTracks' array
+    Double_t   fDistance;    // track - cluster distance
+    Double_t   fdEta;        // track - cluster residual in eta
+    Double_t   fdPhi;        // track - cluster residual in phi
+  };
+  Bool_t CalculateResidual(AliESDtrack *track, AliESDCaloCluster *cluster, Double_t &dEta, Double_t &dPhi) const;
   
  private:
   
@@ -89,10 +115,12 @@ class AliEMCALReconstructor : public AliReconstructor {
   //Trigger specific
   static AliEMCALTriggerElectronics* fgTriggerProcessor; // Trigger preprocessor  
   AliEMCALTriggerData        * fTriggerData;      // Trigger parameters data container
+
+  //Track matching
+  TList                      * fMatches;          //! collection of matches between tracks and clusters
   
-  ClassDef(AliEMCALReconstructor,11)  // Reconstruction algorithm class (Base Class)
-    
-    }; 
+  ClassDef(AliEMCALReconstructor,12)  // Reconstruction algorithm class (Base Class)
+}; 
 
 #endif // ALIEMCALRECONSTRUCTOR_H
 
index c381ff3..37e5bc7 100644 (file)
@@ -27,6 +27,7 @@
 //
 // ------------------------------------------------------------------------
 // author: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
+// Revised by Rongrong 2010-05-31 (rongrong.ma@cern.ch)
 //=========================================================================
 
 #include <Riostream.h>
@@ -64,30 +65,23 @@ ClassImp(AliEMCALTracker)
 //
 AliEMCALTracker::AliEMCALTracker() 
   : AliTracker(),
-    fNPropSteps(0),
-    fTrackCorrMode(kTrackCorrNone),
-    fCutX(50.0),
-    fCutY(50.0),
-    fCutZ(50.0),
-    fCutAlphaMin(-200.0),
-    fCutAlphaMax(200.0),
-    fCutAngle(100.0),
-    fMaxDist(10.0),
-    fCutNITS(3.0),
-    fCutNTPC(20.0),
-    fRho(1.0),
-    fX0(1.0),
+    fCutPt(0),
+    fCutNITS(0),
+    fCutNTPC(50),
+    fStep(50),
+    fTrackCorrMode(kTrackCorrMMB),     
+    fCutEta(0.025),
+    fCutPhi(0.05),
     fTracks(0),
     fClusters(0),
-    fMatches(0),
     fGeom(0)
 {
-       //
-       // Default constructor.
-       // Initializes al simple data members to default values,
-       // and all collections to NULL.
-       // Output file name is set to a default value.
-       //
+  //
+  // Default constructor.
+  // Initializes all simple data members to default values,
+   // and all collections to NULL.
+  // Output file name is set to a default value.
+  //
   InitParameters();
 }
 //
@@ -95,65 +89,55 @@ AliEMCALTracker::AliEMCALTracker()
 //
 AliEMCALTracker::AliEMCALTracker(const AliEMCALTracker& copy) 
   : AliTracker(),
-    fNPropSteps(copy.fNPropSteps),
-    fTrackCorrMode(copy.fTrackCorrMode),
-    fCutX(copy.fCutX),
-    fCutY(copy.fCutY),
-    fCutZ(copy.fCutZ),
-    fCutAlphaMin(copy.fCutAlphaMin),
-    fCutAlphaMax(copy.fCutAlphaMax),
-    fCutAngle(copy.fCutAngle),
-    fMaxDist(copy.fMaxDist),
+    fCutPt(copy.fCutPt),
     fCutNITS(copy.fCutNITS),
     fCutNTPC(copy.fCutNTPC),
-    fRho(copy.fRho),
-    fX0(copy.fX0),
+    fStep(copy.fStep),
+    fTrackCorrMode(copy.fTrackCorrMode),
+    fCutEta(copy.fCutEta),
+    fCutPhi(copy.fCutPhi),
     fTracks((TObjArray*)copy.fTracks->Clone()),
     fClusters((TObjArray*)copy.fClusters->Clone()),
-    fMatches((TList*)copy.fMatches->Clone()),
     fGeom(copy.fGeom)
 {
-       //
-       // Copy constructor
-       // Besides copying all parameters, duplicates all collections.
-       //
+  //
+  // Copy constructor
+  // Besides copying all parameters, duplicates all collections.
+  //
 }
 //
 //------------------------------------------------------------------------------
 //
 AliEMCALTracker& AliEMCALTracker::operator=(const AliEMCALTracker& copy)
 {
-       //
-       // Assignment operator.
-       // Besides copying all parameters, duplicates all collections.  
-       //
-       
-       fCutX = copy.fCutX;
-       fCutY = copy.fCutY;
-       fCutZ = copy.fCutZ;
-       fCutAlphaMin = copy.fCutAlphaMin;
-       fCutAlphaMax = copy.fCutAlphaMax;
-       fCutAngle = copy.fCutAngle;
-       fMaxDist = copy.fMaxDist;
-       fCutNITS = copy.fCutNITS;
-       fCutNTPC = copy.fCutNTPC;
-       
-       fTracks = (TObjArray*)copy.fTracks->Clone();
-       fClusters = (TObjArray*)copy.fClusters->Clone();
-       fMatches = (TList*)copy.fMatches->Clone();
-       
-       fGeom = copy.fGeom;
-       
-       return (*this);
+  //
+  // Assignment operator.
+  // Besides copying all parameters, duplicates all collections.       
+  //
+
+  fCutPt  = copy.fCutPt;
+  fCutEta = copy.fCutEta;
+  fCutPhi = copy.fCutPhi;      
+  fStep = copy.fStep;
+  fTrackCorrMode = copy.fTrackCorrMode;
+
+  fCutNITS = copy.fCutNITS;
+  fCutNTPC = copy.fCutNTPC;
+  
+  fTracks = (TObjArray*)copy.fTracks->Clone();
+  fClusters = (TObjArray*)copy.fClusters->Clone();
+  fGeom = copy.fGeom;
+  
+  return (*this);
 }
 //
 //------------------------------------------------------------------------------
 //
 void AliEMCALTracker::InitParameters()
 {
-       //
-       // Retrieve initialization parameters
-       //
+  //
+  // Retrieve initialization parameters
+  //
        
   // Check if the instance of AliEMCALRecParam exists, 
   const AliEMCALRecParam* recParam = AliEMCALReconstructor::GetRecParam();
@@ -162,60 +146,17 @@ void AliEMCALTracker::InitParameters()
     AliFatal("Reconstruction parameters for EMCAL not set!");
   }
   else{
-    fCutX =  recParam->GetTrkCutX();
-    fCutY =  recParam->GetTrkCutY();
-    fCutZ =  recParam->GetTrkCutZ();
-    fMaxDist =  recParam->GetTrkCutR();
-    fCutAngle =  recParam->GetTrkCutAngle();
-    fCutAlphaMin =  recParam->GetTrkCutAlphaMin();
-    fCutAlphaMax =  recParam->GetTrkCutAlphaMax();
+    fCutEta  =  recParam->GetMthCutEta();
+    fCutPhi  =  recParam->GetMthCutPhi();
+    fStep    =   recParam->GetExtrapolateStep();
+    fCutPt   =  recParam->GetTrkCutPt();
     fCutNITS = recParam->GetTrkCutNITS();
     fCutNTPC = recParam->GetTrkCutNTPC();
   }
        
 }
-//
-//------------------------------------------------------------------------------
-//
-TTree* AliEMCALTracker::SearchTrueMatches()
-{
-  //Search through the list of
-  //track match candidates and clusters
-  //and look for true matches
-  //
-  //
-       if (!fClusters) return 0;
-       if (fClusters->IsEmpty()) return 0;
-       if (!fTracks) return 0;
-       if (fTracks->IsEmpty()) return 0;
-       
-       TTree *outTree = new TTree("tree", "True matches from event");
-       Int_t indexT, indexC, label;
-       outTree->Branch("indexC", &indexC, "indexC/I");
-       outTree->Branch("indexT", &indexT, "indexT/I");
-       outTree->Branch("label",  &label , "label/I");
-       
-       Double_t dist=0.;
-       Int_t ic, nClusters = (Int_t)fClusters->GetEntries();
-       Int_t it, nTracks = fTracks->GetEntries();
-       
-       for (ic = 0; ic < nClusters; ic++) {
-               AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(ic);
-               label = cluster->Label();
-               indexC = cluster->Index();
-               for (it = 0; it < nTracks; it++) {
-                       AliEMCALTrack *track = (AliEMCALTrack*)fTracks->At(it);
-                       if (TMath::Abs(track->GetSeedLabel()) != label) continue;
-                       dist = CheckPair(track, cluster);
-                       if (dist <= fMaxDist) {
-                               indexT = track->GetSeedIndex();
-                               outTree->Fill();
-                       }
-               }
-       }
-       
-       return outTree;
-}
+
 //
 //------------------------------------------------------------------------------
 //
@@ -229,15 +170,15 @@ void AliEMCALTracker::Clear(Option_t* option)
        TString opt(option);
        Bool_t clearTracks = opt.Contains("TRACKS");
        Bool_t clearClusters = opt.Contains("CLUSTERS");
-       Bool_t clearMatches = opt.Contains("MATCHES");
        if (opt.Contains("ALL")) {
                clearTracks = kTRUE;
                clearClusters = kTRUE;
-               clearMatches = kTRUE;
        }
        
+       //fTracks is a collection of esdTrack
+       //When clearing this array, the linked objects should not be deleted
        if (fTracks != 0x0 && clearTracks) {
-          fTracks->Delete();
+          fTracks->Clear();
           delete fTracks;
            fTracks = 0;
        }
@@ -246,11 +187,6 @@ void AliEMCALTracker::Clear(Option_t* option)
           delete fClusters;
           fClusters = 0;
        }
-       if (fMatches != 0x0 && clearMatches) {
-          fMatches->Delete();
-          delete fMatches;
-           fMatches = 0;
-       }
 }
 //
 //------------------------------------------------------------------------------
@@ -285,7 +221,6 @@ Int_t AliEMCALTracker::LoadClusters(TTree *cTree)
        for (Int_t i = 0; i < nClusters; i++) {
                AliEMCALRecPoint *cluster = (AliEMCALRecPoint*)clusters->At(i);
                if (!cluster) continue;
-               if (cluster->GetClusterType() != AliVCluster::kEMCALClusterv1) continue;
                AliEMCALMatchCluster *matchCluster = new AliEMCALMatchCluster(i, cluster);
                fClusters->AddLast(matchCluster);
        }
@@ -293,10 +228,8 @@ Int_t AliEMCALTracker::LoadClusters(TTree *cTree)
        branch->SetAddress(0);
         clusters->Delete();
         delete clusters;
-        if (fClusters->IsEmpty())
-           AliDebug(1,"No clusters collected");
 
-       AliDebug(1,Form("Collected %d clusters (RecPoints)", fClusters->GetEntries()));
+       AliInfo(Form("Collected %d RecPoints from Tree", fClusters->GetEntries()));
 
        return 0;
 }
@@ -305,86 +238,95 @@ Int_t AliEMCALTracker::LoadClusters(TTree *cTree)
 //
 Int_t AliEMCALTracker::LoadClusters(AliESDEvent *esd) 
 {
-       //
-       // Load EMCAL clusters in the form of AliESDCaloClusters,
-       // from an AliESD object.
-       //
-
-       // make sure that tracks/clusters collections are empty
-       Clear("CLUSTERS");
-       
-       Int_t start = 0;
-       Int_t nClustersEMC = esd->GetNumberOfCaloClusters();
-       Int_t end = start + nClustersEMC;
-       
-       fClusters = new TObjArray(0);
-               
-       Int_t i;
-       for (i = start; i < end; i++) {
-               AliESDCaloCluster *cluster = esd->GetCaloCluster(i);
-               if (!cluster) continue;
-        if (!cluster->IsEMCAL()) continue ; 
-               AliEMCALMatchCluster *matchCluster = new AliEMCALMatchCluster(i, cluster);
-               fClusters->AddLast(matchCluster);
-       }
-        if (fClusters->IsEmpty())
-           AliDebug(1,"No clusters collected");
-       
-       AliDebug(1,Form("Collected %d clusters from ESD", fClusters->GetEntries()));
-
-       return 0;
+  //
+  // Load EMCAL clusters in the form of AliESDCaloClusters,
+  // from an AliESD object.
+  //
+  
+  // make sure that tracks/clusters collections are empty
+  Clear("CLUSTERS");
+  fClusters = new TObjArray(0);
+  
+  Int_t nClusters = esd->GetNumberOfCaloClusters();                    
+  for (Int_t i=0; i<nClusters; i++) 
+    {
+      AliESDCaloCluster *cluster = esd->GetCaloCluster(i);
+      if (!cluster || !cluster->IsEMCAL()) continue ; 
+      AliEMCALMatchCluster *matchCluster = new AliEMCALMatchCluster(i, cluster);
+      fClusters->AddLast(matchCluster);
+    }
+  
+  AliInfo(Form("Collected %d clusters from ESD", fClusters->GetEntries()));
+  return 0;
 }
 //
 //------------------------------------------------------------------------------
 //
 Int_t AliEMCALTracker::LoadTracks(AliESDEvent *esd)
 {
-       //
-       // Load ESD tracks.
-       //
-       
-       Clear("TRACKS");
+  //
+  // Load ESD tracks.
+  //
        
-       Int_t nTracks = esd->GetNumberOfTracks();
-       fTracks = new TObjArray(0);
+  Clear("TRACKS");
+  fTracks = new TObjArray(0);
        
-       Int_t i=0, j=0;
-       Bool_t isKink=kFALSE;
-       Double_t alpha=0.; 
-       for (i = 0; i < nTracks; i++) {
-               AliESDtrack *esdTrack = esd->GetTrack(i);
-               // set by default the value corresponding to "no match"
-               esdTrack->SetEMCALcluster(kUnmatched);
-//             if (esdTrack->GetLabel() < 0) continue;
-//             if (!(esdTrack->GetStatus() & AliESDtrack::kTOFout)) continue;
-               isKink = kFALSE;
-               for (j = 0; j < 3; j++) {
-                       if (esdTrack->GetKinkIndex(j) != 0) isKink = kTRUE;
-               }
-               if (isKink) continue;
-               AliEMCALTrack *track = new AliEMCALTrack(*esdTrack);
-               track->SetMass(0.13957018);
-               // check alpha and reject the tracks which fall outside EMCAL acceptance
-               alpha = track->GetAlpha() * TMath::RadToDeg();
-               if (alpha >  -155.0 && alpha < 67.0) {
-                       delete track;
-                       continue;
-               }
-//             if (!PropagateToEMCAL(track)) {
-//                     delete track;
-//                     continue;
-//             }
-               track->SetSeedIndex(i);
-               track->SetSeedLabel(esdTrack->GetLabel());
-               fTracks->AddLast(track);
-       }
-       if (fTracks->IsEmpty()) {
-               AliDebug(1,"No tracks collected");
+  Int_t nTracks = esd->GetNumberOfTracks();
+  Bool_t isKink=kFALSE;
+  for (Int_t i = 0; i < nTracks; i++) 
+    {
+      AliESDtrack *esdTrack = esd->GetTrack(i);
+      // set by default the value corresponding to "no match"
+      esdTrack->SetEMCALcluster(kUnmatched);
+
+      //Select good quaulity tracks
+      if(esdTrack->Pt()<fCutPt) continue;
+      if(esdTrack->GetNcls(1)<fCutNTPC)continue;
+
+      //Reject kink daughters
+      isKink = kFALSE;
+      for (Int_t j = 0; j < 3; j++)
+       {
+         if (esdTrack->GetKinkIndex(j) != 0) isKink = kTRUE;
        }
-       
-       AliDebug(1,Form("Collected %d tracks", fTracks->GetEntries()));
+      if (isKink) continue;
 
-       return 0;
+      //Loose geometric cut
+      Double_t phi = esdTrack->Phi()*TMath::RadToDeg();
+      if(TMath::Abs(esdTrack->Eta())>1 || phi <= 60 || phi >= 200 ) continue;
+
+      fTracks->AddLast(esdTrack);
+    }
+
+      AliInfo(Form("Collected %d tracks", fTracks->GetEntries()));
+      return 0;
+}
+//
+//------------------------------------------------------------------------------
+//
+void AliEMCALTracker::SetTrackCorrectionMode(Option_t *option)
+{
+  //
+  // Set track correction mode
+  // gest the choice in string format and converts into 
+  // internal enum
+  //
+  
+  TString opt(option);
+  opt.ToUpper();
+  
+  if (!opt.CompareTo("NONE")) 
+    {
+      fTrackCorrMode = kTrackCorrNone;
+    }
+  else if (!opt.CompareTo("MMB")) 
+    {
+      fTrackCorrMode = kTrackCorrMMB;
+    }
+  else 
+    {
+      cerr << "E-AliEMCALTracker::SetTrackCorrectionMode '" << option << "': Unrecognized option" << endl;
+    }
 }
 //
 //------------------------------------------------------------------------------
@@ -400,598 +342,103 @@ Int_t AliEMCALTracker::PropagateBack(AliESDEvent* esd)
         //
         // Note: should always return 0=OK, because otherwise all tracking
         // is aborted for this event
-
+  
        if (!esd) {
                AliError("NULL ESD passed");
                return 1;
        }
        
-       // step 1: 
-       // if cluster array is empty, cluster are collected
-       // from the passed ESD, and work is done with ESDCaloClusters
+       // step 1: collect clusters
        Int_t okLoadClusters, nClusters;
        if (!fClusters || (fClusters && fClusters->IsEmpty())) {
                okLoadClusters = LoadClusters(esd);
        }
        nClusters = fClusters->GetEntries();
-       
-       // step 2:
-       // collect ESD tracks
-       Int_t okLoadTracks = LoadTracks(esd), nTracks;
-       if (okLoadTracks) return 3;
+               
+       // step 2: collect ESD tracks
+       Int_t nTracks, okLoadTracks;
+       okLoadTracks = LoadTracks(esd);
        nTracks = fTracks->GetEntries();
        
-       // step 3:
-       // each track is propagated to the "R" position of each cluster.
-       // The closest cluster is assigned as match.
-       // IF no clusters lie within the maximum allowed distance, no matches are assigned.
-       Int_t nMatches = CreateMatches();
-       if (!nMatches) {
-               AliDebug(1,Form("#clusters = %d -- #tracks = %d --> No good matches found.", nClusters, nTracks));
-               return 0;
-       }
-       else {
-               AliDebug(1,Form("#clusters = %d -- #tracks = %d --> Found %d matches.", nClusters, nTracks, nMatches));
-       }
-       
-       // step 4:
-       // when more than 1 track share the same matched cluster, only the closest one is kept.
-       Int_t nRemoved = SolveCompetitions();
-       AliDebug(1,Form("Removed %d duplicate matches", nRemoved));
-       if (nRemoved >= nMatches) {
-               AliError("Removed ALL matches! Check the algorithm or data. Nothing to save");
-               return 5;
-       }
-       
-       // step 5:
-       // save obtained information setting the 'fEMCALindex' field of AliESDtrack object
-       Int_t nSaved = 0, trackID;
-       TListIter iter(fMatches);
-       AliEMCALMatch *match = 0;
-       while ( (match = (AliEMCALMatch*)iter.Next()) ) {
-               if (!match->CanBeSaved()) continue;
-               AliEMCALTrack *track = (AliEMCALTrack*)fTracks->At(match->GetIndexT());
-               AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(match->GetIndexC());
-               trackID = track->GetSeedIndex();
-               AliESDtrack *esdTrack = esd->GetTrack(trackID);
-               if (!esdTrack) continue;
-
-               // cut on its and tpc track hits
-               if(esdTrack->GetNcls(0)<=fCutNITS)continue;
-               if(esdTrack->GetNcls(1)<=fCutNTPC)continue;
-             
-               esdTrack->SetEMCALcluster(cluster->Index());
-               nSaved++;
-       }
-       /*
-       AliEMCALTrack *track = 0;
-       TObjArrayIter tracks(fTracks);
-       while ( (track = (AliEMCALTrack*)tracks.Next()) ) {
-               trackID = track->GetSeedIndex();
-               clusterID = track->GetMatchedClusterIndex();
-               AliESDtrack *esdTrack = esd->GetTrack(trackID);
-               if (!esdTrack) continue;
-               if (clusterID < 0) {
-                       esdTrack->SetEMCALcluster(kUnmatched);
-               }
-               else {
-                       AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(clusterID);
-                       if (!cluster) continue;
-               
-                       esdTrack->SetEMCALcluster(cluster->Index());
-                       nSaved++;
-               }
-       }
-       */
-       AliDebug(1,Form("Saved %d matches", nSaved));
+       // step 3: for each track, find the closest cluster as matched within residual cuts
+       Int_t index=-1;
+       for (Int_t it = 0; it < nTracks; it++) 
+         {
+           AliESDtrack *track = (AliESDtrack*)fTracks->At(it);
+           index = FindMatchedCluster(track);
+           if (index>-1) 
+             {
+               AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(index);
+               track->SetEMCALcluster(cluster->Index());
+             }
+         }
 
        return 0;
 }
-//
-//------------------------------------------------------------------------------
-//
-void AliEMCALTracker::SetTrackCorrectionMode(Option_t *option)
-{
-       //
-       // Set track correction mode
-       // gest the choice in string format and converts into 
-       // internal enum
-       //
-       
-       TString opt(option);
-       opt.ToUpper();
-       
-       if (!opt.CompareTo("NONE")) {
-               fTrackCorrMode = kTrackCorrNone;
-       }
-       else if (!opt.CompareTo("MMB")) {
-               fTrackCorrMode = kTrackCorrMMB;
-       }
-       else if (!opt.CompareTo("FIXED")) {
-               fTrackCorrMode = kTrackCorrFixed;
-       }
-       else {
-               cerr << "E-AliEMCALTracker::SetTrackCorrectionMode '" << option << "': Unrecognized option" << endl;
-       }
-}
 
 //
 //------------------------------------------------------------------------------
 //
-Double_t AliEMCALTracker::AngleDiff(Double_t angle1, Double_t angle2)
-{
-       // 
-       // [PRIVATE]
-       // Given two angles in radiants, it converts them in the range 0-2pi
-       // then computes their true difference, i.e. if the difference a1-a2
-       // results to be larger than 180 degrees, it returns 360 - diff.
-       //
-       
-       if (angle1 < 0.0) angle1 += TMath::TwoPi();
-       if (angle1 > TMath::TwoPi()) angle1 -= TMath::TwoPi();
-       if (angle2 < 0.0) angle2 += TMath::TwoPi();
-       if (angle2 > TMath::TwoPi()) angle2 -= TMath::TwoPi();
-       
-       Double_t diff = TMath::Abs(angle1 - angle2);
-       if (diff > TMath::Pi()) diff = TMath::TwoPi() - diff;
-       
-       if (angle2 > angle1) diff = -diff;
-       
-       return diff;
-}
-//
-//------------------------------------------------------------------------------
-//
-Double_t AliEMCALTracker::CheckPair
-(AliEMCALTrack *track, AliEMCALMatchCluster *cl)
-{
-       //
-       // Given a track and a cluster,
-       // propagates the first to the radius of the second.
-       // Then, checks the propagation point against all cuts.
-       // If at least a cut is not passed, a valuer equal to 
-       // twice the maximum allowed distance is passed (so the value returned
-       // will not be taken into account when creating matches)
-       //
-       
-       // TEMP
-       //Bool_t isTrue = kFALSE;
-//     if (tr->GetSeedLabel() == cl->Label()) {
-//             isTrue = kTRUE;
-//     }
-       
-       // copy track into temporary variable
-       AliEMCALTrack *tr = new AliEMCALTrack(*track);
-       
-       Double_t distance = 2.0 * fMaxDist;
-       
-       // check against cut on difference 'alpha - phi'
-       Double_t phi = TMath::ATan2(cl->Y(), cl->X());
-       phi = AngleDiff(phi, tr->GetAlpha());
-       if (phi < fCutAlphaMin || phi > fCutAlphaMax){
-         delete tr;
-         return distance;
-       }
-       
-       // try to propagate to cluster radius
-       // (return the 'distance' value if it fails)
-       Double_t pos[3], &x = pos[0], &y = pos[1], &z = pos[2];
-       Double_t x0, rho;
-       tr->GetXYZ(pos);
-       Double_t rt = TMath::Sqrt(x*x + y*y);
-       Double_t rc = TMath::Sqrt(cl->X()*cl->X() + cl->Y()*cl->Y());
-       
-       if (fTrackCorrMode == kTrackCorrMMB) {
-               Double_t pos1[3], pos2[3], param[6];
-               pos1[0] = x;
-               pos1[1] = y;
-               pos1[2] = z;
-               pos2[0] = cl->X();
-               pos2[1] = cl->Y();
-               pos2[2] = cl->Z();
-               MeanMaterialBudget(pos1, pos2, param);
-               rho = param[0]*param[4];
-               x0 = param[1];
-       }
-       else if (fTrackCorrMode == kTrackCorrFixed) {
-               rho = fRho;
-               x0 = fX0;
-       }
-       else {
-               rho = 0.0;
-               x0 = 0.0;
-       }
-       if (fNPropSteps) {
-               Int_t i=0;
-               Double_t r=0.;
-               cout.setf(ios::fixed);
-               cout.precision(5);
-               //if (isTrue) cout << "Init : " << rt << ' ' << x << ' ' << y << ' ' << z << endl;
-               for (i = 0; i < fNPropSteps; i++) {
-                       r = rt + (rc - rt) * ((Double_t)(i+1)/(Double_t)fNPropSteps);
-                       if (!tr->PropagateTo(r, x0, rho)){
-                         delete tr;
-                         return distance;
-                       }
-                       tr->GetXYZ(pos);
-               //      if (isTrue) cout << "Step : " << r << ' ' << x << ' ' << y << ' ' << z << endl;
-               }
-               //if (isTrue) cout << "Clstr: " << rc << ' ' << cl->X() << ' ' << cl->Y() << ' ' << cl->Z() << endl;
-       }
-       else {
-               // when no steps are used, no correction makes sense
-               //if (!tr->PropagateTo(rc, 0.0, 0.0)) return distance;
-               if (!tr->PropagateToGlobal(cl->X(), cl->Y(), cl->Z(), 0.0, 0.0)){
-                 delete tr;
-                 return distance;
-               }
-               /*
-               Bool_t propOK = kFALSE;
-               cout << "START" << endl;
-               Double_t dist, rCHK, bestDist = 10000000.0;
-               for (Double_t rTMP = rc; rTMP> rc*0.95; rTMP -= 0.1) {
-                       if (!tr->PropagateTo(rTMP)) continue;
-                       propOK = kTRUE;
-                       tr->GetXYZ(pos);
-                       rCHK = TMath::Sqrt(x*x + y*y);
-                       dist = TMath::Abs(rCHK - rc);
-                       cout << rCHK << " vs. " << rc << endl;
-                       
-                       if (TMath::Abs(rCHK - rc) < 0.01) break;
-               }
-               cout << "STOP" << endl;
-               if (!propOK) return distance;
-               */
-       }
-       
-       // get global propagation of track at end of propagation
-       tr->GetXYZ(pos);
-       
-       // check angle cut
-       TVector3 vc(cl->X(), cl->Y(), cl->Z());
-       TVector3 vt(x, y, z);
-       Double_t angle = TMath::Abs(vc.Angle(vt)) * TMath::RadToDeg();
-       // check: where is the track?
-//     Double_t r    = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
-//     Double_t phiT = TMath::ATan2(pos[1], pos[0]) * TMath::RadToDeg();
-//     Double_t phiC = vc.Phi() * TMath::RadToDeg();
-       //cout << "Propagated R, phiT, phiC = " << r << ' ' << phiT << ' ' << phiC << endl;
-       
-       if (angle > fCutAngle) {
-               //cout << "angle" << endl;
-         delete tr;
-               return distance;
-       }
-               
-       // compute differences wr to each coordinate
-       x -= cl->X();
-       if (TMath::Abs(x) > fCutX) {
-               //cout << "cut X" << endl;
-         delete tr;
-               return distance;
-       }
-       y -= cl->Y();
-       if (TMath::Abs(y) > fCutY) {
-               //cout << "cut Y" << endl;
-         delete tr;
-               return distance;
-       }
-       z -= cl->Z();
-       if (TMath::Abs(z) > fCutZ) {
-               //cout << "cut Z" << endl;
-         delete tr;
-               return distance;
-       }
-       
-       // compute true distance
-       distance = TMath::Sqrt(x*x + y*y + z*z);
-       //Double_t temp = CheckPairV2(tr, cl);
-       //if (temp < distance) return temp; else 
-       
-       // delete temporary object
-       delete tr;
-       
-       return distance;
-}
-//
-//------------------------------------------------------------------------------
-//
-Double_t AliEMCALTracker::CheckPairV2
-(AliEMCALTrack *tr, AliEMCALMatchCluster *cl)
-{
-       //
-       // Given a track and a cluster,
-       // propagates the first to the radius of the second.
-       // Then, checks the propagation point against all cuts.
-       // If at least a cut is not passed, a valuer equal to 
-       // twice the maximum allowed distance is passed (so the value returned
-       // will not be taken into account when creating matches)
-       //
-       
-       // TEMP
-//     Bool_t isTrue = kFALSE;
-//     if (tr->GetSeedLabel() == cl->Label()) {
-//             isTrue = kTRUE;
-//             cout << "TRUE MATCH!!!" << endl;
-//     }
-       
-       Double_t distance = 2.0 * fMaxDist;
-       
-       Double_t x0=0., rho=0.;
-       if (fTrackCorrMode == kTrackCorrMMB) {
-               Double_t pos1[3], pos2[3], param[6];
-               tr->GetXYZ(pos1);
-//             pos1[0] = x;
-//             pos1[1] = y;
-//             pos1[2] = z;
-               pos2[0] = cl->X();
-               pos2[1] = cl->Y();
-               pos2[2] = cl->Z();
-               MeanMaterialBudget(pos1, pos2, param);
-               rho = param[0]*param[4];
-               x0 = param[1];
-       }
-       else if (fTrackCorrMode == kTrackCorrFixed) {
-               rho = fRho;
-               x0 = fX0;
-       }
-       else {
-               rho = 0.0;
-               x0 = 0.0;
-       }
-       
-       // check against cut on difference 'alpha - phi'
-       Double_t phi = TMath::ATan2(cl->Y(), cl->X());
-       phi = AngleDiff(phi, tr->GetAlpha());
-       if (phi < fCutAlphaMin || phi > fCutAlphaMax) return distance;
-       
-       // get cluster position and put them into a vector
-       TVector3 vc(cl->X(), cl->Y(), cl->Z());
-       // rotate the vector in order to put all clusters on a plane intersecting 
-       // vertically the X axis; the angle depends on the sector
-       Double_t clusterRot=0., clusterPhi = vc.Phi() * TMath::RadToDeg();
-       if (clusterPhi < 0.0) clusterPhi += 360.0;
-       if (clusterPhi < 100.0) {
-               clusterRot = -90.0;
-       }
-       else if (clusterPhi < 120.0) {
-               clusterRot = -110.0;
-       }
-       else if (clusterPhi < 140.0) {
-               clusterRot = -130.0;
-       }
-       else if (clusterPhi < 160.0) {
-               clusterRot = -150.0;
-       }
-       else if (clusterPhi < 180.0) {
-               clusterRot = -170.0;
-       }
-       else {
-               clusterRot = -190.0;
-       }
-       vc.RotateZ(clusterRot * TMath::DegToRad());
-       // generate a track from the ESD track selected
-       AliEMCALTrack *track = new AliEMCALTrack(*tr);
-       // compute the 'phi' coordinate of the intersection point to 
-       // the EMCAL surface
-       Double_t x = vc.X();
-       Double_t y = 0.;
-       track->GetYAt(vc.X(), track->GetBz(), y);
-       Double_t tmp = x*TMath::Cos(track->GetAlpha()) - y*TMath::Sin(track->GetAlpha());
-       y = x*TMath::Sin(track->GetAlpha()) + y*TMath::Cos(track->GetAlpha());
-       x = tmp;
-       Double_t trackPhi = TMath::ATan2(y, x) * TMath::RadToDeg();
-       // compute phi difference
-       Double_t dphi = trackPhi - clusterPhi;
-       if (TMath::Abs(dphi) > 180.0) {
-               dphi = 360.0 - TMath::Abs(dphi);
-               if (clusterPhi > trackPhi) dphi = -dphi;
-       }
-       // propagate track to the X position of rotated cluster
-       // and get the vector of X, Y, Z in the local ref. frame of the track
-       track->PropagateTo(vc.X(), x0, rho);
-       TVector3 vt(track->GetX(), track->GetY(), track->GetZ());
-       vt.RotateZ((clusterPhi - trackPhi) * TMath::DegToRad());
-       TVector3 vdiff = vt-vc;
-               
-       // compute differences wr to each coordinate
-       delete track;
-       if (vdiff.X() > fCutX) return distance;
-       if (vdiff.Y() > fCutY) return distance;
-       if (vdiff.Z() > fCutZ) return distance;
-       
-       // compute true distance
-       distance = vdiff.Mag();
-       return distance;
-}
-//
-//------------------------------------------------------------------------------
-//
-Double_t AliEMCALTracker::CheckPairV3
-(AliEMCALTrack *track, AliEMCALMatchCluster *cl)
-{
-       //
-       // Given a track and a cluster,
-       // propagates the first to the radius of the second.
-       // Then, checks the propagation point against all cuts.
-       // If at least a cut is not passed, a valuer equal to 
-       // twice the maximum allowed distance is passed (so the value returned
-       // will not be taken into account when creating matches)
-       //
-       
-       AliEMCALTrack tr(*track);
-       
-       Int_t    sector=-1;
-       Double_t distance = 2.0 * fMaxDist;
-       Double_t dx=0., dy=0., dz=0.;
-       Double_t phi=0., alpha=0., slope=0., tgtXnum=0., tgtXden=0., sectorWidth = 20.0 * TMath::DegToRad();
-       Double_t xcurr=0., xprop=0., param[6] = {0., 0., 0., 0., 0., 0.}, x0=0., rho=0., bz=0.;
-       Double_t x[3]= {0., 0., 0.}, x1[3]= {0., 0., 0.}, x2[3]= {0., 0., 0.};
-       
-       // get initial track position
-       xcurr = tr.GetX();
-       
-       // evaluate the EMCAL sector number
-       phi = cl->Phi();
-       if (phi < 0.0) phi += TMath::TwoPi();
-       sector = (Int_t)(phi / sectorWidth);
-       alpha = ((Double_t)sector + 0.5) * sectorWidth;
-       // evaluate the corresponding X for track propagation
-       slope = TMath::Tan(alpha - 0.5*TMath::Pi());
-       tgtXnum = cl->Y() - slope * cl->X();
-       tgtXden = TMath::Sqrt(1.0 + slope*slope);
-       xprop = TMath::Abs(tgtXnum / tgtXden);
-       
-       // propagate by small steps
-       tr.GetXYZ(x1);
-       bz = tr.GetBz();
-       if (!tr.GetXYZAt(xprop, bz, x2)) return distance;
-       //AliKalmanTrack::MeanMaterialBudget(x1, x2, param);
-       rho = param[0]*param[4];
-       x0  = param[1];
-       if (!tr.PropagateTo(xprop, x0, rho)) return distance;
-       //if (!tr.PropagateTo(xprop, 0.0, 0.0)) return distance;
-       
-       // get propagated position at the end
-       tr.GetXYZ(x);
-       dx = TMath::Abs(x[0] - cl->X());
-       dy = TMath::Abs(x[1] - cl->Y());
-       dz = TMath::Abs(x[2] - cl->Z());
-       if (dx > fCutX || dy > fCutY || dz > fCutZ) return distance;
-       
-       distance = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
-       
-       return distance;
-}
-//
-//------------------------------------------------------------------------------
-//
-Bool_t AliEMCALTracker::PropagateToEMCAL(AliEMCALTrack *tr)
-{
-       //
-       // Propagates the track to the proximity of the EMCAL surface
-       //
-       
-       Double_t xcurr=0., xtemp=0., xprop = 438.0, step = 10.0, param[6]= {0., 0., 0., 0., 0., 0.}, x0=0., rho=0., bz=0.;
-       Double_t x1[3]= {0., 0., 0.}, x2[3]= {0., 0., 0.};
-       
-       // get initial track position
-       xcurr = tr->GetX();
-       
-       // propagate by small steps
-       for (xtemp = xcurr + step; xtemp < xprop; xtemp += step) {
-               // to compute material budget, take current position and 
-               // propagated hypothesis without energy loss
-               tr->GetXYZ(x1);
-               bz = tr->GetBz();
-               if (!tr->GetXYZAt(xtemp, bz, x2)) return kFALSE;
-               MeanMaterialBudget(x1, x2, param);
-               rho = param[0]*param[4];
-               x0 = param[1];
-               if (!tr->PropagateTo(xtemp, x0, rho)) return kFALSE;
-       }
-       
-       return kTRUE;
-}
-//
-//------------------------------------------------------------------------------
-//
-Int_t AliEMCALTracker::CreateMatches()
-{
-       //
-       // Creation of matches between tracks and clusters.
-       // For each ESD track collected by ReadESD(), an AliEMCALTrack is made.
-       // If it finds a cluster close enough to its propagation to EMCAL,
-       // which passes all cuts, its index is stored.
-       // If many clusters are found which satisfy the criteria described above, 
-       // only the closest one is stored.
-       // At this level, it is possible that two tracks share the same cluster.
-       //
-       
-       // if matches collection is already present, it is deleted
-       if (fMatches) {
-               fMatches->Delete();
-               delete fMatches;
-       }
-       fMatches = new TList;
-       
-       // initialize counters and indexes
-       Int_t count = 0;
-       Int_t ic=0, nClusters = (Int_t)fClusters->GetEntries();
-       Int_t it=0, nTracks = fTracks->GetEntries();
-       
-       // external loop on clusters, internal loop on tracks
-       Double_t dist=0.;
-       for (ic = 0; ic < nClusters; ic++) {
-               AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(ic);
-               for (it = 0; it < nTracks; it++) {
-                       AliEMCALTrack *track = (AliEMCALTrack*)fTracks->At(it);
-                       dist = CheckPair(track, cluster);
-                       //cout << dist << endl;
-                       if (dist <= fMaxDist) {
-                               AliEMCALMatch *candidate = new AliEMCALMatch;
-                               candidate->SetIndexT(it);
-                               candidate->SetIndexC(ic);
-                               candidate->SetDistance(dist);
-                               candidate->SetPt(track->GetSignedPt());
-                               fMatches->Add(candidate);
-                               count++;
-                       }
-               }
-       }
-       
-       return count;
-}
-//
-//------------------------------------------------------------------------------
-//
-Int_t AliEMCALTracker::SolveCompetitions()
-{
-       //
-       // Match selector.
-       // The match list is sorted from the best to the worst match, w.r. to the 
-       // distance between track prolongation and cluster position.
-       // Based on this criterion, starting from the first (best) match, a flag
-       // is set to both the involved track and cluster, and all matches containing
-       // an already used track or cluster are removed, leaving only the best match
-       // for each cluster.
-       //
-       
-       // sort matches with respect to track-cluster distance
-       fMatches->Sort(kSortAscending);
-       
-       // keep track of eliminated matches
-       Int_t count = 0;
-       
-       // initialize flags to check repetitions
-       Int_t ic=0, nClusters = (Int_t)fClusters->GetEntries();
-       Int_t it=0, nTracks = fTracks->GetEntries();
-       Bool_t *usedC = new Bool_t[nClusters];
-       Bool_t *usedT = new Bool_t[nTracks];
-       for (ic = 0; ic < nClusters; ic++) usedC[ic] = kFALSE;
-       for (it = 0; it < nTracks; it++) usedT[it] = kFALSE;
-       
-       // loop on matches
-       TListIter iter(fMatches);
-       AliEMCALMatch *match = 0;
-       while ( (match = (AliEMCALMatch*)iter.Next()) ) {
-               ic = match->GetIndexC();
-               it = match->GetIndexT();
-               if (!usedT[it] && !usedC[ic]) {
-                       usedT[it] = kTRUE;
-                       usedC[ic] = kTRUE;
-                       match->CanBeSaved() = kTRUE;
-               }
-               else {
-                       count++;
-               }
-       }
-       
-       delete [] usedC;
-       delete [] usedT;
+Int_t AliEMCALTracker::FindMatchedCluster(AliESDtrack *track)
+{         
+  //
+  // For each track, extrapolate it to all the clusters
+  // Find the closest one as matched if the residuals (dEta, dPhi) satisfy the cuts
+  //
 
-       return count;
+  Double_t maxEta=fCutEta;
+  Double_t maxPhi=fCutPhi;
+  Int_t index = -1;
+  
+  // If the esdFriend is available, use the TPCOuter point as the starting point of extrapolation
+  // Otherwise use the TPCInner point
+  AliExternalTrackParam *trkParam;
+  const AliESDfriendTrack*  friendTrack = track->GetFriendTrack();
+  if(friendTrack && friendTrack->GetTPCOut())
+    trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
+  else
+    trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+  if(!trkParam) return index;
+
+  //Perform extrapolation
+  Double_t trkPos[3];
+  Int_t nclusters = fClusters->GetEntries();
+  for(Int_t ic=0; ic<nclusters; ic++)
+    {
+      AliExternalTrackParam *trkParamTmp = new AliExternalTrackParam(*trkParam);
+      AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(ic);
+      TVector3 vec(cluster->X(),cluster->Y(),cluster->Z());
+      Double_t alpha =  ((int)(vec.Phi()*TMath::RadToDeg()/20)+0.5)*20*TMath::DegToRad();
+      //Rotate to proper local coordinate
+      vec.RotateZ(-alpha); 
+      trkParamTmp->Rotate(alpha); 
+      //extrapolation is done here
+      if(!AliTrackerBase::PropagateTrackToBxByBz(trkParamTmp, vec.X(), track->GetMass(), fStep, kFALSE)) continue; 
+
+      //Calculate the residuals
+      trkParamTmp->GetXYZ(trkPos);        
+      TVector3 clsPosVec(cluster->X(),cluster->Y(),cluster->Z());
+      TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
+      
+      Double_t clsPhi = clsPosVec.Phi();
+      if(clsPhi<0) clsPhi+=2*TMath::Pi();
+      Double_t trkPhi = trkPosVec.Phi();
+      if(trkPhi<0) trkPhi+=2*TMath::Pi();
+
+      Double_t tmpPhi = clsPhi-trkPhi;
+      Double_t tmpEta = clsPosVec.Eta()-trkPosVec.Eta();
+  
+      if(TMath::Abs(tmpPhi)<TMath::Abs(maxPhi) && TMath::Abs(tmpEta)<TMath::Abs(maxEta))
+        {
+          maxPhi=tmpPhi;
+          maxEta=tmpEta;
+          index=ic;
+        }
+        delete trkParamTmp;
+      }
+  return index;
 }
+
 //
 //------------------------------------------------------------------------------
 //
@@ -1005,29 +452,12 @@ void AliEMCALTracker::UnloadClusters()
        
        Clear();
 }
-//
-//------------------------------------------------------------------------------
-//
-TVector3 AliEMCALTracker::FindExtrapolationPoint(Double_t x,Double_t y,Double_t z, AliESDtrack *track)
-{
-  //Method to determine extrapolation point of track at location x,y,z
-  AliEMCALTrack *tr = new AliEMCALTrack(*track);
-  TVector3 error(-100.,-100.,-100.);
-  if (!tr->PropagateToGlobal(x,y,z, 0.0, 0.0)) {
-    return error;
-  }
-  Double_t pos[3]= {0., 0., 0.};
-  tr->GetXYZ(pos);
-  TVector3 ExTrPos(pos[0],pos[1],pos[2]);
-  return ExTrPos;
-}
 
 //
 //------------------------------------------------------------------------------
 //
 AliEMCALTracker::AliEMCALMatchCluster::AliEMCALMatchCluster(Int_t index, AliEMCALRecPoint *recPoint)
   : fIndex(index),
-    fLabel(recPoint->GetPrimaryIndex()), //wrong!  fixed below
     fX(0.),
     fY(0.),
     fZ(0.)
@@ -1042,24 +472,12 @@ AliEMCALTracker::AliEMCALMatchCluster::AliEMCALMatchCluster(Int_t index, AliEMCA
        fX = clpos.X();
        fY = clpos.Y();
        fZ = clpos.Z();
-
-       //AliEMCALRecPoint stores the track labels in the parents
-       //list, sorted according to the fractional contribution to the
-       //RecPoint.  The zeroth parent gave the highest contribution
-       Int_t multparent = 0;
-        Int_t *parents = recPoint->GetParents(multparent);
-        if(multparent > 0)
-          fLabel = parents[0];
-        else
-          fLabel = -1;
-
 }
 //
 //------------------------------------------------------------------------------
 //
 AliEMCALTracker::AliEMCALMatchCluster::AliEMCALMatchCluster(Int_t index, AliESDCaloCluster *caloCluster)
   : fIndex(index),
-    fLabel(caloCluster->GetLabel()),
     fX(0.),
     fY(0.),
     fZ(0.)
@@ -1075,44 +493,3 @@ AliEMCALTracker::AliEMCALMatchCluster::AliEMCALMatchCluster(Int_t index, AliESDC
        fY = (Double_t)clpos[1];
        fZ = (Double_t)clpos[2];
 }
-//
-//------------------------------------------------------------------------------
-//
-Int_t AliEMCALTracker::AliEMCALMatch::Compare(const TObject *obj) const 
-{
-       //
-       // Tracks compared wrt their distance from matched point
-       //
-       
-       AliEMCALTracker::AliEMCALMatch *that = (AliEMCALTracker::AliEMCALMatch*)obj;
-       
-       Double_t thisDist = fPt;//fDistance;
-       Double_t thatDist = that->fPt;//that->GetDistance();
-       
-       if (thisDist > thatDist) return 1;
-       else if (thisDist < thatDist) return -1;
-       return 0;
-}
-
-AliEMCALTracker::AliEMCALMatch::AliEMCALMatch() 
-  : TObject(),
-    fCanBeSaved(kFALSE), 
-    fIndexC(0), 
-    fIndexT(0), 
-    fDistance(0.),
-    fPt(0.)
-{
-  //default constructor
-
-}
-
-AliEMCALTracker::AliEMCALMatch::AliEMCALMatch(const AliEMCALMatch& copy)
-  : TObject(),
-    fCanBeSaved(copy.fCanBeSaved),
-    fIndexC(copy.fIndexC),
-    fIndexT(copy.fIndexT),
-    fDistance(copy.fDistance),
-    fPt(copy.fPt)
-{
-  //copy ctor
-}
index 420f736..88321a6 100644 (file)
@@ -53,25 +53,17 @@ public:
        virtual Int_t       PropagateBack(AliESDEvent* esd);
        virtual Int_t       RefitInward(AliESDEvent*) {return -1;}
        virtual void        UnloadClusters();
-       virtual AliCluster* GetCluster(Int_t) const {return NULL;};
-       TTree*              SearchTrueMatches();
-       void                SetCorrection(Double_t rho, Double_t x0) {fRho=rho;fX0=x0;}
-       void                SetCutAlpha(Double_t min, Double_t max) {fCutAlphaMin=min;fCutAlphaMax=max;}
-       void                SetCutAngle(Double_t value) {fCutAngle=value;}
-       void                SetCutX(Double_t value) {fCutX=value;}
-       void                SetCutY(Double_t value) {fCutY=value;}
-       void                SetCutZ(Double_t value) {fCutZ=value;}
+       virtual AliCluster* GetCluster(Int_t) const {return NULL;}
+       void                SetCutEta(Double_t value) {fCutEta=value;}
+       void                SetCutPhi(Double_t value) {fCutPhi=value;}
        void                SetGeometry(AliEMCALGeometry *geom) {fGeom=geom;}
-       void                SetMaxDistance(Double_t value) {fMaxDist=value;}
+       void                SetCutPt(Double_t value)   {fCutPt=value;}
        void                SetCutNITS(Double_t value) {fCutNITS=value;}
        void                SetCutNTPC(Double_t value) {fCutNTPC=value;}
-       void                SetNumberOfSteps(Int_t n) {fNPropSteps=n;if(!n)SetTrackCorrectionMode("NONE");}
+       void                SetStepLength(Float_t length) {fStep=length;}
        void                SetTrackCorrectionMode(Option_t *option);
-        TVector3            FindExtrapolationPoint(Double_t x, Double_t y, Double_t z, AliESDtrack *track);
 
-       enum {
-               kUnmatched = -99999
-       };
+       enum {  kUnmatched = -99999 };
        
        class  AliEMCALMatchCluster : public TObject
        {
@@ -81,84 +73,39 @@ public:
                virtual ~AliEMCALMatchCluster() { }
                //----------------------------------------------------------------------------
                Int_t     Index() const {return fIndex;}
-               Int_t     Label() const {return fLabel;}
                Double_t  X() const {return fX;}
                Double_t  Y() const {return fY;} 
                Double_t  Z() const {return fZ;}
-               Double_t   Phi() const {return TMath::ATan2(fY, fX);}
        private:
                Int_t     fIndex;  // index of cluster in its native container (ESD or TClonesArray)
-               Int_t     fLabel;  // track label of assigned cluster
                Double_t  fX;      // global X position
                Double_t  fY;      // global Y position
                Double_t  fZ;      // global Z position
        };
-       
-       class  AliEMCALMatch : public TObject
-       {
-       public:
-               AliEMCALMatch();
-               AliEMCALMatch(const AliEMCALMatch& copy);
-               virtual ~AliEMCALMatch() { }
-               //----------------------------------------------------------------------------
-               Bool_t&   CanBeSaved() {return fCanBeSaved;}
-               Int_t     Compare(const TObject *obj) const;
-               Double_t  GetDistance() const {return fDistance;}
-               Double_t  GetPt() const {return fPt;}
-               Int_t     GetIndexC() const {return fIndexC;}
-               Int_t     GetIndexT() const {return fIndexT;}
-               Bool_t    IsSortable() const {return kTRUE;}
-               void      SetIndexC(Int_t icl) {fIndexC=icl;}
-               void      SetIndexT(Int_t itr) {fIndexT=itr;}
-               void      SetDistance(Double_t dist) {fDistance=dist;}
-               void      SetPt(Double_t pt) {fPt=pt;}
-       private:
-               Bool_t     fCanBeSaved;  // when true, this match can be saved, otherwise it will not be
-               Int_t      fIndexC;      // cluster index in 'fClusters' array
-               Int_t      fIndexT;      // track index in 'fTracks' array
-               Double_t   fDistance;    // track - cluster distance
-               Double_t   fPt;          // track pt
-       };
-
+   
 private:
-
-       Double_t   AngleDiff(Double_t angle1, Double_t angle2);
-       Double_t   CheckPair(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
-       Double_t   CheckPairV2(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
-       Double_t   CheckPairV3(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
-       Int_t      CreateMatches();
-       Bool_t     PropagateToEMCAL(AliEMCALTrack *tr);
-       Int_t      SolveCompetitions();
+       Int_t FindMatchedCluster(AliESDtrack *track);
        
        enum ETrackCorr { 
                kTrackCorrNone  = 0, // do not correct for energy loss
                kTrackCorrMMB   = 1, // use MeanMaterialBudget() function to evaluate correction
-               kTrackCorrFixed = 2  // use fixed "X0" and "rho" parameters to correct
        };
-       
-       Int_t       fNPropSteps;      // number of propagation steps (when correcting). If =0 no correction is done
-       ETrackCorr  fTrackCorrMode;   // track correction mode
-       
-       Double_t    fCutX;                    // cut on X difference
-       Double_t    fCutY;                    // cut on Y difference
-       Double_t    fCutZ;                    // cut on Z difference
-       Double_t    fCutAlphaMin;     // cut on difference between track 'alpha' and phi
-       Double_t    fCutAlphaMax;     // cut on difference between track 'alpha' and phi
-       Double_t    fCutAngle;        // cut on angle between track projection and cluster
-       Double_t    fMaxDist;         // maximum allowed total distance between track proj an cluster
-       Double_t fCutNITS;         // mimimum number of track hits in the ITS
-       Double_t fCutNTPC;         // mimimum number of track hits in the TPC
 
-       Double_t    fRho;             // energy correction: density
-       Double_t    fX0;              // energy correction: radiation length
+       Double_t    fCutPt;           // mimimum pT cut on tracks
+       Double_t    fCutNITS;         // mimimum number of track hits in the ITS
+       Double_t    fCutNTPC;         // mimimum number of track hits in the TPC
+       
+       Float_t     fStep;            // Length of each step in propagation
+       ETrackCorr  fTrackCorrMode;   // Material budget correction mode        
+       Double_t    fCutEta;          // cut on eta difference
+       Double_t    fCutPhi;          // cut on phi difference
 
        TObjArray  *fTracks;          //! collection of tracks
        TObjArray  *fClusters;        //! collection of EMCAL clusters (ESDCaloCluster or EMCALRecPoint)
-       TList      *fMatches;         //! collection of matches between tracks and clusters
        
        AliEMCALGeometry *fGeom;      //! EMCAL geometry
        
-       ClassDef(AliEMCALTracker, 3)  // EMCAL "tracker"
+       ClassDef(AliEMCALTracker, 4)  // EMCAL "tracker"
 };
 
 #endif