AliPhysics  4a7363b (4a7363b)
AliConversionPhotonCuts.cxx
Go to the documentation of this file.
1 /****************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Authors: Friederike Bock *
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 
17 //---------------------------------------------
18 // Class handling photon selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
22 
24 
25 #include "AliKFVertex.h"
26 #include "AliAODTrack.h"
27 #include "AliAODv0.h"
28 #include "AliAODEvent.h"
29 #include "AliESDtrack.h"
30 #include "AliAnalysisManager.h"
31 #include "AliInputEventHandler.h"
32 #include "AliMCEventHandler.h"
33 #include "AliAODHandler.h"
34 #include "AliPIDResponse.h"
35 #include "TH1.h"
36 #include "TH2.h"
37 #include "TF1.h"
38 #include "TProfile.h"
39 #include "AliMCEvent.h"
40 #include "AliAODConversionMother.h"
41 #include "TObjString.h"
42 #include "AliAODEvent.h"
43 #include "AliESDEvent.h"
44 #include "AliCentrality.h"
45 #include "TList.h"
46 #include "TFile.h"
47 #include "AliLog.h"
48 #include "AliGenCocktailEventHeader.h"
49 #include "AliGenDPMjetEventHeader.h"
50 #include "AliGenPythiaEventHeader.h"
51 #include "AliGenHijingEventHeader.h"
52 #include "AliTriggerAnalysis.h"
53 #include "AliV0ReaderV1.h"
54 #include "AliAODMCParticle.h"
55 #include "AliAODMCHeader.h"
56 #include "AliTRDTriggerAnalysis.h"
57 
58 class iostream;
59 
60 using namespace std;
61 
65 
66 const char* AliConversionPhotonCuts::fgkCutNames[AliConversionPhotonCuts::kNCuts] = {
67  "V0FinderType", // 0
68  "EtaCut", // 1
69  "MinRCut", // 2
70  "EtaForPhiCut", // 3
71  "MinPhiCut", // 4
72  "MaxPhiCut", // 5
73  "SinglePtCut", // 6
74  "ClsTPCCut", // 7
75  "ededxSigmaCut", // 8
76  "pidedxSigmaCut", // 9
77  "piMomdedxSigmaCut", // 10
78  "piMaxMomdedxSigmaCut", // 11
79  "LowPRejectionSigmaCut", // 12
80  "TOFelectronPID", // 13
81  "ITSelectronPID", // 14 -- new ITS PID
82  "TRDelectronPID", // 15 -- new TRD PID
83  "QtMaxCut", // 16
84  "Chi2GammaCut", // 17
85  "PsiPair", // 18
86  "DoPhotonAsymmetryCut", // 19
87  "CosinePointingAngle", // 20
88  "SharedElectronCuts", // 21
89  "RejectToCloseV0s", // 22
90  "DcaRPrimVtx", // 23
91  "DcaZPrimVtx", // 24
92  "EvetPlane" // 25
93 };
94 
95 
96 //________________________________________________________________________
98  AliAnalysisCuts(name,title),
99  fHistograms(NULL),
100  fPIDResponse(NULL),
101  fDoLightOutput(kFALSE),
102  fV0ReaderName("V0ReaderV1"),
103  fMaxR(200),
104  fMinR(0),
105  fEtaCut(0.9),
106  fEtaCutMin(-0.1),
107  fEtaForPhiCutMin(-10.),
108  fEtaForPhiCutMax(10.),
109  fMinPhiCut(0.),
110  fMaxPhiCut(100.),
111  fDoShrinkTPCAcceptance(kFALSE),
112  fPtCut(0.02),
113  fSinglePtCut(0),
114  fSinglePtCut2(0),
115  fDoAsymPtCut(kFALSE),
116  fMaxZ(1000),
117  fMinClsTPC(0.),
118  fMinClsTPCToF(0.),
119  fLineCutZRSlope(0.),
120  fLineCutZValue(0),
121  fLineCutZRSlopeMin(0.),
122  fLineCutZValueMin(0),
123  fChi2CutConversion(1000),
124  fPIDProbabilityCutNegativeParticle(0),
125  fPIDProbabilityCutPositiveParticle(0),
126  fDodEdxSigmaCut(kTRUE),
127  fDoTOFsigmaCut(kFALSE),
128  fPIDTRDEfficiency(1),
129  fDoTRDPID(kFALSE),
130  fPIDnSigmaAboveElectronLine(100),
131  fPIDnSigmaBelowElectronLine(-100),
132  fTofPIDnSigmaAboveElectronLine(100),
133  fTofPIDnSigmaBelowElectronLine(-100),
134  fPIDnSigmaAbovePionLine(0),
135  fPIDnSigmaAbovePionLineHighPt(-100),
136  fPIDMinPnSigmaAbovePionLine(0),
137  fPIDMaxPnSigmaAbovePionLine(0),
138  fDoKaonRejectionLowP(kFALSE),
139  fDoProtonRejectionLowP(kFALSE),
140  fDoPionRejectionLowP(kFALSE),
141  fPIDnSigmaAtLowPAroundKaonLine(0),
142  fPIDnSigmaAtLowPAroundProtonLine(0),
143  fPIDnSigmaAtLowPAroundPionLine(0),
144  fPIDMinPKaonRejectionLowP(1.5),
145  fPIDMinPProtonRejectionLowP(2),
146  fPIDMinPPionRejectionLowP(0),
147  fDoQtGammaSelection(kTRUE),
148  fDo2DQt(kFALSE),
149  fQtMax(100),
150  fNSigmaMass(0.),
151  fUseEtaMinCut(kFALSE),
152  fUseOnFlyV0Finder(kTRUE),
153  fUseOnFlyV0FinderSameSign(0),
154  fDoPhotonAsymmetryCut(kTRUE),
155  fDoPhotonPDependentAsymCut(kFALSE),
156  fFAsymmetryCut(0),
157  fMinPPhotonAsymmetryCut(100.),
158  fMinPhotonAsymmetry(0.),
159  fUseCorrectedTPCClsInfo(kFALSE),
160  fUseTOFpid(kFALSE),
161  fOpeningAngle(0.005),
162  fPsiPairCut(10000),
163  fDo2DPsiPairChi2(kFALSE),
164  fIncludeRejectedPsiPair(kFALSE),
165  fCosPAngleCut(10000),
166  fDoToCloseV0sCut(kFALSE),
167  fminV0Dist(200.),
168  fDoSharedElecCut(kFALSE),
169  fDoPhotonQualitySelectionCut(kFALSE),
170  fPhotonQualityCut(0),
171  fRandom(0),
172  fElectronArraySize(500),
173  fElectronLabelArray(NULL),
174  fDCAZPrimVtxCut(1000),
175  fDCARPrimVtxCut(1000),
176  fInPlaneOutOfPlane(0),
177  fConversionPointXArray(0.0),
178  fConversionPointYArray(0.0),
179  fConversionPointZArray(0.0),
180  fCutString(NULL),
181  fCutStringRead(""),
182  fIsHeavyIon(0),
183  fUseITSpid(kFALSE),
184  fITSPIDnSigmaAboveElectronLine(100),
185  fITSPIDnSigmaBelowElectronLine(-100),
186  fMaxPtPIDITS(1.5),
187  fTRDPIDAboveCut(100),
188  fTRDPIDBelowCut(-100),
189  fDoDoubleCountingCut(kFALSE),
190  fMinRDC(0.),
191  fDeltaR(0.),
192  fOpenAngle(0.),
193  fSwitchToKappa(kFALSE),
194  fKappaMinCut(-1),
195  fKappaMaxCut(1000),
196  fDoElecDeDxPostCalibration(kFALSE),
197  fHistoEtaDistV0s(NULL),
198  fHistoEtaDistV0sAfterdEdxCuts(NULL),
199  fHistodEdxCuts(NULL),
200  fHistoTPCdEdxbefore(NULL),
201  fHistoTPCdEdxafter(NULL),
202  fHistoTPCdEdxSigbefore(NULL),
203  fHistoTPCdEdxSigafter(NULL),
204  fHistoKappaafter(NULL),
205  fHistoTOFbefore(NULL),
206  fHistoTOFSigbefore(NULL),
207  fHistoTOFSigafter(NULL),
208  fHistoITSSigbefore(NULL),
209  fHistoITSSigafter(NULL),
210  fHistoPsiPairDeltaPhiafter(NULL),
211  fHistoTrackCuts(NULL),
212  fHistoPhotonCuts(NULL),
213  fHistoInvMassbefore(NULL),
214  fHistoArmenterosbefore(NULL),
215  fHistoInvMassafter(NULL),
216  fHistoArmenterosafter(NULL),
217  fHistoAsymmetrybefore(NULL),
218  fHistoAsymmetryafter(NULL),
219  fHistoAcceptanceCuts(NULL),
220  fHistoCutIndex(NULL),
221  fHistoEventPlanePhi(NULL),
222  fPreSelCut(kFALSE),
223  fProcessAODCheck(kFALSE),
224  fMaterialBudgetWeightsInitialized(kFALSE),
225  fProfileContainingMaterialBudgetWeights(NULL),
226  fElecDeDxPostCalibrationInitialized(kFALSE),
227  fnRBins(4),
228  fHistoEleMapMean(NULL),
229  fHistoEleMapWidth(NULL),
230  fHistoPosMapMean(NULL),
231  fHistoPosMapWidth(NULL)
232 {
233  InitPIDResponse();
234  for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
235  fCutString=new TObjString((GetCutNumber()).Data());
236 
238 
239  fHistoEleMapMean = new TH2F*[fnRBins];
241  fHistoPosMapMean = new TH2F*[fnRBins];
243 
244  for (Int_t i = 0; i < fnRBins; i++) {
245  fHistoEleMapMean[i] = NULL;
246  fHistoEleMapWidth[i] = NULL;
247  fHistoPosMapMean[i] = NULL;
248  fHistoPosMapWidth[i] = NULL;
249  }
250 }
251 
252 //________________________________________________________________________
254  AliAnalysisCuts(ref),
255  fHistograms(NULL),
256  fPIDResponse(NULL),
258  fV0ReaderName("V0ReaderV1"),
259  fMaxR(ref.fMaxR),
260  fMinR(ref.fMinR),
261  fEtaCut(ref.fEtaCut),
262  fEtaCutMin(ref.fEtaCutMin),
265  fMinPhiCut(ref.fMinPhiCut),
266  fMaxPhiCut(ref.fMaxPhiCut),
268  fPtCut(ref.fPtCut),
272  fMaxZ(ref.fMaxZ),
273  fMinClsTPC(ref.fMinClsTPC),
285  fDoTRDPID(ref.fDoTRDPID),
304  fDo2DQt(ref.fDo2DQt),
305  fQtMax(ref.fQtMax),
316  fUseTOFpid(ref.fUseTOFpid),
323  fminV0Dist(ref.fminV0Dist),
327  fRandom(ref.fRandom),
329  fElectronLabelArray(NULL),
336  fCutString(NULL),
337  fCutStringRead(""),
339  fUseITSpid(ref.fUseITSpid),
346  fMinRDC(ref.fMinRDC),
347  fDeltaR(ref.fDeltaR),
348  fOpenAngle(ref.fOpenAngle),
353  fHistoEtaDistV0s(NULL),
355  fHistodEdxCuts(NULL),
356  fHistoTPCdEdxbefore(NULL),
357  fHistoTPCdEdxafter(NULL),
359  fHistoTPCdEdxSigafter(NULL),
360  fHistoKappaafter(NULL),
361  fHistoTOFbefore(NULL),
362  fHistoTOFSigbefore(NULL),
363  fHistoTOFSigafter(NULL),
364  fHistoITSSigbefore(NULL),
365  fHistoITSSigafter(NULL),
367  fHistoTrackCuts(NULL),
368  fHistoPhotonCuts(NULL),
369  fHistoInvMassbefore(NULL),
371  fHistoInvMassafter(NULL),
372  fHistoArmenterosafter(NULL),
373  fHistoAsymmetrybefore(NULL),
374  fHistoAsymmetryafter(NULL),
375  fHistoAcceptanceCuts(NULL),
376  fHistoCutIndex(NULL),
377  fHistoEventPlanePhi(NULL),
378  fPreSelCut(ref.fPreSelCut),
383  fnRBins(ref.fnRBins),
388 {
389  // Copy Constructor
390  for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
391  fCutString=new TObjString((GetCutNumber()).Data());
393  // dont copy histograms (if you like histograms, call InitCutHistograms())
394 }
395 
396 
397 //________________________________________________________________________
399  // Destructor
400  //Deleting fHistograms leads to seg fault it it's added to output collection of a task
401  // if(fHistograms)
402  // delete fHistograms;
403  // fHistograms = NULL;
404  if(fCutString != NULL){
405  delete fCutString;
406  fCutString = NULL;
407  }
409  delete fElectronLabelArray;
410  fElectronLabelArray = NULL;
411  }
412 
413  if(fFAsymmetryCut != NULL){
414  delete fFAsymmetryCut;
415  fFAsymmetryCut = NULL;
416  }
420  }
421 
422  // if( fHistoEleMapMean != NULL){
423  // delete fHistoEleMapMean;
424  // fHistoEleMapMean =NULL;
425  // }
426 
427  for (Int_t i = 0; i < fnRBins; i++) {
428  if( fHistoEleMapMean[i] != NULL){
429  delete fHistoEleMapMean[i] ;
430  fHistoEleMapMean[i] =NULL;
431  }
432  if( fHistoEleMapWidth[i] != NULL){
433  delete fHistoEleMapWidth[i] ;
434  fHistoEleMapWidth[i] =NULL;
435  }
436 
437  if( fHistoPosMapMean[i] != NULL){
438  delete fHistoPosMapMean[i] ;
439  fHistoPosMapMean[i] =NULL;
440  }
441  if( fHistoPosMapWidth[i] != NULL){
442  delete fHistoPosMapWidth[i] ;
443  fHistoPosMapWidth[i] =NULL;
444  }
445 
446  }
447 
448 
449 }
450 
451 //________________________________________________________________________
453 
454  // Initialize Cut Histograms for QA (only initialized and filled if function is called)
455  TH1::AddDirectory(kFALSE);
456 
457  if(fHistograms != NULL){
458  delete fHistograms;
459  fHistograms=NULL;
460  }
461  if(fHistograms==NULL){
462  fHistograms=new TList();
463  fHistograms->SetOwner(kTRUE);
464  if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
465  else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
466  }
467 
468  // IsPhotonSelected
469  fHistoCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",12,-0.5,11.5);
470  fHistoCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
471  fHistoCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
472  fHistoCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
473  fHistoCutIndex->GetXaxis()->SetBinLabel(kNoV0+1,"miss. V0 in AOD");
474  if (!fSwitchToKappa)fHistoCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"PID");
475  else fHistoCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"Kappa+[TOF,ITS,TRD] PID");
476  fHistoCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
477  fHistoCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
478  fHistoCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
479  fHistoCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
480  fHistoCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
482 
483  // Track Cuts
484  fHistoTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
485  fHistoTrackCuts->GetXaxis()->SetBinLabel(1,"in");
486  fHistoTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
487  fHistoTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
488  fHistoTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
489  fHistoTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
490  fHistoTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
491  fHistoTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
492  fHistoTrackCuts->GetXaxis()->SetBinLabel(8,"out");
494 
495  // Photon Cuts
496  fHistoPhotonCuts=new TH2F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts vs p_{T,#gamma}",15,-0.5,14.5,250,0,50);
497  fHistoPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
498  fHistoPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
499  fHistoPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
500  fHistoPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
501  fHistoPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
502  fHistoPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
503  fHistoPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
504  fHistoPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
505  fHistoPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
506  fHistoPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
507  fHistoPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
508  fHistoPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality");
509  fHistoPhotonCuts->GetXaxis()->SetBinLabel(13,"out");
511 
513  fProfileContainingMaterialBudgetWeights->SetName("InputMaterialBudgetWeightsPerGamma");
515  }
516 
518  for (Int_t i = 0; i < fnRBins; i++) {
519  if( fHistoEleMapMean[i] ){
520  fHistograms->Add(fHistoEleMapMean[i]);
521  }
522  if( fHistoEleMapWidth[i]){
524  }
525  if(fHistoPosMapMean[i]){
526  fHistograms->Add(fHistoPosMapMean[i]);
527  }
528  if( fHistoPosMapWidth[i]){
530  }
531  }
532  }
533 
534  if(!fDoLightOutput){
535 
536  if(preCut){
537  fHistoInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
539  fHistoArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
541  fHistoEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
543  fHistoAsymmetrybefore=new TH2F(Form("Asymmetry_before %s",GetCutNumber().Data()),"Asymmetry_before",150,0.03,20.,200,0,1.);
545  }
546  fHistoInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
548  fHistoArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
550  // AM - save always to see distribution after selections cut
551  // if(fDoPhotonAsymmetryCut){
552  fHistoAsymmetryafter=new TH2F(Form("Asymmetry_after %s",GetCutNumber().Data()),"Asymmetry_after",150,0.03,20.,200,0,1.);
554  // }
555  }
556 
557  fHistoAcceptanceCuts=new TH2F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts vs p_{T,#gamma}",11,-0.5,10.5,250,0,50);
558  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
559  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
560  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
561  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
562  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
563  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
564  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(7,"phisector");
565  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(8,"minpt");
566  fHistoAcceptanceCuts->GetXaxis()->SetBinLabel(9,"out");
568 
569  // dEdx Cuts
570  fHistodEdxCuts=new TH2F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts vs p_{T,e}",11,-0.5,10.5,250,0,50);
571  fHistodEdxCuts->GetXaxis()->SetBinLabel(1,"in");
572  fHistodEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
573  fHistodEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
574  fHistodEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
575  fHistodEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
576  fHistodEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
577  fHistodEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
578  fHistodEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
579  fHistodEdxCuts->GetXaxis()->SetBinLabel(9,"ITSelectron");
580  fHistodEdxCuts->GetXaxis()->SetBinLabel(10,"TRDelectron");
581  fHistodEdxCuts->GetXaxis()->SetBinLabel(11,"out");
583 
584  if(!fDoLightOutput){
585  TAxis *AxisBeforedEdx = NULL;
586  TAxis *AxisBeforedEdxSig = NULL;
587  TAxis *AxisBeforeTOF = NULL;
588  TAxis *AxisBeforeTOFSig = NULL;
589  TAxis *AxisBeforeITSSig = NULL;
590  TAxis *AxisBeforeAsymmetry = NULL;
591 
592  if(preCut){
593  fHistoTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
595  AxisBeforedEdx = fHistoTPCdEdxbefore->GetXaxis();
596  fHistoTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
598  AxisBeforedEdxSig = fHistoTPCdEdxSigbefore->GetXaxis();
599 
600  fHistoTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
602  AxisBeforeTOF = fHistoTOFbefore->GetXaxis();
603  fHistoTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
605  AxisBeforeTOFSig = fHistoTOFSigbefore->GetXaxis();
606 
607  fHistoITSSigbefore=new TH2F(Form("Gamma_ITSSig_before %s",GetCutNumber().Data()),"ITS Sigma Gamma before" ,150,0.03,20,400,-10,10);
609  AxisBeforeITSSig = fHistoITSSigbefore->GetXaxis();
610 
611  AxisBeforeAsymmetry = fHistoAsymmetrybefore->GetXaxis();
612  }
613 
614  fHistoTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
616 
617  fHistoTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
619 
620  fHistoKappaafter=new TH2F(Form("Gamma_Kappa_after %s",GetCutNumber().Data()),"Kappa Gamma after" ,150,0.03,20,200,-20,20);
622 
623  fHistoTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
625 
626  fHistoITSSigafter=new TH2F(Form("Gamma_ITSSig_after %s",GetCutNumber().Data()),"ITS Sigma Gamma after" ,150,0.03,20,400,-10,10);
628 
629  fHistoEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
631 
632  fHistoPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
634 
635  TAxis *AxisAfter = fHistoTPCdEdxSigafter->GetXaxis();
636  Int_t bins = AxisAfter->GetNbins();
637  Double_t from = AxisAfter->GetXmin();
638  Double_t to = AxisAfter->GetXmax();
639  Double_t *newBins = new Double_t[bins+1];
640  newBins[0] = from;
641  Double_t factor = TMath::Power(to/from, 1./bins);
642  for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
643  AxisAfter->Set(bins, newBins);
644  AxisAfter = fHistoTOFSigafter->GetXaxis();
645  AxisAfter->Set(bins, newBins);
646  AxisAfter = fHistoTPCdEdxafter->GetXaxis();
647  AxisAfter->Set(bins, newBins);
648  AxisAfter = fHistoKappaafter->GetXaxis();
649  AxisAfter->Set(bins, newBins);
650  AxisAfter = fHistoITSSigafter->GetXaxis();
651  AxisAfter->Set(bins, newBins);
652  // if(fDoPhotonAsymmetryCut){
653  AxisAfter = fHistoAsymmetryafter->GetXaxis();
654  AxisAfter->Set(bins, newBins);
655  // }
656  if(preCut){
657  AxisBeforedEdx->Set(bins, newBins);
658  AxisBeforeTOF->Set(bins, newBins);
659  AxisBeforedEdxSig->Set(bins, newBins);
660  AxisBeforeTOFSig->Set(bins, newBins);
661  AxisBeforeITSSig->Set(bins, newBins);
662  AxisBeforeAsymmetry->Set(bins, newBins);
663  }
664  delete [] newBins;
665 
666  // Event Cuts and Info
667  if(!preCut){
668  fHistoEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
670  }
671  }
672 
673  TH1::AddDirectory(kTRUE);
674 }
675 
676 //________________________________________________________________________
678  // Set Pointer to AliPIDResponse
679 
680  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
681  if(man) {
682  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
683  fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
684  if(fPIDResponse)return kTRUE;
685 
686  }
687 
688 
689  return kFALSE;
690 }
693 
694  AliInfo("Entering loading of correction map for post calibration");
695 
696  TFile *file = TFile::Open(filename.Data());
697  if(!file){
698  AliError(Form("file for electron dEdx post calibration %s not found",filename.Data()));
699  return kFALSE;
700  }else{
701  AliInfo(Form("found %s ",filename.Data()));
702  }
703 
704  for(Int_t i=0;i<fnRBins;i++){
705  fHistoEleMapMean[i] = (TH2F*)file->Get(Form("Ele_R%d_mean",i));
706  fHistoEleMapWidth[i] = (TH2F*)file->Get(Form("Ele_R%d_width",i));
707  fHistoPosMapMean[i] = (TH2F*)file->Get(Form("Pos_R%d_mean",i));
708  fHistoPosMapWidth[i] = (TH2F*)file->Get(Form("Pos_R%d_width",i));
709  }
710  if (fHistoEleMapMean[0] == NULL || fHistoEleMapWidth[0] == NULL ||
711  fHistoEleMapMean[1] == NULL || fHistoEleMapWidth[1] == NULL ||
712  fHistoEleMapMean[2] == NULL || fHistoEleMapWidth[2] == NULL ||
713  fHistoEleMapMean[3] == NULL || fHistoEleMapWidth[3] == NULL ){
714  AliError("Histograms for dedx post calibration not found not found");
715  return kFALSE;// do nothing if correction map is not avaible
716  }
717  for(Int_t i=0;i<fnRBins;i++){
718  fHistoEleMapMean[i] ->SetDirectory(0);
719  fHistoEleMapWidth[i] ->SetDirectory(0);
720  fHistoPosMapMean[i] ->SetDirectory(0);
721  fHistoPosMapWidth[i] ->SetDirectory(0);
722  }
723 
724  file->Close();
725  delete file;
727  return kTRUE;
728 }
729 //_________________________________________________________________________
731 
732  Double_t Charge = charge;
733  Double_t CornSig = nsig;
734  Double_t mean = 1.;
735  Double_t width = 1.;
736  //X axis 12 Y axis 18 ... common for all R slice
737  Int_t BinP=4; // default value
738  Int_t BinEta=9; // default value
739 
740  if(Charge<0){
741  if (fHistoEleMapMean[0] == NULL || fHistoEleMapWidth[0] == NULL ||
742  fHistoEleMapMean[1] == NULL || fHistoEleMapWidth[1] == NULL ||
743  fHistoEleMapMean[2] == NULL || fHistoEleMapWidth[2] == NULL ||
744  fHistoEleMapMean[3] == NULL || fHistoEleMapWidth[3] == NULL ){
745  cout<< " histograms are null..., going out"<< endl;
746  return CornSig;// do nothing if correction map is not avaible
747  }
748 
749  BinP = fHistoEleMapMean[0]->GetXaxis()->FindBin(P);
750  BinEta = fHistoEleMapMean[0]->GetYaxis()->FindBin(Eta);
751 
752 
753 
754  if( R > 0. && R < 33.5){//0,33.5,72,145., 180 cm
755  if(P>0. && P<10.){
756  mean = fHistoEleMapMean[0]->GetBinContent(BinP,BinEta);
757  width = fHistoEleMapWidth[0]->GetBinContent(BinP,BinEta);
758  }else if(P>=10.){// use bin edge value
759  mean = fHistoEleMapMean[0]->GetBinContent(12,BinEta);;
760  width = fHistoEleMapWidth[0]->GetBinContent(12,BinEta);
761  }
762  }else if( R >= 30.5 && R < 72.){
763  if(P>0. && P<10.){
764  mean = fHistoEleMapMean[1]->GetBinContent(BinP,BinEta);
765  width = fHistoEleMapWidth[1]->GetBinContent(BinP,BinEta);
766  }else if(P>=10.){// use bin edge value
767  mean = fHistoEleMapMean[1]->GetBinContent(12,BinEta);
768  width = fHistoEleMapWidth[1]->GetBinContent(12,BinEta);
769  }
770  }else if( R >= 72. && R < 145.){
771  if(P>0. && P<10.){
772  mean = fHistoEleMapMean[2]->GetBinContent(BinP,BinEta);
773  width = fHistoEleMapWidth[2]->GetBinContent(BinP,BinEta);
774  }else if(P>=10.){// use bin edge value
775  mean = fHistoEleMapMean[2]->GetBinContent(12,BinEta);
776  width = fHistoEleMapWidth[2]->GetBinContent(12,BinEta);
777  }
778  }else if( R >= 145. && R < 180.){
779  if(P>0. && P<10.){
780  mean = fHistoEleMapMean[3]->GetBinContent(BinP,BinEta);
781  width = fHistoEleMapWidth[3]->GetBinContent(BinP,BinEta);
782  }else if(P>=10.){// use bin edge value
783  mean = fHistoEleMapMean[3]->GetBinContent(12,BinEta);
784  width = fHistoEleMapWidth[3]->GetBinContent(12,BinEta);
785  }
786  }else{
787  mean = 0.;
788  width = 1.;
789  }
790  }else{
791  //X axis 12 Y axis 18 ... common for all R slice
792  if (fHistoPosMapMean[0] == NULL || fHistoPosMapWidth[0] == NULL ||
793  fHistoPosMapMean[1] == NULL || fHistoPosMapWidth[1] == NULL ||
794  fHistoPosMapMean[2] == NULL || fHistoPosMapWidth[2] == NULL ||
795  fHistoPosMapMean[3] == NULL || fHistoPosMapWidth[3] == NULL ){
796  cout<< " histograms are null..., going out"<< endl;
797  return CornSig;// do nothing if correction map is not avaible
798  }
799 
800  BinP = fHistoPosMapMean[0]->GetXaxis()->FindBin(P);
801  BinEta = fHistoPosMapMean[0]->GetYaxis()->FindBin(Eta);
802 
803  if( R > 0. && R < 33.5){//0,33.5,72.,145.,180. cm
804  if(P>0. && P<10.){
805  mean = fHistoPosMapMean[0]->GetBinContent(BinP,BinEta);
806  width = fHistoPosMapWidth[0]->GetBinContent(BinP,BinEta);
807  }else if(P>=10.){// use bin edge value
808  mean = fHistoPosMapMean[0]->GetBinContent(12,BinEta);;
809  width = fHistoPosMapWidth[0]->GetBinContent(12,BinEta);
810  }
811  }else if( R >= 33.5 && R < 72.){
812  if(P>0. && P<10.){
813  mean = fHistoPosMapMean[1]->GetBinContent(BinP,BinEta);
814  width = fHistoPosMapWidth[1]->GetBinContent(BinP,BinEta);
815  }else if(P>=10.){// use bin edge value
816  mean = fHistoPosMapMean[1]->GetBinContent(12,BinEta);
817  width = fHistoPosMapWidth[1]->GetBinContent(12,BinEta);
818  }
819  }else if( R >= 72. && R < 145.){
820  if(P>0. && P<10.){
821  mean = fHistoPosMapMean[2]->GetBinContent(BinP,BinEta);
822  width = fHistoPosMapWidth[2]->GetBinContent(BinP,BinEta);
823  }else if(P>=10.){// use bin edge value
824  mean = fHistoPosMapMean[2]->GetBinContent(12,BinEta);
825  width = fHistoPosMapWidth[2]->GetBinContent(12,BinEta);
826  }
827  }else if( R >= 145. && R < 180.){
828  if(P>0. && P<10.){
829  mean = fHistoPosMapMean[3]->GetBinContent(BinP,BinEta);
830  width = fHistoPosMapWidth[3]->GetBinContent(BinP,BinEta);
831  }else if(P>=10.){// use bin edge value
832  mean = fHistoPosMapMean[3]->GetBinContent(12,BinEta);
833  width = fHistoPosMapWidth[3]->GetBinContent(12,BinEta);
834  }
835  }else{
836  mean = 0.;
837  width = 1.;
838  }
839  }
840  if (width!=0.){
841  CornSig = (nsig - mean) / width;
842  }
843  return CornSig;
844 }
846 Bool_t AliConversionPhotonCuts::PhotonIsSelectedMC(TParticle *particle,AliMCEvent *mcEvent,Bool_t checkForConvertedGamma){
847  // MonteCarlo Photon Selection
848 
849  if(!mcEvent)return kFALSE;
850 
851  if (particle->GetPdgCode() == 22){
852 
853 
854  if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) )
855  return kFALSE;
856  if(fEtaCutMin>-0.1){
857  if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) )
858  return kFALSE;
859  }
860 
861  if(particle->GetMother(0) >-1 && mcEvent->Particle(particle->GetMother(0))->GetPdgCode() == 22){
862  return kFALSE; // no photon as mothers!
863  }
864 
865  // removed, decision on primary and secondary taken in main task
866 // if(particle->GetMother(0) >= mcEvent->GetNumberOfPrimaries()){
867 // return kFALSE; // the gamma has a mother, and it is not a primary particle
868 // }
869 
870  if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
871 
872  // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
873  TParticle* ePos = NULL;
874  TParticle* eNeg = NULL;
875 
876  if(particle->GetNDaughters() >= 2){
877  for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
878  if(daughterIndex<0) continue;
879  TParticle *tmpDaughter = mcEvent->Particle(daughterIndex);
880  if(tmpDaughter->GetUniqueID() == 5){
881  if(tmpDaughter->GetPdgCode() == 11){
882  eNeg = tmpDaughter;
883  } else if(tmpDaughter->GetPdgCode() == -11){
884  ePos = tmpDaughter;
885  }
886  }
887  }
888  }
889 
890  if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
891  return kFALSE;
892  }
893 
894  if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ||
895  eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) )
896  return kFALSE;
897 
898  if(fEtaCutMin > -0.1){
899  if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) ||
900  (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) )
901  return kFALSE;
902  }
903 
904  if(ePos->R()>fMaxR){
905  return kFALSE; // cuts on distance from collision point
906  }
907 
908  if(TMath::Abs(ePos->Vz()) > fMaxZ){
909  return kFALSE; // outside material
910  }
911  if(TMath::Abs(eNeg->Vz()) > fMaxZ){
912  return kFALSE; // outside material
913  }
914 
915  if( ePos->R() <= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
916  return kFALSE; // line cut to exclude regions where we do not reconstruct
917  } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
918  return kFALSE;
919  }
920 
921  if( eNeg->R() <= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
922  return kFALSE; // line cut to exclude regions where we do not reconstruct
923  } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
924  return kFALSE;
925  }
926 
927  return kTRUE;
928  //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
929  }
930  return kFALSE;
931 }
933 Bool_t AliConversionPhotonCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
934  // MonteCarlo Photon Selection
935 
936  if(!aodmcArray)return kFALSE;
937 
938  if (particle->GetPdgCode() == 22){
939  if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) )
940  return kFALSE;
941  if(fEtaCutMin>-0.1){
942  if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) )
943  return kFALSE;
944  }
945 
946  if(particle->GetMother() > -1 && (static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
947  return kFALSE; // no photon as mothers!
948  }
949 
950  if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
951 
952  // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
953  AliAODMCParticle* ePos = NULL;
954  AliAODMCParticle* eNeg = NULL;
955 
956  if(particle->GetNDaughters() >= 2){
957  for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
958  AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
959  if(!tmpDaughter) continue;
960  if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
961  if(tmpDaughter->GetPdgCode() == 11){
962  eNeg = tmpDaughter;
963  } else if(tmpDaughter->GetPdgCode() == -11){
964  ePos = tmpDaughter;
965  }
966  }
967  }
968  }
969 
970  if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
971  return kFALSE;
972  }
973 
974  if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ||
975  eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) )
976  return kFALSE;
977 
978  if(fEtaCutMin > -0.1){
979  if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) ||
980  (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) )
981  return kFALSE;
982  }
983 
984  Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
985  Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
986 
987  if(rPos>fMaxR){
988  return kFALSE; // cuts on distance from collision point
989  }
990  if(TMath::Abs(ePos->Zv()) > fMaxZ){
991  return kFALSE; // outside material
992  }
993  if(TMath::Abs(eNeg->Zv()) > fMaxZ){
994  return kFALSE; // outside material
995  }
996 
997  if( rPos <= ((TMath::Abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
998  return kFALSE; // line cut to exclude regions where we do not reconstruct
999  } else if ( fEtaCutMin != -0.1 && rPos >= ((TMath::Abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1000  return kFALSE;
1001  }
1002 
1003  if( rNeg <= ((TMath::Abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
1004  return kFALSE; // line cut to exclude regions where we do not reconstruct
1005  } else if ( fEtaCutMin != -0.1 && rNeg >= ((TMath::Abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1006  return kFALSE;
1007  }
1008 
1009  return kTRUE;
1010  //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1011  }
1012  return kFALSE;
1013 }
1014 
1016 Bool_t AliConversionPhotonCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event){ // Specific Photon Cuts
1017 
1018  Int_t cutIndex = 0;
1019  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt());
1020  cutIndex++;
1021 
1022  AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative());
1023  AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive());
1024 
1025  // Fill Histos before Cuts
1026  if(fHistoInvMassbefore)fHistoInvMassbefore->Fill(photon->GetMass());
1029  if(photon->GetPhotonP()!=0 && electronCandidate->P()!=0)fHistoAsymmetrybefore->Fill(photon->GetPhotonP(),electronCandidate->P()/photon->GetPhotonP());
1030  }
1031  // Gamma selection based on QT from Armenteros
1032  if(fDoQtGammaSelection == kTRUE){
1033  if(!ArmenterosQtCut(photon)){
1034  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //1
1035  return kFALSE;
1036  }
1037  }
1038  cutIndex++; //2
1039 
1040  // Chi Cut
1041  if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1042  {
1043  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //2
1044  return kFALSE;
1045  }
1046  }
1047  cutIndex++;//3
1048 
1049  // Reconstruction Acceptance Cuts
1050  if(!AcceptanceCuts(photon)){
1051  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //3
1052  return kFALSE;
1053  }
1054 
1055  cutIndex++; //4
1056  // Asymmetry Cut
1057  if(fDoPhotonAsymmetryCut == kTRUE){
1058  if(!AsymmetryCut(photon,event)){
1059  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //4
1060  return kFALSE;
1061  }
1062  }
1063 
1064  //Check the pid probability
1065  cutIndex++; //5
1066  if(!PIDProbabilityCut(photon, event)) {
1067  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //5
1068  return kFALSE;
1069  }
1070 
1071  cutIndex++; //6
1072  if(!CorrectedTPCClusterCut(photon, event)) {
1073  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //6
1074  return kFALSE;
1075  }
1076 
1077  Double_t magField = event->GetMagneticField();
1078  if( magField < 0.0 ){
1079  magField = 1.0;
1080  } else {
1081  magField = -1.0;
1082  }
1083 
1084  Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1085 
1086  cutIndex++; //7
1087  if(!PsiPairCut(photon)) {
1088  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //7
1089  return kFALSE;
1090  }
1091 
1092  cutIndex++; //8
1093  if(!CosinePAngleCut(photon, event)) {
1094  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //8
1095  return kFALSE;
1096  }
1097 
1098  AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1099  if (photonAOD){
1100  photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1101 
1102  cutIndex++; //9
1103  if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1104  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //9
1105  return kFALSE;
1106  }
1107 
1108  cutIndex++; //10
1109  if(TMath::Abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1110  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //10
1111  return kFALSE;
1112  }
1113  } else {
1114  cutIndex++; //9
1115  cutIndex++; //10
1116  }
1117  cutIndex++; //11
1118 
1119  if (photonAOD){
1120  UChar_t photonQuality = 0;
1121  AliAODEvent * aodEvent = dynamic_cast<AliAODEvent*>(event);
1122  if(aodEvent) {
1123  photonQuality = DeterminePhotonQualityAOD(photonAOD, event);
1124  } else {
1125  photonQuality = photonAOD->GetPhotonQuality();
1126  }
1127  if (fDoPhotonQualitySelectionCut && photonQuality != fPhotonQualityCut){
1128  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //11
1129  return kFALSE;
1130  }
1131  }
1132  cutIndex++; //12
1133  if(fHistoPhotonCuts)fHistoPhotonCuts->Fill(cutIndex, photon->GetPhotonPt()); //11
1134 
1135  // Histos after Cuts
1136  if(fHistoInvMassafter)fHistoInvMassafter->Fill(photon->GetMass());
1139  if(fHistoKappaafter)fHistoKappaafter->Fill(photon->GetPhotonPt(), GetKappaTPC(photon, event));
1141  if(photon->GetPhotonP()!=0 && electronCandidate->P()!=0)fHistoAsymmetryafter->Fill(photon->GetPhotonP(),electronCandidate->P()/photon->GetPhotonP());
1142  }
1143  return kTRUE;
1144 
1145 }
1146 
1148 Bool_t AliConversionPhotonCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event){ //Cut on corrected TPC Cluster Info
1149 
1150  AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1151  AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1152 
1153  if(!negTrack||!posTrack)return kFALSE;
1154 
1155  Double_t negclsToF=0;
1156 
1157  if (!fUseCorrectedTPCClsInfo ){
1158  if(negTrack->GetTPCNclsF()!=0){
1159  negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1160  }
1161  else {
1162  negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1163  }
1164 
1165  Double_t posclsToF = 0.;
1166  if (!fUseCorrectedTPCClsInfo ){
1167  if(posTrack->GetTPCNclsF()!=0){
1168  posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1169  }
1170  }else{
1171  posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1172  }
1173 
1174  if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1175  return kFALSE;
1176  }
1177 
1178  return kTRUE;
1179 }
1180 
1183  //Selection of Reconstructed Photons
1184 
1186 
1187  if(event->IsA()==AliESDEvent::Class()) {
1188  if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1190  return kFALSE;
1191  }
1192  }
1193 
1194  // Get Tracks
1195  AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1196  AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1197 
1198  if(!negTrack || !posTrack) {
1200  return kFALSE;
1201  }
1202 
1203  // check if V0 from AliAODGammaConversion.root is actually contained in AOD by checking if V0 exists with same tracks
1204  if(event->IsA()==AliAODEvent::Class() && fPreSelCut && ( fIsHeavyIon != 1 || (fIsHeavyIon == 1 && fProcessAODCheck) )) {
1205  AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
1206 
1207  Bool_t bFound = kFALSE;
1208  Int_t v0PosID = posTrack->GetID();
1209  Int_t v0NegID = negTrack->GetID();
1210  AliAODv0* v0 = NULL;
1211  for(Int_t iV=0; iV<aodEvent->GetNumberOfV0s(); iV++){
1212  v0 = aodEvent->GetV0(iV);
1213  if(!v0) continue;
1214  if( (v0PosID == v0->GetPosID() && v0NegID == v0->GetNegID()) || (v0PosID == v0->GetNegID() && v0NegID == v0->GetPosID()) ){
1215  bFound = kTRUE;
1216  break;
1217  }
1218  }
1219  if(!bFound){
1221  return kFALSE;
1222  }
1223  }
1224 
1225  photon->DeterminePhotonQuality(negTrack,posTrack);
1226  // Track Cuts
1227  if(!TracksAreSelected(negTrack, posTrack)){
1229  return kFALSE;
1230  }
1231  if (fHistoEtaDistV0s)fHistoEtaDistV0s->Fill(photon->GetPhotonEta());
1232 
1233  // dEdx Cuts
1234  // if(fDoElecDeDxPostCalibration && fElecDeDxPostCalibrationInitialized){
1235  if(!KappaCuts(photon, event) || !dEdxCuts(negTrack,photon) || !dEdxCuts(posTrack,photon)) {
1237  return kFALSE;
1238  }
1239 
1241  // Photon Cuts
1242  if(!PhotonCuts(photon,event)){
1244  return kFALSE;
1245  }
1246 
1247  // Photon passed cuts
1249  return kTRUE;
1250 }
1251 
1254  if(fDo2DQt){
1255  if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1256  return kFALSE;
1257  }
1258  } else {
1259  if(photon->GetArmenterosQt()>fQtMax){
1260  return kFALSE;
1261  }
1262  }
1263  return kTRUE;
1264 }
1265 
1266 
1269  // Exclude certain areas for photon reconstruction
1270 
1271  Int_t cutIndex=0;
1272  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1273  cutIndex++;
1274 
1275  if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1276  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1277  return kFALSE;
1278  }
1279  cutIndex++;
1280 
1281  if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1282  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1283  return kFALSE;
1284  }
1285  cutIndex++;
1286 
1287  if(photon->GetConversionRadius() <= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1288  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1289  return kFALSE;
1290  }
1291  else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1292  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1293  return kFALSE;
1294  }
1295  cutIndex++;
1296 
1297  if(TMath::Abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1298  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1299  return kFALSE;
1300  }
1301  cutIndex++;
1302 
1303 
1304  if( photon->GetPhotonEta() > (fEtaCut) || photon->GetPhotonEta() < (-fEtaCut) ){
1305  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1306  return kFALSE;
1307  }
1308  if(fEtaCutMin>-0.1){
1309  if( photon->GetPhotonEta() < (fEtaCutMin) && photon->GetPhotonEta() > (-fEtaCutMin) ){
1310  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1311  return kFALSE;
1312  }
1313  }
1314  cutIndex++;
1315 
1317  if(photon->GetPhotonEta() > fEtaForPhiCutMin && photon->GetPhotonEta() < fEtaForPhiCutMax ){
1318  if (fMinPhiCut < fMaxPhiCut){
1319  if( photon->GetPhotonPhi() > fMinPhiCut && photon->GetPhotonPhi() < fMaxPhiCut ) {
1320  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1321  return kFALSE;
1322  }
1323  } else {
1324  Double_t photonPhi = photon->GetPhotonPhi();
1325  if (photon->GetPhotonPhi() < TMath::Pi()) photonPhi = photon->GetPhotonPhi() + 2*TMath::Pi();
1326  if( photonPhi > fMinPhiCut && photonPhi < fMaxPhiCut+2*TMath::Pi() ) {
1327  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1328  return kFALSE;
1329  }
1330  }
1331  }
1332  }
1333  cutIndex++;
1334 
1335 
1336 
1337  if(photon->GetPhotonPt()<fPtCut){
1338  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1339  return kFALSE;
1340  }
1341  cutIndex++;
1342 
1343  if(fHistoAcceptanceCuts)fHistoAcceptanceCuts->Fill(cutIndex, photon->GetPhotonPt());
1344 
1345  return kTRUE;
1346 }
1347 
1348 
1350 Bool_t AliConversionPhotonCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1351  // Track Cuts which require AOD/ESD specific implementation
1352 
1353  if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1354  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1355  return kFALSE;
1356  }
1357  cutIndex++;
1358 
1359  AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1360  AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1361  if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1362  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1363  return kFALSE;
1364  }
1365  return kTRUE;
1366 
1367 }
1368 
1369 
1371 Bool_t AliConversionPhotonCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1372  // Track Cuts which require AOD/ESD specific implementation
1373 
1374  if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1375  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1376  return kFALSE;
1377  }
1378  cutIndex++;
1379 
1380  if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1381  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1382  return kFALSE;
1383  }
1384  return kTRUE;
1385 }
1386 
1387 
1388 
1390 Bool_t AliConversionPhotonCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1391  // Track Selection for Photon Reconstruction
1392 
1393  Int_t cutIndex=0;
1394  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1395  cutIndex++;
1396 
1397  // avoid like sign
1399  if(negTrack->Charge() == posTrack->Charge()) {
1400  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1401  return kFALSE;
1402  }
1403  }else if(fUseOnFlyV0FinderSameSign==1){
1404  if(negTrack->Charge() != posTrack->Charge()) {
1405  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1406  return kFALSE;
1407  }
1408  }
1409  cutIndex++;
1410 
1411  // Number of TPC Clusters
1412 
1413 
1414  if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1415  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1416  return kFALSE;
1417  }
1418  cutIndex++;
1419 
1420  // Acceptance
1421  if( posTrack->Eta() > (fEtaCut) || posTrack->Eta() < (-fEtaCut) ||
1422  negTrack->Eta() > (fEtaCut) || negTrack->Eta() < (-fEtaCut) ){
1423  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1424  return kFALSE;
1425  }
1426  if(fEtaCutMin>-0.1){
1427  if( (posTrack->Eta() < (fEtaCutMin) && posTrack->Eta() > (-fEtaCutMin)) ||
1428  (negTrack->Eta() < (fEtaCutMin) && negTrack->Eta() > (-fEtaCutMin)) ){
1429  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1430  return kFALSE;
1431  }
1432  }
1433  cutIndex++;
1434 
1435  // Single Pt Cut
1436  if(fDoAsymPtCut){
1437  if((posTrack->Pt()<fSinglePtCut || negTrack->Pt()<fSinglePtCut2) && (posTrack->Pt()<fSinglePtCut2 || negTrack->Pt()<fSinglePtCut) ){
1438  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1439  return kFALSE;
1440  }
1441  } else {
1442  if(posTrack->Pt()<fSinglePtCut || negTrack->Pt()<fSinglePtCut){
1443  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1444  return kFALSE;
1445  }
1446  }
1447  cutIndex++;
1448 
1449  // AOD ESD specific cuts
1450  Bool_t passCuts = kTRUE;
1451 
1452  if(negTrack->IsA()==AliAODTrack::Class()) {
1453  passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1454  } else {
1455  passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1456  }
1457 
1458  if(!passCuts){
1459  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1460  return kFALSE;
1461  }
1462  cutIndex++;
1463 
1464  if(fHistoTrackCuts)fHistoTrackCuts->Fill(cutIndex);
1465 
1466  return kTRUE;
1467 
1468 }
1471 
1472  if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1473  if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1474 
1475  AliVTrack * negTrack = GetTrack(event, gamma->GetTrackLabelNegative());
1476  AliVTrack * posTrack = GetTrack(event, gamma->GetTrackLabelPositive());
1477 
1478  Double_t CentrnSig[2] ={-1.,-1.};//negative, positive
1479  Double_t P[2] ={-1.,-1.};
1480  Double_t Eta[2] ={-1.,-1.};
1481  Double_t R =-1.;
1482 
1483  Float_t KappaPlus, KappaMinus, Kappa;
1485  CentrnSig[0]=fPIDResponse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
1486  CentrnSig[1]=fPIDResponse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
1487  P[0] =negTrack->P();
1488  P[1] =posTrack->P();
1489  Eta[0] =negTrack->Eta();
1490  Eta[1] =posTrack->Eta();
1491  R =gamma->GetConversionRadius();
1492  KappaMinus = GetCorrectedElectronTPCResponse(negTrack->Charge(),CentrnSig[0],P[0],Eta[0],R);
1493  KappaPlus = GetCorrectedElectronTPCResponse(posTrack->Charge(),CentrnSig[1],P[1],Eta[1],R);
1494  }else{
1495  KappaMinus = fPIDResponse->NumberOfSigmasTPC(negTrack, AliPID::kElectron);
1496  KappaPlus = fPIDResponse->NumberOfSigmasTPC(posTrack, AliPID::kElectron);
1497  }
1498  Kappa = ( TMath::Abs(KappaMinus) + TMath::Abs(KappaPlus) ) / 2.0 + 2.0*(KappaMinus+KappaPlus);
1499 
1500  return Kappa;
1501 
1502 }
1503 
1504 
1507  // Supposed to use post calibration
1508  // Electron Identification Cuts for Photon reconstruction
1509 
1510  if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1511  if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1512 
1513  Short_t Charge = fCurrentTrack->Charge();
1514  Double_t electronNSigmaTPC = fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron);
1515  Double_t electronNSigmaTPCCor=0.;
1516  Double_t P=0.;
1517  Double_t Eta=0.;
1518  Double_t R=0.;
1519 
1521  P = fCurrentTrack->P();
1522  Eta = fCurrentTrack->Eta();
1523  R = photon->GetConversionRadius();
1524  electronNSigmaTPCCor = GetCorrectedElectronTPCResponse(Charge,electronNSigmaTPC,P,Eta,R);
1525  }
1526 
1527  Int_t cutIndex=0;
1528  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1529  if(fHistoTPCdEdxSigbefore)fHistoTPCdEdxSigbefore->Fill(fCurrentTrack->P(), electronNSigmaTPC);
1530  if(fHistoTPCdEdxbefore)fHistoTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1531  cutIndex++;
1532  if(fDodEdxSigmaCut == kTRUE && !fSwitchToKappa){
1533  // TPC Electron Line
1535  if( electronNSigmaTPCCor < fPIDnSigmaBelowElectronLine || electronNSigmaTPCCor >fPIDnSigmaAboveElectronLine ){
1536  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1537  return kFALSE;
1538  }
1539  } else{
1540  if( electronNSigmaTPC < fPIDnSigmaBelowElectronLine ||
1541  electronNSigmaTPC > fPIDnSigmaAboveElectronLine){
1542  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1543  return kFALSE;
1544  }
1545  }
1546  cutIndex++;
1547  // TPC Pion Line
1548  if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1550  if( electronNSigmaTPCCor >fPIDnSigmaBelowElectronLine && electronNSigmaTPCCor < fPIDnSigmaAboveElectronLine&&
1551  fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1552  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1553  return kFALSE;
1554  }
1555  } else{
1556  if( electronNSigmaTPC > fPIDnSigmaBelowElectronLine &&
1557  electronNSigmaTPC < fPIDnSigmaAboveElectronLine&&
1558  fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1559  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1560  return kFALSE;
1561  }
1562  }
1563  cutIndex++;
1564  }
1565 
1566  // High Pt Pion rej
1567  if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1569  if( electronNSigmaTPCCor > fPIDnSigmaBelowElectronLine &&
1570  electronNSigmaTPCCor < fPIDnSigmaAboveElectronLine &&
1571  fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1572  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1573  return kFALSE;
1574  }
1575  } else{
1576  if( electronNSigmaTPC > fPIDnSigmaBelowElectronLine &&
1577  electronNSigmaTPC < fPIDnSigmaAboveElectronLine &&
1578  fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1579  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1580  return kFALSE;
1581  }
1582  }
1583  }
1584  cutIndex++;
1585  }
1586  else{cutIndex+=3;}
1587 
1588  if(fDoKaonRejectionLowP == kTRUE && !fSwitchToKappa){
1589  if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1590  if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1591  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1592  return kFALSE;
1593  }
1594  }
1595  }
1596  cutIndex++;
1597 
1598  if(fDoProtonRejectionLowP == kTRUE && !fSwitchToKappa){
1599  if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1600  if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1601  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1602  return kFALSE;
1603  }
1604  }
1605  }
1606  cutIndex++;
1607 
1608  if(fDoPionRejectionLowP == kTRUE && !fSwitchToKappa){
1609  if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1610  if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1611  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1612  return kFALSE;
1613  }
1614  }
1615  }
1616  cutIndex++;
1617 
1618 
1619  // cout<<"Start"<<endl;
1620  // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1621 
1622  // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1623  // {cout<<"TOF DA"<<endl;}
1624  // if(status == AliPIDResponse::kDetPidOk){
1625  // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1626  // cout<<"--> "<<probMis<<endl;
1627  // if(probMis > 0.01){
1628 
1629  // }
1630  // }
1631 
1632  if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1633  if(fHistoTOFbefore){
1634  Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1635  Double_t times[AliPID::kSPECIESC];
1636  fCurrentTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
1637  Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1638  Double_t dT = TOFsignal - t0 - times[0];
1639  fHistoTOFbefore->Fill(fCurrentTrack->P(),dT);
1640  }
1641  if(fHistoTOFSigbefore) fHistoTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1642  if(fUseTOFpid){
1643  if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1644  fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1645  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1646  return kFALSE;
1647  }
1648  }
1649  if(fHistoTOFSigafter)fHistoTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1650  }
1651  cutIndex++;
1652 
1653  if((fCurrentTrack->GetStatus() & AliESDtrack::kITSpid)){
1654  if(fHistoITSSigbefore) fHistoITSSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
1655  if(fUseITSpid){
1656  if(fCurrentTrack->Pt()<=fMaxPtPIDITS){
1657  if(fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron)>fITSPIDnSigmaAboveElectronLine || fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron)<fITSPIDnSigmaBelowElectronLine ){
1658  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1659  return kFALSE;
1660  }
1661  }
1662  }
1663  if(fHistoITSSigafter)fHistoITSSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
1664  }
1665 
1666  cutIndex++;
1667 
1668  // Apply TRD PID
1669  if(fDoTRDPID){
1670  if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1671  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1672  return kFALSE;
1673  }
1674  }
1675  cutIndex++;
1676 
1677  if(fHistodEdxCuts)fHistodEdxCuts->Fill(cutIndex,fCurrentTrack->Pt());
1679  if(fHistoTPCdEdxSigafter)fHistoTPCdEdxSigafter->Fill(fCurrentTrack->P(),electronNSigmaTPCCor);
1680  }else{
1681  if(fHistoTPCdEdxSigafter)fHistoTPCdEdxSigafter->Fill(fCurrentTrack->P(),electronNSigmaTPC);
1682  }
1683  if(fHistoTPCdEdxafter)fHistoTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1684 
1685  return kTRUE;
1686 }
1687 
1690  // abort if Kappa selection not enabled
1691  if (!fSwitchToKappa) return kTRUE;
1692 
1693  Float_t kappa = GetKappaTPC(photon, event);
1694  if (kappa < fKappaMinCut) return kFALSE;
1695  if (kappa > fKappaMaxCut) return kFALSE;
1696  return kTRUE;
1697 }
1698 
1701  // Cut on Energy Asymmetry
1702 
1703  for(Int_t ii=0;ii<2;ii++){
1704 
1705  AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1706 
1708  Double_t trackNegAsy=0;
1709  if (photon->GetPhotonP()!=0.){
1710  trackNegAsy= track->P()/photon->GetPhotonP();
1711  }
1712 
1713  if( trackNegAsy > fFAsymmetryCut->Eval(photon->GetPhotonP()) || trackNegAsy < 1.-fFAsymmetryCut->Eval(photon->GetPhotonP()) ){
1714  return kFALSE;
1715  }
1716 
1717  } else {
1718  if( track->P() > fMinPPhotonAsymmetryCut ){
1719  Double_t trackNegAsy=0;
1720  if (photon->GetPhotonP()!=0.){
1721  trackNegAsy= track->P()/photon->GetPhotonP();
1722  }
1723 
1724  if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1725  return kFALSE;
1726  }
1727  }
1728  }
1729 
1730  }
1731  return kTRUE;
1732 }
1733 
1735 AliVTrack *AliConversionPhotonCuts::GetTrack(AliVEvent * event, Int_t label){
1736  //Returns pointer to the track with given ESD label
1737  //(Important for AOD implementation, since Track array in AOD data is different
1738  //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1739 
1740  AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1741  if(esdEvent) {
1742  if(label > event->GetNumberOfTracks() ) return NULL;
1743  AliESDtrack * track = esdEvent->GetTrack(label);
1744  return track;
1745 
1746  } else {
1747  if(label == -999999) return NULL; // if AOD relabelling goes wrong, immediately return NULL
1748  AliVTrack * track = 0x0;
1749  if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->AreAODsRelabeled()){
1750  if(event->GetTrack(label)) track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1751  return track;
1752  }
1753  else{
1754  for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1755  if(event->GetTrack(ii)) track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1756  if(track){
1757  if(track->GetID() == label) {
1758  return track;
1759  }
1760  }
1761  }
1762  }
1763  }
1764  //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1765  return NULL;
1766 }
1767 
1770  //Returns pointer to the track with given ESD label
1771  //(Important for AOD implementation, since Track array in AOD data is different
1772  //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1773 
1774  if(event) {
1775  if(label > event->GetNumberOfTracks() ) return NULL;
1776  AliESDtrack * track = event->GetTrack(label);
1777  return track;
1778  }
1779  //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1780  return NULL;
1781 }
1782 
1783 
1784 
1787  // Cut on Electron Probability for Photon Reconstruction
1788 
1789  AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1790 
1791  if(esdEvent){
1792 
1793  Bool_t iResult=kFALSE;
1794 
1795  Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1796  Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1797 
1798  AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1799  AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1800 
1801  if(negProbArray && posProbArray){
1802 
1803  negTrack->GetTPCpid(negProbArray);
1804  posTrack->GetTPCpid(posProbArray);
1805 
1806  if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1807  iResult=kTRUE;
1808  }
1809  }
1810 
1811  delete [] posProbArray;
1812  delete [] negProbArray;
1813  return iResult;
1814 
1815  } else {
1817  return kTRUE;
1818  }
1819 }
1820 
1821 
1823 Bool_t AliConversionPhotonCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1824  // MC Acceptance Cuts
1825  //(Certain areas were excluded for photon reconstruction)
1826 
1827  if(particle->R()>fMaxR){
1828  return kFALSE;}
1829 
1830  if(ePos->R()>fMaxR){
1831  return kFALSE;
1832  }
1833 
1834  if(ePos->R()<fMinR){
1835  return kFALSE;
1836  }
1837 
1838  if( ePos->R() <= ((TMath::Abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1839  return kFALSE;
1840  }
1841  else if (fUseEtaMinCut && ePos->R() >= ((TMath::Abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1842  return kFALSE;
1843  }
1844 
1845  if(TMath::Abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1846  return kFALSE;
1847  }
1848 
1849  if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1850  return kFALSE;
1851  }
1852 
1853  if(TMath::Abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1854  return kFALSE;
1855  }
1856 
1857 
1858  if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) ){
1859  return kFALSE;
1860  }
1861  if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ){
1862  return kFALSE;
1863  }
1864  if( eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) ){
1865  return kFALSE;
1866  }
1867  if(fEtaCutMin>-0.1){
1868  if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) ){
1869  return kFALSE;
1870  }
1871  if( ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin) ){
1872  return kFALSE;
1873  }
1874  if( eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin) ){
1875  return kFALSE;
1876  }
1877  }
1878 
1879  if(fDoAsymPtCut){
1880  if((ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut2) && (ePos->Pt()<fSinglePtCut2 || eNeg->Pt()<fSinglePtCut) ){
1881  return kFALSE;
1882  }
1883  } else {
1884  if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
1885  return kFALSE;
1886  }
1887  }
1888 
1889  if(particle->Pt()<fPtCut){
1890  return kFALSE;
1891  }
1892 
1893  return kTRUE;
1894 }
1898 
1899  if(fCutString && fCutString->GetString().Length() == kNCuts) {
1900  fCutString->SetString(GetCutNumber());
1901  } else {
1902  return kFALSE;
1903  }
1904  return kTRUE;
1905 }
1906 
1907 
1910  fCutStringRead = Form("%s",analysisCutSelection.Data());
1911 
1912  // Initialize Cuts from a given Cut string
1913  AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1914  if(analysisCutSelection.Length()!=kNCuts) {
1915  AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1916  return kFALSE;
1917  }
1918  if(!analysisCutSelection.IsAlnum()){
1919  AliError("Cut selection is not alphanumeric");
1920  return kFALSE;
1921  }
1922 
1923  TString analysisCutSelectionLowerCase = Form("%s",analysisCutSelection.Data());
1924  analysisCutSelectionLowerCase.ToLower();
1925  const char *cutSelection = analysisCutSelectionLowerCase.Data();
1926  #define ASSIGNARRAY(i) fCuts[i] = ((int)cutSelection[i]>=(int)'a') ? cutSelection[i]-'a'+10 : cutSelection[i]-'0'
1927  for(Int_t ii=0;ii<kNCuts;ii++){
1928  ASSIGNARRAY(ii);
1929  }
1930 
1931  // Set Individual Cuts
1932  for(Int_t ii=0;ii<kNCuts;ii++){
1933  if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1934  }
1935 
1937 
1938  return kTRUE;
1939 }
1943 
1944  switch (cutID) {
1945 
1946  case kv0FinderType:
1947  if( SetV0Finder(value)) {
1948  fCuts[kv0FinderType] = value;
1949  UpdateCutString();
1950  return kTRUE;
1951  } else return kFALSE;
1952 
1953  case ketaCut:
1954  if( SetEtaCut(value)) {
1955  fCuts[ketaCut] = value;
1956  UpdateCutString();
1957  return kTRUE;
1958  } else return kFALSE;
1959 
1960  case kRCut:
1961  if( SetRCut(value)) {
1962  fCuts[kRCut] = value;
1963  UpdateCutString();
1964  return kTRUE;
1965  } else return kFALSE;
1966 
1967  case kEtaForPhiSector:
1968  if( SetEtaForPhiCut(value)) {
1969  fCuts[kEtaForPhiSector] = value;
1970  UpdateCutString();
1971  return kTRUE;
1972  } else return kFALSE;
1973  case kMinPhiSector:
1974  if( SetMinPhiSectorCut(value)) {
1975  fCuts[kMinPhiSector] = value;
1976  UpdateCutString();
1977  return kTRUE;
1978  } else return kFALSE;
1979  case kMaxPhiSector:
1980  if( SetMaxPhiSectorCut(value)) {
1981  fCuts[kMaxPhiSector] = value;
1982  UpdateCutString();
1983  return kTRUE;
1984  } else return kFALSE;
1985 
1986  case ksinglePtCut:
1987  if( SetSinglePtCut(value)) {
1988  fCuts[ksinglePtCut] = value;
1989  UpdateCutString();
1990  return kTRUE;
1991  } else return kFALSE;
1992 
1993  case kclsTPCCut:
1994  if( SetTPCClusterCut(value)) {
1995  fCuts[kclsTPCCut] = value;
1996  UpdateCutString();
1997  return kTRUE;
1998  } else return kFALSE;
1999 
2000  case kededxSigmaCut:
2001  if (!fSwitchToKappa){
2002  if( SetTPCdEdxCutElectronLine(value)) {
2003  fCuts[kededxSigmaCut] = value;
2004  UpdateCutString();
2005  return kTRUE;
2006  } else return kFALSE;
2007  } else {
2008  if( SetKappaTPCCut(value)) {
2009  fCuts[kededxSigmaCut] = value;
2010  UpdateCutString();
2011  return kTRUE;
2012  } else return kFALSE;
2013  }
2014  case kpidedxSigmaCut:
2015  if (!fSwitchToKappa){
2016  if( SetTPCdEdxCutPionLine(value)) {
2017  fCuts[kpidedxSigmaCut] = value;
2018  UpdateCutString();
2019  return kTRUE;
2020  } else return kFALSE;
2021  } else {
2022  fCuts[kpidedxSigmaCut] = 0;
2023  return kTRUE;
2024  }
2025  case kpiMomdedxSigmaCut:
2026  if (!fSwitchToKappa){
2027  if( SetMinMomPiondEdxCut(value)) {
2028  fCuts[kpiMomdedxSigmaCut] = value;
2029  UpdateCutString();
2030  return kTRUE;
2031  } else return kFALSE;
2032  } else {
2034  return kTRUE;
2035  }
2036  case kpiMaxMomdedxSigmaCut:
2037  if (!fSwitchToKappa){
2038  if( SetMaxMomPiondEdxCut(value)) {
2039  fCuts[kpiMaxMomdedxSigmaCut] = value;
2040  UpdateCutString();
2041  return kTRUE;
2042  } else return kFALSE;
2043  } else {
2045  return kTRUE;
2046  }
2048  if (!fSwitchToKappa){
2049  if( SetLowPRejectionCuts(value)) {
2050  fCuts[kLowPRejectionSigmaCut] = value;
2051  UpdateCutString();
2052  return kTRUE;
2053  } else return kFALSE;
2054  } else {
2056  return kTRUE;
2057  }
2058  case kTOFelectronPID:
2059  if( SetTOFElectronPIDCut(value)) {
2060  fCuts[kTOFelectronPID] = value;
2061  UpdateCutString();
2062  return kTRUE;
2063  } else return kFALSE;
2064 
2065  case kQtMaxCut:
2066  if( SetQtMaxCut(value)) {
2067  fCuts[kQtMaxCut] = value;
2068  UpdateCutString();
2069  return kTRUE;
2070  } else return kFALSE;
2071 
2072 
2073  case kchi2GammaCut:
2074  if( SetChi2GammaCut(value)) {
2075  fCuts[kchi2GammaCut] = value;
2076  UpdateCutString();
2077  return kTRUE;
2078  } else return kFALSE;
2079 
2080  case kPsiPair:
2081  if( SetPsiPairCut(value)) {
2082  fCuts[kPsiPair] = value;
2083  UpdateCutString();
2084  return kTRUE;
2085  } else return kFALSE;
2086 
2087  case kdoPhotonAsymmetryCut:
2088  if( SetPhotonAsymmetryCut(value)) {
2089  fCuts[kdoPhotonAsymmetryCut] = value;
2090  UpdateCutString();
2091  return kTRUE;
2092  } else return kFALSE;
2093 
2094  case kCosPAngle:
2095  if( SetCosPAngleCut(value)) {
2096  fCuts[kCosPAngle] = value;
2097  UpdateCutString();
2098  return kTRUE;
2099  } else return kFALSE;
2100 
2101  case kElecShare:
2102  if( SetSharedElectronCut(value)) {
2103  fCuts[kElecShare] = value;
2104  UpdateCutString();
2105  return kTRUE;
2106  } else return kFALSE;
2107 
2108  case kToCloseV0s:
2109  if( SetToCloseV0sCut(value)) {
2110  fCuts[kToCloseV0s] = value;
2111  UpdateCutString();
2112  return kTRUE;
2113  } else return kFALSE;
2114 
2115  case kDcaRPrimVtx:
2116  if( SetDCARPhotonPrimVtxCut(value)) {
2117  fCuts[kDcaRPrimVtx] = value;
2118  UpdateCutString();
2119  return kTRUE;
2120  } else return kFALSE;
2121 
2122  case kDcaZPrimVtx:
2123  if( SetDCAZPhotonPrimVtxCut(value)) {
2124  fCuts[kDcaZPrimVtx] = value;
2125  UpdateCutString();
2126  return kTRUE;
2127  } else return kFALSE;
2128 
2129  case kInPlaneOutOfPlane:
2130  if( SetInPlaneOutOfPlane(value)) {
2131  fCuts[kInPlaneOutOfPlane] = value;
2132  UpdateCutString();
2133  return kTRUE;
2134  } else return kFALSE;
2135 
2136  case kITSelectronPID:
2137  if( SetITSElectronPIDCut(value)) {
2138  fCuts[kITSelectronPID] = value;
2139  UpdateCutString();
2140  return kTRUE;
2141  } else return kFALSE;
2142 
2143  case kTRDelectronPID:
2144  if( SetTRDElectronPIDCut(value)) {
2145  fCuts[kTRDelectronPID] = value;
2146  UpdateCutString();
2147  return kTRUE;
2148  } else return kFALSE;
2149 
2150  case kNCuts:
2151  AliError("Cut id out of range");
2152  return kFALSE;
2153  }
2154 
2155  AliError("Cut id %d not recognized");
2156  return kFALSE;
2157 }
2160  // Print out current Cut Selection
2161  for(Int_t ic = 0; ic < kNCuts; ic++) {
2162  printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2163  }
2164 }
2165 
2167  // Print out current Cut Selection with value
2168  printf("\nConversion cutnumber \n");
2169  for(Int_t ic = 0; ic < kNCuts; ic++) {
2170  printf("%d",fCuts[ic]);
2171  }
2172  printf("\n\n");
2173  printf("Electron cuts & Secondary Track Cuts - only track from secondaries enter analysis: \n");
2174  printf("\t no like sign pairs from V0s \n");
2175  if (!fUseCorrectedTPCClsInfo) printf("\t # TPC clusters > %3.2f \n", fMinClsTPC);
2176  if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut );
2177  else printf("\t eta_{e} < %3.2f\n", fEtaCut );
2178  printf("\t reject: %3.2f < phi < %3.2f with %3.2f < eta < %3.2f \n", fMinPhiCut, fMaxPhiCut, fEtaForPhiCutMin, fEtaForPhiCutMax);
2179  if(fDoAsymPtCut)
2180  printf("\t Asymmetric cut: p_{T,e1} > %3.2f and p_{T,e2} > %3.2f\n", fSinglePtCut, fSinglePtCut2 );
2181  else
2182  printf("\t p_{T,e} > %3.2f\n", fSinglePtCut );
2183  printf("\t TPC refit \n");
2184  printf("\t no kinks \n");
2185  if (!fSwitchToKappa){
2186  printf("\t accept: %3.2f < n sigma_{e,TPC} < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine );
2187  printf("\t reject: %3.2f < p_{e,T} < %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMinPnSigmaAbovePionLine, fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLine );
2188  printf("\t reject: p_{e,T} > %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLineHighPt );
2189  if (fDoPionRejectionLowP) printf("\t reject: p_{e,T} < %3.2f, -%3.2f < n sigma_{pi,TPC} < %3.2f\n", fPIDMinPPionRejectionLowP, fPIDnSigmaAtLowPAroundPionLine, fPIDnSigmaAtLowPAroundPionLine );
2190  if (fDoKaonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{K,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundKaonLine, fPIDnSigmaAtLowPAroundKaonLine );
2191  if (fDoProtonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{p,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundProtonLine, fPIDnSigmaAtLowPAroundProtonLine );
2192  } else {
2193  printf("\t accept: %3.2f <= Kappa_{TPC} < %3.2f\n", fKappaMinCut, fKappaMaxCut );
2194  }
2195  if (fUseTOFpid) printf("\t accept: %3.2f < n sigma_{e,TOF} < %3.2f\n", fTofPIDnSigmaBelowElectronLine, fTofPIDnSigmaAboveElectronLine);
2196  if (fUseITSpid) printf("\t accept: %3.2f < n sigma_{e,ITS} < %3.2f\n -- up to pT %3.2f", fITSPIDnSigmaBelowElectronLine, fITSPIDnSigmaAboveElectronLine, fMaxPtPIDITS);
2197 
2198  printf("Photon cuts: \n");
2199  if (fUseOnFlyV0Finder) printf("\t using Onfly V0 finder \n");
2200  else printf("\t using Offline V0 finder \n");
2201  if (fDo2DQt){
2202  printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2203  } else {
2204  printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2205  }
2206  if (fDo2DPsiPairChi2){
2207  printf("\t 2 dimensional triangle chi^{2} and psi_{pair} cut applied with maximum of chi^{2} = %3.2f and |psi_{pair}| = %3.2f \n", fChi2CutConversion, fPsiPairCut );
2208  } else {
2209  printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion );
2210  printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut );
2211  }
2212  printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR );
2213  printf("\t Z_{conv} < %3.2f\n", fMaxZ );
2214  if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut );
2215  else printf("\t eta_{conv} < %3.2f\n", fEtaCut );
2216  if (fDoPhotonAsymmetryCut) printf("\t for p_{T,track} > %3.2f, A_{gamma} < %3.2f \n", fMinPPhotonAsymmetryCut, fMinPhotonAsymmetry );
2217  if (fDoPhotonPDependentAsymCut && fDoPhotonAsymmetryCut) printf("\t p-dependent asymmetry cut \n");
2218  if (fUseCorrectedTPCClsInfo) printf("\t #cluster TPC/ #findable clusters TPC (corrected for radius) > %3.2f\n", fMinClsTPCToF );
2219  printf("\t p_{T,gamma} > %3.2f\n", fPtCut );
2220  printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut );
2221  printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut );
2222  printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut );
2223  if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut );
2224  if (fDoDoubleCountingCut) printf("\t Reject doubly counted photons with R > %3.2f, DeltaR < %3.2f, OpenAngle < %3.2f \n", fMinRDC, fDeltaR,fOpenAngle );
2225 
2226 }
2227 
2230  switch (v0FinderType){
2231  case 0: // on fly V0 finder
2232  cout << "have chosen onfly V0" << endl;
2233  fUseOnFlyV0Finder=kTRUE;
2235  break;
2236  case 1: // offline V0 finder
2237  cout << "have chosen offline V0" << endl;
2238  fUseOnFlyV0Finder=kFALSE;
2240  break;
2241  case 2: // on fly V0 finder with same signs
2242  cout << "have chosen onfly V0 same sign pairing" << endl;
2243  fUseOnFlyV0Finder=kTRUE;
2245  break;
2246  case 3: // on fly V0 finder with unlike signs and same signs
2247  cout << "have chosen onfly V0 unlike sign and same signs pairing" << endl;
2248  fUseOnFlyV0Finder=kTRUE;
2250  break;
2251  default:
2252  AliError(Form(" v0FinderType not defined %d",v0FinderType));
2253  return kFALSE;
2254  }
2255  return kTRUE;
2256 }
2257 
2260 
2261  //Set Standard LineCutZValues
2262  fLineCutZValueMin = -2;
2263  fLineCutZValue = 7.;
2264 
2265  switch(etaCut){
2266  case 0: // 0.9
2267  fEtaCut = 0.9;
2268  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2269  fEtaCutMin = -0.1;
2270  fLineCutZRSlopeMin = 0.;
2271  break;
2272  case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2273  fEtaCut = 0.6;
2274  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2275  fEtaCutMin = -0.1;
2276  fLineCutZRSlopeMin = 0.;
2277  break;
2278  case 2: // 1.4
2279  fEtaCut = 1.4;
2280  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2281  fEtaCutMin = -0.1;
2282  fLineCutZRSlopeMin = 0.;
2283  break;
2284  case 3: // 0.65
2285  fEtaCut = 0.65;
2286  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2287  fEtaCutMin = -0.1;
2288  fLineCutZRSlopeMin = 0.;
2289  break;
2290  case 4: // 0.75
2291  fEtaCut = 0.75;
2292  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2293  fEtaCutMin = -0.1;
2294  fLineCutZRSlopeMin = 0.;
2295  break;
2296  case 5: // 0.5
2297  fEtaCut = 0.5;
2298  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2299  fEtaCutMin = -0.1;
2300  fLineCutZRSlopeMin = 0.;
2301  break;
2302  case 6: // 5.
2303  fEtaCut = 5.;
2304  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2305  fEtaCutMin = -0.1;
2306  fLineCutZRSlopeMin = 0.;
2307  break;
2308  case 7:
2309  if (fIsHeavyIon==1){
2310  fEtaCut = 0.7;
2311  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2312  fEtaCutMin = -0.1;
2313  fLineCutZRSlopeMin = 0.;
2314  break;
2315  } else {
2316  fEtaCut = 0.3;
2317  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2318  fEtaCutMin = -0.1;
2319  fLineCutZRSlopeMin = 0.;
2320  break;
2321  }
2322  // case 8: // 0.1 - 0.8
2323  // fEtaCut = 0.9;
2324  // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2325  // fEtaCutMin = 0.1;
2326  // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2327  // break;
2328  case 8: // 0.4
2329  fEtaCut = 0.4;
2330  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2331  fEtaCutMin = -0.1;
2332  fLineCutZRSlopeMin = 0.;
2333  break;
2334  case 9: // 10
2335  fEtaCut = 10;
2336  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2337  fEtaCutMin = -0.1;
2338  fLineCutZRSlopeMin = 0.;
2339  break;
2340  case 10: // 0.2-0.9
2341  fEtaCut = 0.9;
2342  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2343  fEtaCutMin = 0.2;
2344  fLineCutZRSlopeMin = 0.;
2345  break;
2346  case 11: // 0.2-0.9
2347  fEtaCut = 0.9;
2348  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2349  fEtaCutMin = 0.2;
2350  fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2351  break;
2352  case 12: // 0.85
2353  fEtaCut = 0.85;
2354  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2355  fEtaCutMin = -0.1;
2356  fLineCutZRSlopeMin = 0.;
2357  break;
2358  case 13: // 0.8
2359  fEtaCut = 0.8;
2360  fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2361  fEtaCutMin = -0.1;
2362  fLineCutZRSlopeMin = 0.;
2363  break;
2364  default:
2365  AliError(Form(" EtaCut not defined %d",etaCut));
2366  return kFALSE;
2367  }
2368  return kTRUE;
2369 }
2370 
2373  // Set Cut
2374  switch(RCut){
2375  case 0:
2376  fMinR=0;
2377  fMaxR = 180.;
2378  break;
2379  case 1:
2380  fMinR=2.8;
2381  fMaxR = 180.;
2382  break;
2383  case 2:
2384  fMinR=5.;
2385  fMaxR = 180.;
2386  break;
2387  case 3:
2388  fMaxR = 70.;
2389  fMinR = 10.;
2390  break;
2391  case 4:
2392  fMaxR = 70.;
2393  fMinR = 5.;
2394  break;
2395  case 5:
2396  fMaxR = 180.;
2397  fMinR = 10.;
2398  break;
2399  case 6:
2400  fMaxR = 180.;
2401  fMinR = 20.;
2402  break;
2403  case 7:
2404  fMaxR = 180.;
2405  fMinR = 35.; //old 26.
2406  break;
2407  case 8:
2408  fMaxR = 180.;
2409  fMinR = 12.5;
2410  break;
2411  case 9:
2412  fMaxR = 180.;
2413  fMinR = 7.5;
2414  break;
2415  case 10:
2416  fMaxR = 33.5;
2417  fMinR = 5.;
2418  break;
2419  case 11:
2420  fMaxR = 72.;
2421  fMinR = 33.5;
2422  break;
2423  case 12:
2424  fMaxR = 180.;
2425  fMinR = 72.;
2426  break;
2427  case 13:
2428  fMaxR = 55.;
2429  fMinR = 5.;
2430  break;
2431  case 14:
2432  fMaxR = 180.;
2433  fMinR = 55.;
2434  break;
2435  case 15:
2436  fMaxR = 72.;
2437  fMinR = 5.;
2438  break;
2439  case 16:
2440  fMaxR = 180.;
2441  fMinR = 95.;
2442  break;
2443 
2444  default:
2445  AliError("RCut not defined");
2446  return kFALSE;
2447  }
2448  return kTRUE;
2449 }
2450 
2453 
2454  switch(etaPhiCut) {
2455  case 0: //no specific eta range selected, full eta range
2458  break;
2459  case 1: //eta < 0 only
2462  fEtaForPhiCutMax = 0.;
2463  break;
2464  case 2://eta > 0 only
2466  fEtaForPhiCutMin = 0.;
2468  break;
2469  default:
2470  AliError(Form("EtaForPhiCut not defined %d",etaPhiCut));
2471  return kFALSE;
2472  }
2473 
2474  return kTRUE;
2475 }
2476 
2478 // This are exclusion cuts, everything between fMinPhiCut & fMaxPhiCut will be excluded
2480 
2481  switch(minPhiCut) {
2482  case 0:
2483  fDoShrinkTPCAcceptance = kFALSE;
2484  fMinPhiCut = 0;
2485  break;
2486  case 1:
2488  fMinPhiCut = 1.7; //OROC C08 large cut
2489  break;
2490  case 2:
2492  fMinPhiCut = 4.4; //EMCal
2493  break;
2494  case 3:
2496  fMinPhiCut = 1.0; //PHOS
2497  break;
2498  case 4:
2500  fMinPhiCut = 3.4; //EMCal tight
2501  break;
2502  case 5:
2504  fMinPhiCut = 2.0; //OROC C08 medium cut
2505  break;
2506  case 6:
2508  fMinPhiCut = 2.2; //OROC C08 small cut
2509  break;
2510  case 7:
2512  fMinPhiCut = 2.4; //OROC C08 tightest cut
2513  break;
2514  case 8:
2516  fMinPhiCut = 4.54; //PHOS phi
2517  break;
2518  default:
2519  AliError(Form("MinPhiCut not defined %d",minPhiCut));
2520  return kFALSE;
2521  }
2522 
2523  return kTRUE;
2524 }
2525 
2527 // This are exclusion cuts, everything between fMinPhiCut & fMaxPhiCut will be excluded
2529 
2530  switch(maxPhiCut) {
2531  case 0:
2533  fMaxPhiCut = 2*TMath::Pi()+0.00001;
2534  break;
2535  case 1:
2537  fMaxPhiCut = 4.3; //OROC C08 large cut
2538  break;
2539  case 2:
2541  fMaxPhiCut = 5.8; //EMCal
2542  break;
2543  case 3:
2545  fMaxPhiCut = 3.0; //PHOS
2546  break;
2547  case 4:
2549  fMaxPhiCut = 1.; //EMCal
2550  break;
2551  case 5:
2553  fMaxPhiCut = 4.0; //OROC C08 medium cut
2554  break;
2555  case 6:
2557  fMaxPhiCut = 3.8; //OROC C08 small cut
2558  break;
2559  case 7:
2561  fMaxPhiCut = 3.6; //OROC C08 tighest cut
2562  break;
2563  case 8:
2565  fMaxPhiCut = 5.59; //PHOS phi
2566  break;
2567  default:
2568  AliError(Form("MaxPhiCut not defined %d",maxPhiCut));
2569  return kFALSE;
2570  }
2571 
2572  return kTRUE;
2573 }
2574 
2575 
2578  switch(singlePtCut){
2579  case 0: // 0.050 GeV + min gamma pT cut of 20 MeV
2580  fSinglePtCut = 0.050;
2581  fPtCut = 0.02;
2582  break;
2583  case 1: // 0.100 GeV + min gamma pT cut of 20 MeV
2584  fSinglePtCut = 0.100;
2585  fPtCut = 0.02;
2586  break;
2587  case 2: // 0.150 GeV + min gamma pT cut of 20 MeV
2588  fSinglePtCut = 0.150;
2589  fPtCut = 0.02;
2590  break;
2591  case 3: // 0.200 GeV + min gamma pT cut of 20 MeV
2592  fSinglePtCut = 0.200;
2593  fPtCut = 0.02;
2594  break;
2595  case 4: // 0.075 GeV + min gamma pT cut of 20 MeV
2596  fSinglePtCut = 0.075;
2597  fPtCut = 0.02;
2598  break;
2599  case 5: // 0.125 GeV + min gamma pT cut of 20 MeV
2600  fSinglePtCut = 0.125;
2601  fPtCut = 0.02;
2602  break;
2603  case 6: // 0.04 GeV + min gamma pT cut of 10 MeV
2604  fSinglePtCut = 0.040;
2605  fPtCut = 0.01;
2606  break;
2607  case 7: // 0.0 GeV + min gamma pT cut of 0 MeV
2608  fSinglePtCut = 0.0;
2609  fPtCut = 0.0;
2610  break;
2611  case 8: // 0.02 GeV + min gamma pT cut of 20 MeV, equivalent to .05 for the low B field runs
2612  fSinglePtCut = 0.02;
2613  fPtCut = 0.01;
2614  break;
2615  case 9: // 0.050 GeV + min gamma pT cut of 100 MeV
2616  fSinglePtCut = 0.050;
2617  fPtCut = 0.100;
2618  break;
2619  case 10: //a: 0.050 GeV + min gamma pT cut of 150 MeV
2620  fSinglePtCut = 0.050;
2621  fPtCut = 0.150;
2622  break;
2623  case 11: //b: 0.050 GeV + min gamma pT cut of 200 MeV
2624  fSinglePtCut = 0.050;
2625  fPtCut = 0.200;
2626  break;
2627  case 12: //c: 0.060 GeV
2628  fSinglePtCut = 0.060;
2629  break;
2630  case 13: //d: 0.060 GeV + min gamma pT cut of 100 MeV
2631  fSinglePtCut = 0.060;
2632  fPtCut = 0.100;
2633  break;
2634  case 14: //e: 0.060 GeV + min gamma pT cut of 150 MeV
2635  fSinglePtCut = 0.060;
2636  fPtCut = 0.150;
2637  break;
2638  case 15: //f: 0.060 GeV + min gamma pT cut of 200 MeV
2639  fSinglePtCut = 0.060;
2640  fPtCut = 0.200;
2641  break;
2642  case 16: //g: 0.075 GeV + min gamma pT cut of 150 MeV
2643  fSinglePtCut = 0.075;
2644  fPtCut = 0.150;
2645  break;
2646  case 17: //h: 0.100 GeV + min gamma pT cut of 200 MeV
2647  fSinglePtCut = 0.100;
2648  fPtCut = 0.200;
2649  break;
2650  case 18: //i: 0.150 GeV + min gamma pT cut of 300 MeV
2651  fSinglePtCut = 0.150;
2652  fPtCut = 0.300;
2653  break;
2654  case 19: //j: asym: 0.100 GeV and 0.075 GeV
2655  fSinglePtCut = 0.100;
2656  fDoAsymPtCut = kTRUE;
2657  fSinglePtCut2= 0.075;
2658  break;
2659  case 20: //k: asym: 0.150 GeV and 0.075 GeV
2660  fSinglePtCut = 0.150;
2661  fDoAsymPtCut = kTRUE;
2662  fSinglePtCut2= 0.075;
2663  break;
2664  case 21: //l: asym: 0.200 GeV and 0.075 GeV
2665  fSinglePtCut = 0.200;
2666  fDoAsymPtCut = kTRUE;
2667  fSinglePtCut2= 0.075;
2668  break;
2669  case 22: // m: 0.080 GeV + min gamma pT cut of 20 MeV
2670  fSinglePtCut = 0.080;
2671  fPtCut = 0.02;
2672  break;
2673  case 23: // n: 0.090 GeV + min gamma pT cut of 20 MeV
2674  fSinglePtCut = 0.090;
2675  fPtCut = 0.02;
2676  break;
2677  case 24: // o: 0.024 GeV + min gamma pT cut of 20 MeV ; equiv. 0.06 for lowB
2678  fSinglePtCut = 0.024;
2679  fPtCut = 0.01;
2680  break;
2681  case 25: // p: 0.030 GeV + min gamma pT cut of 20 MeV ; equiv. 0.075 for lowB
2682  fSinglePtCut = 0.030;
2683  fPtCut = 0.01;
2684  break;
2685  case 26: // q: 0.032 GeV + min gamma pT cut of 20 MeV ; equiv. 0.08 for lowB
2686  fSinglePtCut = 0.032;
2687  fPtCut = 0.01;
2688  break;
2689  case 27: // r: 0.036 GeV + min gamma pT cut of 20 MeV ; equiv. 0.09 for lowB
2690  fSinglePtCut = 0.036;
2691  fPtCut = 0.01;
2692  break;
2693  case 28: // s: 0.040 GeV + min gamma pT cut of 20 MeV ; equiv. 0.075 for lowB
2694  fSinglePtCut = 0.040;
2695  fPtCut = 0.01;
2696  break;
2697 
2698  default:
2699  AliError(Form("singlePtCut not defined %d",singlePtCut));
2700  return kFALSE;
2701  }
2702  return kTRUE;
2703 }
2704 
2707  switch(clsTPCCut){
2708  case 0: // 0
2709  fMinClsTPC= 0.;
2710  break;
2711  case 1: // 60
2712  fMinClsTPC= 60.;
2713  break;
2714  case 2: // 80
2715  fMinClsTPC= 80.;
2716  break;
2717  case 3: // 100
2718  fMinClsTPC= 100.;
2719  break;
2720  case 4: // 95% of findable clusters
2721  fMinClsTPCToF= 0.95;
2723  break;
2724  case 5: // 0% of findable clusters
2725  fMinClsTPCToF= 0.0;
2727  break;
2728  case 6: // 70% of findable clusters
2729  fMinClsTPCToF= 0.7;
2731  break;
2732  case 7: // 0% of findable clusters
2733  fMinClsTPCToF= 0.35;
2735  break;
2736  case 8:
2737  fMinClsTPCToF= 0.35;
2739  break;
2740  case 9:
2741  fMinClsTPCToF= 0.6;
2743  break;
2744  default:
2745  AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2746  return kFALSE;
2747  }
2748  return kTRUE;
2749 }
2750 
2753  switch(ededxSigmaCut){
2754  case 0: // -10,10
2757  break;
2758  case 1: // -5,5
2761  break;
2762  case 2: // -3,5
2765  break;
2766  case 3: // -4,5
2769  break;
2770  case 4: // -6,7
2773  break;
2774  case 5: // -4,4
2777  break;
2778  case 6: // -2.5,4
2781  break;
2782  case 7: // -2,3.5
2785  break;
2786  case 8: // -2.5,3.
2789  break;
2790  case 9: // -2.5,5.
2793  break;
2794  case 10: //a -3,3.
2797  break;
2798  case 11: //b -3.2,3.2.
2801  break;
2802  case 12: //c -2.8,2.8
2805  break;
2806  case 13: //d -1E9,1E9
2809  break;
2810  case 14: //e -7,1
2813  break;
2814  default:
2815  AliError("TPCdEdxCutElectronLine not defined");
2816  return kFALSE;
2817 
2818  }
2819  return kTRUE;
2820 }
2821 
2824 
2825  switch(pidedxSigmaCut){
2826  case 0: // -10
2829  break;
2830  case 1: // 0
2833  break;
2834  case 2: // 1
2837  break;
2838  case 3: // 1
2841  break;
2842  case 4: // 3.0sigma, 1.0 sigma at high pt
2845  break;
2846  case 5: // 1
2849  break;
2850  case 6: // 1
2853  break;
2854  case 7: // 1
2857  break;
2858  case 8: // 1
2861  break;
2862  case 9:
2863  fPIDnSigmaAbovePionLine=1; // We need a bit less tight cut on dE/dx
2865  break;
2866  case 10: //a
2867  fPIDnSigmaAbovePionLine=-3; // We need a bit less tight cut on dE/dx
2869  break;
2870  default:
2871  AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2872  return kFALSE;
2873  }
2874  return kTRUE;
2875 }
2876 
2879  switch(piMomdedxSigmaCut){
2880  case 0: // 0.5 GeV
2882  break;
2883  case 1: // 1. GeV
2885  break;
2886  case 2: // 1.5 GeV
2888  break;
2889  case 3: // 20.0 GeV
2891  break;
2892  case 4: // 50.0 GeV
2894  break;
2895  case 5: // 0.3 GeV
2897  break;
2898  case 6: // 0.25 GeV
2900  break;
2901  case 7: // 0.4 GeV
2903  break;
2904  case 8: // 0.2 GeV
2906  break;
2907  default:
2908  AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2909  return kFALSE;
2910  }
2911  return kTRUE;
2912 }
2913 
2916  switch(piMaxMomdedxSigmaCut){
2917  case 0: // 100. GeV
2919  break;
2920  case 1: // 5. GeV
2922  break;
2923  case 2: // 4. GeV
2925  break;
2926  case 3: // 3.5 GeV
2928  break;
2929  case 4: // 3. GeV
2931  break;
2932  case 5: // 7. GeV
2934  break;
2935  case 6: // 2. GeV
2937  break;
2938  default:
2939  AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2940  return kFALSE;
2941  }
2942  return kTRUE;
2943 }
2944 
2947  switch(LowPRejectionSigmaCut){
2948  case 0: //
2952  fDoKaonRejectionLowP = kFALSE;
2953  fDoProtonRejectionLowP = kFALSE;
2954  fDoPionRejectionLowP = kFALSE;
2956  break;
2957  case 1: //
2961  fDoKaonRejectionLowP = kTRUE;
2962  fDoProtonRejectionLowP = kTRUE;
2963  fDoPionRejectionLowP = kTRUE;
2965  break;
2966  case 2: //
2970  fDoKaonRejectionLowP = kTRUE;
2971  fDoProtonRejectionLowP = kTRUE;
2972  fDoPionRejectionLowP = kTRUE;
2974  break;
2975  case 3: //
2979  fDoKaonRejectionLowP = kTRUE;
2980  fDoProtonRejectionLowP = kTRUE;
2981  fDoPionRejectionLowP = kTRUE;
2983  break;
2984  case 4: //
2988  fDoKaonRejectionLowP = kFALSE;
2989  fDoProtonRejectionLowP = kFALSE;
2990  fDoPionRejectionLowP = kTRUE;
2992  break;
2993  case 5: //
2997  fDoKaonRejectionLowP = kFALSE;
2998  fDoProtonRejectionLowP = kFALSE;
2999  fDoPionRejectionLowP = kTRUE;
3001  break;
3002  case 6: //
3006  fDoKaonRejectionLowP = kFALSE;
3007  fDoProtonRejectionLowP = kFALSE;
3008  fDoPionRejectionLowP = kTRUE;
3010  break;
3011  case 7: //
3015  fDoKaonRejectionLowP = kFALSE;
3016  fDoProtonRejectionLowP = kFALSE;
3017  fDoPionRejectionLowP = kTRUE;
3019  break;
3020  case 8: //
3024  fDoKaonRejectionLowP = kFALSE;
3025  fDoProtonRejectionLowP = kTRUE;
3026  fDoPionRejectionLowP = kFALSE;
3028  break;
3029  default:
3030  AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
3031  return kFALSE;
3032  }
3033  return kTRUE;
3034 }
3035 
3038  switch(kappaCut){
3039  case 0: // completely open
3040  fKappaMaxCut=200;
3041  fKappaMinCut=-200;
3042  break;
3043  case 1: // mainly pi pi
3044  fKappaMaxCut=-13;
3045  fKappaMinCut=-20;
3046  break;
3047  case 2: // mainly pi e
3048  fKappaMaxCut=-6;
3049  fKappaMinCut=-11;
3050  break;
3051  case 3: // signal
3052  fKappaMaxCut=5;
3053  fKappaMinCut=-3;
3054  break;
3055  case 4: // remaining
3056  fKappaMaxCut=20;
3057  fKappaMinCut=11;
3058  break;
3059  case 5: // -5-10 full signal peak(including background)
3060  fKappaMaxCut=10;
3061  fKappaMinCut=-5;
3062  break;
3063  case 6: //
3064  fKappaMaxCut=10;
3065  fKappaMinCut=-3;
3066  break;
3067  case 7: //
3068  fKappaMaxCut=10;
3069  fKappaMinCut=0;
3070  break;
3071  default:
3072  AliError("KappaTPCCut not defined");
3073  return kFALSE;
3074 
3075  }
3076  return kTRUE;
3077 }
3078 
3079 
3082  // Set Cut
3083  switch(TOFelectronPID){
3084  case 0: // no cut
3085  fUseTOFpid = kFALSE;
3088  break;
3089  case 1: // -7,7
3090  fUseTOFpid = kTRUE;
3093  break;
3094  case 2: // -5,5
3095  fUseTOFpid = kTRUE;
3098  break;
3099  case 3: // -3,5
3100  fUseTOFpid = kTRUE;
3103  break;
3104  case 4: // -2,3
3105  fUseTOFpid = kTRUE;
3108  break;
3109  case 5: // -3,3
3110  fUseTOFpid = kTRUE;
3113  break;
3114  default:
3115  AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
3116  return kFALSE;
3117  }
3118  return kTRUE;
3119 }
3120 
3123  // Set Cut
3124  switch(ITSelectronPID){
3125  case 0: // no cut
3126  fUseITSpid = kFALSE;
3129  fMaxPtPIDITS = 1.5;
3130  break;
3131  case 1: // -3,3
3132  fUseITSpid = kTRUE;
3135  fMaxPtPIDITS = 1.5;
3136  break;
3137  case 2: // -2,2
3138  fUseITSpid = kTRUE;
3141  fMaxPtPIDITS = 1.5;
3142  break;
3143  case 3: // -1,1
3144  fUseITSpid = kTRUE;
3147  fMaxPtPIDITS = 1.5;
3148  break;
3149  case 4: // -3,5
3150  fUseITSpid = kTRUE;
3153  fMaxPtPIDITS = 1.5;
3154  break;
3155  case 5: // -5,5
3156  fUseITSpid = kTRUE;
3159  fMaxPtPIDITS = 1.5;
3160  break;
3161  case 6: // -3,3
3162  fUseITSpid = kTRUE;
3165  fMaxPtPIDITS = 2;
3166  break;
3167  case 7: // -2,2
3168  fUseITSpid = kTRUE;
3171  fMaxPtPIDITS = 2;
3172  break;
3173  case 8: // -1,1
3174  fUseITSpid = kTRUE;
3177  fMaxPtPIDITS = 2;
3178  break;
3179  case 9: // -3,5
3180  fUseITSpid = kTRUE;
3183  fMaxPtPIDITS = 2;
3184  break;
3185  default:
3186  AliError(Form("ITSelectronPID not defined %d",ITSelectronPID));
3187  return kFALSE;
3188  }
3189  return kTRUE;
3190 }
3191 
3194  // Set Cut
3195  switch(TRDelectronPID){
3196  case 0: // no cut
3197  fDoTRDPID = kFALSE;
3198  fTRDPIDBelowCut=-100;
3199  fTRDPIDAboveCut=100;
3200  break;
3201  default:
3202  AliError(Form("TRDelectronPID not defined %d",TRDelectronPID));
3203  return kFALSE;
3204  }
3205  return kTRUE;
3206 }
3207 
3208 
3211  switch(QtMaxCut){
3212  case 0: //
3213  fQtMax=1.;
3214  fDoQtGammaSelection=kFALSE;
3215  fDo2DQt=kFALSE;
3216  break;
3217  case 1:
3218  fQtMax=0.1;
3219  fDo2DQt=kFALSE;
3220  break;
3221  case 2:
3222  fQtMax=0.06;
3223  fDo2DQt=kTRUE;
3224  break;
3225  case 3:
3226  fQtMax=0.05;
3227  fDo2DQt=kFALSE;
3228  break;
3229  case 4:
3230  fQtMax=0.03;
3231  fDo2DQt=kFALSE;
3232  break;
3233  case 5:
3234  fQtMax=0.02;
3235  fDo2DQt=kFALSE;
3236  break;
3237  case 6:
3238  fQtMax=0.02;
3239  fDo2DQt=kTRUE;
3240  break;
3241  case 7:
3242  fQtMax=0.15;
3243  fDo2DQt=kFALSE;
3244  break;
3245  case 8:
3246  fQtMax=0.05;
3247  fDo2DQt=kTRUE;
3248  break;
3249  case 9:
3250  fQtMax=0.03;
3251  fDo2DQt=kTRUE;
3252  break;
3253  default:
3254  AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
3255  return kFALSE;
3256  }
3257  return kTRUE;
3258 }
3259 
3262 
3263  switch(chi2GammaCut){
3264  case 0: // 100
3265  fChi2CutConversion = 100.;
3266  break;
3267  case 1: // 50
3268  fChi2CutConversion = 50.;
3269  break;
3270  case 2: // 30
3271  fChi2CutConversion = 30.;
3272  break;
3273  case 3:
3274  fChi2CutConversion = 200.;
3275  break;
3276  case 4:
3277  if (fIsHeavyIon==1){
3278  fChi2CutConversion = 7.;
3279  } else {
3280  fChi2CutConversion = 500.;
3281  }
3282  break;
3283  case 5:
3284  fChi2CutConversion = 100000.;
3285  break;
3286  case 6:
3287  fChi2CutConversion = 5.;
3288  break;
3289  case 7:
3290  fChi2CutConversion = 10.;
3291  break;
3292  case 8:
3293  fChi2CutConversion = 20.;
3294  break;
3295  case 9:
3296  fChi2CutConversion = 15.;
3297  break;
3298  case 10:
3299  fChi2CutConversion = 25.;
3300  break;
3301  default:
3302  AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
3303  return kFALSE;
3304  }
3305  return kTRUE;
3306 }
3307 
3310  switch(psiCut) {
3311  case 0:
3312  fPsiPairCut = 10000; //
3313  break;
3314  case 1:
3315  fPsiPairCut = 0.1; //
3316  break;
3317  case 2:
3318  fPsiPairCut = 0.05; // Standard
3319  break;
3320  case 3:
3321  fPsiPairCut = 0.035; //
3322  break;
3323  case 4:
3324  fPsiPairCut = 0.2; //
3325  break;
3326  case 5:
3327  fPsiPairCut = 0.1; //
3328  fDo2DPsiPairChi2 = kTRUE;
3329  break;
3330  case 6:
3331  fPsiPairCut = 0.05; //
3332  fDo2DPsiPairChi2 = kTRUE;
3333  break;
3334  case 7:
3335  if (fIsHeavyIon==1){
3336  fPsiPairCut = 0.07; //
3337  } else {
3338  fPsiPairCut = 0.035; //
3339  }
3340  fDo2DPsiPairChi2 = kTRUE;
3341  break;
3342  case 8:
3343  fPsiPairCut = 0.2; //
3344  fDo2DPsiPairChi2 = kTRUE; //
3345  break;
3346  case 9:
3347  // if (fIsHeavyIon==1){ //AM 2016-05-13
3348  fPsiPairCut = 0.1; //
3349  fDo2DPsiPairChi2 = kTRUE;
3350  fIncludeRejectedPsiPair = kTRUE;
3351  break;
3352 
3353  case 10:
3354  fPsiPairCut = 0.25; //
3355  fDo2DPsiPairChi2 = kTRUE; //
3356  break;
3357 
3358  case 11:
3359  fPsiPairCut = 0.3; //
3360  fDo2DPsiPairChi2 = kTRUE; //
3361  break;
3362 
3363  case 12:
3364  fPsiPairCut = 0.15; //
3365  fDo2DPsiPairChi2 = kTRUE; //
3366  break;
3367 
3368 
3369  // } else {
3370  // fPsiPairCut = 0.5; //
3371  // break;
3372  // }
3373  default:
3374  AliError(Form("PsiPairCut not defined %d",psiCut));
3375  return kFALSE;
3376  }
3377 
3378  return kTRUE;
3379 }
3380 
3383  // Set Cut
3384  switch(doPhotonAsymmetryCut){
3385  case 0:
3389  break;
3390  case 1:
3393  fMinPhotonAsymmetry=0.04;
3394  break;
3395  case 2:
3398  fMinPhotonAsymmetry=0.06;
3399  break;
3400  case 3:
3403  fMinPhotonAsymmetry=0.05;
3404  break;
3405  case 4:
3408  fFAsymmetryCut = new TF1("fFAsymmetryCut","[0] + [1]*tanh(2*TMath::Power(x,[2]))",0.,100.);
3409  fFAsymmetryCut->SetParameter(0,0.3);
3410  fFAsymmetryCut->SetParameter(1,0.66);
3411  fFAsymmetryCut->SetParameter(2,0.7);
3414  break;
3415  case 5:
3418  fFAsymmetryCut = new TF1("fFAsymmetryCut","[0] + [1]*tanh(2*TMath::Power(x,[2]))",0.,100.);
3419  fFAsymmetryCut->SetParameter(0,0.14);
3420  fFAsymmetryCut->SetParameter(1,0.66);
3421  fFAsymmetryCut->SetParameter(2,0.5);
3424  break;
3425  case 6:
3428  fMinPhotonAsymmetry=0.05;
3429  break;
3430  case 7:
3433  fMinPhotonAsymmetry=0.05;
3434  break;
3435  case 8:
3438  fFAsymmetryCut = new TF1("fFAsymmetryCut","[0] + [1]*tanh(2*TMath::Power(x,[2]))",0.,100.);
3439  fFAsymmetryCut->SetParameter(0,0.5);
3440  fFAsymmetryCut->SetParameter(1,0.46);
3441  fFAsymmetryCut->SetParameter(2,0.7);
3444  break;
3445  default:
3446  AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
3447  return kFALSE;
3448  }
3449  fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
3450  return kTRUE;
3451 }
3452 
3455 
3456  switch(cosCut){
3457  case 0:
3458  fCosPAngleCut = -1;
3459  break;
3460  case 1:
3461  fCosPAngleCut = 0;
3462  break;
3463  case 2:
3464  fCosPAngleCut = 0.5;
3465  break;
3466  case 3:
3467  fCosPAngleCut = 0.75;
3468  break;
3469  case 4:
3470  fCosPAngleCut = 0.85;
3471  break;
3472  case 5:
3473  fCosPAngleCut = 0.88;
3474  break;
3475  case 6:
3476  fCosPAngleCut = 0.9;
3477  break;
3478  case 7:
3479  fCosPAngleCut = 0.95;
3480  break;
3481  case 8:
3482  fCosPAngleCut = 0.98;
3483  break;
3484  case 9:
3485  fCosPAngleCut = 0.99;
3486  break;
3487  case 10://a
3488  fCosPAngleCut = 0.995;
3489  break;
3490  case 11://b
3491  fCosPAngleCut = 0.985;
3492  break;
3493  case 12://c
3494  fCosPAngleCut = 0.996;
3495  break;
3496  case 13://d
3497  fCosPAngleCut = 0.997;
3498  break;
3499  case 14://e
3500  fCosPAngleCut = 0.998;
3501  break;
3502  case 15://f
3503  fCosPAngleCut = 0.999;
3504  break;
3505  default:
3506  AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
3507  return kFALSE;
3508  }
3509 
3510  return kTRUE;
3511 }
3512 
3515 
3516  switch(sharedElec){
3517  case 0:
3518  fDoSharedElecCut = kFALSE;
3520  fPhotonQualityCut = 0;
3521  break;
3522  case 1:
3523  fDoSharedElecCut = kTRUE;
3525  fPhotonQualityCut = 0;
3526  break;
3527  case 2:
3528  fDoSharedElecCut = kFALSE;
3530  fPhotonQualityCut = 1;
3531  break;
3532  case 3:
3533  fDoSharedElecCut = kFALSE;
3535  fPhotonQualityCut = 2;
3536  break;
3537  case 4:
3538  fDoSharedElecCut = kFALSE;
3540  fPhotonQualityCut = 3;
3541  break;
3542  default:
3543  AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3544  return kFALSE;
3545  }
3546 
3547  return kTRUE;
3548 }
3549 
3552 
3553  switch(toClose){
3554  case 0:
3555  fDoToCloseV0sCut = kFALSE;
3556  fminV0Dist = 250;
3557  break;
3558  case 1:
3559  fDoToCloseV0sCut = kTRUE;
3560  fminV0Dist = 1;
3561  break;
3562  case 2:
3563  fDoToCloseV0sCut = kTRUE;
3564  fminV0Dist = 2;
3565  break;
3566  case 3:
3567  fDoToCloseV0sCut = kTRUE;
3568  fminV0Dist = 3;
3569  break;
3570  case 4:
3571  fDoToCloseV0sCut = kTRUE;
3572  fDoDoubleCountingCut = kTRUE;
3573  fMinRDC=0.;
3574  fDeltaR=6.;
3575  fOpenAngle=0.02;
3576  break;
3577  case 5:
3578  fDoToCloseV0sCut = kTRUE;
3579  fDoDoubleCountingCut = kTRUE;
3580  fMinRDC=0.;
3581  fDeltaR=6.;
3582  fOpenAngle=0.03;
3583  break;
3584  case 6:
3585  fDoToCloseV0sCut = kTRUE;
3586  fDoDoubleCountingCut = kTRUE;
3587  fMinRDC=0.;
3588  fDeltaR=6.;
3589  fOpenAngle=0.04;
3590  break;
3591 
3592  default:
3593  AliError(Form("Shared Electron Cut not defined %d",toClose));
3594  return kFALSE;
3595  }
3596  return kTRUE;
3597 }
3598 
3601  switch(TRDElectronCut){
3602  case 0:
3603  fDoTRDPID=kFALSE;
3604  break;
3605  case 1:
3606  fDoTRDPID=kTRUE;
3607  fPIDTRDEfficiency=0.1;
3608  break;
3609  case 8:
3610  fDoTRDPID=kTRUE;
3611  fPIDTRDEfficiency=0.8;
3612  break;
3613  case 9:
3614  fDoTRDPID=kTRUE;
3615  fPIDTRDEfficiency=0.9;
3616  break;
3617  default:
3618  AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3619  return kFALSE;
3620  }
3621 
3622  return kTRUE;
3623 }
3624 
3627  // Set Cut
3628  switch(DCAZPhotonPrimVtx){
3629  case 0: //
3630  fDCAZPrimVtxCut = 1000;
3631  break;
3632  case 1: //
3633  fDCAZPrimVtxCut = 10;
3634  break;
3635  case 2: //
3636  fDCAZPrimVtxCut = 5;
3637  break;
3638  case 3: //
3639  fDCAZPrimVtxCut = 4;
3640  break;
3641  case 4: //
3642  fDCAZPrimVtxCut = 3;
3643  break;
3644  case 5: //
3645  fDCAZPrimVtxCut = 2.5;
3646  break;
3647  case 6: //
3648  fDCAZPrimVtxCut = 2;
3649  break;
3650  case 7: //
3651  fDCAZPrimVtxCut = 1.5;
3652  break;
3653  case 8: //
3654  fDCAZPrimVtxCut = 1;
3655  break;
3656  case 9: //
3657  fDCAZPrimVtxCut = 0.5;
3658  break;
3659  default:
3660  cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3661  return kFALSE;
3662  }
3663  return kTRUE;
3664 }
3665 
3668  // Set Cut
3669  switch(DCARPhotonPrimVtx){
3670  case 0: //
3671  fDCARPrimVtxCut = 1000;
3672  break;
3673  case 1: //
3674  fDCARPrimVtxCut = 10;
3675  break;
3676  case 2: //
3677  fDCARPrimVtxCut = 5;
3678  break;
3679  case 3: //
3680  fDCARPrimVtxCut = 4;
3681  break;
3682  case 4: //
3683  fDCARPrimVtxCut = 3;
3684  break;
3685  case 5: //
3686  fDCARPrimVtxCut = 2.5;
3687  break;
3688  case 6: //
3689  fDCARPrimVtxCut = 2;
3690  break;
3691  case 7: //
3692  fDCARPrimVtxCut = 1.5;
3693  break;
3694  case 8: //
3695  fDCARPrimVtxCut = 1;
3696  break;
3697  case 9: //
3698  fDCARPrimVtxCut = 0.5;
3699  break;
3700  default:
3701  cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3702  return kFALSE;
3703  }
3704  return kTRUE;
3705 }
3706 
3709  // Set Cut
3710  switch(inOutPlane){
3711  case 0: //
3712  fInPlaneOutOfPlane = 0; // No Event Plane
3713  break;
3714  case 1: //
3715  fInPlaneOutOfPlane = 1; // In-Plane
3716  break;
3717  case 2: //
3718  fInPlaneOutOfPlane = 2; // Out-Of-Plane
3719  break;
3720  default:
3721  cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3722  return kFALSE;
3723  }
3724  return kTRUE;
3725 }
3726 
3727 
3730  // Get first TPC row
3731  Int_t firstTPCRow = 0;
3732  Double_t radiusI = 84.8;
3733  Double_t radiusO = 134.6;
3734  Double_t radiusOB = 198.;
3735  Double_t rSizeI = 0.75;
3736  Double_t rSizeO = 1.;
3737  Double_t rSizeOB = 1.5;
3738  Int_t nClsI = 63;
3739  Int_t nClsIO = 127;
3740 
3741  if(radius <= radiusI){
3742  return firstTPCRow;
3743  }
3744  if(radius>radiusI && radius<=radiusO){
3745  firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3746  }
3747  if(radius>radiusO && radius<=radiusOB){
3748  firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3749  }
3750 
3751  if(radius>radiusOB){
3752  firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3753  }
3754 
3755  return firstTPCRow;
3756 }
3757 
3761  if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3762  return kFALSE;
3763  }
3764  return kTRUE;
3765 }
3766 
3769  // calculates the pointing angle of the recalculated V0
3770 
3771  Double_t momV0[3] = {0,0,0};
3772  if(event->IsA()==AliESDEvent::Class()){
3773  AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3774  if(!esdEvent) return -999;
3775  AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3776  if(!v0) return -999;
3777  v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3778  }
3779  if(event->IsA()==AliAODEvent::Class()){
3780  momV0[0] = photon->GetPx();
3781  momV0[1] = photon->GetPy();
3782  momV0[2] = photon->GetPz();
3783  }
3784 
3785  //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3786  Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3787  photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3788  photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3789 
3790  Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3791  Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3792 
3793 
3794  Double_t cosinePointingAngle = -999;
3795  if(momV02*PosV02 > 0.0)
3796  cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3797 
3798  return cosinePointingAngle;
3799 }
3800 
3803 
3804  if (fDo2DPsiPairChi2){
3806  if (TMath::Abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut || (photon->GetPsiPair()) == 4){
3807  return kTRUE;
3808  } else {
3809  return kFALSE;
3810  }
3811 
3812  } else {
3813  if (TMath::Abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3814  return kTRUE;
3815  } else {
3816  return kFALSE;
3817  }
3818  }
3819  } else {
3821  if(TMath::Abs(photon->GetPsiPair()) > fPsiPairCut || (photon->GetPsiPair()) != 4){
3822  return kFALSE;
3823  } else {
3824  return kTRUE;
3825  }
3826  } else {
3827  if(TMath::Abs(photon->GetPsiPair()) > fPsiPairCut){
3828  return kFALSE;
3829  } else {
3830  return kTRUE;
3831  }
3832  }
3833  }
3834 }
3835 
3838  // returns TString with current cut number
3839  return fCutStringRead;
3840 }
3841 
3844 
3845  Int_t posLabel = photon->GetTrackLabelPositive();
3846  Int_t negLabel = photon->GetTrackLabelNegative();
3847 
3848  fElectronLabelArray[nV0*2] = posLabel;
3849  fElectronLabelArray[(nV0*2)+1] = negLabel;
3850 }
3851 
3854 
3855  Int_t posLabel = photon->GetTrackLabelPositive();
3856  Int_t negLabel = photon->GetTrackLabelNegative();
3857 
3858  for(Int_t i = 0; i<nV0s*2;i++){
3859  if(i==nV0*2) continue;
3860  if(i==(nV0*2)+1) continue;
3861  if(fElectronLabelArray[i] == posLabel){
3862  return kFALSE;}
3863  if(fElectronLabelArray[i] == negLabel){
3864  return kFALSE;}
3865  }
3866 
3867  return kTRUE;
3868 }
3869 
3872 
3873  if (fDoDoubleCountingCut && photon->GetConversionRadius() < fMinRDC) return kTRUE;
3874 
3875  Double_t posX = photon->GetConversionX();
3876  Double_t posY = photon->GetConversionY();
3877  Double_t posZ = photon->GetConversionZ();
3878 
3879  for(Int_t i = 0;i<photons->GetEntries();i++){
3880  if(nV0 == i) continue;
3881  AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3882  Double_t posCompX = photonComp->GetConversionX();
3883  Double_t posCompY = photonComp->GetConversionY();
3884  Double_t posCompZ = photonComp->GetConversionZ();
3885 
3886  if (!fDoDoubleCountingCut){
3887  Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3888 
3889  if(dist < fminV0Dist*fminV0Dist){
3890  if(photon->GetChi2perNDF() > photonComp->GetChi2perNDF()) return kFALSE;
3891  }
3892  }else{
3893  TVector3 v1(photon->Px(),photon->Py(),photon->Pz());
3894  TVector3 v2(photonComp->Px(),photonComp->Py(),photonComp->Pz());
3895  Double_t OpeningAngle=v1.Angle(v2);
3896  if( OpeningAngle < fOpenAngle && TMath::Abs(photon->GetConversionRadius()-photonComp->GetConversionRadius()) < fDeltaR){
3897  if(photon->GetChi2perNDF() > photonComp->GetChi2perNDF()) return kFALSE;
3898  }
3899  }
3900 
3901  }
3902  return kTRUE;
3903 }
3904 
3905 
3908  //Create and return standard 2010 PbPb cuts
3909  AliConversionPhotonCuts *cuts=new AliConversionPhotonCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
3910  if(!cuts->InitializeCutsFromCutString("04209297002322000000")){
3911  cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
3912  return cuts;
3913 }
3914 
3917  //Create and return standard 2010 PbPb cuts
3918  AliConversionPhotonCuts *cuts=new AliConversionPhotonCuts("StandardCuts2010pp","StandardCuts2010pp");
3919  if(!cuts->InitializeCutsFromCutString("00209366300380000000")){
3920  cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
3921  return cuts;
3922 }
3923 
3926 
3927  //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
3928  eventPlaneAngle=eventPlaneAngle+TMath::Pi();
3929  Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
3930  if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
3931  gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
3932 
3933  if(!fInPlaneOutOfPlane){
3934  if(fill&&fHistoEventPlanePhi)fHistoEventPlanePhi->Fill(gammaToEPAngle);
3935  return kTRUE;
3936  }
3937  else if(fInPlaneOutOfPlane == 1){
3938  if(TMath::Abs(gammaToEPAngle)<=0.25*TMath::Pi() || TMath::Abs(gammaToEPAngle)>=0.75*TMath::Pi()){
3939  if(fill&&fHistoEventPlanePhi)fHistoEventPlanePhi->Fill(gammaToEPAngle);
3940  return kTRUE;
3941  }
3942  else return kFALSE;
3943  }
3944  else if(fInPlaneOutOfPlane == 2){
3945  if(TMath::Abs(gammaToEPAngle)>0.25*TMath::Pi() && TMath::Abs(gammaToEPAngle)<0.75*TMath::Pi()){
3946  if(fill&&fHistoEventPlanePhi)fHistoEventPlanePhi->Fill(gammaToEPAngle);
3947  return kTRUE;
3948  }
3949  else return kFALSE;
3950  }
3951  return kFALSE;
3952 }
3953 
3956 
3957  AliAODTrack * negTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelNegative()));
3958  AliAODTrack * posTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelPositive()));
3959 
3960  if(!negTrack || !posTrack) {
3961  return 0;
3962  }
3963  if(negTrack->Charge() == posTrack->Charge()){
3964  return 0;
3965  }
3966  Int_t nClusterITSneg = negTrack->GetITSNcls();
3967  Int_t nClusterITSpos = posTrack->GetITSNcls();
3968  // cout << nClusterITSneg << "\t" << nClusterITSpos <<endl;
3969 
3970  if (nClusterITSneg > 1 && nClusterITSpos > 1){
3971  return 3;
3972  } else if (nClusterITSneg > 1 || nClusterITSpos > 1){
3973  return 2;
3974  } else {
3975  return 1;
3976  }
3977  return 0;
3978 }
3979 
3982 
3983  TString nameProfile;
3984  if (flag==1){
3985  nameProfile = "profileContainingMaterialBudgetWeights_fewRadialBins";}
3986  else if (flag==2){
3987  nameProfile = "profileContainingMaterialBudgetWeights_manyRadialBins";}
3988  else {
3989  AliError(Form("%d not a valid flag for InitMaterialBudgetWeightingOfPi0Candidates()",flag));
3990  return kFALSE;
3991  }
3992  TFile* file = TFile::Open(filename.Data());
3993  if (!file) {
3994  AliError(Form("File %s for materialbudgetweights not found",filename.Data()));
3995  return kFALSE;
3996  }
3997  fProfileContainingMaterialBudgetWeights = (TProfile*)file->Get(nameProfile.Data());
3999  AliError(Form("Histogram %s not found in file",nameProfile.Data()));
4000  return kFALSE;
4001  }
4002  fProfileContainingMaterialBudgetWeights->SetDirectory(0);
4003  file->Close();
4004  delete file;
4005 
4007  AliInfo(Form("MaterialBudgetWeightingOfPi0Candidates initialized with flag %d. This means %d radial bins will be used for the weighting. File used: %s.",flag, fProfileContainingMaterialBudgetWeights->GetNbinsX(), filename.Data()));
4008  return kTRUE;
4009 }
4010 
4013 
4014  Float_t weight = 1.0;
4015  Float_t gammaConversionRadius = gamma->GetConversionRadius();
4016  Int_t bin = fProfileContainingMaterialBudgetWeights->FindBin(gammaConversionRadius);
4017  if (bin > 0 && bin <= fProfileContainingMaterialBudgetWeights->GetNbinsX()){
4018  weight = fProfileContainingMaterialBudgetWeights->GetBinContent(bin);
4019  }
4020  return weight;
4021 }
Int_t charge
Double_t fTofPIDnSigmaAboveElectronLine
sigma cut RRnewTOF
Double_t fMinRDC
Min R for Double Counting Cut.
Bool_t SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx)
const char * filename
Definition: TestFCM.C:1
TH2F * fHistoTOFSigafter
TOF Sigma after cuts.
Bool_t SetQtMaxCut(Int_t QtMaxCut)
Float_t fMaxPhiCut
phi sector cut
Bool_t fPreSelCut
Flag for preselection cut used in V0Reader.
Double_t fMinPPhotonAsymmetryCut
Min Momentum for Asymmetry Cut.
TH2F * fHistoAcceptanceCuts
bookkeeping for acceptance cuts
#define P(T, U, S)
Double_t fPIDTRDEfficiency
required electron efficiency for TRD PID
Double_t GetArmenterosAlpha() const
double Double_t
Definition: External.C:58
TH2F * fHistodEdxCuts
bookkeeping for dEdx cuts
Bool_t RejectSharedElectronV0s(AliAODConversionPhoton *photon, Int_t nV0, Int_t nV0s)
Double_t fOpenAngle
Opening Angle for Double Counting Cut.
TH2F * fHistoPhotonCuts
bookkeeping for photon specific cuts
Double_t fPIDnSigmaAbovePionLine
sigma cut
virtual Double_t GetPz() const =0
Definition: External.C:236
Bool_t fDodEdxSigmaCut
flag to use the dEdxCut based on sigmas
TObjString * fCutString
cut number used for analysis
Double_t fMinClsTPC
minimum clusters in the TPC
const char * title
Definition: MakeQAPdf.C:27
Int_t GetFirstTPCRow(Double_t radius)
static const char * fgkCutNames[kNCuts]
Bool_t InitializeElecDeDxPostCalibration(TString filename)
Double_t fDCAZPrimVtxCut
cut value for the maximum distance in Z between the photon & the primary vertex [cm] ...
Bool_t fSwitchToKappa
switches from standard dEdx nSigma TPC cuts to Kappa TPC
TH1F * fHistoCutIndex
bookkeeping for cuts
Bool_t PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent *event)
Bool_t SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
TH2F * fHistoTPCdEdxSigafter
TPC Sigm dEdx after cuts.
Double_t fMinPhotonAsymmetry
Asymmetry Cut.
Double_t fTRDPIDAboveCut
TRD cut range.
Float_t fEtaForPhiCutMin
eta cut for phi sector selection
#define ASSIGNARRAY(i)
Bool_t SetSinglePtCut(Int_t singlePtCut)
Bool_t fMaterialBudgetWeightsInitialized
weights for conversions photons due due deviating material budget in MC compared to data ...
TH2F * fHistoTPCdEdxafter
TPC dEdx after cuts.
Double_t fDeltaR
Delta R for Double Counting Cut.
Int_t fInPlaneOutOfPlane
In-Plane Out-Of Plane Analysis.
Float_t GetDCAzToPrimVtx() const
TH2F * fHistoArmenterosafter
armenteros podolanski plot after cuts
AliPIDResponse * fPIDResponse
PID response.
Bool_t AsymmetryCut(AliConversionPhotonBase *photon, AliVEvent *event)
virtual Double_t GetPx() const =0
Double_t fPIDMinPPionRejectionLowP
Momentum limit to apply proton rejection.
TH2F * fHistoPsiPairDeltaPhiafter
TOF Sigma after cuts.
TH2F * fHistoArmenterosbefore
armenteros podolanski plot before cuts
Bool_t SetToCloseV0sCut(Int_t toClose)
void InitCutHistograms(TString name="", Bool_t preCut=kTRUE)
TH2F * fHistoTOFbefore
TOF before cuts.
Bool_t SetTOFElectronPIDCut(Int_t TOFelectronPID)
Bool_t fDoShrinkTPCAcceptance
Flag for shrinking the TPC acceptance due to different reasons.
Bool_t PhotonIsSelectedAODMC(AliAODMCParticle *particle, TClonesArray *aodmcArray, Bool_t checkForConvertedGamma=kTRUE)
AliConversionPhotonCuts(const char *name="V0Cuts", const char *title="V0 Cuts")
Float_t fMinPhiCut
phi sector cut
TH1F * fHistoInvMassafter
e+e- inv mass distribution after cuts
Bool_t SetMinPhiSectorCut(Int_t minPhiCut)
void FillElectonLabelArray(AliAODConversionPhoton *photon, Int_t nV0)
Double_t fSinglePtCut2
second pt cut for electron/positron if asymmetric cut is chosen
Double_t GetCorrectedElectronTPCResponse(Short_t charge, Double_t nsig, Double_t P, Double_t Eta, Double_t R)
AliESDtrack * GetESDTrack(AliESDEvent *event, Int_t label)
TH2F * fHistoITSSigafter
ITS Sigma after cuts.
static AliConversionPhotonCuts * GetStandardCuts2010PbPb()
Double_t fDoKaonRejectionLowP
Kaon rejection at low p.
Int_t fElectronArraySize
Size of electron array.
TH2F * fHistoTOFSigbefore
TOF Sigma before cuts.
Int_t fIsHeavyIon
flag for pp (0), PbPb (1), pPb (2)
Bool_t RejectToCloseV0s(AliAODConversionPhoton *photon, TList *photons, Int_t nV0)
virtual Double_t GetPhotonP() const =0
virtual Double_t GetPhotonPhi() const =0
Bool_t InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle=-100, Bool_t fill=kTRUE)
Bool_t fElecDeDxPostCalibrationInitialized
flag to check that initialization worked
Bool_t PhotonCuts(AliConversionPhotonBase *photon, AliVEvent *event)
Bool_t SetChi2GammaCut(Int_t chi2GammaCut)
int Int_t
Definition: External.C:63
Bool_t SetCut(cutIds cutID, Int_t cut)
Double_t fDoPionRejectionLowP
Pion rejection at low p.
TH1F * fHistoInvMassbefore
e+e- inv mass distribution before cuts
TH1F * fHistoEventPlanePhi
EventPlaneAngle Minus Photon Angle.
float Float_t
Definition: External.C:68
Bool_t fUseITSpid
flag to use tof pid
TH1F * fHistoEtaDistV0sAfterdEdxCuts
eta-distribution of all V0s after Finder selection after dEdx cuts
Float_t fConversionPointYArray
Array with conversion Point y.
Double_t fTRDPIDBelowCut
TRD cut range.
Double_t fPIDMaxPnSigmaAbovePionLine
sigma cut
Double_t fITSPIDnSigmaAboveElectronLine
sigma cut RRnewTOF
Double_t fDCARPrimVtxCut
cut value for the maximum distance in R between the photon & the primary vertex [cm] ...
void DeterminePhotonQuality(AliVTrack *negTrack, AliVTrack *posTrack)
Bool_t SetITSElectronPIDCut(Int_t ITSelectronPID)
Bool_t SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut)
TH2F * fHistoITSSigbefore
ITS Sigma before cuts.
Double_t fPIDnSigmaAtLowPAroundKaonLine
sigma cut
Bool_t SetKappaTPCCut(Int_t kappaCut)
Double_t fPIDnSigmaAtLowPAroundPionLine
sigma cut
Bool_t fDoTOFsigmaCut
flag to use TOF pid cut RRnewTOF
Bool_t SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx)
Int_t GetTrackLabel(Int_t i) const
Bool_t SetMinMomPiondEdxCut(Int_t piMinMomdedxSigmaCut)
Double_t fPIDMinPnSigmaAbovePionLine
sigma cut
Double_t fPIDnSigmaBelowElectronLine
sigma cut
Bool_t PhotonIsSelectedMC(TParticle *particle, AliMCEvent *mcEvent, Bool_t checkForConvertedGamma=kTRUE)
Class handling all kinds of selection cuts for Gamma Conversion analysis.
Bool_t fDoPhotonAsymmetryCut
flag to use the PhotonAsymetryCut
TString fV0ReaderName
Name of the V0 reader.
Float_t GetDCArToPrimVtx() const
TH2F * fHistoAsymmetryafter
asymmetry plot after cuts
Bool_t fDoPhotonPDependentAsymCut
flag to use the PhotonAsymetryCut with P dependent cut
virtual Double_t GetPhotonPt() const =0
TProfile * fProfileContainingMaterialBudgetWeights
Bool_t InitializeCutsFromCutString(const TString analysisCutSelection)
Bool_t SetCosPAngleCut(Int_t cosCut)
Bool_t SetEtaForPhiCut(Int_t etaPhiCut)
Bool_t SetTPCClusterCut(Int_t clsTPCCut)
Bool_t InitializeMaterialBudgetWeights(Int_t flag, TString filename)
Bool_t fUseTOFpid
flag to use tof pid
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
short Short_t
Definition: External.C:23
Float_t GetMaterialBudgetCorrectingWeightForTrueGamma(AliAODConversionPhoton *gamma)
TList * fHistograms
List of QA histograms.
Bool_t fDoQtGammaSelection
Select gammas using qtMax.
Float_t fKappaMinCut
maximum Kappa cut
TH2F * fHistoTPCdEdxbefore
TPC dEdx before cuts.
Bool_t fProcessAODCheck
Flag for processing check for AOD to be contained in AliAODs.root and AliAODGammaConversion.root.
TH2F * fHistoKappaafter
Kappa vs photon pt after cuts.
Float_t fKappaMaxCut
maximum Kappa cut
virtual Double_t GetPy() const =0
Bool_t SetTRDElectronCut(Int_t TRDElectronCut)
void FillPhotonCutIndex(Int_t photoncut)
Double_t fSinglePtCut
pt cut for electron/positron
Bool_t SetPsiPairCut(Int_t psiCut)
TH2F * fHistoTPCdEdxSigbefore
TPC Sigma dEdx before cuts.
Bool_t SpecificTrackCuts(AliAODTrack *negTrack, AliAODTrack *posTrack, Int_t &cutIndex)
Cut functions.
Double_t fQtMax
Maximum Qt from Armenteros to select Gammas.
Double_t fTofPIDnSigmaBelowElectronLine
sigma cut RRnewTOF
Float_t fOpeningAngle
min opening angle for meson
UChar_t DeterminePhotonQualityAOD(AliAODConversionPhoton *, AliVEvent *)
Bool_t SelectV0Finder(Bool_t onfly)
TH1F * fHistoEtaDistV0s
eta-distribution of all V0s after Finder selection
Bool_t fDo2DQt
Select gammas using ellipse cut.
Bool_t AcceptanceCuts(AliConversionPhotonBase *photon)
Bool_t fDoDoubleCountingCut
Flag to reject double counting.
Double_t fMinClsTPCToF
minimum clusters to findable clusters
TFile * file
TList with histograms for a given trigger.
Float_t GetKappaTPC(AliConversionPhotonBase *gamma, AliVEvent *event)
AliVTrack * GetTrack(AliVEvent *event, Int_t label)
Bool_t CosinePAngleCut(const AliConversionPhotonBase *photon, AliVEvent *event) const
Int_t fUseOnFlyV0FinderSameSign
int to set same sign pairing
Double_t fPIDnSigmaAbovePionLineHighPt
sigma cut
Double_t fPIDMinPProtonRejectionLowP
Momentum limit to apply proton rejection.
Float_t fConversionPointXArray
Array with conversion Point x.
static AliConversionPhotonCuts * GetStandardCuts2010pp()
Bool_t SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
Double_t fPIDnSigmaAtLowPAroundProtonLine
sigma cut
Bool_t PsiPairCut(const AliConversionPhotonBase *photon) const
Double_t fMaxPtPIDITS
max pt for ITS PID
Bool_t SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
bool Bool_t
Definition: External.C:53
Bool_t dEdxCuts(AliVTrack *track, AliConversionPhotonBase *photon)
void CalculateDistanceOfClossetApproachToPrimVtx(const AliVVertex *primVertex)
Bool_t fUseCorrectedTPCClsInfo
flag to use corrected tpc cl info
Double_t fPIDnSigmaAboveElectronLine
sigma cut
Bool_t TracksAreSelected(AliVTrack *negTrack, AliVTrack *posTrack)
Bool_t KappaCuts(AliConversionPhotonBase *photon, AliVEvent *event)
Bool_t SetInPlaneOutOfPlane(Int_t inOutPlane)
Bool_t SetMaxPhiSectorCut(Int_t maxPhiCut)
Bool_t fDoTRDPID
flag to use TRD pid
Bool_t SetSharedElectronCut(Int_t sharedElec)
Double_t fITSPIDnSigmaBelowElectronLine
sigma cut RRnewTOF
Bool_t SetV0Finder(Int_t v0FinderType)
Bool_t AcceptanceCut(TParticle *particle, TParticle *ePos, TParticle *eNeg)
Bool_t SetTRDElectronPIDCut(Int_t TRDelectronPID)
Bool_t fDoLightOutput
switch for running light output, kFALSE -> normal mode, kTRUE -> light mode
Bool_t fDoAsymPtCut
Flag for setting asymmetric pT cut on electron/positron.
TH1F * fHistoTrackCuts
bookkeeping for track cuts
Double_t GetCosineOfPointingAngle(const AliConversionPhotonBase *photon, AliVEvent *event) const
Double_t GetConversionRadius() const
Bool_t ArmenterosQtCut(AliConversionPhotonBase *photon)
Bool_t CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent *event)
Float_t fEtaForPhiCutMax
eta cut for phi sector selection
Double_t fDoProtonRejectionLowP
Proton rejection at low p.
virtual Double_t GetPhotonEta() const =0
Double_t fPIDMinPKaonRejectionLowP
Momentum limit to apply kaon rejection.
Bool_t PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent *event)
Float_t fConversionPointZArray
Array with conversion Point z.
Bool_t SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
TH2F * fHistoAsymmetrybefore
asymmetry plot after cuts