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 hEtaDistV0sAfterdEdxCuts(NULL),
201 hTPCdEdxbefore(NULL),
203 hTPCdEdxSigbefore(NULL),
204 hTPCdEdxSigafter(NULL),
208 hPsiPairDeltaPhiafter(NULL),
211 hInvMassbefore(NULL),
212 hArmenterosbefore(NULL),
214 hArmenterosafter(NULL),
215 hAcceptanceCuts(NULL),
219 hCentralityVsNumberOfPrimaryTracks(NULL),
221 hEventPlanePhi(NULL),
223 hTriggerClassSelected(NULL),
224 hReweightMCHistPi0(NULL),
225 hReweightMCHistEta(NULL),
226 hReweightMCHistK0s(NULL),
231 fTriggerSelectedManually(kFALSE),
232 fSpecialTriggerName("")
236 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
237 fCutString=new TObjString((GetCutNumber()).Data());
239 fElectronLabelArray = new Int_t[fElectronArraySize];
240 fUtils = new AliAnalysisUtils();
241 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
242 //fUtils->SetCutOnZVertexSPD(kFALSE);
247 //________________________________________________________________________
248 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
249 AliAnalysisCuts(ref),
251 fHeaderList(ref.fHeaderList),
253 fEventQuality(ref.fEventQuality),
256 fEtaCut(ref.fEtaCut),
257 fEtaCutMin(ref.fEtaCutMin),
259 fSinglePtCut(ref.fSinglePtCut),
261 fMinClsTPC(ref.fMinClsTPC),
262 fMinClsTPCToF(ref.fMinClsTPCToF),
263 fLineCutZRSlope(ref.fLineCutZRSlope),
264 fLineCutZValue(ref.fLineCutZValue),
265 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
266 fLineCutZValueMin(ref.fLineCutZValueMin),
267 fChi2CutConversion(ref.fChi2CutConversion),
268 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
269 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
270 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
271 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
272 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
273 fDoTRDPID(ref.fDoTRDPID),
274 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
275 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
276 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
277 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
278 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
279 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
280 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
281 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
282 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
283 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
284 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
285 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
286 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
287 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
288 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
289 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
290 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
291 fDoQtGammaSelection(ref.fDoQtGammaSelection),
292 fDo2DQt(ref.fDo2DQt),
294 fXVertexCut(ref.fXVertexCut),
295 fYVertexCut(ref.fYVertexCut),
296 fZVertexCut(ref.fZVertexCut),
297 fNSigmaMass(ref.fNSigmaMass),
298 fUseEtaMinCut(ref.fUseEtaMinCut),
299 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
300 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
301 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
302 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
303 fIsHeavyIon(ref.fIsHeavyIon),
304 fDetectorCentrality(ref.fDetectorCentrality),
305 fModCentralityClass(ref.fModCentralityClass),
306 fMaxVertexZ(ref.fMaxVertexZ),
307 fCentralityMin(ref.fCentralityMin),
308 fCentralityMax(ref.fCentralityMax),
309 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
310 fUseTOFpid(ref.fUseTOFpid),
311 fMultiplicityMethod(ref.fMultiplicityMethod),
312 fSpecialTrigger(ref.fSpecialTrigger),
313 fRemovePileUp(ref.fRemovePileUp),
314 fOpeningAngle(ref.fOpeningAngle),
315 fPsiPairCut(ref.fPsiPairCut),
316 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
317 fCosPAngleCut(ref.fCosPAngleCut),
318 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
319 fRejectExtraSignals(ref.fRejectExtraSignals),
320 fminV0Dist(ref.fminV0Dist),
321 fDoSharedElecCut(ref.fDoSharedElecCut),
322 fOfflineTriggerMask(ref.fOfflineTriggerMask),
323 fHasV0AND(ref.fHasV0AND),
324 fIsSDDFired(ref.fIsSDDFired),
325 fRandom(ref.fRandom),
326 fElectronArraySize(ref.fElectronArraySize),
327 fElectronLabelArray(NULL),
328 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
329 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
330 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
331 fConversionPointXArray(ref.fConversionPointXArray),
332 fConversionPointYArray(ref.fConversionPointYArray),
333 fConversionPointZArray(ref.fConversionPointZArray),
334 fnHeaders(ref.fnHeaders),
335 fNotRejectedStart(NULL),
336 fNotRejectedEnd(NULL),
337 fGeneratorNames(ref.fGeneratorNames),
340 fEtaShift(ref.fEtaShift),
341 fDoEtaShift(ref.fDoEtaShift),
342 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
343 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
344 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
345 fPathTrFReweighting(ref.fPathTrFReweighting),
346 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
347 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
348 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
349 fNameFitDataPi0(ref.fNameFitDataPi0),
350 fNameFitDataEta(ref.fNameFitDataEta),
351 fNameFitDataK0s(ref.fNameFitDataK0s),
353 hEtaDistV0sAfterdEdxCuts(NULL),
355 hTPCdEdxbefore(NULL),
357 hTPCdEdxSigbefore(NULL),
358 hTPCdEdxSigafter(NULL),
362 hPsiPairDeltaPhiafter(NULL),
365 hInvMassbefore(NULL),
366 hArmenterosbefore(NULL),
368 hArmenterosafter(NULL),
369 hAcceptanceCuts(NULL),
373 hCentralityVsNumberOfPrimaryTracks(NULL),
375 hEventPlanePhi(NULL),
377 hTriggerClassSelected(NULL),
378 hReweightMCHistPi0(ref.hReweightMCHistPi0),
379 hReweightMCHistEta(ref.hReweightMCHistEta),
380 hReweightMCHistK0s(ref.hReweightMCHistK0s),
381 fFitDataPi0(ref.fFitDataPi0),
382 fFitDataEta(ref.fFitDataEta),
383 fFitDataK0s(ref.fFitDataK0s),
384 fPreSelCut(ref.fPreSelCut),
385 fTriggerSelectedManually(ref.fTriggerSelectedManually),
386 fSpecialTriggerName(ref.fSpecialTriggerName)
389 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
390 fCutString=new TObjString((GetCutNumber()).Data());
391 fElectronLabelArray = new Int_t[fElectronArraySize];
392 fUtils = new AliAnalysisUtils();
393 // dont copy histograms (if you like histograms, call InitCutHistograms())
398 //________________________________________________________________________
399 AliConversionCuts::~AliConversionCuts() {
401 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
403 // delete fHistograms;
404 // fHistograms = NULL;
405 if(fCutString != NULL){
409 if(fElectronLabelArray){
410 delete fElectronLabelArray;
411 fElectronLabelArray = NULL;
413 if(fNotRejectedStart){
414 delete[] fNotRejectedStart;
415 fNotRejectedStart = NULL;
418 delete[] fNotRejectedEnd;
419 fNotRejectedEnd = NULL;
422 delete[] fGeneratorNames;
423 fGeneratorNames = NULL;
432 //________________________________________________________________________
433 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
435 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
436 TH1::AddDirectory(kFALSE);
438 if(fHistograms != NULL){
442 if(fHistograms==NULL){
443 fHistograms=new TList();
444 fHistograms->SetOwner(kTRUE);
445 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
446 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
449 if (hReweightMCHistPi0){
450 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
451 fHistograms->Add(hReweightMCHistPi0);
453 if (hReweightMCHistEta){
454 hReweightMCHistEta->SetName("MCInputForWeightingEta");
455 fHistograms->Add(hReweightMCHistEta);
457 if (hReweightMCHistK0s){
458 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
459 fHistograms->Add(hReweightMCHistK0s);
462 // fFitDataPi0->SetName("DataFitForWeightingPi0");
463 // fHistograms->Add(fFitDataPi0);
466 // fFitDataEta->SetName("DataFitForWeightingEta");
467 // fHistograms->Add(fFitDataEta);
470 // fFitDataK0s->SetName("DataFitForWeightingK0s");
471 // fHistograms->Add(fFitDataK0s);
474 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
475 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
476 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
477 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
478 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
479 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
480 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
481 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
482 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
483 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
484 fHistograms->Add(hCutIndex);
487 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
488 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
489 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
490 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
491 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
492 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
493 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
494 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
495 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
496 fHistograms->Add(hTrackCuts);
499 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",14,-0.5,13.5);
500 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
501 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
502 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
503 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
504 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
505 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
506 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
507 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
508 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
509 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
510 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
511 hPhotonCuts->GetXaxis()->SetBinLabel(12,"out");
512 fHistograms->Add(hPhotonCuts);
515 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
516 fHistograms->Add(hInvMassbefore);
517 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
518 fHistograms->Add(hArmenterosbefore);
519 hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
520 fHistograms->Add(hEtaDistV0s);
523 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
524 fHistograms->Add(hInvMassafter);
525 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
526 fHistograms->Add(hArmenterosafter);
528 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
529 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
530 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
531 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
532 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
533 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
534 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
535 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
536 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
537 fHistograms->Add(hAcceptanceCuts);
540 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
541 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
542 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
543 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
544 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
545 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
546 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
547 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
548 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
549 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
550 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
551 fHistograms->Add(hdEdxCuts);
553 TAxis *AxisBeforedEdx = NULL;
554 TAxis *AxisBeforedEdxSig = NULL;
555 TAxis *AxisBeforeTOF = NULL;
556 TAxis *AxisBeforeTOFSig = NULL;
558 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
559 fHistograms->Add(hTPCdEdxbefore);
560 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
561 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
562 fHistograms->Add(hTPCdEdxSigbefore);
563 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
565 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
566 fHistograms->Add(hTOFbefore);
567 AxisBeforeTOF = hTOFbefore->GetXaxis();
568 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
569 fHistograms->Add(hTOFSigbefore);
570 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
573 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
574 fHistograms->Add(hTPCdEdxSigafter);
576 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
577 fHistograms->Add(hTPCdEdxafter);
579 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
580 fHistograms->Add(hTOFSigafter);
582 hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
583 fHistograms->Add(hEtaDistV0sAfterdEdxCuts);
585 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
586 fHistograms->Add(hPsiPairDeltaPhiafter);
588 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
589 Int_t bins = AxisAfter->GetNbins();
590 Double_t from = AxisAfter->GetXmin();
591 Double_t to = AxisAfter->GetXmax();
592 Double_t *newBins = new Double_t[bins+1];
594 Double_t factor = TMath::Power(to/from, 1./bins);
595 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
596 AxisAfter->Set(bins, newBins);
597 AxisAfter = hTOFSigafter->GetXaxis();
598 AxisAfter->Set(bins, newBins);
599 AxisAfter = hTPCdEdxafter->GetXaxis();
600 AxisAfter->Set(bins, newBins);
602 AxisBeforedEdx->Set(bins, newBins);
603 AxisBeforeTOF->Set(bins, newBins);
604 AxisBeforedEdxSig->Set(bins, newBins);
605 AxisBeforeTOFSig->Set(bins, newBins);
609 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
610 fHistograms->Add(hCentrality);
611 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
612 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
614 // Event Cuts and Info
616 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
617 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
618 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
619 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
620 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
621 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
622 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
623 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
624 fHistograms->Add(hV0EventCuts);
626 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
627 fHistograms->Add(hVertexZ);
629 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
630 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
631 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
632 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
633 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
634 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
635 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
636 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
637 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
638 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
639 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
640 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
641 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
642 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
643 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
644 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
645 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
646 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
647 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
648 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
649 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
650 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
651 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
652 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
653 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
654 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
655 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
656 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
657 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
658 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
659 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
660 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
661 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
662 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
663 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
664 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
665 fHistograms->Add(hTriggerClass);
668 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
669 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
670 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
671 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
672 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
673 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
674 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
675 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
676 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
677 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
678 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
679 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
680 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
681 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
682 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
683 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
693 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
694 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
695 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
696 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
697 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
698 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
699 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
700 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
701 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
702 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
703 fHistograms->Add(hTriggerClassSelected);
705 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
706 fHistograms->Add(hEventPlanePhi);
710 TH1::AddDirectory(kTRUE);
713 //________________________________________________________________________
714 Bool_t AliConversionCuts::InitPIDResponse(){
715 // Set Pointer to AliPIDResponse
717 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
719 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
720 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
721 if(fPIDResponse)return kTRUE;
728 ///________________________________________________________________________
729 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
730 // Process Event Selection
733 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
736 // Check for MC event
737 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
738 // Check if MC event is correctly loaded
739 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
744 if (!mcHandler->InitOk() ){
748 if (!mcHandler->TreeK() ){
752 if (!mcHandler->TreeTR() ) {
759 // cout << "before event trigger" << endl;
760 if(!IsTriggerSelected(fInputEvent)){
761 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
767 if(fInputEvent->IsA()==AliESDEvent::Class()){
768 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
769 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
770 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
772 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
775 // Number of Contributors Cut
776 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
777 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
783 // Z Vertex Position Cut
784 if(!VertexZCut(fInputEvent)){
785 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
794 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
795 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
802 // Centrality Selection
803 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
804 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
810 // Fill Event Histograms
811 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
812 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
813 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
814 if(hCentralityVsNumberOfPrimaryTracks)
815 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
816 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
817 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
822 ///________________________________________________________________________
823 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
824 // MonteCarlo Photon Selection
826 if(!fMCStack)return kFALSE;
828 if (particle->GetPdgCode() == 22){
831 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
834 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
838 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
839 return kFALSE; // no photon as mothers!
842 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
843 return kFALSE; // the gamma has a mother, and it is not a primary particle
846 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
848 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
849 TParticle* ePos = NULL;
850 TParticle* eNeg = NULL;
852 if(particle->GetNDaughters() >= 2){
853 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
854 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
855 if(tmpDaughter->GetUniqueID() == 5){
856 if(tmpDaughter->GetPdgCode() == 11){
858 } else if(tmpDaughter->GetPdgCode() == -11){
865 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
869 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
870 return kFALSE; // no reconstruction below the Pt cut
873 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
874 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
877 if(fEtaCutMin > -0.1){
878 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
879 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
884 return kFALSE; // cuts on distance from collision point
887 if(abs(ePos->Vz()) > fMaxZ){
888 return kFALSE; // outside material
890 if(abs(eNeg->Vz()) > fMaxZ){
891 return kFALSE; // outside material
894 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
895 return kFALSE; // line cut to exclude regions where we do not reconstruct
896 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
900 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
901 return kFALSE; // line cut to exclude regions where we do not reconstruct
902 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
907 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
911 ///________________________________________________________________________
912 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
913 // MonteCarlo Photon Selection
915 if(!aodmcArray)return kFALSE;
917 if (particle->GetPdgCode() == 22){
918 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
921 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
925 if(particle->GetMother() > -1){
926 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
927 return kFALSE; // no photon as mothers!
929 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
930 return kFALSE; // the gamma has a mother, and it is not a primary particle
934 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
936 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
937 AliAODMCParticle* ePos = NULL;
938 AliAODMCParticle* eNeg = NULL;
940 if(particle->GetNDaughters() >= 2){
941 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
942 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
943 if(!tmpDaughter) continue;
944 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
945 if(tmpDaughter->GetPdgCode() == 11){
947 } else if(tmpDaughter->GetPdgCode() == -11){
954 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
958 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
959 return kFALSE; // no reconstruction below the Pt cut
962 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
963 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
966 if(fEtaCutMin > -0.1){
967 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
968 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
972 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
973 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
976 return kFALSE; // cuts on distance from collision point
978 if(abs(ePos->Zv()) > fMaxZ){
979 return kFALSE; // outside material
981 if(abs(eNeg->Zv()) > fMaxZ){
982 return kFALSE; // outside material
985 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
986 return kFALSE; // line cut to exclude regions where we do not reconstruct
987 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
991 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
992 return kFALSE; // line cut to exclude regions where we do not reconstruct
993 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
998 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1002 ///________________________________________________________________________
1003 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1004 { // Specific Photon Cuts
1007 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1010 // Fill Histos before Cuts
1011 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1012 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1014 // Gamma selection based on QT from Armenteros
1015 if(fDoQtGammaSelection == kTRUE){
1016 if(!ArmenterosQtCut(photon)){
1017 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1024 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1026 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1032 // Reconstruction Acceptance Cuts
1033 if(!AcceptanceCuts(photon)){
1034 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1040 if(fDoPhotonAsymmetryCut == kTRUE){
1041 if(!AsymmetryCut(photon,event)){
1042 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1047 //Check the pid probability
1049 if(!PIDProbabilityCut(photon, event)) {
1050 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1055 if(!CorrectedTPCClusterCut(photon, event)) {
1056 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1060 Double_t magField = event->GetMagneticField();
1061 if( magField < 0.0 ){
1067 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1068 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1069 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1072 if(!PsiPairCut(photon)) {
1073 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1078 if(!CosinePAngleCut(photon, event)) {
1079 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1083 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1085 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1088 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1089 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1094 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1095 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1103 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1105 // Histos after Cuts
1106 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1107 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1108 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1113 ///________________________________________________________________________
1114 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1115 { //Cut on corrected TPC Cluster Info
1117 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1118 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1120 if(!negTrack||!posTrack)return kFALSE;
1122 Double_t negclsToF=0;
1124 if (!fUseCorrectedTPCClsInfo ){
1125 if(negTrack->GetTPCNclsF()!=0){
1126 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1129 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1132 Double_t posclsToF = 0.;
1133 if (!fUseCorrectedTPCClsInfo ){
1134 if(posTrack->GetTPCNclsF()!=0){
1135 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1138 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1141 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1148 ///________________________________________________________________________
1149 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1151 //Selection of Reconstructed Photons
1153 FillPhotonCutIndex(kPhotonIn);
1155 if(event->IsA()==AliESDEvent::Class()) {
1156 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1157 FillPhotonCutIndex(kOnFly);
1161 // else if(event->IsA()==AliAODEvent::Class()) {
1162 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1163 // FillPhotonCutIndex(kOnFly);
1169 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1170 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1172 if(!negTrack || !posTrack) {
1173 FillPhotonCutIndex(kNoTracks);
1176 photon->DeterminePhotonQuality(negTrack,posTrack);
1178 if(!TracksAreSelected(negTrack, posTrack)){
1179 FillPhotonCutIndex(kTrackCuts);
1182 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1184 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1185 FillPhotonCutIndex(kdEdxCuts);
1188 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1190 if(!PhotonCuts(photon,event)){
1191 FillPhotonCutIndex(kPhotonCuts);
1195 // Photon passed cuts
1196 FillPhotonCutIndex(kPhotonOut);
1200 ///________________________________________________________________________
1201 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1202 { // Armenteros Qt Cut
1205 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1209 if(photon->GetArmenterosQt()>fQtMax){
1217 ///________________________________________________________________________
1218 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1219 // Exclude certain areas for photon reconstruction
1222 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1225 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1226 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1231 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1232 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1237 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1238 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1241 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1242 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1247 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1248 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1254 if( photon->GetPhotonEta() > (fEtaCut + fEtaShift) || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1255 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1258 if(fEtaCutMin>-0.1){
1259 if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1260 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1266 if(photon->GetPhotonPt()<fPtCut){
1267 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1272 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1278 ///________________________________________________________________________
1279 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1280 // Track Cuts which require AOD/ESD specific implementation
1282 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1283 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1288 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1289 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1290 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1291 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1299 ///________________________________________________________________________
1300 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1301 // Track Cuts which require AOD/ESD specific implementation
1303 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1304 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1309 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1310 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1318 ///________________________________________________________________________
1319 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1320 // Track Selection for Photon Reconstruction
1323 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1327 if(negTrack->Charge() == posTrack->Charge()) {
1328 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1333 // Number of TPC Clusters
1336 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1337 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1343 if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1344 negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1345 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1348 if(fEtaCutMin>-0.1){
1349 if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1350 (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1351 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1358 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1359 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1364 // AOD ESD specific cuts
1365 Bool_t passCuts = kTRUE;
1367 if(negTrack->IsA()==AliAODTrack::Class()) {
1368 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1370 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1374 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1379 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1385 ///________________________________________________________________________
1386 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1387 // Electron Identification Cuts for Photon reconstruction
1388 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1389 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1392 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1393 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1394 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1397 if(fDodEdxSigmaCut == kTRUE){
1398 // TPC Electron Line
1399 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1400 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1402 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1408 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1409 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1410 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1411 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1413 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1420 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1421 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1422 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1423 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1425 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1433 if(fDoKaonRejectionLowP == kTRUE){
1434 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1435 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1437 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1443 if(fDoProtonRejectionLowP == kTRUE){
1444 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1445 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1447 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1454 if(fDoPionRejectionLowP == kTRUE){
1455 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1456 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1458 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1466 // cout<<"Start"<<endl;
1467 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1469 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1470 // {cout<<"TOF DA"<<endl;}
1471 // if(status == AliPIDResponse::kDetPidOk){
1472 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1473 // cout<<"--> "<<probMis<<endl;
1474 // if(probMis > 0.01){
1479 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1481 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1482 Double_t times[AliPID::kSPECIESC];
1483 fCurrentTrack->GetIntegratedTimes(times);
1484 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1485 Double_t dT = TOFsignal - t0 - times[0];
1486 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1488 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1490 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1491 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1492 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1496 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1501 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1502 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1508 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1509 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1510 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1515 ///________________________________________________________________________
1516 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1517 // Cut on Energy Assymetry
1519 for(Int_t ii=0;ii<2;ii++){
1521 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1523 if( track->P() > fMinPPhotonAsymmetryCut ){
1524 Double_t trackNegAsy=0;
1525 if (photon->GetPhotonP()!=0.){
1526 trackNegAsy= track->P()/photon->GetPhotonP();
1529 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1538 ///________________________________________________________________________
1539 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1540 //Returns pointer to the track with given ESD label
1541 //(Important for AOD implementation, since Track array in AOD data is different
1542 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1544 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1546 if(label > event->GetNumberOfTracks() ) return NULL;
1547 AliESDtrack * track = esdEvent->GetTrack(label);
1551 AliVTrack * track = 0x0;
1552 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1553 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1557 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1558 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1560 if(track->GetID() == label) {
1567 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1571 ///________________________________________________________________________
1572 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1573 //Returns pointer to the track with given ESD label
1574 //(Important for AOD implementation, since Track array in AOD data is different
1575 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1578 if(label > event->GetNumberOfTracks() ) return NULL;
1579 AliESDtrack * track = event->GetTrack(label);
1582 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1588 ///________________________________________________________________________
1589 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1590 // Cut on Electron Probability for Photon Reconstruction
1592 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1596 Bool_t iResult=kFALSE;
1598 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1599 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1601 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1602 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1604 if(negProbArray && posProbArray){
1606 negTrack->GetTPCpid(negProbArray);
1607 posTrack->GetTPCpid(posProbArray);
1609 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1614 delete [] posProbArray;
1615 delete [] negProbArray;
1619 ///Not possible for AODs
1629 ///________________________________________________________________________
1630 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1631 // MC Acceptance Cuts
1632 //(Certain areas were excluded for photon reconstruction)
1634 if(particle->R()>fMaxR){
1637 if(ePos->R()>fMaxR){
1641 if(ePos->R()<fMinR){
1645 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1648 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1652 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1656 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1660 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1665 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1668 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1671 if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1674 if(fEtaCutMin>-0.1){
1675 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1678 if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1681 if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1686 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1690 if(particle->Pt()<fPtCut){
1696 ///________________________________________________________________________
1697 Bool_t AliConversionCuts::UpdateCutString() {
1698 ///Update the cut string (if it has been created yet)
1700 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1701 fCutString->SetString(GetCutNumber());
1707 ///________________________________________________________________________
1708 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1710 AliInfo("Entering loading of histograms for weighting");
1711 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1713 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1716 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1717 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1718 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1719 hReweightMCHistPi0->SetDirectory(0);
1720 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1721 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1723 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1724 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1725 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1726 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1727 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1730 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1731 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1732 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1733 hReweightMCHistEta->SetDirectory(0);
1734 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1735 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1738 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1739 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1740 fFitDataEta = new TF1(*fFitDataEtatemp);
1741 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1742 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1745 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1746 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1747 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1748 hReweightMCHistK0s->SetDirectory(0);
1749 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1750 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1753 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1754 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1755 fFitDataK0s = new TF1(*fFitDataK0stemp);
1756 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1757 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1765 ///________________________________________________________________________
1766 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1767 // Initialize Cuts from a given Cut string
1768 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1769 AliInfo("Weighting was enabled");
1770 LoadReweightingHistosMCFromFile();
1773 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1774 if(analysisCutSelection.Length()!=kNCuts) {
1775 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1778 if(!analysisCutSelection.IsDigit()){
1779 AliError("Cut selection contains characters");
1783 const char *cutSelection = analysisCutSelection.Data();
1784 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1785 for(Int_t ii=0;ii<kNCuts;ii++){
1789 // Set Individual Cuts
1790 for(Int_t ii=0;ii<kNCuts;ii++){
1791 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1794 PrintCutsWithValues();
1798 ///________________________________________________________________________
1799 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1800 ///Set individual cut ID
1805 if( SetV0Finder(value)) {
1806 fCuts[kv0FinderType] = value;
1809 } else return kFALSE;
1811 case kededxSigmaCut:
1812 if( SetTPCdEdxCutElectronLine(value)) {
1813 fCuts[kededxSigmaCut] = value;
1816 } else return kFALSE;
1818 case kpidedxSigmaCut:
1819 if( SetTPCdEdxCutPionLine(value)) {
1820 fCuts[kpidedxSigmaCut] = value;
1823 } else return kFALSE;
1825 case kpiMomdedxSigmaCut:
1826 if( SetMinMomPiondEdxCut(value)) {
1827 fCuts[kpiMomdedxSigmaCut] = value;
1830 } else return kFALSE;
1833 if( SetChi2GammaCut(value)) {
1834 fCuts[kchi2GammaCut] = value;
1837 } else return kFALSE;
1840 if( SetSinglePtCut(value)) {
1841 fCuts[ksinglePtCut] = value;
1844 } else return kFALSE;
1847 if( SetTPCClusterCut(value)) {
1848 fCuts[kclsTPCCut] = value;
1851 } else return kFALSE;
1854 if( SetEtaCut(value)) {
1855 fCuts[ketaCut] = value;
1858 } else return kFALSE;
1860 case kLowPRejectionSigmaCut:
1861 if( SetLowPRejectionCuts(value)) {
1862 fCuts[kLowPRejectionSigmaCut] = value;
1865 } else return kFALSE;
1868 if( SetQtMaxCut(value)) {
1869 fCuts[kQtMaxCut] = value;
1872 } else return kFALSE;
1874 case kpiMaxMomdedxSigmaCut:
1875 if( SetMaxMomPiondEdxCut(value)) {
1876 fCuts[kpiMaxMomdedxSigmaCut] = value;
1879 } else return kFALSE;
1882 if( SetRCut(value)) {
1883 fCuts[kRCut] = value;
1886 } else return kFALSE;
1889 if( SetRemovePileUp(value)) {
1890 fCuts[kremovePileUp] = value;
1893 } else return kFALSE;
1896 if( SetSelectSpecialTrigger(value)) {
1897 fCuts[kselectV0AND] = value;
1900 } else return kFALSE;
1902 case kmultiplicityMethod:
1903 if( SetMultiplicityMethod(value)) {
1904 fCuts[kmultiplicityMethod] = value;
1907 } else return kFALSE;
1910 if( SetIsHeavyIon(value)) {
1911 fCuts[kisHeavyIon] = value;
1914 } else return kFALSE;
1916 case kCentralityMin:
1917 if( SetCentralityMin(value)) {
1918 fCuts[kCentralityMin] = value;
1921 } else return kFALSE;
1923 case kCentralityMax:
1924 if( SetCentralityMax(value)) {
1925 fCuts[kCentralityMax] = value;
1928 } else return kFALSE;
1930 case kTOFelectronPID:
1931 if( SetTOFElectronPIDCut(value)) {
1932 fCuts[kTOFelectronPID] = value;
1935 } else return kFALSE;
1937 case kdoPhotonAsymmetryCut:
1938 if( SetPhotonAsymmetryCut(value)) {
1939 fCuts[kdoPhotonAsymmetryCut] = value;
1942 } else return kFALSE;
1945 if( SetPsiPairCut(value)) {
1946 fCuts[kPsiPair] = value;
1949 } else return kFALSE;
1952 if( SetCosPAngleCut(value)) {
1953 fCuts[kCosPAngle] = value;
1956 } else return kFALSE;
1960 if( SetSharedElectronCut(value)) {
1961 fCuts[kElecShare] = value;
1964 } else return kFALSE;
1967 if( SetToCloseV0sCut(value)) {
1968 fCuts[kToCloseV0s] = value;
1971 } else return kFALSE;
1974 if( SetRejectExtraSignalsCut(value)) {
1975 fCuts[kExtraSignals] = value;
1978 } else return kFALSE;
1981 if( SetDCARPhotonPrimVtxCut(value)) {
1982 fCuts[kDcaRPrimVtx] = value;
1985 } else return kFALSE;
1988 if( SetDCAZPhotonPrimVtxCut(value)) {
1989 fCuts[kDcaZPrimVtx] = value;
1992 } else return kFALSE;
1994 case kInPlaneOutOfPlane:
1995 if( SetInPlaneOutOfPlane(value)) {
1996 fCuts[kInPlaneOutOfPlane] = value;
1999 } else return kFALSE;
2005 AliError("Cut id out of range");
2009 AliError("Cut id %d not recognized");
2014 ///________________________________________________________________________
2015 void AliConversionCuts::PrintCuts() {
2016 // Print out current Cut Selection
2017 for(Int_t ic = 0; ic < kNCuts; ic++) {
2018 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2022 void AliConversionCuts::PrintCutsWithValues() {
2023 // Print out current Cut Selection with value
2024 if (fIsHeavyIon == 0) {
2025 printf("Running in pp mode \n");
2026 if (fSpecialTrigger == 0){
2027 printf("\t only events triggered by V0OR will be analysed \n");
2028 } else if (fSpecialTrigger == 1){
2029 printf("\t only events triggered by V0AND will be analysed \n");
2030 } else if (fSpecialTrigger == 2){
2031 printf("\t only events where SDD was present will be analysed \n");
2032 } else if (fSpecialTrigger == 3){
2033 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2034 } else if (fSpecialTrigger > 3){
2035 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2037 } else if (fIsHeavyIon == 1){
2038 printf("Running in PbPb mode \n");
2039 if (fDetectorCentrality == 0){
2040 printf("\t centrality selection based on V0M \n");
2041 } else if (fDetectorCentrality == 1){
2042 printf("\t centrality selection based on Cl1 \n");
2044 if (fModCentralityClass == 0){
2045 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2046 } else if ( fModCentralityClass == 1){
2047 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2048 } else if ( fModCentralityClass == 2){
2049 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2050 } else if (fModCentralityClass == 3){
2051 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2052 } else if ( fModCentralityClass == 4){
2053 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2054 } else if ( fModCentralityClass == 5){
2055 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2057 if (fSpecialTrigger == 0){
2058 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2059 } else if (fSpecialTrigger > 4){
2060 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2062 } else if (fIsHeavyIon == 2){
2063 printf("Running in pPb mode \n");
2064 if (fDetectorCentrality == 0){
2065 printf("\t centrality selection based on V0A \n");
2066 } else if (fDetectorCentrality == 1){
2067 printf("\t centrality selection based on Cl1 \n");
2069 if (fModCentralityClass == 0){
2070 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2072 if (fSpecialTrigger == 0){
2073 printf("\t only events triggered by kINT7 will be analysed \n");
2074 } else if (fSpecialTrigger > 4){
2075 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2084 ///________________________________________________________________________
2085 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2093 fDetectorCentrality=0;
2097 fDetectorCentrality=1;
2099 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2101 fDetectorCentrality=0;
2102 fModCentralityClass=1;
2104 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2106 fDetectorCentrality=0;
2107 fModCentralityClass=2;
2109 case 5: //strict cut on v0 tracks for MC
2111 fDetectorCentrality=0;
2112 fModCentralityClass=3;
2114 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2115 //strict cut on v0 tracks for MC
2117 fDetectorCentrality=0;
2118 fModCentralityClass=4;
2120 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2121 //strict cut on v0 tracks for MC
2123 fDetectorCentrality=0;
2124 fModCentralityClass=5;
2128 fDetectorCentrality=0;
2132 fDetectorCentrality=1;
2135 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2141 //___________________________________________________________________
2142 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2145 if(minCentrality<0||minCentrality>9){
2146 AliError(Form("minCentrality not defined %d",minCentrality));
2150 fCentralityMin=minCentrality;
2153 //___________________________________________________________________
2154 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2157 if(maxCentrality<0||maxCentrality>9){
2158 AliError(Form("maxCentrality not defined %d",maxCentrality));
2161 fCentralityMax=maxCentrality;
2164 ///________________________________________________________________________
2165 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2168 switch(selectSpecialTrigger){
2170 fSpecialTrigger=0; // dont care
2173 fSpecialTrigger=1; // V0AND
2176 fSpecialTrigger=2; // with SDD requested
2179 fSpecialTrigger=3; // V0AND plus with SDD requested
2181 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2183 fSpecialTrigger=4; // different trigger class as MB
2184 fTriggerSelectedManually = kTRUE;
2187 fSpecialTrigger=4; // different trigger class as MB
2188 fTriggerSelectedManually = kTRUE;
2191 fSpecialTrigger=4; // different trigger class as MB
2192 fTriggerSelectedManually = kTRUE;
2195 fSpecialTrigger=4; // different trigger class as MB
2196 fTriggerSelectedManually = kTRUE;
2199 fSpecialTrigger=4; // different trigger class as MB
2200 fTriggerSelectedManually = kTRUE;
2203 fSpecialTrigger=4; // different trigger class as MB
2204 fTriggerSelectedManually = kTRUE;
2207 AliError("Warning: Special Trigger Not known");
2212 ///________________________________________________________________________
2213 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2216 fMultiplicityMethod=multiplicityMethod;
2218 // 0 Photon Multiplicity
2219 // 1 TPC Track multiplicity
2225 ///________________________________________________________________________
2226 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2228 switch(removePileUp){
2230 fRemovePileUp=kFALSE;
2233 fRemovePileUp=kTRUE;
2236 AliError("RemovePileUpCut not defined");
2241 ///________________________________________________________________________
2242 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2244 switch(extraSignal){
2246 fRejectExtraSignals = 0;
2247 break; // No Rejection
2249 fRejectExtraSignals = 1;
2250 break; // MinBias Header
2252 fRejectExtraSignals = 2;
2253 break; // User String Array
2255 fRejectExtraSignals = 3;
2256 break; // Rejection for Gamma Correction only
2258 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2263 ///________________________________________________________________________
2264 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2266 switch (v0FinderType){
2267 case 0: // on fly V0 finder
2268 cout << "have chosen onfly V0" << endl;
2269 fUseOnFlyV0Finder=kTRUE;
2271 case 1: // offline V0 finder
2272 cout << "have chosen offline V0" << endl;
2273 fUseOnFlyV0Finder=kFALSE;
2276 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2281 ///________________________________________________________________________
2282 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2285 //Set Standard LineCutZValues
2286 fLineCutZValueMin = -2;
2287 fLineCutZValue = 7.;
2292 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2294 fLineCutZRSlopeMin = 0.;
2296 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2298 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2300 fLineCutZRSlopeMin = 0.;
2304 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2306 fLineCutZRSlopeMin = 0.;
2310 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2312 fLineCutZRSlopeMin = 0.;
2316 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2318 fLineCutZRSlopeMin = 0.;
2322 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2324 fLineCutZRSlopeMin = 0.;
2328 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2330 fLineCutZRSlopeMin = 0.;
2333 if (fIsHeavyIon==1){
2335 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2337 fLineCutZRSlopeMin = 0.;
2341 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2343 fLineCutZRSlopeMin = 0.;
2346 // case 8: // 0.1 - 0.8
2348 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2349 // fEtaCutMin = 0.1;
2350 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2354 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2356 fLineCutZRSlopeMin = 0.;
2360 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2362 fLineCutZRSlopeMin = 0.;
2365 AliError(Form(" EtaCut not defined %d",etaCut));
2370 ///________________________________________________________________________
2371 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2394 // High purity cuts for PbPb (remove first layers of material)
2417 AliError("RCut not defined");
2422 ///________________________________________________________________________
2423 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2425 switch(singlePtCut){
2426 case 0: // 0.050 GeV
2427 fSinglePtCut = 0.050;
2429 case 1: // 0.100 GeV
2430 fSinglePtCut = 0.100;
2432 case 2: // 0.150 GeV
2433 fSinglePtCut = 0.150;
2435 case 3: // 0.200 GeV
2436 fSinglePtCut = 0.200;
2438 case 4: // 0.075 GeV
2439 fSinglePtCut = 0.075;
2441 case 5: // 0.125 GeV
2442 fSinglePtCut = 0.125;
2445 fSinglePtCut = 0.040;
2451 AliError(Form("singlePtCut not defined %d",singlePtCut));
2456 ///________________________________________________________________________
2457 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2472 case 4: // 95% of findable clusters
2473 fMinClsTPCToF= 0.95;
2474 fUseCorrectedTPCClsInfo=1;
2476 case 5: // 0% of findable clusters
2478 fUseCorrectedTPCClsInfo=1;
2480 case 6: // 70% of findable clusters
2482 fUseCorrectedTPCClsInfo=1;
2484 case 7: // 0% of findable clusters
2485 fMinClsTPCToF= 0.35;
2486 fUseCorrectedTPCClsInfo=0;
2489 fMinClsTPCToF= 0.35;
2490 fUseCorrectedTPCClsInfo=1;
2494 fUseCorrectedTPCClsInfo=1;
2497 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2502 ///________________________________________________________________________
2503 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2505 switch(ededxSigmaCut){
2507 fPIDnSigmaBelowElectronLine=-10;
2508 fPIDnSigmaAboveElectronLine=10;
2511 fPIDnSigmaBelowElectronLine=-5;
2512 fPIDnSigmaAboveElectronLine=5;
2515 fPIDnSigmaBelowElectronLine=-3;
2516 fPIDnSigmaAboveElectronLine=5;
2519 fPIDnSigmaBelowElectronLine=-4;
2520 fPIDnSigmaAboveElectronLine=5;
2523 fPIDnSigmaBelowElectronLine=-6;
2524 fPIDnSigmaAboveElectronLine=7;
2527 fPIDnSigmaBelowElectronLine=-4;
2528 fPIDnSigmaAboveElectronLine=4;
2531 fPIDnSigmaBelowElectronLine=-2.5;
2532 fPIDnSigmaAboveElectronLine=4;
2535 fPIDnSigmaBelowElectronLine=-2;
2536 fPIDnSigmaAboveElectronLine=3.5;
2539 AliError("TPCdEdxCutElectronLine not defined");
2545 ///________________________________________________________________________
2546 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2549 switch(pidedxSigmaCut){
2551 fPIDnSigmaAbovePionLine=-10;
2552 fPIDnSigmaAbovePionLineHighPt=-10;
2555 fPIDnSigmaAbovePionLine=0;
2556 fPIDnSigmaAbovePionLineHighPt=-10;
2559 fPIDnSigmaAbovePionLine=1;
2560 fPIDnSigmaAbovePionLineHighPt=-10;
2563 fPIDnSigmaAbovePionLine=2.5;
2564 fPIDnSigmaAbovePionLineHighPt=-10;
2567 fPIDnSigmaAbovePionLine=0.5;
2568 fPIDnSigmaAbovePionLineHighPt=-10;
2571 fPIDnSigmaAbovePionLine=2.;
2572 fPIDnSigmaAbovePionLineHighPt=-10;
2575 fPIDnSigmaAbovePionLine=2.;
2576 fPIDnSigmaAbovePionLineHighPt=0.5;
2579 fPIDnSigmaAbovePionLine=3.5;
2580 fPIDnSigmaAbovePionLineHighPt=-10;
2583 fPIDnSigmaAbovePionLine=2.;
2584 fPIDnSigmaAbovePionLineHighPt=1.;
2587 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2588 fPIDnSigmaAbovePionLineHighPt=-10;
2591 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2596 ///________________________________________________________________________
2597 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2599 switch(piMomdedxSigmaCut){
2601 fPIDMinPnSigmaAbovePionLine=0.5;
2604 fPIDMinPnSigmaAbovePionLine=1.;
2607 fPIDMinPnSigmaAbovePionLine=1.5;
2610 fPIDMinPnSigmaAbovePionLine=20.;
2613 fPIDMinPnSigmaAbovePionLine=50.;
2616 fPIDMinPnSigmaAbovePionLine=0.3;
2619 fPIDMinPnSigmaAbovePionLine=0.25;
2622 fPIDMinPnSigmaAbovePionLine=0.4;
2625 fPIDMinPnSigmaAbovePionLine=0.2;
2628 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2633 ///________________________________________________________________________
2634 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2636 switch(piMaxMomdedxSigmaCut){
2638 fPIDMaxPnSigmaAbovePionLine=100.;
2641 fPIDMaxPnSigmaAbovePionLine=5.;
2644 fPIDMaxPnSigmaAbovePionLine=4.;
2647 fPIDMaxPnSigmaAbovePionLine=3.5;
2650 fPIDMaxPnSigmaAbovePionLine=3.;
2653 fPIDMaxPnSigmaAbovePionLine=7.;
2656 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2661 ///________________________________________________________________________
2662 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2664 switch(LowPRejectionSigmaCut){
2666 fPIDnSigmaAtLowPAroundKaonLine=0;
2667 fPIDnSigmaAtLowPAroundProtonLine=0;
2668 fPIDnSigmaAtLowPAroundPionLine=0;
2669 fDoKaonRejectionLowP = kFALSE;
2670 fDoProtonRejectionLowP = kFALSE;
2671 fDoPionRejectionLowP = kFALSE;
2672 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2675 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2676 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2677 fPIDnSigmaAtLowPAroundPionLine=0.5;
2678 fDoKaonRejectionLowP = kTRUE;
2679 fDoProtonRejectionLowP = kTRUE;
2680 fDoPionRejectionLowP = kTRUE;
2681 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2684 fPIDnSigmaAtLowPAroundKaonLine=1;
2685 fPIDnSigmaAtLowPAroundProtonLine=1;
2686 fPIDnSigmaAtLowPAroundPionLine=1;
2687 fDoKaonRejectionLowP = kTRUE;
2688 fDoProtonRejectionLowP = kTRUE;
2689 fDoPionRejectionLowP = kTRUE;
2690 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2693 fPIDnSigmaAtLowPAroundKaonLine=2.;
2694 fPIDnSigmaAtLowPAroundProtonLine=2.;
2695 fPIDnSigmaAtLowPAroundPionLine=2.;
2696 fDoKaonRejectionLowP = kTRUE;
2697 fDoProtonRejectionLowP = kTRUE;
2698 fDoPionRejectionLowP = kTRUE;
2699 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2702 fPIDnSigmaAtLowPAroundKaonLine=0.;
2703 fPIDnSigmaAtLowPAroundProtonLine=0.;
2704 fPIDnSigmaAtLowPAroundPionLine=1;
2705 fDoKaonRejectionLowP = kFALSE;
2706 fDoProtonRejectionLowP = kFALSE;
2707 fDoPionRejectionLowP = kTRUE;
2708 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2711 fPIDnSigmaAtLowPAroundKaonLine=0.;
2712 fPIDnSigmaAtLowPAroundProtonLine=0.;
2713 fPIDnSigmaAtLowPAroundPionLine=1.5;
2714 fDoKaonRejectionLowP = kFALSE;
2715 fDoProtonRejectionLowP = kFALSE;
2716 fDoPionRejectionLowP = kTRUE;
2717 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2720 fPIDnSigmaAtLowPAroundKaonLine=0.;
2721 fPIDnSigmaAtLowPAroundProtonLine=0.;
2722 fPIDnSigmaAtLowPAroundPionLine=2.;
2723 fDoKaonRejectionLowP = kFALSE;
2724 fDoProtonRejectionLowP = kFALSE;
2725 fDoPionRejectionLowP = kTRUE;
2726 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2729 fPIDnSigmaAtLowPAroundKaonLine=0.;
2730 fPIDnSigmaAtLowPAroundProtonLine=0.;
2731 fPIDnSigmaAtLowPAroundPionLine=0.5;
2732 fDoKaonRejectionLowP = kFALSE;
2733 fDoProtonRejectionLowP = kFALSE;
2734 fDoPionRejectionLowP = kTRUE;
2735 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2738 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2743 ///________________________________________________________________________
2744 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2746 switch(TOFelectronPID){
2748 fUseTOFpid = kFALSE;
2749 fTofPIDnSigmaBelowElectronLine=-100;
2750 fTofPIDnSigmaAboveElectronLine=100;
2754 fTofPIDnSigmaBelowElectronLine=-7;
2755 fTofPIDnSigmaAboveElectronLine=7;
2759 fTofPIDnSigmaBelowElectronLine=-5;
2760 fTofPIDnSigmaAboveElectronLine=5;
2764 fTofPIDnSigmaBelowElectronLine=-3;
2765 fTofPIDnSigmaAboveElectronLine=5;
2769 fTofPIDnSigmaBelowElectronLine=-2;
2770 fTofPIDnSigmaAboveElectronLine=3;
2774 fTofPIDnSigmaBelowElectronLine=-3;
2775 fTofPIDnSigmaAboveElectronLine=3;
2778 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2783 ///________________________________________________________________________
2784 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2789 fDoQtGammaSelection=kFALSE;
2829 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2834 ///________________________________________________________________________
2835 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2838 switch(chi2GammaCut){
2840 fChi2CutConversion = 100.;
2843 fChi2CutConversion = 50.;
2846 fChi2CutConversion = 30.;
2849 fChi2CutConversion = 200.;
2852 fChi2CutConversion = 500.;
2855 fChi2CutConversion = 100000.;
2858 fChi2CutConversion = 5.;
2861 fChi2CutConversion = 10.;
2864 fChi2CutConversion = 20.;
2867 fChi2CutConversion = 15.;
2870 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2875 ///________________________________________________________________________
2876 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2880 fPsiPairCut = 10000; //
2883 fPsiPairCut = 0.1; //
2886 fPsiPairCut = 0.05; // Standard
2889 fPsiPairCut = 0.035; //
2892 fPsiPairCut = 0.2; //
2895 fPsiPairCut = 0.1; //
2896 fDo2DPsiPairChi2 = kTRUE;
2899 fPsiPairCut = 0.05; //
2900 fDo2DPsiPairChi2 = kTRUE;
2903 fPsiPairCut = 0.035; //
2904 fDo2DPsiPairChi2 = kTRUE;
2907 fPsiPairCut = 0.2; //
2908 fDo2DPsiPairChi2 = kTRUE; //
2911 fPsiPairCut = 0.5; //
2914 AliError(Form("PsiPairCut not defined %d",psiCut));
2920 ///________________________________________________________________________
2921 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2923 switch(doPhotonAsymmetryCut){
2925 fDoPhotonAsymmetryCut=0;
2926 fMinPPhotonAsymmetryCut=100.;
2927 fMinPhotonAsymmetry=0.;
2930 fDoPhotonAsymmetryCut=1;
2931 fMinPPhotonAsymmetryCut=3.5;
2932 fMinPhotonAsymmetry=0.04;
2935 fDoPhotonAsymmetryCut=1;
2936 fMinPPhotonAsymmetryCut=3.5;
2937 fMinPhotonAsymmetry=0.06;
2940 fDoPhotonAsymmetryCut=1;
2941 fMinPPhotonAsymmetryCut=0.0;
2942 fMinPhotonAsymmetry=0.05;
2945 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2948 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2951 ///________________________________________________________________________
2952 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2962 fCosPAngleCut = 0.5;
2965 fCosPAngleCut = 0.75;
2968 fCosPAngleCut = 0.85;
2971 fCosPAngleCut = 0.88;
2974 fCosPAngleCut = 0.9;
2977 fCosPAngleCut = 0.95;
2980 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2986 ///________________________________________________________________________
2987 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
2991 fDoSharedElecCut = kFALSE;
2994 fDoSharedElecCut = kTRUE;
2997 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3003 ///________________________________________________________________________
3004 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3008 fDoToCloseV0sCut = kFALSE;
3012 fDoToCloseV0sCut = kTRUE;
3016 fDoToCloseV0sCut = kTRUE;
3020 fDoToCloseV0sCut = kTRUE;
3024 AliError(Form("Shared Electron Cut not defined %d",toClose));
3029 ///________________________________________________________________________
3030 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3032 switch(TRDElectronCut){
3038 fPIDTRDEfficiency=0.1;
3042 fPIDTRDEfficiency=0.8;
3046 fPIDTRDEfficiency=0.9;
3049 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3056 ///________________________________________________________________________
3057 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3059 switch(DCAZPhotonPrimVtx){
3061 fDCAZPrimVtxCut = 1000;
3064 fDCAZPrimVtxCut = 10;
3067 fDCAZPrimVtxCut = 5;
3070 fDCAZPrimVtxCut = 4;
3073 fDCAZPrimVtxCut = 3;
3076 fDCAZPrimVtxCut = 2.5;
3079 fDCAZPrimVtxCut = 2;
3082 fDCAZPrimVtxCut = 1.5;
3085 fDCAZPrimVtxCut = 1;
3088 fDCAZPrimVtxCut = 0.5;
3091 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3097 ///________________________________________________________________________
3098 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3100 switch(DCARPhotonPrimVtx){
3102 fDCARPrimVtxCut = 1000;
3105 fDCARPrimVtxCut = 10;
3108 fDCARPrimVtxCut = 5;
3111 fDCARPrimVtxCut = 4;
3114 fDCARPrimVtxCut = 3;
3117 fDCARPrimVtxCut = 2.5;
3120 fDCARPrimVtxCut = 2;
3123 fDCARPrimVtxCut = 1.5;
3126 fDCARPrimVtxCut = 1;
3129 fDCARPrimVtxCut = 0.5;
3132 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3138 ///________________________________________________________________________
3139 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3143 fInPlaneOutOfPlane = 0; // No Event Plane
3146 fInPlaneOutOfPlane = 1; // In-Plane
3149 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3152 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3159 //-------------------------------------------------------------
3160 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3161 { // Get Event Centrality
3163 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3165 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3167 if(fDetectorCentrality==0){
3168 if (fIsHeavyIon==2){
3169 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3171 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3174 if(fDetectorCentrality==1){
3175 return fESDCentrality->GetCentralityPercentile("CL1");
3179 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3181 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3186 //-------------------------------------------------------------
3187 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3188 { // Centrality Selection
3189 if(!fIsHeavyIon)return kTRUE;
3191 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3192 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3194 Double_t centrality=GetCentrality(event);
3195 if(centrality<0)return kFALSE;
3197 Int_t centralityC=0;
3198 if (fModCentralityClass == 0){
3199 centralityC= Int_t(centrality/10);
3200 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3204 else if (fModCentralityClass ==1){
3205 centralityC= Int_t(centrality);
3206 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3208 } else return kFALSE;
3210 else if (fModCentralityClass ==2){
3211 centralityC= Int_t(centrality);
3212 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3217 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3218 Int_t PrimaryTracks10[10][2] =
3231 Int_t PrimaryTracks5a[10][2] =
3244 Int_t PrimaryTracks5b[10][2] =
3259 if(event->IsA()==AliESDEvent::Class()) column = 0;
3260 if(event->IsA()==AliAODEvent::Class()) column = 1;
3262 if (fModCentralityClass == 3){
3264 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3269 centralityC= Int_t(centrality/10);
3270 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3275 else if (fModCentralityClass ==4){
3277 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3282 centralityC= Int_t(centrality);
3283 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3285 } else return kFALSE;
3288 else if (fModCentralityClass ==5){
3290 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3295 centralityC= Int_t(centrality);
3296 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3304 ///________________________________________________________________________
3305 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3306 // Cut on z position of primary vertex
3307 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3308 Double_t fVertexZSPD = 0;
3309 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3311 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3313 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3315 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3318 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3320 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3321 ->GetTask("V0ReaderV1"))->GetPeriodName();
3322 if (periodName.CompareTo("LHC11h")==0){
3323 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3325 if (fIsHeavyIon == 2){
3326 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3327 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3328 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3333 ///________________________________________________________________________
3335 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3336 // returns number of contributors to the vertex
3338 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3340 if (fESDEvent->GetPrimaryVertex() != NULL){
3341 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3342 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3343 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3347 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3348 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3349 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3350 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3352 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3353 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3359 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3361 if (fAODEvent->GetPrimaryVertex() != NULL){
3362 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3363 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3366 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3367 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3368 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3370 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3375 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3379 ///________________________________________________________________________
3381 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3384 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3386 UInt_t isSelected = AliVEvent::kAny;
3387 if (fInputHandler==NULL) return kFALSE;
3388 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3389 if (!fTriggerSelectedManually){
3390 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3392 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3393 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3394 else fOfflineTriggerMask = AliVEvent::kMB;
3397 // Get the actual offline trigger mask for the event and AND it with the
3398 // requested mask. If no mask requested select by default the event.
3399 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3400 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3402 if (fOfflineTriggerMask)
3403 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3405 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3409 if (fIsSDDFired) hTriggerClass->Fill(33);
3410 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3411 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3412 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3413 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3414 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3415 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3416 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3417 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3418 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3419 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3420 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3421 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3422 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3423 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3424 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3425 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3426 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3427 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3428 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3429 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3430 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3431 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3432 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3433 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3434 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3435 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3436 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3437 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3438 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3439 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3440 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3441 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3442 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3443 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3444 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3445 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3446 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3447 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3448 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3449 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3450 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3453 if(hTriggerClassSelected && isSelected){
3454 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3455 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3456 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3457 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3458 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3459 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3460 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3461 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3462 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3463 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3464 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3465 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3466 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3467 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3468 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3469 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3470 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3471 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3472 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3473 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3474 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3475 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3476 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3477 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3478 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3479 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3480 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3481 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3482 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3483 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3484 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3485 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3486 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3487 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3488 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3489 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3490 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3491 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3492 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3493 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3494 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3497 if(!isSelected)return kFALSE;
3503 ///________________________________________________________________________
3504 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3505 // Get first TPC row
3506 Int_t firstTPCRow = 0;
3507 Double_t radiusI = 84.8;
3508 Double_t radiusO = 134.6;
3509 Double_t radiusOB = 198.;
3510 Double_t rSizeI = 0.75;
3511 Double_t rSizeO = 1.;
3512 Double_t rSizeOB = 1.5;
3516 if(radius <= radiusI){
3519 if(radius>radiusI && radius<=radiusO){
3520 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3522 if(radius>radiusO && radius<=radiusOB){
3523 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3526 if(radius>radiusOB){
3527 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3533 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3534 ///Check if passes cosine of pointing angle cut
3535 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3541 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3542 // calculates the pointing angle of the recalculated V0
3544 Double_t momV0[3] = {0,0,0};
3545 if(event->IsA()==AliESDEvent::Class()){
3546 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3547 if(!esdEvent) return -999;
3548 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3549 if(!v0) return -999;
3550 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3552 if(event->IsA()==AliAODEvent::Class()){
3553 momV0[0] = photon->GetPx();
3554 momV0[1] = photon->GetPy();
3555 momV0[2] = photon->GetPz();
3558 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3559 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3560 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3561 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3563 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3564 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3567 Double_t cosinePointingAngle = -999;
3568 if(momV02*PosV02 > 0.0)
3569 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3571 return cosinePointingAngle;
3574 ///________________________________________________________________________
3575 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3577 if (fDo2DPsiPairChi2){
3578 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3584 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3590 ///________________________________________________________________________
3591 TString AliConversionCuts::GetCutNumber(){
3592 // returns TString with current cut number
3594 for(Int_t ii=0;ii<kNCuts;ii++){
3595 a.Append(Form("%d",fCuts[ii]));
3600 ///________________________________________________________________________
3601 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3603 Int_t posLabel = photon->GetTrackLabelPositive();
3604 Int_t negLabel = photon->GetTrackLabelNegative();
3606 fElectronLabelArray[nV0*2] = posLabel;
3607 fElectronLabelArray[(nV0*2)+1] = negLabel;
3609 ///________________________________________________________________________
3610 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3612 Int_t posLabel = photon->GetTrackLabelPositive();
3613 Int_t negLabel = photon->GetTrackLabelNegative();
3615 for(Int_t i = 0; i<nV0s*2;i++){
3616 if(i==nV0*2) continue;
3617 if(i==(nV0*2)+1) continue;
3618 if(fElectronLabelArray[i] == posLabel){
3620 if(fElectronLabelArray[i] == negLabel){
3626 ///________________________________________________________________________
3627 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3630 Double_t posX = photon->GetConversionX();
3631 Double_t posY = photon->GetConversionY();
3632 Double_t posZ = photon->GetConversionZ();
3634 for(Int_t i = 0;i<photons->GetEntries();i++){
3635 if(nV0 == i) continue;
3636 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3637 Double_t posCompX = photonComp->GetConversionX();
3638 Double_t posCompY = photonComp->GetConversionY();
3639 Double_t posCompZ = photonComp->GetConversionZ();
3641 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3643 if(dist < fminV0Dist*fminV0Dist){
3644 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3652 ///________________________________________________________________________
3653 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3657 if(fNotRejectedStart){
3658 delete[] fNotRejectedStart;
3659 fNotRejectedStart = NULL;
3661 if(fNotRejectedEnd){
3662 delete[] fNotRejectedEnd;
3663 fNotRejectedEnd = NULL;
3665 if(fGeneratorNames){
3666 delete[] fGeneratorNames;
3667 fGeneratorNames = NULL;
3670 if(rejection == 0) return; // No Rejection
3672 AliGenCocktailEventHeader *cHeader = 0x0;
3673 AliAODMCHeader *cHeaderAOD = 0x0;
3674 Bool_t headerFound = kFALSE;
3675 AliStack *fMCStack = 0x0;
3676 TClonesArray *fMCStackAOD = 0x0;
3677 if(MCEvent->IsA()==AliMCEvent::Class()){
3678 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3679 if(cHeader) headerFound = kTRUE;
3680 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3682 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3683 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3684 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3687 if(cHeaderAOD) headerFound = kTRUE;
3691 TList *genHeaders = 0x0;
3692 if(cHeader) genHeaders = cHeader->GetHeaders();
3694 genHeaders = cHeaderAOD->GetCocktailHeaders();
3695 if(genHeaders->GetEntries()==1){
3696 SetRejectExtraSignalsCut(0);
3700 AliGenEventHeader* gh = 0;
3702 Int_t firstindexA = 0;
3703 Int_t lastindexA = -1;
3704 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3705 if(rejection == 2){ // TList of Headers Names
3706 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3707 gh = (AliGenEventHeader*)genHeaders->At(i);
3708 TString GeneratorName = gh->GetName();
3709 lastindexA = lastindexA + gh->NProduced();
3710 // cout << i << "\t" << GeneratorName.Data() << endl;
3711 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3712 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3713 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3714 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3716 if (fMCStack->Particle(firstindexA)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA)->GetPdgCode() == 221 ) {
3722 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3723 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3733 firstindexA = firstindexA + gh->NProduced();
3737 fNotRejectedStart = new Int_t[fnHeaders];
3738 fNotRejectedEnd = new Int_t[fnHeaders];
3739 fGeneratorNames = new TString[fnHeaders];
3741 if(rejection == 1 || rejection == 3){
3742 fNotRejectedStart[0] = 0;
3743 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3744 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3748 Int_t firstindex = 0;
3749 Int_t lastindex = -1;
3751 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3752 gh = (AliGenEventHeader*)genHeaders->At(i);
3753 TString GeneratorName = gh->GetName();
3754 lastindex = lastindex + gh->NProduced();
3755 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3756 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3757 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3758 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3760 if (fMCStack->Particle(firstindex)->GetPdgCode() == 111 || fMCStack->Particle(firstindex)->GetPdgCode() == 221 ) {
3761 fNotRejectedStart[number] = firstindex;
3762 fNotRejectedEnd[number] = lastindex;
3763 fGeneratorNames[number] = GeneratorName;
3769 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3770 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3771 fNotRejectedStart[number] = firstindex;
3772 fNotRejectedEnd[number] = lastindex;
3773 fGeneratorNames[number] = GeneratorName;
3780 fNotRejectedStart[number] = firstindex;
3781 fNotRejectedEnd[number] = lastindex;
3782 fGeneratorNames[number] = GeneratorName;
3783 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3789 firstindex = firstindex + gh->NProduced();
3791 } else { // No Cocktail Header Found
3792 fNotRejectedStart = new Int_t[1];
3793 fNotRejectedEnd = new Int_t[1];
3796 fNotRejectedStart[0] = 0;
3797 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3798 fGeneratorNames = new TString[1];
3799 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3801 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3802 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3803 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3804 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3805 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3806 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3808 SetRejectExtraSignalsCut(0);
3812 //_________________________________________________________________________
3813 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3815 // Not Accepted == kFALSE == 0
3816 // Accepted == kTRUE == 1
3817 // FirstHeader == kTRUE == 3
3818 if(index < 0) return 0; // No Particle
3821 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3822 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3823 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3824 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3826 for(Int_t i = 0;i<fnHeaders;i++){
3827 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3829 if(i == 0) accepted = 2; // MB Header
3833 else if(InputEvent->IsA()==AliAODEvent::Class()){
3834 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3835 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3836 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3837 if(!aodMCParticle->IsPrimary()){
3838 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3839 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3841 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3842 for(Int_t i = 0;i<fnHeaders;i++){
3843 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3845 if(i == 0) accepted = 2; // MB Header
3852 //_________________________________________________________________________
3853 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
3855 if ( !IsTriggerSelected(InputEvent) )
3858 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
3859 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3862 if(isHeavyIon == 0 && GetIsFromPileup()){
3863 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3865 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3869 Bool_t hasV0And = ReaderCuts->HasV0AND();
3870 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3871 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
3872 return 7; // With SDD requested but no fired
3874 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3875 return 8; // V0AND requested but no fired
3877 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
3878 if(hCentralityVsNumberOfPrimaryTracks)
3879 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
3880 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3881 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
3885 //_________________________________________________________________________
3886 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3887 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") ||
3888 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
3891 for (Int_t i = 0; i < fnHeaders; i++){
3892 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
3893 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
3895 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
3897 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
3898 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
3899 fGeneratorNames[i].Contains("hijing")){
3901 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
3903 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
3905 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
3907 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
3909 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
3911 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
3914 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") ){
3919 if (kCaseGen == 0) return 1;
3922 Double_t mesonPt = 0;
3923 Double_t mesonMass = 0;
3925 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3926 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
3927 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
3928 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
3930 else if(InputEvent->IsA()==AliAODEvent::Class()){
3931 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3932 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3933 mesonPt = aodMCParticle->Pt();
3934 mesonMass = aodMCParticle->GetCalcMass();
3935 PDGCode = aodMCParticle->GetPdgCode();
3938 Float_t functionResultMC = 1.;
3939 if (kCaseGen == 1){ // Pythia 6
3940 Float_t dNdyMC = 2.1462;
3941 Float_t nMC = 7.06055;
3942 Float_t tMC = 0.12533;
3943 if ( PDGCode == 111){
3947 } else if ( PDGCode == 221){
3952 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);
3953 } else if (kCaseGen == 2){ // Phojet
3954 Float_t dNdyMC = 2.35978;
3955 Float_t nMC = 6.81795;
3956 Float_t tMC = 0.11492;
3957 if ( PDGCode == 111){
3961 } else if ( PDGCode == 221){
3966 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);
3967 } else if (kCaseGen == 4){ // BOX generators pp
3968 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
3969 Float_t a = 0.23437;
3971 Float_t c = -1430.5863;
3972 Float_t d = -0.6966624;
3973 Float_t e = 252.3742;
3974 if ( PDGCode == 111){
3980 } else if ( PDGCode == 221){
3987 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
3988 // cout << functionResultMC << endl;
3989 } else if (kCaseGen == 3 ){ // HIJING
3990 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
3991 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
3993 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
3994 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
3996 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
3997 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4001 Float_t functionResultData = 1;
4002 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4003 Float_t dNdyData = 2.2328;
4004 Float_t nData = 7.1473;
4005 Float_t tData = 0.1346;
4006 if ( PDGCode == 111){
4010 } else if ( PDGCode == 221){
4011 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4015 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);
4016 // cout << functionResultData << endl;
4018 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4019 functionResultData = fFitDataPi0->Eval(mesonPt);
4021 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4022 functionResultData = fFitDataEta->Eval(mesonPt);
4024 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4025 functionResultData = fFitDataK0s->Eval(mesonPt);
4030 Double_t weight = 1;
4031 if (PDGCode == 111 || PDGCode == 221){
4032 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4033 weight = functionResultData/functionResultMC;
4034 if ( kCaseGen == 3){
4035 if (PDGCode == 111){
4036 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4040 if (PDGCode == 221){
4041 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4046 if (!isfinite(functionResultData)) weight = 1.;
4047 if (!isfinite(weight)) weight = 1.;
4049 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4050 weight = functionResultMC;
4053 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4054 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4058 ///________________________________________________________________________
4059 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4060 //Create and return standard 2010 PbPb cuts
4061 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4062 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4063 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4067 ///________________________________________________________________________
4068 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4069 //Create and return standard 2010 PbPb cuts
4070 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4071 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4072 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4075 ///________________________________________________________________________
4076 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4078 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4079 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4080 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4081 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4082 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4083 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4084 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4085 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4086 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4087 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4088 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4089 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4090 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4091 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4092 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4093 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4094 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4095 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4096 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4097 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4098 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4099 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4100 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4101 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4102 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4103 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4104 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4105 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4106 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4107 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4109 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4110 SetEtaShift(-0.465);
4112 else if(periodName.CompareTo("LHC13f") == 0 ||
4113 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4114 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4115 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4117 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4118 SetEtaShift(+0.465);
4120 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4123 ///________________________________________________________________________
4124 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4126 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4127 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4128 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4129 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4130 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4132 if(!fInPlaneOutOfPlane){
4133 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4136 else if(fInPlaneOutOfPlane == 1){
4137 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4138 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4143 else if(fInPlaneOutOfPlane == 2){
4144 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4145 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);