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