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