ROOT logo
#ifndef ALIANALYSISTASKLINKTOMC_H
#define ALIANALYSISTASKLINKTOMC_H
/* This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 * See cxx source for full Copyright notice                               */

/* $Id$ */ 

///
/// @file   AliAnalysisTaskLinkToMC.h
/// @author Artur Szostak <artursz@iafrica.com>
/// @date   27 Oct 2008
/// @brief  Definition of the AliAnalysisTaskLinkToMC task to connect reconstructed tracks with MC tracks.
///

#include "AliAnalysisTaskSE.h"

class TList;
class TH2D;
class TMap;
class AliESDMuonTrack;
class AliMCParticle;

/**
 * \class AliAnalysisTaskLinkToMC
 * Connects reconstructed tracks found in the ESD to their corresponding Monte
 * Carlo tracks via the proximity of their hit coordinates.
 */
class AliAnalysisTaskLinkToMC : public AliAnalysisTaskSE
{
public:
	AliAnalysisTaskLinkToMC();
	AliAnalysisTaskLinkToMC(const char* name);

	virtual void UserCreateOutputObjects();
	virtual void UserExec(Option_t* option);
	virtual void Terminate(Option_t* option);
	
	/// Returns the absolute maximum distance in centimetres between the
	/// cluster and track reference that is allowed in the X direction.
	Double_t HardCutLimitX() const { return fHardCutLimitX; }
	
	/// Returns the absolute maximum distance in centimetres between the
	/// cluster and track reference that is allowed in the Y direction.
	Double_t HardCutLimitY() const { return fHardCutLimitY; }
	
	/// Returns the absolute maximum distance in centimetres between the
	/// cluster and track reference that is allowed in the Z direction.
	Double_t HardCutLimitZ() const { return fHardCutLimitZ; }
	
	void HardCutLimitX(Double_t value);
	void HardCutLimitY(Double_t value);
	void HardCutLimitZ(Double_t value);
	
	Double_t SigmaCut() const;
	
	/// Sets the maximum sigma value to allow for each X and Y dimension
	/// between clusters and track references.
	void SigmaCut(Double_t value) { fSigmaCut2 = value*value; }
	
	/// Returns the minimum number of clusters that must match between the
	/// ESD track clusters and track references.
	Int_t MinClusters() const { return fMinClusters; }
	
	/// Sets the minimum number of clusters that must match between the ESD
	/// track clusters and track references.
	void MinClusters(Int_t value) { fMinClusters = value; }
	
	/// Returns the minimum number of clusters that must match between the
	/// ESD track clusters and track references in stations 1 and 2.
	Int_t MinClustersInSt12() const { return fMinClustersInSt12; }
	
	/// Sets the minimum number of clusters that must match between the ESD
	/// track clusters and track references in stations 1 and 2.
	void MinClustersInSt12(Int_t value) { fMinClustersInSt12 = value; }
	
	/// Returns the minimum number of clusters that must match between the
	/// ESD track clusters and track references in stations 4 and 5.
	Int_t MinClustersInSt45() const { return fMinClustersInSt45; }
	
	/// Sets the minimum number of clusters that must match between the ESD
	/// track clusters and track references in stations 4 and 5.
	void MinClustersInSt45(Int_t value) { fMinClustersInSt45 = value; }
	
	/// Returns the flag indicating if histograms should be generated for
	/// checking the quality of track matching.
	Bool_t GenerateHistograms() const { return fMakeHists; }
	
	/// Set the flag indicating if histograms should be generated for checking
	/// the quality of track matching.
	void GenerateHistograms(Bool_t value) { fMakeHists = value; }
	
	/// Returns the flag indicating if the Z coordinate is to be used for
	/// track matching or not.
	Bool_t UseZCoordinate() const { return fUseZCoordinate; }
	
	/// Set the flag indicating if the Z coordinate should be used for track
	/// matching.
	void UseZCoordinate(Bool_t value) { fUseZCoordinate = value; }
	
	Bool_t ChamberMustMatch(Int_t chamber) const;
	void ChamberMustMatch(Int_t chamber, Bool_t value);
	Bool_t StationMustMatch(Int_t station) const;
	void StationMustMatch(Int_t station, Bool_t value);

private:

	/// Do not allow copying of this object. Method is not implemented.
	AliAnalysisTaskLinkToMC(const AliAnalysisTaskLinkToMC& obj);
	/// Do not allow copying of this object. Method is not implemented.
	AliAnalysisTaskLinkToMC& operator = (const AliAnalysisTaskLinkToMC& obj);
	
	void FindLinksToMC(TMap& links);
	void CalculateTrackCompatibility(
			AliESDMuonTrack* esdTrack, AliMCParticle* mcTrack,
			bool& tracksCompatible, Double_t& chi2, Int_t& noOfClusters
		);
	
	bool IsFindable(AliMCParticle* track) const;
	
	void FillHistsFromMC();
	void FillHistsFromLinks(TMap& links);
	void CreateAODTracks(TMap& links);

	TList* fHistos;  //! List of all histograms produced by this analysis task.
	TH2D* fFindableHist;  //! Histogram of reconstructible tracks (filled with MC information).
	TH2D* fFoundHistMC;  //! Histogram of reconstructed tracks (filled with MC information).
	TH2D* fFoundHist;  //! Histogram of reconstructed tracks (filled with reconstructed information).
	TH2D* fFakeHist;  //! Histogram of fake tracks (filled with reconstructed information).
	
	Double_t fHardCutLimitX; //! The absolute maximum difference between a cluster and reference track point in X direction in centimetres.
	Double_t fHardCutLimitY; //! The absolute maximum difference between a cluster and reference track point in Y direction in centimetres.
	Double_t fHardCutLimitZ; //! The absolute maximum difference between a cluster and reference track point in Z direction in centimetres.
	Double_t fVarX; //! The variance to use in the X direction if error value in the cluster was not set.
	Double_t fVarY; //! The variance to use in the Y direction if error value in the cluster was not set.
	Double_t fSigmaCut2; //! The cut on the chi2 X/Y direction component to make for each cluster fit.
	Int_t fMinClusters; //! Minimum number of clusters that must match between an ESD and MC track for it to be considered compatible.
	Int_t fMinClustersInSt12;  //! The minimum number of clusters that must match in stations 1 and 2.
	Int_t fMinClustersInSt45;  //! The minimum number of clusters that must match in stations 4 and 5.
	Bool_t fMakeHists;  //! Flag indicating if histogram filling and generation should be performed.
	Bool_t fUseZCoordinate;  //! Flag indicating if the Z coordinate should be used for comparrison.
	Bool_t fChamberMustMatch[14];  //! A flag for each chamber which must have a compatible hit matched.
	Bool_t fStationMustMatch[7];  //! A flag for each station which must have at least one compatible hit matched.

	ClassDef(AliAnalysisTaskLinkToMC, 0) // Analysis task to connect reconstructed tracks to their Monte Carlo counterparts.
};

#endif // ALIANALYSISTASKLINKTOMC_H

 AliAnalysisTaskLinkToMC.h:1
 AliAnalysisTaskLinkToMC.h:2
 AliAnalysisTaskLinkToMC.h:3
 AliAnalysisTaskLinkToMC.h:4
 AliAnalysisTaskLinkToMC.h:5
 AliAnalysisTaskLinkToMC.h:6
 AliAnalysisTaskLinkToMC.h:7
 AliAnalysisTaskLinkToMC.h:8
 AliAnalysisTaskLinkToMC.h:9
 AliAnalysisTaskLinkToMC.h:10
 AliAnalysisTaskLinkToMC.h:11
 AliAnalysisTaskLinkToMC.h:12
 AliAnalysisTaskLinkToMC.h:13
 AliAnalysisTaskLinkToMC.h:14
 AliAnalysisTaskLinkToMC.h:15
 AliAnalysisTaskLinkToMC.h:16
 AliAnalysisTaskLinkToMC.h:17
 AliAnalysisTaskLinkToMC.h:18
 AliAnalysisTaskLinkToMC.h:19
 AliAnalysisTaskLinkToMC.h:20
 AliAnalysisTaskLinkToMC.h:21
 AliAnalysisTaskLinkToMC.h:22
 AliAnalysisTaskLinkToMC.h:23
 AliAnalysisTaskLinkToMC.h:24
 AliAnalysisTaskLinkToMC.h:25
 AliAnalysisTaskLinkToMC.h:26
 AliAnalysisTaskLinkToMC.h:27
 AliAnalysisTaskLinkToMC.h:28
 AliAnalysisTaskLinkToMC.h:29
 AliAnalysisTaskLinkToMC.h:30
 AliAnalysisTaskLinkToMC.h:31
 AliAnalysisTaskLinkToMC.h:32
 AliAnalysisTaskLinkToMC.h:33
 AliAnalysisTaskLinkToMC.h:34
 AliAnalysisTaskLinkToMC.h:35
 AliAnalysisTaskLinkToMC.h:36
 AliAnalysisTaskLinkToMC.h:37
 AliAnalysisTaskLinkToMC.h:38
 AliAnalysisTaskLinkToMC.h:39
 AliAnalysisTaskLinkToMC.h:40
 AliAnalysisTaskLinkToMC.h:41
 AliAnalysisTaskLinkToMC.h:42
 AliAnalysisTaskLinkToMC.h:43
 AliAnalysisTaskLinkToMC.h:44
 AliAnalysisTaskLinkToMC.h:45
 AliAnalysisTaskLinkToMC.h:46
 AliAnalysisTaskLinkToMC.h:47
 AliAnalysisTaskLinkToMC.h:48
 AliAnalysisTaskLinkToMC.h:49
 AliAnalysisTaskLinkToMC.h:50
 AliAnalysisTaskLinkToMC.h:51
 AliAnalysisTaskLinkToMC.h:52
 AliAnalysisTaskLinkToMC.h:53
 AliAnalysisTaskLinkToMC.h:54
 AliAnalysisTaskLinkToMC.h:55
 AliAnalysisTaskLinkToMC.h:56
 AliAnalysisTaskLinkToMC.h:57
 AliAnalysisTaskLinkToMC.h:58
 AliAnalysisTaskLinkToMC.h:59
 AliAnalysisTaskLinkToMC.h:60
 AliAnalysisTaskLinkToMC.h:61
 AliAnalysisTaskLinkToMC.h:62
 AliAnalysisTaskLinkToMC.h:63
 AliAnalysisTaskLinkToMC.h:64
 AliAnalysisTaskLinkToMC.h:65
 AliAnalysisTaskLinkToMC.h:66
 AliAnalysisTaskLinkToMC.h:67
 AliAnalysisTaskLinkToMC.h:68
 AliAnalysisTaskLinkToMC.h:69
 AliAnalysisTaskLinkToMC.h:70
 AliAnalysisTaskLinkToMC.h:71
 AliAnalysisTaskLinkToMC.h:72
 AliAnalysisTaskLinkToMC.h:73
 AliAnalysisTaskLinkToMC.h:74
 AliAnalysisTaskLinkToMC.h:75
 AliAnalysisTaskLinkToMC.h:76
 AliAnalysisTaskLinkToMC.h:77
 AliAnalysisTaskLinkToMC.h:78
 AliAnalysisTaskLinkToMC.h:79
 AliAnalysisTaskLinkToMC.h:80
 AliAnalysisTaskLinkToMC.h:81
 AliAnalysisTaskLinkToMC.h:82
 AliAnalysisTaskLinkToMC.h:83
 AliAnalysisTaskLinkToMC.h:84
 AliAnalysisTaskLinkToMC.h:85
 AliAnalysisTaskLinkToMC.h:86
 AliAnalysisTaskLinkToMC.h:87
 AliAnalysisTaskLinkToMC.h:88
 AliAnalysisTaskLinkToMC.h:89
 AliAnalysisTaskLinkToMC.h:90
 AliAnalysisTaskLinkToMC.h:91
 AliAnalysisTaskLinkToMC.h:92
 AliAnalysisTaskLinkToMC.h:93
 AliAnalysisTaskLinkToMC.h:94
 AliAnalysisTaskLinkToMC.h:95
 AliAnalysisTaskLinkToMC.h:96
 AliAnalysisTaskLinkToMC.h:97
 AliAnalysisTaskLinkToMC.h:98
 AliAnalysisTaskLinkToMC.h:99
 AliAnalysisTaskLinkToMC.h:100
 AliAnalysisTaskLinkToMC.h:101
 AliAnalysisTaskLinkToMC.h:102
 AliAnalysisTaskLinkToMC.h:103
 AliAnalysisTaskLinkToMC.h:104
 AliAnalysisTaskLinkToMC.h:105
 AliAnalysisTaskLinkToMC.h:106
 AliAnalysisTaskLinkToMC.h:107
 AliAnalysisTaskLinkToMC.h:108
 AliAnalysisTaskLinkToMC.h:109
 AliAnalysisTaskLinkToMC.h:110
 AliAnalysisTaskLinkToMC.h:111
 AliAnalysisTaskLinkToMC.h:112
 AliAnalysisTaskLinkToMC.h:113
 AliAnalysisTaskLinkToMC.h:114
 AliAnalysisTaskLinkToMC.h:115
 AliAnalysisTaskLinkToMC.h:116
 AliAnalysisTaskLinkToMC.h:117
 AliAnalysisTaskLinkToMC.h:118
 AliAnalysisTaskLinkToMC.h:119
 AliAnalysisTaskLinkToMC.h:120
 AliAnalysisTaskLinkToMC.h:121
 AliAnalysisTaskLinkToMC.h:122
 AliAnalysisTaskLinkToMC.h:123
 AliAnalysisTaskLinkToMC.h:124
 AliAnalysisTaskLinkToMC.h:125
 AliAnalysisTaskLinkToMC.h:126
 AliAnalysisTaskLinkToMC.h:127
 AliAnalysisTaskLinkToMC.h:128
 AliAnalysisTaskLinkToMC.h:129
 AliAnalysisTaskLinkToMC.h:130
 AliAnalysisTaskLinkToMC.h:131
 AliAnalysisTaskLinkToMC.h:132
 AliAnalysisTaskLinkToMC.h:133
 AliAnalysisTaskLinkToMC.h:134
 AliAnalysisTaskLinkToMC.h:135
 AliAnalysisTaskLinkToMC.h:136
 AliAnalysisTaskLinkToMC.h:137
 AliAnalysisTaskLinkToMC.h:138
 AliAnalysisTaskLinkToMC.h:139
 AliAnalysisTaskLinkToMC.h:140
 AliAnalysisTaskLinkToMC.h:141
 AliAnalysisTaskLinkToMC.h:142
 AliAnalysisTaskLinkToMC.h:143
 AliAnalysisTaskLinkToMC.h:144
 AliAnalysisTaskLinkToMC.h:145
 AliAnalysisTaskLinkToMC.h:146
 AliAnalysisTaskLinkToMC.h:147
 AliAnalysisTaskLinkToMC.h:148
 AliAnalysisTaskLinkToMC.h:149