ROOT logo
#ifndef ALIV0READERV1_H
#define ALIV0READERV1_H

#include "AliAnalysisTaskSE.h"
#include "AliAODv0.h"
#include "AliESDv0.h"
#include "AliConversionPhotonCuts.h"
#include "AliConvEventCuts.h"
#include "AliExternalTrackParam.h"
#include "TObject.h"
#include "AliMCEvent.h"   // for CF
#include "AliESDEvent.h"
#include "AliKFParticle.h"
#include "TParticle.h"
#include <vector>
#include "AliESDpid.h"
#include "TF1.h"
#include "TRandom3.h"
#include "AliAnalysisManager.h"

class AliConversionPhotonBase;
class TRandom3;
class AliStack;
class TList;
class AliKFConversionPhoton;
class TString;
class TClonesArray;
class TH1F;
class TH2F;
class AliAODConversionPhoton;

using namespace std;

class AliV0ReaderV1 : public AliAnalysisTaskSE {

	public:

		AliV0ReaderV1(const char *name="V0ReaderV1");
		virtual ~AliV0ReaderV1();                            //virtual destructor
		void UserCreateOutputObjects();
		virtual Bool_t Notify();
		virtual void UserExec(Option_t *option);
		virtual void Terminate(Option_t *);
		virtual void Init();

		Bool_t ProcessEvent(AliVEvent *inputEvent,AliMCEvent *mcEvent=NULL);
		Bool_t IsEventSelected(){return fEventIsSelected;}

		// Return Reconstructed Gammas
		TClonesArray *GetReconstructedGammas(){return fConversionGammas;}
		Int_t GetNReconstructedGammas(){if(fConversionGammas){return fConversionGammas->GetEntriesFast();}else{return 0;}}
		
		AliConversionPhotonCuts *GetConversionCuts(){return fConversionCuts;}
		AliConvEventCuts *GetEventCuts(){return fEventCuts;}
		TList *GetCutHistograms(){if(fConversionCuts){return fConversionCuts->GetCutHistograms();}return NULL;}
		TList *GetEventCutHistograms(){if(fEventCuts){return fEventCuts->GetCutHistograms();}return NULL;}
		// Set Options

		void CountTracks();
		void SetConversionCuts(const TString cut);
		void SetConversionCuts(AliConversionPhotonCuts *cuts){fConversionCuts=cuts;}
		void SetEventCuts(const TString cut);
		void SetEventCuts(AliConvEventCuts *cuts){fEventCuts=cuts;}

		void SetUseOwnXYZCalculation(Bool_t flag){fUseOwnXYZCalculation=flag;}
		void SetUseConstructGamma(Bool_t flag){fUseConstructGamma=flag;}
		void SetUseAODConversionPhoton(Bool_t b){if(b){cout<<"Setting Outputformat to AliAODConversionPhoton "<<endl;}else{cout<<"Setting Outputformat to AliKFConversionPhoton "<<endl;};kUseAODConversionPhoton=b;}
		void SetCreateAODs(Bool_t k=kTRUE){fCreateAOD=k;}
		void SetDeltaAODFilename(TString s){fDeltaAODFilename=s;}
		void SetDeltaAODBranchName(TString string) { fDeltaAODBranchName = string;AliInfo(Form("Set DeltaAOD BranchName to: %s",fDeltaAODBranchName.Data()));}
		void RelabelAODs(Bool_t relabel=kTRUE){fRelabelAODs=relabel;}
		Bool_t AreAODsRelabeled(){return fRelabelAODs;}
		void RelabelAODPhotonCandidates(AliAODConversionPhoton *PhotonCandidate);
		TString GetPeriodName(){return fPeriodName;}
		Int_t GetNumberOfPrimaryTracks(){return fNumberOfPrimaryTracks;}
	
	protected:
		// Reconstruct Gammas
		Bool_t ProcessESDV0s();
		AliKFConversionPhoton *ReconstructV0(AliESDv0* fCurrentV0,Int_t currentV0Index);
		void FillAODOutput();
		void FindDeltaAODBranchName();
		Bool_t GetAODConversionGammas();

		// Getter Functions

		const AliExternalTrackParam *GetExternalTrackParam(AliESDv0 *fCurrentV0,Int_t &tracklabel,Int_t charge);
		const AliExternalTrackParam *GetExternalTrackParamP(AliESDv0 *fCurrentV0,Int_t &tracklabel){return GetExternalTrackParam(fCurrentV0,tracklabel,1);};
		const AliExternalTrackParam *GetExternalTrackParamN(AliESDv0 *fCurrentV0,Int_t &tracklabel){return GetExternalTrackParam(fCurrentV0,tracklabel,-1);};
		AliKFParticle *GetPositiveKFParticle(AliAODv0 *fCurrentV0,Int_t fTrackLabel[2]);
		AliKFParticle *GetNegativeKFParticle(AliAODv0 *fCurrentV0,Int_t fTrackLabel[2]);
		AliKFParticle *GetPositiveKFParticle(AliESDv0 *fCurrentV0,Int_t fTrackLabel[2]);
		AliKFParticle *GetNegativeKFParticle(AliESDv0 *fCurrentV0,Int_t fTrackLabel[2]);

		Bool_t GetConversionPoint(const AliExternalTrackParam *pparam,const AliExternalTrackParam *nparam,Double_t convpos[3],Double_t dca[2]);
		Bool_t GetHelixCenter(const AliExternalTrackParam *track,Double_t center[2]);
		Double_t GetPsiPair(const AliESDv0* v0, const AliExternalTrackParam *positiveparam,const AliExternalTrackParam *negativeparam) const;

		AliConversionPhotonCuts	*fConversionCuts; 			// Pointer to the ConversionCut Selection
		AliConvEventCuts 	*fEventCuts; 				// Pointer to the ConversionCut Selection
		TClonesArray 		*fConversionGammas; 		// TClonesArray holding the reconstructed photons
		Bool_t 				fUseImprovedVertex; 		// set flag to improve primary vertex estimation by adding photons
		Bool_t 				fUseOwnXYZCalculation; 		//flag that determines if we use our own calculation of xyz (markus)
		Bool_t 				fUseConstructGamma; 		//flag that determines if we use ConstructGamma method from AliKF
		Bool_t 				kUseAODConversionPhoton; 	// set flag to use AOD instead of KF output format for photons
		Bool_t 				fCreateAOD; 				// set flag for AOD creation
		TString     		fDeltaAODBranchName;		// File where Gamma Conv AOD is located, if not in default AOD
		TString 			fDeltaAODFilename; 			// set filename for delta/satellite aod
		Bool_t 				fRelabelAODs; 				//
		Bool_t 				fEventIsSelected;
		Int_t 				fNumberOfPrimaryTracks;	 	// Number of Primary Tracks in AOD or ESD
		TString 			fPeriodName;
		
	private:
		AliV0ReaderV1(AliV0ReaderV1 &original);
		AliV0ReaderV1 &operator=(const AliV0ReaderV1 &ref);


    ClassDef(AliV0ReaderV1, 4)
};

inline void AliV0ReaderV1::SetConversionCuts(const TString cut){
    if(fConversionCuts != NULL){
	delete fConversionCuts;
		fConversionCuts=NULL;
    }
    if(fConversionCuts == NULL){
		fConversionCuts=new AliConversionPhotonCuts("V0ReaderCuts","V0ReaderCuts");
		fConversionCuts->InitializeCutsFromCutString(cut.Data());
    }
}

inline void AliV0ReaderV1::SetEventCuts(const TString cut){
    if(fEventCuts != NULL){
	delete fEventCuts;
		fEventCuts=NULL;
    }
    if(fEventCuts == NULL){
		fEventCuts=new AliConvEventCuts("V0ReaderEventCuts","V0ReaderEventCuts");
		fEventCuts->InitializeCutsFromCutString(cut.Data());
    }
}

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