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 fDoPhotonQualitySelectionCut(kFALSE),
169 fPhotonQualityCut(0),
170 fOfflineTriggerMask(0),
174 fElectronArraySize(500),
175 fElectronLabelArray(NULL),
176 fDCAZPrimVtxCut(1000),
177 fDCARPrimVtxCut(1000),
178 fInPlaneOutOfPlane(0),
179 fConversionPointXArray(0.0),
180 fConversionPointYArray(0.0),
181 fConversionPointZArray(0.0),
183 fNotRejectedStart(NULL),
184 fNotRejectedEnd(NULL),
185 fGeneratorNames(NULL),
190 fDoReweightHistoMCPi0(kFALSE),
191 fDoReweightHistoMCEta(kFALSE),
192 fDoReweightHistoMCK0s(kFALSE),
193 fPathTrFReweighting(""),
194 fNameHistoReweightingPi0(""),
195 fNameHistoReweightingEta(""),
196 fNameHistoReweightingK0s(""),
201 hEtaDistV0sAfterdEdxCuts(NULL),
203 hTPCdEdxbefore(NULL),
205 hTPCdEdxSigbefore(NULL),
206 hTPCdEdxSigafter(NULL),
210 hPsiPairDeltaPhiafter(NULL),
213 hInvMassbefore(NULL),
214 hArmenterosbefore(NULL),
216 hArmenterosafter(NULL),
217 hAcceptanceCuts(NULL),
221 hCentralityVsNumberOfPrimaryTracks(NULL),
223 hEventPlanePhi(NULL),
225 hTriggerClassSelected(NULL),
226 hReweightMCHistPi0(NULL),
227 hReweightMCHistEta(NULL),
228 hReweightMCHistK0s(NULL),
232 fAddedSignalPDGCode(0),
234 fTriggerSelectedManually(kFALSE),
235 fSpecialTriggerName("")
239 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
240 fCutString=new TObjString((GetCutNumber()).Data());
242 fElectronLabelArray = new Int_t[fElectronArraySize];
243 fUtils = new AliAnalysisUtils();
244 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
245 //fUtils->SetCutOnZVertexSPD(kFALSE);
250 //________________________________________________________________________
251 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
252 AliAnalysisCuts(ref),
254 fHeaderList(ref.fHeaderList),
256 fEventQuality(ref.fEventQuality),
259 fEtaCut(ref.fEtaCut),
260 fEtaCutMin(ref.fEtaCutMin),
262 fSinglePtCut(ref.fSinglePtCut),
264 fMinClsTPC(ref.fMinClsTPC),
265 fMinClsTPCToF(ref.fMinClsTPCToF),
266 fLineCutZRSlope(ref.fLineCutZRSlope),
267 fLineCutZValue(ref.fLineCutZValue),
268 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
269 fLineCutZValueMin(ref.fLineCutZValueMin),
270 fChi2CutConversion(ref.fChi2CutConversion),
271 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
272 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
273 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
274 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
275 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
276 fDoTRDPID(ref.fDoTRDPID),
277 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
278 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
279 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
280 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
281 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
282 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
283 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
284 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
285 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
286 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
287 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
288 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
289 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
290 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
291 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
292 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
293 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
294 fDoQtGammaSelection(ref.fDoQtGammaSelection),
295 fDo2DQt(ref.fDo2DQt),
297 fXVertexCut(ref.fXVertexCut),
298 fYVertexCut(ref.fYVertexCut),
299 fZVertexCut(ref.fZVertexCut),
300 fNSigmaMass(ref.fNSigmaMass),
301 fUseEtaMinCut(ref.fUseEtaMinCut),
302 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
303 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
304 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
305 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
306 fIsHeavyIon(ref.fIsHeavyIon),
307 fDetectorCentrality(ref.fDetectorCentrality),
308 fModCentralityClass(ref.fModCentralityClass),
309 fMaxVertexZ(ref.fMaxVertexZ),
310 fCentralityMin(ref.fCentralityMin),
311 fCentralityMax(ref.fCentralityMax),
312 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
313 fUseTOFpid(ref.fUseTOFpid),
314 fMultiplicityMethod(ref.fMultiplicityMethod),
315 fSpecialTrigger(ref.fSpecialTrigger),
316 fRemovePileUp(ref.fRemovePileUp),
317 fOpeningAngle(ref.fOpeningAngle),
318 fPsiPairCut(ref.fPsiPairCut),
319 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
320 fCosPAngleCut(ref.fCosPAngleCut),
321 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
322 fRejectExtraSignals(ref.fRejectExtraSignals),
323 fminV0Dist(ref.fminV0Dist),
324 fDoSharedElecCut(ref.fDoSharedElecCut),
325 fDoPhotonQualitySelectionCut(ref.fDoPhotonQualitySelectionCut),
326 fPhotonQualityCut(ref.fPhotonQualityCut),
327 fOfflineTriggerMask(ref.fOfflineTriggerMask),
328 fHasV0AND(ref.fHasV0AND),
329 fIsSDDFired(ref.fIsSDDFired),
330 fRandom(ref.fRandom),
331 fElectronArraySize(ref.fElectronArraySize),
332 fElectronLabelArray(NULL),
333 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
334 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
335 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
336 fConversionPointXArray(ref.fConversionPointXArray),
337 fConversionPointYArray(ref.fConversionPointYArray),
338 fConversionPointZArray(ref.fConversionPointZArray),
339 fnHeaders(ref.fnHeaders),
340 fNotRejectedStart(NULL),
341 fNotRejectedEnd(NULL),
342 fGeneratorNames(ref.fGeneratorNames),
345 fEtaShift(ref.fEtaShift),
346 fDoEtaShift(ref.fDoEtaShift),
347 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
348 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
349 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
350 fPathTrFReweighting(ref.fPathTrFReweighting),
351 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
352 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
353 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
354 fNameFitDataPi0(ref.fNameFitDataPi0),
355 fNameFitDataEta(ref.fNameFitDataEta),
356 fNameFitDataK0s(ref.fNameFitDataK0s),
358 hEtaDistV0sAfterdEdxCuts(NULL),
360 hTPCdEdxbefore(NULL),
362 hTPCdEdxSigbefore(NULL),
363 hTPCdEdxSigafter(NULL),
367 hPsiPairDeltaPhiafter(NULL),
370 hInvMassbefore(NULL),
371 hArmenterosbefore(NULL),
373 hArmenterosafter(NULL),
374 hAcceptanceCuts(NULL),
378 hCentralityVsNumberOfPrimaryTracks(NULL),
380 hEventPlanePhi(NULL),
382 hTriggerClassSelected(NULL),
383 hReweightMCHistPi0(ref.hReweightMCHistPi0),
384 hReweightMCHistEta(ref.hReweightMCHistEta),
385 hReweightMCHistK0s(ref.hReweightMCHistK0s),
386 fFitDataPi0(ref.fFitDataPi0),
387 fFitDataEta(ref.fFitDataEta),
388 fFitDataK0s(ref.fFitDataK0s),
389 fAddedSignalPDGCode(ref.fAddedSignalPDGCode),
390 fPreSelCut(ref.fPreSelCut),
391 fTriggerSelectedManually(ref.fTriggerSelectedManually),
392 fSpecialTriggerName(ref.fSpecialTriggerName)
395 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
396 fCutString=new TObjString((GetCutNumber()).Data());
397 fElectronLabelArray = new Int_t[fElectronArraySize];
398 fUtils = new AliAnalysisUtils();
399 // dont copy histograms (if you like histograms, call InitCutHistograms())
404 //________________________________________________________________________
405 AliConversionCuts::~AliConversionCuts() {
407 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
409 // delete fHistograms;
410 // fHistograms = NULL;
411 if(fCutString != NULL){
415 if(fElectronLabelArray){
416 delete fElectronLabelArray;
417 fElectronLabelArray = NULL;
419 if(fNotRejectedStart){
420 delete[] fNotRejectedStart;
421 fNotRejectedStart = NULL;
424 delete[] fNotRejectedEnd;
425 fNotRejectedEnd = NULL;
428 delete[] fGeneratorNames;
429 fGeneratorNames = NULL;
438 //________________________________________________________________________
439 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
441 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
442 TH1::AddDirectory(kFALSE);
444 if(fHistograms != NULL){
448 if(fHistograms==NULL){
449 fHistograms=new TList();
450 fHistograms->SetOwner(kTRUE);
451 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
452 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
455 if (hReweightMCHistPi0){
456 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
457 fHistograms->Add(hReweightMCHistPi0);
459 if (hReweightMCHistEta){
460 hReweightMCHistEta->SetName("MCInputForWeightingEta");
461 fHistograms->Add(hReweightMCHistEta);
463 if (hReweightMCHistK0s){
464 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
465 fHistograms->Add(hReweightMCHistK0s);
468 // fFitDataPi0->SetName("DataFitForWeightingPi0");
469 // fHistograms->Add(fFitDataPi0);
472 // fFitDataEta->SetName("DataFitForWeightingEta");
473 // fHistograms->Add(fFitDataEta);
476 // fFitDataK0s->SetName("DataFitForWeightingK0s");
477 // fHistograms->Add(fFitDataK0s);
480 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
481 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
482 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
483 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
484 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
485 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
486 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
487 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
488 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
489 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
490 fHistograms->Add(hCutIndex);
493 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
494 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
495 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
496 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
497 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
498 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
499 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
500 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
501 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
502 fHistograms->Add(hTrackCuts);
505 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",15,-0.5,14.5);
506 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
507 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
508 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
509 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
510 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
511 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
512 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
513 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
514 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
515 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
516 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
517 hPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality");
518 hPhotonCuts->GetXaxis()->SetBinLabel(13,"out");
519 fHistograms->Add(hPhotonCuts);
522 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
523 fHistograms->Add(hInvMassbefore);
524 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
525 fHistograms->Add(hArmenterosbefore);
526 hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
527 fHistograms->Add(hEtaDistV0s);
530 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
531 fHistograms->Add(hInvMassafter);
532 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
533 fHistograms->Add(hArmenterosafter);
535 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
536 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
537 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
538 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
539 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
540 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
541 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
542 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
543 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
544 fHistograms->Add(hAcceptanceCuts);
547 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
548 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
549 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
550 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
551 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
552 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
553 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
554 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
555 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
556 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
557 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
558 fHistograms->Add(hdEdxCuts);
560 TAxis *AxisBeforedEdx = NULL;
561 TAxis *AxisBeforedEdxSig = NULL;
562 TAxis *AxisBeforeTOF = NULL;
563 TAxis *AxisBeforeTOFSig = NULL;
565 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
566 fHistograms->Add(hTPCdEdxbefore);
567 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
568 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
569 fHistograms->Add(hTPCdEdxSigbefore);
570 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
572 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
573 fHistograms->Add(hTOFbefore);
574 AxisBeforeTOF = hTOFbefore->GetXaxis();
575 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
576 fHistograms->Add(hTOFSigbefore);
577 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
580 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
581 fHistograms->Add(hTPCdEdxSigafter);
583 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
584 fHistograms->Add(hTPCdEdxafter);
586 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
587 fHistograms->Add(hTOFSigafter);
589 hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
590 fHistograms->Add(hEtaDistV0sAfterdEdxCuts);
592 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
593 fHistograms->Add(hPsiPairDeltaPhiafter);
595 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
596 Int_t bins = AxisAfter->GetNbins();
597 Double_t from = AxisAfter->GetXmin();
598 Double_t to = AxisAfter->GetXmax();
599 Double_t *newBins = new Double_t[bins+1];
601 Double_t factor = TMath::Power(to/from, 1./bins);
602 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
603 AxisAfter->Set(bins, newBins);
604 AxisAfter = hTOFSigafter->GetXaxis();
605 AxisAfter->Set(bins, newBins);
606 AxisAfter = hTPCdEdxafter->GetXaxis();
607 AxisAfter->Set(bins, newBins);
609 AxisBeforedEdx->Set(bins, newBins);
610 AxisBeforeTOF->Set(bins, newBins);
611 AxisBeforedEdxSig->Set(bins, newBins);
612 AxisBeforeTOFSig->Set(bins, newBins);
616 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
617 fHistograms->Add(hCentrality);
618 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
619 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
621 // Event Cuts and Info
623 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
624 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
625 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
626 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
627 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
628 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
629 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
630 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
631 fHistograms->Add(hV0EventCuts);
633 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
634 fHistograms->Add(hVertexZ);
636 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
637 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
638 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
639 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
640 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
641 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
642 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
643 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
644 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
645 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
646 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
647 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
648 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
649 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
650 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
651 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
652 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
653 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
654 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
655 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
656 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
657 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
658 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
659 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
660 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
661 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
662 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
663 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
664 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
665 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
666 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
667 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
668 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
669 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
670 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
671 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
672 fHistograms->Add(hTriggerClass);
675 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
676 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
677 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
678 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
679 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
680 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
681 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
682 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
683 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
693 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
694 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
695 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
696 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
697 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
698 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
699 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
700 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
701 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
702 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
703 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
704 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
705 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
706 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
707 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
708 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
709 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
710 fHistograms->Add(hTriggerClassSelected);
712 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
713 fHistograms->Add(hEventPlanePhi);
717 TH1::AddDirectory(kTRUE);
720 //________________________________________________________________________
721 Bool_t AliConversionCuts::InitPIDResponse(){
722 // Set Pointer to AliPIDResponse
724 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
726 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
727 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
728 if(fPIDResponse)return kTRUE;
735 ///________________________________________________________________________
736 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
737 // Process Event Selection
740 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
743 // Check for MC event
744 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
745 // Check if MC event is correctly loaded
746 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
751 if (!mcHandler->InitOk() ){
755 if (!mcHandler->TreeK() ){
759 if (!mcHandler->TreeTR() ) {
766 // cout << "before event trigger" << endl;
767 if(!IsTriggerSelected(fInputEvent)){
768 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
774 if(fInputEvent->IsA()==AliESDEvent::Class()){
775 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
776 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
777 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
779 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
782 // Number of Contributors Cut
783 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
784 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
790 // Z Vertex Position Cut
791 if(!VertexZCut(fInputEvent)){
792 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
801 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
802 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
809 // Centrality Selection
810 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
811 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
817 // Fill Event Histograms
818 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
819 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
820 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
821 if(hCentralityVsNumberOfPrimaryTracks)
822 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
823 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
824 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
829 ///________________________________________________________________________
830 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
831 // MonteCarlo Photon Selection
833 if(!fMCStack)return kFALSE;
835 if (particle->GetPdgCode() == 22){
838 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
841 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
845 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
846 return kFALSE; // no photon as mothers!
849 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
850 return kFALSE; // the gamma has a mother, and it is not a primary particle
853 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
855 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
856 TParticle* ePos = NULL;
857 TParticle* eNeg = NULL;
859 if(particle->GetNDaughters() >= 2){
860 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
861 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
862 if(tmpDaughter->GetUniqueID() == 5){
863 if(tmpDaughter->GetPdgCode() == 11){
865 } else if(tmpDaughter->GetPdgCode() == -11){
872 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
876 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
877 return kFALSE; // no reconstruction below the Pt cut
880 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
881 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
884 if(fEtaCutMin > -0.1){
885 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
886 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
891 return kFALSE; // cuts on distance from collision point
894 if(abs(ePos->Vz()) > fMaxZ){
895 return kFALSE; // outside material
897 if(abs(eNeg->Vz()) > fMaxZ){
898 return kFALSE; // outside material
901 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
902 return kFALSE; // line cut to exclude regions where we do not reconstruct
903 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
907 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
908 return kFALSE; // line cut to exclude regions where we do not reconstruct
909 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
914 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
918 ///________________________________________________________________________
919 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
920 // MonteCarlo Photon Selection
922 if(!aodmcArray)return kFALSE;
924 if (particle->GetPdgCode() == 22){
925 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
928 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
932 if(particle->GetMother() > -1){
933 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
934 return kFALSE; // no photon as mothers!
936 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
937 return kFALSE; // the gamma has a mother, and it is not a primary particle
941 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
943 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
944 AliAODMCParticle* ePos = NULL;
945 AliAODMCParticle* eNeg = NULL;
947 if(particle->GetNDaughters() >= 2){
948 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
949 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
950 if(!tmpDaughter) continue;
951 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
952 if(tmpDaughter->GetPdgCode() == 11){
954 } else if(tmpDaughter->GetPdgCode() == -11){
961 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
965 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
966 return kFALSE; // no reconstruction below the Pt cut
969 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
970 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
973 if(fEtaCutMin > -0.1){
974 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
975 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
979 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
980 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
983 return kFALSE; // cuts on distance from collision point
985 if(abs(ePos->Zv()) > fMaxZ){
986 return kFALSE; // outside material
988 if(abs(eNeg->Zv()) > fMaxZ){
989 return kFALSE; // outside material
992 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
993 return kFALSE; // line cut to exclude regions where we do not reconstruct
994 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
998 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
999 return kFALSE; // line cut to exclude regions where we do not reconstruct
1000 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1005 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1009 ///________________________________________________________________________
1010 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1011 { // Specific Photon Cuts
1014 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1017 // Fill Histos before Cuts
1018 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1019 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1021 // Gamma selection based on QT from Armenteros
1022 if(fDoQtGammaSelection == kTRUE){
1023 if(!ArmenterosQtCut(photon)){
1024 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1031 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1033 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1039 // Reconstruction Acceptance Cuts
1040 if(!AcceptanceCuts(photon)){
1041 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1047 if(fDoPhotonAsymmetryCut == kTRUE){
1048 if(!AsymmetryCut(photon,event)){
1049 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1054 //Check the pid probability
1056 if(!PIDProbabilityCut(photon, event)) {
1057 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1062 if(!CorrectedTPCClusterCut(photon, event)) {
1063 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1067 Double_t magField = event->GetMagneticField();
1068 if( magField < 0.0 ){
1074 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1075 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1076 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1079 if(!PsiPairCut(photon)) {
1080 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1085 if(!CosinePAngleCut(photon, event)) {
1086 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1090 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1092 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1095 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1096 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1101 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1102 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1112 UChar_t photonQuality = 0;
1113 AliAODEvent * aodEvent = dynamic_cast<AliAODEvent*>(event);
1115 photonQuality = DeterminePhotonQualityAOD(photonAOD, event);
1117 photonQuality = photonAOD->GetPhotonQuality();
1119 if (fDoPhotonQualitySelectionCut && photonQuality != fPhotonQualityCut){
1120 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1125 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1127 // Histos after Cuts
1128 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1129 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1130 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1135 ///________________________________________________________________________
1136 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1137 { //Cut on corrected TPC Cluster Info
1139 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1140 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1142 if(!negTrack||!posTrack)return kFALSE;
1144 Double_t negclsToF=0;
1146 if (!fUseCorrectedTPCClsInfo ){
1147 if(negTrack->GetTPCNclsF()!=0){
1148 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1151 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1154 Double_t posclsToF = 0.;
1155 if (!fUseCorrectedTPCClsInfo ){
1156 if(posTrack->GetTPCNclsF()!=0){
1157 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1160 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1163 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1170 ///________________________________________________________________________
1171 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1173 //Selection of Reconstructed Photons
1175 FillPhotonCutIndex(kPhotonIn);
1177 if(event->IsA()==AliESDEvent::Class()) {
1178 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1179 FillPhotonCutIndex(kOnFly);
1183 // else if(event->IsA()==AliAODEvent::Class()) {
1184 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1185 // FillPhotonCutIndex(kOnFly);
1191 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1192 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1194 if(!negTrack || !posTrack) {
1195 FillPhotonCutIndex(kNoTracks);
1198 photon->DeterminePhotonQuality(negTrack,posTrack);
1200 if(!TracksAreSelected(negTrack, posTrack)){
1201 FillPhotonCutIndex(kTrackCuts);
1204 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1206 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1207 FillPhotonCutIndex(kdEdxCuts);
1210 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1212 if(!PhotonCuts(photon,event)){
1213 FillPhotonCutIndex(kPhotonCuts);
1217 // Photon passed cuts
1218 FillPhotonCutIndex(kPhotonOut);
1222 ///________________________________________________________________________
1223 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1224 { // Armenteros Qt Cut
1226 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1230 if(photon->GetArmenterosQt()>fQtMax){
1238 ///________________________________________________________________________
1239 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1240 // Exclude certain areas for photon reconstruction
1243 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1246 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1247 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1252 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1253 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1258 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1259 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1262 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1263 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1268 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1269 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1275 if( photon->GetPhotonEta() > (fEtaCut + fEtaShift) || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1276 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1279 if(fEtaCutMin>-0.1){
1280 if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1281 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1287 if(photon->GetPhotonPt()<fPtCut){
1288 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1293 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1299 ///________________________________________________________________________
1300 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * 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 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1310 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1311 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1312 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1320 ///________________________________________________________________________
1321 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1322 // Track Cuts which require AOD/ESD specific implementation
1324 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1325 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1330 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1331 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1339 ///________________________________________________________________________
1340 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1341 // Track Selection for Photon Reconstruction
1344 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1348 if(negTrack->Charge() == posTrack->Charge()) {
1349 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1354 // Number of TPC Clusters
1357 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1358 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1364 if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1365 negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1366 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1369 if(fEtaCutMin>-0.1){
1370 if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1371 (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1372 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1379 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1380 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1385 // AOD ESD specific cuts
1386 Bool_t passCuts = kTRUE;
1388 if(negTrack->IsA()==AliAODTrack::Class()) {
1389 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1391 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1395 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1400 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1406 ///________________________________________________________________________
1407 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1408 // Electron Identification Cuts for Photon reconstruction
1409 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1410 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1413 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1414 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1415 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1418 if(fDodEdxSigmaCut == kTRUE){
1419 // TPC Electron Line
1420 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1421 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1423 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1429 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1430 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1431 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1432 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1434 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1441 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1442 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1443 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1444 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1446 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1454 if(fDoKaonRejectionLowP == kTRUE){
1455 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1456 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1458 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1464 if(fDoProtonRejectionLowP == kTRUE){
1465 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1466 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1468 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1475 if(fDoPionRejectionLowP == kTRUE){
1476 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1477 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1479 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1487 // cout<<"Start"<<endl;
1488 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1490 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1491 // {cout<<"TOF DA"<<endl;}
1492 // if(status == AliPIDResponse::kDetPidOk){
1493 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1494 // cout<<"--> "<<probMis<<endl;
1495 // if(probMis > 0.01){
1500 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1502 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1503 Double_t times[AliPID::kSPECIESC];
1504 fCurrentTrack->GetIntegratedTimes(times);
1505 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1506 Double_t dT = TOFsignal - t0 - times[0];
1507 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1509 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1511 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1512 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1513 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1517 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1522 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1523 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1529 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1530 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1531 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1536 ///________________________________________________________________________
1537 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1538 // Cut on Energy Assymetry
1540 for(Int_t ii=0;ii<2;ii++){
1542 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1544 if( track->P() > fMinPPhotonAsymmetryCut ){
1545 Double_t trackNegAsy=0;
1546 if (photon->GetPhotonP()!=0.){
1547 trackNegAsy= track->P()/photon->GetPhotonP();
1550 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1559 ///________________________________________________________________________
1560 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1561 //Returns pointer to the track with given ESD label
1562 //(Important for AOD implementation, since Track array in AOD data is different
1563 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1565 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1567 if(label > event->GetNumberOfTracks() ) return NULL;
1568 AliESDtrack * track = esdEvent->GetTrack(label);
1572 AliVTrack * track = 0x0;
1573 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1574 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1578 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1579 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1581 if(track->GetID() == label) {
1588 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1592 ///________________________________________________________________________
1593 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1594 //Returns pointer to the track with given ESD label
1595 //(Important for AOD implementation, since Track array in AOD data is different
1596 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1599 if(label > event->GetNumberOfTracks() ) return NULL;
1600 AliESDtrack * track = event->GetTrack(label);
1603 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1609 ///________________________________________________________________________
1610 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1611 // Cut on Electron Probability for Photon Reconstruction
1613 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1617 Bool_t iResult=kFALSE;
1619 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1620 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1622 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1623 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1625 if(negProbArray && posProbArray){
1627 negTrack->GetTPCpid(negProbArray);
1628 posTrack->GetTPCpid(posProbArray);
1630 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1635 delete [] posProbArray;
1636 delete [] negProbArray;
1640 ///Not possible for AODs
1650 ///________________________________________________________________________
1651 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1652 // MC Acceptance Cuts
1653 //(Certain areas were excluded for photon reconstruction)
1655 if(particle->R()>fMaxR){
1658 if(ePos->R()>fMaxR){
1662 if(ePos->R()<fMinR){
1666 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1669 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1673 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1677 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1681 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1686 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1689 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1692 if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1695 if(fEtaCutMin>-0.1){
1696 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1699 if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1702 if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1707 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1711 if(particle->Pt()<fPtCut){
1717 ///________________________________________________________________________
1718 Bool_t AliConversionCuts::UpdateCutString() {
1719 ///Update the cut string (if it has been created yet)
1721 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1722 fCutString->SetString(GetCutNumber());
1728 ///________________________________________________________________________
1729 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1731 AliInfo("Entering loading of histograms for weighting");
1732 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1734 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1737 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1738 cout << "I have to find: " << fNameHistoReweightingPi0.Data() << endl;
1739 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1740 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1741 hReweightMCHistPi0->SetDirectory(0);
1742 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1743 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1745 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1746 cout << "I have to find: " << fNameFitDataPi0.Data() << endl;
1747 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1748 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1749 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1750 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1753 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1754 cout << "I have to find: " << fNameHistoReweightingEta.Data() << endl;
1755 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1756 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1757 hReweightMCHistEta->SetDirectory(0);
1758 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1759 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1762 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1763 cout << "I have to find: " << fNameFitDataEta.Data() << endl;
1764 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1765 fFitDataEta = new TF1(*fFitDataEtatemp);
1766 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1767 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1770 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1771 cout << "I have to find: " << fNameHistoReweightingK0s.Data() << endl;
1772 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1773 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1774 hReweightMCHistK0s->SetDirectory(0);
1775 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1776 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1779 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1780 cout << "I have to find: " << fNameFitDataK0s.Data() << endl;
1781 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1782 fFitDataK0s = new TF1(*fFitDataK0stemp);
1783 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1784 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1792 ///________________________________________________________________________
1793 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1794 // Initialize Cuts from a given Cut string
1795 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1796 AliInfo("Weighting was enabled");
1797 LoadReweightingHistosMCFromFile();
1800 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1801 if(analysisCutSelection.Length()!=kNCuts) {
1802 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1805 if(!analysisCutSelection.IsDigit()){
1806 AliError("Cut selection contains characters");
1810 const char *cutSelection = analysisCutSelection.Data();
1811 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1812 for(Int_t ii=0;ii<kNCuts;ii++){
1816 // Set Individual Cuts
1817 for(Int_t ii=0;ii<kNCuts;ii++){
1818 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1821 PrintCutsWithValues();
1825 ///________________________________________________________________________
1826 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1827 ///Set individual cut ID
1832 if( SetV0Finder(value)) {
1833 fCuts[kv0FinderType] = value;
1836 } else return kFALSE;
1838 case kededxSigmaCut:
1839 if( SetTPCdEdxCutElectronLine(value)) {
1840 fCuts[kededxSigmaCut] = value;
1843 } else return kFALSE;
1845 case kpidedxSigmaCut:
1846 if( SetTPCdEdxCutPionLine(value)) {
1847 fCuts[kpidedxSigmaCut] = value;
1850 } else return kFALSE;
1852 case kpiMomdedxSigmaCut:
1853 if( SetMinMomPiondEdxCut(value)) {
1854 fCuts[kpiMomdedxSigmaCut] = value;
1857 } else return kFALSE;
1860 if( SetChi2GammaCut(value)) {
1861 fCuts[kchi2GammaCut] = value;
1864 } else return kFALSE;
1867 if( SetSinglePtCut(value)) {
1868 fCuts[ksinglePtCut] = value;
1871 } else return kFALSE;
1874 if( SetTPCClusterCut(value)) {
1875 fCuts[kclsTPCCut] = value;
1878 } else return kFALSE;
1881 if( SetEtaCut(value)) {
1882 fCuts[ketaCut] = value;
1885 } else return kFALSE;
1887 case kLowPRejectionSigmaCut:
1888 if( SetLowPRejectionCuts(value)) {
1889 fCuts[kLowPRejectionSigmaCut] = value;
1892 } else return kFALSE;
1895 if( SetQtMaxCut(value)) {
1896 fCuts[kQtMaxCut] = value;
1899 } else return kFALSE;
1901 case kpiMaxMomdedxSigmaCut:
1902 if( SetMaxMomPiondEdxCut(value)) {
1903 fCuts[kpiMaxMomdedxSigmaCut] = value;
1906 } else return kFALSE;
1909 if( SetRCut(value)) {
1910 fCuts[kRCut] = value;
1913 } else return kFALSE;
1916 if( SetRemovePileUp(value)) {
1917 fCuts[kremovePileUp] = value;
1920 } else return kFALSE;
1923 if( SetSelectSpecialTrigger(value)) {
1924 fCuts[kselectV0AND] = value;
1927 } else return kFALSE;
1929 case kmultiplicityMethod:
1930 if( SetMultiplicityMethod(value)) {
1931 fCuts[kmultiplicityMethod] = value;
1934 } else return kFALSE;
1937 if( SetIsHeavyIon(value)) {
1938 fCuts[kisHeavyIon] = value;
1941 } else return kFALSE;
1943 case kCentralityMin:
1944 if( SetCentralityMin(value)) {
1945 fCuts[kCentralityMin] = value;
1948 } else return kFALSE;
1950 case kCentralityMax:
1951 if( SetCentralityMax(value)) {
1952 fCuts[kCentralityMax] = value;
1955 } else return kFALSE;
1957 case kTOFelectronPID:
1958 if( SetTOFElectronPIDCut(value)) {
1959 fCuts[kTOFelectronPID] = value;
1962 } else return kFALSE;
1964 case kdoPhotonAsymmetryCut:
1965 if( SetPhotonAsymmetryCut(value)) {
1966 fCuts[kdoPhotonAsymmetryCut] = value;
1969 } else return kFALSE;
1972 if( SetPsiPairCut(value)) {
1973 fCuts[kPsiPair] = value;
1976 } else return kFALSE;
1979 if( SetCosPAngleCut(value)) {
1980 fCuts[kCosPAngle] = value;
1983 } else return kFALSE;
1987 if( SetSharedElectronCut(value)) {
1988 fCuts[kElecShare] = value;
1991 } else return kFALSE;
1994 if( SetToCloseV0sCut(value)) {
1995 fCuts[kToCloseV0s] = value;
1998 } else return kFALSE;
2001 if( SetRejectExtraSignalsCut(value)) {
2002 fCuts[kExtraSignals] = value;
2005 } else return kFALSE;
2008 if( SetDCARPhotonPrimVtxCut(value)) {
2009 fCuts[kDcaRPrimVtx] = value;
2012 } else return kFALSE;
2015 if( SetDCAZPhotonPrimVtxCut(value)) {
2016 fCuts[kDcaZPrimVtx] = value;
2019 } else return kFALSE;
2021 case kInPlaneOutOfPlane:
2022 if( SetInPlaneOutOfPlane(value)) {
2023 fCuts[kInPlaneOutOfPlane] = value;
2026 } else return kFALSE;
2032 AliError("Cut id out of range");
2036 AliError("Cut id %d not recognized");
2041 ///________________________________________________________________________
2042 void AliConversionCuts::PrintCuts() {
2043 // Print out current Cut Selection
2044 for(Int_t ic = 0; ic < kNCuts; ic++) {
2045 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2049 void AliConversionCuts::PrintCutsWithValues() {
2050 // Print out current Cut Selection with value
2051 if (fIsHeavyIon == 0) {
2052 printf("Running in pp mode \n");
2053 if (fSpecialTrigger == 0){
2054 printf("\t only events triggered by V0OR will be analysed \n");
2055 } else if (fSpecialTrigger == 1){
2056 printf("\t only events triggered by V0AND will be analysed \n");
2057 } else if (fSpecialTrigger == 2){
2058 printf("\t only events where SDD was present will be analysed \n");
2059 } else if (fSpecialTrigger == 3){
2060 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2061 } else if (fSpecialTrigger > 3){
2062 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2064 } else if (fIsHeavyIon == 1){
2065 printf("Running in PbPb mode \n");
2066 if (fDetectorCentrality == 0){
2067 printf("\t centrality selection based on V0M \n");
2068 } else if (fDetectorCentrality == 1){
2069 printf("\t centrality selection based on Cl1 \n");
2071 if (fModCentralityClass == 0){
2072 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2073 } else if ( fModCentralityClass == 1){
2074 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2075 } else if ( fModCentralityClass == 2){
2076 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2077 } else if (fModCentralityClass == 3){
2078 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2079 } else if ( fModCentralityClass == 4){
2080 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2081 } else if ( fModCentralityClass == 5){
2082 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2084 if (fSpecialTrigger == 0){
2085 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2086 } else if (fSpecialTrigger > 4){
2087 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2089 } else if (fIsHeavyIon == 2){
2090 printf("Running in pPb mode \n");
2091 if (fDetectorCentrality == 0){
2092 printf("\t centrality selection based on V0A \n");
2093 } else if (fDetectorCentrality == 1){
2094 printf("\t centrality selection based on Cl1 \n");
2096 if (fModCentralityClass == 0){
2097 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2099 if (fSpecialTrigger == 0){
2100 printf("\t only events triggered by kINT7 will be analysed \n");
2101 } else if (fSpecialTrigger > 4){
2102 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2105 printf("Electron cuts: \n");
2106 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut );
2107 else printf("\t eta_{e} < %3.2f\n", fEtaCut );
2108 printf("\t p_{T,e} > %3.2f\n", fSinglePtCut );
2109 printf("\t %3.2f < n sigma e < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine );
2111 printf("Photon cuts: \n");
2112 printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR );
2113 printf("\t Z_{conv} < %3.2f\n", fMaxZ );
2114 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut );
2115 else printf("\t eta_{conv} < %3.2f\n", fEtaCut );
2116 printf("\t p_{T,gamma} > %3.2f\n", fPtCut );
2118 printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2120 printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2122 if (fDo2DPsiPairChi2){
2123 printf("\t 2 dimensional triangle chi^{2} and psi_{pair} cut applied with maximum of chi^{2} = %3.2f and |psi_{pair}| = %3.2f \n", fChi2CutConversion, fPsiPairCut );
2125 printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion );
2126 printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut );
2128 printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut );
2129 printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut );
2130 printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut );
2131 if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut );
2134 ///________________________________________________________________________
2135 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2143 fDetectorCentrality=0;
2147 fDetectorCentrality=1;
2149 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2151 fDetectorCentrality=0;
2152 fModCentralityClass=1;
2154 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2156 fDetectorCentrality=0;
2157 fModCentralityClass=2;
2159 case 5: //strict cut on v0 tracks for MC
2161 fDetectorCentrality=0;
2162 fModCentralityClass=3;
2164 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2165 //strict cut on v0 tracks for MC
2167 fDetectorCentrality=0;
2168 fModCentralityClass=4;
2170 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2171 //strict cut on v0 tracks for MC
2173 fDetectorCentrality=0;
2174 fModCentralityClass=5;
2178 fDetectorCentrality=0;
2182 fDetectorCentrality=1;
2185 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2191 //___________________________________________________________________
2192 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2195 if(minCentrality<0||minCentrality>9){
2196 AliError(Form("minCentrality not defined %d",minCentrality));
2200 fCentralityMin=minCentrality;
2203 //___________________________________________________________________
2204 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2207 if(maxCentrality<0||maxCentrality>9){
2208 AliError(Form("maxCentrality not defined %d",maxCentrality));
2211 fCentralityMax=maxCentrality;
2214 ///________________________________________________________________________
2215 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2218 switch(selectSpecialTrigger){
2220 fSpecialTrigger=0; // dont care
2223 fSpecialTrigger=1; // V0AND
2226 fSpecialTrigger=2; // with SDD requested
2229 fSpecialTrigger=3; // V0AND plus with SDD requested
2231 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2233 fSpecialTrigger=4; // different trigger class as MB
2234 fTriggerSelectedManually = kTRUE;
2237 fSpecialTrigger=4; // different trigger class as MB
2238 fTriggerSelectedManually = kTRUE;
2241 fSpecialTrigger=4; // different trigger class as MB
2242 fTriggerSelectedManually = kTRUE;
2245 fSpecialTrigger=4; // different trigger class as MB
2246 fTriggerSelectedManually = kTRUE;
2249 fSpecialTrigger=4; // different trigger class as MB
2250 fTriggerSelectedManually = kTRUE;
2253 fSpecialTrigger=4; // different trigger class as MB
2254 fTriggerSelectedManually = kTRUE;
2257 AliError("Warning: Special Trigger Not known");
2262 ///________________________________________________________________________
2263 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2266 fMultiplicityMethod=multiplicityMethod;
2268 // 0 Photon Multiplicity
2269 // 1 TPC Track multiplicity
2275 ///________________________________________________________________________
2276 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2278 switch(removePileUp){
2280 fRemovePileUp=kFALSE;
2283 fRemovePileUp=kTRUE;
2286 AliError("RemovePileUpCut not defined");
2291 ///________________________________________________________________________
2292 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2294 switch(extraSignal){
2296 fRejectExtraSignals = 0;
2297 break; // No Rejection
2299 fRejectExtraSignals = 1;
2300 break; // MinBias Header
2302 fRejectExtraSignals = 2;
2303 break; // User String Array
2305 fRejectExtraSignals = 3;
2306 break; // Rejection for Gamma Correction only
2308 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2313 ///________________________________________________________________________
2314 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2316 switch (v0FinderType){
2317 case 0: // on fly V0 finder
2318 cout << "have chosen onfly V0" << endl;
2319 fUseOnFlyV0Finder=kTRUE;
2321 case 1: // offline V0 finder
2322 cout << "have chosen offline V0" << endl;
2323 fUseOnFlyV0Finder=kFALSE;
2326 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2331 ///________________________________________________________________________
2332 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2335 //Set Standard LineCutZValues
2336 fLineCutZValueMin = -2;
2337 fLineCutZValue = 7.;
2342 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2344 fLineCutZRSlopeMin = 0.;
2346 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2348 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2350 fLineCutZRSlopeMin = 0.;
2354 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2356 fLineCutZRSlopeMin = 0.;
2360 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2362 fLineCutZRSlopeMin = 0.;
2366 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2368 fLineCutZRSlopeMin = 0.;
2372 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2374 fLineCutZRSlopeMin = 0.;
2378 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2380 fLineCutZRSlopeMin = 0.;
2383 if (fIsHeavyIon==1){
2385 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2387 fLineCutZRSlopeMin = 0.;
2391 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2393 fLineCutZRSlopeMin = 0.;
2396 // case 8: // 0.1 - 0.8
2398 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2399 // fEtaCutMin = 0.1;
2400 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2404 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2406 fLineCutZRSlopeMin = 0.;
2410 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2412 fLineCutZRSlopeMin = 0.;
2415 AliError(Form(" EtaCut not defined %d",etaCut));
2420 ///________________________________________________________________________
2421 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2454 fMinR = 35.; //old 26.
2466 AliError("RCut not defined");
2471 ///________________________________________________________________________
2472 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2474 switch(singlePtCut){
2475 case 0: // 0.050 GeV
2476 fSinglePtCut = 0.050;
2478 case 1: // 0.100 GeV
2479 fSinglePtCut = 0.100;
2481 case 2: // 0.150 GeV
2482 fSinglePtCut = 0.150;
2484 case 3: // 0.200 GeV
2485 fSinglePtCut = 0.200;
2487 case 4: // 0.075 GeV
2488 fSinglePtCut = 0.075;
2490 case 5: // 0.125 GeV
2491 fSinglePtCut = 0.125;
2494 fSinglePtCut = 0.040;
2500 AliError(Form("singlePtCut not defined %d",singlePtCut));
2505 ///________________________________________________________________________
2506 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2521 case 4: // 95% of findable clusters
2522 fMinClsTPCToF= 0.95;
2523 fUseCorrectedTPCClsInfo=1;
2525 case 5: // 0% of findable clusters
2527 fUseCorrectedTPCClsInfo=1;
2529 case 6: // 70% of findable clusters
2531 fUseCorrectedTPCClsInfo=1;
2533 case 7: // 0% of findable clusters
2534 fMinClsTPCToF= 0.35;
2535 fUseCorrectedTPCClsInfo=0;
2538 fMinClsTPCToF= 0.35;
2539 fUseCorrectedTPCClsInfo=1;
2543 fUseCorrectedTPCClsInfo=1;
2546 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2551 ///________________________________________________________________________
2552 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2554 switch(ededxSigmaCut){
2556 fPIDnSigmaBelowElectronLine=-10;
2557 fPIDnSigmaAboveElectronLine=10;
2560 fPIDnSigmaBelowElectronLine=-5;
2561 fPIDnSigmaAboveElectronLine=5;
2564 fPIDnSigmaBelowElectronLine=-3;
2565 fPIDnSigmaAboveElectronLine=5;
2568 fPIDnSigmaBelowElectronLine=-4;
2569 fPIDnSigmaAboveElectronLine=5;
2572 fPIDnSigmaBelowElectronLine=-6;
2573 fPIDnSigmaAboveElectronLine=7;
2576 fPIDnSigmaBelowElectronLine=-4;
2577 fPIDnSigmaAboveElectronLine=4;
2580 fPIDnSigmaBelowElectronLine=-2.5;
2581 fPIDnSigmaAboveElectronLine=4;
2584 fPIDnSigmaBelowElectronLine=-2;
2585 fPIDnSigmaAboveElectronLine=3.5;
2588 AliError("TPCdEdxCutElectronLine not defined");
2594 ///________________________________________________________________________
2595 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2598 switch(pidedxSigmaCut){
2600 fPIDnSigmaAbovePionLine=-10;
2601 fPIDnSigmaAbovePionLineHighPt=-10;
2604 fPIDnSigmaAbovePionLine=0;
2605 fPIDnSigmaAbovePionLineHighPt=-10;
2608 fPIDnSigmaAbovePionLine=1;
2609 fPIDnSigmaAbovePionLineHighPt=-10;
2612 fPIDnSigmaAbovePionLine=2.5;
2613 fPIDnSigmaAbovePionLineHighPt=-10;
2616 fPIDnSigmaAbovePionLine=0.5;
2617 fPIDnSigmaAbovePionLineHighPt=-10;
2620 fPIDnSigmaAbovePionLine=2.;
2621 fPIDnSigmaAbovePionLineHighPt=-10;
2624 fPIDnSigmaAbovePionLine=2.;
2625 fPIDnSigmaAbovePionLineHighPt=0.5;
2628 fPIDnSigmaAbovePionLine=3.5;
2629 fPIDnSigmaAbovePionLineHighPt=-10;
2632 fPIDnSigmaAbovePionLine=2.;
2633 fPIDnSigmaAbovePionLineHighPt=1.;
2636 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2637 fPIDnSigmaAbovePionLineHighPt=-10;
2640 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2645 ///________________________________________________________________________
2646 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2648 switch(piMomdedxSigmaCut){
2650 fPIDMinPnSigmaAbovePionLine=0.5;
2653 fPIDMinPnSigmaAbovePionLine=1.;
2656 fPIDMinPnSigmaAbovePionLine=1.5;
2659 fPIDMinPnSigmaAbovePionLine=20.;
2662 fPIDMinPnSigmaAbovePionLine=50.;
2665 fPIDMinPnSigmaAbovePionLine=0.3;
2668 fPIDMinPnSigmaAbovePionLine=0.25;
2671 fPIDMinPnSigmaAbovePionLine=0.4;
2674 fPIDMinPnSigmaAbovePionLine=0.2;
2677 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2682 ///________________________________________________________________________
2683 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2685 switch(piMaxMomdedxSigmaCut){
2687 fPIDMaxPnSigmaAbovePionLine=100.;
2690 fPIDMaxPnSigmaAbovePionLine=5.;
2693 fPIDMaxPnSigmaAbovePionLine=4.;
2696 fPIDMaxPnSigmaAbovePionLine=3.5;
2699 fPIDMaxPnSigmaAbovePionLine=3.;
2702 fPIDMaxPnSigmaAbovePionLine=7.;
2705 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2710 ///________________________________________________________________________
2711 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2713 switch(LowPRejectionSigmaCut){
2715 fPIDnSigmaAtLowPAroundKaonLine=0;
2716 fPIDnSigmaAtLowPAroundProtonLine=0;
2717 fPIDnSigmaAtLowPAroundPionLine=0;
2718 fDoKaonRejectionLowP = kFALSE;
2719 fDoProtonRejectionLowP = kFALSE;
2720 fDoPionRejectionLowP = kFALSE;
2721 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2724 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2725 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2726 fPIDnSigmaAtLowPAroundPionLine=0.5;
2727 fDoKaonRejectionLowP = kTRUE;
2728 fDoProtonRejectionLowP = kTRUE;
2729 fDoPionRejectionLowP = kTRUE;
2730 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2733 fPIDnSigmaAtLowPAroundKaonLine=1;
2734 fPIDnSigmaAtLowPAroundProtonLine=1;
2735 fPIDnSigmaAtLowPAroundPionLine=1;
2736 fDoKaonRejectionLowP = kTRUE;
2737 fDoProtonRejectionLowP = kTRUE;
2738 fDoPionRejectionLowP = kTRUE;
2739 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2742 fPIDnSigmaAtLowPAroundKaonLine=2.;
2743 fPIDnSigmaAtLowPAroundProtonLine=2.;
2744 fPIDnSigmaAtLowPAroundPionLine=2.;
2745 fDoKaonRejectionLowP = kTRUE;
2746 fDoProtonRejectionLowP = kTRUE;
2747 fDoPionRejectionLowP = kTRUE;
2748 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2751 fPIDnSigmaAtLowPAroundKaonLine=0.;
2752 fPIDnSigmaAtLowPAroundProtonLine=0.;
2753 fPIDnSigmaAtLowPAroundPionLine=1;
2754 fDoKaonRejectionLowP = kFALSE;
2755 fDoProtonRejectionLowP = kFALSE;
2756 fDoPionRejectionLowP = kTRUE;
2757 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2760 fPIDnSigmaAtLowPAroundKaonLine=0.;
2761 fPIDnSigmaAtLowPAroundProtonLine=0.;
2762 fPIDnSigmaAtLowPAroundPionLine=1.5;
2763 fDoKaonRejectionLowP = kFALSE;
2764 fDoProtonRejectionLowP = kFALSE;
2765 fDoPionRejectionLowP = kTRUE;
2766 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2769 fPIDnSigmaAtLowPAroundKaonLine=0.;
2770 fPIDnSigmaAtLowPAroundProtonLine=0.;
2771 fPIDnSigmaAtLowPAroundPionLine=2.;
2772 fDoKaonRejectionLowP = kFALSE;
2773 fDoProtonRejectionLowP = kFALSE;
2774 fDoPionRejectionLowP = kTRUE;
2775 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2778 fPIDnSigmaAtLowPAroundKaonLine=0.;
2779 fPIDnSigmaAtLowPAroundProtonLine=0.;
2780 fPIDnSigmaAtLowPAroundPionLine=0.5;
2781 fDoKaonRejectionLowP = kFALSE;
2782 fDoProtonRejectionLowP = kFALSE;
2783 fDoPionRejectionLowP = kTRUE;
2784 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2787 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2792 ///________________________________________________________________________
2793 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2795 switch(TOFelectronPID){
2797 fUseTOFpid = kFALSE;
2798 fTofPIDnSigmaBelowElectronLine=-100;
2799 fTofPIDnSigmaAboveElectronLine=100;
2803 fTofPIDnSigmaBelowElectronLine=-7;
2804 fTofPIDnSigmaAboveElectronLine=7;
2808 fTofPIDnSigmaBelowElectronLine=-5;
2809 fTofPIDnSigmaAboveElectronLine=5;
2813 fTofPIDnSigmaBelowElectronLine=-3;
2814 fTofPIDnSigmaAboveElectronLine=5;
2818 fTofPIDnSigmaBelowElectronLine=-2;
2819 fTofPIDnSigmaAboveElectronLine=3;
2823 fTofPIDnSigmaBelowElectronLine=-3;
2824 fTofPIDnSigmaAboveElectronLine=3;
2827 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2832 ///________________________________________________________________________
2833 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2838 fDoQtGammaSelection=kFALSE;
2878 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2883 ///________________________________________________________________________
2884 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2887 switch(chi2GammaCut){
2889 fChi2CutConversion = 100.;
2892 fChi2CutConversion = 50.;
2895 fChi2CutConversion = 30.;
2898 fChi2CutConversion = 200.;
2901 fChi2CutConversion = 500.;
2904 fChi2CutConversion = 100000.;
2907 fChi2CutConversion = 5.;
2910 fChi2CutConversion = 10.;
2913 fChi2CutConversion = 20.;
2916 fChi2CutConversion = 15.;
2919 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2924 ///________________________________________________________________________
2925 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2929 fPsiPairCut = 10000; //
2932 fPsiPairCut = 0.1; //
2935 fPsiPairCut = 0.05; // Standard
2938 fPsiPairCut = 0.035; //
2941 fPsiPairCut = 0.2; //
2944 fPsiPairCut = 0.1; //
2945 fDo2DPsiPairChi2 = kTRUE;
2948 fPsiPairCut = 0.05; //
2949 fDo2DPsiPairChi2 = kTRUE;
2952 fPsiPairCut = 0.035; //
2953 fDo2DPsiPairChi2 = kTRUE;
2956 fPsiPairCut = 0.2; //
2957 fDo2DPsiPairChi2 = kTRUE; //
2960 fPsiPairCut = 0.5; //
2963 AliError(Form("PsiPairCut not defined %d",psiCut));
2969 ///________________________________________________________________________
2970 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2972 switch(doPhotonAsymmetryCut){
2974 fDoPhotonAsymmetryCut=0;
2975 fMinPPhotonAsymmetryCut=100.;
2976 fMinPhotonAsymmetry=0.;
2979 fDoPhotonAsymmetryCut=1;
2980 fMinPPhotonAsymmetryCut=3.5;
2981 fMinPhotonAsymmetry=0.04;
2984 fDoPhotonAsymmetryCut=1;
2985 fMinPPhotonAsymmetryCut=3.5;
2986 fMinPhotonAsymmetry=0.06;
2989 fDoPhotonAsymmetryCut=1;
2990 fMinPPhotonAsymmetryCut=0.0;
2991 fMinPhotonAsymmetry=0.05;
2994 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2997 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
3000 ///________________________________________________________________________
3001 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
3011 fCosPAngleCut = 0.5;
3014 fCosPAngleCut = 0.75;
3017 fCosPAngleCut = 0.85;
3020 fCosPAngleCut = 0.88;
3023 fCosPAngleCut = 0.9;
3026 fCosPAngleCut = 0.95;
3029 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
3035 ///________________________________________________________________________
3036 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
3040 fDoSharedElecCut = kFALSE;
3041 fDoPhotonQualitySelectionCut = kFALSE;
3042 fPhotonQualityCut = 0;
3045 fDoSharedElecCut = kTRUE;
3046 fDoPhotonQualitySelectionCut = kFALSE;
3047 fPhotonQualityCut = 0;
3050 fDoSharedElecCut = kFALSE;
3051 fDoPhotonQualitySelectionCut = kTRUE;
3052 fPhotonQualityCut = 1;
3055 fDoSharedElecCut = kFALSE;
3056 fDoPhotonQualitySelectionCut = kTRUE;
3057 fPhotonQualityCut = 2;
3060 fDoSharedElecCut = kFALSE;
3061 fDoPhotonQualitySelectionCut = kTRUE;
3062 fPhotonQualityCut = 3;
3065 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3071 ///________________________________________________________________________
3072 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3076 fDoToCloseV0sCut = kFALSE;
3080 fDoToCloseV0sCut = kTRUE;
3084 fDoToCloseV0sCut = kTRUE;
3088 fDoToCloseV0sCut = kTRUE;
3092 AliError(Form("Shared Electron Cut not defined %d",toClose));
3097 ///________________________________________________________________________
3098 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3100 switch(TRDElectronCut){
3106 fPIDTRDEfficiency=0.1;
3110 fPIDTRDEfficiency=0.8;
3114 fPIDTRDEfficiency=0.9;
3117 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3124 ///________________________________________________________________________
3125 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3127 switch(DCAZPhotonPrimVtx){
3129 fDCAZPrimVtxCut = 1000;
3132 fDCAZPrimVtxCut = 10;
3135 fDCAZPrimVtxCut = 5;
3138 fDCAZPrimVtxCut = 4;
3141 fDCAZPrimVtxCut = 3;
3144 fDCAZPrimVtxCut = 2.5;
3147 fDCAZPrimVtxCut = 2;
3150 fDCAZPrimVtxCut = 1.5;
3153 fDCAZPrimVtxCut = 1;
3156 fDCAZPrimVtxCut = 0.5;
3159 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3165 ///________________________________________________________________________
3166 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3168 switch(DCARPhotonPrimVtx){
3170 fDCARPrimVtxCut = 1000;
3173 fDCARPrimVtxCut = 10;
3176 fDCARPrimVtxCut = 5;
3179 fDCARPrimVtxCut = 4;
3182 fDCARPrimVtxCut = 3;
3185 fDCARPrimVtxCut = 2.5;
3188 fDCARPrimVtxCut = 2;
3191 fDCARPrimVtxCut = 1.5;
3194 fDCARPrimVtxCut = 1;
3197 fDCARPrimVtxCut = 0.5;
3200 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3206 ///________________________________________________________________________
3207 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3211 fInPlaneOutOfPlane = 0; // No Event Plane
3214 fInPlaneOutOfPlane = 1; // In-Plane
3217 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3220 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3227 //-------------------------------------------------------------
3228 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3229 { // Get Event Centrality
3231 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3233 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3235 if(fDetectorCentrality==0){
3236 if (fIsHeavyIon==2){
3237 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3239 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3242 if(fDetectorCentrality==1){
3243 return fESDCentrality->GetCentralityPercentile("CL1");
3247 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3249 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3254 //-------------------------------------------------------------
3255 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3256 { // Centrality Selection
3257 if(!fIsHeavyIon)return kTRUE;
3259 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3260 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3262 Double_t centrality=GetCentrality(event);
3263 if(centrality<0)return kFALSE;
3265 Int_t centralityC=0;
3266 if (fModCentralityClass == 0){
3267 centralityC= Int_t(centrality/10);
3268 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3272 else if (fModCentralityClass ==1){
3273 centralityC= Int_t(centrality);
3274 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3276 } else return kFALSE;
3278 else if (fModCentralityClass ==2){
3279 centralityC= Int_t(centrality);
3280 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3285 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3286 Int_t PrimaryTracks10[10][2] =
3299 Int_t PrimaryTracks5a[10][2] =
3312 Int_t PrimaryTracks5b[10][2] =
3327 if(event->IsA()==AliESDEvent::Class()) column = 0;
3328 if(event->IsA()==AliAODEvent::Class()) column = 1;
3330 if (fModCentralityClass == 3){
3332 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3337 centralityC= Int_t(centrality/10);
3338 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3343 else if (fModCentralityClass ==4){
3345 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3350 centralityC= Int_t(centrality);
3351 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3353 } else return kFALSE;
3356 else if (fModCentralityClass ==5){
3358 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3363 centralityC= Int_t(centrality);
3364 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3372 ///________________________________________________________________________
3373 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3374 // Cut on z position of primary vertex
3375 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3376 Double_t fVertexZSPD = 0;
3377 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3379 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3381 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3383 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3386 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3388 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3389 ->GetTask("V0ReaderV1"))->GetPeriodName();
3390 if (periodName.CompareTo("LHC11h")==0){
3391 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3393 if (fIsHeavyIon == 2){
3394 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3395 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3396 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3401 ///________________________________________________________________________
3403 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3404 // returns number of contributors to the vertex
3406 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3408 if (fESDEvent->GetPrimaryVertex() != NULL){
3409 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3410 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3411 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3415 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3416 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3417 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3418 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3420 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3421 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3427 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3429 if (fAODEvent->GetPrimaryVertex() != NULL){
3430 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3431 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3434 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3435 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3436 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3438 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3443 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3447 ///________________________________________________________________________
3449 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3452 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3454 UInt_t isSelected = AliVEvent::kAny;
3455 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3456 // cout << periodName.Data() << endl;
3458 if (fInputHandler==NULL) return kFALSE;
3459 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3460 if (!fTriggerSelectedManually){
3461 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3463 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3464 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3465 else if (periodName.CompareTo("LHC11c") == 0 || periodName.CompareTo("LHC11d") == 0 || periodName.CompareTo("LHC11e") == 0 || periodName.CompareTo("LHC11f") == 0 || periodName.CompareTo("LHC11g") == 0 || periodName.CompareTo("LHC12a") == 0 || periodName.CompareTo("LHC12b") == 0 || periodName.CompareTo("LHC12c") == 0 || periodName.CompareTo("LHC12d") == 0 || periodName.CompareTo("LHC12f") == 0 || periodName.CompareTo("LHC12g") == 0 || periodName.CompareTo("LHC12h") == 0 || periodName.CompareTo("LHC12i") == 0 ||periodName.CompareTo("LHC13g") == 0 ) {
3466 fOfflineTriggerMask = AliVEvent::kINT7;
3467 // cout << "will take kINT7 as trigger mask" << endl;
3469 else fOfflineTriggerMask = AliVEvent::kMB;
3472 // Get the actual offline trigger mask for the event and AND it with the
3473 // requested mask. If no mask requested select by default the event.
3474 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3475 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3477 if (fOfflineTriggerMask)
3478 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3480 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3484 if (fIsSDDFired) hTriggerClass->Fill(33);
3485 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3486 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3487 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3488 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3489 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3490 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3491 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3492 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3493 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3494 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3495 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3496 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3497 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3498 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3499 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3500 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3501 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3502 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3503 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3504 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3505 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3506 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3507 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3508 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3509 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3510 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3511 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3512 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3513 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3514 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3515 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3516 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3517 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3518 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3519 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3520 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3521 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3522 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3523 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3524 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3525 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3528 if(hTriggerClassSelected && isSelected){
3529 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3530 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3531 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3532 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3533 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3534 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3535 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3536 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3537 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3538 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3539 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3540 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3541 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3542 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3543 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3544 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3545 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3546 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3547 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3548 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3549 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3550 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3551 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3552 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3553 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3554 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3555 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3556 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3557 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3558 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3559 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3560 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3561 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3562 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3563 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3564 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3565 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3566 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3567 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3568 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3569 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3572 if(!isSelected)return kFALSE;
3578 ///________________________________________________________________________
3579 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3580 // Get first TPC row
3581 Int_t firstTPCRow = 0;
3582 Double_t radiusI = 84.8;
3583 Double_t radiusO = 134.6;
3584 Double_t radiusOB = 198.;
3585 Double_t rSizeI = 0.75;
3586 Double_t rSizeO = 1.;
3587 Double_t rSizeOB = 1.5;
3591 if(radius <= radiusI){
3594 if(radius>radiusI && radius<=radiusO){
3595 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3597 if(radius>radiusO && radius<=radiusOB){
3598 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3601 if(radius>radiusOB){
3602 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3608 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3609 ///Check if passes cosine of pointing angle cut
3610 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3616 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3617 // calculates the pointing angle of the recalculated V0
3619 Double_t momV0[3] = {0,0,0};
3620 if(event->IsA()==AliESDEvent::Class()){
3621 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3622 if(!esdEvent) return -999;
3623 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3624 if(!v0) return -999;
3625 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3627 if(event->IsA()==AliAODEvent::Class()){
3628 momV0[0] = photon->GetPx();
3629 momV0[1] = photon->GetPy();
3630 momV0[2] = photon->GetPz();
3633 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3634 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3635 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3636 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3638 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3639 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3642 Double_t cosinePointingAngle = -999;
3643 if(momV02*PosV02 > 0.0)
3644 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3646 return cosinePointingAngle;
3649 ///________________________________________________________________________
3650 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3652 if (fDo2DPsiPairChi2){
3653 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3659 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3665 ///________________________________________________________________________
3666 TString AliConversionCuts::GetCutNumber(){
3667 // returns TString with current cut number
3669 for(Int_t ii=0;ii<kNCuts;ii++){
3670 a.Append(Form("%d",fCuts[ii]));
3675 ///________________________________________________________________________
3676 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3678 Int_t posLabel = photon->GetTrackLabelPositive();
3679 Int_t negLabel = photon->GetTrackLabelNegative();
3681 fElectronLabelArray[nV0*2] = posLabel;
3682 fElectronLabelArray[(nV0*2)+1] = negLabel;
3684 ///________________________________________________________________________
3685 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3687 Int_t posLabel = photon->GetTrackLabelPositive();
3688 Int_t negLabel = photon->GetTrackLabelNegative();
3690 for(Int_t i = 0; i<nV0s*2;i++){
3691 if(i==nV0*2) continue;
3692 if(i==(nV0*2)+1) continue;
3693 if(fElectronLabelArray[i] == posLabel){
3695 if(fElectronLabelArray[i] == negLabel){
3701 ///________________________________________________________________________
3702 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3705 Double_t posX = photon->GetConversionX();
3706 Double_t posY = photon->GetConversionY();
3707 Double_t posZ = photon->GetConversionZ();
3709 for(Int_t i = 0;i<photons->GetEntries();i++){
3710 if(nV0 == i) continue;
3711 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3712 Double_t posCompX = photonComp->GetConversionX();
3713 Double_t posCompY = photonComp->GetConversionY();
3714 Double_t posCompZ = photonComp->GetConversionZ();
3716 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3718 if(dist < fminV0Dist*fminV0Dist){
3719 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3727 ///________________________________________________________________________
3728 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3730 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3733 if(fNotRejectedStart){
3734 delete[] fNotRejectedStart;
3735 fNotRejectedStart = NULL;
3737 if(fNotRejectedEnd){
3738 delete[] fNotRejectedEnd;
3739 fNotRejectedEnd = NULL;
3741 if(fGeneratorNames){
3742 delete[] fGeneratorNames;
3743 fGeneratorNames = NULL;
3746 if(rejection == 0) return; // No Rejection
3748 AliGenCocktailEventHeader *cHeader = 0x0;
3749 AliAODMCHeader *cHeaderAOD = 0x0;
3750 Bool_t headerFound = kFALSE;
3751 AliStack *fMCStack = 0x0;
3752 TClonesArray *fMCStackAOD = 0x0;
3753 if(MCEvent->IsA()==AliMCEvent::Class()){
3754 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3755 if(cHeader) headerFound = kTRUE;
3756 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3758 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3759 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3760 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3763 if(cHeaderAOD) headerFound = kTRUE;
3767 TList *genHeaders = 0x0;
3768 if(cHeader) genHeaders = cHeader->GetHeaders();
3770 genHeaders = cHeaderAOD->GetCocktailHeaders();
3771 if(genHeaders->GetEntries()==1){
3772 SetRejectExtraSignalsCut(0);
3776 AliGenEventHeader* gh = 0;
3778 Int_t firstindexA = 0;
3779 Int_t lastindexA = -1;
3780 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3781 if(rejection == 2){ // TList of Headers Names
3782 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3783 gh = (AliGenEventHeader*)genHeaders->At(i);
3784 TString GeneratorName = gh->GetName();
3785 lastindexA = lastindexA + gh->NProduced();
3786 // cout << i << "\t" << GeneratorName.Data() << endl;
3787 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3788 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3789 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3790 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3792 if (fMCStack->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
3793 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3794 if (gh->NProduced() > 10 && fMCStack->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
3795 // cout << "cond 1: "<< fnHeaders << endl;
3801 // cout << "cond 2: " << fnHeaders << endl;
3808 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3809 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3810 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3811 if (gh->NProduced() > 10){
3812 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA+10));
3813 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3814 // cout << "cond 1: " << fnHeaders << endl;
3821 // cout << "cond 2: " << fnHeaders << endl;
3829 // cout << "cond 3: "<< fnHeaders << endl;
3834 firstindexA = firstindexA + gh->NProduced();
3837 // cout << "number of headers: " <<fnHeaders << endl;
3839 fNotRejectedStart = new Int_t[fnHeaders];
3840 fNotRejectedEnd = new Int_t[fnHeaders];
3841 fGeneratorNames = new TString[fnHeaders];
3843 if(rejection == 1 || rejection == 3){
3844 fNotRejectedStart[0] = 0;
3845 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3846 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3850 Int_t firstindex = 0;
3851 Int_t lastindex = -1;
3854 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3855 gh = (AliGenEventHeader*)genHeaders->At(i);
3856 TString GeneratorName = gh->GetName();
3857 lastindex = lastindex + gh->NProduced();
3858 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3859 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3860 // cout << i << "\t" << GeneratorName.Data() << endl;
3861 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3862 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3864 if (fMCStack->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
3865 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3866 // cout << "produced " << gh->NProduced() << " with box generator" << endl;
3867 if (gh->NProduced() > 10 && fMCStack->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
3868 // cout << "one of them was a pi0 or eta" << endl;
3869 fNotRejectedStart[number] = firstindex;
3870 fNotRejectedEnd[number] = lastindex;
3871 fGeneratorNames[number] = GeneratorName;
3873 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3877 fNotRejectedStart[number] = firstindex;
3878 fNotRejectedEnd[number] = lastindex;
3879 fGeneratorNames[number] = GeneratorName;
3886 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3887 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3888 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3889 if (gh->NProduced() > 10) {
3890 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex+10));
3891 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3892 fNotRejectedEnd[number] = lastindex;
3893 fNotRejectedStart[number] = firstindex;
3894 fGeneratorNames[number] = GeneratorName;
3900 fNotRejectedStart[number] = firstindex;
3901 fNotRejectedEnd[number] = lastindex;
3902 fGeneratorNames[number] = GeneratorName;
3910 fNotRejectedStart[number] = firstindex;
3911 fNotRejectedEnd[number] = lastindex;
3912 fGeneratorNames[number] = GeneratorName;
3913 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3920 firstindex = firstindex + gh->NProduced();
3922 // for (Int_t i = 0; i < number; i++){
3923 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
3926 } else { // No Cocktail Header Found
3927 fNotRejectedStart = new Int_t[1];
3928 fNotRejectedEnd = new Int_t[1];
3931 fNotRejectedStart[0] = 0;
3932 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3933 fGeneratorNames = new TString[1];
3934 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3936 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3937 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3938 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3939 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3940 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3941 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3943 SetRejectExtraSignalsCut(0);
3948 //_________________________________________________________________________
3949 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3951 // Not Accepted == kFALSE == 0
3952 // Accepted == kTRUE == 1
3953 // FirstHeader == kTRUE == 3
3954 if(index < 0) return 0; // No Particle
3956 // if (index == 100){
3957 // cout << "possible headers" << endl;
3958 // for(Int_t i = 0;i<fnHeaders;i++){
3959 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
3963 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3964 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3965 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3966 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3968 for(Int_t i = 0;i<fnHeaders;i++){
3969 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3971 if(i == 0) accepted = 2; // MB Header
3975 else if(InputEvent->IsA()==AliAODEvent::Class()){
3976 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3977 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3978 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3979 if(!aodMCParticle->IsPrimary()){
3980 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3981 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3983 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3984 for(Int_t i = 0;i<fnHeaders;i++){
3985 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3987 if(i == 0) accepted = 2; // MB Header
3995 //_________________________________________________________________________
3996 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
3998 if ( !IsTriggerSelected(InputEvent) )
4001 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
4002 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
4005 if(isHeavyIon == 0 && GetIsFromPileup()){
4006 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
4008 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
4012 Bool_t hasV0And = ReaderCuts->HasV0AND();
4013 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
4014 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
4015 return 7; // With SDD requested but no fired
4017 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
4018 return 8; // V0AND requested but no fired
4020 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
4021 if(hCentralityVsNumberOfPrimaryTracks)
4022 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
4023 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
4024 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
4029 //_________________________________________________________________________
4030 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4031 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")|| period.Contains("LHC14a1") ||
4032 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
4035 for (Int_t i = 0; i < fnHeaders; i++){
4036 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
4037 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
4039 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
4041 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
4042 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
4043 fGeneratorNames[i].Contains("hijing")){
4045 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
4047 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
4049 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
4051 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
4053 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
4055 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
4058 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") ){
4063 if (kCaseGen == 0) return 1;
4066 Double_t mesonPt = 0;
4067 Double_t mesonMass = 0;
4069 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4070 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
4071 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
4072 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
4074 else if(InputEvent->IsA()==AliAODEvent::Class()){
4075 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4076 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4077 mesonPt = aodMCParticle->Pt();
4078 mesonMass = aodMCParticle->GetCalcMass();
4079 PDGCode = aodMCParticle->GetPdgCode();
4082 Float_t functionResultMC = 1.;
4083 if (kCaseGen == 1){ // Pythia 6
4084 Float_t dNdyMC = 2.1462;
4085 Float_t nMC = 7.06055;
4086 Float_t tMC = 0.12533;
4087 if ( PDGCode == 111){
4091 } else if ( PDGCode == 221){
4096 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);
4097 } else if (kCaseGen == 2){ // Phojet
4098 Float_t dNdyMC = 2.35978;
4099 Float_t nMC = 6.81795;
4100 Float_t tMC = 0.11492;
4101 if ( PDGCode == 111){
4105 } else if ( PDGCode == 221){
4110 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);
4111 } else if (kCaseGen == 4){ // BOX generators pp
4112 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4113 Float_t a = 0.23437;
4115 Float_t c = -1430.5863;
4116 Float_t d = -0.6966624;
4117 Float_t e = 252.3742;
4118 if ( PDGCode == 111){
4124 } else if ( PDGCode == 221){
4131 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4132 // cout << functionResultMC << endl;
4133 } else if (kCaseGen == 3 ){ // HIJING
4134 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4135 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4137 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4138 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4140 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4141 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4145 Float_t functionResultData = 1;
4146 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4147 Float_t dNdyData = 2.2328;
4148 Float_t nData = 7.1473;
4149 Float_t tData = 0.1346;
4150 if ( PDGCode == 111){
4154 } else if ( PDGCode == 221){
4155 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4159 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);
4160 // cout << functionResultData << endl;
4162 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4163 functionResultData = fFitDataPi0->Eval(mesonPt);
4165 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4166 functionResultData = fFitDataEta->Eval(mesonPt);
4168 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4169 functionResultData = fFitDataK0s->Eval(mesonPt);
4174 Double_t weight = 1;
4175 if (PDGCode == 111 || PDGCode == 221){
4176 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4177 weight = functionResultData/functionResultMC;
4178 if ( kCaseGen == 3){
4179 if (PDGCode == 111){
4180 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4184 if (PDGCode == 221){
4185 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4190 if (!isfinite(functionResultData)) weight = 1.;
4191 if (!isfinite(weight)) weight = 1.;
4193 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4194 weight = functionResultMC;
4197 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4198 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4202 ///________________________________________________________________________
4203 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4204 //Create and return standard 2010 PbPb cuts
4205 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4206 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4207 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4211 ///________________________________________________________________________
4212 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4213 //Create and return standard 2010 PbPb cuts
4214 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4215 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4216 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4219 ///________________________________________________________________________
4220 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4222 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4223 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4224 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4225 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4226 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4227 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4228 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4229 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4230 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4231 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4232 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4233 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4234 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4235 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4236 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4237 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4238 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4239 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4240 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4241 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4242 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4243 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4244 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4245 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4246 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4247 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4248 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4249 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4250 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4251 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4253 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4254 SetEtaShift(-0.465);
4256 else if(periodName.CompareTo("LHC13f") == 0 ||
4257 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4258 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4259 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4261 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4262 SetEtaShift(+0.465);
4264 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4267 ///________________________________________________________________________
4268 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4270 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4271 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4272 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4273 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4274 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4276 if(!fInPlaneOutOfPlane){
4277 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4280 else if(fInPlaneOutOfPlane == 1){
4281 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4282 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4287 else if(fInPlaneOutOfPlane == 2){
4288 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4289 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4298 ///________________________________________________________________________
4299 UChar_t AliConversionCuts::DeterminePhotonQualityAOD(AliAODConversionPhoton* photon, AliVEvent* eventDummy){
4301 AliAODTrack * negTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelNegative()));
4302 AliAODTrack * posTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelPositive()));
4304 if(!negTrack || !posTrack) {
4307 if(negTrack->Charge() == posTrack->Charge()){
4310 Int_t nClusterITSneg = negTrack->GetITSNcls();
4311 Int_t nClusterITSpos = posTrack->GetITSNcls();
4312 // cout << nClusterITSneg << "\t" << nClusterITSpos <<endl;
4314 if (nClusterITSneg > 1 && nClusterITSpos > 1){
4316 } else if (nClusterITSneg > 1 || nClusterITSpos > 1){