ROOT logo
#ifndef ALICALOPHOTONCUTS_H
#define ALICALOPHOTONCUTS_H

// Class handling all kinds of selection cuts for Gamma Conversion analysis
// Authors: Svein Lindal, Daniel Lohner                                    *

#include "AliConversionPhotonBase.h"
#include "AliAODConversionMother.h"
#include "AliAODTrack.h"
#include "AliESDtrack.h"
#include "AliVTrack.h"
#include "AliVCluster.h"
#include "AliAODTrack.h"
#include "AliStack.h"
#include "AliAnalysisCuts.h"
#include "TH1F.h"
#include "TF1.h"
#include "AliAnalysisUtils.h"
#include "AliAnalysisManager.h"

class AliESDEvent;
class AliAODEvent;
class AliConversionPhotonBase;
class TH1F;
class TH2F;
class TF1;
class AliPIDResponse;
class AliAnalysisCuts;
class iostream;
class TList;
class AliAnalysisManager;
class AliAODMCParticle;

using namespace std;

class AliCaloPhotonCuts : public AliAnalysisCuts {
		
	public: 
		enum cutIds {
			kClusterType,                  
			kEtaMin,
			kEtaMax,
			kPhiMin,
			kPhiMax,
			kDistanceToBadChannel,
			kTiming,
			kTrackMatching,
			kExoticCell,
			kMinEnery,               
			kNMinCells, 
			kMinM02,    
			kMaxM02,    
			kMinM20,
			kMaxM20,
			kDispersion,
			kNLM,
			kNCuts
		};

		enum photonCuts {
			kPhotonIn=0,
			kDetector,
			kAcceptance,
			kClusterQuality,
			kPhotonOut
		};

		//handeling of CutString
		static const char * fgkCutNames[kNCuts];
		Bool_t 			SetCutIds(TString cutString); 
		Int_t 			fCuts[kNCuts];
		Bool_t 			SetCut(cutIds cutID, Int_t cut);
		Bool_t 			UpdateCutString();
		void 			PrintCuts();
		void 			PrintCutsWithValues();
		
		Bool_t 			InitializeCutsFromCutString(const TString analysisCutSelection);
		TString 		GetCutNumber();
        Int_t 			GetClusterType() {return fClusterType; }
		
		//Constructors
		AliCaloPhotonCuts(const char *name="ClusterCuts", const char * title="Cluster Cuts");
		AliCaloPhotonCuts(const AliCaloPhotonCuts&);
		AliCaloPhotonCuts& operator=(const AliCaloPhotonCuts&);

		//virtual destructor
		virtual 		~AliCaloPhotonCuts();                          

		virtual Bool_t 	IsSelected(TObject* /*obj*/)									{return kTRUE;}
		virtual Bool_t 	IsSelected(TList* /*list*/) 									{return kTRUE;}

		Bool_t 			ClusterIsSelected(AliVCluster* cluster, AliVEvent *event, Bool_t isMC);
		Bool_t 			ClusterIsSelectedMC(TParticle *particle,AliStack *fMCStack);
		Bool_t 			ClusterIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray);
			
		void 			InitCutHistograms(TString name="");
        void 			SetFillCutHistograms(TString name="")							{if(!fHistograms){InitCutHistograms(name);}}
		TList*			GetCutHistograms()												{return fHistograms;}
		void 			FillClusterCutIndex(Int_t photoncut)							{if(fHistCutIndex)fHistCutIndex->Fill(photoncut);}

        void 			SetExtendedMatching(Bool_t extendedMatching)					{fExtendedMatching = extendedMatching;}
			
		///Cut functions
		Bool_t 			AcceptanceCuts(AliVCluster* cluster, AliVEvent *event);
		Bool_t 			ClusterQualityCuts(AliVCluster* cluster,AliVEvent *event, Bool_t isMC);

		Bool_t 			MatchConvPhotonToCluster(AliAODConversionPhoton* convPhoton, AliVCluster* cluster, AliVEvent* event );

		// Set Individual Cuts
		Bool_t 			SetClusterTypeCut(Int_t);
		Bool_t 			SetMinEtaCut(Int_t);
		Bool_t 			SetMaxEtaCut(Int_t);
		Bool_t 			SetMinPhiCut(Int_t);		
		Bool_t 			SetMaxPhiCut(Int_t);		
		Bool_t 			SetDistanceToBadChannelCut(Int_t);
		Bool_t 			SetTimingCut(Int_t);
		Bool_t 			SetTrackMatchingCut(Int_t);
		Bool_t 			SetExoticCellCut(Int_t);
		Bool_t 			SetMinEnergyCut(Int_t);
		Bool_t 			SetMinNCellsCut(Int_t);
		Bool_t 			SetMaxM02(Int_t);
		Bool_t 			SetMinM02(Int_t);
		Bool_t 			SetMaxM20(Int_t);
		Bool_t 			SetMinM20(Int_t);
		Bool_t 			SetDispersion(Int_t);
		Bool_t 			SetNLM(Int_t);
		
	protected:
        TList       *fHistograms;
		
		//cuts
		Int_t		fClusterType;						// which cluster do we have
		Double_t 	fMinEtaCut; 						// min eta cut
		Double_t 	fMaxEtaCut; 						// max eta cut
		Bool_t 		fUseEtaCut;							// flag for switching on eta cut
		Double_t 	fMinPhiCut; 						// phi cut
		Double_t 	fMaxPhiCut; 						// phi cut
		Bool_t 		fUsePhiCut;							// flag for switching on phi cut
		Double_t 	fMinDistanceToBadChannel; 			// minimum distance to bad channel
		Bool_t 		fUseDistanceToBadChannel;			// flag for switching on distance to bad channel cut
		Double_t 	fMaxTimeDiff; 						// maximum time difference to triggered collision
		Bool_t 		fUseTimeDiff;						// flag for switching on time difference cut
        Double_t 	fMaxDistTrackToClusterEta; 			// minimum distance between track and cluster in eta
        Double_t 	fMinDistTrackToClusterPhi; 			// minimum distance between track and cluster in phi
        Double_t    fMaxDistTrackToClusterPhi;          // maximum distance between track and cluster in phi
		Bool_t 		fUseDistTrackToCluster;				// flag for switching on distance between track and cluster cut
		Bool_t 		fExtendedMatching;					// flag for switching on extended matching histograms
		Double_t 	fExoticCell;						// exotic cell cut
		Bool_t 		fUseExoticCell;						// flag for switching on exotic cell cut
		Double_t 	fMinEnergy;							// minium energy per cluster
		Bool_t 		fUseMinEnergy;						// flag for switching on minimum energy cut
		Int_t 		fMinNCells;							// minimum number of cells 
		Bool_t 		fUseNCells;							// flag for switching on minimum N Cells cut
		Double_t 	fMaxM02;							// maximum M02
		Double_t 	fMinM02;							// minimum M02
		Bool_t 		fUseM02;								// flag for switching on M02 cut
		Double_t 	fMaxM20;							// maximum M20
		Double_t 	fMinM20;							// minimum M20
		Bool_t 		fUseM20;								// flag for switching on M20 cut
		Double_t 	fMaxDispersion;					// maximum dispersion
		Bool_t 		fUseDispersion;						// flag for switching on dispersion cut
		Int_t 		fMinNLM;								// minimum number of local maxima in cluster
		Int_t 		fMaxNLM;								// maximum number of local maxima in cluster
		Bool_t 		fUseNLM;								// flag for switching on NLM cut
		
		// CutString
		TObjString* fCutString; 							// cut number used for analysis
		
		// Histograms
		TH1F* 		fHistCutIndex; 							// bookkeeping for cuts
		TH1F* 		fHistAcceptanceCuts; 					// bookkeeping for acceptance cuts
		TH1F* 		fHistClusterIdentificationCuts; 		// bookkeeping for cluster identification cuts
		
		TH2F* 		fHistClusterEtavsPhiBeforeAcc; 			// eta-phi-distribution before acceptance cuts
		TH2F* 		fHistClusterEtavsPhiAfterAcc; 			// eta-phi-distribution of all after acceptance cuts
		TH2F* 		fHistClusterEtavsPhiAfterQA; 			// eta-phi-distribution of all after cluster quality cuts
// 		TH1F* 		fHistDistanceToBadChannelBeforeAcc;		// distance to bad channel before acceptance cuts
// 		TH1F* 		fHistDistanceToBadChannelAfterAcc;		// distance to bad channel after acceptance cuts
		TH2F* 		fHistClusterTimevsEBeforeQA;			// Cluster time vs E before cluster quality cuts
		TH2F* 		fHistClusterTimevsEAfterQA;				// Cluster time vs E after cluster quality cuts
// 		TH2F* 		fHistExoticCellBeforeQA;				// Exotic cell: 1-Ecross/E cell vs Ecluster before acceptance cuts
// 		TH2F* 		fHistExoticCellAfterQA;					// Exotic cell: 1-Ecross/E cell vs Ecluster after cluster quality cuts
// 		TH1F* 		fHistNMatchedTracks;					// number of matched tracks
		TH1F* 		fHistEnergyOfClusterBeforeQA;			// enery per cluster before acceptance cuts
		TH1F* 		fHistEnergyOfClusterAfterQA;			// enery per cluster after cluster quality cuts
		TH1F* 		fHistNCellsBeforeQA;					// number of cells per cluster before acceptance cuts
		TH1F* 		fHistNCellsAfterQA;						// number of cells per cluster after cluster quality cuts
		TH1F* 		fHistM02BeforeQA;						// M02 before acceptance cuts
		TH1F* 		fHistM02AfterQA;						// M02 after cluster quality cuts
		TH1F* 		fHistM20BeforeQA;						// M20 before acceptance cuts
		TH1F* 		fHistM20AfterQA;						// M20 after cluster quality cuts
		TH1F* 		fHistDispersionBeforeQA;				// dispersion before acceptance cuts
		TH1F* 		fHistDispersionAfterQA;					// dispersion after cluster quality cuts
// 		TH1F* 		fHistNLMBeforeQA;						// number of local maxima in cluster before acceptance cuts
// 		TH1F* 		fHistNLMAfterQA;						// number of local maxima in cluster after cluster quality cuts

        //Track matching histograms
		TH1F* 		fHistClusterRBeforeQA;					// cluster position in R=SQRT(x^2+y^2) (before QA)
		TH1F* 		fHistClusterRAfterQA;					// cluster position in R=SQRT(x^2+y^2) for matched tracks (After QA)
        TH2F* 		fHistClusterdEtadPhiBeforeQA;			// 2-dim plot dEta vs. dPhi
		TH2F* 		fHistClusterdEtadPhiAfterQA;			// 2-dim plot dEta vs. dPhi for matched tracks (after QA)
		TH1F* 		fHistDistanceTrackToClusterBeforeQA;	// distance cluster to track before acceptance cuts
        TH1F* 		fHistDistanceTrackToClusterAfterQA;		// distance cluster to track after cluster quality cuts

        //Extended track matching histograms
        TH2F* 		fHistClusterdEtadPhiPosTracksBeforeQA;	// 2-dim plot dEta vs. dPhi
        TH2F* 		fHistClusterdEtadPhiNegTracksBeforeQA;	// 2-dim plot dEta vs. dPhi
        TH2F* 		fHistClusterdEtadPhiPosTracksAfterQA;	// 2-dim plot dEta vs. dPhi
        TH2F* 		fHistClusterdEtadPhiNegTracksAfterQA;	// 2-dim plot dEta vs. dPhi
        TH2F*       fHistClusterdEtadPhiPosTracks_P1_BeforeQA;   // 2-dim plot dEta vs. dPhi, positive Tracks, P < 1
        TH2F*       fHistClusterdEtadPhiPosTracks_P14_BeforeQA;  // 2-dim plot dEta vs. dPhi, positive Tracks, 1 < P < 4
        TH2F*       fHistClusterdEtadPhiPosTracks_P4_BeforeQA;   // 2-dim plot dEta vs. dPhi, positive Tracks, P > 4
        TH2F*       fHistClusterdEtadPhiNegTracks_P1_BeforeQA;   // 2-dim plot dEta vs. dPhi, negative Tracks, P < 1
        TH2F*       fHistClusterdEtadPhiNegTracks_P14_BeforeQA;  // 2-dim plot dEta vs. dPhi, negative Tracks, 1 < P < 4
        TH2F*       fHistClusterdEtadPhiNegTracks_P4_BeforeQA;   // 2-dim plot dEta vs. dPhi, negative Tracks, P > 4
        TH2F* 		fHistClusterdEtadPtBeforeQA;			// 2-dim plot dEta vs. Pt
        TH2F* 		fHistClusterdPhidPtBeforeQA;			// 2-dim plot dEta vs. Pt
        TH2F* 		fHistClusterM20Pt_dPhiBeforeQA;			// 2-dim plot M20 vs. Pt for given dPhi>0.05
        TH2F* 		fHistClusterM02Pt_dPhiBeforeQA;			// 2-dim plot M02 vs. Pt for given dPhi>0.05
        TH2F* 		fHistClusterM20M02BeforeQA;				// 2-dim plot M20 vs. M02
        TH2F* 		fHistClusterM20M02AfterQA;				// 2-dim plot M20 vs. M20

	private:

		ClassDef(AliCaloPhotonCuts,2)
};

#endif
 AliCaloPhotonCuts.h:1
 AliCaloPhotonCuts.h:2
 AliCaloPhotonCuts.h:3
 AliCaloPhotonCuts.h:4
 AliCaloPhotonCuts.h:5
 AliCaloPhotonCuts.h:6
 AliCaloPhotonCuts.h:7
 AliCaloPhotonCuts.h:8
 AliCaloPhotonCuts.h:9
 AliCaloPhotonCuts.h:10
 AliCaloPhotonCuts.h:11
 AliCaloPhotonCuts.h:12
 AliCaloPhotonCuts.h:13
 AliCaloPhotonCuts.h:14
 AliCaloPhotonCuts.h:15
 AliCaloPhotonCuts.h:16
 AliCaloPhotonCuts.h:17
 AliCaloPhotonCuts.h:18
 AliCaloPhotonCuts.h:19
 AliCaloPhotonCuts.h:20
 AliCaloPhotonCuts.h:21
 AliCaloPhotonCuts.h:22
 AliCaloPhotonCuts.h:23
 AliCaloPhotonCuts.h:24
 AliCaloPhotonCuts.h:25
 AliCaloPhotonCuts.h:26
 AliCaloPhotonCuts.h:27
 AliCaloPhotonCuts.h:28
 AliCaloPhotonCuts.h:29
 AliCaloPhotonCuts.h:30
 AliCaloPhotonCuts.h:31
 AliCaloPhotonCuts.h:32
 AliCaloPhotonCuts.h:33
 AliCaloPhotonCuts.h:34
 AliCaloPhotonCuts.h:35
 AliCaloPhotonCuts.h:36
 AliCaloPhotonCuts.h:37
 AliCaloPhotonCuts.h:38
 AliCaloPhotonCuts.h:39
 AliCaloPhotonCuts.h:40
 AliCaloPhotonCuts.h:41
 AliCaloPhotonCuts.h:42
 AliCaloPhotonCuts.h:43
 AliCaloPhotonCuts.h:44
 AliCaloPhotonCuts.h:45
 AliCaloPhotonCuts.h:46
 AliCaloPhotonCuts.h:47
 AliCaloPhotonCuts.h:48
 AliCaloPhotonCuts.h:49
 AliCaloPhotonCuts.h:50
 AliCaloPhotonCuts.h:51
 AliCaloPhotonCuts.h:52
 AliCaloPhotonCuts.h:53
 AliCaloPhotonCuts.h:54
 AliCaloPhotonCuts.h:55
 AliCaloPhotonCuts.h:56
 AliCaloPhotonCuts.h:57
 AliCaloPhotonCuts.h:58
 AliCaloPhotonCuts.h:59
 AliCaloPhotonCuts.h:60
 AliCaloPhotonCuts.h:61
 AliCaloPhotonCuts.h:62
 AliCaloPhotonCuts.h:63
 AliCaloPhotonCuts.h:64
 AliCaloPhotonCuts.h:65
 AliCaloPhotonCuts.h:66
 AliCaloPhotonCuts.h:67
 AliCaloPhotonCuts.h:68
 AliCaloPhotonCuts.h:69
 AliCaloPhotonCuts.h:70
 AliCaloPhotonCuts.h:71
 AliCaloPhotonCuts.h:72
 AliCaloPhotonCuts.h:73
 AliCaloPhotonCuts.h:74
 AliCaloPhotonCuts.h:75
 AliCaloPhotonCuts.h:76
 AliCaloPhotonCuts.h:77
 AliCaloPhotonCuts.h:78
 AliCaloPhotonCuts.h:79
 AliCaloPhotonCuts.h:80
 AliCaloPhotonCuts.h:81
 AliCaloPhotonCuts.h:82
 AliCaloPhotonCuts.h:83
 AliCaloPhotonCuts.h:84
 AliCaloPhotonCuts.h:85
 AliCaloPhotonCuts.h:86
 AliCaloPhotonCuts.h:87
 AliCaloPhotonCuts.h:88
 AliCaloPhotonCuts.h:89
 AliCaloPhotonCuts.h:90
 AliCaloPhotonCuts.h:91
 AliCaloPhotonCuts.h:92
 AliCaloPhotonCuts.h:93
 AliCaloPhotonCuts.h:94
 AliCaloPhotonCuts.h:95
 AliCaloPhotonCuts.h:96
 AliCaloPhotonCuts.h:97
 AliCaloPhotonCuts.h:98
 AliCaloPhotonCuts.h:99
 AliCaloPhotonCuts.h:100
 AliCaloPhotonCuts.h:101
 AliCaloPhotonCuts.h:102
 AliCaloPhotonCuts.h:103
 AliCaloPhotonCuts.h:104
 AliCaloPhotonCuts.h:105
 AliCaloPhotonCuts.h:106
 AliCaloPhotonCuts.h:107
 AliCaloPhotonCuts.h:108
 AliCaloPhotonCuts.h:109
 AliCaloPhotonCuts.h:110
 AliCaloPhotonCuts.h:111
 AliCaloPhotonCuts.h:112
 AliCaloPhotonCuts.h:113
 AliCaloPhotonCuts.h:114
 AliCaloPhotonCuts.h:115
 AliCaloPhotonCuts.h:116
 AliCaloPhotonCuts.h:117
 AliCaloPhotonCuts.h:118
 AliCaloPhotonCuts.h:119
 AliCaloPhotonCuts.h:120
 AliCaloPhotonCuts.h:121
 AliCaloPhotonCuts.h:122
 AliCaloPhotonCuts.h:123
 AliCaloPhotonCuts.h:124
 AliCaloPhotonCuts.h:125
 AliCaloPhotonCuts.h:126
 AliCaloPhotonCuts.h:127
 AliCaloPhotonCuts.h:128
 AliCaloPhotonCuts.h:129
 AliCaloPhotonCuts.h:130
 AliCaloPhotonCuts.h:131
 AliCaloPhotonCuts.h:132
 AliCaloPhotonCuts.h:133
 AliCaloPhotonCuts.h:134
 AliCaloPhotonCuts.h:135
 AliCaloPhotonCuts.h:136
 AliCaloPhotonCuts.h:137
 AliCaloPhotonCuts.h:138
 AliCaloPhotonCuts.h:139
 AliCaloPhotonCuts.h:140
 AliCaloPhotonCuts.h:141
 AliCaloPhotonCuts.h:142
 AliCaloPhotonCuts.h:143
 AliCaloPhotonCuts.h:144
 AliCaloPhotonCuts.h:145
 AliCaloPhotonCuts.h:146
 AliCaloPhotonCuts.h:147
 AliCaloPhotonCuts.h:148
 AliCaloPhotonCuts.h:149
 AliCaloPhotonCuts.h:150
 AliCaloPhotonCuts.h:151
 AliCaloPhotonCuts.h:152
 AliCaloPhotonCuts.h:153
 AliCaloPhotonCuts.h:154
 AliCaloPhotonCuts.h:155
 AliCaloPhotonCuts.h:156
 AliCaloPhotonCuts.h:157
 AliCaloPhotonCuts.h:158
 AliCaloPhotonCuts.h:159
 AliCaloPhotonCuts.h:160
 AliCaloPhotonCuts.h:161
 AliCaloPhotonCuts.h:162
 AliCaloPhotonCuts.h:163
 AliCaloPhotonCuts.h:164
 AliCaloPhotonCuts.h:165
 AliCaloPhotonCuts.h:166
 AliCaloPhotonCuts.h:167
 AliCaloPhotonCuts.h:168
 AliCaloPhotonCuts.h:169
 AliCaloPhotonCuts.h:170
 AliCaloPhotonCuts.h:171
 AliCaloPhotonCuts.h:172
 AliCaloPhotonCuts.h:173
 AliCaloPhotonCuts.h:174
 AliCaloPhotonCuts.h:175
 AliCaloPhotonCuts.h:176
 AliCaloPhotonCuts.h:177
 AliCaloPhotonCuts.h:178
 AliCaloPhotonCuts.h:179
 AliCaloPhotonCuts.h:180
 AliCaloPhotonCuts.h:181
 AliCaloPhotonCuts.h:182
 AliCaloPhotonCuts.h:183
 AliCaloPhotonCuts.h:184
 AliCaloPhotonCuts.h:185
 AliCaloPhotonCuts.h:186
 AliCaloPhotonCuts.h:187
 AliCaloPhotonCuts.h:188
 AliCaloPhotonCuts.h:189
 AliCaloPhotonCuts.h:190
 AliCaloPhotonCuts.h:191
 AliCaloPhotonCuts.h:192
 AliCaloPhotonCuts.h:193
 AliCaloPhotonCuts.h:194
 AliCaloPhotonCuts.h:195
 AliCaloPhotonCuts.h:196
 AliCaloPhotonCuts.h:197
 AliCaloPhotonCuts.h:198
 AliCaloPhotonCuts.h:199
 AliCaloPhotonCuts.h:200
 AliCaloPhotonCuts.h:201
 AliCaloPhotonCuts.h:202
 AliCaloPhotonCuts.h:203
 AliCaloPhotonCuts.h:204
 AliCaloPhotonCuts.h:205
 AliCaloPhotonCuts.h:206
 AliCaloPhotonCuts.h:207
 AliCaloPhotonCuts.h:208
 AliCaloPhotonCuts.h:209
 AliCaloPhotonCuts.h:210
 AliCaloPhotonCuts.h:211
 AliCaloPhotonCuts.h:212
 AliCaloPhotonCuts.h:213
 AliCaloPhotonCuts.h:214
 AliCaloPhotonCuts.h:215
 AliCaloPhotonCuts.h:216
 AliCaloPhotonCuts.h:217
 AliCaloPhotonCuts.h:218
 AliCaloPhotonCuts.h:219
 AliCaloPhotonCuts.h:220
 AliCaloPhotonCuts.h:221
 AliCaloPhotonCuts.h:222
 AliCaloPhotonCuts.h:223
 AliCaloPhotonCuts.h:224
 AliCaloPhotonCuts.h:225
 AliCaloPhotonCuts.h:226
 AliCaloPhotonCuts.h:227
 AliCaloPhotonCuts.h:228