]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGGA/GammaConv/AliConversionCuts.cxx
unfolding stability and stylistic changes, as well as first git commit on non-compile...
[u/mrichter/AliRoot.git] / PWGGA / GammaConv / AliConversionCuts.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Authors: Svein Lindal, Daniel Lohner                                   *
5  * Version 1.0                                                            *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
21 ////////////////////////////////////////////////
22
23 #include "AliConversionCuts.h"
24
25 #include "AliKFVertex.h"
26 #include "AliAODTrack.h"
27 #include "AliESDtrack.h"
28 #include "AliAnalysisManager.h"
29 #include "AliInputEventHandler.h"
30 #include "AliMCEventHandler.h"
31 #include "AliAODHandler.h"
32 #include "AliPIDResponse.h"
33 #include "TH1.h"
34 #include "TH2.h"
35 #include "TF1.h"
36 #include "AliStack.h"
37 #include "AliAODConversionMother.h"
38 #include "TObjString.h"
39 #include "AliAODEvent.h"
40 #include "AliESDEvent.h"
41 #include "AliCentrality.h"
42 #include "TList.h"
43 #include "TFile.h"
44 #include "AliLog.h"
45 #include "AliGenCocktailEventHeader.h"
46 #include "AliGenDPMjetEventHeader.h"
47 #include "AliGenPythiaEventHeader.h"
48 #include "AliGenHijingEventHeader.h"
49 #include "AliTriggerAnalysis.h"
50 #include "AliV0ReaderV1.h"
51 #include "AliAODMCParticle.h"
52 #include "AliAODMCHeader.h"
53
54 class iostream;
55
56 using namespace std;
57
58 ClassImp(AliConversionCuts)
59
60
61 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
62    "HeavyIon",//0
63    "CentralityMin",//1
64    "CentralityMax",//2
65    "SelectV0AND",//3
66    "MultiplicityMethod",//4
67    "RemovePileUp",//5
68    "RejectExtraSignals",//6
69    "V0FinderType",//7
70    "EtaCut",//8
71    "MinRCut",//9
72    "SinglePtCut",//10
73    "ClsTPCCut", //11
74    "ededxSigmaCut",//12
75    "pidedxSigmaCut",//13
76    "piMomdedxSigmaCut",//14
77    "piMaxMomdedxSigmaCut",//15
78    "LowPRejectionSigmaCut",//16
79    "TOFelectronPID",//17
80    "QtMaxCut",//18
81    "Chi2GammaCut", //19
82    "PsiPair", //20
83    "DoPhotonAsymmetryCut",//21
84    "CosinePointingAngle", //22
85    "SharedElectronCuts", //23
86    "RejectToCloseV0s", //24
87    "DcaRPrimVtx", //25
88    "DcaZPrimVtx" //26
89    "EvetPlane" //27
90 };
91
92
93 //________________________________________________________________________
94 AliConversionCuts::AliConversionCuts(const char *name,const char *title) :
95    AliAnalysisCuts(name,title),
96    fHistograms(NULL),
97    fHeaderList(NULL),
98    fPIDResponse(NULL),
99    fEventQuality(-1),
100    fMaxR(200),
101    fMinR(0),
102    fEtaCut(0.9),
103    fEtaCutMin(-0.1),
104    fPtCut(0.02),
105    fSinglePtCut(0),
106    fMaxZ(1000),
107    fMinClsTPC(0.),
108    fMinClsTPCToF(0.),
109    fLineCutZRSlope(0.),
110    fLineCutZValue(0),
111    fLineCutZRSlopeMin(0.),
112    fLineCutZValueMin(0),
113    fChi2CutConversion(1000),
114    fPIDProbabilityCutNegativeParticle(0),
115    fPIDProbabilityCutPositiveParticle(0),
116    fDodEdxSigmaCut(kTRUE),
117    fDoTOFsigmaCut(kFALSE),
118    fPIDTRDEfficiency(1),
119    fDoTRDPID(kFALSE),
120    fPIDnSigmaAboveElectronLine(100),
121    fPIDnSigmaBelowElectronLine(-100),
122    fTofPIDnSigmaAboveElectronLine(100),
123    fTofPIDnSigmaBelowElectronLine(-100),
124    fPIDnSigmaAbovePionLine(0),
125    fPIDnSigmaAbovePionLineHighPt(-100),
126    fPIDMinPnSigmaAbovePionLine(0),
127    fPIDMaxPnSigmaAbovePionLine(0),
128    fDoKaonRejectionLowP(kFALSE),
129    fDoProtonRejectionLowP(kFALSE),
130    fDoPionRejectionLowP(kFALSE),
131    fPIDnSigmaAtLowPAroundKaonLine(0),
132    fPIDnSigmaAtLowPAroundProtonLine(0),
133    fPIDnSigmaAtLowPAroundPionLine(0),
134    fPIDMinPKaonRejectionLowP(1.5),
135    fPIDMinPProtonRejectionLowP(2),
136    fPIDMinPPionRejectionLowP(0),
137    fDoQtGammaSelection(kTRUE),
138    fDoHighPtQtGammaSelection(kFALSE),
139    fQtMax(100),
140    fHighPtQtMax(0.),
141    fPtBorderForQt(0),
142    fXVertexCut(0.),
143    fYVertexCut(0.),
144    fZVertexCut(0.),
145    fNSigmaMass(0.),
146    fUseEtaMinCut(kFALSE),
147    fUseOnFlyV0Finder(kTRUE),
148    fDoPhotonAsymmetryCut(kTRUE),
149    fMinPPhotonAsymmetryCut(100.),
150    fMinPhotonAsymmetry(0.),
151    fIsHeavyIon(0),
152    fDetectorCentrality(0),
153    fModCentralityClass(0),
154    fMaxVertexZ(10),
155    fCentralityMin(0),
156    fCentralityMax(0),
157    fUseCorrectedTPCClsInfo(kFALSE),
158    fUseTOFpid(kFALSE),
159    fMultiplicityMethod(0),
160    fSpecialTrigger(0),
161    fRemovePileUp(kFALSE),
162    fOpeningAngle(0.005),
163    fPsiPairCut(10000),
164    fPsiPairDeltaPhiCut(10000),
165    fDo2DPsiPair(kFALSE),
166    fCosPAngleCut(10000),
167    fDoToCloseV0sCut(kFALSE),
168    fRejectExtraSignals(0),
169    fminV0Dist(200.),
170    fDoSharedElecCut(kFALSE),
171    fOfflineTriggerMask(0),
172    fHasV0AND(kTRUE),
173    fIsSDDFired(kTRUE),
174    fRandom(0),
175    fElectronArraySize(500),
176    fElectronLabelArray(NULL),
177    fDCAZPrimVtxCut(1000),
178    fDCARPrimVtxCut(1000),
179    fInPlaneOutOfPlane(0),
180    fConversionPointXArray(0.0),
181    fConversionPointYArray(0.0),
182    fConversionPointZArray(0.0),
183    fnHeaders(0),
184    fNotRejectedStart(NULL),
185    fNotRejectedEnd(NULL),
186    fGeneratorNames(NULL),
187    fCutString(NULL),
188    fUtils(NULL),
189    fEtaShift(0.0),
190    fDoEtaShift(kFALSE),
191    fDoReweightHistoMCPi0(kFALSE),
192    fDoReweightHistoMCEta(kFALSE),
193    fDoReweightHistoMCK0s(kFALSE),
194    fPathTrFReweighting(""),
195    fNameHistoReweightingPi0(""),
196    fNameHistoReweightingEta(""),
197    fNameHistoReweightingK0s(""),
198    fNameFitDataPi0(""),
199    fNameFitDataEta(""),
200    fNameFitDataK0s(""),
201    hdEdxCuts(NULL),
202    hTPCdEdxbefore(NULL),
203    hTPCdEdxafter(NULL),
204    hTPCdEdxSigbefore(NULL),
205    hTPCdEdxSigafter(NULL),
206    hTOFbefore(NULL),
207    hTOFSigbefore(NULL),
208    hTOFSigafter(NULL),
209    hPsiPairDeltaPhiafter(NULL),
210    hTrackCuts(NULL),
211    hPhotonCuts(NULL),
212    hInvMassbefore(NULL),
213    hArmenterosbefore(NULL),
214    hInvMassafter(NULL),
215    hArmenterosafter(NULL),
216    hAcceptanceCuts(NULL),
217    hCutIndex(NULL),
218    hV0EventCuts(NULL),
219    hCentrality(NULL),
220    hCentralityVsNumberOfPrimaryTracks(NULL),
221    hVertexZ(NULL),
222    hEventPlanePhi(NULL),
223    hTriggerClass(NULL),
224    hTriggerClassSelected(NULL),
225    hReweightMCHistPi0(NULL),
226    hReweightMCHistEta(NULL),
227    hReweightMCHistK0s(NULL),
228    fFitDataPi0(NULL),
229    fFitDataEta(NULL),
230    fFitDataK0s(NULL),
231    fPreSelCut(kFALSE),
232    fTriggerSelectedManually(kFALSE),
233    fSpecialTriggerName("")
234
235 {
236    InitPIDResponse();
237    for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
238    fCutString=new TObjString((GetCutNumber()).Data());
239
240    fElectronLabelArray = new Int_t[fElectronArraySize];
241    fUtils = new AliAnalysisUtils();
242    //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
243    //fUtils->SetCutOnZVertexSPD(kFALSE);
244
245
246 }
247
248 //________________________________________________________________________
249 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
250    AliAnalysisCuts(ref),
251    fHistograms(NULL),
252    fHeaderList(ref.fHeaderList),
253    fPIDResponse(NULL),
254    fEventQuality(ref.fEventQuality),
255    fMaxR(ref.fMaxR),
256    fMinR(ref.fMinR),
257    fEtaCut(ref.fEtaCut),
258    fEtaCutMin(ref.fEtaCutMin),
259    fPtCut(ref.fPtCut),
260    fSinglePtCut(ref.fSinglePtCut),
261    fMaxZ(ref.fMaxZ),
262    fMinClsTPC(ref.fMinClsTPC),
263    fMinClsTPCToF(ref.fMinClsTPCToF),
264    fLineCutZRSlope(ref.fLineCutZRSlope),
265    fLineCutZValue(ref.fLineCutZValue),
266    fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
267    fLineCutZValueMin(ref.fLineCutZValueMin),
268    fChi2CutConversion(ref.fChi2CutConversion),
269    fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
270    fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
271    fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
272    fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
273    fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
274    fDoTRDPID(ref.fDoTRDPID),
275    fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
276    fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
277    fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
278    fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
279    fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
280    fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
281    fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
282    fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
283    fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
284    fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
285    fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
286    fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
287    fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
288    fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
289    fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
290    fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
291    fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
292    fDoQtGammaSelection(ref.fDoQtGammaSelection),
293    fDoHighPtQtGammaSelection(ref.fDoHighPtQtGammaSelection),
294    fQtMax(ref.fQtMax),
295    fHighPtQtMax(ref.fHighPtQtMax),
296    fPtBorderForQt(ref.fPtBorderForQt),
297    fXVertexCut(ref.fXVertexCut),
298    fYVertexCut(ref.fYVertexCut),
299    fZVertexCut(ref.fZVertexCut),
300    fNSigmaMass(ref.fNSigmaMass),
301    fUseEtaMinCut(ref.fUseEtaMinCut),
302    fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
303    fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
304    fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
305    fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
306    fIsHeavyIon(ref.fIsHeavyIon),
307    fDetectorCentrality(ref.fDetectorCentrality),
308    fModCentralityClass(ref.fModCentralityClass),
309    fMaxVertexZ(ref.fMaxVertexZ),
310    fCentralityMin(ref.fCentralityMin),
311    fCentralityMax(ref.fCentralityMax),
312    fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
313    fUseTOFpid(ref.fUseTOFpid),
314    fMultiplicityMethod(ref.fMultiplicityMethod),
315    fSpecialTrigger(ref.fSpecialTrigger),
316    fRemovePileUp(ref.fRemovePileUp),
317    fOpeningAngle(ref.fOpeningAngle),
318    fPsiPairCut(ref.fPsiPairCut),
319    fPsiPairDeltaPhiCut(ref.fPsiPairDeltaPhiCut),
320    fDo2DPsiPair(ref.fDo2DPsiPair),
321    fCosPAngleCut(ref.fCosPAngleCut),
322    fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
323    fRejectExtraSignals(ref.fRejectExtraSignals),
324    fminV0Dist(ref.fminV0Dist),
325    fDoSharedElecCut(ref.fDoSharedElecCut),
326    fOfflineTriggerMask(ref.fOfflineTriggerMask),
327    fHasV0AND(ref.fHasV0AND),
328    fIsSDDFired(ref.fIsSDDFired),
329    fRandom(ref.fRandom),
330    fElectronArraySize(ref.fElectronArraySize),
331    fElectronLabelArray(NULL),
332    fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
333    fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
334    fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
335    fConversionPointXArray(ref.fConversionPointXArray),
336    fConversionPointYArray(ref.fConversionPointYArray),
337    fConversionPointZArray(ref.fConversionPointZArray),
338    fnHeaders(ref.fnHeaders),
339    fNotRejectedStart(NULL),
340    fNotRejectedEnd(NULL),
341    fGeneratorNames(ref.fGeneratorNames),
342    fCutString(NULL),
343    fUtils(NULL),
344    fEtaShift(ref.fEtaShift),
345    fDoEtaShift(ref.fDoEtaShift),
346    fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
347    fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
348    fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
349    fPathTrFReweighting(ref.fPathTrFReweighting),
350    fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
351    fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
352    fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
353    fNameFitDataPi0(ref.fNameFitDataPi0),
354    fNameFitDataEta(ref.fNameFitDataEta),
355    fNameFitDataK0s(ref.fNameFitDataK0s),
356    hdEdxCuts(NULL),
357    hTPCdEdxbefore(NULL),
358    hTPCdEdxafter(NULL),
359    hTPCdEdxSigbefore(NULL),
360    hTPCdEdxSigafter(NULL),
361    hTOFbefore(NULL),
362    hTOFSigbefore(NULL),
363    hTOFSigafter(NULL),
364    hPsiPairDeltaPhiafter(NULL),
365    hTrackCuts(NULL),
366    hPhotonCuts(NULL),
367    hInvMassbefore(NULL),
368    hArmenterosbefore(NULL),
369    hInvMassafter(NULL),
370    hArmenterosafter(NULL),
371    hAcceptanceCuts(NULL),
372    hCutIndex(NULL),
373    hV0EventCuts(NULL),
374    hCentrality(NULL),
375    hCentralityVsNumberOfPrimaryTracks(NULL),
376    hVertexZ(NULL),
377    hEventPlanePhi(NULL),
378    hTriggerClass(NULL),
379    hTriggerClassSelected(NULL),
380    hReweightMCHistPi0(ref.hReweightMCHistPi0),
381    hReweightMCHistEta(ref.hReweightMCHistEta),
382    hReweightMCHistK0s(ref.hReweightMCHistK0s),
383    fFitDataPi0(ref.fFitDataPi0),
384    fFitDataEta(ref.fFitDataEta),
385    fFitDataK0s(ref.fFitDataK0s),
386    fPreSelCut(ref.fPreSelCut),
387    fTriggerSelectedManually(ref.fTriggerSelectedManually),
388    fSpecialTriggerName(ref.fSpecialTriggerName)
389 {
390    // Copy Constructor
391    for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
392    fCutString=new TObjString((GetCutNumber()).Data());
393    fElectronLabelArray = new Int_t[fElectronArraySize];
394    fUtils = new AliAnalysisUtils();
395    // dont copy histograms (if you like histograms, call InitCutHistograms())
396
397 }
398
399
400 //________________________________________________________________________
401 AliConversionCuts::~AliConversionCuts() {
402    // Destructor
403    //Deleting fHistograms leads to seg fault it it's added to output collection of a task
404    // if(fHistograms)
405    //    delete fHistograms;
406    // fHistograms = NULL;
407    if(fCutString != NULL){
408       delete fCutString;
409       fCutString = NULL;
410    }
411    if(fElectronLabelArray){
412       delete fElectronLabelArray;
413       fElectronLabelArray = NULL;
414    }
415    if(fNotRejectedStart){
416       delete[] fNotRejectedStart;
417       fNotRejectedStart = NULL;
418    }
419    if(fNotRejectedEnd){
420       delete[] fNotRejectedEnd;
421       fNotRejectedEnd = NULL;
422    }
423    if(fGeneratorNames){
424       delete[] fGeneratorNames;
425       fGeneratorNames = NULL;
426    }
427    if(fUtils){
428      delete fUtils;
429      fUtils = NULL;
430    }
431
432 }
433
434 //________________________________________________________________________
435 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
436
437    // Initialize Cut Histograms for QA (only initialized and filled if function is called)
438    TH1::AddDirectory(kFALSE);
439
440    if(fHistograms != NULL){
441       delete fHistograms;
442       fHistograms=NULL;
443    }
444    if(fHistograms==NULL){
445       fHistograms=new TList();
446       fHistograms->SetOwner(kTRUE);
447       if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
448       else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
449    }
450
451    if (hReweightMCHistPi0){
452       hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
453       fHistograms->Add(hReweightMCHistPi0);
454    }
455    if (hReweightMCHistEta){
456       hReweightMCHistEta->SetName("MCInputForWeightingEta");
457       fHistograms->Add(hReweightMCHistEta);
458    }
459    if (hReweightMCHistK0s){
460       hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
461       fHistograms->Add(hReweightMCHistK0s);
462    }
463 //    if (fFitDataPi0){
464 //       fFitDataPi0->SetName("DataFitForWeightingPi0");
465 //       fHistograms->Add(fFitDataPi0);
466 //    }
467 //    if (fFitDataEta){
468 //       fFitDataEta->SetName("DataFitForWeightingEta");
469 //       fHistograms->Add(fFitDataEta);
470 //    }
471 //    if (fFitDataK0s){
472 //       fFitDataK0s->SetName("DataFitForWeightingK0s");
473 //       fHistograms->Add(fFitDataK0s);
474 //    }
475    // IsPhotonSelected
476    hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
477    hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
478    hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
479    hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
480    hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
481    hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
482    hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
483    hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
484    hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
485    hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
486    fHistograms->Add(hCutIndex);
487
488    // Track Cuts
489    hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
490    hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
491    hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
492    hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
493    hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
494    hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
495    hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
496    hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
497    hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
498    fHistograms->Add(hTrackCuts);
499
500    // Photon Cuts
501    hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",14,-0.5,13.5);
502    hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
503    hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
504    hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
505    hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
506    hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
507    hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
508    hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
509    hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
510    hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
511    hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
512    hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
513    hPhotonCuts->GetXaxis()->SetBinLabel(12,"out");
514    fHistograms->Add(hPhotonCuts);
515
516    if(preCut){
517       hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
518       fHistograms->Add(hInvMassbefore);
519       hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
520       fHistograms->Add(hArmenterosbefore);
521    }
522    hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
523    fHistograms->Add(hInvMassafter);
524    hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
525    fHistograms->Add(hArmenterosafter);
526
527    hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
528    hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
529    hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
530    hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
531    hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
532    hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
533    hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
534    hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
535    hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
536    fHistograms->Add(hAcceptanceCuts);
537
538    // dEdx Cuts
539    hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
540    hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
541    hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
542    hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
543    hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
544    hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
545    hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
546    hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
547    hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
548    hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
549    hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
550    fHistograms->Add(hdEdxCuts);
551
552    TAxis *AxisBeforedEdx = NULL;
553    TAxis *AxisBeforedEdxSig = NULL;
554    TAxis *AxisBeforeTOF = NULL;
555    TAxis *AxisBeforeTOFSig = NULL;
556    if(preCut){
557       hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
558       fHistograms->Add(hTPCdEdxbefore);
559       AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
560       hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
561       fHistograms->Add(hTPCdEdxSigbefore);
562       AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
563
564       hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
565       fHistograms->Add(hTOFbefore);
566       AxisBeforeTOF = hTOFbefore->GetXaxis();
567       hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
568       fHistograms->Add(hTOFSigbefore);
569       AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
570
571    }
572    hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
573    fHistograms->Add(hTPCdEdxSigafter);
574
575    hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
576    fHistograms->Add(hTPCdEdxafter);
577
578    hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
579    fHistograms->Add(hTOFSigafter);
580
581    hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
582    fHistograms->Add(hPsiPairDeltaPhiafter);
583
584    TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
585    Int_t bins = AxisAfter->GetNbins();
586    Double_t from = AxisAfter->GetXmin();
587    Double_t to = AxisAfter->GetXmax();
588    Double_t *newBins = new Double_t[bins+1];
589    newBins[0] = from;
590    Double_t factor = TMath::Power(to/from, 1./bins);
591    for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
592    AxisAfter->Set(bins, newBins);
593    AxisAfter = hTOFSigafter->GetXaxis();
594    AxisAfter->Set(bins, newBins);
595    AxisAfter = hTPCdEdxafter->GetXaxis();
596    AxisAfter->Set(bins, newBins);
597    if(preCut){
598       AxisBeforedEdx->Set(bins, newBins);
599       AxisBeforeTOF->Set(bins, newBins);
600       AxisBeforedEdxSig->Set(bins, newBins);
601       AxisBeforeTOFSig->Set(bins, newBins);
602    }
603    delete [] newBins;
604
605    hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",1000,0,100);
606    fHistograms->Add(hCentrality);
607    hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
608    fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
609
610    // Event Cuts and Info
611    if(preCut){
612       hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
613       hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
614       hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
615       hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
616       hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
617       hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
618       hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
619       hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
620       fHistograms->Add(hV0EventCuts);
621
622       hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
623       fHistograms->Add(hVertexZ);
624
625       hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
626       hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
627       hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
628       hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
629       hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
630       hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
631       hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
632       hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
633       hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
634       hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
635       hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
636       hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
637       hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
638       hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
639       hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
640       hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
641       hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
642       hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
643       hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
644       hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
645       hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
646       hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
647       hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
648       hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
649       hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
650       hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
651       hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
652       hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
653       hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
654       hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
655       hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
656       hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
657       hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
658       hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
659       hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
660       hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
661       fHistograms->Add(hTriggerClass);
662    }
663    if(!preCut){
664       hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
665       hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
666       hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
667       hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
668       hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
669       hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
670       hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
671       hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
672       hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
673       hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
674       hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
675       hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
676       hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
677       hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
678       hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
679       hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
680       hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
681       hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
682       hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
683       hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
684       hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
685       hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
686       hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
687       hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
688       hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
689       hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
690       hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
691       hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
692       hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
693       hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
694       hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
695       hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
696       hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
697       hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
698       hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
699       fHistograms->Add(hTriggerClassSelected);
700       
701       hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
702       fHistograms->Add(hEventPlanePhi);
703
704       
705    }
706    TH1::AddDirectory(kTRUE);
707 }
708
709 //________________________________________________________________________
710 Bool_t AliConversionCuts::InitPIDResponse(){
711    // Set Pointer to AliPIDResponse
712
713    AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
714    if(man) {
715       AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
716       fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
717       if(fPIDResponse)return kTRUE;
718
719    }
720
721
722    return kFALSE;
723 }
724 ///________________________________________________________________________
725 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
726    // Process Event Selection
727
728    Int_t cutindex=0;
729    if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
730    cutindex++;
731
732    // Check for MC event
733    if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
734       // Check if MC event is correctly loaded
735       AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
736       if (!mcHandler){
737          fEventQuality = 2;
738          return kFALSE;
739       }
740       if (!mcHandler->InitOk() ){
741          fEventQuality = 2;
742          return kFALSE;
743       }
744       if (!mcHandler->TreeK() ){
745          fEventQuality = 2;
746          return kFALSE;
747       }
748       if (!mcHandler->TreeTR() ) {
749          fEventQuality = 2;
750          return kFALSE;
751       }
752    }
753
754    // Event Trigger
755 //    cout << "before event trigger" << endl;
756    if(!IsTriggerSelected(fInputEvent)){
757       if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
758       fEventQuality = 3;
759       return kFALSE;
760    }
761    cutindex++;
762
763    if(fInputEvent->IsA()==AliESDEvent::Class()){
764       AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
765       fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
766       if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
767    }
768 //   cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
769
770
771    // Number of Contributors Cut
772    if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
773       if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
774       fEventQuality = 5;
775       return kFALSE;
776    }
777    cutindex++;
778
779    // Z Vertex Position Cut
780    if(!VertexZCut(fInputEvent)){
781       if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
782       fEventQuality = 4;
783       return kFALSE;
784    }
785    cutindex++;
786
787    // Pile Up Rejection
788
789    if(fRemovePileUp){
790       if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
791          if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
792          fEventQuality = 6;
793          return kFALSE;
794       }
795    }
796    cutindex++;
797
798    // Centrality Selection
799    if(!IsCentralitySelected(fInputEvent,fMCEvent)){
800       if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
801       fEventQuality = 1;
802       return kFALSE;
803    }
804    cutindex++;
805
806    // Fill Event Histograms
807    if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
808    if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
809    if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
810    if(hCentralityVsNumberOfPrimaryTracks)
811       hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
812                                                ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
813                                                 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
814    fEventQuality = 0;
815    return kTRUE;
816 }
817
818 ///________________________________________________________________________
819 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
820    // MonteCarlo Photon Selection
821
822    if(!fMCStack)return kFALSE;
823
824    if (particle->GetPdgCode() == 22){
825
826
827       if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
828          return kFALSE;
829       if(fEtaCutMin>-0.1){
830          if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
831             return kFALSE;
832       }
833
834       if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
835          return kFALSE; // no photon as mothers!
836       }
837
838       if(particle->GetMother(0) >= fMCStack->GetNprimary()){
839          return kFALSE; // the gamma has a mother, and it is not a primary particle
840       }
841
842       if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
843
844       // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
845       TParticle* ePos = NULL;
846       TParticle* eNeg = NULL;
847
848       if(particle->GetNDaughters() >= 2){
849          for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
850             TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
851             if(tmpDaughter->GetUniqueID() == 5){
852                if(tmpDaughter->GetPdgCode() == 11){
853                   eNeg = tmpDaughter;
854                } else if(tmpDaughter->GetPdgCode() == -11){
855                   ePos = tmpDaughter;
856                }
857             }
858          }
859       }
860
861       if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
862          return kFALSE;
863       }
864
865       if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
866          return kFALSE; // no reconstruction below the Pt cut
867       }
868
869       if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
870           eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
871          return kFALSE;
872
873       if(fEtaCutMin > -0.1){
874          if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
875              (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
876             return kFALSE;
877       }
878
879       if(ePos->R()>fMaxR){
880          return kFALSE; // cuts on distance from collision point
881       }
882
883       if(abs(ePos->Vz()) > fMaxZ){
884          return kFALSE;  // outside material
885       }
886       if(abs(eNeg->Vz()) > fMaxZ){
887          return kFALSE;  // outside material
888       }
889
890       if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
891          return kFALSE;  // line cut to exclude regions where we do not reconstruct
892       } else if ( fEtaCutMin != -0.1 &&   ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
893          return kFALSE;
894       }
895
896       if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
897          return kFALSE; // line cut to exclude regions where we do not reconstruct
898       } else if ( fEtaCutMin != -0.1 &&   eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
899          return kFALSE;
900       }
901
902       return kTRUE;
903       //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
904    }
905    return kFALSE;
906 }
907 ///________________________________________________________________________
908 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
909    // MonteCarlo Photon Selection
910
911    if(!aodmcArray)return kFALSE;
912
913    if (particle->GetPdgCode() == 22){
914       if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
915          return kFALSE;
916       if(fEtaCutMin>-0.1){
917          if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
918             return kFALSE;
919       }
920
921       if(particle->GetMother() > -1){
922          if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
923             return kFALSE; // no photon as mothers!
924          }
925          if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
926             return kFALSE; // the gamma has a mother, and it is not a primary particle
927          }
928       }
929
930       if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
931
932       // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
933       AliAODMCParticle* ePos = NULL;
934       AliAODMCParticle* eNeg = NULL;
935
936       if(particle->GetNDaughters() >= 2){
937          for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
938             AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
939             if(!tmpDaughter) continue;
940             if(((tmpDaughter->GetMCProcessCode())) == 5){    // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
941                if(tmpDaughter->GetPdgCode() == 11){
942                   eNeg = tmpDaughter;
943                } else if(tmpDaughter->GetPdgCode() == -11){
944                   ePos = tmpDaughter;
945                }
946             }
947          }
948       }
949
950       if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
951          return kFALSE;
952       }
953
954       if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
955          return kFALSE; // no reconstruction below the Pt cut
956       }
957
958       if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
959           eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
960          return kFALSE;
961
962       if(fEtaCutMin > -0.1){
963          if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
964              (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
965             return kFALSE;
966       }
967
968       Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
969       Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
970
971       if(rPos>fMaxR){
972          return kFALSE; // cuts on distance from collision point
973       }
974       if(abs(ePos->Zv()) > fMaxZ){
975          return kFALSE;  // outside material
976       }
977       if(abs(eNeg->Zv()) > fMaxZ){
978          return kFALSE;  // outside material
979       }
980
981       if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
982          return kFALSE;  // line cut to exclude regions where we do not reconstruct
983       } else if ( fEtaCutMin != -0.1 &&   rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
984          return kFALSE;
985       }
986
987       if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
988          return kFALSE; // line cut to exclude regions where we do not reconstruct
989       } else if ( fEtaCutMin != -0.1 &&   rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
990          return kFALSE;
991       }
992
993       return kTRUE;
994       //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
995    }
996    return kFALSE;
997 }
998 ///________________________________________________________________________
999 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1000 {   // Specific Photon Cuts
1001
1002    Int_t cutIndex = 0;
1003    if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1004    cutIndex++;
1005
1006    // Fill Histos before Cuts
1007    if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1008
1009    if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1010
1011    // Gamma selection based on QT from Armenteros
1012    if(fDoQtGammaSelection == kTRUE){
1013       if(!ArmenterosQtCut(photon)){
1014          if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1015          return kFALSE;
1016       }
1017    }
1018    cutIndex++; //2
1019
1020    // Chi Cut
1021    if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1022       {
1023          if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1024          return kFALSE;
1025       }
1026    }
1027    cutIndex++;//3
1028
1029    // Reconstruction Acceptance Cuts
1030    if(!AcceptanceCuts(photon)){
1031       if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1032       return kFALSE;
1033    }
1034
1035    cutIndex++; //4
1036    // Asymmetry Cut
1037    if(fDoPhotonAsymmetryCut == kTRUE){
1038       if(!AsymmetryCut(photon,event)){
1039          if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1040          return kFALSE;
1041       }
1042    }
1043
1044    //Check the pid probability
1045    cutIndex++; //5
1046    if(!PIDProbabilityCut(photon, event)) {
1047       if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1048       return kFALSE;
1049    }
1050
1051    cutIndex++; //6
1052    if(!CorrectedTPCClusterCut(photon, event)) {
1053       if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1054       return kFALSE;
1055    }
1056
1057    Double_t magField = event->GetMagneticField();
1058    if( magField  < 0.0 ){
1059       magField =  1.0;
1060    } else {
1061       magField =  -1.0;
1062    }
1063    AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1064    AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1065    Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1066
1067    cutIndex++; //7
1068    if(!PsiPairCut(photon,deltaPhi)) {
1069       if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1070       return kFALSE;
1071    }
1072
1073    cutIndex++; //8
1074    if(!CosinePAngleCut(photon, event)) {
1075       if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1076       return kFALSE;
1077    }
1078
1079    AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1080    if (photonAOD){
1081       photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1082
1083       cutIndex++; //9
1084       if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1085          if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1086          return kFALSE;
1087       }
1088
1089       cutIndex++; //10
1090       if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1091          if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1092          return kFALSE;
1093       }
1094    } else {
1095       cutIndex++; //9
1096       cutIndex++; //10
1097    }
1098    cutIndex++; //11
1099    if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1100
1101    // Histos after Cuts
1102    if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1103    if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1104    if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1105    return kTRUE;
1106
1107 }
1108
1109 ///________________________________________________________________________
1110 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1111 {   //Cut on corrected TPC Cluster Info
1112
1113    AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1114    AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1115
1116    if(!negTrack||!posTrack)return kFALSE;
1117
1118    Double_t negclsToF=0;
1119
1120    if (!fUseCorrectedTPCClsInfo ){
1121       if(negTrack->GetTPCNclsF()!=0){
1122          negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1123    }
1124    else {
1125       negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1126    }
1127
1128    Double_t posclsToF = 0.;
1129    if (!fUseCorrectedTPCClsInfo ){
1130       if(posTrack->GetTPCNclsF()!=0){
1131          posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1132       }
1133    }else{
1134       posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1135    }
1136
1137    if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1138       return kFALSE;
1139    }
1140
1141    return kTRUE;
1142 }
1143
1144 ///________________________________________________________________________
1145 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1146 {
1147    //Selection of Reconstructed Photons
1148
1149    FillPhotonCutIndex(kPhotonIn);
1150
1151    if(event->IsA()==AliESDEvent::Class()) {
1152      if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1153          FillPhotonCutIndex(kOnFly);
1154          return kFALSE;
1155       }
1156    }
1157    // else if(event->IsA()==AliAODEvent::Class()) {
1158    //    if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1159    //       FillPhotonCutIndex(kOnFly);
1160    //       return kFALSE;
1161    //    }
1162    // }
1163
1164    // Get Tracks
1165    AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1166    AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1167
1168    if(!negTrack || !posTrack) {
1169       FillPhotonCutIndex(kNoTracks);
1170       return kFALSE;
1171    }
1172    photon->DeterminePhotonQuality(negTrack,posTrack);
1173    // Track Cuts
1174    if(!TracksAreSelected(negTrack, posTrack)){
1175       FillPhotonCutIndex(kTrackCuts);
1176       return kFALSE;
1177    }
1178
1179    // dEdx Cuts
1180    if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1181       FillPhotonCutIndex(kdEdxCuts);
1182       return kFALSE;
1183    }
1184
1185    // Photon Cuts
1186    if(!PhotonCuts(photon,event)){
1187       FillPhotonCutIndex(kPhotonCuts);
1188       return kFALSE;
1189    }
1190
1191    // Photon passed cuts
1192    FillPhotonCutIndex(kPhotonOut);
1193    return kTRUE;
1194 }
1195
1196 ///________________________________________________________________________
1197 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1198 {   // Armenteros Qt Cut
1199
1200    if(fDoHighPtQtGammaSelection){
1201       if(photon->GetPhotonPt() < fPtBorderForQt){
1202          if(photon->GetArmenterosQt()>fQtMax){
1203             return kFALSE;
1204          }
1205       } else {
1206          if(photon->GetArmenterosQt()>fHighPtQtMax){
1207             return kFALSE;
1208          }
1209       }
1210    } else {
1211
1212       if(photon->GetArmenterosQt()>fQtMax){
1213          return kFALSE;
1214       }
1215    }
1216    return kTRUE;
1217 }
1218
1219
1220 ///________________________________________________________________________
1221 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1222    // Exclude certain areas for photon reconstruction
1223
1224    Int_t cutIndex=0;
1225    if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1226    cutIndex++;
1227
1228    if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1229       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1230       return kFALSE;
1231    }
1232    cutIndex++;
1233
1234    if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1235       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1236       return kFALSE;
1237    }
1238    cutIndex++;
1239
1240    if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1241       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1242       return kFALSE;
1243    }
1244    else if (fUseEtaMinCut &&  photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1245       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1246       return kFALSE;
1247    }
1248    cutIndex++;
1249
1250    if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1251       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1252       return kFALSE;
1253    }
1254    cutIndex++;
1255
1256
1257    if( photon->GetPhotonEta() > (fEtaCut + fEtaShift)    || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1258       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1259       return kFALSE;
1260    }
1261    if(fEtaCutMin>-0.1){
1262       if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1263          if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1264          return kFALSE;
1265       }
1266    }
1267    cutIndex++;
1268
1269    if(photon->GetPhotonPt()<fPtCut){
1270       if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1271       return kFALSE;
1272    }
1273    cutIndex++;
1274
1275    if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1276
1277    return kTRUE;
1278 }
1279
1280
1281 ///________________________________________________________________________
1282 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1283    // Track Cuts which require AOD/ESD specific implementation
1284
1285    if( !negTrack->IsOn(AliESDtrack::kTPCrefit)  || !posTrack->IsOn(AliESDtrack::kTPCrefit)   )  {
1286       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1287       return kFALSE;
1288    }
1289    cutIndex++;
1290
1291    AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1292    AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1293    if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1294       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1295       return kFALSE;
1296    }
1297    return kTRUE;
1298
1299 }
1300
1301
1302 ///________________________________________________________________________
1303 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1304    // Track Cuts which require AOD/ESD specific implementation
1305
1306    if( !negTrack->IsOn(AliESDtrack::kTPCrefit)  || !posTrack->IsOn(AliESDtrack::kTPCrefit)   )  {
1307       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1308       return kFALSE;
1309    }
1310    cutIndex++;
1311
1312    if(negTrack->GetKinkIndex(0) > 0  || posTrack->GetKinkIndex(0) > 0 ) {
1313       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1314       return kFALSE;
1315    }
1316    return kTRUE;
1317 }
1318
1319
1320
1321 ///________________________________________________________________________
1322 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1323    // Track Selection for Photon Reconstruction
1324
1325    Int_t cutIndex=0;
1326    if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1327    cutIndex++;
1328
1329    // avoid like sign
1330    if(negTrack->Charge() == posTrack->Charge()) {
1331       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1332       return kFALSE;
1333    }
1334    cutIndex++;
1335
1336    // Number of TPC Clusters
1337
1338
1339    if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1340       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1341       return kFALSE;
1342    }
1343    cutIndex++;
1344
1345    // Acceptance
1346    if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1347        negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1348       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1349       return kFALSE;
1350    }
1351    if(fEtaCutMin>-0.1){
1352       if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1353           (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1354          if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1355          return kFALSE;
1356       }
1357    }
1358    cutIndex++;
1359
1360    // Single Pt Cut
1361    if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1362       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1363       return kFALSE;
1364    }
1365    cutIndex++;
1366
1367    // AOD ESD specific cuts
1368    Bool_t passCuts = kTRUE;
1369
1370    if(negTrack->IsA()==AliAODTrack::Class()) {
1371       passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1372    } else {
1373       passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1374    }
1375
1376    if(!passCuts){
1377       if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1378       return kFALSE;
1379    }
1380    cutIndex++;
1381
1382    if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1383
1384    return kTRUE;
1385
1386 }
1387
1388 ///________________________________________________________________________
1389 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1390    // Electron Identification Cuts for Photon reconstruction
1391
1392    if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1393    if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1394
1395    Int_t cutIndex=0;
1396    if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1397    if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1398    if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1399    cutIndex++;
1400
1401
1402    if(fDodEdxSigmaCut == kTRUE){
1403       // TPC Electron Line
1404       if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1405           fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1406
1407          if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1408          return kFALSE;
1409       }
1410       cutIndex++;
1411
1412       // TPC Pion Line
1413       if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1414          if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1415             fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1416             fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1417
1418             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1419             return kFALSE;
1420          }
1421       }
1422       cutIndex++;
1423
1424       // High Pt Pion rej
1425       if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1426          if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1427             fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1428             fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1429
1430             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1431             return kFALSE;
1432          }
1433       }
1434       cutIndex++;
1435    }
1436    else{cutIndex+=3;}
1437
1438    if(fDoKaonRejectionLowP == kTRUE){
1439       if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1440          if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1441
1442             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1443             return kFALSE;
1444          }
1445       }
1446    }
1447    cutIndex++;
1448
1449    if(fDoProtonRejectionLowP == kTRUE){
1450       if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1451          if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1452
1453             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1454             return kFALSE;
1455          }
1456       }
1457    }
1458    cutIndex++;
1459
1460    if(fDoPionRejectionLowP == kTRUE){
1461       if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1462          if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1463
1464             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1465             return kFALSE;
1466          }
1467       }
1468    }
1469    cutIndex++;
1470
1471
1472    // cout<<"Start"<<endl;
1473    // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1474
1475    // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1476    //    {cout<<"TOF DA"<<endl;}
1477    // if(status == AliPIDResponse::kDetPidOk){
1478    //    Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1479    //    cout<<"--> "<<probMis<<endl;
1480    //    if(probMis > 0.01){
1481
1482    //    }
1483    // }
1484
1485    if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1486       if(hTOFbefore){
1487          Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1488          Double_t times[5];
1489          fCurrentTrack->GetIntegratedTimes(times);
1490          Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1491          Double_t dT = TOFsignal - t0 - times[0];
1492          hTOFbefore->Fill(fCurrentTrack->P(),dT);
1493       }
1494       if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1495       if(fUseTOFpid){
1496          if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1497             fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1498             if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1499             return kFALSE;
1500          }
1501       }
1502       if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1503    }
1504    cutIndex++;
1505
1506    // Apply TRD PID
1507    if(fDoTRDPID){
1508       if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1509          if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1510          return kFALSE;
1511       }
1512    }
1513    cutIndex++;
1514
1515    if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1516    if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1517    if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1518   
1519    return kTRUE;
1520 }
1521
1522 ///________________________________________________________________________
1523 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1524    // Cut on Energy Assymetry
1525
1526    for(Int_t ii=0;ii<2;ii++){
1527
1528       AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1529
1530       if( track->P() > fMinPPhotonAsymmetryCut ){
1531          Double_t trackNegAsy=0;
1532          if (photon->GetPhotonP()!=0.){
1533             trackNegAsy= track->P()/photon->GetPhotonP();
1534          }
1535
1536          if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1537             return kFALSE;
1538          }
1539       }
1540
1541    }
1542    return kTRUE;
1543 }
1544
1545 ///________________________________________________________________________
1546 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1547    //Returns pointer to the track with given ESD label
1548    //(Important for AOD implementation, since Track array in AOD data is different
1549    //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1550
1551    AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1552    if(esdEvent) {
1553       if(label > event->GetNumberOfTracks() ) return NULL;
1554       AliESDtrack * track = esdEvent->GetTrack(label);
1555       return track;
1556
1557    } else {
1558       AliVTrack * track = 0x0;
1559       if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1560          track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1561          return track;
1562       }
1563       else{
1564          for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1565             track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1566             if(track){
1567                if(track->GetID() == label) {
1568                   return track;
1569                }
1570             }
1571          }
1572       }
1573    }
1574    //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1575    return NULL;
1576 }
1577
1578 ///________________________________________________________________________
1579 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1580    //Returns pointer to the track with given ESD label
1581    //(Important for AOD implementation, since Track array in AOD data is different
1582    //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1583
1584    if(event) {
1585       if(label > event->GetNumberOfTracks() ) return NULL;
1586       AliESDtrack * track = event->GetTrack(label);
1587       return track;
1588    }
1589    //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1590    return NULL;
1591 }
1592
1593
1594
1595 ///________________________________________________________________________
1596 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1597    // Cut on Electron Probability for Photon Reconstruction
1598
1599    AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1600
1601    if(esdEvent){
1602
1603       Bool_t iResult=kFALSE;
1604
1605       Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1606       Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1607
1608       AliESDtrack* negTrack   = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1609       AliESDtrack* posTrack   = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1610
1611       if(negProbArray && posProbArray){
1612
1613          negTrack->GetTPCpid(negProbArray);
1614          posTrack->GetTPCpid(posProbArray);
1615
1616          if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1617             iResult=kTRUE;
1618          }
1619       }
1620
1621       delete [] posProbArray;
1622       delete [] negProbArray;
1623       return iResult;
1624
1625    } else {
1626       ///Not possible for AODs
1627       return kTRUE;
1628    }
1629
1630
1631
1632
1633 }
1634
1635
1636 ///________________________________________________________________________
1637 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1638    // MC Acceptance Cuts
1639    //(Certain areas were excluded for photon reconstruction)
1640
1641    if(particle->R()>fMaxR){
1642       return kFALSE;}
1643
1644    if(ePos->R()>fMaxR){
1645       return kFALSE;
1646    }
1647
1648    if(ePos->R()<fMinR){
1649       return kFALSE;
1650    }
1651
1652    if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1653       return kFALSE;
1654    }
1655    else if (fUseEtaMinCut &&  ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1656       return kFALSE;
1657    }
1658
1659    if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1660       return kFALSE;
1661    }
1662
1663    if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1664       return kFALSE;
1665    }
1666
1667    if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1668       return kFALSE;
1669    }
1670
1671
1672    if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1673       return kFALSE;
1674    }
1675    if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1676       return kFALSE;
1677    }
1678    if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1679       return kFALSE;
1680    }
1681    if(fEtaCutMin>-0.1){
1682       if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1683          return kFALSE;
1684       }
1685       if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1686          return kFALSE;
1687       }
1688       if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1689          return kFALSE;
1690       }
1691    }
1692
1693    if( ePos->Pt()< fSinglePtCut ||  eNeg->Pt()< fSinglePtCut){
1694       return kFALSE;
1695    }
1696
1697    if(particle->Pt()<fPtCut){
1698       return kFALSE;
1699    }
1700
1701    return kTRUE;
1702 }
1703 ///________________________________________________________________________
1704 Bool_t AliConversionCuts::UpdateCutString() {
1705    ///Update the cut string (if it has been created yet)
1706
1707    if(fCutString && fCutString->GetString().Length() == kNCuts) {
1708       fCutString->SetString(GetCutNumber());
1709    } else {
1710       return kFALSE;
1711    }
1712    return kTRUE;
1713 }
1714 ///________________________________________________________________________
1715 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1716
1717   AliInfo("Entering loading of histograms for weighting");
1718   TFile *f = TFile::Open(fPathTrFReweighting.Data());
1719   if(!f){
1720      AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1721      return;
1722   }
1723   if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1724      TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1725      hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1726      hReweightMCHistPi0->SetDirectory(0);
1727      if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1728      else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1729   }
1730   if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1731      TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1732      fFitDataPi0 = new TF1(*fFitDataPi0temp);
1733      if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1734      else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1735   }
1736
1737   if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1738      TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1739      hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1740      hReweightMCHistEta->SetDirectory(0);
1741      if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1742      else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1743   }
1744
1745   if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1746      TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1747      fFitDataEta = new TF1(*fFitDataEtatemp);
1748      if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1749      else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1750
1751   }
1752   if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1753      TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1754      hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1755      hReweightMCHistK0s->SetDirectory(0);
1756      if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1757      else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1758   }
1759
1760   if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1761      TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1762      fFitDataK0s = new TF1(*fFitDataK0stemp);
1763      if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1764      else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1765   }
1766   f->Close();
1767   delete f;
1768   
1769 }
1770
1771
1772 ///________________________________________________________________________
1773 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1774    // Initialize Cuts from a given Cut string
1775    if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1776       AliInfo("Weighting was enabled");
1777       LoadReweightingHistosMCFromFile();
1778    }
1779
1780    AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1781    if(analysisCutSelection.Length()!=kNCuts) {
1782       AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1783       return kFALSE;
1784    }
1785    if(!analysisCutSelection.IsDigit()){
1786       AliError("Cut selection contains characters");
1787       return kFALSE;
1788    }
1789
1790    const char *cutSelection = analysisCutSelection.Data();
1791 #define ASSIGNARRAY(i)  fCuts[i] = cutSelection[i] - '0'
1792    for(Int_t ii=0;ii<kNCuts;ii++){
1793       ASSIGNARRAY(ii);
1794    }
1795
1796    // Set Individual Cuts
1797    for(Int_t ii=0;ii<kNCuts;ii++){
1798       if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1799    }
1800
1801    //PrintCuts();
1802
1803    return kTRUE;
1804 }
1805 ///________________________________________________________________________
1806 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1807    ///Set individual cut ID
1808
1809    switch (cutID) {
1810
1811    case kv0FinderType:
1812       if( SetV0Finder(value)) {
1813          fCuts[kv0FinderType] = value;
1814          UpdateCutString();
1815          return kTRUE;
1816       } else return kFALSE;
1817
1818    case kededxSigmaCut:
1819       if( SetTPCdEdxCutElectronLine(value)) {
1820          fCuts[kededxSigmaCut] = value;
1821          UpdateCutString();
1822          return kTRUE;
1823       } else return kFALSE;
1824
1825    case kpidedxSigmaCut:
1826       if( SetTPCdEdxCutPionLine(value)) {
1827          fCuts[kpidedxSigmaCut] = value;
1828          UpdateCutString();
1829          return kTRUE;
1830       } else return kFALSE;
1831
1832    case kpiMomdedxSigmaCut:
1833       if( SetMinMomPiondEdxCut(value)) {
1834          fCuts[kpiMomdedxSigmaCut] = value;
1835          UpdateCutString();
1836          return kTRUE;
1837       } else return kFALSE;
1838
1839    case kchi2GammaCut:
1840       if( SetChi2GammaCut(value)) {
1841          fCuts[kchi2GammaCut] = value;
1842          UpdateCutString();
1843          return kTRUE;
1844       } else return kFALSE;
1845
1846    case ksinglePtCut:
1847       if( SetSinglePtCut(value)) {
1848          fCuts[ksinglePtCut] = value;
1849          UpdateCutString();
1850          return kTRUE;
1851       } else return kFALSE;
1852
1853    case kclsTPCCut:
1854       if( SetTPCClusterCut(value)) {
1855          fCuts[kclsTPCCut] = value;
1856          UpdateCutString();
1857          return kTRUE;
1858       } else return kFALSE;
1859
1860    case ketaCut:
1861       if( SetEtaCut(value)) {
1862          fCuts[ketaCut] = value;
1863          UpdateCutString();
1864          return kTRUE;
1865       } else return kFALSE;
1866
1867    case kLowPRejectionSigmaCut:
1868       if( SetLowPRejectionCuts(value)) {
1869          fCuts[kLowPRejectionSigmaCut] = value;
1870          UpdateCutString();
1871          return kTRUE;
1872       } else return kFALSE;
1873
1874    case kQtMaxCut:
1875       if( SetQtMaxCut(value)) {
1876          fCuts[kQtMaxCut] = value;
1877          UpdateCutString();
1878          return kTRUE;
1879       } else return kFALSE;
1880
1881    case kpiMaxMomdedxSigmaCut:
1882       if( SetMaxMomPiondEdxCut(value)) {
1883          fCuts[kpiMaxMomdedxSigmaCut] = value;
1884          UpdateCutString();
1885          return kTRUE;
1886       } else return kFALSE;
1887
1888    case kRCut:
1889       if( SetRCut(value)) {
1890          fCuts[kRCut] = value;
1891          UpdateCutString();
1892          return kTRUE;
1893       } else return kFALSE;
1894
1895    case kremovePileUp:
1896       if( SetRemovePileUp(value)) {
1897          fCuts[kremovePileUp] = value;
1898          UpdateCutString();
1899          return kTRUE;
1900       } else return kFALSE;
1901
1902    case kselectV0AND:
1903       if( SetSelectSpecialTrigger(value)) {
1904          fCuts[kselectV0AND] = value;
1905          UpdateCutString();
1906          return kTRUE;
1907       } else return kFALSE;
1908
1909    case kmultiplicityMethod:
1910       if( SetMultiplicityMethod(value)) {
1911          fCuts[kmultiplicityMethod] = value;
1912          UpdateCutString();
1913          return kTRUE;
1914       } else return kFALSE;
1915
1916    case kisHeavyIon:
1917       if( SetIsHeavyIon(value)) {
1918          fCuts[kisHeavyIon] = value;
1919          UpdateCutString();
1920          return kTRUE;
1921       } else return kFALSE;
1922
1923    case kCentralityMin:
1924       if( SetCentralityMin(value)) {
1925          fCuts[kCentralityMin] = value;
1926          UpdateCutString();
1927          return kTRUE;
1928       } else return kFALSE;
1929
1930    case kCentralityMax:
1931       if( SetCentralityMax(value)) {
1932          fCuts[kCentralityMax] = value;
1933          UpdateCutString();
1934          return kTRUE;
1935       } else return kFALSE;
1936
1937    case kTOFelectronPID:
1938       if( SetTOFElectronPIDCut(value)) {
1939          fCuts[kTOFelectronPID] = value;
1940          UpdateCutString();
1941          return kTRUE;
1942       } else return kFALSE;
1943
1944    case kdoPhotonAsymmetryCut:
1945       if( SetPhotonAsymmetryCut(value)) {
1946          fCuts[kdoPhotonAsymmetryCut] = value;
1947          UpdateCutString();
1948          return kTRUE;
1949       } else return kFALSE;
1950
1951    case kPsiPair:
1952       if( SetPsiPairCut(value)) {
1953          fCuts[kPsiPair] = value;
1954          UpdateCutString();
1955          return kTRUE;
1956       } else return kFALSE;
1957
1958    case kCosPAngle:
1959       if( SetCosPAngleCut(value)) {
1960          fCuts[kCosPAngle] = value;
1961          UpdateCutString();
1962          return kTRUE;
1963       } else return kFALSE;
1964
1965
1966    case kElecShare:
1967       if( SetSharedElectronCut(value)) {
1968          fCuts[kElecShare] = value;
1969          UpdateCutString();
1970          return kTRUE;
1971       } else return kFALSE;
1972
1973    case kToCloseV0s:
1974       if( SetToCloseV0sCut(value)) {
1975          fCuts[kToCloseV0s] = value;
1976          UpdateCutString();
1977          return kTRUE;
1978       } else return kFALSE;
1979
1980    case kExtraSignals:
1981       if( SetRejectExtraSignalsCut(value)) {
1982          fCuts[kExtraSignals] = value;
1983          UpdateCutString();
1984          return kTRUE;
1985       } else return kFALSE;
1986
1987    case kDcaRPrimVtx:
1988       if( SetDCARPhotonPrimVtxCut(value)) {
1989          fCuts[kDcaRPrimVtx] = value;
1990          UpdateCutString();
1991          return kTRUE;
1992       } else return kFALSE;
1993
1994    case kDcaZPrimVtx:
1995       if( SetDCAZPhotonPrimVtxCut(value)) {
1996          fCuts[kDcaZPrimVtx] = value;
1997          UpdateCutString();
1998          return kTRUE;
1999       } else return kFALSE;
2000
2001    case kInPlaneOutOfPlane:
2002    if( SetInPlaneOutOfPlane(value)) {
2003       fCuts[kInPlaneOutOfPlane] = value;
2004       UpdateCutString();
2005       return kTRUE;
2006    } else return kFALSE;
2007
2008
2009       
2010
2011    case kNCuts:
2012       AliError("Cut id out of range");
2013       return kFALSE;
2014    }
2015
2016    AliError("Cut id %d not recognized");
2017    return kFALSE;
2018
2019
2020 }
2021 ///________________________________________________________________________
2022 void AliConversionCuts::PrintCuts() {
2023    // Print out current Cut Selection
2024    for(Int_t ic = 0; ic < kNCuts; ic++) {
2025       printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2026    }
2027 }
2028 ///________________________________________________________________________
2029 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2030 {   // Set Cut
2031    switch(isHeavyIon){
2032    case 0:
2033       fIsHeavyIon=0;
2034       break;
2035    case 1:
2036       fIsHeavyIon=1;
2037       fDetectorCentrality=0;
2038       break;
2039    case 2:
2040       fIsHeavyIon=1;
2041       fDetectorCentrality=1;
2042       break;
2043    case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2044       fIsHeavyIon=1;
2045       fDetectorCentrality=0;
2046       fModCentralityClass=1;
2047       break;
2048    case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2049       fIsHeavyIon=1;
2050       fDetectorCentrality=0;
2051       fModCentralityClass=2;
2052       break;
2053    case 5: //strict cut on v0 tracks for MC
2054       fIsHeavyIon=1;
2055       fDetectorCentrality=0;
2056       fModCentralityClass=3;
2057       break;
2058    case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2059       //strict cut on v0 tracks for MC
2060       fIsHeavyIon=1;
2061       fDetectorCentrality=0;
2062       fModCentralityClass=4;
2063       break;
2064    case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2065       //strict cut on v0 tracks for MC
2066       fIsHeavyIon=1;
2067       fDetectorCentrality=0;
2068       fModCentralityClass=5;
2069       break;
2070    case 8:
2071       fIsHeavyIon=2;
2072       fDetectorCentrality=0;
2073       break;
2074    case 9:
2075       fIsHeavyIon=2;
2076       fDetectorCentrality=1;
2077       break;
2078    default:
2079       AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2080       return kFALSE;
2081    }
2082    return kTRUE;
2083 }
2084
2085 //___________________________________________________________________
2086 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2087 {
2088    // Set Cut
2089    if(minCentrality<0||minCentrality>9){
2090       AliError(Form("minCentrality not defined %d",minCentrality));
2091       return kFALSE;
2092    }
2093
2094    fCentralityMin=minCentrality;
2095    return kTRUE;
2096 }
2097 //___________________________________________________________________
2098 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2099 {
2100    // Set Cut
2101    if(maxCentrality<0||maxCentrality>9){
2102       AliError(Form("maxCentrality not defined %d",maxCentrality));
2103       return kFALSE;
2104    }
2105    fCentralityMax=maxCentrality;
2106    return kTRUE;
2107 }
2108 ///________________________________________________________________________
2109 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2110 {// Set Cut
2111
2112    switch(selectSpecialTrigger){
2113    case 0:
2114       fSpecialTrigger=0; // dont care
2115       break;
2116    case 1:
2117       fSpecialTrigger=1; // V0AND
2118       break;
2119    case 2:
2120       fSpecialTrigger=2; // with SDD requested
2121       break;
2122    case 3:
2123       fSpecialTrigger=3; // V0AND plus with SDD requested
2124       break;
2125    // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2126    case 4:
2127       fSpecialTrigger=4; // different trigger class as MB
2128       fTriggerSelectedManually = kTRUE;
2129       break;
2130    case 5:
2131       fSpecialTrigger=4; // different trigger class as MB
2132       fTriggerSelectedManually = kTRUE;
2133       break;
2134    case 6:
2135       fSpecialTrigger=4; // different trigger class as MB
2136       fTriggerSelectedManually = kTRUE;
2137       break;
2138    case 7:
2139       fSpecialTrigger=4; // different trigger class as MB
2140       fTriggerSelectedManually = kTRUE;
2141       break;
2142     case 8:
2143       fSpecialTrigger=4; // different trigger class as MB
2144       fTriggerSelectedManually = kTRUE;
2145       break;
2146     case 9:
2147       fSpecialTrigger=4; // different trigger class as MB
2148       fTriggerSelectedManually = kTRUE;
2149       break;
2150    default:
2151       AliError("Warning: Special Trigger Not known");
2152       return kFALSE;
2153    }
2154    return kTRUE;
2155 }
2156 ///________________________________________________________________________
2157 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2158 {
2159    // Set Cut
2160    fMultiplicityMethod=multiplicityMethod;
2161
2162    // 0 Photon Multiplicity
2163    // 1 TPC Track multiplicity
2164    // 2 V0 Mult
2165    // 3 SPD Mult
2166
2167    return kTRUE;
2168 }
2169 ///________________________________________________________________________
2170 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2171 {// Set Cut
2172    switch(removePileUp){
2173    case 0:
2174       fRemovePileUp=kFALSE;
2175       break;
2176    case 1:
2177       fRemovePileUp=kTRUE;
2178       break;
2179    default:
2180       AliError("RemovePileUpCut not defined");
2181       return kFALSE;
2182    }
2183    return kTRUE;
2184 }
2185 ///________________________________________________________________________
2186 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2187
2188    switch(extraSignal){
2189    case 0:
2190       fRejectExtraSignals = 0;
2191       break; // No Rejection
2192    case 1:
2193       fRejectExtraSignals = 1;
2194       break; // MinBias Header
2195    case 2:
2196       fRejectExtraSignals = 2;
2197       break; // User String Array
2198    case 3:
2199       fRejectExtraSignals = 3;
2200       break; // Rejection for Gamma Correction only
2201    default:
2202       AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2203       return kFALSE;
2204    }
2205    return kTRUE;
2206 }
2207 ///________________________________________________________________________
2208 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2209 {   // Set Cut
2210    switch (v0FinderType){
2211    case 0:  // on fly V0 finder
2212       cout << "have chosen onfly V0" << endl;
2213       fUseOnFlyV0Finder=kTRUE;
2214       break;
2215    case 1:  // offline V0 finder
2216       cout << "have chosen offline V0" << endl;
2217       fUseOnFlyV0Finder=kFALSE;
2218       break;
2219    default:
2220       AliError(Form(" v0FinderType not defined %d",v0FinderType));
2221       return kFALSE;
2222    }
2223    return kTRUE;
2224 }
2225 ///________________________________________________________________________
2226 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2227 {   // Set Cut
2228
2229    //Set Standard LineCutZValues
2230    fLineCutZValueMin = -2;
2231    fLineCutZValue = 7.;
2232
2233    switch(etaCut){
2234    case 0: // 0.9
2235       fEtaCut     = 0.9;
2236       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2237       fEtaCutMin     = -0.1;
2238       fLineCutZRSlopeMin = 0.;
2239       break;
2240    case 1:  // 0.6  // changed from 1.2 to 0.6 on 2013.06.10
2241       fEtaCut     = 0.6;
2242       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2243       fEtaCutMin     = -0.1;
2244       fLineCutZRSlopeMin = 0.;
2245       break;
2246    case 2:  // 1.4
2247       fEtaCut     = 1.4;
2248       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2249       fEtaCutMin     = -0.1;
2250       fLineCutZRSlopeMin = 0.;
2251       break;
2252    case 3: // 0.65
2253       fEtaCut     = 0.65;
2254       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2255       fEtaCutMin     = -0.1;
2256       fLineCutZRSlopeMin = 0.;
2257       break;
2258    case 4: // 0.75
2259       fEtaCut     = 0.75;
2260       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2261       fEtaCutMin     = -0.1;
2262       fLineCutZRSlopeMin = 0.;
2263       break;
2264    case 5: // 0.5
2265       fEtaCut     = 0.5;
2266       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2267       fEtaCutMin     = -0.1;
2268       fLineCutZRSlopeMin = 0.;
2269       break;
2270    case 6: // 5.
2271       fEtaCut     = 5.;
2272       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2273       fEtaCutMin     = -0.1;
2274       fLineCutZRSlopeMin = 0.;
2275       break;
2276    case 7:
2277       if (fIsHeavyIon==1){
2278          fEtaCut     = 0.7;
2279          fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2280          fEtaCutMin     = -0.1;
2281          fLineCutZRSlopeMin = 0.;
2282          break;
2283       } else {   
2284          fEtaCut     = 0.3;
2285          fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2286          fEtaCutMin     = -0.1;
2287          fLineCutZRSlopeMin = 0.;
2288          break;
2289       }
2290    // case 8: // 0.1 - 0.8
2291    //    fEtaCut     = 0.9;
2292    //    fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2293    //    fEtaCutMin     = 0.1;
2294    //    fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2295    //    break;
2296    case 8: // 0.4
2297       fEtaCut     = 0.4;
2298       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2299       fEtaCutMin     = -0.1;
2300       fLineCutZRSlopeMin = 0.;
2301       break;
2302    case 9: // 10
2303       fEtaCut     = 10;
2304       fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2305       fEtaCutMin     = -0.1;
2306       fLineCutZRSlopeMin = 0.;
2307       break;
2308    default:
2309       AliError(Form(" EtaCut not defined %d",etaCut));
2310       return kFALSE;
2311    }
2312    return kTRUE;
2313 }
2314 ///________________________________________________________________________
2315 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2316    // Set Cut
2317    switch(RCut){
2318    case 0:
2319       fMinR=0;
2320       fMaxR = 180.;
2321       break;
2322    case 1:
2323       fMinR=2.8;
2324       fMaxR = 180.;
2325       break;
2326    case 2:
2327       fMinR=5.;
2328       fMaxR = 180.;
2329       break;
2330    case 3:
2331       fMaxR = 70.;
2332       fMinR = 10.;
2333       break;
2334    case 4:
2335       fMaxR = 70.;
2336       fMinR = 5.;
2337       break;
2338       // High purity cuts for PbPb (remove first layers of material)
2339    case 5:
2340       fMaxR = 180.;
2341       fMinR = 10.;
2342       break;
2343    case 6:
2344       fMaxR = 180.;
2345       fMinR = 20.;
2346       break;
2347    case 7:
2348       fMaxR = 180.;
2349       fMinR = 26.;
2350       break;
2351    case 8:
2352       fMaxR = 180.;
2353       fMinR = 12.5;
2354       break;
2355    case 9:
2356       fMaxR = 180.;
2357       fMinR = 7.5;
2358       break;
2359
2360    default:
2361       AliError("RCut not defined");
2362       return kFALSE;
2363    }
2364    return kTRUE;
2365 }
2366 ///________________________________________________________________________
2367 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2368 {   // Set Cut
2369    switch(singlePtCut){
2370    case 0: // 0.050 GeV
2371       fSinglePtCut = 0.050;
2372       break;
2373    case 1:  // 0.100 GeV
2374       fSinglePtCut = 0.100;
2375       break;
2376    case 2:  // 0.150 GeV
2377       fSinglePtCut = 0.150;
2378       break;
2379    case 3:  // 0.200 GeV
2380       fSinglePtCut = 0.200;
2381       break;
2382    case 4:  // 0.075 GeV
2383       fSinglePtCut = 0.075;
2384       break;
2385    case 5:  // 0.125 GeV
2386       fSinglePtCut = 0.125;
2387       break;
2388    case 6:  // 0.04 GeV
2389       fSinglePtCut = 0.040;
2390       break;
2391    case 7:  // 0.0 GeV
2392       fSinglePtCut = 0.0;
2393       break;
2394    default:
2395       AliError(Form("singlePtCut not defined %d",singlePtCut));
2396       return kFALSE;
2397    }
2398    return kTRUE;
2399 }
2400 ///________________________________________________________________________
2401 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2402 {   // Set Cut
2403    switch(clsTPCCut){
2404    case 0: // 0
2405       fMinClsTPC= 0.;
2406       break;
2407    case 1:  // 60
2408       fMinClsTPC= 60.;
2409       break;
2410    case 2:  // 80
2411       fMinClsTPC= 80.;
2412       break;
2413    case 3:  // 100
2414       fMinClsTPC= 100.;
2415       break;
2416    case 4:  // 95% of findable clusters
2417       fMinClsTPCToF= 0.95;
2418       fUseCorrectedTPCClsInfo=1;
2419       break;
2420    case 5:  // 0% of findable clusters
2421       fMinClsTPCToF= 0.0;
2422       fUseCorrectedTPCClsInfo=1;
2423       break;
2424    case 6:  // 70% of findable clusters
2425       fMinClsTPCToF= 0.7;
2426       fUseCorrectedTPCClsInfo=1;
2427       break;
2428    case 7:  // 0% of findable clusters
2429       fMinClsTPCToF= 0.35;
2430       fUseCorrectedTPCClsInfo=0;
2431       break;
2432    case 8:
2433       fMinClsTPCToF= 0.35;
2434       fUseCorrectedTPCClsInfo=1;
2435       break;
2436    case 9:
2437       fMinClsTPCToF= 0.6;
2438       fUseCorrectedTPCClsInfo=1;
2439       break;
2440    default:
2441       AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2442       return kFALSE;
2443    }
2444    return kTRUE;
2445 }
2446 ///________________________________________________________________________
2447 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2448 {   // Set Cut
2449    switch(ededxSigmaCut){
2450    case 0: // -10,10
2451       fPIDnSigmaBelowElectronLine=-10;
2452       fPIDnSigmaAboveElectronLine=10;
2453       break;
2454    case 1: // -5,5
2455       fPIDnSigmaBelowElectronLine=-5;
2456       fPIDnSigmaAboveElectronLine=5;
2457       break;
2458    case 2: // -3,5
2459       fPIDnSigmaBelowElectronLine=-3;
2460       fPIDnSigmaAboveElectronLine=5;
2461       break;
2462    case 3: // -4,5
2463       fPIDnSigmaBelowElectronLine=-4;
2464       fPIDnSigmaAboveElectronLine=5;
2465       break;
2466    case 4: // -6,7
2467       fPIDnSigmaBelowElectronLine=-6;
2468       fPIDnSigmaAboveElectronLine=7;
2469       break;
2470    case 5: // -4,4
2471       fPIDnSigmaBelowElectronLine=-4;
2472       fPIDnSigmaAboveElectronLine=4;
2473       break;
2474    case 6: // -2.5,4
2475       fPIDnSigmaBelowElectronLine=-2.5;
2476       fPIDnSigmaAboveElectronLine=4;
2477       break;
2478    case 7: // -2,3.5
2479       fPIDnSigmaBelowElectronLine=-2;
2480       fPIDnSigmaAboveElectronLine=3.5;
2481       break;
2482    default:
2483       AliError("TPCdEdxCutElectronLine not defined");
2484       return kFALSE;
2485
2486    }
2487    return kTRUE;
2488 }
2489 ///________________________________________________________________________
2490 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2491 {   // Set Cut
2492
2493    switch(pidedxSigmaCut){
2494    case 0:  // -10
2495       fPIDnSigmaAbovePionLine=-10;
2496       fPIDnSigmaAbovePionLineHighPt=-10;
2497       break;
2498    case 1:   // 0
2499       fPIDnSigmaAbovePionLine=0;
2500       fPIDnSigmaAbovePionLineHighPt=-10;
2501       break;
2502    case 2:  // 1
2503       fPIDnSigmaAbovePionLine=1;
2504       fPIDnSigmaAbovePionLineHighPt=-10;
2505       break;
2506    case 3:  // 1
2507       fPIDnSigmaAbovePionLine=2.5;
2508       fPIDnSigmaAbovePionLineHighPt=-10;
2509       break;
2510    case 4:  // 1
2511       fPIDnSigmaAbovePionLine=0.5;
2512       fPIDnSigmaAbovePionLineHighPt=-10;
2513       break;
2514    case 5:  // 1
2515       fPIDnSigmaAbovePionLine=2.;
2516       fPIDnSigmaAbovePionLineHighPt=-10;
2517       break;
2518    case 6:  // 1
2519       fPIDnSigmaAbovePionLine=2.;
2520       fPIDnSigmaAbovePionLineHighPt=0.5;
2521       break;
2522    case 7:  // 1
2523       fPIDnSigmaAbovePionLine=3.5;
2524       fPIDnSigmaAbovePionLineHighPt=-10;
2525       break;
2526    case 8:  // 1
2527       fPIDnSigmaAbovePionLine=2.;
2528       fPIDnSigmaAbovePionLineHighPt=1.;
2529       break;
2530    case 9:
2531       fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2532       fPIDnSigmaAbovePionLineHighPt=-10;
2533       break;
2534    default:
2535       AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2536       return kFALSE;
2537    }
2538    return kTRUE;
2539 }
2540 ///________________________________________________________________________
2541 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2542 {   // Set Cut
2543    switch(piMomdedxSigmaCut){
2544    case 0:  // 0.5 GeV
2545       fPIDMinPnSigmaAbovePionLine=0.5;
2546       break;
2547    case 1:  // 1. GeV
2548       fPIDMinPnSigmaAbovePionLine=1.;
2549       break;
2550    case 2:  // 1.5 GeV
2551       fPIDMinPnSigmaAbovePionLine=1.5;
2552       break;
2553    case 3:  // 20.0 GeV
2554       fPIDMinPnSigmaAbovePionLine=20.;
2555       break;
2556    case 4:  // 50.0 GeV
2557       fPIDMinPnSigmaAbovePionLine=50.;
2558       break;
2559    case 5:  // 0.3 GeV
2560       fPIDMinPnSigmaAbovePionLine=0.3;
2561       break;
2562    case 6:  // 0.25 GeV
2563       fPIDMinPnSigmaAbovePionLine=0.25;
2564       break;
2565    case 7:  // 0.4 GeV
2566       fPIDMinPnSigmaAbovePionLine=0.4;
2567       break;
2568    case 8:  // 0.2 GeV
2569       fPIDMinPnSigmaAbovePionLine=0.2;
2570       break;
2571    default:
2572       AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2573       return kFALSE;
2574    }
2575    return kTRUE;
2576 }
2577 ///________________________________________________________________________
2578 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2579 {   // Set Cut
2580    switch(piMaxMomdedxSigmaCut){
2581    case 0:  // 100. GeV
2582       fPIDMaxPnSigmaAbovePionLine=100.;
2583       break;
2584    case 1:  // 5. GeV
2585       fPIDMaxPnSigmaAbovePionLine=5.;
2586       break;
2587    case 2:  // 4. GeV
2588       fPIDMaxPnSigmaAbovePionLine=4.;
2589       break;
2590    case 3:  // 3.5 GeV
2591       fPIDMaxPnSigmaAbovePionLine=3.5;
2592       break;
2593    case 4:  // 3. GeV
2594       fPIDMaxPnSigmaAbovePionLine=3.;
2595       break;
2596    case 5:  // 7. GeV
2597       fPIDMaxPnSigmaAbovePionLine=7.;
2598       break;
2599    default:
2600       AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2601       return kFALSE;
2602    }
2603    return kTRUE;
2604 }
2605 ///________________________________________________________________________
2606 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2607 {   // Set Cut
2608    switch(LowPRejectionSigmaCut){
2609    case 0:  //
2610       fPIDnSigmaAtLowPAroundKaonLine=0;
2611       fPIDnSigmaAtLowPAroundProtonLine=0;
2612       fPIDnSigmaAtLowPAroundPionLine=0;
2613       fDoKaonRejectionLowP = kFALSE;
2614       fDoProtonRejectionLowP = kFALSE;
2615       fDoPionRejectionLowP = kFALSE;
2616       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2617       break;
2618    case 1:  //
2619       fPIDnSigmaAtLowPAroundKaonLine=0.5;
2620       fPIDnSigmaAtLowPAroundProtonLine=0.5;
2621       fPIDnSigmaAtLowPAroundPionLine=0.5;
2622       fDoKaonRejectionLowP = kTRUE;
2623       fDoProtonRejectionLowP = kTRUE;
2624       fDoPionRejectionLowP = kTRUE;
2625       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2626       break;
2627    case 2:  //
2628       fPIDnSigmaAtLowPAroundKaonLine=1;
2629       fPIDnSigmaAtLowPAroundProtonLine=1;
2630       fPIDnSigmaAtLowPAroundPionLine=1;
2631       fDoKaonRejectionLowP = kTRUE;
2632       fDoProtonRejectionLowP = kTRUE;
2633       fDoPionRejectionLowP = kTRUE;
2634       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2635       break;
2636    case 3:  //
2637       fPIDnSigmaAtLowPAroundKaonLine=2.;
2638       fPIDnSigmaAtLowPAroundProtonLine=2.;
2639       fPIDnSigmaAtLowPAroundPionLine=2.;
2640       fDoKaonRejectionLowP = kTRUE;
2641       fDoProtonRejectionLowP = kTRUE;
2642       fDoPionRejectionLowP = kTRUE;
2643       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2644       break;
2645    case 4:  //
2646       fPIDnSigmaAtLowPAroundKaonLine=0.;
2647       fPIDnSigmaAtLowPAroundProtonLine=0.;
2648       fPIDnSigmaAtLowPAroundPionLine=1;
2649       fDoKaonRejectionLowP = kFALSE;
2650       fDoProtonRejectionLowP = kFALSE;
2651       fDoPionRejectionLowP = kTRUE;
2652       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2653       break;
2654    case 5:  //
2655       fPIDnSigmaAtLowPAroundKaonLine=0.;
2656       fPIDnSigmaAtLowPAroundProtonLine=0.;
2657       fPIDnSigmaAtLowPAroundPionLine=1.5;
2658       fDoKaonRejectionLowP = kFALSE;
2659       fDoProtonRejectionLowP = kFALSE;
2660       fDoPionRejectionLowP = kTRUE;
2661       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2662       break;
2663    case 6:  //
2664       fPIDnSigmaAtLowPAroundKaonLine=0.;
2665       fPIDnSigmaAtLowPAroundProtonLine=0.;
2666       fPIDnSigmaAtLowPAroundPionLine=2.;
2667       fDoKaonRejectionLowP = kFALSE;
2668       fDoProtonRejectionLowP = kFALSE;
2669       fDoPionRejectionLowP = kTRUE;
2670       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2671       break;
2672    case 7:  //
2673       fPIDnSigmaAtLowPAroundKaonLine=0.;
2674       fPIDnSigmaAtLowPAroundProtonLine=0.;
2675       fPIDnSigmaAtLowPAroundPionLine=0.5;
2676       fDoKaonRejectionLowP = kFALSE;
2677       fDoProtonRejectionLowP = kFALSE;
2678       fDoPionRejectionLowP = kTRUE;
2679       fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2680       break;
2681    default:
2682       AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2683       return kFALSE;
2684    }
2685    return kTRUE;
2686 }
2687 ///________________________________________________________________________
2688 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2689    // Set Cut
2690    switch(TOFelectronPID){
2691    case 0: // no cut
2692       fUseTOFpid = kFALSE;
2693       fTofPIDnSigmaBelowElectronLine=-100;
2694       fTofPIDnSigmaAboveElectronLine=100;
2695       break;
2696    case 1: // -7,7
2697       fUseTOFpid = kTRUE;
2698       fTofPIDnSigmaBelowElectronLine=-7;
2699       fTofPIDnSigmaAboveElectronLine=7;
2700       break;
2701    case 2: // -5,5
2702       fUseTOFpid = kTRUE;
2703       fTofPIDnSigmaBelowElectronLine=-5;
2704       fTofPIDnSigmaAboveElectronLine=5;
2705       break;
2706    case 3: // -3,5
2707       fUseTOFpid = kTRUE;
2708       fTofPIDnSigmaBelowElectronLine=-3;
2709       fTofPIDnSigmaAboveElectronLine=5;
2710       break;
2711    case 4: // -2,3
2712       fUseTOFpid = kTRUE;
2713       fTofPIDnSigmaBelowElectronLine=-2;
2714       fTofPIDnSigmaAboveElectronLine=3;
2715       break;
2716    case 5: // -3,3
2717       fUseTOFpid = kTRUE;
2718       fTofPIDnSigmaBelowElectronLine=-3;
2719       fTofPIDnSigmaAboveElectronLine=3;
2720       break;
2721    default:
2722       AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2723       return kFALSE;
2724    }
2725    return kTRUE;
2726 }
2727 ///________________________________________________________________________
2728 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2729 {   // Set Cut
2730    switch(QtMaxCut){
2731    case 0: //
2732       fQtMax=1.;
2733       fDoQtGammaSelection=kFALSE;
2734       fDoHighPtQtGammaSelection=kFALSE;
2735       fHighPtQtMax=100.;
2736       fPtBorderForQt=100.;
2737       break;
2738    case 1:
2739       fQtMax=0.1;
2740       fDoHighPtQtGammaSelection=kFALSE;
2741       fHighPtQtMax=100.;
2742       fPtBorderForQt=100.;
2743       break;
2744    case 2:
2745       fQtMax=0.07;
2746       fDoHighPtQtGammaSelection=kFALSE;
2747       fHighPtQtMax=100.;
2748       fPtBorderForQt=100.;
2749       break;
2750    case 3:
2751       fQtMax=0.05;
2752       fDoHighPtQtGammaSelection=kFALSE;
2753       fHighPtQtMax=100.;
2754       fPtBorderForQt=100.;
2755       break;
2756    case 4:
2757       fQtMax=0.03;
2758       fDoHighPtQtGammaSelection=kFALSE;
2759       fHighPtQtMax=100.;
2760       fPtBorderForQt=100.;
2761       break;
2762    case 5:
2763       fQtMax=0.02;
2764       fDoHighPtQtGammaSelection=kFALSE;
2765       fHighPtQtMax=100.;
2766       fPtBorderForQt=100.;
2767       break;
2768    case 6:
2769       fQtMax=0.02;
2770       fDoHighPtQtGammaSelection=kTRUE;
2771       fHighPtQtMax=0.06;
2772       fPtBorderForQt=2.5;
2773       break;
2774    case 7:
2775       fQtMax=0.15;
2776       fDoHighPtQtGammaSelection=kFALSE;
2777       fHighPtQtMax=100.;
2778       fPtBorderForQt=100.;
2779       break;
2780    default:
2781       AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2782       return kFALSE;
2783    }
2784    return kTRUE;
2785 }
2786 ///________________________________________________________________________
2787 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2788 {   // Set Cut
2789
2790    switch(chi2GammaCut){
2791    case 0: // 100
2792       fChi2CutConversion = 100.;
2793       break;
2794    case 1:  // 50
2795       fChi2CutConversion = 50.;
2796       break;
2797    case 2:  // 30
2798       fChi2CutConversion = 30.;
2799       break;
2800    case 3:
2801       fChi2CutConversion = 200.;
2802       break;
2803    case 4:
2804       fChi2CutConversion = 500.;
2805       break;
2806    case 5:
2807       fChi2CutConversion = 100000.;
2808       break;
2809    case 6:
2810       fChi2CutConversion = 5.;
2811       break;
2812    case 7:
2813       fChi2CutConversion = 10.;
2814       break;
2815    case 8:
2816       fChi2CutConversion = 20.;
2817       break;
2818    case 9:
2819       fChi2CutConversion = 15.;
2820       break;
2821    default:
2822       AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2823       return kFALSE;
2824    }
2825    return kTRUE;
2826 }
2827 ///________________________________________________________________________
2828 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2829
2830    switch(psiCut) {
2831    case 0:
2832       fPsiPairCut = 10000; //
2833       break;
2834    case 1:
2835       fPsiPairCut = 0.1; //
2836       break;
2837    case 2:
2838       fPsiPairCut = 0.05; // Standard
2839       break;
2840    case 3:
2841       fPsiPairCut = 0.035; //
2842       break;
2843    case 4:
2844       fPsiPairCut = 0.2; //
2845       break;   
2846    case 5:
2847       fPsiPairCut = 0.1; //
2848       fPsiPairDeltaPhiCut = 1;
2849       fDo2DPsiPair = kTRUE;
2850       break;
2851    case 6:
2852       fPsiPairCut = 0.05; //
2853       fPsiPairDeltaPhiCut = 1;
2854       fDo2DPsiPair = kTRUE;
2855       break;
2856    case 7:
2857       fPsiPairCut = 0.035; //
2858       fPsiPairDeltaPhiCut = 1;
2859       fDo2DPsiPair = kTRUE;
2860       break;
2861    case 8:
2862       fPsiPairCut = 0.2; //
2863       fPsiPairDeltaPhiCut = 1;
2864       fDo2DPsiPair = kTRUE; //
2865       break;
2866    case 9:
2867       fPsiPairCut = 0.5; //
2868       break;
2869    default:
2870       AliError(Form("PsiPairCut not defined %d",psiCut));
2871       return kFALSE;
2872    }
2873
2874    return kTRUE;
2875 }
2876 ///________________________________________________________________________
2877 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2878    // Set Cut
2879    switch(doPhotonAsymmetryCut){
2880    case 0:
2881       fDoPhotonAsymmetryCut=0;
2882       fMinPPhotonAsymmetryCut=100.;
2883       fMinPhotonAsymmetry=0.;
2884       break;
2885    case 1:
2886       fDoPhotonAsymmetryCut=1;
2887       fMinPPhotonAsymmetryCut=3.5;
2888       fMinPhotonAsymmetry=0.04;
2889       break;
2890    case 2:
2891       fDoPhotonAsymmetryCut=1;
2892       fMinPPhotonAsymmetryCut=3.5;
2893       fMinPhotonAsymmetry=0.06;
2894       break;
2895    case 3:
2896       fDoPhotonAsymmetryCut=1;
2897       fMinPPhotonAsymmetryCut=0.0;
2898       fMinPhotonAsymmetry=0.05;
2899       break; 
2900    default:
2901       AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2902       return kFALSE;
2903    }
2904    fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2905    return kTRUE;
2906 }
2907 ///________________________________________________________________________
2908 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2909
2910    switch(cosCut){
2911    case 0:
2912       fCosPAngleCut = TMath::Pi(); // -1
2913       break;
2914    case 1:
2915       fCosPAngleCut = 0.1; // 0.99500
2916       break;
2917    case 2:
2918       fCosPAngleCut = 0.05; // 0.99875
2919       break;
2920    case 3:
2921       fCosPAngleCut = 0.025; // 0.99969
2922       break;
2923    case 4:
2924       fCosPAngleCut = 0.01; // 0.99995
2925       break;
2926    case 5:
2927       fCosPAngleCut = 0.2; // 0.98007
2928       break;
2929    case 6:
2930       fCosPAngleCut = 0.5; // 0.87758
2931       break;
2932    case 7:
2933       fCosPAngleCut = 0.075; // 0.73169
2934       break;
2935    default:
2936       AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2937       return kFALSE;
2938    }
2939
2940    return kTRUE;
2941 }
2942 ///________________________________________________________________________
2943 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
2944
2945    switch(sharedElec){
2946    case 0:
2947       fDoSharedElecCut = kFALSE;
2948       break;
2949    case 1:
2950       fDoSharedElecCut = kTRUE;
2951       break;
2952    default:
2953       AliError(Form("Shared Electron Cut not defined %d",sharedElec));
2954       return kFALSE;
2955    }
2956
2957    return kTRUE;
2958 }
2959 ///________________________________________________________________________
2960 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
2961
2962    switch(toClose){
2963    case 0:
2964       fDoToCloseV0sCut = kFALSE;
2965       fminV0Dist = 250;
2966       break;
2967    case 1:
2968       fDoToCloseV0sCut = kTRUE;
2969       fminV0Dist = 1;
2970       break;
2971    case 2:
2972       fDoToCloseV0sCut = kTRUE;
2973       fminV0Dist = 2;
2974       break;
2975    case 3:
2976       fDoToCloseV0sCut = kTRUE;
2977       fminV0Dist = 3;
2978       break;
2979    default:
2980       AliError(Form("Shared Electron Cut not defined %d",toClose));
2981       return kFALSE;
2982    }
2983    return kTRUE;
2984 }
2985 ///________________________________________________________________________
2986 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
2987 {   // Set Cut
2988    switch(TRDElectronCut){
2989    case 0:
2990       fDoTRDPID=kFALSE;
2991       break;
2992    case 1:
2993       fDoTRDPID=kTRUE;
2994       fPIDTRDEfficiency=0.1;
2995       break;
2996    case 8:
2997       fDoTRDPID=kTRUE;
2998       fPIDTRDEfficiency=0.8;
2999       break;
3000    case 9:
3001       fDoTRDPID=kTRUE;
3002       fPIDTRDEfficiency=0.9;
3003       break;
3004    default:
3005       AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3006       return kFALSE;
3007    }
3008
3009    return kTRUE;
3010 }
3011
3012 ///________________________________________________________________________
3013 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3014    // Set Cut
3015    switch(DCAZPhotonPrimVtx){
3016    case 0:  //
3017       fDCAZPrimVtxCut   = 1000;
3018       break;
3019    case 1:  //
3020       fDCAZPrimVtxCut   = 10;
3021       break;
3022    case 2:  //
3023       fDCAZPrimVtxCut   = 5;
3024       break;
3025    case 3:  //
3026       fDCAZPrimVtxCut   = 4;
3027       break;
3028    case 4:  //
3029       fDCAZPrimVtxCut   = 3;
3030       break;
3031    case 5:  //
3032       fDCAZPrimVtxCut   = 2.5;
3033       break;
3034    case 6:  //
3035       fDCAZPrimVtxCut   = 2;
3036       break;
3037    case 7:  //
3038       fDCAZPrimVtxCut   = 1.5;
3039       break;
3040    case 8:  //
3041       fDCAZPrimVtxCut   = 1;
3042       break;
3043    case 9:  //
3044       fDCAZPrimVtxCut   = 0.5;
3045       break;
3046    default:
3047       cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3048       return kFALSE;
3049    }
3050    return kTRUE;
3051 }
3052
3053 ///________________________________________________________________________
3054 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3055    // Set Cut
3056    switch(DCARPhotonPrimVtx){
3057    case 0:  //
3058       fDCARPrimVtxCut   = 1000;
3059       break;
3060    case 1:  //
3061       fDCARPrimVtxCut   = 10;
3062       break;
3063    case 2:  //
3064       fDCARPrimVtxCut   = 5;
3065       break;
3066    case 3:  //
3067       fDCARPrimVtxCut   = 4;
3068       break;
3069    case 4:  //
3070       fDCARPrimVtxCut   = 3;
3071       break;
3072    case 5:  //
3073       fDCARPrimVtxCut   = 2.5;
3074       break;
3075    case 6:  //
3076       fDCARPrimVtxCut   = 2;
3077       break;
3078    case 7:  //
3079       fDCARPrimVtxCut   = 1.5;
3080       break;
3081    case 8:  //
3082       fDCARPrimVtxCut   = 1;
3083       break;
3084    case 9:  //
3085       fDCARPrimVtxCut   = 0.5;
3086       break;
3087    default:
3088       cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3089       return kFALSE;
3090    }
3091    return kTRUE;
3092 }
3093
3094 ///________________________________________________________________________
3095 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3096    // Set Cut
3097    switch(inOutPlane){
3098    case 0:  //
3099       fInPlaneOutOfPlane = 0; // No Event Plane
3100       break;
3101    case 1:  //
3102       fInPlaneOutOfPlane = 1; // In-Plane
3103       break;
3104    case 2:  //
3105       fInPlaneOutOfPlane = 2; // Out-Of-Plane
3106       break;
3107    default:
3108       cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3109       return kFALSE;
3110    }
3111    return kTRUE;
3112 }
3113
3114
3115 //-------------------------------------------------------------
3116 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3117 {   // Get Event Centrality
3118
3119    AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3120    if(esdEvent){
3121       AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3122
3123       if(fDetectorCentrality==0){
3124          if (fIsHeavyIon==2){
3125             return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3126          } else{
3127             return fESDCentrality->GetCentralityPercentile("V0M"); // default
3128          }
3129       }
3130       if(fDetectorCentrality==1){
3131          return fESDCentrality->GetCentralityPercentile("CL1");
3132       }
3133    }
3134
3135    AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3136    if(aodEvent){
3137       if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3138    }
3139
3140    return -1;
3141 }
3142 //-------------------------------------------------------------
3143 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3144 {   // Centrality Selection
3145    if(!fIsHeavyIon)return kTRUE;
3146
3147    if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3148    else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3149
3150    Double_t centrality=GetCentrality(event);
3151    if(centrality<0)return kFALSE;
3152
3153    Int_t centralityC=0;
3154    if (fModCentralityClass == 0){
3155       centralityC= Int_t(centrality/10);
3156       if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3157          return kTRUE;
3158       else return kFALSE;
3159    }
3160    else if (fModCentralityClass ==1){
3161       centralityC= Int_t(centrality);
3162       if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3163          return kTRUE;
3164       } else return kFALSE;
3165    }
3166    else if (fModCentralityClass ==2){
3167       centralityC= Int_t(centrality);
3168       if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3169          return kTRUE;
3170       else return kFALSE;
3171    }
3172
3173    Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3174    Int_t PrimaryTracks10[10][2] =
3175       {
3176          {9999,9999}, //  0
3177          {1210,2150}, // 10
3178          { 817,1435}, // 20
3179          { 536, 930}, // 30
3180          { 337, 570}, // 40
3181          { 197, 327}, // 50
3182          { 106, 173}, // 60
3183          {  51,  81}, // 70
3184          {  21,  34}, // 80
3185          {   0,   0}  // 90
3186       };
3187    Int_t PrimaryTracks5a[10][2] =
3188       {
3189          {9999,9999}, // 0
3190          {1485,2640}, // 5
3191          {1210,2150}, // 10
3192          { 995,1760}, // 15
3193          { 817,1435}, // 20
3194          { 666,1160}, // 25
3195          { 536, 930}, // 30
3196          { 428, 731}, // 35
3197          { 337, 570}, // 40
3198          { 260, 436}  // 45
3199       };
3200    Int_t PrimaryTracks5b[10][2] =
3201       {
3202          { 260, 436}, // 45
3203          { 197, 327}, // 50
3204          { 147, 239}, // 55
3205          { 106, 173}, // 60
3206          {  75, 120}, // 65
3207          {  51,  81}, // 70
3208          {  34,  53}, // 75
3209          {  21,  34}, // 80
3210          {  13,  19}, // 85
3211          {   0,   0}  // 90
3212       };
3213
3214    Int_t column = -1;
3215    if(event->IsA()==AliESDEvent::Class()) column = 0;
3216    if(event->IsA()==AliAODEvent::Class()) column = 1;
3217
3218    if (fModCentralityClass == 3){
3219       if(fMCEvent){
3220          if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3221             return kTRUE;
3222          else return kFALSE;
3223       }
3224       else{
3225          centralityC= Int_t(centrality/10);
3226          if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3227             return kTRUE;
3228          else return kFALSE;
3229       }
3230    }
3231    else if (fModCentralityClass ==4){
3232       if(fMCEvent){
3233          if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3234             return kTRUE;
3235          else return kFALSE;
3236       }
3237       else{
3238          centralityC= Int_t(centrality);
3239          if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3240             return kTRUE;
3241          } else return kFALSE;
3242       }
3243    }
3244    else if (fModCentralityClass ==5){
3245       if(fMCEvent){
3246          if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3247             return kTRUE;
3248          else return kFALSE;
3249       }
3250       else{
3251          centralityC= Int_t(centrality);
3252          if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3253             return kTRUE;
3254          else return kFALSE;
3255       }
3256    }
3257
3258    return kFALSE;
3259 }
3260 ///________________________________________________________________________
3261 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3262    // Cut on z position of primary vertex
3263    Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3264
3265    if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3266
3267    if (fIsHeavyIon == 2){
3268      if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3269      if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3270      if(fUtils->IsPileUpEvent(event)) return kFALSE;
3271    }
3272
3273    return kTRUE;
3274 }
3275 ///________________________________________________________________________
3276
3277 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3278    // returns number of contributors to the vertex
3279
3280    AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3281    if(fESDEvent){
3282       if (fESDEvent->GetPrimaryVertex() != NULL){
3283          if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3284 //     cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3285             return fESDEvent->GetPrimaryVertex()->GetNContributors();
3286          }
3287       }
3288
3289       if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3290          if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3291 //     cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3292             return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3293          }  else {
3294             AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3295 //            cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3296             return 0;
3297          }
3298       }
3299    }
3300
3301    AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3302    if(fAODEvent){
3303       if (fAODEvent->GetPrimaryVertex() != NULL){
3304          if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3305             return fAODEvent->GetPrimaryVertex()->GetNContributors();
3306          }
3307       }
3308       if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3309          if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3310             return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3311          } else {
3312             AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3313             return 0;
3314          }
3315       }
3316    }
3317   // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3318    return 0;
3319 }
3320
3321 ///________________________________________________________________________
3322
3323 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3324 {
3325
3326    AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3327
3328    UInt_t isSelected = AliVEvent::kAny;
3329    if (fInputHandler==NULL) return kFALSE;
3330    if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3331       if (!fTriggerSelectedManually){
3332          if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3333          else {
3334             if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3335                else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3336                else fOfflineTriggerMask = AliVEvent::kMB;
3337          }
3338       }
3339       // Get the actual offline trigger mask for the event and AND it with the
3340       // requested mask. If no mask requested select by default the event.
3341 //       if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3342 //       else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3343
3344       if (fOfflineTriggerMask)
3345          isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3346    }
3347    fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3348
3349    // Fill Histogram
3350    if(hTriggerClass){
3351       if (fIsSDDFired) hTriggerClass->Fill(33);
3352       if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3353       if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3354       if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3355       if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3356       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3357       if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3358       if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3359       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3360       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3361       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3362       if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3363       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3364       if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3365       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3366       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3367       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3368       if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3369       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3370       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3371       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3372       if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3373       if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3374       if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3375       if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3376       if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3377       if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3378       if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3379       if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3380       if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3381       if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3382       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3383       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3384       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3385       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3386       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3387       if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3388       if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3389       if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3390       if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3391       if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3392       if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3393    }
3394
3395    if(hTriggerClassSelected && isSelected){
3396       if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3397       if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3398       if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3399       if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3400       if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3401       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3402       if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3403       if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3404       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3405       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3406       if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3407       if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3408       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3409       if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3410       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3411       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3412       if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3413       if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3414       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3415       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3416       if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3417       if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3418       if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3419       if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3420       if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3421       if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3422       if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3423       if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3424       if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3425       if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3426       if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3427       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3428       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3429       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3430       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3431       if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3432       if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3433       if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3434       if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3435       if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3436       if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3437    }
3438
3439    if(!isSelected)return kFALSE;
3440
3441    return kTRUE;
3442
3443 }
3444
3445 ///________________________________________________________________________
3446 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3447    // Get first TPC row
3448    Int_t firstTPCRow = 0;
3449    Double_t radiusI = 84.8;
3450    Double_t radiusO = 134.6;
3451    Double_t radiusOB = 198.;
3452    Double_t rSizeI = 0.75;
3453    Double_t rSizeO = 1.;
3454    Double_t rSizeOB = 1.5;
3455    Int_t nClsI = 63;
3456    Int_t nClsIO = 127;
3457
3458    if(radius <= radiusI){
3459       return firstTPCRow;
3460    }
3461    if(radius>radiusI && radius<=radiusO){
3462       firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3463    }
3464    if(radius>radiusO && radius<=radiusOB){
3465       firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3466    }
3467
3468    if(radius>radiusOB){
3469       firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3470    }
3471
3472    return firstTPCRow;
3473 }
3474
3475 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3476    ///Check if passes cosine of pointing angle cut
3477    if(GetCosineOfPointingAngle(photon, event) < (TMath::Cos(fCosPAngleCut))){
3478       return kFALSE;
3479    }
3480    return kTRUE;
3481 }
3482
3483 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3484    // calculates the pointing angle of the recalculated V0
3485
3486    Double_t momV0[3] = {0,0,0};
3487    if(event->IsA()==AliESDEvent::Class()){
3488       AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3489       if(!esdEvent) return -999;
3490       AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3491       if(!v0) return -999;
3492       v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3493    }
3494    if(event->IsA()==AliAODEvent::Class()){
3495       momV0[0] = photon->GetPx();
3496       momV0[1] = photon->GetPy();
3497       momV0[2] = photon->GetPz();
3498    }
3499
3500    //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3501    Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3502                          photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3503                          photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3504
3505    Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3506    Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3507
3508
3509    Double_t cosinePointingAngle = -999;
3510    if(momV02*PosV02 > 0.0)
3511       cosinePointingAngle = (PosV0[0]*momV0[0] +  PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3512
3513    return cosinePointingAngle;
3514 }
3515
3516 ///________________________________________________________________________
3517 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon, Double_t deltaPhi) const {
3518
3519 //    cout << fDo2DPsiPair << "\t" << fPsiPairCut << "\t" << fPsiPairDeltaPhiCut << endl;
3520    
3521    if (fDo2DPsiPair){
3522       
3523       if ( (deltaPhi > 0  &&  deltaPhi < fPsiPairDeltaPhiCut) &&
3524         TMath::Abs(photon->GetPsiPair()) < ( fPsiPairCut - fPsiPairCut/fPsiPairDeltaPhiCut * deltaPhi ) ) return kTRUE;
3525       else return kFALSE;
3526    } else {
3527       if(abs(photon->GetPsiPair()) > fPsiPairCut){
3528          return kFALSE;}
3529       else{return kTRUE;}
3530    } 
3531 }
3532
3533 ///________________________________________________________________________
3534 TString AliConversionCuts::GetCutNumber(){
3535    // returns TString with current cut number
3536    TString a(kNCuts);
3537    for(Int_t ii=0;ii<kNCuts;ii++){
3538       a.Append(Form("%d",fCuts[ii]));
3539    }
3540    return a;
3541 }
3542
3543 ///________________________________________________________________________
3544 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3545
3546    Int_t posLabel = photon->GetTrackLabelPositive();
3547    Int_t negLabel = photon->GetTrackLabelNegative();
3548
3549    fElectronLabelArray[nV0*2] = posLabel;
3550    fElectronLabelArray[(nV0*2)+1] = negLabel;
3551 }
3552 ///________________________________________________________________________
3553 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3554
3555    Int_t posLabel = photon->GetTrackLabelPositive();
3556    Int_t negLabel = photon->GetTrackLabelNegative();
3557
3558    for(Int_t i = 0; i<nV0s*2;i++){
3559       if(i==nV0*2)     continue;
3560       if(i==(nV0*2)+1) continue;
3561       if(fElectronLabelArray[i] == posLabel){
3562          return kFALSE;}
3563       if(fElectronLabelArray[i] == negLabel){
3564          return kFALSE;}
3565    }
3566
3567    return kTRUE;
3568 }
3569 ///________________________________________________________________________
3570 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3571
3572
3573    Double_t posX = photon->GetConversionX();
3574    Double_t posY = photon->GetConversionY();
3575    Double_t posZ = photon->GetConversionZ();
3576
3577    for(Int_t i = 0;i<photons->GetEntries();i++){
3578       if(nV0 == i) continue;
3579       AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3580       Double_t posCompX = photonComp->GetConversionX();
3581       Double_t posCompY = photonComp->GetConversionY();
3582       Double_t posCompZ = photonComp->GetConversionZ();
3583
3584       Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3585
3586       if(dist < fminV0Dist*fminV0Dist){
3587          if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3588          else {
3589             return kFALSE;}
3590       }
3591
3592    }
3593    return kTRUE;
3594 }
3595 ///________________________________________________________________________
3596 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3597
3598
3599
3600    if(fNotRejectedStart){
3601       delete[] fNotRejectedStart;
3602       fNotRejectedStart = NULL;
3603    }
3604    if(fNotRejectedEnd){
3605       delete[] fNotRejectedEnd;
3606       fNotRejectedEnd = NULL;
3607    }
3608    if(fGeneratorNames){
3609       delete[] fGeneratorNames;
3610       fGeneratorNames = NULL;
3611    }
3612
3613    if(rejection == 0) return; // No Rejection
3614
3615    AliGenCocktailEventHeader *cHeader = 0x0;
3616    AliAODMCHeader *cHeaderAOD = 0x0;
3617    Bool_t headerFound = kFALSE;
3618
3619    if(MCEvent->IsA()==AliMCEvent::Class()){
3620       cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3621       if(cHeader) headerFound = kTRUE;
3622    }
3623    if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3624       cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3625       if(cHeaderAOD) headerFound = kTRUE;
3626    }
3627
3628    if(headerFound){
3629       TList *genHeaders = 0x0;
3630       if(cHeader) genHeaders = cHeader->GetHeaders();
3631       if(cHeaderAOD){
3632          genHeaders = cHeaderAOD->GetCocktailHeaders();
3633          if(genHeaders->GetEntries()==1){
3634             SetRejectExtraSignalsCut(0);
3635             return;
3636          }
3637       }
3638       AliGenEventHeader* gh = 0;
3639       fnHeaders = 0;
3640       if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3641       if(rejection == 2){ // TList of Headers Names
3642          for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3643             gh = (AliGenEventHeader*)genHeaders->At(i);
3644             TString GeneratorName = gh->GetName();
3645             for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3646                TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3647                if(GeneratorName.CompareTo(GeneratorInList) == 0){
3648                   fnHeaders++;
3649                   continue;
3650                }
3651             }
3652          }
3653       }
3654
3655       fNotRejectedStart = new Int_t[fnHeaders];
3656       fNotRejectedEnd = new Int_t[fnHeaders];
3657       fGeneratorNames = new TString[fnHeaders];
3658
3659       if(rejection == 1 || rejection == 3){
3660          fNotRejectedStart[0] = 0;
3661          fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3662          fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3663          return;
3664       }
3665
3666       Int_t firstindex = 0;
3667       Int_t lastindex =  -1;
3668       Int_t nummer = 0;
3669       for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3670          gh = (AliGenEventHeader*)genHeaders->At(i);
3671          TString GeneratorName = gh->GetName();
3672          lastindex = lastindex + gh->NProduced();
3673          for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3674             TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3675             if(GeneratorName.CompareTo(GeneratorInList) == 0){
3676                fNotRejectedStart[nummer] = firstindex;
3677                fNotRejectedEnd[nummer] = lastindex;
3678                fGeneratorNames[nummer] = GeneratorName;
3679                //cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3680                nummer++;
3681                continue;
3682             }
3683          }
3684          firstindex = firstindex + gh->NProduced();
3685       }
3686    } else { // No Cocktail Header Found
3687       fNotRejectedStart = new Int_t[1];
3688       fNotRejectedEnd = new Int_t[1];
3689
3690       fnHeaders = 1;
3691       fNotRejectedStart[0] = 0;
3692       fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3693       fGeneratorNames = new TString[1];
3694       fGeneratorNames[0] = "NoCocktailGeneratorFound";
3695
3696       AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3697       if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3698       AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3699       if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3700       AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3701       if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3702
3703       SetRejectExtraSignalsCut(0);
3704    }
3705
3706 }
3707 //_________________________________________________________________________
3708 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3709
3710    // Not Accepted == kFALSE == 0
3711    //     Accepted ==  kTRUE == 1
3712    //  FirstHeader ==  kTRUE == 3
3713    if(index < 0) return 0; // No Particle
3714
3715    Int_t accepted = 0;
3716    if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3717       if( index >= MCStack->GetNprimary()){ // Secondary Particle
3718          if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3719          return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3720       }
3721       for(Int_t i = 0;i<fnHeaders;i++){
3722          if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3723             accepted = 1;
3724             if(i == 0) accepted = 2; // MB Header
3725          }
3726       }
3727    }
3728    else if(InputEvent->IsA()==AliAODEvent::Class()){
3729       TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3730       AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3731       if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3732       if(!aodMCParticle->IsPrimary()){
3733          if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3734          return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3735       }
3736       index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3737       for(Int_t i = 0;i<fnHeaders;i++){
3738          if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3739             accepted = 1;
3740             if(i == 0) accepted = 2; // MB Header
3741          }
3742       }
3743    }
3744
3745    return accepted;
3746 }
3747 //_________________________________________________________________________
3748 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Bool_t isHeavyIon){
3749
3750    if ( !IsTriggerSelected(InputEvent) )
3751       return 3;
3752
3753    if(isHeavyIon && !(IsCentralitySelected(InputEvent,MCEvent)))
3754       return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3755
3756    if(!isHeavyIon && GetIsFromPileup()){
3757       if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3758
3759          return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3760       }
3761    }
3762
3763    Bool_t hasV0And = ReaderCuts->HasV0AND();
3764    Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3765    if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
3766       return 7; // With SDD requested but no fired
3767
3768    if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3769       return 8; // V0AND requested but no fired
3770
3771
3772    return 0;
3773 }
3774 //_________________________________________________________________________
3775 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3776    if (!(period.CompareTo("LHC12f1a") == 0 || period.CompareTo("LHC12f1b") == 0  || period.CompareTo("LHC12i3") == 0 || period.CompareTo("LHC11a10a") == 0 || period.CompareTo("LHC11a10b") == 0 || period.CompareTo("LHC11a10b_bis") == 0 || period.CompareTo("LHC11a10a_bis") == 0 || period.CompareTo("LHC11a10b_plus") == 0 || period.Contains("LHC13d2"))) return 1.;
3777
3778    Int_t kCaseGen = 0;
3779    for (Int_t i = 0; i < fnHeaders; i++){
3780       if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
3781          if (fGeneratorNames[i].CompareTo("Pythia") == 0){
3782             kCaseGen = 1;
3783          } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
3784             kCaseGen = 2;
3785          } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
3786                     fGeneratorNames[i].CompareTo("Hijing") == 0 ||
3787                     fGeneratorNames[i].Contains("hijing")){
3788             kCaseGen = 3;
3789          } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
3790              kCaseGen = 4;
3791          } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
3792             kCaseGen = 5;
3793          } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
3794             kCaseGen = 6;
3795          } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
3796             kCaseGen = 1;
3797          } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
3798             kCaseGen = 2;
3799          } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
3800             kCaseGen = 3;
3801          }
3802          if (period.Contains("LHC13d2")){
3803             kCaseGen = 3;
3804          }
3805       }
3806    }
3807    if (kCaseGen == 0) return 1;
3808
3809
3810    Double_t mesonPt = 0;
3811    Double_t mesonMass = 0;
3812    Int_t PDGCode = 0;
3813    if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3814       mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
3815       mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
3816       PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
3817    }
3818    else if(InputEvent->IsA()==AliAODEvent::Class()){
3819       TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3820       AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3821       mesonPt = aodMCParticle->Pt();
3822       mesonMass = aodMCParticle->GetCalcMass();
3823       PDGCode = aodMCParticle->GetPdgCode();
3824    }
3825
3826    Float_t functionResultMC = 1.;
3827    if (kCaseGen == 1){ // Pythia 6
3828       Float_t dNdyMC = 2.1462;
3829       Float_t nMC = 7.06055;
3830       Float_t tMC = 0.12533;
3831       if ( PDGCode ==  111){
3832          dNdyMC = 2.1462;
3833          nMC = 7.06055;
3834          tMC = 0.12533;
3835       } else if ( PDGCode ==  221){
3836          dNdyMC = 0.2357;
3837          nMC = 5.9105;
3838          tMC = 0.1525;
3839       }
3840       functionResultMC = dNdyMC / ( 2 * TMath::Pi())*(nMC-1.)*(nMC-2.) / (nMC*tMC*(nMC*tMC+mesonMass*(nMC-2.)))  * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nMC*tMC), -nMC);
3841    } else if (kCaseGen == 2){ // Phojet
3842       Float_t dNdyMC = 2.35978;
3843       Float_t nMC = 6.81795;
3844       Float_t tMC = 0.11492;
3845       if ( PDGCode ==  111){
3846          dNdyMC = 2.35978;
3847          nMC = 6.81795;
3848          tMC = 0.11492;
3849       } else if ( PDGCode ==  221){
3850          dNdyMC = 0.3690;
3851          nMC = 5.55809;
3852          tMC = 0.13387;
3853       }
3854       functionResultMC = dNdyMC / ( 2 * TMath::Pi())*(nMC-1.)*(nMC-2.) / (nMC*tMC*(nMC*tMC+mesonMass*(nMC-2.)))  * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nMC*tMC), -nMC);
3855    } else if (kCaseGen == 4){ // BOX generators pp
3856 //       functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
3857       Float_t a = 0.23437;
3858       Float_t b = 5.6661;
3859       Float_t c = -1430.5863;
3860       Float_t d = -0.6966624;
3861       Float_t e = 252.3742;
3862       if ( PDGCode ==  111){
3863          a = 0.23437;
3864          b = 5.6661;
3865          c = -1430.5863;
3866          d = -0.6966624;
3867          e = 252.3742;
3868       } else if ( PDGCode ==  221){
3869          a = 0.10399;
3870          b = 4.35311;
3871          c = -12.17723;
3872          d = -0.01172;
3873          e =1.85140;
3874       }
3875       functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
3876 //       cout << functionResultMC << endl;
3877    } else if (kCaseGen == 3 ){ // HIJING
3878       if ( PDGCode ==  111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
3879          functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
3880       }
3881       if ( PDGCode ==  221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
3882          functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
3883       }
3884       if ( PDGCode ==  310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
3885          functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
3886       }
3887    }
3888
3889    Float_t functionResultData = 1;
3890    if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
3891       Float_t dNdyData = 2.2328;
3892       Float_t nData = 7.1473;
3893       Float_t tData = 0.1346;
3894       if ( PDGCode ==  111){
3895          dNdyData = 2.2328;
3896          nData = 7.1473;
3897          tData = 0.1346;
3898       } else if ( PDGCode ==  221){
3899          dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
3900          nData = 5.72778;
3901          tData = 0.13835;
3902       }
3903       functionResultData = dNdyData / ( 2 * TMath::Pi())*(nData-1.)*(nData-2.) / (nData*tData*(nData*tData+mesonMass*(nData-2.)))  * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nData*tData), -nData);
3904 //       cout << functionResultData << endl;
3905    } else {
3906       if ( PDGCode ==  111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
3907          functionResultData = fFitDataPi0->Eval(mesonPt);
3908       }
3909       if ( PDGCode ==  221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
3910          functionResultData = fFitDataEta->Eval(mesonPt);
3911       }
3912       if ( PDGCode ==  310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
3913          functionResultData = fFitDataK0s->Eval(mesonPt);
3914       }
3915
3916    }
3917
3918    Double_t weight = 1;
3919    if (PDGCode ==  111 || PDGCode ==  221){
3920       if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
3921          weight = functionResultData/functionResultMC;
3922          if ( kCaseGen == 3){
3923             if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode ==  111)){
3924                weight = 1.;
3925             }
3926          }
3927          if (!isfinite(functionResultData)) weight = 1.;
3928          if (!isfinite(weight)) weight = 1.;
3929       }
3930    } else if (PDGCode ==  310 && functionResultMC != 0 && isfinite(functionResultMC)){
3931         weight = functionResultMC;
3932    }
3933
3934 //    if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode ==  111){
3935 //        cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
3936 //    }
3937    return weight;
3938 }
3939 ///________________________________________________________________________
3940 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
3941     //Create and return standard 2010 PbPb cuts
3942     AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
3943     if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
3944    cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
3945     return cuts;
3946 }
3947
3948 ///________________________________________________________________________
3949 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
3950     //Create and return standard 2010 PbPb cuts
3951     AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
3952     if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
3953    cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
3954     return cuts;
3955 }
3956 ///________________________________________________________________________
3957 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
3958
3959    if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
3960       periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
3961       periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
3962       periodName.CompareTo("LHC13d") == 0 || //mainly triggered
3963       periodName.CompareTo("LHC13e") == 0 || //mainly triggered
3964       periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
3965       periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
3966       periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
3967       periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
3968       periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
3969       periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
3970       periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
3971       periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
3972       periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
3973       periodName.CompareTo("LHC13b2") == 0 ||  // MC DPMJET, wrong energy, anchor LHC13b
3974       periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
3975       periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
3976       periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
3977       periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
3978       periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
3979       periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
3980       periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
3981       periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
3982       periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
3983       periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
3984       periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
3985       periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
3986       periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
3987       periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
3988       {
3989          printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
3990          SetEtaShift(-0.465);
3991       }
3992    else if(periodName.CompareTo("LHC13f") == 0 ||
3993            periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
3994            periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
3995            periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
3996       {
3997          printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
3998          SetEtaShift(+0.465);
3999       }
4000    else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4001 }
4002
4003 ///________________________________________________________________________
4004 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4005    
4006    //GetPhotonPhi() 0-2 Pi  //eventPlaneAngle -1pi-1pi
4007    eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4008    Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4009    if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4010    gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4011
4012    if(!fInPlaneOutOfPlane){
4013       if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4014       return kTRUE;
4015    }
4016    else if(fInPlaneOutOfPlane == 1){
4017       if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4018          if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4019          return kTRUE;
4020       }
4021       else return kFALSE;
4022    }
4023    else if(fInPlaneOutOfPlane == 2){
4024       if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4025          if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4026          return kTRUE;
4027       }
4028       else return kFALSE;
4029    }
4030    return kFALSE;
4031
4032 }
4033