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),
233 fTriggerSelectedManually(kFALSE),
234 fSpecialTriggerName("")
238 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
239 fCutString=new TObjString((GetCutNumber()).Data());
241 fElectronLabelArray = new Int_t[fElectronArraySize];
242 fUtils = new AliAnalysisUtils();
243 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
244 //fUtils->SetCutOnZVertexSPD(kFALSE);
249 //________________________________________________________________________
250 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
251 AliAnalysisCuts(ref),
253 fHeaderList(ref.fHeaderList),
255 fEventQuality(ref.fEventQuality),
258 fEtaCut(ref.fEtaCut),
259 fEtaCutMin(ref.fEtaCutMin),
261 fSinglePtCut(ref.fSinglePtCut),
263 fMinClsTPC(ref.fMinClsTPC),
264 fMinClsTPCToF(ref.fMinClsTPCToF),
265 fLineCutZRSlope(ref.fLineCutZRSlope),
266 fLineCutZValue(ref.fLineCutZValue),
267 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
268 fLineCutZValueMin(ref.fLineCutZValueMin),
269 fChi2CutConversion(ref.fChi2CutConversion),
270 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
271 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
272 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
273 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
274 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
275 fDoTRDPID(ref.fDoTRDPID),
276 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
277 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
278 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
279 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
280 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
281 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
282 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
283 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
284 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
285 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
286 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
287 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
288 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
289 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
290 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
291 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
292 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
293 fDoQtGammaSelection(ref.fDoQtGammaSelection),
294 fDo2DQt(ref.fDo2DQt),
296 fXVertexCut(ref.fXVertexCut),
297 fYVertexCut(ref.fYVertexCut),
298 fZVertexCut(ref.fZVertexCut),
299 fNSigmaMass(ref.fNSigmaMass),
300 fUseEtaMinCut(ref.fUseEtaMinCut),
301 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
302 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
303 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
304 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
305 fIsHeavyIon(ref.fIsHeavyIon),
306 fDetectorCentrality(ref.fDetectorCentrality),
307 fModCentralityClass(ref.fModCentralityClass),
308 fMaxVertexZ(ref.fMaxVertexZ),
309 fCentralityMin(ref.fCentralityMin),
310 fCentralityMax(ref.fCentralityMax),
311 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
312 fUseTOFpid(ref.fUseTOFpid),
313 fMultiplicityMethod(ref.fMultiplicityMethod),
314 fSpecialTrigger(ref.fSpecialTrigger),
315 fRemovePileUp(ref.fRemovePileUp),
316 fOpeningAngle(ref.fOpeningAngle),
317 fPsiPairCut(ref.fPsiPairCut),
318 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
319 fCosPAngleCut(ref.fCosPAngleCut),
320 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
321 fRejectExtraSignals(ref.fRejectExtraSignals),
322 fminV0Dist(ref.fminV0Dist),
323 fDoSharedElecCut(ref.fDoSharedElecCut),
324 fDoPhotonQualitySelectionCut(ref.fDoPhotonQualitySelectionCut),
325 fPhotonQualityCut(ref.fPhotonQualityCut),
326 fOfflineTriggerMask(ref.fOfflineTriggerMask),
327 fHasV0AND(ref.fHasV0AND),
328 fIsSDDFired(ref.fIsSDDFired),
329 fRandom(ref.fRandom),
330 fElectronArraySize(ref.fElectronArraySize),
331 fElectronLabelArray(NULL),
332 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
333 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
334 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
335 fConversionPointXArray(ref.fConversionPointXArray),
336 fConversionPointYArray(ref.fConversionPointYArray),
337 fConversionPointZArray(ref.fConversionPointZArray),
338 fnHeaders(ref.fnHeaders),
339 fNotRejectedStart(NULL),
340 fNotRejectedEnd(NULL),
341 fGeneratorNames(ref.fGeneratorNames),
344 fEtaShift(ref.fEtaShift),
345 fDoEtaShift(ref.fDoEtaShift),
346 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
347 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
348 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
349 fPathTrFReweighting(ref.fPathTrFReweighting),
350 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
351 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
352 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
353 fNameFitDataPi0(ref.fNameFitDataPi0),
354 fNameFitDataEta(ref.fNameFitDataEta),
355 fNameFitDataK0s(ref.fNameFitDataK0s),
357 hEtaDistV0sAfterdEdxCuts(NULL),
359 hTPCdEdxbefore(NULL),
361 hTPCdEdxSigbefore(NULL),
362 hTPCdEdxSigafter(NULL),
366 hPsiPairDeltaPhiafter(NULL),
369 hInvMassbefore(NULL),
370 hArmenterosbefore(NULL),
372 hArmenterosafter(NULL),
373 hAcceptanceCuts(NULL),
377 hCentralityVsNumberOfPrimaryTracks(NULL),
379 hEventPlanePhi(NULL),
381 hTriggerClassSelected(NULL),
382 hReweightMCHistPi0(ref.hReweightMCHistPi0),
383 hReweightMCHistEta(ref.hReweightMCHistEta),
384 hReweightMCHistK0s(ref.hReweightMCHistK0s),
385 fFitDataPi0(ref.fFitDataPi0),
386 fFitDataEta(ref.fFitDataEta),
387 fFitDataK0s(ref.fFitDataK0s),
388 fPreSelCut(ref.fPreSelCut),
389 fTriggerSelectedManually(ref.fTriggerSelectedManually),
390 fSpecialTriggerName(ref.fSpecialTriggerName)
393 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
394 fCutString=new TObjString((GetCutNumber()).Data());
395 fElectronLabelArray = new Int_t[fElectronArraySize];
396 fUtils = new AliAnalysisUtils();
397 // dont copy histograms (if you like histograms, call InitCutHistograms())
402 //________________________________________________________________________
403 AliConversionCuts::~AliConversionCuts() {
405 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
407 // delete fHistograms;
408 // fHistograms = NULL;
409 if(fCutString != NULL){
413 if(fElectronLabelArray){
414 delete fElectronLabelArray;
415 fElectronLabelArray = NULL;
417 if(fNotRejectedStart){
418 delete[] fNotRejectedStart;
419 fNotRejectedStart = NULL;
422 delete[] fNotRejectedEnd;
423 fNotRejectedEnd = NULL;
426 delete[] fGeneratorNames;
427 fGeneratorNames = NULL;
436 //________________________________________________________________________
437 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
439 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
440 TH1::AddDirectory(kFALSE);
442 if(fHistograms != NULL){
446 if(fHistograms==NULL){
447 fHistograms=new TList();
448 fHistograms->SetOwner(kTRUE);
449 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
450 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
453 if (hReweightMCHistPi0){
454 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
455 fHistograms->Add(hReweightMCHistPi0);
457 if (hReweightMCHistEta){
458 hReweightMCHistEta->SetName("MCInputForWeightingEta");
459 fHistograms->Add(hReweightMCHistEta);
461 if (hReweightMCHistK0s){
462 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
463 fHistograms->Add(hReweightMCHistK0s);
466 // fFitDataPi0->SetName("DataFitForWeightingPi0");
467 // fHistograms->Add(fFitDataPi0);
470 // fFitDataEta->SetName("DataFitForWeightingEta");
471 // fHistograms->Add(fFitDataEta);
474 // fFitDataK0s->SetName("DataFitForWeightingK0s");
475 // fHistograms->Add(fFitDataK0s);
478 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
479 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
480 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
481 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
482 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
483 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
484 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
485 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
486 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
487 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
488 fHistograms->Add(hCutIndex);
491 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
492 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
493 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
494 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
495 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
496 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
497 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
498 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
499 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
500 fHistograms->Add(hTrackCuts);
503 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",15,-0.5,14.5);
504 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
505 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
506 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
507 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
508 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
509 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
510 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
511 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
512 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
513 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
514 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
515 hPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality");
516 hPhotonCuts->GetXaxis()->SetBinLabel(13,"out");
517 fHistograms->Add(hPhotonCuts);
520 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
521 fHistograms->Add(hInvMassbefore);
522 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
523 fHistograms->Add(hArmenterosbefore);
524 hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
525 fHistograms->Add(hEtaDistV0s);
528 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
529 fHistograms->Add(hInvMassafter);
530 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
531 fHistograms->Add(hArmenterosafter);
533 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
534 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
535 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
536 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
537 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
538 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
539 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
540 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
541 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
542 fHistograms->Add(hAcceptanceCuts);
545 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
546 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
547 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
548 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
549 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
550 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
551 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
552 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
553 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
554 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
555 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
556 fHistograms->Add(hdEdxCuts);
558 TAxis *AxisBeforedEdx = NULL;
559 TAxis *AxisBeforedEdxSig = NULL;
560 TAxis *AxisBeforeTOF = NULL;
561 TAxis *AxisBeforeTOFSig = NULL;
563 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
564 fHistograms->Add(hTPCdEdxbefore);
565 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
566 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
567 fHistograms->Add(hTPCdEdxSigbefore);
568 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
570 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
571 fHistograms->Add(hTOFbefore);
572 AxisBeforeTOF = hTOFbefore->GetXaxis();
573 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
574 fHistograms->Add(hTOFSigbefore);
575 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
578 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
579 fHistograms->Add(hTPCdEdxSigafter);
581 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
582 fHistograms->Add(hTPCdEdxafter);
584 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
585 fHistograms->Add(hTOFSigafter);
587 hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
588 fHistograms->Add(hEtaDistV0sAfterdEdxCuts);
590 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
591 fHistograms->Add(hPsiPairDeltaPhiafter);
593 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
594 Int_t bins = AxisAfter->GetNbins();
595 Double_t from = AxisAfter->GetXmin();
596 Double_t to = AxisAfter->GetXmax();
597 Double_t *newBins = new Double_t[bins+1];
599 Double_t factor = TMath::Power(to/from, 1./bins);
600 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
601 AxisAfter->Set(bins, newBins);
602 AxisAfter = hTOFSigafter->GetXaxis();
603 AxisAfter->Set(bins, newBins);
604 AxisAfter = hTPCdEdxafter->GetXaxis();
605 AxisAfter->Set(bins, newBins);
607 AxisBeforedEdx->Set(bins, newBins);
608 AxisBeforeTOF->Set(bins, newBins);
609 AxisBeforedEdxSig->Set(bins, newBins);
610 AxisBeforeTOFSig->Set(bins, newBins);
614 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
615 fHistograms->Add(hCentrality);
616 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
617 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
619 // Event Cuts and Info
621 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
622 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
623 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
624 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
625 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
626 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
627 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
628 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
629 fHistograms->Add(hV0EventCuts);
631 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
632 fHistograms->Add(hVertexZ);
634 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
635 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
636 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
637 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
638 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
639 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
640 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
641 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
642 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
643 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
644 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
645 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
646 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
647 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
648 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
649 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
650 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
651 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
652 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
653 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
654 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
655 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
656 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
657 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
658 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
659 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
660 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
661 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
662 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
663 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
664 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
665 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
666 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
667 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
668 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
669 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
670 fHistograms->Add(hTriggerClass);
673 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
674 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
675 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
676 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
677 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
678 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
679 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
680 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
681 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
682 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
683 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
693 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
694 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
695 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
696 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
697 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
698 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
699 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
700 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
701 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
702 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
703 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
704 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
705 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
706 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
707 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
708 fHistograms->Add(hTriggerClassSelected);
710 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
711 fHistograms->Add(hEventPlanePhi);
715 TH1::AddDirectory(kTRUE);
718 //________________________________________________________________________
719 Bool_t AliConversionCuts::InitPIDResponse(){
720 // Set Pointer to AliPIDResponse
722 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
724 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
725 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
726 if(fPIDResponse)return kTRUE;
733 ///________________________________________________________________________
734 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
735 // Process Event Selection
738 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
741 // Check for MC event
742 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
743 // Check if MC event is correctly loaded
744 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
749 if (!mcHandler->InitOk() ){
753 if (!mcHandler->TreeK() ){
757 if (!mcHandler->TreeTR() ) {
764 // cout << "before event trigger" << endl;
765 if(!IsTriggerSelected(fInputEvent)){
766 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
772 if(fInputEvent->IsA()==AliESDEvent::Class()){
773 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
774 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
775 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
777 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
780 // Number of Contributors Cut
781 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
782 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
788 // Z Vertex Position Cut
789 if(!VertexZCut(fInputEvent)){
790 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
799 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
800 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
807 // Centrality Selection
808 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
809 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
815 // Fill Event Histograms
816 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
817 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
818 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
819 if(hCentralityVsNumberOfPrimaryTracks)
820 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
821 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
822 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
827 ///________________________________________________________________________
828 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
829 // MonteCarlo Photon Selection
831 if(!fMCStack)return kFALSE;
833 if (particle->GetPdgCode() == 22){
836 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
839 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
843 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
844 return kFALSE; // no photon as mothers!
847 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
848 return kFALSE; // the gamma has a mother, and it is not a primary particle
851 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
853 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
854 TParticle* ePos = NULL;
855 TParticle* eNeg = NULL;
857 if(particle->GetNDaughters() >= 2){
858 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
859 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
860 if(tmpDaughter->GetUniqueID() == 5){
861 if(tmpDaughter->GetPdgCode() == 11){
863 } else if(tmpDaughter->GetPdgCode() == -11){
870 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
874 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
875 return kFALSE; // no reconstruction below the Pt cut
878 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
879 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
882 if(fEtaCutMin > -0.1){
883 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
884 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
889 return kFALSE; // cuts on distance from collision point
892 if(abs(ePos->Vz()) > fMaxZ){
893 return kFALSE; // outside material
895 if(abs(eNeg->Vz()) > fMaxZ){
896 return kFALSE; // outside material
899 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
900 return kFALSE; // line cut to exclude regions where we do not reconstruct
901 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
905 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
906 return kFALSE; // line cut to exclude regions where we do not reconstruct
907 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
912 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
916 ///________________________________________________________________________
917 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
918 // MonteCarlo Photon Selection
920 if(!aodmcArray)return kFALSE;
922 if (particle->GetPdgCode() == 22){
923 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
926 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
930 if(particle->GetMother() > -1){
931 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
932 return kFALSE; // no photon as mothers!
934 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
935 return kFALSE; // the gamma has a mother, and it is not a primary particle
939 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
941 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
942 AliAODMCParticle* ePos = NULL;
943 AliAODMCParticle* eNeg = NULL;
945 if(particle->GetNDaughters() >= 2){
946 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
947 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
948 if(!tmpDaughter) continue;
949 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
950 if(tmpDaughter->GetPdgCode() == 11){
952 } else if(tmpDaughter->GetPdgCode() == -11){
959 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
963 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
964 return kFALSE; // no reconstruction below the Pt cut
967 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
968 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
971 if(fEtaCutMin > -0.1){
972 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
973 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
977 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
978 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
981 return kFALSE; // cuts on distance from collision point
983 if(abs(ePos->Zv()) > fMaxZ){
984 return kFALSE; // outside material
986 if(abs(eNeg->Zv()) > fMaxZ){
987 return kFALSE; // outside material
990 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
991 return kFALSE; // line cut to exclude regions where we do not reconstruct
992 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
996 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
997 return kFALSE; // line cut to exclude regions where we do not reconstruct
998 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1003 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1007 ///________________________________________________________________________
1008 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1009 { // Specific Photon Cuts
1012 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1015 // Fill Histos before Cuts
1016 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1017 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1019 // Gamma selection based on QT from Armenteros
1020 if(fDoQtGammaSelection == kTRUE){
1021 if(!ArmenterosQtCut(photon)){
1022 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1029 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1031 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1037 // Reconstruction Acceptance Cuts
1038 if(!AcceptanceCuts(photon)){
1039 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1045 if(fDoPhotonAsymmetryCut == kTRUE){
1046 if(!AsymmetryCut(photon,event)){
1047 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1052 //Check the pid probability
1054 if(!PIDProbabilityCut(photon, event)) {
1055 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1060 if(!CorrectedTPCClusterCut(photon, event)) {
1061 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1065 Double_t magField = event->GetMagneticField();
1066 if( magField < 0.0 ){
1072 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1073 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1074 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1077 if(!PsiPairCut(photon)) {
1078 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1083 if(!CosinePAngleCut(photon, event)) {
1084 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1088 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1090 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1093 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1094 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1099 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1100 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1110 if (fDoPhotonQualitySelectionCut && photonAOD->GetPhotonQuality() != fPhotonQualityCut){
1111 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1116 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1118 // Histos after Cuts
1119 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1120 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1121 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1126 ///________________________________________________________________________
1127 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1128 { //Cut on corrected TPC Cluster Info
1130 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1131 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1133 if(!negTrack||!posTrack)return kFALSE;
1135 Double_t negclsToF=0;
1137 if (!fUseCorrectedTPCClsInfo ){
1138 if(negTrack->GetTPCNclsF()!=0){
1139 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1142 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1145 Double_t posclsToF = 0.;
1146 if (!fUseCorrectedTPCClsInfo ){
1147 if(posTrack->GetTPCNclsF()!=0){
1148 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1151 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1154 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1161 ///________________________________________________________________________
1162 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1164 //Selection of Reconstructed Photons
1166 FillPhotonCutIndex(kPhotonIn);
1168 if(event->IsA()==AliESDEvent::Class()) {
1169 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1170 FillPhotonCutIndex(kOnFly);
1174 // else if(event->IsA()==AliAODEvent::Class()) {
1175 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1176 // FillPhotonCutIndex(kOnFly);
1182 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1183 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1185 if(!negTrack || !posTrack) {
1186 FillPhotonCutIndex(kNoTracks);
1189 photon->DeterminePhotonQuality(negTrack,posTrack);
1191 if(!TracksAreSelected(negTrack, posTrack)){
1192 FillPhotonCutIndex(kTrackCuts);
1195 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1197 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1198 FillPhotonCutIndex(kdEdxCuts);
1201 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1203 if(!PhotonCuts(photon,event)){
1204 FillPhotonCutIndex(kPhotonCuts);
1208 // Photon passed cuts
1209 FillPhotonCutIndex(kPhotonOut);
1213 ///________________________________________________________________________
1214 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1215 { // Armenteros Qt Cut
1217 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1221 if(photon->GetArmenterosQt()>fQtMax){
1229 ///________________________________________________________________________
1230 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1231 // Exclude certain areas for photon reconstruction
1234 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1237 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1238 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1243 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1244 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1249 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1250 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1253 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1254 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1259 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1260 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1266 if( photon->GetPhotonEta() > (fEtaCut + fEtaShift) || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1267 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1270 if(fEtaCutMin>-0.1){
1271 if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1272 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1278 if(photon->GetPhotonPt()<fPtCut){
1279 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1284 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1290 ///________________________________________________________________________
1291 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1292 // Track Cuts which require AOD/ESD specific implementation
1294 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1295 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1300 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1301 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1302 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1303 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1311 ///________________________________________________________________________
1312 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1313 // Track Cuts which require AOD/ESD specific implementation
1315 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1316 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1321 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1322 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1330 ///________________________________________________________________________
1331 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1332 // Track Selection for Photon Reconstruction
1335 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1339 if(negTrack->Charge() == posTrack->Charge()) {
1340 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1345 // Number of TPC Clusters
1348 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1349 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1355 if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1356 negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1357 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1360 if(fEtaCutMin>-0.1){
1361 if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1362 (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1363 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1370 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1371 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1376 // AOD ESD specific cuts
1377 Bool_t passCuts = kTRUE;
1379 if(negTrack->IsA()==AliAODTrack::Class()) {
1380 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1382 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1386 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1391 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1397 ///________________________________________________________________________
1398 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1399 // Electron Identification Cuts for Photon reconstruction
1400 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1401 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1404 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1405 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1406 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1409 if(fDodEdxSigmaCut == kTRUE){
1410 // TPC Electron Line
1411 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1412 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1414 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1420 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1421 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1422 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1423 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1425 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1432 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1433 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1434 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1435 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1437 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1445 if(fDoKaonRejectionLowP == kTRUE){
1446 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1447 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1449 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1455 if(fDoProtonRejectionLowP == kTRUE){
1456 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1457 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1459 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1466 if(fDoPionRejectionLowP == kTRUE){
1467 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1468 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1470 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1478 // cout<<"Start"<<endl;
1479 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1481 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1482 // {cout<<"TOF DA"<<endl;}
1483 // if(status == AliPIDResponse::kDetPidOk){
1484 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1485 // cout<<"--> "<<probMis<<endl;
1486 // if(probMis > 0.01){
1491 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1493 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1494 Double_t times[AliPID::kSPECIESC];
1495 fCurrentTrack->GetIntegratedTimes(times);
1496 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1497 Double_t dT = TOFsignal - t0 - times[0];
1498 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1500 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1502 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1503 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1504 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1508 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1513 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1514 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1520 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1521 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1522 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1527 ///________________________________________________________________________
1528 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1529 // Cut on Energy Assymetry
1531 for(Int_t ii=0;ii<2;ii++){
1533 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1535 if( track->P() > fMinPPhotonAsymmetryCut ){
1536 Double_t trackNegAsy=0;
1537 if (photon->GetPhotonP()!=0.){
1538 trackNegAsy= track->P()/photon->GetPhotonP();
1541 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1550 ///________________________________________________________________________
1551 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1552 //Returns pointer to the track with given ESD label
1553 //(Important for AOD implementation, since Track array in AOD data is different
1554 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1556 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1558 if(label > event->GetNumberOfTracks() ) return NULL;
1559 AliESDtrack * track = esdEvent->GetTrack(label);
1563 AliVTrack * track = 0x0;
1564 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1565 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1569 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1570 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1572 if(track->GetID() == label) {
1579 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1583 ///________________________________________________________________________
1584 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1585 //Returns pointer to the track with given ESD label
1586 //(Important for AOD implementation, since Track array in AOD data is different
1587 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1590 if(label > event->GetNumberOfTracks() ) return NULL;
1591 AliESDtrack * track = event->GetTrack(label);
1594 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1600 ///________________________________________________________________________
1601 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1602 // Cut on Electron Probability for Photon Reconstruction
1604 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1608 Bool_t iResult=kFALSE;
1610 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1611 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1613 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1614 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1616 if(negProbArray && posProbArray){
1618 negTrack->GetTPCpid(negProbArray);
1619 posTrack->GetTPCpid(posProbArray);
1621 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1626 delete [] posProbArray;
1627 delete [] negProbArray;
1631 ///Not possible for AODs
1641 ///________________________________________________________________________
1642 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1643 // MC Acceptance Cuts
1644 //(Certain areas were excluded for photon reconstruction)
1646 if(particle->R()>fMaxR){
1649 if(ePos->R()>fMaxR){
1653 if(ePos->R()<fMinR){
1657 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1660 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1664 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1668 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1672 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1677 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1680 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1683 if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1686 if(fEtaCutMin>-0.1){
1687 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1690 if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1693 if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1698 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1702 if(particle->Pt()<fPtCut){
1708 ///________________________________________________________________________
1709 Bool_t AliConversionCuts::UpdateCutString() {
1710 ///Update the cut string (if it has been created yet)
1712 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1713 fCutString->SetString(GetCutNumber());
1719 ///________________________________________________________________________
1720 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1722 AliInfo("Entering loading of histograms for weighting");
1723 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1725 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1728 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1729 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1730 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1731 hReweightMCHistPi0->SetDirectory(0);
1732 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1733 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1735 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1736 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1737 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1738 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1739 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1742 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1743 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1744 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1745 hReweightMCHistEta->SetDirectory(0);
1746 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1747 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1750 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1751 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1752 fFitDataEta = new TF1(*fFitDataEtatemp);
1753 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1754 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1757 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1758 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1759 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1760 hReweightMCHistK0s->SetDirectory(0);
1761 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1762 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1765 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1766 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1767 fFitDataK0s = new TF1(*fFitDataK0stemp);
1768 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1769 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1777 ///________________________________________________________________________
1778 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1779 // Initialize Cuts from a given Cut string
1780 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1781 AliInfo("Weighting was enabled");
1782 LoadReweightingHistosMCFromFile();
1785 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1786 if(analysisCutSelection.Length()!=kNCuts) {
1787 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1790 if(!analysisCutSelection.IsDigit()){
1791 AliError("Cut selection contains characters");
1795 const char *cutSelection = analysisCutSelection.Data();
1796 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1797 for(Int_t ii=0;ii<kNCuts;ii++){
1801 // Set Individual Cuts
1802 for(Int_t ii=0;ii<kNCuts;ii++){
1803 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1806 PrintCutsWithValues();
1810 ///________________________________________________________________________
1811 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1812 ///Set individual cut ID
1817 if( SetV0Finder(value)) {
1818 fCuts[kv0FinderType] = value;
1821 } else return kFALSE;
1823 case kededxSigmaCut:
1824 if( SetTPCdEdxCutElectronLine(value)) {
1825 fCuts[kededxSigmaCut] = value;
1828 } else return kFALSE;
1830 case kpidedxSigmaCut:
1831 if( SetTPCdEdxCutPionLine(value)) {
1832 fCuts[kpidedxSigmaCut] = value;
1835 } else return kFALSE;
1837 case kpiMomdedxSigmaCut:
1838 if( SetMinMomPiondEdxCut(value)) {
1839 fCuts[kpiMomdedxSigmaCut] = value;
1842 } else return kFALSE;
1845 if( SetChi2GammaCut(value)) {
1846 fCuts[kchi2GammaCut] = value;
1849 } else return kFALSE;
1852 if( SetSinglePtCut(value)) {
1853 fCuts[ksinglePtCut] = value;
1856 } else return kFALSE;
1859 if( SetTPCClusterCut(value)) {
1860 fCuts[kclsTPCCut] = value;
1863 } else return kFALSE;
1866 if( SetEtaCut(value)) {
1867 fCuts[ketaCut] = value;
1870 } else return kFALSE;
1872 case kLowPRejectionSigmaCut:
1873 if( SetLowPRejectionCuts(value)) {
1874 fCuts[kLowPRejectionSigmaCut] = value;
1877 } else return kFALSE;
1880 if( SetQtMaxCut(value)) {
1881 fCuts[kQtMaxCut] = value;
1884 } else return kFALSE;
1886 case kpiMaxMomdedxSigmaCut:
1887 if( SetMaxMomPiondEdxCut(value)) {
1888 fCuts[kpiMaxMomdedxSigmaCut] = value;
1891 } else return kFALSE;
1894 if( SetRCut(value)) {
1895 fCuts[kRCut] = value;
1898 } else return kFALSE;
1901 if( SetRemovePileUp(value)) {
1902 fCuts[kremovePileUp] = value;
1905 } else return kFALSE;
1908 if( SetSelectSpecialTrigger(value)) {
1909 fCuts[kselectV0AND] = value;
1912 } else return kFALSE;
1914 case kmultiplicityMethod:
1915 if( SetMultiplicityMethod(value)) {
1916 fCuts[kmultiplicityMethod] = value;
1919 } else return kFALSE;
1922 if( SetIsHeavyIon(value)) {
1923 fCuts[kisHeavyIon] = value;
1926 } else return kFALSE;
1928 case kCentralityMin:
1929 if( SetCentralityMin(value)) {
1930 fCuts[kCentralityMin] = value;
1933 } else return kFALSE;
1935 case kCentralityMax:
1936 if( SetCentralityMax(value)) {
1937 fCuts[kCentralityMax] = value;
1940 } else return kFALSE;
1942 case kTOFelectronPID:
1943 if( SetTOFElectronPIDCut(value)) {
1944 fCuts[kTOFelectronPID] = value;
1947 } else return kFALSE;
1949 case kdoPhotonAsymmetryCut:
1950 if( SetPhotonAsymmetryCut(value)) {
1951 fCuts[kdoPhotonAsymmetryCut] = value;
1954 } else return kFALSE;
1957 if( SetPsiPairCut(value)) {
1958 fCuts[kPsiPair] = value;
1961 } else return kFALSE;
1964 if( SetCosPAngleCut(value)) {
1965 fCuts[kCosPAngle] = value;
1968 } else return kFALSE;
1972 if( SetSharedElectronCut(value)) {
1973 fCuts[kElecShare] = value;
1976 } else return kFALSE;
1979 if( SetToCloseV0sCut(value)) {
1980 fCuts[kToCloseV0s] = value;
1983 } else return kFALSE;
1986 if( SetRejectExtraSignalsCut(value)) {
1987 fCuts[kExtraSignals] = value;
1990 } else return kFALSE;
1993 if( SetDCARPhotonPrimVtxCut(value)) {
1994 fCuts[kDcaRPrimVtx] = value;
1997 } else return kFALSE;
2000 if( SetDCAZPhotonPrimVtxCut(value)) {
2001 fCuts[kDcaZPrimVtx] = value;
2004 } else return kFALSE;
2006 case kInPlaneOutOfPlane:
2007 if( SetInPlaneOutOfPlane(value)) {
2008 fCuts[kInPlaneOutOfPlane] = value;
2011 } else return kFALSE;
2017 AliError("Cut id out of range");
2021 AliError("Cut id %d not recognized");
2026 ///________________________________________________________________________
2027 void AliConversionCuts::PrintCuts() {
2028 // Print out current Cut Selection
2029 for(Int_t ic = 0; ic < kNCuts; ic++) {
2030 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2034 void AliConversionCuts::PrintCutsWithValues() {
2035 // Print out current Cut Selection with value
2036 if (fIsHeavyIon == 0) {
2037 printf("Running in pp mode \n");
2038 if (fSpecialTrigger == 0){
2039 printf("\t only events triggered by V0OR will be analysed \n");
2040 } else if (fSpecialTrigger == 1){
2041 printf("\t only events triggered by V0AND will be analysed \n");
2042 } else if (fSpecialTrigger == 2){
2043 printf("\t only events where SDD was present will be analysed \n");
2044 } else if (fSpecialTrigger == 3){
2045 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2046 } else if (fSpecialTrigger > 3){
2047 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2049 } else if (fIsHeavyIon == 1){
2050 printf("Running in PbPb mode \n");
2051 if (fDetectorCentrality == 0){
2052 printf("\t centrality selection based on V0M \n");
2053 } else if (fDetectorCentrality == 1){
2054 printf("\t centrality selection based on Cl1 \n");
2056 if (fModCentralityClass == 0){
2057 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2058 } else if ( fModCentralityClass == 1){
2059 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2060 } else if ( fModCentralityClass == 2){
2061 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2062 } else if (fModCentralityClass == 3){
2063 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2064 } else if ( fModCentralityClass == 4){
2065 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2066 } else if ( fModCentralityClass == 5){
2067 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2069 if (fSpecialTrigger == 0){
2070 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2071 } else if (fSpecialTrigger > 4){
2072 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2074 } else if (fIsHeavyIon == 2){
2075 printf("Running in pPb mode \n");
2076 if (fDetectorCentrality == 0){
2077 printf("\t centrality selection based on V0A \n");
2078 } else if (fDetectorCentrality == 1){
2079 printf("\t centrality selection based on Cl1 \n");
2081 if (fModCentralityClass == 0){
2082 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2084 if (fSpecialTrigger == 0){
2085 printf("\t only events triggered by kINT7 will be analysed \n");
2086 } else if (fSpecialTrigger > 4){
2087 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2090 printf("Electron cuts: \n");
2091 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut );
2092 else printf("\t eta_{e} < %3.2f\n", fEtaCut );
2093 printf("\t p_{T,e} > %3.2f\n", fSinglePtCut );
2094 printf("\t %3.2f < n sigma e < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine );
2096 printf("Photon cuts: \n");
2097 printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR );
2098 printf("\t Z_{conv} < %3.2f\n", fMaxZ );
2099 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut );
2100 else printf("\t eta_{conv} < %3.2f\n", fEtaCut );
2101 printf("\t p_{T,gamma} > %3.2f\n", fPtCut );
2103 printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2105 printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2107 if (fDo2DPsiPairChi2){
2108 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 );
2110 printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion );
2111 printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut );
2113 printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut );
2114 printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut );
2115 printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut );
2116 if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut );
2119 ///________________________________________________________________________
2120 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2128 fDetectorCentrality=0;
2132 fDetectorCentrality=1;
2134 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2136 fDetectorCentrality=0;
2137 fModCentralityClass=1;
2139 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2141 fDetectorCentrality=0;
2142 fModCentralityClass=2;
2144 case 5: //strict cut on v0 tracks for MC
2146 fDetectorCentrality=0;
2147 fModCentralityClass=3;
2149 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2150 //strict cut on v0 tracks for MC
2152 fDetectorCentrality=0;
2153 fModCentralityClass=4;
2155 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2156 //strict cut on v0 tracks for MC
2158 fDetectorCentrality=0;
2159 fModCentralityClass=5;
2163 fDetectorCentrality=0;
2167 fDetectorCentrality=1;
2170 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2176 //___________________________________________________________________
2177 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2180 if(minCentrality<0||minCentrality>9){
2181 AliError(Form("minCentrality not defined %d",minCentrality));
2185 fCentralityMin=minCentrality;
2188 //___________________________________________________________________
2189 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2192 if(maxCentrality<0||maxCentrality>9){
2193 AliError(Form("maxCentrality not defined %d",maxCentrality));
2196 fCentralityMax=maxCentrality;
2199 ///________________________________________________________________________
2200 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2203 switch(selectSpecialTrigger){
2205 fSpecialTrigger=0; // dont care
2208 fSpecialTrigger=1; // V0AND
2211 fSpecialTrigger=2; // with SDD requested
2214 fSpecialTrigger=3; // V0AND plus with SDD requested
2216 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2218 fSpecialTrigger=4; // different trigger class as MB
2219 fTriggerSelectedManually = kTRUE;
2222 fSpecialTrigger=4; // different trigger class as MB
2223 fTriggerSelectedManually = kTRUE;
2226 fSpecialTrigger=4; // different trigger class as MB
2227 fTriggerSelectedManually = kTRUE;
2230 fSpecialTrigger=4; // different trigger class as MB
2231 fTriggerSelectedManually = kTRUE;
2234 fSpecialTrigger=4; // different trigger class as MB
2235 fTriggerSelectedManually = kTRUE;
2238 fSpecialTrigger=4; // different trigger class as MB
2239 fTriggerSelectedManually = kTRUE;
2242 AliError("Warning: Special Trigger Not known");
2247 ///________________________________________________________________________
2248 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2251 fMultiplicityMethod=multiplicityMethod;
2253 // 0 Photon Multiplicity
2254 // 1 TPC Track multiplicity
2260 ///________________________________________________________________________
2261 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2263 switch(removePileUp){
2265 fRemovePileUp=kFALSE;
2268 fRemovePileUp=kTRUE;
2271 AliError("RemovePileUpCut not defined");
2276 ///________________________________________________________________________
2277 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2279 switch(extraSignal){
2281 fRejectExtraSignals = 0;
2282 break; // No Rejection
2284 fRejectExtraSignals = 1;
2285 break; // MinBias Header
2287 fRejectExtraSignals = 2;
2288 break; // User String Array
2290 fRejectExtraSignals = 3;
2291 break; // Rejection for Gamma Correction only
2293 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2298 ///________________________________________________________________________
2299 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2301 switch (v0FinderType){
2302 case 0: // on fly V0 finder
2303 cout << "have chosen onfly V0" << endl;
2304 fUseOnFlyV0Finder=kTRUE;
2306 case 1: // offline V0 finder
2307 cout << "have chosen offline V0" << endl;
2308 fUseOnFlyV0Finder=kFALSE;
2311 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2316 ///________________________________________________________________________
2317 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2320 //Set Standard LineCutZValues
2321 fLineCutZValueMin = -2;
2322 fLineCutZValue = 7.;
2327 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2329 fLineCutZRSlopeMin = 0.;
2331 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2333 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2335 fLineCutZRSlopeMin = 0.;
2339 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2341 fLineCutZRSlopeMin = 0.;
2345 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2347 fLineCutZRSlopeMin = 0.;
2351 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2353 fLineCutZRSlopeMin = 0.;
2357 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2359 fLineCutZRSlopeMin = 0.;
2363 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2365 fLineCutZRSlopeMin = 0.;
2368 if (fIsHeavyIon==1){
2370 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2372 fLineCutZRSlopeMin = 0.;
2376 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2378 fLineCutZRSlopeMin = 0.;
2381 // case 8: // 0.1 - 0.8
2383 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2384 // fEtaCutMin = 0.1;
2385 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2389 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2391 fLineCutZRSlopeMin = 0.;
2395 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2397 fLineCutZRSlopeMin = 0.;
2400 AliError(Form(" EtaCut not defined %d",etaCut));
2405 ///________________________________________________________________________
2406 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2429 // High purity cuts for PbPb (remove first layers of material)
2452 AliError("RCut not defined");
2457 ///________________________________________________________________________
2458 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2460 switch(singlePtCut){
2461 case 0: // 0.050 GeV
2462 fSinglePtCut = 0.050;
2464 case 1: // 0.100 GeV
2465 fSinglePtCut = 0.100;
2467 case 2: // 0.150 GeV
2468 fSinglePtCut = 0.150;
2470 case 3: // 0.200 GeV
2471 fSinglePtCut = 0.200;
2473 case 4: // 0.075 GeV
2474 fSinglePtCut = 0.075;
2476 case 5: // 0.125 GeV
2477 fSinglePtCut = 0.125;
2480 fSinglePtCut = 0.040;
2486 AliError(Form("singlePtCut not defined %d",singlePtCut));
2491 ///________________________________________________________________________
2492 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2507 case 4: // 95% of findable clusters
2508 fMinClsTPCToF= 0.95;
2509 fUseCorrectedTPCClsInfo=1;
2511 case 5: // 0% of findable clusters
2513 fUseCorrectedTPCClsInfo=1;
2515 case 6: // 70% of findable clusters
2517 fUseCorrectedTPCClsInfo=1;
2519 case 7: // 0% of findable clusters
2520 fMinClsTPCToF= 0.35;
2521 fUseCorrectedTPCClsInfo=0;
2524 fMinClsTPCToF= 0.35;
2525 fUseCorrectedTPCClsInfo=1;
2529 fUseCorrectedTPCClsInfo=1;
2532 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2537 ///________________________________________________________________________
2538 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2540 switch(ededxSigmaCut){
2542 fPIDnSigmaBelowElectronLine=-10;
2543 fPIDnSigmaAboveElectronLine=10;
2546 fPIDnSigmaBelowElectronLine=-5;
2547 fPIDnSigmaAboveElectronLine=5;
2550 fPIDnSigmaBelowElectronLine=-3;
2551 fPIDnSigmaAboveElectronLine=5;
2554 fPIDnSigmaBelowElectronLine=-4;
2555 fPIDnSigmaAboveElectronLine=5;
2558 fPIDnSigmaBelowElectronLine=-6;
2559 fPIDnSigmaAboveElectronLine=7;
2562 fPIDnSigmaBelowElectronLine=-4;
2563 fPIDnSigmaAboveElectronLine=4;
2566 fPIDnSigmaBelowElectronLine=-2.5;
2567 fPIDnSigmaAboveElectronLine=4;
2570 fPIDnSigmaBelowElectronLine=-2;
2571 fPIDnSigmaAboveElectronLine=3.5;
2574 AliError("TPCdEdxCutElectronLine not defined");
2580 ///________________________________________________________________________
2581 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2584 switch(pidedxSigmaCut){
2586 fPIDnSigmaAbovePionLine=-10;
2587 fPIDnSigmaAbovePionLineHighPt=-10;
2590 fPIDnSigmaAbovePionLine=0;
2591 fPIDnSigmaAbovePionLineHighPt=-10;
2594 fPIDnSigmaAbovePionLine=1;
2595 fPIDnSigmaAbovePionLineHighPt=-10;
2598 fPIDnSigmaAbovePionLine=2.5;
2599 fPIDnSigmaAbovePionLineHighPt=-10;
2602 fPIDnSigmaAbovePionLine=0.5;
2603 fPIDnSigmaAbovePionLineHighPt=-10;
2606 fPIDnSigmaAbovePionLine=2.;
2607 fPIDnSigmaAbovePionLineHighPt=-10;
2610 fPIDnSigmaAbovePionLine=2.;
2611 fPIDnSigmaAbovePionLineHighPt=0.5;
2614 fPIDnSigmaAbovePionLine=3.5;
2615 fPIDnSigmaAbovePionLineHighPt=-10;
2618 fPIDnSigmaAbovePionLine=2.;
2619 fPIDnSigmaAbovePionLineHighPt=1.;
2622 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2623 fPIDnSigmaAbovePionLineHighPt=-10;
2626 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2631 ///________________________________________________________________________
2632 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2634 switch(piMomdedxSigmaCut){
2636 fPIDMinPnSigmaAbovePionLine=0.5;
2639 fPIDMinPnSigmaAbovePionLine=1.;
2642 fPIDMinPnSigmaAbovePionLine=1.5;
2645 fPIDMinPnSigmaAbovePionLine=20.;
2648 fPIDMinPnSigmaAbovePionLine=50.;
2651 fPIDMinPnSigmaAbovePionLine=0.3;
2654 fPIDMinPnSigmaAbovePionLine=0.25;
2657 fPIDMinPnSigmaAbovePionLine=0.4;
2660 fPIDMinPnSigmaAbovePionLine=0.2;
2663 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2668 ///________________________________________________________________________
2669 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2671 switch(piMaxMomdedxSigmaCut){
2673 fPIDMaxPnSigmaAbovePionLine=100.;
2676 fPIDMaxPnSigmaAbovePionLine=5.;
2679 fPIDMaxPnSigmaAbovePionLine=4.;
2682 fPIDMaxPnSigmaAbovePionLine=3.5;
2685 fPIDMaxPnSigmaAbovePionLine=3.;
2688 fPIDMaxPnSigmaAbovePionLine=7.;
2691 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2696 ///________________________________________________________________________
2697 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2699 switch(LowPRejectionSigmaCut){
2701 fPIDnSigmaAtLowPAroundKaonLine=0;
2702 fPIDnSigmaAtLowPAroundProtonLine=0;
2703 fPIDnSigmaAtLowPAroundPionLine=0;
2704 fDoKaonRejectionLowP = kFALSE;
2705 fDoProtonRejectionLowP = kFALSE;
2706 fDoPionRejectionLowP = kFALSE;
2707 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2710 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2711 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2712 fPIDnSigmaAtLowPAroundPionLine=0.5;
2713 fDoKaonRejectionLowP = kTRUE;
2714 fDoProtonRejectionLowP = kTRUE;
2715 fDoPionRejectionLowP = kTRUE;
2716 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2719 fPIDnSigmaAtLowPAroundKaonLine=1;
2720 fPIDnSigmaAtLowPAroundProtonLine=1;
2721 fPIDnSigmaAtLowPAroundPionLine=1;
2722 fDoKaonRejectionLowP = kTRUE;
2723 fDoProtonRejectionLowP = kTRUE;
2724 fDoPionRejectionLowP = kTRUE;
2725 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2728 fPIDnSigmaAtLowPAroundKaonLine=2.;
2729 fPIDnSigmaAtLowPAroundProtonLine=2.;
2730 fPIDnSigmaAtLowPAroundPionLine=2.;
2731 fDoKaonRejectionLowP = kTRUE;
2732 fDoProtonRejectionLowP = kTRUE;
2733 fDoPionRejectionLowP = kTRUE;
2734 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2737 fPIDnSigmaAtLowPAroundKaonLine=0.;
2738 fPIDnSigmaAtLowPAroundProtonLine=0.;
2739 fPIDnSigmaAtLowPAroundPionLine=1;
2740 fDoKaonRejectionLowP = kFALSE;
2741 fDoProtonRejectionLowP = kFALSE;
2742 fDoPionRejectionLowP = kTRUE;
2743 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2746 fPIDnSigmaAtLowPAroundKaonLine=0.;
2747 fPIDnSigmaAtLowPAroundProtonLine=0.;
2748 fPIDnSigmaAtLowPAroundPionLine=1.5;
2749 fDoKaonRejectionLowP = kFALSE;
2750 fDoProtonRejectionLowP = kFALSE;
2751 fDoPionRejectionLowP = kTRUE;
2752 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2755 fPIDnSigmaAtLowPAroundKaonLine=0.;
2756 fPIDnSigmaAtLowPAroundProtonLine=0.;
2757 fPIDnSigmaAtLowPAroundPionLine=2.;
2758 fDoKaonRejectionLowP = kFALSE;
2759 fDoProtonRejectionLowP = kFALSE;
2760 fDoPionRejectionLowP = kTRUE;
2761 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2764 fPIDnSigmaAtLowPAroundKaonLine=0.;
2765 fPIDnSigmaAtLowPAroundProtonLine=0.;
2766 fPIDnSigmaAtLowPAroundPionLine=0.5;
2767 fDoKaonRejectionLowP = kFALSE;
2768 fDoProtonRejectionLowP = kFALSE;
2769 fDoPionRejectionLowP = kTRUE;
2770 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2773 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2778 ///________________________________________________________________________
2779 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2781 switch(TOFelectronPID){
2783 fUseTOFpid = kFALSE;
2784 fTofPIDnSigmaBelowElectronLine=-100;
2785 fTofPIDnSigmaAboveElectronLine=100;
2789 fTofPIDnSigmaBelowElectronLine=-7;
2790 fTofPIDnSigmaAboveElectronLine=7;
2794 fTofPIDnSigmaBelowElectronLine=-5;
2795 fTofPIDnSigmaAboveElectronLine=5;
2799 fTofPIDnSigmaBelowElectronLine=-3;
2800 fTofPIDnSigmaAboveElectronLine=5;
2804 fTofPIDnSigmaBelowElectronLine=-2;
2805 fTofPIDnSigmaAboveElectronLine=3;
2809 fTofPIDnSigmaBelowElectronLine=-3;
2810 fTofPIDnSigmaAboveElectronLine=3;
2813 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2818 ///________________________________________________________________________
2819 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2824 fDoQtGammaSelection=kFALSE;
2864 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2869 ///________________________________________________________________________
2870 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2873 switch(chi2GammaCut){
2875 fChi2CutConversion = 100.;
2878 fChi2CutConversion = 50.;
2881 fChi2CutConversion = 30.;
2884 fChi2CutConversion = 200.;
2887 fChi2CutConversion = 500.;
2890 fChi2CutConversion = 100000.;
2893 fChi2CutConversion = 5.;
2896 fChi2CutConversion = 10.;
2899 fChi2CutConversion = 20.;
2902 fChi2CutConversion = 15.;
2905 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2910 ///________________________________________________________________________
2911 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2915 fPsiPairCut = 10000; //
2918 fPsiPairCut = 0.1; //
2921 fPsiPairCut = 0.05; // Standard
2924 fPsiPairCut = 0.035; //
2927 fPsiPairCut = 0.2; //
2930 fPsiPairCut = 0.1; //
2931 fDo2DPsiPairChi2 = kTRUE;
2934 fPsiPairCut = 0.05; //
2935 fDo2DPsiPairChi2 = kTRUE;
2938 fPsiPairCut = 0.035; //
2939 fDo2DPsiPairChi2 = kTRUE;
2942 fPsiPairCut = 0.2; //
2943 fDo2DPsiPairChi2 = kTRUE; //
2946 fPsiPairCut = 0.5; //
2949 AliError(Form("PsiPairCut not defined %d",psiCut));
2955 ///________________________________________________________________________
2956 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2958 switch(doPhotonAsymmetryCut){
2960 fDoPhotonAsymmetryCut=0;
2961 fMinPPhotonAsymmetryCut=100.;
2962 fMinPhotonAsymmetry=0.;
2965 fDoPhotonAsymmetryCut=1;
2966 fMinPPhotonAsymmetryCut=3.5;
2967 fMinPhotonAsymmetry=0.04;
2970 fDoPhotonAsymmetryCut=1;
2971 fMinPPhotonAsymmetryCut=3.5;
2972 fMinPhotonAsymmetry=0.06;
2975 fDoPhotonAsymmetryCut=1;
2976 fMinPPhotonAsymmetryCut=0.0;
2977 fMinPhotonAsymmetry=0.05;
2980 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2983 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2986 ///________________________________________________________________________
2987 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2997 fCosPAngleCut = 0.5;
3000 fCosPAngleCut = 0.75;
3003 fCosPAngleCut = 0.85;
3006 fCosPAngleCut = 0.88;
3009 fCosPAngleCut = 0.9;
3012 fCosPAngleCut = 0.95;
3015 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
3021 ///________________________________________________________________________
3022 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
3026 fDoSharedElecCut = kFALSE;
3027 fDoPhotonQualitySelectionCut = kFALSE;
3028 fPhotonQualityCut = 0;
3031 fDoSharedElecCut = kTRUE;
3032 fDoPhotonQualitySelectionCut = kFALSE;
3033 fPhotonQualityCut = 0;
3036 fDoSharedElecCut = kFALSE;
3037 fDoPhotonQualitySelectionCut = kTRUE;
3038 fPhotonQualityCut = 1;
3041 fDoSharedElecCut = kFALSE;
3042 fDoPhotonQualitySelectionCut = kTRUE;
3043 fPhotonQualityCut = 2;
3046 fDoSharedElecCut = kFALSE;
3047 fDoPhotonQualitySelectionCut = kTRUE;
3048 fPhotonQualityCut = 3;
3051 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3057 ///________________________________________________________________________
3058 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3062 fDoToCloseV0sCut = kFALSE;
3066 fDoToCloseV0sCut = kTRUE;
3070 fDoToCloseV0sCut = kTRUE;
3074 fDoToCloseV0sCut = kTRUE;
3078 AliError(Form("Shared Electron Cut not defined %d",toClose));
3083 ///________________________________________________________________________
3084 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3086 switch(TRDElectronCut){
3092 fPIDTRDEfficiency=0.1;
3096 fPIDTRDEfficiency=0.8;
3100 fPIDTRDEfficiency=0.9;
3103 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3110 ///________________________________________________________________________
3111 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3113 switch(DCAZPhotonPrimVtx){
3115 fDCAZPrimVtxCut = 1000;
3118 fDCAZPrimVtxCut = 10;
3121 fDCAZPrimVtxCut = 5;
3124 fDCAZPrimVtxCut = 4;
3127 fDCAZPrimVtxCut = 3;
3130 fDCAZPrimVtxCut = 2.5;
3133 fDCAZPrimVtxCut = 2;
3136 fDCAZPrimVtxCut = 1.5;
3139 fDCAZPrimVtxCut = 1;
3142 fDCAZPrimVtxCut = 0.5;
3145 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3151 ///________________________________________________________________________
3152 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3154 switch(DCARPhotonPrimVtx){
3156 fDCARPrimVtxCut = 1000;
3159 fDCARPrimVtxCut = 10;
3162 fDCARPrimVtxCut = 5;
3165 fDCARPrimVtxCut = 4;
3168 fDCARPrimVtxCut = 3;
3171 fDCARPrimVtxCut = 2.5;
3174 fDCARPrimVtxCut = 2;
3177 fDCARPrimVtxCut = 1.5;
3180 fDCARPrimVtxCut = 1;
3183 fDCARPrimVtxCut = 0.5;
3186 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3192 ///________________________________________________________________________
3193 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3197 fInPlaneOutOfPlane = 0; // No Event Plane
3200 fInPlaneOutOfPlane = 1; // In-Plane
3203 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3206 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3213 //-------------------------------------------------------------
3214 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3215 { // Get Event Centrality
3217 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3219 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3221 if(fDetectorCentrality==0){
3222 if (fIsHeavyIon==2){
3223 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3225 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3228 if(fDetectorCentrality==1){
3229 return fESDCentrality->GetCentralityPercentile("CL1");
3233 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3235 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3240 //-------------------------------------------------------------
3241 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3242 { // Centrality Selection
3243 if(!fIsHeavyIon)return kTRUE;
3245 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3246 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3248 Double_t centrality=GetCentrality(event);
3249 if(centrality<0)return kFALSE;
3251 Int_t centralityC=0;
3252 if (fModCentralityClass == 0){
3253 centralityC= Int_t(centrality/10);
3254 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3258 else if (fModCentralityClass ==1){
3259 centralityC= Int_t(centrality);
3260 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3262 } else return kFALSE;
3264 else if (fModCentralityClass ==2){
3265 centralityC= Int_t(centrality);
3266 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3271 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3272 Int_t PrimaryTracks10[10][2] =
3285 Int_t PrimaryTracks5a[10][2] =
3298 Int_t PrimaryTracks5b[10][2] =
3313 if(event->IsA()==AliESDEvent::Class()) column = 0;
3314 if(event->IsA()==AliAODEvent::Class()) column = 1;
3316 if (fModCentralityClass == 3){
3318 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3323 centralityC= Int_t(centrality/10);
3324 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3329 else if (fModCentralityClass ==4){
3331 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3336 centralityC= Int_t(centrality);
3337 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3339 } else return kFALSE;
3342 else if (fModCentralityClass ==5){
3344 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3349 centralityC= Int_t(centrality);
3350 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3358 ///________________________________________________________________________
3359 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3360 // Cut on z position of primary vertex
3361 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3362 Double_t fVertexZSPD = 0;
3363 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3365 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3367 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3369 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3372 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3374 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3375 ->GetTask("V0ReaderV1"))->GetPeriodName();
3376 if (periodName.CompareTo("LHC11h")==0){
3377 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3379 if (fIsHeavyIon == 2){
3380 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3381 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3382 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3387 ///________________________________________________________________________
3389 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3390 // returns number of contributors to the vertex
3392 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3394 if (fESDEvent->GetPrimaryVertex() != NULL){
3395 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3396 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3397 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3401 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3402 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3403 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3404 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3406 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3407 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3413 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3415 if (fAODEvent->GetPrimaryVertex() != NULL){
3416 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3417 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3420 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3421 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3422 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3424 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3429 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3433 ///________________________________________________________________________
3435 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3438 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3440 UInt_t isSelected = AliVEvent::kAny;
3441 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3442 // cout << periodName.Data() << endl;
3444 if (fInputHandler==NULL) return kFALSE;
3445 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3446 if (!fTriggerSelectedManually){
3447 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3449 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3450 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3451 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("LHC11f") == 0 || periodName.CompareTo("LHC13g") == 0 ) fOfflineTriggerMask = AliVEvent::kINT7;
3452 else fOfflineTriggerMask = AliVEvent::kMB;
3455 // Get the actual offline trigger mask for the event and AND it with the
3456 // requested mask. If no mask requested select by default the event.
3457 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3458 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3460 if (fOfflineTriggerMask)
3461 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3463 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3467 if (fIsSDDFired) hTriggerClass->Fill(33);
3468 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3469 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3470 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3471 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3472 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3473 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3474 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3475 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3476 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3477 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3478 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3479 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3480 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3481 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3482 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3483 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3484 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3485 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3486 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3487 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3488 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3489 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3490 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3491 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3492 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3493 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3494 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3495 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3496 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3497 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3498 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3499 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3500 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3501 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3502 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3503 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3504 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3505 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3506 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3507 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3508 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3511 if(hTriggerClassSelected && isSelected){
3512 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3513 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3514 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3515 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3516 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3517 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3518 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3519 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3520 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3521 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3522 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3523 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3524 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3525 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3526 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3527 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3528 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3529 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3530 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3531 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3532 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3533 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3534 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3535 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3536 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3537 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3538 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3539 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3540 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3541 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3542 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3543 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3544 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3545 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3546 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3547 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3548 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3549 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3550 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3551 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3552 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3555 if(!isSelected)return kFALSE;
3561 ///________________________________________________________________________
3562 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3563 // Get first TPC row
3564 Int_t firstTPCRow = 0;
3565 Double_t radiusI = 84.8;
3566 Double_t radiusO = 134.6;
3567 Double_t radiusOB = 198.;
3568 Double_t rSizeI = 0.75;
3569 Double_t rSizeO = 1.;
3570 Double_t rSizeOB = 1.5;
3574 if(radius <= radiusI){
3577 if(radius>radiusI && radius<=radiusO){
3578 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3580 if(radius>radiusO && radius<=radiusOB){
3581 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3584 if(radius>radiusOB){
3585 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3591 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3592 ///Check if passes cosine of pointing angle cut
3593 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3599 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3600 // calculates the pointing angle of the recalculated V0
3602 Double_t momV0[3] = {0,0,0};
3603 if(event->IsA()==AliESDEvent::Class()){
3604 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3605 if(!esdEvent) return -999;
3606 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3607 if(!v0) return -999;
3608 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3610 if(event->IsA()==AliAODEvent::Class()){
3611 momV0[0] = photon->GetPx();
3612 momV0[1] = photon->GetPy();
3613 momV0[2] = photon->GetPz();
3616 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3617 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3618 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3619 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3621 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3622 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3625 Double_t cosinePointingAngle = -999;
3626 if(momV02*PosV02 > 0.0)
3627 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3629 return cosinePointingAngle;
3632 ///________________________________________________________________________
3633 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3635 if (fDo2DPsiPairChi2){
3636 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3642 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3648 ///________________________________________________________________________
3649 TString AliConversionCuts::GetCutNumber(){
3650 // returns TString with current cut number
3652 for(Int_t ii=0;ii<kNCuts;ii++){
3653 a.Append(Form("%d",fCuts[ii]));
3658 ///________________________________________________________________________
3659 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3661 Int_t posLabel = photon->GetTrackLabelPositive();
3662 Int_t negLabel = photon->GetTrackLabelNegative();
3664 fElectronLabelArray[nV0*2] = posLabel;
3665 fElectronLabelArray[(nV0*2)+1] = negLabel;
3667 ///________________________________________________________________________
3668 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3670 Int_t posLabel = photon->GetTrackLabelPositive();
3671 Int_t negLabel = photon->GetTrackLabelNegative();
3673 for(Int_t i = 0; i<nV0s*2;i++){
3674 if(i==nV0*2) continue;
3675 if(i==(nV0*2)+1) continue;
3676 if(fElectronLabelArray[i] == posLabel){
3678 if(fElectronLabelArray[i] == negLabel){
3684 ///________________________________________________________________________
3685 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3688 Double_t posX = photon->GetConversionX();
3689 Double_t posY = photon->GetConversionY();
3690 Double_t posZ = photon->GetConversionZ();
3692 for(Int_t i = 0;i<photons->GetEntries();i++){
3693 if(nV0 == i) continue;
3694 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3695 Double_t posCompX = photonComp->GetConversionX();
3696 Double_t posCompY = photonComp->GetConversionY();
3697 Double_t posCompZ = photonComp->GetConversionZ();
3699 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3701 if(dist < fminV0Dist*fminV0Dist){
3702 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3710 ///________________________________________________________________________
3711 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3713 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3716 if(fNotRejectedStart){
3717 delete[] fNotRejectedStart;
3718 fNotRejectedStart = NULL;
3720 if(fNotRejectedEnd){
3721 delete[] fNotRejectedEnd;
3722 fNotRejectedEnd = NULL;
3724 if(fGeneratorNames){
3725 delete[] fGeneratorNames;
3726 fGeneratorNames = NULL;
3729 if(rejection == 0) return; // No Rejection
3731 AliGenCocktailEventHeader *cHeader = 0x0;
3732 AliAODMCHeader *cHeaderAOD = 0x0;
3733 Bool_t headerFound = kFALSE;
3734 AliStack *fMCStack = 0x0;
3735 TClonesArray *fMCStackAOD = 0x0;
3736 if(MCEvent->IsA()==AliMCEvent::Class()){
3737 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3738 if(cHeader) headerFound = kTRUE;
3739 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3741 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3742 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3743 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3746 if(cHeaderAOD) headerFound = kTRUE;
3750 TList *genHeaders = 0x0;
3751 if(cHeader) genHeaders = cHeader->GetHeaders();
3753 genHeaders = cHeaderAOD->GetCocktailHeaders();
3754 if(genHeaders->GetEntries()==1){
3755 SetRejectExtraSignalsCut(0);
3759 AliGenEventHeader* gh = 0;
3761 Int_t firstindexA = 0;
3762 Int_t lastindexA = -1;
3763 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3764 if(rejection == 2){ // TList of Headers Names
3765 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3766 gh = (AliGenEventHeader*)genHeaders->At(i);
3767 TString GeneratorName = gh->GetName();
3768 lastindexA = lastindexA + gh->NProduced();
3769 // cout << i << "\t" << GeneratorName.Data() << endl;
3770 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3771 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3772 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3773 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3775 if (fMCStack->Particle(firstindexA)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA)->GetPdgCode() == 221 ) {
3776 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1b")==0 ){
3777 if (gh->NProduced() > 10 && (fMCStack->Particle(firstindexA+10)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA+10)->GetPdgCode() == 221 )){
3788 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3789 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3790 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1b")==0 ){
3791 if (gh->NProduced() > 10 && (fMCStack->Particle(firstindexA+10)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA+10)->GetPdgCode() == 221 )){
3806 firstindexA = firstindexA + gh->NProduced();
3810 fNotRejectedStart = new Int_t[fnHeaders];
3811 fNotRejectedEnd = new Int_t[fnHeaders];
3812 fGeneratorNames = new TString[fnHeaders];
3814 if(rejection == 1 || rejection == 3){
3815 fNotRejectedStart[0] = 0;
3816 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3817 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3821 Int_t firstindex = 0;
3822 Int_t lastindex = -1;
3824 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3825 gh = (AliGenEventHeader*)genHeaders->At(i);
3826 TString GeneratorName = gh->GetName();
3827 lastindex = lastindex + gh->NProduced();
3828 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3829 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3830 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3831 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3833 if (fMCStack->Particle(firstindex)->GetPdgCode() == 111 || fMCStack->Particle(firstindex)->GetPdgCode() == 221 ) {
3834 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1b")==0 ){
3835 if (gh->NProduced() > 10 && (fMCStack->Particle(firstindexA+10)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA+10)->GetPdgCode() == 221 )){
3836 fNotRejectedStart[number] = firstindex;
3837 fNotRejectedEnd[number] = lastindex;
3838 fGeneratorNames[number] = GeneratorName;
3843 fNotRejectedStart[number] = firstindex;
3844 fNotRejectedEnd[number] = lastindex;
3845 fGeneratorNames[number] = GeneratorName;
3852 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3853 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3854 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1b")==0 ){
3855 if (gh->NProduced() > 10 && (fMCStack->Particle(firstindexA+10)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA+10)->GetPdgCode() == 221 )){
3856 fNotRejectedStart[number] = firstindex;
3857 fNotRejectedEnd[number] = lastindex;
3858 fGeneratorNames[number] = GeneratorName;
3863 fNotRejectedStart[number] = firstindex;
3864 fNotRejectedEnd[number] = lastindex;
3865 fGeneratorNames[number] = GeneratorName;
3873 fNotRejectedStart[number] = firstindex;
3874 fNotRejectedEnd[number] = lastindex;
3875 fGeneratorNames[number] = GeneratorName;
3876 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3882 firstindex = firstindex + gh->NProduced();
3884 } else { // No Cocktail Header Found
3885 fNotRejectedStart = new Int_t[1];
3886 fNotRejectedEnd = new Int_t[1];
3889 fNotRejectedStart[0] = 0;
3890 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3891 fGeneratorNames = new TString[1];
3892 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3894 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3895 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3896 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3897 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3898 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3899 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3901 SetRejectExtraSignalsCut(0);
3905 //_________________________________________________________________________
3906 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3908 // Not Accepted == kFALSE == 0
3909 // Accepted == kTRUE == 1
3910 // FirstHeader == kTRUE == 3
3911 if(index < 0) return 0; // No Particle
3914 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3915 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3916 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3917 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3919 for(Int_t i = 0;i<fnHeaders;i++){
3920 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3922 if(i == 0) accepted = 2; // MB Header
3926 else if(InputEvent->IsA()==AliAODEvent::Class()){
3927 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3928 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3929 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3930 if(!aodMCParticle->IsPrimary()){
3931 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3932 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3934 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3935 for(Int_t i = 0;i<fnHeaders;i++){
3936 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3938 if(i == 0) accepted = 2; // MB Header
3946 //_________________________________________________________________________
3947 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
3949 if ( !IsTriggerSelected(InputEvent) )
3952 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
3953 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3956 if(isHeavyIon == 0 && GetIsFromPileup()){
3957 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3959 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3963 Bool_t hasV0And = ReaderCuts->HasV0AND();
3964 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3965 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
3966 return 7; // With SDD requested but no fired
3968 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3969 return 8; // V0AND requested but no fired
3971 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
3972 if(hCentralityVsNumberOfPrimaryTracks)
3973 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
3974 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3975 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
3980 //_________________________________________________________________________
3981 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3982 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") ||
3983 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
3986 for (Int_t i = 0; i < fnHeaders; i++){
3987 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
3988 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
3990 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
3992 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
3993 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
3994 fGeneratorNames[i].Contains("hijing")){
3996 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
3998 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
4000 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
4002 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
4004 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
4006 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
4009 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") ){
4014 if (kCaseGen == 0) return 1;
4017 Double_t mesonPt = 0;
4018 Double_t mesonMass = 0;
4020 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4021 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
4022 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
4023 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
4025 else if(InputEvent->IsA()==AliAODEvent::Class()){
4026 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4027 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4028 mesonPt = aodMCParticle->Pt();
4029 mesonMass = aodMCParticle->GetCalcMass();
4030 PDGCode = aodMCParticle->GetPdgCode();
4033 Float_t functionResultMC = 1.;
4034 if (kCaseGen == 1){ // Pythia 6
4035 Float_t dNdyMC = 2.1462;
4036 Float_t nMC = 7.06055;
4037 Float_t tMC = 0.12533;
4038 if ( PDGCode == 111){
4042 } else if ( PDGCode == 221){
4047 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);
4048 } else if (kCaseGen == 2){ // Phojet
4049 Float_t dNdyMC = 2.35978;
4050 Float_t nMC = 6.81795;
4051 Float_t tMC = 0.11492;
4052 if ( PDGCode == 111){
4056 } else if ( PDGCode == 221){
4061 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);
4062 } else if (kCaseGen == 4){ // BOX generators pp
4063 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4064 Float_t a = 0.23437;
4066 Float_t c = -1430.5863;
4067 Float_t d = -0.6966624;
4068 Float_t e = 252.3742;
4069 if ( PDGCode == 111){
4075 } else if ( PDGCode == 221){
4082 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4083 // cout << functionResultMC << endl;
4084 } else if (kCaseGen == 3 ){ // HIJING
4085 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4086 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4088 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4089 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4091 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4092 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4096 Float_t functionResultData = 1;
4097 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4098 Float_t dNdyData = 2.2328;
4099 Float_t nData = 7.1473;
4100 Float_t tData = 0.1346;
4101 if ( PDGCode == 111){
4105 } else if ( PDGCode == 221){
4106 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4110 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);
4111 // cout << functionResultData << endl;
4113 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4114 functionResultData = fFitDataPi0->Eval(mesonPt);
4116 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4117 functionResultData = fFitDataEta->Eval(mesonPt);
4119 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4120 functionResultData = fFitDataK0s->Eval(mesonPt);
4125 Double_t weight = 1;
4126 if (PDGCode == 111 || PDGCode == 221){
4127 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4128 weight = functionResultData/functionResultMC;
4129 if ( kCaseGen == 3){
4130 if (PDGCode == 111){
4131 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4135 if (PDGCode == 221){
4136 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4141 if (!isfinite(functionResultData)) weight = 1.;
4142 if (!isfinite(weight)) weight = 1.;
4144 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4145 weight = functionResultMC;
4148 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4149 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4153 ///________________________________________________________________________
4154 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4155 //Create and return standard 2010 PbPb cuts
4156 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4157 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4158 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4162 ///________________________________________________________________________
4163 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4164 //Create and return standard 2010 PbPb cuts
4165 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4166 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4167 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4170 ///________________________________________________________________________
4171 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4173 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4174 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4175 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4176 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4177 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4178 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4179 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4180 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4181 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4182 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4183 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4184 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4185 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4186 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4187 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4188 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4189 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4190 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4191 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4192 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4193 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4194 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4195 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4196 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4197 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4198 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4199 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4200 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4201 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4202 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4204 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4205 SetEtaShift(-0.465);
4207 else if(periodName.CompareTo("LHC13f") == 0 ||
4208 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4209 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4210 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4212 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4213 SetEtaShift(+0.465);
4215 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4218 ///________________________________________________________________________
4219 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4221 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4222 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4223 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4224 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4225 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4227 if(!fInPlaneOutOfPlane){
4228 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4231 else if(fInPlaneOutOfPlane == 1){
4232 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4233 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4238 else if(fInPlaneOutOfPlane == 2){
4239 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4240 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);