ROOT logo
/*************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

//====================================================================================================================================================
//
//                          MFT tracker
//
// Class for the creation of the "global muon tracks" built from the tracks reconstructed in the 
// muon spectrometer and the clusters of the Muon Forward Tracker
//
// Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#include "TTree.h"
#include "AliLog.h"
#include "AliGeomManager.h"
#include "AliESDEvent.h"
#include "AliESDMuonTrack.h"
#include "AliESDMuonGlobalTrack.h"
#include "AliMFTTrackerMU.h"
#include "TMath.h"
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliHeader.h"
#include "AliGenEventHeader.h"
#include "TArrayF.h"
#include "AliMFT.h"
#include "AliMUONTrackExtrap.h"
#include "AliMUONTrack.h"
#include "AliMUONESDInterface.h"
#include "AliMuonForwardTrack.h"
#include "AliMUONConstants.h"
#include "TGrid.h"

ClassImp(AliMFTTrackerMU)

const Double_t AliMFTTrackerMU::fRadLengthSi = AliMFTConstants::fRadLengthSi;

//====================================================================================================================================================

AliMFTTrackerMU::AliMFTTrackerMU() : 
  AliTracker(),
  fESD(0),
  fMFT(0),
  fSegmentation(0),
  fNPlanesMFT(0),
  fNPlanesMFTAnalyzed(0),
  fSigmaClusterCut(2),
  fScaleSigmaClusterCut(1.),
  fNMaxMissingMFTClusters(0),
  fGlobalTrackingDiverged(kFALSE),
  fCandidateTracks(0),
  fMUONTrack(0),
  fCurrentTrack(0),
  fFinalBestCandidate(0),
  fXExtrapVertex(0),
  fYExtrapVertex(0),
  fZExtrapVertex(0),
  fXExtrapVertexError(0),
  fYExtrapVertexError(0),
  fBransonCorrection(kFALSE)
{

  //--------------------------------------------------------------------
  // This is the AliMFTTrackerMU constructor
  //--------------------------------------------------------------------

  fMFT = (AliMFT*) gAlice->GetDetector("MFT");
  fSegmentation = fMFT->GetSegmentation();
  SetNPlanesMFT(fSegmentation->GetNPlanes());
  AliMUONTrackExtrap::SetField();                 // set the magnetic field for track extrapolations

  AliInfo(Form("fMFT = %p, fSegmentation = %p", fMFT, fSegmentation));

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    fMFTClusterArray[iPlane]      = new TClonesArray("AliMFTCluster");
    fMFTClusterArrayFront[iPlane] = new TClonesArray("AliMFTCluster");
    fMFTClusterArrayBack[iPlane]  = new TClonesArray("AliMFTCluster");
    fMFTClusterArray[iPlane]      -> SetOwner(kTRUE);
    fMFTClusterArrayFront[iPlane] -> SetOwner(kTRUE);
    fMFTClusterArrayBack[iPlane]  -> SetOwner(kTRUE);
    fMinResearchRadiusAtPlane[iPlane] = 0.;
  }

  fCandidateTracks = new TClonesArray("AliMuonForwardTrack",50000);

}

//====================================================================================================================================================

AliMFTTrackerMU::~AliMFTTrackerMU() {

  // destructor

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    fMFTClusterArray[iPlane] -> Delete();
    delete fMFTClusterArray[iPlane];
    delete fMFTClusterArrayFront[iPlane];
    delete fMFTClusterArrayBack[iPlane];
  }

  delete fCandidateTracks;

}

//====================================================================================================================================================

Int_t AliMFTTrackerMU::LoadClusters(TTree *cTree) {

  //--------------------------------------------------------------------
  // This function loads the MFT clusters
  //--------------------------------------------------------------------
 
  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    AliDebug(1, Form("Setting Address for Branch Plane_%02d", iPlane)); 
    cTree->SetBranchAddress(Form("Plane_%02d",iPlane), &fMFTClusterArray[iPlane]);
  }
 
  if (!cTree->GetEvent()) return kFALSE;
  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    AliInfo(Form("plane %02d: nClusters = %d\n", iPlane, fMFTClusterArray[iPlane]->GetEntries()));
  }

  AddClustersFromUnderlyingEvent();
  AddClustersFromPileUpEvents();

  SeparateFrontBackClusters();

  return 0;

}

//====================================================================================================================================================

void AliMFTTrackerMU::UnloadClusters() {
  
  //--------------------------------------------------------------------
  // This function unloads MFT clusters
  //--------------------------------------------------------------------

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    fMFTClusterArray[iPlane]      -> Clear("C");
    fMFTClusterArrayFront[iPlane] -> Clear("C");
    fMFTClusterArrayBack[iPlane]  -> Clear("C");
  }

}

//====================================================================================================================================================

Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) {

  //--------------------------------------------------------------------
  // This functions reconstructs the Muon Forward Tracks
  // The clusters must be already loaded !
  //--------------------------------------------------------------------

  // Tree of AliMuonForwardTrack objects. Created outside the ESD framework for cross-check purposes

  TFile *outputFileMuonGlobalTracks = new TFile("MuonGlobalTracks.root", "update");
  TTree *outputTreeMuonGlobalTracks = new TTree("AliMuonForwardTracks", "Tree of AliMuonForwardTracks");
  TClonesArray *muonForwardTracks = new TClonesArray("AliMuonForwardTrack");
  outputTreeMuonGlobalTracks -> Branch("tracks", &muonForwardTracks);
 
  //--------------------------------------------------------------------

  fESD = event;

  fXExtrapVertex = 0;
  fYExtrapVertex = 0;
  fZExtrapVertex = 0;
  fXExtrapVertexError = AliMFTConstants::fXVertexTolerance;
  fYExtrapVertexError = AliMFTConstants::fYVertexTolerance;

  // Imposing a fixed primary vertex, in order to keep memory of its position. Taking the primary vertex would imply the risk
  // of loosing memory of its position when passing from ESD to AOD, due to possible refitting
  const AliESDVertex* esdVert = fESD->GetVertex(); 
  if (esdVert->GetNContributors() > 0 || !strcmp(esdVert->GetTitle(),"vertexer: smearMC")) {
    fXExtrapVertex = esdVert->GetX();
    fYExtrapVertex = esdVert->GetY();
    fZExtrapVertex = esdVert->GetZ();
    fXExtrapVertexError = TMath::Max(AliMFTConstants::fXVertexTolerance, esdVert->GetXRes());
    fYExtrapVertexError = TMath::Max(AliMFTConstants::fYVertexTolerance, esdVert->GetYRes());
    AliInfo(Form("Found ESD vertex from %d contributors (%f +/- %f,  %f +/- %f,  %f)", 
		 esdVert->GetNContributors(),fXExtrapVertex,fXExtrapVertexError,fYExtrapVertex,fYExtrapVertexError,fZExtrapVertex));
  }
  else GetVertexFromMC();    

  //----------- Read ESD MUON tracks -------------------

  Int_t nTracksMUON = event->GetNumberOfMuonTracks();

  AliInfo(Form("Number of ESD MUON tracks: %d\n", nTracksMUON));

  Int_t iTrack=0;
  while (iTrack<nTracksMUON) {

    fNPlanesMFTAnalyzed = 0;

    AliInfo("****************************************************************************************");
    AliInfo(Form("***************************   MUON TRACK %3d/%d   ***************************************", iTrack, nTracksMUON));
    AliInfo("****************************************************************************************");
    
    fCandidateTracks -> Delete();
    
    fNPlanesMFTAnalyzed = 0;
    
    const AliESDMuonTrack *esdTrack = event->GetMuonTrack(iTrack);
    if (fMUONTrack) delete fMUONTrack;
    fMUONTrack = new AliMUONTrack();

    AliMUONESDInterface::ESDToMUON(*esdTrack, *fMUONTrack, kFALSE);

    if (!fMUONTrack->GetTrackParamAtCluster()->First()) {
      AliInfo("Skipping track, no parameters available!!!");
      iTrack++;
      continue;
    }

    // the track we are going to build, starting from fMUONTrack and adding the MFT clusters
    AliMuonForwardTrack *track = new ((*fCandidateTracks)[0]) AliMuonForwardTrack();
    track -> SetMUONTrack(new AliMUONTrack(*fMUONTrack));
    track -> SetMCLabel(fMUONTrack->GetMCLabel());
    track -> SetMatchTrigger(fMUONTrack->GetMatchTrigger());

    // track parameters linearly extrapolated from the first tracking station to the end of the absorber
    AliMUONTrackParam trackParamEndOfAbsorber(*((AliMUONTrackParam*)(fMUONTrack->GetTrackParamAtCluster()->First())));
    AliMUONTrackExtrap::ExtrapToZCov(&trackParamEndOfAbsorber, AliMUONConstants::AbsZEnd());   // absorber extends from -90 to -503 cm
    Double_t xEndOfAbsorber = trackParamEndOfAbsorber.GetNonBendingCoor();
    Double_t yEndOfAbsorber = trackParamEndOfAbsorber.GetBendingCoor();
    Double_t rAbsorber      = TMath::Sqrt(xEndOfAbsorber*xEndOfAbsorber + yEndOfAbsorber*yEndOfAbsorber);
    track -> SetRAtAbsorberEnd(rAbsorber);

    //------------------------- NOW THE CYCLE OVER THE MFT PLANES STARTS ---------------------------------------

    for (Int_t iPlane=fNPlanesMFT-1; iPlane>=0; iPlane--) {   /* *** do not reverse the order of this cycle!!! 
							         *** this reflects the fact that the extrapolation is performed 
								 *** starting from the last MFT plane back to the origin */
      
      // --------- updating the array of candidates according to the clusters available in the i-th plane ---------
      
      fNPlanesMFTAnalyzed++;
      
      Int_t nCandidates = fCandidateTracks->GetEntriesFast();
      for (Int_t iCandidate=0; iCandidate<nCandidates; iCandidate++) {

	if (!(fCandidateTracks->UncheckedAt(iCandidate))) continue;
	fCurrentTrack = (AliMuonForwardTrack*) fCandidateTracks->UncheckedAt(iCandidate);

	// if the old track is compatible with the new cluster, the track is updated and inserted as new track in the array 
	// (several new tracks can be created for one old track)
	if (FindClusterInPlane(iPlane) == kDiverged) {
	  fGlobalTrackingDiverged = kTRUE;
	  break;
	}

	if ((fNPlanesMFTAnalyzed-fCurrentTrack->GetNMFTClusters())>fNMaxMissingMFTClusters || fIsPlaneMandatory[iPlane]) {
	  fCandidateTracks->Remove(fCurrentTrack);     // the old track is removed after the check;
	}
      }
      if (fGlobalTrackingDiverged) {
	if (fScaleSigmaClusterCut>0) fScaleSigmaClusterCut -= 0.1;
	continue;
      }

      fCandidateTracks->Compress();
      
    }      

    // -------------------------- END OF THE CYCLE OVER THE MFT PLANES --------------------------------------------
    
    fGlobalTrackingDiverged = kFALSE;
    fScaleSigmaClusterCut = 1.0;
    
    AliDebug(1, "Finished cycle over planes");
    
    iTrack++;

    // If we have several final tracks, we must find the best candidate:
    
    Int_t nFinalTracks = fCandidateTracks->GetEntriesFast();
    AliInfo(Form("nFinalTracks = %d", nFinalTracks));

    Int_t nGoodClustersBestCandidate =  0;
    Int_t idBestCandidate            =  0;
    Double_t bestChi2                = -1.;  // variable defining the best candidate

    for (Int_t iFinalCandidate=0; iFinalCandidate<nFinalTracks; iFinalCandidate++) {
      
      if (!(fCandidateTracks->UncheckedAt(iFinalCandidate))) continue;
      AliMuonForwardTrack *finalTrack = (AliMuonForwardTrack*) fCandidateTracks->UncheckedAt(iFinalCandidate);
      Int_t nMFTClusters  = finalTrack->GetNMFTClusters();

      Double_t chi2 = 0;
      for (Int_t iCluster=0; iCluster<nMFTClusters; iCluster++) {
	AliMFTCluster *localCluster = finalTrack->GetMFTCluster(iCluster);
        chi2 += localCluster->GetLocalChi2();
      }
      chi2 /= nMFTClusters;

      // now comparing the tracks in order to find the best one
      
      if (chi2<bestChi2 || bestChi2<0) {
	bestChi2 = chi2;
	idBestCandidate = iFinalCandidate;
      }
      
    }
    
    if (nFinalTracks) {

      AliMuonForwardTrack *newTrack = (AliMuonForwardTrack*) fCandidateTracks->UncheckedAt(idBestCandidate);
      newTrack -> SetNWrongClustersMC(newTrack->GetNMFTClusters() - nGoodClustersBestCandidate);

      new ((*muonForwardTracks)[muonForwardTracks->GetEntries()]) AliMuonForwardTrack(*newTrack);

      //----------------------- Save the information to the AliESDMuonGlobalTrack object

      newTrack -> EvalKinem(AliMFTConstants::fZEvalKinem);

      AliDebug(2,"Creating a new Muon Global Track");
      AliESDMuonGlobalTrack *myESDTrack = event->NewMuonGlobalTrack();
      myESDTrack -> SetPxPyPz(newTrack->Px(), newTrack->Py(), newTrack->Pz());
      
      myESDTrack -> SetLabel(newTrack->GetMCLabel());
      myESDTrack -> SetChi2OverNdf(newTrack->GetChi2OverNdf());
      myESDTrack -> SetCharge(newTrack->GetCharge());
      myESDTrack -> SetMatchTrigger(newTrack->GetMatchTrigger());
      myESDTrack -> SetNMFTClusters(newTrack->GetNMFTClusters());
      myESDTrack -> SetNWrongMFTClustersMC(newTrack->GetNWrongClustersMC());
      myESDTrack -> SetFirstTrackingPoint(newTrack->GetMFTCluster(0)->GetX(), newTrack->GetMFTCluster(0)->GetY(), newTrack->GetMFTCluster(0)->GetZ());
      myESDTrack -> SetXYAtVertex(newTrack->GetOffsetX(0., AliMFTConstants::fZEvalKinem), newTrack->GetOffsetY(0., AliMFTConstants::fZEvalKinem));
      myESDTrack -> SetRAtAbsorberEnd(newTrack->GetRAtAbsorberEnd());
      myESDTrack -> SetCovariances(newTrack->GetTrackParamAtMFTCluster(0)->GetCovariances());
      myESDTrack -> SetChi2MatchTrigger(esdTrack->GetChi2MatchTrigger());
      myESDTrack -> SetMuonClusterMap(esdTrack->GetMuonClusterMap());
      myESDTrack -> SetHitsPatternInTrigCh(esdTrack->GetHitsPatternInTrigCh());
      myESDTrack -> SetHitsPatternInTrigChTrk(esdTrack->GetHitsPatternInTrigChTrk());
      myESDTrack -> Connected(esdTrack->IsConnected());

      ULong_t mftClusterPattern = 0;
      for (Int_t iCluster=0; iCluster<newTrack->GetNMFTClusters(); iCluster++) {
	AliMFTCluster *localCluster = newTrack->GetMFTCluster(iCluster);
	mftClusterPattern |= 1 << localCluster->GetPlane();
	mftClusterPattern |= IsCorrectMatch(localCluster, newTrack->GetMCLabel()) << (fNMaxPlanes + localCluster->GetPlane());
      }
      myESDTrack -> SetMFTClusterPattern(mftClusterPattern);
      
      //---------------------------------------------------------------------------------

    }

    fFinalBestCandidate = NULL;
   
  }

  outputTreeMuonGlobalTracks -> Fill();

  Int_t myEventID = 0;
  while (outputFileMuonGlobalTracks->cd(Form("Event%d",myEventID))) myEventID++;
  outputFileMuonGlobalTracks -> mkdir(Form("Event%d",myEventID));
  outputFileMuonGlobalTracks -> cd(Form("Event%d",myEventID));
  outputTreeMuonGlobalTracks -> Write();
  outputFileMuonGlobalTracks -> Close();

  muonForwardTracks -> Delete();
  delete muonForwardTracks;

  return 0;

}

//=========================================================================================================================================

void AliMFTTrackerMU::SeparateFrontBackClusters() {

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    fMFTClusterArrayFront[iPlane]->Delete();
    fMFTClusterArrayBack[iPlane] ->Delete();
    for (Int_t iCluster=0; iCluster<fMFTClusterArray[iPlane]->GetEntries(); iCluster++) {
      AliMFTCluster *cluster = (AliMFTCluster*) fMFTClusterArray[iPlane]->At(iCluster);
      if (TMath::Abs(cluster->GetZ())<TMath::Abs(fSegmentation->GetPlane(iPlane)->GetZCenter())) {
	new ((*fMFTClusterArrayFront[iPlane])[fMFTClusterArrayFront[iPlane]->GetEntries()]) AliMFTCluster(*cluster);
      }
      else {
	new ((*fMFTClusterArrayBack[iPlane])[fMFTClusterArrayBack[iPlane]->GetEntries()]) AliMFTCluster(*cluster);
      }
    }
  }

}

//==========================================================================================================================================

Int_t AliMFTTrackerMU::FindClusterInPlane(Int_t planeId) { 
  
  // !!!!!!!!! coordinates and errors on the interaction vertex should be taken from the event itself (ITS) if available

  // propagate track to plane #planeId (both to front and back active sensors)
  // look for compatible clusters
  // update TrackParam at found cluster (if any) using Kalman Filter

  AliMUONTrackParam currentParamFront, currentParamBack, currentParamForResearchFront, currentParamForResearchBack;

  if (planeId == fNPlanesMFT-1) {      // last plane of the telecope
    currentParamFront = (*((AliMUONTrackParam*)(fMUONTrack->GetTrackParamAtCluster()->First())));
    currentParamBack  = (*((AliMUONTrackParam*)(fMUONTrack->GetTrackParamAtCluster()->First())));
    currentParamForResearchFront = currentParamFront;
    currentParamForResearchBack  = currentParamBack;
    if (fBransonCorrection) {
      AliMUONTrackExtrap::ExtrapToVertex(&currentParamFront, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); 
      AliMUONTrackExtrap::ExtrapToVertex(&currentParamBack,  fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); 
    }
    else {
      AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(&currentParamFront, fZExtrapVertex);
      AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(&currentParamBack,  fZExtrapVertex);
    }
    AliMUONTrackExtrap::ExtrapToVertex(&currentParamForResearchFront, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); 
    AliMUONTrackExtrap::ExtrapToVertex(&currentParamForResearchBack,  fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); 
  }
  else {          // MFT planes others than the last one: mult. scattering correction because of the upstream MFT planes is performed
    currentParamFront = (*((AliMUONTrackParam*)(fCurrentTrack->GetTrackParamAtCluster()->First())));
    currentParamBack  = (*((AliMUONTrackParam*)(fCurrentTrack->GetTrackParamAtCluster()->First())));
    currentParamForResearchFront = currentParamFront;
    currentParamForResearchBack  = currentParamBack;
    AliMUONTrackExtrap::AddMCSEffect(&currentParamFront,           (fSegmentation->GetPlane(planeId+1)->GetEquivalentSilicon()+
								    fSegmentation->GetPlane(planeId)->GetEquivalentSiliconBeforeFront())/fRadLengthSi,-1.);
    AliMUONTrackExtrap::AddMCSEffect(&currentParamForResearchFront,(fSegmentation->GetPlane(planeId+1)->GetEquivalentSilicon()+
								    fSegmentation->GetPlane(planeId)->GetEquivalentSiliconBeforeFront())/fRadLengthSi,-1.);
    AliMUONTrackExtrap::AddMCSEffect(&currentParamBack,            (fSegmentation->GetPlane(planeId+1)->GetEquivalentSilicon()+
								    fSegmentation->GetPlane(planeId)->GetEquivalentSiliconBeforeBack())/fRadLengthSi,-1.);
    AliMUONTrackExtrap::AddMCSEffect(&currentParamForResearchBack, (fSegmentation->GetPlane(planeId+1)->GetEquivalentSilicon()+
								    fSegmentation->GetPlane(planeId)->GetEquivalentSiliconBeforeBack())/fRadLengthSi,-1.);
  }
  // for all planes: extrapolation to the Z of the plane
  AliMUONTrackExtrap::ExtrapToZCov(&currentParamFront,            -1.*fSegmentation->GetPlane(planeId)->GetZCenterActiveFront());   
  AliMUONTrackExtrap::ExtrapToZCov(&currentParamForResearchFront, -1.*fSegmentation->GetPlane(planeId)->GetZCenterActiveFront());
  AliMUONTrackExtrap::ExtrapToZCov(&currentParamBack,             -1.*fSegmentation->GetPlane(planeId)->GetZCenterActiveBack());   
  AliMUONTrackExtrap::ExtrapToZCov(&currentParamForResearchBack,  -1.*fSegmentation->GetPlane(planeId)->GetZCenterActiveBack());

  //---------------------------------------------------------------------------------------

  TMatrixD covFront(5,5); covFront = currentParamForResearchFront.GetCovariances();
  TMatrixD covBack(5,5);  covBack  = currentParamForResearchBack.GetCovariances();
  
  Double_t squaredError_X_Front = covFront(0,0);
  Double_t squaredError_Y_Front = covFront(2,2);
  Double_t squaredError_X_Back  = covBack(0,0);
  Double_t squaredError_Y_Back  = covBack(2,2);

  Double_t corrFact = 1.0;

  Double_t researchRadiusFront = TMath::Sqrt(squaredError_X_Front + squaredError_Y_Front);
  Double_t researchRadiusBack  = TMath::Sqrt(squaredError_X_Back  + squaredError_Y_Back);
  if (0.5*(researchRadiusFront+researchRadiusBack)<fMinResearchRadiusAtPlane[planeId]) {
    corrFact = fMinResearchRadiusAtPlane[planeId]/(0.5*(researchRadiusFront+researchRadiusBack));
  }

  //---------------------------------------------------------------------------------------

  Double_t chi2cut = 2.*fScaleSigmaClusterCut*fScaleSigmaClusterCut*fSigmaClusterCut*fSigmaClusterCut;     // depends on the number of variables (here, 2)
  
  // Analyizing the clusters: FRONT ACTIVE ELEMENTS
  
  Int_t nClustersFront = fMFTClusterArrayFront[planeId]->GetEntries();
  AliDebug(2, Form("There are %3d clusters in plane %02d FRONT\n", nClustersFront, planeId));
  
  for (Int_t iCluster=0; iCluster<nClustersFront; iCluster++) {

    Bool_t isGoodChi2 = kFALSE;

    AliMFTCluster *cluster = (AliMFTCluster*) fMFTClusterArrayFront[planeId]->At(iCluster); 
    Double_t chi2 = (1./(corrFact*corrFact)) * TryOneCluster(currentParamForResearchFront, cluster);     // describes the compatibility between the track and the cluster
    if (chi2<chi2cut) isGoodChi2 = kTRUE;

    if (isGoodChi2) {
      AliDebug(3, Form("accepting cluster: chi2=%f (cut = %f)\n", chi2, chi2cut));
      AliMuonForwardTrack *newTrack = new ((*fCandidateTracks)[fCandidateTracks->GetEntriesFast()]) AliMuonForwardTrack(*fCurrentTrack);
      if (fCandidateTracks->GetEntriesFast() > fMaxNCandidates) return kDiverged;
      newTrack->AddTrackParamAtMFTCluster(currentParamFront, *cluster);    // creating new track param and attaching the cluster
      AliDebug(2, Form("After plane %02d: newTrack->GetNMFTClusters() = %d (fCurrentTrack->GetNMFTClusters() = %d)", 
		       planeId, newTrack->GetNMFTClusters(), fCurrentTrack->GetNMFTClusters()));
      newTrack->SetPlaneExists(planeId);
    }
    else AliDebug(3, Form("discarding cluster: chi2=%f (cut = %f)\n", chi2, chi2cut));

  }

  // Analyizing the clusters: BACK ACTIVE ELEMENTS
  
  Int_t nClustersBack = fMFTClusterArrayBack[planeId]->GetEntries();
  AliDebug(2, Form("There are %3d clusters in plane %02d BACK\n", nClustersBack, planeId));
  
  for (Int_t iCluster=0; iCluster<nClustersBack; iCluster++) {

    Bool_t isGoodChi2 = kFALSE;

    AliMFTCluster *cluster = (AliMFTCluster*) fMFTClusterArrayBack[planeId]->At(iCluster); 
    Double_t chi2 = (1./(corrFact*corrFact)) * TryOneCluster(currentParamForResearchBack, cluster);     // describes the compatibility between the track and the cluster
    if (chi2<chi2cut) isGoodChi2 = kTRUE;

    if (isGoodChi2) {
      AliDebug(3,Form("accepting cluster: chi2=%f (cut = %f)\n", chi2, chi2cut));
      AliMuonForwardTrack *newTrack = new ((*fCandidateTracks)[fCandidateTracks->GetEntriesFast()]) AliMuonForwardTrack(*fCurrentTrack);
      if (fCandidateTracks->GetEntriesFast() > fMaxNCandidates) return kDiverged;
      newTrack->AddTrackParamAtMFTCluster(currentParamBack, *cluster);    // creating new track param and attaching the cluster
      AliDebug(2, Form("After plane %02d: newTrack->GetNMFTClusters() = %d (fCurrentTrack->GetNMFTClusters() = %d)", 
		       planeId, newTrack->GetNMFTClusters(), fCurrentTrack->GetNMFTClusters()));
      newTrack->SetPlaneExists(planeId);
    }
    else AliDebug(3,Form("discarding cluster: chi2=%f (cut = %f)\n", chi2, chi2cut));

  }

  //---------------------------------------------------------------------------------------------

  return kConverged;
  
}

//==========================================================================================================================================

Double_t AliMFTTrackerMU::TryOneCluster(const AliMUONTrackParam &trackParam, AliMFTCluster *cluster) {

  // Test the compatibility between the track and the cluster (using trackParam's covariance matrix):
  // return the corresponding Chi2
  // assume the track parameters are given at the Z of the cluster
  
  // Set differences between trackParam and cluster in the bending and non bending directions
  Double_t dX = cluster->GetX() - trackParam.GetNonBendingCoor();
  Double_t dY = cluster->GetY() - trackParam.GetBendingCoor();
  AliDebug(3,Form("dX = %f, dY = %f\n", dX, dY));
  
  // Calculate errors and covariances
  const TMatrixD& kParamCov = trackParam.GetCovariances();
  Double_t sigmaX2 = kParamCov(0,0) + cluster->GetErrX2();
  Double_t sigmaY2 = kParamCov(2,2) + cluster->GetErrY2();
  AliDebug(3, Form("dX2 = %f, dY2 = %f\n", sigmaX2, sigmaY2));
  Double_t covXY   = kParamCov(0,2);
  Double_t det     = sigmaX2 * sigmaY2 - covXY * covXY;
  
  // Compute chi2
  if (det==0.) return 1.e10;
  return (dX*dX*sigmaY2 + dY*dY*sigmaX2 - 2.*dX*dY*covXY) / det;
  
}

//=========================================================================================================================================

Bool_t AliMFTTrackerMU::IsCorrectMatch(AliMFTCluster *cluster, Int_t labelMC) {

  Bool_t result = kFALSE;

  // check if the cluster belongs to the correct MC track

  for (Int_t iTrack=0; iTrack<cluster->GetNMCTracks(); iTrack++) {
    if (cluster->GetMCLabel(iTrack)==labelMC) {
      result = kTRUE;
      break;
    }
  }

  return result;

}

//======================================================================================================================================

void AliMFTTrackerMU::GetVertexFromMC() {

  AliRunLoader *runLoader = AliRunLoader::Open("galice.root");
  if (!runLoader) {
    AliError("no run loader found in file galice.root");
    return;
  }

  runLoader->CdGAFile();
  runLoader->LoadgAlice();
  runLoader->LoadHeader();
  runLoader->GetEvent(gAlice->GetEvNumber());
  
  TArrayF vtx(3);
  runLoader->GetHeader()->GenEventHeader()->PrimaryVertex(vtx);
  AliInfo(Form("Primary vertex from MC found in (%f, %f, %f)\n",vtx[0], vtx[1], vtx[2]));

  fXExtrapVertex = gRandom->Gaus(vtx[0], AliMFTConstants::fPrimaryVertexResX);
  fYExtrapVertex = gRandom->Gaus(vtx[1], AliMFTConstants::fPrimaryVertexResY);
  fZExtrapVertex = gRandom->Gaus(vtx[2], AliMFTConstants::fPrimaryVertexResZ);
  fXExtrapVertexError = AliMFTConstants::fXVertexTolerance;
  fYExtrapVertexError = AliMFTConstants::fYVertexTolerance;
  AliInfo(Form("Set ESD vertex from MC (%f +/- %f,  %f +/- %f,  %f)", 
	       fXExtrapVertex,fXExtrapVertexError,fYExtrapVertex,fYExtrapVertexError,fZExtrapVertex));
  
}

//======================================================================================================================================

void AliMFTTrackerMU::AddClustersFromUnderlyingEvent() {

  AliInfo("Adding clusters from underlying event");

  if (!fMFT) return;

  TGrid::Connect("alien://");

  TFile* fileWithClustersToAdd = TFile::Open(fMFT->GetFileNameForUnderlyingEvent());
  if (!fileWithClustersToAdd) return;
  if (!(fileWithClustersToAdd->IsOpen())) return;
  if (!(fileWithClustersToAdd->cd(Form("Event%d",fMFT->GetUnderlyingEventID())))) return;

  TClonesArray *recPointsPerPlaneToAdd[AliMFTConstants::fNMaxPlanes] = {0};
  TTree *treeIn = 0;

  for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) recPointsPerPlaneToAdd[iPlane] = new TClonesArray("AliMFTCluster");

  treeIn = (TTree*) gDirectory->Get("TreeR");

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    if (!(treeIn->GetBranch(Form("Plane_%02d",iPlane)))) {
      for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) delete recPointsPerPlaneToAdd[jPlane];
      return;
    }
    else treeIn->SetBranchAddress(Form("Plane_%02d",iPlane), &(recPointsPerPlaneToAdd[iPlane]));
  }

  treeIn -> GetEntry(0);

  for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
    printf("plane %d -> before = %d ",iPlane,fMFTClusterArray[iPlane]->GetEntries());
    Int_t nClusters = recPointsPerPlaneToAdd[iPlane]->GetEntries();
    for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
      AliMFTCluster *newCluster = (AliMFTCluster*) recPointsPerPlaneToAdd[iPlane]->At(iCluster);
      for (Int_t iTrack=0; iTrack<newCluster->GetNMCTracks(); iTrack++) newCluster->SetMCLabel(iTrack, newCluster->GetMCLabel(iTrack)+AliMFTConstants::fLabelOffsetMC);
      new ((*fMFTClusterArray[iPlane])[fMFTClusterArray[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
    }
    printf("after = %d\n",fMFTClusterArray[iPlane]->GetEntries());
  }

  for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) delete recPointsPerPlaneToAdd[jPlane];

}

//======================================================================================================================================

void AliMFTTrackerMU::AddClustersFromPileUpEvents() {

  AliInfo("Adding clusters from pile-up event(s)");

  if (!fMFT) return;

  TGrid::Connect("alien://");

  TFile* fileWithClustersToAdd = TFile::Open(fMFT->GetFileNameForPileUpEvents());
  if (!fileWithClustersToAdd) return;
  if (!(fileWithClustersToAdd->IsOpen())) return;

  TClonesArray *recPointsPerPlaneToAdd[AliMFTConstants::fNMaxPlanes] = {0};
  TTree *treeIn = 0;

  for (Int_t iPileUp=0; iPileUp<AliMFTConstants::fNMaxPileUpEvents; iPileUp++) {
    
    if (!(fileWithClustersToAdd->cd(Form("Event%d",fMFT->GetPileUpEventID(iPileUp))))) continue;
    
    for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) recPointsPerPlaneToAdd[iPlane] = new TClonesArray("AliMFTCluster");
    
    treeIn = (TTree*) gDirectory->Get("TreeR");
    
    for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
      if (!(treeIn->GetBranch(Form("Plane_%02d",iPlane)))) {
	for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) delete recPointsPerPlaneToAdd[jPlane];
	return;
      }
      else treeIn->SetBranchAddress(Form("Plane_%02d",iPlane), &(recPointsPerPlaneToAdd[iPlane]));
    }

    treeIn -> GetEntry(0);
    
    for (Int_t iPlane=0; iPlane<fNPlanesMFT; iPlane++) {
      printf("plane %d -> before = %d ",iPlane,fMFTClusterArray[iPlane]->GetEntries());
      Int_t nClusters = recPointsPerPlaneToAdd[iPlane]->GetEntries();
      for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	AliMFTCluster *newCluster = (AliMFTCluster*) recPointsPerPlaneToAdd[iPlane]->At(iCluster);
	for (Int_t iTrack=0; iTrack<newCluster->GetNMCTracks(); iTrack++) newCluster->SetMCLabel(iTrack, newCluster->GetMCLabel(iTrack)+AliMFTConstants::fLabelOffsetMC);
	new ((*fMFTClusterArray[iPlane])[fMFTClusterArray[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
      }
      printf("after = %d\n",fMFTClusterArray[iPlane]->GetEntries());
    }

    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) delete recPointsPerPlaneToAdd[jPlane];

  }

}

//======================================================================================================================================

 AliMFTTrackerMU.cxx:1
 AliMFTTrackerMU.cxx:2
 AliMFTTrackerMU.cxx:3
 AliMFTTrackerMU.cxx:4
 AliMFTTrackerMU.cxx:5
 AliMFTTrackerMU.cxx:6
 AliMFTTrackerMU.cxx:7
 AliMFTTrackerMU.cxx:8
 AliMFTTrackerMU.cxx:9
 AliMFTTrackerMU.cxx:10
 AliMFTTrackerMU.cxx:11
 AliMFTTrackerMU.cxx:12
 AliMFTTrackerMU.cxx:13
 AliMFTTrackerMU.cxx:14
 AliMFTTrackerMU.cxx:15
 AliMFTTrackerMU.cxx:16
 AliMFTTrackerMU.cxx:17
 AliMFTTrackerMU.cxx:18
 AliMFTTrackerMU.cxx:19
 AliMFTTrackerMU.cxx:20
 AliMFTTrackerMU.cxx:21
 AliMFTTrackerMU.cxx:22
 AliMFTTrackerMU.cxx:23
 AliMFTTrackerMU.cxx:24
 AliMFTTrackerMU.cxx:25
 AliMFTTrackerMU.cxx:26
 AliMFTTrackerMU.cxx:27
 AliMFTTrackerMU.cxx:28
 AliMFTTrackerMU.cxx:29
 AliMFTTrackerMU.cxx:30
 AliMFTTrackerMU.cxx:31
 AliMFTTrackerMU.cxx:32
 AliMFTTrackerMU.cxx:33
 AliMFTTrackerMU.cxx:34
 AliMFTTrackerMU.cxx:35
 AliMFTTrackerMU.cxx:36
 AliMFTTrackerMU.cxx:37
 AliMFTTrackerMU.cxx:38
 AliMFTTrackerMU.cxx:39
 AliMFTTrackerMU.cxx:40
 AliMFTTrackerMU.cxx:41
 AliMFTTrackerMU.cxx:42
 AliMFTTrackerMU.cxx:43
 AliMFTTrackerMU.cxx:44
 AliMFTTrackerMU.cxx:45
 AliMFTTrackerMU.cxx:46
 AliMFTTrackerMU.cxx:47
 AliMFTTrackerMU.cxx:48
 AliMFTTrackerMU.cxx:49
 AliMFTTrackerMU.cxx:50
 AliMFTTrackerMU.cxx:51
 AliMFTTrackerMU.cxx:52
 AliMFTTrackerMU.cxx:53
 AliMFTTrackerMU.cxx:54
 AliMFTTrackerMU.cxx:55
 AliMFTTrackerMU.cxx:56
 AliMFTTrackerMU.cxx:57
 AliMFTTrackerMU.cxx:58
 AliMFTTrackerMU.cxx:59
 AliMFTTrackerMU.cxx:60
 AliMFTTrackerMU.cxx:61
 AliMFTTrackerMU.cxx:62
 AliMFTTrackerMU.cxx:63
 AliMFTTrackerMU.cxx:64
 AliMFTTrackerMU.cxx:65
 AliMFTTrackerMU.cxx:66
 AliMFTTrackerMU.cxx:67
 AliMFTTrackerMU.cxx:68
 AliMFTTrackerMU.cxx:69
 AliMFTTrackerMU.cxx:70
 AliMFTTrackerMU.cxx:71
 AliMFTTrackerMU.cxx:72
 AliMFTTrackerMU.cxx:73
 AliMFTTrackerMU.cxx:74
 AliMFTTrackerMU.cxx:75
 AliMFTTrackerMU.cxx:76
 AliMFTTrackerMU.cxx:77
 AliMFTTrackerMU.cxx:78
 AliMFTTrackerMU.cxx:79
 AliMFTTrackerMU.cxx:80
 AliMFTTrackerMU.cxx:81
 AliMFTTrackerMU.cxx:82
 AliMFTTrackerMU.cxx:83
 AliMFTTrackerMU.cxx:84
 AliMFTTrackerMU.cxx:85
 AliMFTTrackerMU.cxx:86
 AliMFTTrackerMU.cxx:87
 AliMFTTrackerMU.cxx:88
 AliMFTTrackerMU.cxx:89
 AliMFTTrackerMU.cxx:90
 AliMFTTrackerMU.cxx:91
 AliMFTTrackerMU.cxx:92
 AliMFTTrackerMU.cxx:93
 AliMFTTrackerMU.cxx:94
 AliMFTTrackerMU.cxx:95
 AliMFTTrackerMU.cxx:96
 AliMFTTrackerMU.cxx:97
 AliMFTTrackerMU.cxx:98
 AliMFTTrackerMU.cxx:99
 AliMFTTrackerMU.cxx:100
 AliMFTTrackerMU.cxx:101
 AliMFTTrackerMU.cxx:102
 AliMFTTrackerMU.cxx:103
 AliMFTTrackerMU.cxx:104
 AliMFTTrackerMU.cxx:105
 AliMFTTrackerMU.cxx:106
 AliMFTTrackerMU.cxx:107
 AliMFTTrackerMU.cxx:108
 AliMFTTrackerMU.cxx:109
 AliMFTTrackerMU.cxx:110
 AliMFTTrackerMU.cxx:111
 AliMFTTrackerMU.cxx:112
 AliMFTTrackerMU.cxx:113
 AliMFTTrackerMU.cxx:114
 AliMFTTrackerMU.cxx:115
 AliMFTTrackerMU.cxx:116
 AliMFTTrackerMU.cxx:117
 AliMFTTrackerMU.cxx:118
 AliMFTTrackerMU.cxx:119
 AliMFTTrackerMU.cxx:120
 AliMFTTrackerMU.cxx:121
 AliMFTTrackerMU.cxx:122
 AliMFTTrackerMU.cxx:123
 AliMFTTrackerMU.cxx:124
 AliMFTTrackerMU.cxx:125
 AliMFTTrackerMU.cxx:126
 AliMFTTrackerMU.cxx:127
 AliMFTTrackerMU.cxx:128
 AliMFTTrackerMU.cxx:129
 AliMFTTrackerMU.cxx:130
 AliMFTTrackerMU.cxx:131
 AliMFTTrackerMU.cxx:132
 AliMFTTrackerMU.cxx:133
 AliMFTTrackerMU.cxx:134
 AliMFTTrackerMU.cxx:135
 AliMFTTrackerMU.cxx:136
 AliMFTTrackerMU.cxx:137
 AliMFTTrackerMU.cxx:138
 AliMFTTrackerMU.cxx:139
 AliMFTTrackerMU.cxx:140
 AliMFTTrackerMU.cxx:141
 AliMFTTrackerMU.cxx:142
 AliMFTTrackerMU.cxx:143
 AliMFTTrackerMU.cxx:144
 AliMFTTrackerMU.cxx:145
 AliMFTTrackerMU.cxx:146
 AliMFTTrackerMU.cxx:147
 AliMFTTrackerMU.cxx:148
 AliMFTTrackerMU.cxx:149
 AliMFTTrackerMU.cxx:150
 AliMFTTrackerMU.cxx:151
 AliMFTTrackerMU.cxx:152
 AliMFTTrackerMU.cxx:153
 AliMFTTrackerMU.cxx:154
 AliMFTTrackerMU.cxx:155
 AliMFTTrackerMU.cxx:156
 AliMFTTrackerMU.cxx:157
 AliMFTTrackerMU.cxx:158
 AliMFTTrackerMU.cxx:159
 AliMFTTrackerMU.cxx:160
 AliMFTTrackerMU.cxx:161
 AliMFTTrackerMU.cxx:162
 AliMFTTrackerMU.cxx:163
 AliMFTTrackerMU.cxx:164
 AliMFTTrackerMU.cxx:165
 AliMFTTrackerMU.cxx:166
 AliMFTTrackerMU.cxx:167
 AliMFTTrackerMU.cxx:168
 AliMFTTrackerMU.cxx:169
 AliMFTTrackerMU.cxx:170
 AliMFTTrackerMU.cxx:171
 AliMFTTrackerMU.cxx:172
 AliMFTTrackerMU.cxx:173
 AliMFTTrackerMU.cxx:174
 AliMFTTrackerMU.cxx:175
 AliMFTTrackerMU.cxx:176
 AliMFTTrackerMU.cxx:177
 AliMFTTrackerMU.cxx:178
 AliMFTTrackerMU.cxx:179
 AliMFTTrackerMU.cxx:180
 AliMFTTrackerMU.cxx:181
 AliMFTTrackerMU.cxx:182
 AliMFTTrackerMU.cxx:183
 AliMFTTrackerMU.cxx:184
 AliMFTTrackerMU.cxx:185
 AliMFTTrackerMU.cxx:186
 AliMFTTrackerMU.cxx:187
 AliMFTTrackerMU.cxx:188
 AliMFTTrackerMU.cxx:189
 AliMFTTrackerMU.cxx:190
 AliMFTTrackerMU.cxx:191
 AliMFTTrackerMU.cxx:192
 AliMFTTrackerMU.cxx:193
 AliMFTTrackerMU.cxx:194
 AliMFTTrackerMU.cxx:195
 AliMFTTrackerMU.cxx:196
 AliMFTTrackerMU.cxx:197
 AliMFTTrackerMU.cxx:198
 AliMFTTrackerMU.cxx:199
 AliMFTTrackerMU.cxx:200
 AliMFTTrackerMU.cxx:201
 AliMFTTrackerMU.cxx:202
 AliMFTTrackerMU.cxx:203
 AliMFTTrackerMU.cxx:204
 AliMFTTrackerMU.cxx:205
 AliMFTTrackerMU.cxx:206
 AliMFTTrackerMU.cxx:207
 AliMFTTrackerMU.cxx:208
 AliMFTTrackerMU.cxx:209
 AliMFTTrackerMU.cxx:210
 AliMFTTrackerMU.cxx:211
 AliMFTTrackerMU.cxx:212
 AliMFTTrackerMU.cxx:213
 AliMFTTrackerMU.cxx:214
 AliMFTTrackerMU.cxx:215
 AliMFTTrackerMU.cxx:216
 AliMFTTrackerMU.cxx:217
 AliMFTTrackerMU.cxx:218
 AliMFTTrackerMU.cxx:219
 AliMFTTrackerMU.cxx:220
 AliMFTTrackerMU.cxx:221
 AliMFTTrackerMU.cxx:222
 AliMFTTrackerMU.cxx:223
 AliMFTTrackerMU.cxx:224
 AliMFTTrackerMU.cxx:225
 AliMFTTrackerMU.cxx:226
 AliMFTTrackerMU.cxx:227
 AliMFTTrackerMU.cxx:228
 AliMFTTrackerMU.cxx:229
 AliMFTTrackerMU.cxx:230
 AliMFTTrackerMU.cxx:231
 AliMFTTrackerMU.cxx:232
 AliMFTTrackerMU.cxx:233
 AliMFTTrackerMU.cxx:234
 AliMFTTrackerMU.cxx:235
 AliMFTTrackerMU.cxx:236
 AliMFTTrackerMU.cxx:237
 AliMFTTrackerMU.cxx:238
 AliMFTTrackerMU.cxx:239
 AliMFTTrackerMU.cxx:240
 AliMFTTrackerMU.cxx:241
 AliMFTTrackerMU.cxx:242
 AliMFTTrackerMU.cxx:243
 AliMFTTrackerMU.cxx:244
 AliMFTTrackerMU.cxx:245
 AliMFTTrackerMU.cxx:246
 AliMFTTrackerMU.cxx:247
 AliMFTTrackerMU.cxx:248
 AliMFTTrackerMU.cxx:249
 AliMFTTrackerMU.cxx:250
 AliMFTTrackerMU.cxx:251
 AliMFTTrackerMU.cxx:252
 AliMFTTrackerMU.cxx:253
 AliMFTTrackerMU.cxx:254
 AliMFTTrackerMU.cxx:255
 AliMFTTrackerMU.cxx:256
 AliMFTTrackerMU.cxx:257
 AliMFTTrackerMU.cxx:258
 AliMFTTrackerMU.cxx:259
 AliMFTTrackerMU.cxx:260
 AliMFTTrackerMU.cxx:261
 AliMFTTrackerMU.cxx:262
 AliMFTTrackerMU.cxx:263
 AliMFTTrackerMU.cxx:264
 AliMFTTrackerMU.cxx:265
 AliMFTTrackerMU.cxx:266
 AliMFTTrackerMU.cxx:267
 AliMFTTrackerMU.cxx:268
 AliMFTTrackerMU.cxx:269
 AliMFTTrackerMU.cxx:270
 AliMFTTrackerMU.cxx:271
 AliMFTTrackerMU.cxx:272
 AliMFTTrackerMU.cxx:273
 AliMFTTrackerMU.cxx:274
 AliMFTTrackerMU.cxx:275
 AliMFTTrackerMU.cxx:276
 AliMFTTrackerMU.cxx:277
 AliMFTTrackerMU.cxx:278
 AliMFTTrackerMU.cxx:279
 AliMFTTrackerMU.cxx:280
 AliMFTTrackerMU.cxx:281
 AliMFTTrackerMU.cxx:282
 AliMFTTrackerMU.cxx:283
 AliMFTTrackerMU.cxx:284
 AliMFTTrackerMU.cxx:285
 AliMFTTrackerMU.cxx:286
 AliMFTTrackerMU.cxx:287
 AliMFTTrackerMU.cxx:288
 AliMFTTrackerMU.cxx:289
 AliMFTTrackerMU.cxx:290
 AliMFTTrackerMU.cxx:291
 AliMFTTrackerMU.cxx:292
 AliMFTTrackerMU.cxx:293
 AliMFTTrackerMU.cxx:294
 AliMFTTrackerMU.cxx:295
 AliMFTTrackerMU.cxx:296
 AliMFTTrackerMU.cxx:297
 AliMFTTrackerMU.cxx:298
 AliMFTTrackerMU.cxx:299
 AliMFTTrackerMU.cxx:300
 AliMFTTrackerMU.cxx:301
 AliMFTTrackerMU.cxx:302
 AliMFTTrackerMU.cxx:303
 AliMFTTrackerMU.cxx:304
 AliMFTTrackerMU.cxx:305
 AliMFTTrackerMU.cxx:306
 AliMFTTrackerMU.cxx:307
 AliMFTTrackerMU.cxx:308
 AliMFTTrackerMU.cxx:309
 AliMFTTrackerMU.cxx:310
 AliMFTTrackerMU.cxx:311
 AliMFTTrackerMU.cxx:312
 AliMFTTrackerMU.cxx:313
 AliMFTTrackerMU.cxx:314
 AliMFTTrackerMU.cxx:315
 AliMFTTrackerMU.cxx:316
 AliMFTTrackerMU.cxx:317
 AliMFTTrackerMU.cxx:318
 AliMFTTrackerMU.cxx:319
 AliMFTTrackerMU.cxx:320
 AliMFTTrackerMU.cxx:321
 AliMFTTrackerMU.cxx:322
 AliMFTTrackerMU.cxx:323
 AliMFTTrackerMU.cxx:324
 AliMFTTrackerMU.cxx:325
 AliMFTTrackerMU.cxx:326
 AliMFTTrackerMU.cxx:327
 AliMFTTrackerMU.cxx:328
 AliMFTTrackerMU.cxx:329
 AliMFTTrackerMU.cxx:330
 AliMFTTrackerMU.cxx:331
 AliMFTTrackerMU.cxx:332
 AliMFTTrackerMU.cxx:333
 AliMFTTrackerMU.cxx:334
 AliMFTTrackerMU.cxx:335
 AliMFTTrackerMU.cxx:336
 AliMFTTrackerMU.cxx:337
 AliMFTTrackerMU.cxx:338
 AliMFTTrackerMU.cxx:339
 AliMFTTrackerMU.cxx:340
 AliMFTTrackerMU.cxx:341
 AliMFTTrackerMU.cxx:342
 AliMFTTrackerMU.cxx:343
 AliMFTTrackerMU.cxx:344
 AliMFTTrackerMU.cxx:345
 AliMFTTrackerMU.cxx:346
 AliMFTTrackerMU.cxx:347
 AliMFTTrackerMU.cxx:348
 AliMFTTrackerMU.cxx:349
 AliMFTTrackerMU.cxx:350
 AliMFTTrackerMU.cxx:351
 AliMFTTrackerMU.cxx:352
 AliMFTTrackerMU.cxx:353
 AliMFTTrackerMU.cxx:354
 AliMFTTrackerMU.cxx:355
 AliMFTTrackerMU.cxx:356
 AliMFTTrackerMU.cxx:357
 AliMFTTrackerMU.cxx:358
 AliMFTTrackerMU.cxx:359
 AliMFTTrackerMU.cxx:360
 AliMFTTrackerMU.cxx:361
 AliMFTTrackerMU.cxx:362
 AliMFTTrackerMU.cxx:363
 AliMFTTrackerMU.cxx:364
 AliMFTTrackerMU.cxx:365
 AliMFTTrackerMU.cxx:366
 AliMFTTrackerMU.cxx:367
 AliMFTTrackerMU.cxx:368
 AliMFTTrackerMU.cxx:369
 AliMFTTrackerMU.cxx:370
 AliMFTTrackerMU.cxx:371
 AliMFTTrackerMU.cxx:372
 AliMFTTrackerMU.cxx:373
 AliMFTTrackerMU.cxx:374
 AliMFTTrackerMU.cxx:375
 AliMFTTrackerMU.cxx:376
 AliMFTTrackerMU.cxx:377
 AliMFTTrackerMU.cxx:378
 AliMFTTrackerMU.cxx:379
 AliMFTTrackerMU.cxx:380
 AliMFTTrackerMU.cxx:381
 AliMFTTrackerMU.cxx:382
 AliMFTTrackerMU.cxx:383
 AliMFTTrackerMU.cxx:384
 AliMFTTrackerMU.cxx:385
 AliMFTTrackerMU.cxx:386
 AliMFTTrackerMU.cxx:387
 AliMFTTrackerMU.cxx:388
 AliMFTTrackerMU.cxx:389
 AliMFTTrackerMU.cxx:390
 AliMFTTrackerMU.cxx:391
 AliMFTTrackerMU.cxx:392
 AliMFTTrackerMU.cxx:393
 AliMFTTrackerMU.cxx:394
 AliMFTTrackerMU.cxx:395
 AliMFTTrackerMU.cxx:396
 AliMFTTrackerMU.cxx:397
 AliMFTTrackerMU.cxx:398
 AliMFTTrackerMU.cxx:399
 AliMFTTrackerMU.cxx:400
 AliMFTTrackerMU.cxx:401
 AliMFTTrackerMU.cxx:402
 AliMFTTrackerMU.cxx:403
 AliMFTTrackerMU.cxx:404
 AliMFTTrackerMU.cxx:405
 AliMFTTrackerMU.cxx:406
 AliMFTTrackerMU.cxx:407
 AliMFTTrackerMU.cxx:408
 AliMFTTrackerMU.cxx:409
 AliMFTTrackerMU.cxx:410
 AliMFTTrackerMU.cxx:411
 AliMFTTrackerMU.cxx:412
 AliMFTTrackerMU.cxx:413
 AliMFTTrackerMU.cxx:414
 AliMFTTrackerMU.cxx:415
 AliMFTTrackerMU.cxx:416
 AliMFTTrackerMU.cxx:417
 AliMFTTrackerMU.cxx:418
 AliMFTTrackerMU.cxx:419
 AliMFTTrackerMU.cxx:420
 AliMFTTrackerMU.cxx:421
 AliMFTTrackerMU.cxx:422
 AliMFTTrackerMU.cxx:423
 AliMFTTrackerMU.cxx:424
 AliMFTTrackerMU.cxx:425
 AliMFTTrackerMU.cxx:426
 AliMFTTrackerMU.cxx:427
 AliMFTTrackerMU.cxx:428
 AliMFTTrackerMU.cxx:429
 AliMFTTrackerMU.cxx:430
 AliMFTTrackerMU.cxx:431
 AliMFTTrackerMU.cxx:432
 AliMFTTrackerMU.cxx:433
 AliMFTTrackerMU.cxx:434
 AliMFTTrackerMU.cxx:435
 AliMFTTrackerMU.cxx:436
 AliMFTTrackerMU.cxx:437
 AliMFTTrackerMU.cxx:438
 AliMFTTrackerMU.cxx:439
 AliMFTTrackerMU.cxx:440
 AliMFTTrackerMU.cxx:441
 AliMFTTrackerMU.cxx:442
 AliMFTTrackerMU.cxx:443
 AliMFTTrackerMU.cxx:444
 AliMFTTrackerMU.cxx:445
 AliMFTTrackerMU.cxx:446
 AliMFTTrackerMU.cxx:447
 AliMFTTrackerMU.cxx:448
 AliMFTTrackerMU.cxx:449
 AliMFTTrackerMU.cxx:450
 AliMFTTrackerMU.cxx:451
 AliMFTTrackerMU.cxx:452
 AliMFTTrackerMU.cxx:453
 AliMFTTrackerMU.cxx:454
 AliMFTTrackerMU.cxx:455
 AliMFTTrackerMU.cxx:456
 AliMFTTrackerMU.cxx:457
 AliMFTTrackerMU.cxx:458
 AliMFTTrackerMU.cxx:459
 AliMFTTrackerMU.cxx:460
 AliMFTTrackerMU.cxx:461
 AliMFTTrackerMU.cxx:462
 AliMFTTrackerMU.cxx:463
 AliMFTTrackerMU.cxx:464
 AliMFTTrackerMU.cxx:465
 AliMFTTrackerMU.cxx:466
 AliMFTTrackerMU.cxx:467
 AliMFTTrackerMU.cxx:468
 AliMFTTrackerMU.cxx:469
 AliMFTTrackerMU.cxx:470
 AliMFTTrackerMU.cxx:471
 AliMFTTrackerMU.cxx:472
 AliMFTTrackerMU.cxx:473
 AliMFTTrackerMU.cxx:474
 AliMFTTrackerMU.cxx:475
 AliMFTTrackerMU.cxx:476
 AliMFTTrackerMU.cxx:477
 AliMFTTrackerMU.cxx:478
 AliMFTTrackerMU.cxx:479
 AliMFTTrackerMU.cxx:480
 AliMFTTrackerMU.cxx:481
 AliMFTTrackerMU.cxx:482
 AliMFTTrackerMU.cxx:483
 AliMFTTrackerMU.cxx:484
 AliMFTTrackerMU.cxx:485
 AliMFTTrackerMU.cxx:486
 AliMFTTrackerMU.cxx:487
 AliMFTTrackerMU.cxx:488
 AliMFTTrackerMU.cxx:489
 AliMFTTrackerMU.cxx:490
 AliMFTTrackerMU.cxx:491
 AliMFTTrackerMU.cxx:492
 AliMFTTrackerMU.cxx:493
 AliMFTTrackerMU.cxx:494
 AliMFTTrackerMU.cxx:495
 AliMFTTrackerMU.cxx:496
 AliMFTTrackerMU.cxx:497
 AliMFTTrackerMU.cxx:498
 AliMFTTrackerMU.cxx:499
 AliMFTTrackerMU.cxx:500
 AliMFTTrackerMU.cxx:501
 AliMFTTrackerMU.cxx:502
 AliMFTTrackerMU.cxx:503
 AliMFTTrackerMU.cxx:504
 AliMFTTrackerMU.cxx:505
 AliMFTTrackerMU.cxx:506
 AliMFTTrackerMU.cxx:507
 AliMFTTrackerMU.cxx:508
 AliMFTTrackerMU.cxx:509
 AliMFTTrackerMU.cxx:510
 AliMFTTrackerMU.cxx:511
 AliMFTTrackerMU.cxx:512
 AliMFTTrackerMU.cxx:513
 AliMFTTrackerMU.cxx:514
 AliMFTTrackerMU.cxx:515
 AliMFTTrackerMU.cxx:516
 AliMFTTrackerMU.cxx:517
 AliMFTTrackerMU.cxx:518
 AliMFTTrackerMU.cxx:519
 AliMFTTrackerMU.cxx:520
 AliMFTTrackerMU.cxx:521
 AliMFTTrackerMU.cxx:522
 AliMFTTrackerMU.cxx:523
 AliMFTTrackerMU.cxx:524
 AliMFTTrackerMU.cxx:525
 AliMFTTrackerMU.cxx:526
 AliMFTTrackerMU.cxx:527
 AliMFTTrackerMU.cxx:528
 AliMFTTrackerMU.cxx:529
 AliMFTTrackerMU.cxx:530
 AliMFTTrackerMU.cxx:531
 AliMFTTrackerMU.cxx:532
 AliMFTTrackerMU.cxx:533
 AliMFTTrackerMU.cxx:534
 AliMFTTrackerMU.cxx:535
 AliMFTTrackerMU.cxx:536
 AliMFTTrackerMU.cxx:537
 AliMFTTrackerMU.cxx:538
 AliMFTTrackerMU.cxx:539
 AliMFTTrackerMU.cxx:540
 AliMFTTrackerMU.cxx:541
 AliMFTTrackerMU.cxx:542
 AliMFTTrackerMU.cxx:543
 AliMFTTrackerMU.cxx:544
 AliMFTTrackerMU.cxx:545
 AliMFTTrackerMU.cxx:546
 AliMFTTrackerMU.cxx:547
 AliMFTTrackerMU.cxx:548
 AliMFTTrackerMU.cxx:549
 AliMFTTrackerMU.cxx:550
 AliMFTTrackerMU.cxx:551
 AliMFTTrackerMU.cxx:552
 AliMFTTrackerMU.cxx:553
 AliMFTTrackerMU.cxx:554
 AliMFTTrackerMU.cxx:555
 AliMFTTrackerMU.cxx:556
 AliMFTTrackerMU.cxx:557
 AliMFTTrackerMU.cxx:558
 AliMFTTrackerMU.cxx:559
 AliMFTTrackerMU.cxx:560
 AliMFTTrackerMU.cxx:561
 AliMFTTrackerMU.cxx:562
 AliMFTTrackerMU.cxx:563
 AliMFTTrackerMU.cxx:564
 AliMFTTrackerMU.cxx:565
 AliMFTTrackerMU.cxx:566
 AliMFTTrackerMU.cxx:567
 AliMFTTrackerMU.cxx:568
 AliMFTTrackerMU.cxx:569
 AliMFTTrackerMU.cxx:570
 AliMFTTrackerMU.cxx:571
 AliMFTTrackerMU.cxx:572
 AliMFTTrackerMU.cxx:573
 AliMFTTrackerMU.cxx:574
 AliMFTTrackerMU.cxx:575
 AliMFTTrackerMU.cxx:576
 AliMFTTrackerMU.cxx:577
 AliMFTTrackerMU.cxx:578
 AliMFTTrackerMU.cxx:579
 AliMFTTrackerMU.cxx:580
 AliMFTTrackerMU.cxx:581
 AliMFTTrackerMU.cxx:582
 AliMFTTrackerMU.cxx:583
 AliMFTTrackerMU.cxx:584
 AliMFTTrackerMU.cxx:585
 AliMFTTrackerMU.cxx:586
 AliMFTTrackerMU.cxx:587
 AliMFTTrackerMU.cxx:588
 AliMFTTrackerMU.cxx:589
 AliMFTTrackerMU.cxx:590
 AliMFTTrackerMU.cxx:591
 AliMFTTrackerMU.cxx:592
 AliMFTTrackerMU.cxx:593
 AliMFTTrackerMU.cxx:594
 AliMFTTrackerMU.cxx:595
 AliMFTTrackerMU.cxx:596
 AliMFTTrackerMU.cxx:597
 AliMFTTrackerMU.cxx:598
 AliMFTTrackerMU.cxx:599
 AliMFTTrackerMU.cxx:600
 AliMFTTrackerMU.cxx:601
 AliMFTTrackerMU.cxx:602
 AliMFTTrackerMU.cxx:603
 AliMFTTrackerMU.cxx:604
 AliMFTTrackerMU.cxx:605
 AliMFTTrackerMU.cxx:606
 AliMFTTrackerMU.cxx:607
 AliMFTTrackerMU.cxx:608
 AliMFTTrackerMU.cxx:609
 AliMFTTrackerMU.cxx:610
 AliMFTTrackerMU.cxx:611
 AliMFTTrackerMU.cxx:612
 AliMFTTrackerMU.cxx:613
 AliMFTTrackerMU.cxx:614
 AliMFTTrackerMU.cxx:615
 AliMFTTrackerMU.cxx:616
 AliMFTTrackerMU.cxx:617
 AliMFTTrackerMU.cxx:618
 AliMFTTrackerMU.cxx:619
 AliMFTTrackerMU.cxx:620
 AliMFTTrackerMU.cxx:621
 AliMFTTrackerMU.cxx:622
 AliMFTTrackerMU.cxx:623
 AliMFTTrackerMU.cxx:624
 AliMFTTrackerMU.cxx:625
 AliMFTTrackerMU.cxx:626
 AliMFTTrackerMU.cxx:627
 AliMFTTrackerMU.cxx:628
 AliMFTTrackerMU.cxx:629
 AliMFTTrackerMU.cxx:630
 AliMFTTrackerMU.cxx:631
 AliMFTTrackerMU.cxx:632
 AliMFTTrackerMU.cxx:633
 AliMFTTrackerMU.cxx:634
 AliMFTTrackerMU.cxx:635
 AliMFTTrackerMU.cxx:636
 AliMFTTrackerMU.cxx:637
 AliMFTTrackerMU.cxx:638
 AliMFTTrackerMU.cxx:639
 AliMFTTrackerMU.cxx:640
 AliMFTTrackerMU.cxx:641
 AliMFTTrackerMU.cxx:642
 AliMFTTrackerMU.cxx:643
 AliMFTTrackerMU.cxx:644
 AliMFTTrackerMU.cxx:645
 AliMFTTrackerMU.cxx:646
 AliMFTTrackerMU.cxx:647
 AliMFTTrackerMU.cxx:648
 AliMFTTrackerMU.cxx:649
 AliMFTTrackerMU.cxx:650
 AliMFTTrackerMU.cxx:651
 AliMFTTrackerMU.cxx:652
 AliMFTTrackerMU.cxx:653
 AliMFTTrackerMU.cxx:654
 AliMFTTrackerMU.cxx:655
 AliMFTTrackerMU.cxx:656
 AliMFTTrackerMU.cxx:657
 AliMFTTrackerMU.cxx:658
 AliMFTTrackerMU.cxx:659
 AliMFTTrackerMU.cxx:660
 AliMFTTrackerMU.cxx:661
 AliMFTTrackerMU.cxx:662
 AliMFTTrackerMU.cxx:663
 AliMFTTrackerMU.cxx:664
 AliMFTTrackerMU.cxx:665
 AliMFTTrackerMU.cxx:666
 AliMFTTrackerMU.cxx:667
 AliMFTTrackerMU.cxx:668
 AliMFTTrackerMU.cxx:669
 AliMFTTrackerMU.cxx:670
 AliMFTTrackerMU.cxx:671
 AliMFTTrackerMU.cxx:672
 AliMFTTrackerMU.cxx:673
 AliMFTTrackerMU.cxx:674
 AliMFTTrackerMU.cxx:675
 AliMFTTrackerMU.cxx:676
 AliMFTTrackerMU.cxx:677
 AliMFTTrackerMU.cxx:678
 AliMFTTrackerMU.cxx:679
 AliMFTTrackerMU.cxx:680
 AliMFTTrackerMU.cxx:681
 AliMFTTrackerMU.cxx:682
 AliMFTTrackerMU.cxx:683
 AliMFTTrackerMU.cxx:684
 AliMFTTrackerMU.cxx:685
 AliMFTTrackerMU.cxx:686
 AliMFTTrackerMU.cxx:687
 AliMFTTrackerMU.cxx:688
 AliMFTTrackerMU.cxx:689
 AliMFTTrackerMU.cxx:690
 AliMFTTrackerMU.cxx:691
 AliMFTTrackerMU.cxx:692
 AliMFTTrackerMU.cxx:693
 AliMFTTrackerMU.cxx:694
 AliMFTTrackerMU.cxx:695
 AliMFTTrackerMU.cxx:696
 AliMFTTrackerMU.cxx:697
 AliMFTTrackerMU.cxx:698
 AliMFTTrackerMU.cxx:699
 AliMFTTrackerMU.cxx:700
 AliMFTTrackerMU.cxx:701
 AliMFTTrackerMU.cxx:702
 AliMFTTrackerMU.cxx:703
 AliMFTTrackerMU.cxx:704
 AliMFTTrackerMU.cxx:705
 AliMFTTrackerMU.cxx:706
 AliMFTTrackerMU.cxx:707
 AliMFTTrackerMU.cxx:708
 AliMFTTrackerMU.cxx:709