ROOT logo
#ifndef ALICONVEVENTCUTS_H
#define ALICONVEVENTCUTS_H

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

#include "AliAODTrack.h"
#include "AliESDtrack.h"
#include "AliVEvent.h"
#include "AliMCEvent.h"
#include "AliVTrack.h"
#include "AliStack.h"
#include "AliAnalysisCuts.h"
#include "TH1F.h"
#include "TF1.h"
#include "AliAnalysisUtils.h"
#include "AliAnalysisManager.h"
#include "TRandom3.h"
#include "AliVCaloTrigger.h"
#include "AliEmcalTriggerPatchInfo.h"

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

using namespace std;

class AliConvEventCuts : public AliAnalysisCuts {
		
	public: 
		enum cutIds {
			kisHeavyIon,                  
			kCentralityMin,               
			kCentralityMax,               
			kSelectSpecialTriggerAlias,                 
			kSelectSubTriggerClass,             
			kremovePileUp,                
			kExtraSignals, 
			kNCuts
		};

		enum TriggerTypeEMCAL {
			kND       = -1,  //not defined
			kJ1       = 1,
			kJ2       = 2,
			kG1		  = 3,
			kG2 	  = 4,
			kL0		  = 5,
		};

		AliConvEventCuts(const char *name="EventCuts", const char * title="Event Cuts");
		AliConvEventCuts(const AliConvEventCuts&);
		AliConvEventCuts& operator=(const AliConvEventCuts&);

		virtual ~AliConvEventCuts();                            //virtual destructor

// 		static AliConvEventCuts * GetStandardCuts2010PbPb();
// 		static AliConvEventCuts * GetStandardCuts2010pp();

		Int_t 		fCuts[kNCuts];
		Bool_t 		UpdateCutString();
		static const char * fgkCutNames[kNCuts];

		// Seters
		Bool_t 		SetCutIds (TString cutString); 
		Bool_t 		SetCut (cutIds cutID, Int_t cut);
		Bool_t 		SetIsHeavyIon (Int_t isHeavyIon);
		Bool_t 		SetCentralityMax (Int_t centralityBin);
		Bool_t 		SetCentralityMin (Int_t centralityBin);
		Bool_t 		SetRemovePileUp (Int_t removePileUp);  
		Bool_t 		SetMultiplicityMethod (Int_t multiplicityMethod);
		Bool_t 		SetSelectSpecialTrigger (Int_t selectSpecialTrigger);
		Bool_t 		SetSelectSubTriggerClass (Int_t selectSpecialSubTriggerClass);
		Bool_t 		SetRejectExtraSignalsCut (Int_t extraSignal);
		void 		SetV0ReaderName (TString name) 						{ fV0ReaderName = name									; }
		void 		SetAddedSignalPDGCode (Int_t addedSignalPDGcode) 	{ fAddedSignalPDGCode = addedSignalPDGcode				; }
		void 		SetPreSelectionCutFlag (Bool_t preSelFlag)			{ fPreSelCut = preSelFlag								; }   
		void		SetCaloTriggerPatchInfoName(const char *n)			{ fCaloTriggerPatchInfoName = n							; }
		void		SetCaloTriggersName(const char *n)					{ fCaloTriggersName  = n								; }
		void 		SetAcceptedHeader(TList *HeaderList)				{ fHeaderList = HeaderList								; }   
		void 		SetFillCutHistograms( TString name="",
										  Bool_t preCut = kTRUE)		{ if(!fHistograms){ InitCutHistograms(name,preCut);} 	; }
		void 		SetEtaShift(Double_t etaShift) 						{ fEtaShift = etaShift									; } // Eta shift Setting
		void 		SetEtaShift(TString pPbOrPbp) 						{ Double_t etaShift = 0.0								;
																		  if(!pPbOrPbp.CompareTo("pPb"))      etaShift = -0.465 ;
																		  else if(!pPbOrPbp.CompareTo("Pbp")) etaShift =  0.465 ;
																		  fEtaShift = etaShift									; }
		void 		SetUseReweightingWithHistogramFromFile( Bool_t pi0reweight=kTRUE, 
															Bool_t etareweight=kFALSE, 
															Bool_t k0sreweight=kFALSE, 
															TString path="$ALICE_ROOT/PWGGA/GammaConv/MCSpectraInput.root", 
															TString histoNamePi0 = "", 
															TString histoNameEta = "", 
															TString histoNameK0s = "",
															TString fitNamePi0 = "", 
															TString fitNameEta = "", 
															TString fitNameK0s ="" ) 
																		{
																		  AliInfo(Form("enabled reweighting for: pi0 : %i, eta: %i, K0s: %i",pi0reweight, etareweight, k0sreweight));
																		  fDoReweightHistoMCPi0 = pi0reweight					; 
																		  fDoReweightHistoMCEta = etareweight					; 
																		  fDoReweightHistoMCK0s = k0sreweight					; 
																		  fPathTrFReweighting=path								;
																		  fNameHistoReweightingPi0 =histoNamePi0				;
																		  fNameHistoReweightingEta =histoNameEta				;
																		  fNameHistoReweightingK0s =histoNameK0s				; 
																		  fNameFitDataPi0 =fitNamePi0							;
																		  fNameFitDataEta =fitNameEta							;
																		  fNameFitDataK0s =fitNameK0s							; }
		
		// Geters
		TString 	GetCutNumber();
		TString* 	GetFoundHeader()									{ return fGeneratorNames								; }
		Int_t 		GetEventQuality()									{ return fEventQuality;									; }
		Bool_t 		GetIsFromPileup()									{ return fRemovePileUp;									  }
		void 		GetCentralityRange(Double_t range[2])				{ range[0]=10*fCentralityMin							;
																		  range[1]=10*fCentralityMax							; }
		TList*		GetCutHistograms()									{ return fHistograms									; }
		Int_t 		GetMultiplicityMethod()								{ return fMultiplicityMethod							; }
		Int_t 		GetSignalRejection()								{ return fRejectExtraSignals							; }
		Int_t 		GetNAcceptedHeaders()								{ return fnHeaders										; }
		TString * 	GetAcceptedHeaderNames()							{ return fGeneratorNames								; }
		Int_t * 	GetAcceptedHeaderStart()							{ return fNotRejectedStart								; }
		Int_t * 	GetAcceptedHeaderEnd()								{ return fNotRejectedEnd								; }
		TList* 		GetAcceptedHeader()									{ return fHeaderList									; }
		Int_t 		GetNumberOfContributorsVtx(AliVEvent *event);
		Double_t 	GetEtaShift() 										{ return fEtaShift										; }
		Bool_t	 	GetDoEtaShift()										{ return fDoEtaShift									; }
		TString 	GetSpecialTriggerName()								{ return fSpecialTriggerName							; }
		AliEmcalTriggerPatchInfo   *GetMainTriggerPatch();
		ULong_t 	GetTriggerList();
		Float_t 	GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent = 0x0);
		Double_t 	GetCentrality(AliVEvent *event);
		void 		GetCorrectEtaShiftFromPeriod(TString periodName);
		void 		GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent); 
		TClonesArray* 	GetArrayFromEvent(AliVEvent* fInputEvent, const char *name, const char *clname=0);
		
		Bool_t 		InitializeCutsFromCutString(const TString analysisCutSelection);
		void 		SelectCollisionCandidates(UInt_t offlineTriggerMask = AliVEvent::kAny) {
			fOfflineTriggerMask = offlineTriggerMask;
			fTriggerSelectedManually = kTRUE;
		}
		void 		SelectSpecialTrigger(UInt_t offlineTriggerMask = AliVEvent::kAny, 
										 TString TriggerClassName = "AliVEvent::kAny" ) {
			fOfflineTriggerMask = offlineTriggerMask;
			fSpecialTriggerName = TriggerClassName;
			cout << fSpecialTriggerName.Data() << endl;
			
		}   

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

		
		// Cut Selection
		Bool_t 		EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent);
		Int_t 		IsEventAcceptedByCut(AliConvEventCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon, Bool_t isEMCALAnalysis);
			
		void 		PrintCuts();
		void 		PrintCutsWithValues();
		void 		InitCutHistograms(TString name="",Bool_t preCut = kTRUE);
		
		///Cut functions
		Int_t 		IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent = 0x0);
		
		void 		LoadReweightingHistosMCFromFile ();

		// Event Cuts
		Bool_t 		IsCentralitySelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent = NULL);
		Bool_t 		VertexZCut(AliVEvent *fInputEvent);
		Bool_t 		IsTriggerSelected(AliVEvent *fInputEvent, Bool_t isMC);
		Bool_t 		HasV0AND()												{ return fHasV0AND										; }
		Bool_t		IsSDDFired()											{ return fIsSDDFired									; }
		Int_t 		IsSpecialTrigger()										{ return fSpecialTrigger								; }
		Int_t 		IsSpecialSubTrigger()									{ return fSpecialSubTrigger								; }	
		void 		InitializeEMCALTrigger( AliVEvent *fInputEvent);
		Bool_t 		HasTriggerType(TriggerTypeEMCAL t);
		
		// Request Flags
		Int_t 		IsHeavyIon()											{ return fIsHeavyIon									; }
		void 		DoEtaShift(Bool_t doEtaShift)							{ fDoEtaShift = doEtaShift								; }
		
		
	protected:
		TList 						*fHistograms;
		TList 						*fHeaderList;

		Int_t 						fEventQuality; 							// EventQuality
		//cuts
		Int_t 						fIsHeavyIon;							// flag for heavy ion
		Int_t 						fDetectorCentrality;					// centrality detecotor V0M or CL1
		Int_t 						fModCentralityClass;					// allows to select smaller centrality classes
		Double_t 					fMaxVertexZ;							// max z offset of vertex
		Int_t 						fCentralityMin;							// centrality selection lower bin value
		Int_t 						fCentralityMax;							// centrality selection upper bin value
		Int_t 						fMultiplicityMethod;					// selected multiplicity method
		Int_t 						fSpecialTrigger;						// flag
		Int_t 						fSpecialSubTrigger;						// flag
		Bool_t 						fRemovePileUp;							// flag
		Int_t 						fRejectExtraSignals;					//
		UInt_t 						fOfflineTriggerMask;   					// Task processes collision candidates only
		Bool_t 						fHasV0AND; 								// V0AND Offline Trigger
		Bool_t 						fIsSDDFired; 							// SDD FIRED to select with SDD events
		TRandom3				 	fRandom; 								//
		Int_t 						fnHeaders; 								// Number of Headers
		Int_t 						*fNotRejectedStart; 					//[fnHeaders]
		Int_t 						*fNotRejectedEnd; 						//[fnHeaders]
		TString 					*fGeneratorNames; 						//[fnHeaders]
		TObjString 					*fCutString; 							// cut number used for analysis
		AliAnalysisUtils		 	*fUtils;
		Double_t					fEtaShift;
		Bool_t 						fDoEtaShift;							// Flag for Etashift
		Bool_t 						fDoReweightHistoMCPi0; 					// Flag for reweighting Pi0 input with histogram
		Bool_t						fDoReweightHistoMCEta;					// Flag for reweighting Eta input with histogram
		Bool_t 						fDoReweightHistoMCK0s;					// Flag for reweighting K0s input with histogram
		TString 					fPathTrFReweighting;					// Path for file used in reweighting
		TString 					fNameHistoReweightingPi0;				// Histogram name for reweighting Pi0
		TString 					fNameHistoReweightingEta;				// Histogram name for reweighting Eta
		TString 					fNameHistoReweightingK0s;				// Histogram name for reweighting K0s
		TString 					fNameFitDataPi0;						// Fit name for fit to spectrum of pi0s in Data
		TString 					fNameFitDataEta;						// Fit name for fit to spectrum of etas in Data
		TString 					fNameFitDataK0s;						// Fit name for fit to spectrum of k0s in Data
		// Histograms
		TH1F 						*fHistoEventCuts;						// bookkeeping for event selection cuts
		TH1F 						*hCentrality;							// centrality distribution for selected events
		TH2F 						*hCentralityVsNumberOfPrimaryTracks;	// centrality distribution for selected events
		TH1F 						*hVertexZ; 								// vertex z distribution for selected events
		TH1F 						*hTriggerClass; 						// fired offline trigger class
		TH1F 						*hTriggerClassSelected;					// selected fired offline trigger class
		TH1D 						*hReweightMCHistPi0;					// histogram input for reweighting Pi0
		TH1D 						*hReweightMCHistEta; 					// histogram input for reweighting Eta
		TH1D 						*hReweightMCHistK0s; 					// histogram input for reweighting K0s
		TF1  						*fFitDataPi0;							// fit to pi0 spectrum in Data
		TF1  						*fFitDataEta;							// fit to eta spectrum in Data
		TF1 						*fFitDataK0s;							// fit to K0s spectrum in Data
		Int_t 						fAddedSignalPDGCode;
		Bool_t 						fPreSelCut; 							// Flag for preselection cut used in V0Reader
		Bool_t 						fTriggerSelectedManually; 				// Flag for manual trigger selection
		TString 					fSpecialTriggerName; 					// Name of the Special Triggers
		TString 					fSpecialSubTriggerName; 				// Name of the Special Triggers
		Int_t 						fNSpecialSubTriggerOptions;
		// trigger information
		TString 					fV0ReaderName;							// Name of V0Reader
		AliVCaloTrigger				*fCaloTriggers;							//! calo triggers
		TClonesArray				*fTriggerPatchInfo;						//! trigger patch info array
		AliEmcalTriggerPatchInfo 	*fMainTriggerPatchEMCAL;				// main trigger patch, will be cached after first call
		TString						fCaloTriggersName;           			// name of calo triggers collection
		TString						fCaloTriggerPatchInfoName;   			// trigger patch info array name
		ULong_t						fTriggersEMCAL;							// list of fired EMCAL triggers
		ULong_t						fTriggersEMCALSelected;					// list of accepted triggers
		Bool_t						fEMCALTrigInitialized;					// EMCAL triggers initialized
		
	private:

		ClassDef(AliConvEventCuts,3)
};


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