1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Svein Lindal, Daniel Lohner *
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 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
21 ////////////////////////////////////////////////
23 #include "AliConversionCuts.h"
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"
37 #include "AliAODConversionMother.h"
38 #include "TObjString.h"
39 #include "AliAODEvent.h"
40 #include "AliESDEvent.h"
41 #include "AliCentrality.h"
45 #include "AliGenCocktailEventHeader.h"
46 #include "AliGenDPMjetEventHeader.h"
47 #include "AliGenPythiaEventHeader.h"
48 #include "AliGenHijingEventHeader.h"
49 #include "AliTriggerAnalysis.h"
50 #include "AliV0ReaderV1.h"
51 #include "AliAODMCParticle.h"
52 #include "AliAODMCHeader.h"
58 ClassImp(AliConversionCuts)
61 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
66 "MultiplicityMethod",//4
68 "RejectExtraSignals",//6
76 "piMomdedxSigmaCut",//14
77 "piMaxMomdedxSigmaCut",//15
78 "LowPRejectionSigmaCut",//16
83 "DoPhotonAsymmetryCut",//21
84 "CosinePointingAngle", //22
85 "SharedElectronCuts", //23
86 "RejectToCloseV0s", //24
93 //________________________________________________________________________
94 AliConversionCuts::AliConversionCuts(const char *name,const char *title) :
95 AliAnalysisCuts(name,title),
111 fLineCutZRSlopeMin(0.),
112 fLineCutZValueMin(0),
113 fChi2CutConversion(1000),
114 fPIDProbabilityCutNegativeParticle(0),
115 fPIDProbabilityCutPositiveParticle(0),
116 fDodEdxSigmaCut(kTRUE),
117 fDoTOFsigmaCut(kFALSE),
118 fPIDTRDEfficiency(1),
120 fPIDnSigmaAboveElectronLine(100),
121 fPIDnSigmaBelowElectronLine(-100),
122 fTofPIDnSigmaAboveElectronLine(100),
123 fTofPIDnSigmaBelowElectronLine(-100),
124 fPIDnSigmaAbovePionLine(0),
125 fPIDnSigmaAbovePionLineHighPt(-100),
126 fPIDMinPnSigmaAbovePionLine(0),
127 fPIDMaxPnSigmaAbovePionLine(0),
128 fDoKaonRejectionLowP(kFALSE),
129 fDoProtonRejectionLowP(kFALSE),
130 fDoPionRejectionLowP(kFALSE),
131 fPIDnSigmaAtLowPAroundKaonLine(0),
132 fPIDnSigmaAtLowPAroundProtonLine(0),
133 fPIDnSigmaAtLowPAroundPionLine(0),
134 fPIDMinPKaonRejectionLowP(1.5),
135 fPIDMinPProtonRejectionLowP(2),
136 fPIDMinPPionRejectionLowP(0),
137 fDoQtGammaSelection(kTRUE),
144 fUseEtaMinCut(kFALSE),
145 fUseOnFlyV0Finder(kTRUE),
146 fDoPhotonAsymmetryCut(kTRUE),
147 fMinPPhotonAsymmetryCut(100.),
148 fMinPhotonAsymmetry(0.),
150 fDetectorCentrality(0),
151 fModCentralityClass(0),
155 fUseCorrectedTPCClsInfo(kFALSE),
157 fMultiplicityMethod(0),
159 fRemovePileUp(kFALSE),
160 fOpeningAngle(0.005),
162 fDo2DPsiPairChi2(kFALSE),
163 fCosPAngleCut(10000),
164 fDoToCloseV0sCut(kFALSE),
165 fRejectExtraSignals(0),
167 fDoSharedElecCut(kFALSE),
168 fOfflineTriggerMask(0),
172 fElectronArraySize(500),
173 fElectronLabelArray(NULL),
174 fDCAZPrimVtxCut(1000),
175 fDCARPrimVtxCut(1000),
176 fInPlaneOutOfPlane(0),
177 fConversionPointXArray(0.0),
178 fConversionPointYArray(0.0),
179 fConversionPointZArray(0.0),
181 fNotRejectedStart(NULL),
182 fNotRejectedEnd(NULL),
183 fGeneratorNames(NULL),
188 fDoReweightHistoMCPi0(kFALSE),
189 fDoReweightHistoMCEta(kFALSE),
190 fDoReweightHistoMCK0s(kFALSE),
191 fPathTrFReweighting(""),
192 fNameHistoReweightingPi0(""),
193 fNameHistoReweightingEta(""),
194 fNameHistoReweightingK0s(""),
199 hTPCdEdxbefore(NULL),
201 hTPCdEdxSigbefore(NULL),
202 hTPCdEdxSigafter(NULL),
206 hPsiPairDeltaPhiafter(NULL),
209 hInvMassbefore(NULL),
210 hArmenterosbefore(NULL),
212 hArmenterosafter(NULL),
213 hAcceptanceCuts(NULL),
217 hCentralityVsNumberOfPrimaryTracks(NULL),
219 hEventPlanePhi(NULL),
221 hTriggerClassSelected(NULL),
222 hReweightMCHistPi0(NULL),
223 hReweightMCHistEta(NULL),
224 hReweightMCHistK0s(NULL),
229 fTriggerSelectedManually(kFALSE),
230 fSpecialTriggerName("")
234 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
235 fCutString=new TObjString((GetCutNumber()).Data());
237 fElectronLabelArray = new Int_t[fElectronArraySize];
238 fUtils = new AliAnalysisUtils();
239 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
240 //fUtils->SetCutOnZVertexSPD(kFALSE);
245 //________________________________________________________________________
246 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
247 AliAnalysisCuts(ref),
249 fHeaderList(ref.fHeaderList),
251 fEventQuality(ref.fEventQuality),
254 fEtaCut(ref.fEtaCut),
255 fEtaCutMin(ref.fEtaCutMin),
257 fSinglePtCut(ref.fSinglePtCut),
259 fMinClsTPC(ref.fMinClsTPC),
260 fMinClsTPCToF(ref.fMinClsTPCToF),
261 fLineCutZRSlope(ref.fLineCutZRSlope),
262 fLineCutZValue(ref.fLineCutZValue),
263 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
264 fLineCutZValueMin(ref.fLineCutZValueMin),
265 fChi2CutConversion(ref.fChi2CutConversion),
266 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
267 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
268 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
269 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
270 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
271 fDoTRDPID(ref.fDoTRDPID),
272 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
273 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
274 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
275 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
276 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
277 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
278 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
279 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
280 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
281 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
282 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
283 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
284 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
285 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
286 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
287 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
288 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
289 fDoQtGammaSelection(ref.fDoQtGammaSelection),
290 fDo2DQt(ref.fDo2DQt),
292 fXVertexCut(ref.fXVertexCut),
293 fYVertexCut(ref.fYVertexCut),
294 fZVertexCut(ref.fZVertexCut),
295 fNSigmaMass(ref.fNSigmaMass),
296 fUseEtaMinCut(ref.fUseEtaMinCut),
297 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
298 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
299 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
300 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
301 fIsHeavyIon(ref.fIsHeavyIon),
302 fDetectorCentrality(ref.fDetectorCentrality),
303 fModCentralityClass(ref.fModCentralityClass),
304 fMaxVertexZ(ref.fMaxVertexZ),
305 fCentralityMin(ref.fCentralityMin),
306 fCentralityMax(ref.fCentralityMax),
307 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
308 fUseTOFpid(ref.fUseTOFpid),
309 fMultiplicityMethod(ref.fMultiplicityMethod),
310 fSpecialTrigger(ref.fSpecialTrigger),
311 fRemovePileUp(ref.fRemovePileUp),
312 fOpeningAngle(ref.fOpeningAngle),
313 fPsiPairCut(ref.fPsiPairCut),
314 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
315 fCosPAngleCut(ref.fCosPAngleCut),
316 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
317 fRejectExtraSignals(ref.fRejectExtraSignals),
318 fminV0Dist(ref.fminV0Dist),
319 fDoSharedElecCut(ref.fDoSharedElecCut),
320 fOfflineTriggerMask(ref.fOfflineTriggerMask),
321 fHasV0AND(ref.fHasV0AND),
322 fIsSDDFired(ref.fIsSDDFired),
323 fRandom(ref.fRandom),
324 fElectronArraySize(ref.fElectronArraySize),
325 fElectronLabelArray(NULL),
326 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
327 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
328 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
329 fConversionPointXArray(ref.fConversionPointXArray),
330 fConversionPointYArray(ref.fConversionPointYArray),
331 fConversionPointZArray(ref.fConversionPointZArray),
332 fnHeaders(ref.fnHeaders),
333 fNotRejectedStart(NULL),
334 fNotRejectedEnd(NULL),
335 fGeneratorNames(ref.fGeneratorNames),
338 fEtaShift(ref.fEtaShift),
339 fDoEtaShift(ref.fDoEtaShift),
340 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
341 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
342 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
343 fPathTrFReweighting(ref.fPathTrFReweighting),
344 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
345 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
346 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
347 fNameFitDataPi0(ref.fNameFitDataPi0),
348 fNameFitDataEta(ref.fNameFitDataEta),
349 fNameFitDataK0s(ref.fNameFitDataK0s),
351 hTPCdEdxbefore(NULL),
353 hTPCdEdxSigbefore(NULL),
354 hTPCdEdxSigafter(NULL),
358 hPsiPairDeltaPhiafter(NULL),
361 hInvMassbefore(NULL),
362 hArmenterosbefore(NULL),
364 hArmenterosafter(NULL),
365 hAcceptanceCuts(NULL),
369 hCentralityVsNumberOfPrimaryTracks(NULL),
371 hEventPlanePhi(NULL),
373 hTriggerClassSelected(NULL),
374 hReweightMCHistPi0(ref.hReweightMCHistPi0),
375 hReweightMCHistEta(ref.hReweightMCHistEta),
376 hReweightMCHistK0s(ref.hReweightMCHistK0s),
377 fFitDataPi0(ref.fFitDataPi0),
378 fFitDataEta(ref.fFitDataEta),
379 fFitDataK0s(ref.fFitDataK0s),
380 fPreSelCut(ref.fPreSelCut),
381 fTriggerSelectedManually(ref.fTriggerSelectedManually),
382 fSpecialTriggerName(ref.fSpecialTriggerName)
385 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
386 fCutString=new TObjString((GetCutNumber()).Data());
387 fElectronLabelArray = new Int_t[fElectronArraySize];
388 fUtils = new AliAnalysisUtils();
389 // dont copy histograms (if you like histograms, call InitCutHistograms())
394 //________________________________________________________________________
395 AliConversionCuts::~AliConversionCuts() {
397 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
399 // delete fHistograms;
400 // fHistograms = NULL;
401 if(fCutString != NULL){
405 if(fElectronLabelArray){
406 delete fElectronLabelArray;
407 fElectronLabelArray = NULL;
409 if(fNotRejectedStart){
410 delete[] fNotRejectedStart;
411 fNotRejectedStart = NULL;
414 delete[] fNotRejectedEnd;
415 fNotRejectedEnd = NULL;
418 delete[] fGeneratorNames;
419 fGeneratorNames = NULL;
428 //________________________________________________________________________
429 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
431 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
432 TH1::AddDirectory(kFALSE);
434 if(fHistograms != NULL){
438 if(fHistograms==NULL){
439 fHistograms=new TList();
440 fHistograms->SetOwner(kTRUE);
441 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
442 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
445 if (hReweightMCHistPi0){
446 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
447 fHistograms->Add(hReweightMCHistPi0);
449 if (hReweightMCHistEta){
450 hReweightMCHistEta->SetName("MCInputForWeightingEta");
451 fHistograms->Add(hReweightMCHistEta);
453 if (hReweightMCHistK0s){
454 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
455 fHistograms->Add(hReweightMCHistK0s);
458 // fFitDataPi0->SetName("DataFitForWeightingPi0");
459 // fHistograms->Add(fFitDataPi0);
462 // fFitDataEta->SetName("DataFitForWeightingEta");
463 // fHistograms->Add(fFitDataEta);
466 // fFitDataK0s->SetName("DataFitForWeightingK0s");
467 // fHistograms->Add(fFitDataK0s);
470 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
471 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
472 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
473 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
474 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
475 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
476 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
477 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
478 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
479 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
480 fHistograms->Add(hCutIndex);
483 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
484 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
485 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
486 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
487 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
488 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
489 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
490 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
491 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
492 fHistograms->Add(hTrackCuts);
495 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",14,-0.5,13.5);
496 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
497 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
498 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
499 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
500 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
501 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
502 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
503 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
504 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
505 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
506 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
507 hPhotonCuts->GetXaxis()->SetBinLabel(12,"out");
508 fHistograms->Add(hPhotonCuts);
511 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
512 fHistograms->Add(hInvMassbefore);
513 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
514 fHistograms->Add(hArmenterosbefore);
516 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
517 fHistograms->Add(hInvMassafter);
518 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
519 fHistograms->Add(hArmenterosafter);
521 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
522 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
523 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
524 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
525 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
526 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
527 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
528 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
529 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
530 fHistograms->Add(hAcceptanceCuts);
533 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
534 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
535 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
536 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
537 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
538 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
539 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
540 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
541 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
542 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
543 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
544 fHistograms->Add(hdEdxCuts);
546 TAxis *AxisBeforedEdx = NULL;
547 TAxis *AxisBeforedEdxSig = NULL;
548 TAxis *AxisBeforeTOF = NULL;
549 TAxis *AxisBeforeTOFSig = NULL;
551 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
552 fHistograms->Add(hTPCdEdxbefore);
553 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
554 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
555 fHistograms->Add(hTPCdEdxSigbefore);
556 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
558 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
559 fHistograms->Add(hTOFbefore);
560 AxisBeforeTOF = hTOFbefore->GetXaxis();
561 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
562 fHistograms->Add(hTOFSigbefore);
563 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
566 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
567 fHistograms->Add(hTPCdEdxSigafter);
569 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
570 fHistograms->Add(hTPCdEdxafter);
572 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
573 fHistograms->Add(hTOFSigafter);
575 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
576 fHistograms->Add(hPsiPairDeltaPhiafter);
578 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
579 Int_t bins = AxisAfter->GetNbins();
580 Double_t from = AxisAfter->GetXmin();
581 Double_t to = AxisAfter->GetXmax();
582 Double_t *newBins = new Double_t[bins+1];
584 Double_t factor = TMath::Power(to/from, 1./bins);
585 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
586 AxisAfter->Set(bins, newBins);
587 AxisAfter = hTOFSigafter->GetXaxis();
588 AxisAfter->Set(bins, newBins);
589 AxisAfter = hTPCdEdxafter->GetXaxis();
590 AxisAfter->Set(bins, newBins);
592 AxisBeforedEdx->Set(bins, newBins);
593 AxisBeforeTOF->Set(bins, newBins);
594 AxisBeforedEdxSig->Set(bins, newBins);
595 AxisBeforeTOFSig->Set(bins, newBins);
599 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
600 fHistograms->Add(hCentrality);
601 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
602 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
604 // Event Cuts and Info
606 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
607 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
608 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
609 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
610 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
611 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
612 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
613 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
614 fHistograms->Add(hV0EventCuts);
616 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
617 fHistograms->Add(hVertexZ);
619 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
620 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
621 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
622 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
623 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
624 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
625 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
626 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
627 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
628 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
629 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
630 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
631 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
632 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
633 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
634 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
635 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
636 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
637 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
638 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
639 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
640 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
641 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
642 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
643 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
644 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
645 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
646 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
647 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
648 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
649 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
650 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
651 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
652 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
653 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
654 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
655 fHistograms->Add(hTriggerClass);
658 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
659 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
660 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
661 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
662 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
663 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
664 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
665 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
666 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
667 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
668 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
669 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
670 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
671 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
672 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
673 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
674 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
675 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
676 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
677 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
678 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
679 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
680 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
681 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
682 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
683 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
693 fHistograms->Add(hTriggerClassSelected);
695 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
696 fHistograms->Add(hEventPlanePhi);
700 TH1::AddDirectory(kTRUE);
703 //________________________________________________________________________
704 Bool_t AliConversionCuts::InitPIDResponse(){
705 // Set Pointer to AliPIDResponse
707 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
709 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
710 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
711 if(fPIDResponse)return kTRUE;
718 ///________________________________________________________________________
719 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
720 // Process Event Selection
723 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
726 // Check for MC event
727 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
728 // Check if MC event is correctly loaded
729 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
734 if (!mcHandler->InitOk() ){
738 if (!mcHandler->TreeK() ){
742 if (!mcHandler->TreeTR() ) {
749 // cout << "before event trigger" << endl;
750 if(!IsTriggerSelected(fInputEvent)){
751 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
757 if(fInputEvent->IsA()==AliESDEvent::Class()){
758 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
759 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
760 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
762 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
765 // Number of Contributors Cut
766 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
767 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
773 // Z Vertex Position Cut
774 if(!VertexZCut(fInputEvent)){
775 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
784 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
785 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
792 // Centrality Selection
793 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
794 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
800 // Fill Event Histograms
801 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
802 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
803 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
804 if(hCentralityVsNumberOfPrimaryTracks)
805 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
806 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
807 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
812 ///________________________________________________________________________
813 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
814 // MonteCarlo Photon Selection
816 if(!fMCStack)return kFALSE;
818 if (particle->GetPdgCode() == 22){
821 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
824 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
828 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
829 return kFALSE; // no photon as mothers!
832 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
833 return kFALSE; // the gamma has a mother, and it is not a primary particle
836 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
838 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
839 TParticle* ePos = NULL;
840 TParticle* eNeg = NULL;
842 if(particle->GetNDaughters() >= 2){
843 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
844 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
845 if(tmpDaughter->GetUniqueID() == 5){
846 if(tmpDaughter->GetPdgCode() == 11){
848 } else if(tmpDaughter->GetPdgCode() == -11){
855 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
859 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
860 return kFALSE; // no reconstruction below the Pt cut
863 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
864 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
867 if(fEtaCutMin > -0.1){
868 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
869 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
874 return kFALSE; // cuts on distance from collision point
877 if(abs(ePos->Vz()) > fMaxZ){
878 return kFALSE; // outside material
880 if(abs(eNeg->Vz()) > fMaxZ){
881 return kFALSE; // outside material
884 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
885 return kFALSE; // line cut to exclude regions where we do not reconstruct
886 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
890 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
891 return kFALSE; // line cut to exclude regions where we do not reconstruct
892 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
897 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
901 ///________________________________________________________________________
902 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
903 // MonteCarlo Photon Selection
905 if(!aodmcArray)return kFALSE;
907 if (particle->GetPdgCode() == 22){
908 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
911 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
915 if(particle->GetMother() > -1){
916 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
917 return kFALSE; // no photon as mothers!
919 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
920 return kFALSE; // the gamma has a mother, and it is not a primary particle
924 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
926 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
927 AliAODMCParticle* ePos = NULL;
928 AliAODMCParticle* eNeg = NULL;
930 if(particle->GetNDaughters() >= 2){
931 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
932 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
933 if(!tmpDaughter) continue;
934 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
935 if(tmpDaughter->GetPdgCode() == 11){
937 } else if(tmpDaughter->GetPdgCode() == -11){
944 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
948 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
949 return kFALSE; // no reconstruction below the Pt cut
952 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
953 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
956 if(fEtaCutMin > -0.1){
957 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
958 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
962 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
963 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
966 return kFALSE; // cuts on distance from collision point
968 if(abs(ePos->Zv()) > fMaxZ){
969 return kFALSE; // outside material
971 if(abs(eNeg->Zv()) > fMaxZ){
972 return kFALSE; // outside material
975 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
976 return kFALSE; // line cut to exclude regions where we do not reconstruct
977 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
981 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
982 return kFALSE; // line cut to exclude regions where we do not reconstruct
983 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
988 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
992 ///________________________________________________________________________
993 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
994 { // Specific Photon Cuts
997 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1000 // Fill Histos before Cuts
1001 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1003 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1005 // Gamma selection based on QT from Armenteros
1006 if(fDoQtGammaSelection == kTRUE){
1007 if(!ArmenterosQtCut(photon)){
1008 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1015 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1017 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1023 // Reconstruction Acceptance Cuts
1024 if(!AcceptanceCuts(photon)){
1025 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1031 if(fDoPhotonAsymmetryCut == kTRUE){
1032 if(!AsymmetryCut(photon,event)){
1033 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1038 //Check the pid probability
1040 if(!PIDProbabilityCut(photon, event)) {
1041 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1046 if(!CorrectedTPCClusterCut(photon, event)) {
1047 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1051 Double_t magField = event->GetMagneticField();
1052 if( magField < 0.0 ){
1058 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1059 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1060 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1063 if(!PsiPairCut(photon)) {
1064 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1069 if(!CosinePAngleCut(photon, event)) {
1070 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1074 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1076 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1079 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1080 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1085 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1086 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1094 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1096 // Histos after Cuts
1097 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1098 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1099 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1104 ///________________________________________________________________________
1105 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1106 { //Cut on corrected TPC Cluster Info
1108 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1109 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1111 if(!negTrack||!posTrack)return kFALSE;
1113 Double_t negclsToF=0;
1115 if (!fUseCorrectedTPCClsInfo ){
1116 if(negTrack->GetTPCNclsF()!=0){
1117 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1120 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1123 Double_t posclsToF = 0.;
1124 if (!fUseCorrectedTPCClsInfo ){
1125 if(posTrack->GetTPCNclsF()!=0){
1126 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1129 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1132 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1139 ///________________________________________________________________________
1140 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1142 //Selection of Reconstructed Photons
1144 FillPhotonCutIndex(kPhotonIn);
1146 if(event->IsA()==AliESDEvent::Class()) {
1147 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1148 FillPhotonCutIndex(kOnFly);
1152 // else if(event->IsA()==AliAODEvent::Class()) {
1153 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1154 // FillPhotonCutIndex(kOnFly);
1160 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1161 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1163 if(!negTrack || !posTrack) {
1164 FillPhotonCutIndex(kNoTracks);
1167 photon->DeterminePhotonQuality(negTrack,posTrack);
1169 if(!TracksAreSelected(negTrack, posTrack)){
1170 FillPhotonCutIndex(kTrackCuts);
1175 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1176 FillPhotonCutIndex(kdEdxCuts);
1181 if(!PhotonCuts(photon,event)){
1182 FillPhotonCutIndex(kPhotonCuts);
1186 // Photon passed cuts
1187 FillPhotonCutIndex(kPhotonOut);
1191 ///________________________________________________________________________
1192 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1193 { // Armenteros Qt Cut
1196 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1200 if(photon->GetArmenterosQt()>fQtMax){
1208 ///________________________________________________________________________
1209 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1210 // Exclude certain areas for photon reconstruction
1213 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1216 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1217 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1222 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1223 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1228 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1229 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1232 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1233 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1238 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1239 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1245 if( photon->GetPhotonEta() > (fEtaCut + fEtaShift) || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1246 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1249 if(fEtaCutMin>-0.1){
1250 if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1251 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1257 if(photon->GetPhotonPt()<fPtCut){
1258 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1263 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1269 ///________________________________________________________________________
1270 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1271 // Track Cuts which require AOD/ESD specific implementation
1273 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1274 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1279 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1280 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1281 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1282 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1290 ///________________________________________________________________________
1291 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1292 // Track Cuts which require AOD/ESD specific implementation
1294 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1295 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1300 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1301 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1309 ///________________________________________________________________________
1310 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1311 // Track Selection for Photon Reconstruction
1314 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1318 if(negTrack->Charge() == posTrack->Charge()) {
1319 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1324 // Number of TPC Clusters
1327 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1328 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1334 if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1335 negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1336 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1339 if(fEtaCutMin>-0.1){
1340 if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1341 (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1342 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1349 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1350 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1355 // AOD ESD specific cuts
1356 Bool_t passCuts = kTRUE;
1358 if(negTrack->IsA()==AliAODTrack::Class()) {
1359 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1361 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1365 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1370 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1376 ///________________________________________________________________________
1377 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1378 // Electron Identification Cuts for Photon reconstruction
1380 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1381 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1384 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1385 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1386 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1390 if(fDodEdxSigmaCut == kTRUE){
1391 // TPC Electron Line
1392 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1393 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1395 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1401 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1402 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1403 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1404 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1406 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1413 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1414 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1415 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1416 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1418 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1426 if(fDoKaonRejectionLowP == kTRUE){
1427 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1428 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1430 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1437 if(fDoProtonRejectionLowP == kTRUE){
1438 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1439 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1441 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1448 if(fDoPionRejectionLowP == kTRUE){
1449 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1450 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1452 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1460 // cout<<"Start"<<endl;
1461 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1463 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1464 // {cout<<"TOF DA"<<endl;}
1465 // if(status == AliPIDResponse::kDetPidOk){
1466 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1467 // cout<<"--> "<<probMis<<endl;
1468 // if(probMis > 0.01){
1473 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1475 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1477 fCurrentTrack->GetIntegratedTimes(times);
1478 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1479 Double_t dT = TOFsignal - t0 - times[0];
1480 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1482 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1484 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1485 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1486 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1490 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1496 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1497 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1503 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1504 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1505 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1510 ///________________________________________________________________________
1511 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1512 // Cut on Energy Assymetry
1514 for(Int_t ii=0;ii<2;ii++){
1516 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1518 if( track->P() > fMinPPhotonAsymmetryCut ){
1519 Double_t trackNegAsy=0;
1520 if (photon->GetPhotonP()!=0.){
1521 trackNegAsy= track->P()/photon->GetPhotonP();
1524 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1533 ///________________________________________________________________________
1534 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1535 //Returns pointer to the track with given ESD label
1536 //(Important for AOD implementation, since Track array in AOD data is different
1537 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1539 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1541 if(label > event->GetNumberOfTracks() ) return NULL;
1542 AliESDtrack * track = esdEvent->GetTrack(label);
1546 AliVTrack * track = 0x0;
1547 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1548 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1552 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1553 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1555 if(track->GetID() == label) {
1562 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1566 ///________________________________________________________________________
1567 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1568 //Returns pointer to the track with given ESD label
1569 //(Important for AOD implementation, since Track array in AOD data is different
1570 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1573 if(label > event->GetNumberOfTracks() ) return NULL;
1574 AliESDtrack * track = event->GetTrack(label);
1577 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1583 ///________________________________________________________________________
1584 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1585 // Cut on Electron Probability for Photon Reconstruction
1587 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1591 Bool_t iResult=kFALSE;
1593 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1594 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1596 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1597 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1599 if(negProbArray && posProbArray){
1601 negTrack->GetTPCpid(negProbArray);
1602 posTrack->GetTPCpid(posProbArray);
1604 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1609 delete [] posProbArray;
1610 delete [] negProbArray;
1614 ///Not possible for AODs
1624 ///________________________________________________________________________
1625 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1626 // MC Acceptance Cuts
1627 //(Certain areas were excluded for photon reconstruction)
1629 if(particle->R()>fMaxR){
1632 if(ePos->R()>fMaxR){
1636 if(ePos->R()<fMinR){
1640 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1643 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1647 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1651 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1655 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1660 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1663 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1666 if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1669 if(fEtaCutMin>-0.1){
1670 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1673 if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1676 if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1681 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1685 if(particle->Pt()<fPtCut){
1691 ///________________________________________________________________________
1692 Bool_t AliConversionCuts::UpdateCutString() {
1693 ///Update the cut string (if it has been created yet)
1695 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1696 fCutString->SetString(GetCutNumber());
1702 ///________________________________________________________________________
1703 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1705 AliInfo("Entering loading of histograms for weighting");
1706 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1708 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1711 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1712 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1713 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1714 hReweightMCHistPi0->SetDirectory(0);
1715 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1716 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1718 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1719 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1720 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1721 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1722 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1725 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1726 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1727 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1728 hReweightMCHistEta->SetDirectory(0);
1729 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1730 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1733 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1734 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1735 fFitDataEta = new TF1(*fFitDataEtatemp);
1736 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1737 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1740 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1741 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1742 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1743 hReweightMCHistK0s->SetDirectory(0);
1744 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1745 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1748 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1749 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1750 fFitDataK0s = new TF1(*fFitDataK0stemp);
1751 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1752 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1760 ///________________________________________________________________________
1761 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1762 // Initialize Cuts from a given Cut string
1763 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1764 AliInfo("Weighting was enabled");
1765 LoadReweightingHistosMCFromFile();
1768 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1769 if(analysisCutSelection.Length()!=kNCuts) {
1770 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1773 if(!analysisCutSelection.IsDigit()){
1774 AliError("Cut selection contains characters");
1778 const char *cutSelection = analysisCutSelection.Data();
1779 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1780 for(Int_t ii=0;ii<kNCuts;ii++){
1784 // Set Individual Cuts
1785 for(Int_t ii=0;ii<kNCuts;ii++){
1786 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1789 PrintCutsWithValues();
1793 ///________________________________________________________________________
1794 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1795 ///Set individual cut ID
1800 if( SetV0Finder(value)) {
1801 fCuts[kv0FinderType] = value;
1804 } else return kFALSE;
1806 case kededxSigmaCut:
1807 if( SetTPCdEdxCutElectronLine(value)) {
1808 fCuts[kededxSigmaCut] = value;
1811 } else return kFALSE;
1813 case kpidedxSigmaCut:
1814 if( SetTPCdEdxCutPionLine(value)) {
1815 fCuts[kpidedxSigmaCut] = value;
1818 } else return kFALSE;
1820 case kpiMomdedxSigmaCut:
1821 if( SetMinMomPiondEdxCut(value)) {
1822 fCuts[kpiMomdedxSigmaCut] = value;
1825 } else return kFALSE;
1828 if( SetChi2GammaCut(value)) {
1829 fCuts[kchi2GammaCut] = value;
1832 } else return kFALSE;
1835 if( SetSinglePtCut(value)) {
1836 fCuts[ksinglePtCut] = value;
1839 } else return kFALSE;
1842 if( SetTPCClusterCut(value)) {
1843 fCuts[kclsTPCCut] = value;
1846 } else return kFALSE;
1849 if( SetEtaCut(value)) {
1850 fCuts[ketaCut] = value;
1853 } else return kFALSE;
1855 case kLowPRejectionSigmaCut:
1856 if( SetLowPRejectionCuts(value)) {
1857 fCuts[kLowPRejectionSigmaCut] = value;
1860 } else return kFALSE;
1863 if( SetQtMaxCut(value)) {
1864 fCuts[kQtMaxCut] = value;
1867 } else return kFALSE;
1869 case kpiMaxMomdedxSigmaCut:
1870 if( SetMaxMomPiondEdxCut(value)) {
1871 fCuts[kpiMaxMomdedxSigmaCut] = value;
1874 } else return kFALSE;
1877 if( SetRCut(value)) {
1878 fCuts[kRCut] = value;
1881 } else return kFALSE;
1884 if( SetRemovePileUp(value)) {
1885 fCuts[kremovePileUp] = value;
1888 } else return kFALSE;
1891 if( SetSelectSpecialTrigger(value)) {
1892 fCuts[kselectV0AND] = value;
1895 } else return kFALSE;
1897 case kmultiplicityMethod:
1898 if( SetMultiplicityMethod(value)) {
1899 fCuts[kmultiplicityMethod] = value;
1902 } else return kFALSE;
1905 if( SetIsHeavyIon(value)) {
1906 fCuts[kisHeavyIon] = value;
1909 } else return kFALSE;
1911 case kCentralityMin:
1912 if( SetCentralityMin(value)) {
1913 fCuts[kCentralityMin] = value;
1916 } else return kFALSE;
1918 case kCentralityMax:
1919 if( SetCentralityMax(value)) {
1920 fCuts[kCentralityMax] = value;
1923 } else return kFALSE;
1925 case kTOFelectronPID:
1926 if( SetTOFElectronPIDCut(value)) {
1927 fCuts[kTOFelectronPID] = value;
1930 } else return kFALSE;
1932 case kdoPhotonAsymmetryCut:
1933 if( SetPhotonAsymmetryCut(value)) {
1934 fCuts[kdoPhotonAsymmetryCut] = value;
1937 } else return kFALSE;
1940 if( SetPsiPairCut(value)) {
1941 fCuts[kPsiPair] = value;
1944 } else return kFALSE;
1947 if( SetCosPAngleCut(value)) {
1948 fCuts[kCosPAngle] = value;
1951 } else return kFALSE;
1955 if( SetSharedElectronCut(value)) {
1956 fCuts[kElecShare] = value;
1959 } else return kFALSE;
1962 if( SetToCloseV0sCut(value)) {
1963 fCuts[kToCloseV0s] = value;
1966 } else return kFALSE;
1969 if( SetRejectExtraSignalsCut(value)) {
1970 fCuts[kExtraSignals] = value;
1973 } else return kFALSE;
1976 if( SetDCARPhotonPrimVtxCut(value)) {
1977 fCuts[kDcaRPrimVtx] = value;
1980 } else return kFALSE;
1983 if( SetDCAZPhotonPrimVtxCut(value)) {
1984 fCuts[kDcaZPrimVtx] = value;
1987 } else return kFALSE;
1989 case kInPlaneOutOfPlane:
1990 if( SetInPlaneOutOfPlane(value)) {
1991 fCuts[kInPlaneOutOfPlane] = value;
1994 } else return kFALSE;
2000 AliError("Cut id out of range");
2004 AliError("Cut id %d not recognized");
2009 ///________________________________________________________________________
2010 void AliConversionCuts::PrintCuts() {
2011 // Print out current Cut Selection
2012 for(Int_t ic = 0; ic < kNCuts; ic++) {
2013 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2017 void AliConversionCuts::PrintCutsWithValues() {
2018 // Print out current Cut Selection with value
2019 if (fIsHeavyIon == 0) {
2020 printf("Running in pp mode \n");
2021 if (fSpecialTrigger == 0){
2022 printf("\t only events triggered by V0OR will be analysed \n");
2023 } else if (fSpecialTrigger == 1){
2024 printf("\t only events triggered by V0AND will be analysed \n");
2025 } else if (fSpecialTrigger == 2){
2026 printf("\t only events where SDD was present will be analysed \n");
2027 } else if (fSpecialTrigger == 3){
2028 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2029 } else if (fSpecialTrigger > 3){
2030 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2032 } else if (fIsHeavyIon == 1){
2033 printf("Running in PbPb mode \n");
2034 if (fDetectorCentrality == 0){
2035 printf("\t centrality selection based on V0M \n");
2036 } else if (fDetectorCentrality == 1){
2037 printf("\t centrality selection based on Cl1 \n");
2039 if (fModCentralityClass == 0){
2040 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2041 } else if ( fModCentralityClass == 1){
2042 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2043 } else if ( fModCentralityClass == 2){
2044 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2045 } else if (fModCentralityClass == 3){
2046 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2047 } else if ( fModCentralityClass == 4){
2048 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2049 } else if ( fModCentralityClass == 5){
2050 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2052 if (fSpecialTrigger == 0){
2053 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2054 } else if (fSpecialTrigger > 4){
2055 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2057 } else if (fIsHeavyIon == 2){
2058 printf("Running in pPb mode \n");
2059 if (fDetectorCentrality == 0){
2060 printf("\t centrality selection based on V0A \n");
2061 } else if (fDetectorCentrality == 1){
2062 printf("\t centrality selection based on Cl1 \n");
2064 if (fModCentralityClass == 0){
2065 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2067 if (fSpecialTrigger == 0){
2068 printf("\t only events triggered by kINT7 will be analysed \n");
2069 } else if (fSpecialTrigger > 4){
2070 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2079 ///________________________________________________________________________
2080 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2088 fDetectorCentrality=0;
2092 fDetectorCentrality=1;
2094 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2096 fDetectorCentrality=0;
2097 fModCentralityClass=1;
2099 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2101 fDetectorCentrality=0;
2102 fModCentralityClass=2;
2104 case 5: //strict cut on v0 tracks for MC
2106 fDetectorCentrality=0;
2107 fModCentralityClass=3;
2109 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2110 //strict cut on v0 tracks for MC
2112 fDetectorCentrality=0;
2113 fModCentralityClass=4;
2115 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2116 //strict cut on v0 tracks for MC
2118 fDetectorCentrality=0;
2119 fModCentralityClass=5;
2123 fDetectorCentrality=0;
2127 fDetectorCentrality=1;
2130 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2136 //___________________________________________________________________
2137 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2140 if(minCentrality<0||minCentrality>9){
2141 AliError(Form("minCentrality not defined %d",minCentrality));
2145 fCentralityMin=minCentrality;
2148 //___________________________________________________________________
2149 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2152 if(maxCentrality<0||maxCentrality>9){
2153 AliError(Form("maxCentrality not defined %d",maxCentrality));
2156 fCentralityMax=maxCentrality;
2159 ///________________________________________________________________________
2160 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2163 switch(selectSpecialTrigger){
2165 fSpecialTrigger=0; // dont care
2168 fSpecialTrigger=1; // V0AND
2171 fSpecialTrigger=2; // with SDD requested
2174 fSpecialTrigger=3; // V0AND plus with SDD requested
2176 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2178 fSpecialTrigger=4; // different trigger class as MB
2179 fTriggerSelectedManually = kTRUE;
2182 fSpecialTrigger=4; // different trigger class as MB
2183 fTriggerSelectedManually = kTRUE;
2186 fSpecialTrigger=4; // different trigger class as MB
2187 fTriggerSelectedManually = kTRUE;
2190 fSpecialTrigger=4; // different trigger class as MB
2191 fTriggerSelectedManually = kTRUE;
2194 fSpecialTrigger=4; // different trigger class as MB
2195 fTriggerSelectedManually = kTRUE;
2198 fSpecialTrigger=4; // different trigger class as MB
2199 fTriggerSelectedManually = kTRUE;
2202 AliError("Warning: Special Trigger Not known");
2207 ///________________________________________________________________________
2208 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2211 fMultiplicityMethod=multiplicityMethod;
2213 // 0 Photon Multiplicity
2214 // 1 TPC Track multiplicity
2220 ///________________________________________________________________________
2221 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2223 switch(removePileUp){
2225 fRemovePileUp=kFALSE;
2228 fRemovePileUp=kTRUE;
2231 AliError("RemovePileUpCut not defined");
2236 ///________________________________________________________________________
2237 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2239 switch(extraSignal){
2241 fRejectExtraSignals = 0;
2242 break; // No Rejection
2244 fRejectExtraSignals = 1;
2245 break; // MinBias Header
2247 fRejectExtraSignals = 2;
2248 break; // User String Array
2250 fRejectExtraSignals = 3;
2251 break; // Rejection for Gamma Correction only
2253 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2258 ///________________________________________________________________________
2259 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2261 switch (v0FinderType){
2262 case 0: // on fly V0 finder
2263 cout << "have chosen onfly V0" << endl;
2264 fUseOnFlyV0Finder=kTRUE;
2266 case 1: // offline V0 finder
2267 cout << "have chosen offline V0" << endl;
2268 fUseOnFlyV0Finder=kFALSE;
2271 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2276 ///________________________________________________________________________
2277 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2280 //Set Standard LineCutZValues
2281 fLineCutZValueMin = -2;
2282 fLineCutZValue = 7.;
2287 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2289 fLineCutZRSlopeMin = 0.;
2291 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2293 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2295 fLineCutZRSlopeMin = 0.;
2299 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2301 fLineCutZRSlopeMin = 0.;
2305 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2307 fLineCutZRSlopeMin = 0.;
2311 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2313 fLineCutZRSlopeMin = 0.;
2317 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2319 fLineCutZRSlopeMin = 0.;
2323 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2325 fLineCutZRSlopeMin = 0.;
2328 if (fIsHeavyIon==1){
2330 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2332 fLineCutZRSlopeMin = 0.;
2336 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2338 fLineCutZRSlopeMin = 0.;
2341 // case 8: // 0.1 - 0.8
2343 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2344 // fEtaCutMin = 0.1;
2345 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2349 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2351 fLineCutZRSlopeMin = 0.;
2355 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2357 fLineCutZRSlopeMin = 0.;
2360 AliError(Form(" EtaCut not defined %d",etaCut));
2365 ///________________________________________________________________________
2366 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2389 // High purity cuts for PbPb (remove first layers of material)
2412 AliError("RCut not defined");
2417 ///________________________________________________________________________
2418 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2420 switch(singlePtCut){
2421 case 0: // 0.050 GeV
2422 fSinglePtCut = 0.050;
2424 case 1: // 0.100 GeV
2425 fSinglePtCut = 0.100;
2427 case 2: // 0.150 GeV
2428 fSinglePtCut = 0.150;
2430 case 3: // 0.200 GeV
2431 fSinglePtCut = 0.200;
2433 case 4: // 0.075 GeV
2434 fSinglePtCut = 0.075;
2436 case 5: // 0.125 GeV
2437 fSinglePtCut = 0.125;
2440 fSinglePtCut = 0.040;
2446 AliError(Form("singlePtCut not defined %d",singlePtCut));
2451 ///________________________________________________________________________
2452 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2467 case 4: // 95% of findable clusters
2468 fMinClsTPCToF= 0.95;
2469 fUseCorrectedTPCClsInfo=1;
2471 case 5: // 0% of findable clusters
2473 fUseCorrectedTPCClsInfo=1;
2475 case 6: // 70% of findable clusters
2477 fUseCorrectedTPCClsInfo=1;
2479 case 7: // 0% of findable clusters
2480 fMinClsTPCToF= 0.35;
2481 fUseCorrectedTPCClsInfo=0;
2484 fMinClsTPCToF= 0.35;
2485 fUseCorrectedTPCClsInfo=1;
2489 fUseCorrectedTPCClsInfo=1;
2492 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2497 ///________________________________________________________________________
2498 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2500 switch(ededxSigmaCut){
2502 fPIDnSigmaBelowElectronLine=-10;
2503 fPIDnSigmaAboveElectronLine=10;
2506 fPIDnSigmaBelowElectronLine=-5;
2507 fPIDnSigmaAboveElectronLine=5;
2510 fPIDnSigmaBelowElectronLine=-3;
2511 fPIDnSigmaAboveElectronLine=5;
2514 fPIDnSigmaBelowElectronLine=-4;
2515 fPIDnSigmaAboveElectronLine=5;
2518 fPIDnSigmaBelowElectronLine=-6;
2519 fPIDnSigmaAboveElectronLine=7;
2522 fPIDnSigmaBelowElectronLine=-4;
2523 fPIDnSigmaAboveElectronLine=4;
2526 fPIDnSigmaBelowElectronLine=-2.5;
2527 fPIDnSigmaAboveElectronLine=4;
2530 fPIDnSigmaBelowElectronLine=-2;
2531 fPIDnSigmaAboveElectronLine=3.5;
2534 AliError("TPCdEdxCutElectronLine not defined");
2540 ///________________________________________________________________________
2541 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2544 switch(pidedxSigmaCut){
2546 fPIDnSigmaAbovePionLine=-10;
2547 fPIDnSigmaAbovePionLineHighPt=-10;
2550 fPIDnSigmaAbovePionLine=0;
2551 fPIDnSigmaAbovePionLineHighPt=-10;
2554 fPIDnSigmaAbovePionLine=1;
2555 fPIDnSigmaAbovePionLineHighPt=-10;
2558 fPIDnSigmaAbovePionLine=2.5;
2559 fPIDnSigmaAbovePionLineHighPt=-10;
2562 fPIDnSigmaAbovePionLine=0.5;
2563 fPIDnSigmaAbovePionLineHighPt=-10;
2566 fPIDnSigmaAbovePionLine=2.;
2567 fPIDnSigmaAbovePionLineHighPt=-10;
2570 fPIDnSigmaAbovePionLine=2.;
2571 fPIDnSigmaAbovePionLineHighPt=0.5;
2574 fPIDnSigmaAbovePionLine=3.5;
2575 fPIDnSigmaAbovePionLineHighPt=-10;
2578 fPIDnSigmaAbovePionLine=2.;
2579 fPIDnSigmaAbovePionLineHighPt=1.;
2582 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2583 fPIDnSigmaAbovePionLineHighPt=-10;
2586 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2591 ///________________________________________________________________________
2592 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2594 switch(piMomdedxSigmaCut){
2596 fPIDMinPnSigmaAbovePionLine=0.5;
2599 fPIDMinPnSigmaAbovePionLine=1.;
2602 fPIDMinPnSigmaAbovePionLine=1.5;
2605 fPIDMinPnSigmaAbovePionLine=20.;
2608 fPIDMinPnSigmaAbovePionLine=50.;
2611 fPIDMinPnSigmaAbovePionLine=0.3;
2614 fPIDMinPnSigmaAbovePionLine=0.25;
2617 fPIDMinPnSigmaAbovePionLine=0.4;
2620 fPIDMinPnSigmaAbovePionLine=0.2;
2623 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2628 ///________________________________________________________________________
2629 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2631 switch(piMaxMomdedxSigmaCut){
2633 fPIDMaxPnSigmaAbovePionLine=100.;
2636 fPIDMaxPnSigmaAbovePionLine=5.;
2639 fPIDMaxPnSigmaAbovePionLine=4.;
2642 fPIDMaxPnSigmaAbovePionLine=3.5;
2645 fPIDMaxPnSigmaAbovePionLine=3.;
2648 fPIDMaxPnSigmaAbovePionLine=7.;
2651 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2656 ///________________________________________________________________________
2657 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2659 switch(LowPRejectionSigmaCut){
2661 fPIDnSigmaAtLowPAroundKaonLine=0;
2662 fPIDnSigmaAtLowPAroundProtonLine=0;
2663 fPIDnSigmaAtLowPAroundPionLine=0;
2664 fDoKaonRejectionLowP = kFALSE;
2665 fDoProtonRejectionLowP = kFALSE;
2666 fDoPionRejectionLowP = kFALSE;
2667 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2670 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2671 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2672 fPIDnSigmaAtLowPAroundPionLine=0.5;
2673 fDoKaonRejectionLowP = kTRUE;
2674 fDoProtonRejectionLowP = kTRUE;
2675 fDoPionRejectionLowP = kTRUE;
2676 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2679 fPIDnSigmaAtLowPAroundKaonLine=1;
2680 fPIDnSigmaAtLowPAroundProtonLine=1;
2681 fPIDnSigmaAtLowPAroundPionLine=1;
2682 fDoKaonRejectionLowP = kTRUE;
2683 fDoProtonRejectionLowP = kTRUE;
2684 fDoPionRejectionLowP = kTRUE;
2685 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2688 fPIDnSigmaAtLowPAroundKaonLine=2.;
2689 fPIDnSigmaAtLowPAroundProtonLine=2.;
2690 fPIDnSigmaAtLowPAroundPionLine=2.;
2691 fDoKaonRejectionLowP = kTRUE;
2692 fDoProtonRejectionLowP = kTRUE;
2693 fDoPionRejectionLowP = kTRUE;
2694 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2697 fPIDnSigmaAtLowPAroundKaonLine=0.;
2698 fPIDnSigmaAtLowPAroundProtonLine=0.;
2699 fPIDnSigmaAtLowPAroundPionLine=1;
2700 fDoKaonRejectionLowP = kFALSE;
2701 fDoProtonRejectionLowP = kFALSE;
2702 fDoPionRejectionLowP = kTRUE;
2703 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2706 fPIDnSigmaAtLowPAroundKaonLine=0.;
2707 fPIDnSigmaAtLowPAroundProtonLine=0.;
2708 fPIDnSigmaAtLowPAroundPionLine=1.5;
2709 fDoKaonRejectionLowP = kFALSE;
2710 fDoProtonRejectionLowP = kFALSE;
2711 fDoPionRejectionLowP = kTRUE;
2712 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2715 fPIDnSigmaAtLowPAroundKaonLine=0.;
2716 fPIDnSigmaAtLowPAroundProtonLine=0.;
2717 fPIDnSigmaAtLowPAroundPionLine=2.;
2718 fDoKaonRejectionLowP = kFALSE;
2719 fDoProtonRejectionLowP = kFALSE;
2720 fDoPionRejectionLowP = kTRUE;
2721 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2724 fPIDnSigmaAtLowPAroundKaonLine=0.;
2725 fPIDnSigmaAtLowPAroundProtonLine=0.;
2726 fPIDnSigmaAtLowPAroundPionLine=0.5;
2727 fDoKaonRejectionLowP = kFALSE;
2728 fDoProtonRejectionLowP = kFALSE;
2729 fDoPionRejectionLowP = kTRUE;
2730 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2733 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2738 ///________________________________________________________________________
2739 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2741 switch(TOFelectronPID){
2743 fUseTOFpid = kFALSE;
2744 fTofPIDnSigmaBelowElectronLine=-100;
2745 fTofPIDnSigmaAboveElectronLine=100;
2749 fTofPIDnSigmaBelowElectronLine=-7;
2750 fTofPIDnSigmaAboveElectronLine=7;
2754 fTofPIDnSigmaBelowElectronLine=-5;
2755 fTofPIDnSigmaAboveElectronLine=5;
2759 fTofPIDnSigmaBelowElectronLine=-3;
2760 fTofPIDnSigmaAboveElectronLine=5;
2764 fTofPIDnSigmaBelowElectronLine=-2;
2765 fTofPIDnSigmaAboveElectronLine=3;
2769 fTofPIDnSigmaBelowElectronLine=-3;
2770 fTofPIDnSigmaAboveElectronLine=3;
2773 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2778 ///________________________________________________________________________
2779 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2784 fDoQtGammaSelection=kFALSE;
2824 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2829 ///________________________________________________________________________
2830 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2833 switch(chi2GammaCut){
2835 fChi2CutConversion = 100.;
2838 fChi2CutConversion = 50.;
2841 fChi2CutConversion = 30.;
2844 fChi2CutConversion = 200.;
2847 fChi2CutConversion = 500.;
2850 fChi2CutConversion = 100000.;
2853 fChi2CutConversion = 5.;
2856 fChi2CutConversion = 10.;
2859 fChi2CutConversion = 20.;
2862 fChi2CutConversion = 15.;
2865 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2870 ///________________________________________________________________________
2871 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2875 fPsiPairCut = 10000; //
2878 fPsiPairCut = 0.1; //
2881 fPsiPairCut = 0.05; // Standard
2884 fPsiPairCut = 0.035; //
2887 fPsiPairCut = 0.2; //
2890 fPsiPairCut = 0.1; //
2891 fDo2DPsiPairChi2 = kTRUE;
2894 fPsiPairCut = 0.05; //
2895 fDo2DPsiPairChi2 = kTRUE;
2898 fPsiPairCut = 0.035; //
2899 fDo2DPsiPairChi2 = kTRUE;
2902 fPsiPairCut = 0.2; //
2903 fDo2DPsiPairChi2 = kTRUE; //
2906 fPsiPairCut = 0.5; //
2909 AliError(Form("PsiPairCut not defined %d",psiCut));
2915 ///________________________________________________________________________
2916 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2918 switch(doPhotonAsymmetryCut){
2920 fDoPhotonAsymmetryCut=0;
2921 fMinPPhotonAsymmetryCut=100.;
2922 fMinPhotonAsymmetry=0.;
2925 fDoPhotonAsymmetryCut=1;
2926 fMinPPhotonAsymmetryCut=3.5;
2927 fMinPhotonAsymmetry=0.04;
2930 fDoPhotonAsymmetryCut=1;
2931 fMinPPhotonAsymmetryCut=3.5;
2932 fMinPhotonAsymmetry=0.06;
2935 fDoPhotonAsymmetryCut=1;
2936 fMinPPhotonAsymmetryCut=0.0;
2937 fMinPhotonAsymmetry=0.05;
2940 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2943 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2946 ///________________________________________________________________________
2947 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2957 fCosPAngleCut = 0.5;
2960 fCosPAngleCut = 0.75;
2963 fCosPAngleCut = 0.85;
2966 fCosPAngleCut = 0.88;
2969 fCosPAngleCut = 0.9;
2972 fCosPAngleCut = 0.95;
2975 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2981 ///________________________________________________________________________
2982 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
2986 fDoSharedElecCut = kFALSE;
2989 fDoSharedElecCut = kTRUE;
2992 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
2998 ///________________________________________________________________________
2999 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3003 fDoToCloseV0sCut = kFALSE;
3007 fDoToCloseV0sCut = kTRUE;
3011 fDoToCloseV0sCut = kTRUE;
3015 fDoToCloseV0sCut = kTRUE;
3019 AliError(Form("Shared Electron Cut not defined %d",toClose));
3024 ///________________________________________________________________________
3025 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3027 switch(TRDElectronCut){
3033 fPIDTRDEfficiency=0.1;
3037 fPIDTRDEfficiency=0.8;
3041 fPIDTRDEfficiency=0.9;
3044 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3051 ///________________________________________________________________________
3052 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3054 switch(DCAZPhotonPrimVtx){
3056 fDCAZPrimVtxCut = 1000;
3059 fDCAZPrimVtxCut = 10;
3062 fDCAZPrimVtxCut = 5;
3065 fDCAZPrimVtxCut = 4;
3068 fDCAZPrimVtxCut = 3;
3071 fDCAZPrimVtxCut = 2.5;
3074 fDCAZPrimVtxCut = 2;
3077 fDCAZPrimVtxCut = 1.5;
3080 fDCAZPrimVtxCut = 1;
3083 fDCAZPrimVtxCut = 0.5;
3086 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3092 ///________________________________________________________________________
3093 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3095 switch(DCARPhotonPrimVtx){
3097 fDCARPrimVtxCut = 1000;
3100 fDCARPrimVtxCut = 10;
3103 fDCARPrimVtxCut = 5;
3106 fDCARPrimVtxCut = 4;
3109 fDCARPrimVtxCut = 3;
3112 fDCARPrimVtxCut = 2.5;
3115 fDCARPrimVtxCut = 2;
3118 fDCARPrimVtxCut = 1.5;
3121 fDCARPrimVtxCut = 1;
3124 fDCARPrimVtxCut = 0.5;
3127 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3133 ///________________________________________________________________________
3134 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3138 fInPlaneOutOfPlane = 0; // No Event Plane
3141 fInPlaneOutOfPlane = 1; // In-Plane
3144 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3147 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3154 //-------------------------------------------------------------
3155 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3156 { // Get Event Centrality
3158 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3160 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3162 if(fDetectorCentrality==0){
3163 if (fIsHeavyIon==2){
3164 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3166 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3169 if(fDetectorCentrality==1){
3170 return fESDCentrality->GetCentralityPercentile("CL1");
3174 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3176 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3181 //-------------------------------------------------------------
3182 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3183 { // Centrality Selection
3184 if(!fIsHeavyIon)return kTRUE;
3186 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3187 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3189 Double_t centrality=GetCentrality(event);
3190 if(centrality<0)return kFALSE;
3192 Int_t centralityC=0;
3193 if (fModCentralityClass == 0){
3194 centralityC= Int_t(centrality/10);
3195 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3199 else if (fModCentralityClass ==1){
3200 centralityC= Int_t(centrality);
3201 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3203 } else return kFALSE;
3205 else if (fModCentralityClass ==2){
3206 centralityC= Int_t(centrality);
3207 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3212 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3213 Int_t PrimaryTracks10[10][2] =
3226 Int_t PrimaryTracks5a[10][2] =
3239 Int_t PrimaryTracks5b[10][2] =
3254 if(event->IsA()==AliESDEvent::Class()) column = 0;
3255 if(event->IsA()==AliAODEvent::Class()) column = 1;
3257 if (fModCentralityClass == 3){
3259 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3264 centralityC= Int_t(centrality/10);
3265 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3270 else if (fModCentralityClass ==4){
3272 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3277 centralityC= Int_t(centrality);
3278 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3280 } else return kFALSE;
3283 else if (fModCentralityClass ==5){
3285 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3290 centralityC= Int_t(centrality);
3291 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3299 ///________________________________________________________________________
3300 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3301 // Cut on z position of primary vertex
3302 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3304 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3306 if (fIsHeavyIon == 2){
3307 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3308 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3309 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3314 ///________________________________________________________________________
3316 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3317 // returns number of contributors to the vertex
3319 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3321 if (fESDEvent->GetPrimaryVertex() != NULL){
3322 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3323 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3324 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3328 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3329 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3330 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3331 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3333 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3334 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3340 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3342 if (fAODEvent->GetPrimaryVertex() != NULL){
3343 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3344 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3347 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3348 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3349 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3351 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3356 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3360 ///________________________________________________________________________
3362 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3365 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3367 UInt_t isSelected = AliVEvent::kAny;
3368 if (fInputHandler==NULL) return kFALSE;
3369 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3370 if (!fTriggerSelectedManually){
3371 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3373 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3374 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3375 else fOfflineTriggerMask = AliVEvent::kMB;
3378 // Get the actual offline trigger mask for the event and AND it with the
3379 // requested mask. If no mask requested select by default the event.
3380 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3381 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3383 if (fOfflineTriggerMask)
3384 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3386 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3390 if (fIsSDDFired) hTriggerClass->Fill(33);
3391 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3392 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3393 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3394 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3395 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3396 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3397 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3398 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3399 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3400 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3401 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3402 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3403 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3404 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3405 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3406 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3407 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3408 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3409 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3410 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3411 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3412 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3413 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3414 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3415 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3416 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3417 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3418 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3419 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3420 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3421 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3422 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3423 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3424 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3425 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3426 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3427 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3428 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3429 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3430 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3431 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3434 if(hTriggerClassSelected && isSelected){
3435 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3436 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3437 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3438 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3439 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3440 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3441 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3442 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3443 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3444 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3445 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3446 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3447 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3448 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3449 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3450 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3451 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3452 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3453 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3454 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3455 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3456 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3457 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3458 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3459 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3460 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3461 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3462 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3463 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3464 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3465 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3466 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3467 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3468 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3469 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3470 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3471 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3472 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3473 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3474 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3475 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3478 if(!isSelected)return kFALSE;
3484 ///________________________________________________________________________
3485 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3486 // Get first TPC row
3487 Int_t firstTPCRow = 0;
3488 Double_t radiusI = 84.8;
3489 Double_t radiusO = 134.6;
3490 Double_t radiusOB = 198.;
3491 Double_t rSizeI = 0.75;
3492 Double_t rSizeO = 1.;
3493 Double_t rSizeOB = 1.5;
3497 if(radius <= radiusI){
3500 if(radius>radiusI && radius<=radiusO){
3501 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3503 if(radius>radiusO && radius<=radiusOB){
3504 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3507 if(radius>radiusOB){
3508 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3514 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3515 ///Check if passes cosine of pointing angle cut
3516 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3522 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3523 // calculates the pointing angle of the recalculated V0
3525 Double_t momV0[3] = {0,0,0};
3526 if(event->IsA()==AliESDEvent::Class()){
3527 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3528 if(!esdEvent) return -999;
3529 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3530 if(!v0) return -999;
3531 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3533 if(event->IsA()==AliAODEvent::Class()){
3534 momV0[0] = photon->GetPx();
3535 momV0[1] = photon->GetPy();
3536 momV0[2] = photon->GetPz();
3539 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3540 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3541 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3542 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3544 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3545 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3548 Double_t cosinePointingAngle = -999;
3549 if(momV02*PosV02 > 0.0)
3550 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3552 return cosinePointingAngle;
3555 ///________________________________________________________________________
3556 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3558 if (fDo2DPsiPairChi2){
3559 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3565 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3571 ///________________________________________________________________________
3572 TString AliConversionCuts::GetCutNumber(){
3573 // returns TString with current cut number
3575 for(Int_t ii=0;ii<kNCuts;ii++){
3576 a.Append(Form("%d",fCuts[ii]));
3581 ///________________________________________________________________________
3582 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3584 Int_t posLabel = photon->GetTrackLabelPositive();
3585 Int_t negLabel = photon->GetTrackLabelNegative();
3587 fElectronLabelArray[nV0*2] = posLabel;
3588 fElectronLabelArray[(nV0*2)+1] = negLabel;
3590 ///________________________________________________________________________
3591 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3593 Int_t posLabel = photon->GetTrackLabelPositive();
3594 Int_t negLabel = photon->GetTrackLabelNegative();
3596 for(Int_t i = 0; i<nV0s*2;i++){
3597 if(i==nV0*2) continue;
3598 if(i==(nV0*2)+1) continue;
3599 if(fElectronLabelArray[i] == posLabel){
3601 if(fElectronLabelArray[i] == negLabel){
3607 ///________________________________________________________________________
3608 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3611 Double_t posX = photon->GetConversionX();
3612 Double_t posY = photon->GetConversionY();
3613 Double_t posZ = photon->GetConversionZ();
3615 for(Int_t i = 0;i<photons->GetEntries();i++){
3616 if(nV0 == i) continue;
3617 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3618 Double_t posCompX = photonComp->GetConversionX();
3619 Double_t posCompY = photonComp->GetConversionY();
3620 Double_t posCompZ = photonComp->GetConversionZ();
3622 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3624 if(dist < fminV0Dist*fminV0Dist){
3625 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3633 ///________________________________________________________________________
3634 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3638 if(fNotRejectedStart){
3639 delete[] fNotRejectedStart;
3640 fNotRejectedStart = NULL;
3642 if(fNotRejectedEnd){
3643 delete[] fNotRejectedEnd;
3644 fNotRejectedEnd = NULL;
3646 if(fGeneratorNames){
3647 delete[] fGeneratorNames;
3648 fGeneratorNames = NULL;
3651 if(rejection == 0) return; // No Rejection
3653 AliGenCocktailEventHeader *cHeader = 0x0;
3654 AliAODMCHeader *cHeaderAOD = 0x0;
3655 Bool_t headerFound = kFALSE;
3656 AliStack *fMCStack = 0x0;
3657 TClonesArray *fMCStackAOD = 0x0;
3658 if(MCEvent->IsA()==AliMCEvent::Class()){
3659 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3660 if(cHeader) headerFound = kTRUE;
3661 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3663 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3664 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3665 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3668 if(cHeaderAOD) headerFound = kTRUE;
3672 TList *genHeaders = 0x0;
3673 if(cHeader) genHeaders = cHeader->GetHeaders();
3675 genHeaders = cHeaderAOD->GetCocktailHeaders();
3676 if(genHeaders->GetEntries()==1){
3677 SetRejectExtraSignalsCut(0);
3681 AliGenEventHeader* gh = 0;
3683 Int_t firstindexA = 0;
3684 Int_t lastindexA = -1;
3685 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3686 if(rejection == 2){ // TList of Headers Names
3687 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3688 gh = (AliGenEventHeader*)genHeaders->At(i);
3689 TString GeneratorName = gh->GetName();
3690 lastindexA = lastindexA + gh->NProduced();
3691 // cout << i << "\t" << GeneratorName.Data() << endl;
3692 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3693 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3694 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3695 if (GeneratorInList.CompareTo("PARAM") == 0){
3697 if (fMCStack->Particle(firstindexA)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA)->GetPdgCode() == 221 ) {
3703 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3704 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3714 firstindexA = firstindexA + gh->NProduced();
3718 fNotRejectedStart = new Int_t[fnHeaders];
3719 fNotRejectedEnd = new Int_t[fnHeaders];
3720 fGeneratorNames = new TString[fnHeaders];
3722 if(rejection == 1 || rejection == 3){
3723 fNotRejectedStart[0] = 0;
3724 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3725 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3729 Int_t firstindex = 0;
3730 Int_t lastindex = -1;
3732 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3733 gh = (AliGenEventHeader*)genHeaders->At(i);
3734 TString GeneratorName = gh->GetName();
3735 lastindex = lastindex + gh->NProduced();
3736 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3737 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3738 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3739 if (GeneratorInList.CompareTo("PARAM") == 0){
3741 if (fMCStack->Particle(firstindex)->GetPdgCode() == 111 || fMCStack->Particle(firstindex)->GetPdgCode() == 221 ) {
3742 fNotRejectedStart[number] = firstindex;
3743 fNotRejectedEnd[number] = lastindex;
3744 fGeneratorNames[number] = GeneratorName;
3750 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3751 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3752 fNotRejectedStart[number] = firstindex;
3753 fNotRejectedEnd[number] = lastindex;
3754 fGeneratorNames[number] = GeneratorName;
3761 fNotRejectedStart[number] = firstindex;
3762 fNotRejectedEnd[number] = lastindex;
3763 fGeneratorNames[number] = GeneratorName;
3764 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3770 firstindex = firstindex + gh->NProduced();
3772 } else { // No Cocktail Header Found
3773 fNotRejectedStart = new Int_t[1];
3774 fNotRejectedEnd = new Int_t[1];
3777 fNotRejectedStart[0] = 0;
3778 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3779 fGeneratorNames = new TString[1];
3780 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3782 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3783 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3784 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3785 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3786 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3787 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3789 SetRejectExtraSignalsCut(0);
3793 //_________________________________________________________________________
3794 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3796 // Not Accepted == kFALSE == 0
3797 // Accepted == kTRUE == 1
3798 // FirstHeader == kTRUE == 3
3799 if(index < 0) return 0; // No Particle
3802 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3803 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3804 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3805 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3807 for(Int_t i = 0;i<fnHeaders;i++){
3808 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3810 if(i == 0) accepted = 2; // MB Header
3814 else if(InputEvent->IsA()==AliAODEvent::Class()){
3815 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3816 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3817 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3818 if(!aodMCParticle->IsPrimary()){
3819 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3820 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3822 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3823 for(Int_t i = 0;i<fnHeaders;i++){
3824 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3826 if(i == 0) accepted = 2; // MB Header
3833 //_________________________________________________________________________
3834 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Bool_t isHeavyIon){
3836 if ( !IsTriggerSelected(InputEvent) )
3839 if(isHeavyIon && !(IsCentralitySelected(InputEvent,MCEvent)))
3840 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3843 if(!isHeavyIon && GetIsFromPileup()){
3844 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3846 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3850 Bool_t hasV0And = ReaderCuts->HasV0AND();
3851 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3852 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
3853 return 7; // With SDD requested but no fired
3855 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3856 return 8; // V0AND requested but no fired
3858 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
3859 if(hCentralityVsNumberOfPrimaryTracks)
3860 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
3861 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3862 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
3866 //_________________________________________________________________________
3867 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3868 if (!(period.CompareTo("LHC12f1a") == 0 || period.CompareTo("LHC12f1b") == 0 || period.CompareTo("LHC12i3") == 0 || period.CompareTo("LHC11a10a") == 0 || period.CompareTo("LHC11a10b") == 0 || period.CompareTo("LHC11a10b_bis") == 0 || period.CompareTo("LHC11a10a_bis") == 0 || period.CompareTo("LHC11a10b_plus") == 0 || period.Contains("LHC13d2") ||
3869 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
3872 for (Int_t i = 0; i < fnHeaders; i++){
3873 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
3874 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
3876 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
3878 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
3879 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
3880 fGeneratorNames[i].Contains("hijing")){
3882 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
3884 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
3886 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
3888 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
3890 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
3892 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
3895 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") ){
3900 if (kCaseGen == 0) return 1;
3903 Double_t mesonPt = 0;
3904 Double_t mesonMass = 0;
3906 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3907 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
3908 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
3909 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
3911 else if(InputEvent->IsA()==AliAODEvent::Class()){
3912 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3913 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3914 mesonPt = aodMCParticle->Pt();
3915 mesonMass = aodMCParticle->GetCalcMass();
3916 PDGCode = aodMCParticle->GetPdgCode();
3919 Float_t functionResultMC = 1.;
3920 if (kCaseGen == 1){ // Pythia 6
3921 Float_t dNdyMC = 2.1462;
3922 Float_t nMC = 7.06055;
3923 Float_t tMC = 0.12533;
3924 if ( PDGCode == 111){
3928 } else if ( PDGCode == 221){
3933 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);
3934 } else if (kCaseGen == 2){ // Phojet
3935 Float_t dNdyMC = 2.35978;
3936 Float_t nMC = 6.81795;
3937 Float_t tMC = 0.11492;
3938 if ( PDGCode == 111){
3942 } else if ( PDGCode == 221){
3947 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);
3948 } else if (kCaseGen == 4){ // BOX generators pp
3949 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
3950 Float_t a = 0.23437;
3952 Float_t c = -1430.5863;
3953 Float_t d = -0.6966624;
3954 Float_t e = 252.3742;
3955 if ( PDGCode == 111){
3961 } else if ( PDGCode == 221){
3968 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
3969 // cout << functionResultMC << endl;
3970 } else if (kCaseGen == 3 ){ // HIJING
3971 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
3972 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
3974 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
3975 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
3977 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
3978 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
3982 Float_t functionResultData = 1;
3983 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
3984 Float_t dNdyData = 2.2328;
3985 Float_t nData = 7.1473;
3986 Float_t tData = 0.1346;
3987 if ( PDGCode == 111){
3991 } else if ( PDGCode == 221){
3992 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
3996 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);
3997 // cout << functionResultData << endl;
3999 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4000 functionResultData = fFitDataPi0->Eval(mesonPt);
4002 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4003 functionResultData = fFitDataEta->Eval(mesonPt);
4005 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4006 functionResultData = fFitDataK0s->Eval(mesonPt);
4011 Double_t weight = 1;
4012 if (PDGCode == 111 || PDGCode == 221){
4013 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4014 weight = functionResultData/functionResultMC;
4015 if ( kCaseGen == 3){
4016 if (PDGCode == 111){
4017 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4021 if (PDGCode == 221){
4022 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4027 if (!isfinite(functionResultData)) weight = 1.;
4028 if (!isfinite(weight)) weight = 1.;
4030 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4031 weight = functionResultMC;
4034 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4035 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4039 ///________________________________________________________________________
4040 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4041 //Create and return standard 2010 PbPb cuts
4042 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4043 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4044 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4048 ///________________________________________________________________________
4049 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4050 //Create and return standard 2010 PbPb cuts
4051 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4052 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4053 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4056 ///________________________________________________________________________
4057 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4059 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4060 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4061 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4062 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4063 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4064 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4065 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4066 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4067 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4068 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4069 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4070 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4071 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4072 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4073 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4074 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4075 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4076 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4077 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4078 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4079 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4080 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4081 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4082 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4083 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4084 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4085 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4086 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4087 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4089 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4090 SetEtaShift(-0.465);
4092 else if(periodName.CompareTo("LHC13f") == 0 ||
4093 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4094 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4095 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4097 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4098 SetEtaShift(+0.465);
4100 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4103 ///________________________________________________________________________
4104 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4106 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4107 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4108 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4109 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4110 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4112 if(!fInPlaneOutOfPlane){
4113 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4116 else if(fInPlaneOutOfPlane == 1){
4117 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4118 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4123 else if(fInPlaneOutOfPlane == 2){
4124 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4125 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);