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
1109 if (fDoPhotonQualitySelectionCut && photonAOD->GetPhotonQuality() != fPhotonQualityCut){
1110 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1115 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1117 // Histos after Cuts
1118 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1119 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1120 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1125 ///________________________________________________________________________
1126 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1127 { //Cut on corrected TPC Cluster Info
1129 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1130 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1132 if(!negTrack||!posTrack)return kFALSE;
1134 Double_t negclsToF=0;
1136 if (!fUseCorrectedTPCClsInfo ){
1137 if(negTrack->GetTPCNclsF()!=0){
1138 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1141 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1144 Double_t posclsToF = 0.;
1145 if (!fUseCorrectedTPCClsInfo ){
1146 if(posTrack->GetTPCNclsF()!=0){
1147 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1150 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1153 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1160 ///________________________________________________________________________
1161 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1163 //Selection of Reconstructed Photons
1165 FillPhotonCutIndex(kPhotonIn);
1167 if(event->IsA()==AliESDEvent::Class()) {
1168 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1169 FillPhotonCutIndex(kOnFly);
1173 // else if(event->IsA()==AliAODEvent::Class()) {
1174 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1175 // FillPhotonCutIndex(kOnFly);
1181 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1182 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1184 if(!negTrack || !posTrack) {
1185 FillPhotonCutIndex(kNoTracks);
1188 photon->DeterminePhotonQuality(negTrack,posTrack);
1190 if(!TracksAreSelected(negTrack, posTrack)){
1191 FillPhotonCutIndex(kTrackCuts);
1194 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1196 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1197 FillPhotonCutIndex(kdEdxCuts);
1200 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1202 if(!PhotonCuts(photon,event)){
1203 FillPhotonCutIndex(kPhotonCuts);
1207 // Photon passed cuts
1208 FillPhotonCutIndex(kPhotonOut);
1212 ///________________________________________________________________________
1213 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1214 { // 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());
2096 ///________________________________________________________________________
2097 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2105 fDetectorCentrality=0;
2109 fDetectorCentrality=1;
2111 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2113 fDetectorCentrality=0;
2114 fModCentralityClass=1;
2116 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2118 fDetectorCentrality=0;
2119 fModCentralityClass=2;
2121 case 5: //strict cut on v0 tracks for MC
2123 fDetectorCentrality=0;
2124 fModCentralityClass=3;
2126 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2127 //strict cut on v0 tracks for MC
2129 fDetectorCentrality=0;
2130 fModCentralityClass=4;
2132 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2133 //strict cut on v0 tracks for MC
2135 fDetectorCentrality=0;
2136 fModCentralityClass=5;
2140 fDetectorCentrality=0;
2144 fDetectorCentrality=1;
2147 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2153 //___________________________________________________________________
2154 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2157 if(minCentrality<0||minCentrality>9){
2158 AliError(Form("minCentrality not defined %d",minCentrality));
2162 fCentralityMin=minCentrality;
2165 //___________________________________________________________________
2166 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2169 if(maxCentrality<0||maxCentrality>9){
2170 AliError(Form("maxCentrality not defined %d",maxCentrality));
2173 fCentralityMax=maxCentrality;
2176 ///________________________________________________________________________
2177 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2180 switch(selectSpecialTrigger){
2182 fSpecialTrigger=0; // dont care
2185 fSpecialTrigger=1; // V0AND
2188 fSpecialTrigger=2; // with SDD requested
2191 fSpecialTrigger=3; // V0AND plus with SDD requested
2193 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2195 fSpecialTrigger=4; // different trigger class as MB
2196 fTriggerSelectedManually = kTRUE;
2199 fSpecialTrigger=4; // different trigger class as MB
2200 fTriggerSelectedManually = kTRUE;
2203 fSpecialTrigger=4; // different trigger class as MB
2204 fTriggerSelectedManually = kTRUE;
2207 fSpecialTrigger=4; // different trigger class as MB
2208 fTriggerSelectedManually = kTRUE;
2211 fSpecialTrigger=4; // different trigger class as MB
2212 fTriggerSelectedManually = kTRUE;
2215 fSpecialTrigger=4; // different trigger class as MB
2216 fTriggerSelectedManually = kTRUE;
2219 AliError("Warning: Special Trigger Not known");
2224 ///________________________________________________________________________
2225 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2228 fMultiplicityMethod=multiplicityMethod;
2230 // 0 Photon Multiplicity
2231 // 1 TPC Track multiplicity
2237 ///________________________________________________________________________
2238 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2240 switch(removePileUp){
2242 fRemovePileUp=kFALSE;
2245 fRemovePileUp=kTRUE;
2248 AliError("RemovePileUpCut not defined");
2253 ///________________________________________________________________________
2254 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2256 switch(extraSignal){
2258 fRejectExtraSignals = 0;
2259 break; // No Rejection
2261 fRejectExtraSignals = 1;
2262 break; // MinBias Header
2264 fRejectExtraSignals = 2;
2265 break; // User String Array
2267 fRejectExtraSignals = 3;
2268 break; // Rejection for Gamma Correction only
2270 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2275 ///________________________________________________________________________
2276 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2278 switch (v0FinderType){
2279 case 0: // on fly V0 finder
2280 cout << "have chosen onfly V0" << endl;
2281 fUseOnFlyV0Finder=kTRUE;
2283 case 1: // offline V0 finder
2284 cout << "have chosen offline V0" << endl;
2285 fUseOnFlyV0Finder=kFALSE;
2288 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2293 ///________________________________________________________________________
2294 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2297 //Set Standard LineCutZValues
2298 fLineCutZValueMin = -2;
2299 fLineCutZValue = 7.;
2304 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2306 fLineCutZRSlopeMin = 0.;
2308 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2310 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2312 fLineCutZRSlopeMin = 0.;
2316 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2318 fLineCutZRSlopeMin = 0.;
2322 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2324 fLineCutZRSlopeMin = 0.;
2328 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2330 fLineCutZRSlopeMin = 0.;
2334 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2336 fLineCutZRSlopeMin = 0.;
2340 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2342 fLineCutZRSlopeMin = 0.;
2345 if (fIsHeavyIon==1){
2347 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2349 fLineCutZRSlopeMin = 0.;
2353 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2355 fLineCutZRSlopeMin = 0.;
2358 // case 8: // 0.1 - 0.8
2360 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2361 // fEtaCutMin = 0.1;
2362 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2366 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2368 fLineCutZRSlopeMin = 0.;
2372 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2374 fLineCutZRSlopeMin = 0.;
2377 AliError(Form(" EtaCut not defined %d",etaCut));
2382 ///________________________________________________________________________
2383 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2406 // High purity cuts for PbPb (remove first layers of material)
2429 AliError("RCut not defined");
2434 ///________________________________________________________________________
2435 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2437 switch(singlePtCut){
2438 case 0: // 0.050 GeV
2439 fSinglePtCut = 0.050;
2441 case 1: // 0.100 GeV
2442 fSinglePtCut = 0.100;
2444 case 2: // 0.150 GeV
2445 fSinglePtCut = 0.150;
2447 case 3: // 0.200 GeV
2448 fSinglePtCut = 0.200;
2450 case 4: // 0.075 GeV
2451 fSinglePtCut = 0.075;
2453 case 5: // 0.125 GeV
2454 fSinglePtCut = 0.125;
2457 fSinglePtCut = 0.040;
2463 AliError(Form("singlePtCut not defined %d",singlePtCut));
2468 ///________________________________________________________________________
2469 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2484 case 4: // 95% of findable clusters
2485 fMinClsTPCToF= 0.95;
2486 fUseCorrectedTPCClsInfo=1;
2488 case 5: // 0% of findable clusters
2490 fUseCorrectedTPCClsInfo=1;
2492 case 6: // 70% of findable clusters
2494 fUseCorrectedTPCClsInfo=1;
2496 case 7: // 0% of findable clusters
2497 fMinClsTPCToF= 0.35;
2498 fUseCorrectedTPCClsInfo=0;
2501 fMinClsTPCToF= 0.35;
2502 fUseCorrectedTPCClsInfo=1;
2506 fUseCorrectedTPCClsInfo=1;
2509 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2514 ///________________________________________________________________________
2515 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2517 switch(ededxSigmaCut){
2519 fPIDnSigmaBelowElectronLine=-10;
2520 fPIDnSigmaAboveElectronLine=10;
2523 fPIDnSigmaBelowElectronLine=-5;
2524 fPIDnSigmaAboveElectronLine=5;
2527 fPIDnSigmaBelowElectronLine=-3;
2528 fPIDnSigmaAboveElectronLine=5;
2531 fPIDnSigmaBelowElectronLine=-4;
2532 fPIDnSigmaAboveElectronLine=5;
2535 fPIDnSigmaBelowElectronLine=-6;
2536 fPIDnSigmaAboveElectronLine=7;
2539 fPIDnSigmaBelowElectronLine=-4;
2540 fPIDnSigmaAboveElectronLine=4;
2543 fPIDnSigmaBelowElectronLine=-2.5;
2544 fPIDnSigmaAboveElectronLine=4;
2547 fPIDnSigmaBelowElectronLine=-2;
2548 fPIDnSigmaAboveElectronLine=3.5;
2551 AliError("TPCdEdxCutElectronLine not defined");
2557 ///________________________________________________________________________
2558 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2561 switch(pidedxSigmaCut){
2563 fPIDnSigmaAbovePionLine=-10;
2564 fPIDnSigmaAbovePionLineHighPt=-10;
2567 fPIDnSigmaAbovePionLine=0;
2568 fPIDnSigmaAbovePionLineHighPt=-10;
2571 fPIDnSigmaAbovePionLine=1;
2572 fPIDnSigmaAbovePionLineHighPt=-10;
2575 fPIDnSigmaAbovePionLine=2.5;
2576 fPIDnSigmaAbovePionLineHighPt=-10;
2579 fPIDnSigmaAbovePionLine=0.5;
2580 fPIDnSigmaAbovePionLineHighPt=-10;
2583 fPIDnSigmaAbovePionLine=2.;
2584 fPIDnSigmaAbovePionLineHighPt=-10;
2587 fPIDnSigmaAbovePionLine=2.;
2588 fPIDnSigmaAbovePionLineHighPt=0.5;
2591 fPIDnSigmaAbovePionLine=3.5;
2592 fPIDnSigmaAbovePionLineHighPt=-10;
2595 fPIDnSigmaAbovePionLine=2.;
2596 fPIDnSigmaAbovePionLineHighPt=1.;
2599 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2600 fPIDnSigmaAbovePionLineHighPt=-10;
2603 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2608 ///________________________________________________________________________
2609 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2611 switch(piMomdedxSigmaCut){
2613 fPIDMinPnSigmaAbovePionLine=0.5;
2616 fPIDMinPnSigmaAbovePionLine=1.;
2619 fPIDMinPnSigmaAbovePionLine=1.5;
2622 fPIDMinPnSigmaAbovePionLine=20.;
2625 fPIDMinPnSigmaAbovePionLine=50.;
2628 fPIDMinPnSigmaAbovePionLine=0.3;
2631 fPIDMinPnSigmaAbovePionLine=0.25;
2634 fPIDMinPnSigmaAbovePionLine=0.4;
2637 fPIDMinPnSigmaAbovePionLine=0.2;
2640 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2645 ///________________________________________________________________________
2646 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2648 switch(piMaxMomdedxSigmaCut){
2650 fPIDMaxPnSigmaAbovePionLine=100.;
2653 fPIDMaxPnSigmaAbovePionLine=5.;
2656 fPIDMaxPnSigmaAbovePionLine=4.;
2659 fPIDMaxPnSigmaAbovePionLine=3.5;
2662 fPIDMaxPnSigmaAbovePionLine=3.;
2665 fPIDMaxPnSigmaAbovePionLine=7.;
2668 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2673 ///________________________________________________________________________
2674 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2676 switch(LowPRejectionSigmaCut){
2678 fPIDnSigmaAtLowPAroundKaonLine=0;
2679 fPIDnSigmaAtLowPAroundProtonLine=0;
2680 fPIDnSigmaAtLowPAroundPionLine=0;
2681 fDoKaonRejectionLowP = kFALSE;
2682 fDoProtonRejectionLowP = kFALSE;
2683 fDoPionRejectionLowP = kFALSE;
2684 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2687 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2688 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2689 fPIDnSigmaAtLowPAroundPionLine=0.5;
2690 fDoKaonRejectionLowP = kTRUE;
2691 fDoProtonRejectionLowP = kTRUE;
2692 fDoPionRejectionLowP = kTRUE;
2693 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2696 fPIDnSigmaAtLowPAroundKaonLine=1;
2697 fPIDnSigmaAtLowPAroundProtonLine=1;
2698 fPIDnSigmaAtLowPAroundPionLine=1;
2699 fDoKaonRejectionLowP = kTRUE;
2700 fDoProtonRejectionLowP = kTRUE;
2701 fDoPionRejectionLowP = kTRUE;
2702 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2705 fPIDnSigmaAtLowPAroundKaonLine=2.;
2706 fPIDnSigmaAtLowPAroundProtonLine=2.;
2707 fPIDnSigmaAtLowPAroundPionLine=2.;
2708 fDoKaonRejectionLowP = kTRUE;
2709 fDoProtonRejectionLowP = kTRUE;
2710 fDoPionRejectionLowP = kTRUE;
2711 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2714 fPIDnSigmaAtLowPAroundKaonLine=0.;
2715 fPIDnSigmaAtLowPAroundProtonLine=0.;
2716 fPIDnSigmaAtLowPAroundPionLine=1;
2717 fDoKaonRejectionLowP = kFALSE;
2718 fDoProtonRejectionLowP = kFALSE;
2719 fDoPionRejectionLowP = kTRUE;
2720 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2723 fPIDnSigmaAtLowPAroundKaonLine=0.;
2724 fPIDnSigmaAtLowPAroundProtonLine=0.;
2725 fPIDnSigmaAtLowPAroundPionLine=1.5;
2726 fDoKaonRejectionLowP = kFALSE;
2727 fDoProtonRejectionLowP = kFALSE;
2728 fDoPionRejectionLowP = kTRUE;
2729 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2732 fPIDnSigmaAtLowPAroundKaonLine=0.;
2733 fPIDnSigmaAtLowPAroundProtonLine=0.;
2734 fPIDnSigmaAtLowPAroundPionLine=2.;
2735 fDoKaonRejectionLowP = kFALSE;
2736 fDoProtonRejectionLowP = kFALSE;
2737 fDoPionRejectionLowP = kTRUE;
2738 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2741 fPIDnSigmaAtLowPAroundKaonLine=0.;
2742 fPIDnSigmaAtLowPAroundProtonLine=0.;
2743 fPIDnSigmaAtLowPAroundPionLine=0.5;
2744 fDoKaonRejectionLowP = kFALSE;
2745 fDoProtonRejectionLowP = kFALSE;
2746 fDoPionRejectionLowP = kTRUE;
2747 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2750 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2755 ///________________________________________________________________________
2756 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2758 switch(TOFelectronPID){
2760 fUseTOFpid = kFALSE;
2761 fTofPIDnSigmaBelowElectronLine=-100;
2762 fTofPIDnSigmaAboveElectronLine=100;
2766 fTofPIDnSigmaBelowElectronLine=-7;
2767 fTofPIDnSigmaAboveElectronLine=7;
2771 fTofPIDnSigmaBelowElectronLine=-5;
2772 fTofPIDnSigmaAboveElectronLine=5;
2776 fTofPIDnSigmaBelowElectronLine=-3;
2777 fTofPIDnSigmaAboveElectronLine=5;
2781 fTofPIDnSigmaBelowElectronLine=-2;
2782 fTofPIDnSigmaAboveElectronLine=3;
2786 fTofPIDnSigmaBelowElectronLine=-3;
2787 fTofPIDnSigmaAboveElectronLine=3;
2790 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2795 ///________________________________________________________________________
2796 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2801 fDoQtGammaSelection=kFALSE;
2841 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2846 ///________________________________________________________________________
2847 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2850 switch(chi2GammaCut){
2852 fChi2CutConversion = 100.;
2855 fChi2CutConversion = 50.;
2858 fChi2CutConversion = 30.;
2861 fChi2CutConversion = 200.;
2864 fChi2CutConversion = 500.;
2867 fChi2CutConversion = 100000.;
2870 fChi2CutConversion = 5.;
2873 fChi2CutConversion = 10.;
2876 fChi2CutConversion = 20.;
2879 fChi2CutConversion = 15.;
2882 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2887 ///________________________________________________________________________
2888 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2892 fPsiPairCut = 10000; //
2895 fPsiPairCut = 0.1; //
2898 fPsiPairCut = 0.05; // Standard
2901 fPsiPairCut = 0.035; //
2904 fPsiPairCut = 0.2; //
2907 fPsiPairCut = 0.1; //
2908 fDo2DPsiPairChi2 = kTRUE;
2911 fPsiPairCut = 0.05; //
2912 fDo2DPsiPairChi2 = kTRUE;
2915 fPsiPairCut = 0.035; //
2916 fDo2DPsiPairChi2 = kTRUE;
2919 fPsiPairCut = 0.2; //
2920 fDo2DPsiPairChi2 = kTRUE; //
2923 fPsiPairCut = 0.5; //
2926 AliError(Form("PsiPairCut not defined %d",psiCut));
2932 ///________________________________________________________________________
2933 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2935 switch(doPhotonAsymmetryCut){
2937 fDoPhotonAsymmetryCut=0;
2938 fMinPPhotonAsymmetryCut=100.;
2939 fMinPhotonAsymmetry=0.;
2942 fDoPhotonAsymmetryCut=1;
2943 fMinPPhotonAsymmetryCut=3.5;
2944 fMinPhotonAsymmetry=0.04;
2947 fDoPhotonAsymmetryCut=1;
2948 fMinPPhotonAsymmetryCut=3.5;
2949 fMinPhotonAsymmetry=0.06;
2952 fDoPhotonAsymmetryCut=1;
2953 fMinPPhotonAsymmetryCut=0.0;
2954 fMinPhotonAsymmetry=0.05;
2957 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2960 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2963 ///________________________________________________________________________
2964 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2974 fCosPAngleCut = 0.5;
2977 fCosPAngleCut = 0.75;
2980 fCosPAngleCut = 0.85;
2983 fCosPAngleCut = 0.88;
2986 fCosPAngleCut = 0.9;
2989 fCosPAngleCut = 0.95;
2992 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2998 ///________________________________________________________________________
2999 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
3003 fDoSharedElecCut = kFALSE;
3004 fDoPhotonQualitySelectionCut = kFALSE;
3007 fDoSharedElecCut = kTRUE;
3008 fDoPhotonQualitySelectionCut = kFALSE;
3011 fDoSharedElecCut = kFALSE;
3012 fDoPhotonQualitySelectionCut = kTRUE;
3013 fPhotonQualityCut = 1;
3015 fDoSharedElecCut = kFALSE;
3016 fDoPhotonQualitySelectionCut = kTRUE;
3017 fPhotonQualityCut = 2;
3019 fDoSharedElecCut = kFALSE;
3020 fDoPhotonQualitySelectionCut = kTRUE;
3021 fPhotonQualityCut = 3;
3023 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3029 ///________________________________________________________________________
3030 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3034 fDoToCloseV0sCut = kFALSE;
3038 fDoToCloseV0sCut = kTRUE;
3042 fDoToCloseV0sCut = kTRUE;
3046 fDoToCloseV0sCut = kTRUE;
3050 AliError(Form("Shared Electron Cut not defined %d",toClose));
3055 ///________________________________________________________________________
3056 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3058 switch(TRDElectronCut){
3064 fPIDTRDEfficiency=0.1;
3068 fPIDTRDEfficiency=0.8;
3072 fPIDTRDEfficiency=0.9;
3075 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3082 ///________________________________________________________________________
3083 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3085 switch(DCAZPhotonPrimVtx){
3087 fDCAZPrimVtxCut = 1000;
3090 fDCAZPrimVtxCut = 10;
3093 fDCAZPrimVtxCut = 5;
3096 fDCAZPrimVtxCut = 4;
3099 fDCAZPrimVtxCut = 3;
3102 fDCAZPrimVtxCut = 2.5;
3105 fDCAZPrimVtxCut = 2;
3108 fDCAZPrimVtxCut = 1.5;
3111 fDCAZPrimVtxCut = 1;
3114 fDCAZPrimVtxCut = 0.5;
3117 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3123 ///________________________________________________________________________
3124 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3126 switch(DCARPhotonPrimVtx){
3128 fDCARPrimVtxCut = 1000;
3131 fDCARPrimVtxCut = 10;
3134 fDCARPrimVtxCut = 5;
3137 fDCARPrimVtxCut = 4;
3140 fDCARPrimVtxCut = 3;
3143 fDCARPrimVtxCut = 2.5;
3146 fDCARPrimVtxCut = 2;
3149 fDCARPrimVtxCut = 1.5;
3152 fDCARPrimVtxCut = 1;
3155 fDCARPrimVtxCut = 0.5;
3158 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3164 ///________________________________________________________________________
3165 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3169 fInPlaneOutOfPlane = 0; // No Event Plane
3172 fInPlaneOutOfPlane = 1; // In-Plane
3175 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3178 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3185 //-------------------------------------------------------------
3186 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3187 { // Get Event Centrality
3189 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3191 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3193 if(fDetectorCentrality==0){
3194 if (fIsHeavyIon==2){
3195 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3197 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3200 if(fDetectorCentrality==1){
3201 return fESDCentrality->GetCentralityPercentile("CL1");
3205 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3207 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3212 //-------------------------------------------------------------
3213 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3214 { // Centrality Selection
3215 if(!fIsHeavyIon)return kTRUE;
3217 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3218 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3220 Double_t centrality=GetCentrality(event);
3221 if(centrality<0)return kFALSE;
3223 Int_t centralityC=0;
3224 if (fModCentralityClass == 0){
3225 centralityC= Int_t(centrality/10);
3226 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3230 else if (fModCentralityClass ==1){
3231 centralityC= Int_t(centrality);
3232 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3234 } else return kFALSE;
3236 else if (fModCentralityClass ==2){
3237 centralityC= Int_t(centrality);
3238 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3243 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3244 Int_t PrimaryTracks10[10][2] =
3257 Int_t PrimaryTracks5a[10][2] =
3270 Int_t PrimaryTracks5b[10][2] =
3285 if(event->IsA()==AliESDEvent::Class()) column = 0;
3286 if(event->IsA()==AliAODEvent::Class()) column = 1;
3288 if (fModCentralityClass == 3){
3290 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3295 centralityC= Int_t(centrality/10);
3296 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3301 else if (fModCentralityClass ==4){
3303 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3308 centralityC= Int_t(centrality);
3309 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3311 } else return kFALSE;
3314 else if (fModCentralityClass ==5){
3316 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3321 centralityC= Int_t(centrality);
3322 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3330 ///________________________________________________________________________
3331 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3332 // Cut on z position of primary vertex
3333 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3334 Double_t fVertexZSPD = 0;
3335 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3337 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3339 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3341 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3344 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3346 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3347 ->GetTask("V0ReaderV1"))->GetPeriodName();
3348 if (periodName.CompareTo("LHC11h")==0){
3349 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3351 if (fIsHeavyIon == 2){
3352 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3353 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3354 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3359 ///________________________________________________________________________
3361 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3362 // returns number of contributors to the vertex
3364 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3366 if (fESDEvent->GetPrimaryVertex() != NULL){
3367 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3368 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3369 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3373 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3374 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3375 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3376 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3378 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3379 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3385 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3387 if (fAODEvent->GetPrimaryVertex() != NULL){
3388 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3389 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3392 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3393 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3394 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3396 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3401 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3405 ///________________________________________________________________________
3407 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3410 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3412 UInt_t isSelected = AliVEvent::kAny;
3413 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3414 // cout << periodName.Data() << endl;
3416 if (fInputHandler==NULL) return kFALSE;
3417 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3418 if (!fTriggerSelectedManually){
3419 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3421 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3422 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3423 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;
3424 else fOfflineTriggerMask = AliVEvent::kMB;
3427 // Get the actual offline trigger mask for the event and AND it with the
3428 // requested mask. If no mask requested select by default the event.
3429 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3430 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3432 if (fOfflineTriggerMask)
3433 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3435 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3439 if (fIsSDDFired) hTriggerClass->Fill(33);
3440 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3441 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3442 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3443 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3444 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3445 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3446 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3447 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3448 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3449 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3450 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3451 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3452 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3453 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3454 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3455 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3456 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3457 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3458 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3459 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3460 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3461 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3462 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3463 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3464 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3465 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3466 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3467 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3468 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3469 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3470 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3471 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3472 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3473 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3474 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3475 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3476 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3477 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3478 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3479 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3480 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3483 if(hTriggerClassSelected && isSelected){
3484 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3485 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3486 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3487 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3488 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3489 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3490 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3491 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3492 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3493 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3494 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3495 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3496 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3497 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3498 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3499 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3500 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3501 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3502 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3503 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3504 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3505 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3506 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3507 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3508 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3509 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3510 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3511 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3512 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3513 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3514 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3515 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3516 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3517 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3518 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3519 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3520 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3521 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3522 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3523 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3524 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3527 if(!isSelected)return kFALSE;
3533 ///________________________________________________________________________
3534 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3535 // Get first TPC row
3536 Int_t firstTPCRow = 0;
3537 Double_t radiusI = 84.8;
3538 Double_t radiusO = 134.6;
3539 Double_t radiusOB = 198.;
3540 Double_t rSizeI = 0.75;
3541 Double_t rSizeO = 1.;
3542 Double_t rSizeOB = 1.5;
3546 if(radius <= radiusI){
3549 if(radius>radiusI && radius<=radiusO){
3550 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3552 if(radius>radiusO && radius<=radiusOB){
3553 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3556 if(radius>radiusOB){
3557 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3563 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3564 ///Check if passes cosine of pointing angle cut
3565 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3571 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3572 // calculates the pointing angle of the recalculated V0
3574 Double_t momV0[3] = {0,0,0};
3575 if(event->IsA()==AliESDEvent::Class()){
3576 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3577 if(!esdEvent) return -999;
3578 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3579 if(!v0) return -999;
3580 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3582 if(event->IsA()==AliAODEvent::Class()){
3583 momV0[0] = photon->GetPx();
3584 momV0[1] = photon->GetPy();
3585 momV0[2] = photon->GetPz();
3588 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3589 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3590 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3591 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3593 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3594 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3597 Double_t cosinePointingAngle = -999;
3598 if(momV02*PosV02 > 0.0)
3599 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3601 return cosinePointingAngle;
3604 ///________________________________________________________________________
3605 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3607 if (fDo2DPsiPairChi2){
3608 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3614 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3620 ///________________________________________________________________________
3621 TString AliConversionCuts::GetCutNumber(){
3622 // returns TString with current cut number
3624 for(Int_t ii=0;ii<kNCuts;ii++){
3625 a.Append(Form("%d",fCuts[ii]));
3630 ///________________________________________________________________________
3631 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3633 Int_t posLabel = photon->GetTrackLabelPositive();
3634 Int_t negLabel = photon->GetTrackLabelNegative();
3636 fElectronLabelArray[nV0*2] = posLabel;
3637 fElectronLabelArray[(nV0*2)+1] = negLabel;
3639 ///________________________________________________________________________
3640 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3642 Int_t posLabel = photon->GetTrackLabelPositive();
3643 Int_t negLabel = photon->GetTrackLabelNegative();
3645 for(Int_t i = 0; i<nV0s*2;i++){
3646 if(i==nV0*2) continue;
3647 if(i==(nV0*2)+1) continue;
3648 if(fElectronLabelArray[i] == posLabel){
3650 if(fElectronLabelArray[i] == negLabel){
3656 ///________________________________________________________________________
3657 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3660 Double_t posX = photon->GetConversionX();
3661 Double_t posY = photon->GetConversionY();
3662 Double_t posZ = photon->GetConversionZ();
3664 for(Int_t i = 0;i<photons->GetEntries();i++){
3665 if(nV0 == i) continue;
3666 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3667 Double_t posCompX = photonComp->GetConversionX();
3668 Double_t posCompY = photonComp->GetConversionY();
3669 Double_t posCompZ = photonComp->GetConversionZ();
3671 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3673 if(dist < fminV0Dist*fminV0Dist){
3674 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3682 ///________________________________________________________________________
3683 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3687 if(fNotRejectedStart){
3688 delete[] fNotRejectedStart;
3689 fNotRejectedStart = NULL;
3691 if(fNotRejectedEnd){
3692 delete[] fNotRejectedEnd;
3693 fNotRejectedEnd = NULL;
3695 if(fGeneratorNames){
3696 delete[] fGeneratorNames;
3697 fGeneratorNames = NULL;
3700 if(rejection == 0) return; // No Rejection
3702 AliGenCocktailEventHeader *cHeader = 0x0;
3703 AliAODMCHeader *cHeaderAOD = 0x0;
3704 Bool_t headerFound = kFALSE;
3705 AliStack *fMCStack = 0x0;
3706 TClonesArray *fMCStackAOD = 0x0;
3707 if(MCEvent->IsA()==AliMCEvent::Class()){
3708 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3709 if(cHeader) headerFound = kTRUE;
3710 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3712 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3713 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3714 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3717 if(cHeaderAOD) headerFound = kTRUE;
3721 TList *genHeaders = 0x0;
3722 if(cHeader) genHeaders = cHeader->GetHeaders();
3724 genHeaders = cHeaderAOD->GetCocktailHeaders();
3725 if(genHeaders->GetEntries()==1){
3726 SetRejectExtraSignalsCut(0);
3730 AliGenEventHeader* gh = 0;
3732 Int_t firstindexA = 0;
3733 Int_t lastindexA = -1;
3734 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3735 if(rejection == 2){ // TList of Headers Names
3736 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3737 gh = (AliGenEventHeader*)genHeaders->At(i);
3738 TString GeneratorName = gh->GetName();
3739 lastindexA = lastindexA + gh->NProduced();
3740 // cout << i << "\t" << GeneratorName.Data() << endl;
3741 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3742 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3743 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3744 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3746 if (fMCStack->Particle(firstindexA)->GetPdgCode() == 111 || fMCStack->Particle(firstindexA)->GetPdgCode() == 221 ) {
3752 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3753 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3763 firstindexA = firstindexA + gh->NProduced();
3767 fNotRejectedStart = new Int_t[fnHeaders];
3768 fNotRejectedEnd = new Int_t[fnHeaders];
3769 fGeneratorNames = new TString[fnHeaders];
3771 if(rejection == 1 || rejection == 3){
3772 fNotRejectedStart[0] = 0;
3773 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3774 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3778 Int_t firstindex = 0;
3779 Int_t lastindex = -1;
3781 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3782 gh = (AliGenEventHeader*)genHeaders->At(i);
3783 TString GeneratorName = gh->GetName();
3784 lastindex = lastindex + gh->NProduced();
3785 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3786 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3787 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3788 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3790 if (fMCStack->Particle(firstindex)->GetPdgCode() == 111 || fMCStack->Particle(firstindex)->GetPdgCode() == 221 ) {
3791 fNotRejectedStart[number] = firstindex;
3792 fNotRejectedEnd[number] = lastindex;
3793 fGeneratorNames[number] = GeneratorName;
3799 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3800 if ( aodMCParticle->GetPdgCode() == 111 || aodMCParticle->GetPdgCode() == 221 ){
3801 fNotRejectedStart[number] = firstindex;
3802 fNotRejectedEnd[number] = lastindex;
3803 fGeneratorNames[number] = GeneratorName;
3810 fNotRejectedStart[number] = firstindex;
3811 fNotRejectedEnd[number] = lastindex;
3812 fGeneratorNames[number] = GeneratorName;
3813 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3819 firstindex = firstindex + gh->NProduced();
3821 } else { // No Cocktail Header Found
3822 fNotRejectedStart = new Int_t[1];
3823 fNotRejectedEnd = new Int_t[1];
3826 fNotRejectedStart[0] = 0;
3827 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3828 fGeneratorNames = new TString[1];
3829 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3831 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3832 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3833 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3834 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3835 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3836 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3838 SetRejectExtraSignalsCut(0);
3842 //_________________________________________________________________________
3843 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3845 // Not Accepted == kFALSE == 0
3846 // Accepted == kTRUE == 1
3847 // FirstHeader == kTRUE == 3
3848 if(index < 0) return 0; // No Particle
3851 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3852 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3853 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3854 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3856 for(Int_t i = 0;i<fnHeaders;i++){
3857 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3859 if(i == 0) accepted = 2; // MB Header
3863 else if(InputEvent->IsA()==AliAODEvent::Class()){
3864 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3865 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3866 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3867 if(!aodMCParticle->IsPrimary()){
3868 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3869 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3871 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3872 for(Int_t i = 0;i<fnHeaders;i++){
3873 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3875 if(i == 0) accepted = 2; // MB Header
3883 //_________________________________________________________________________
3884 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
3886 if ( !IsTriggerSelected(InputEvent) )
3889 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
3890 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3893 if(isHeavyIon == 0 && GetIsFromPileup()){
3894 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3896 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3900 Bool_t hasV0And = ReaderCuts->HasV0AND();
3901 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3902 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
3903 return 7; // With SDD requested but no fired
3905 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3906 return 8; // V0AND requested but no fired
3908 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
3909 if(hCentralityVsNumberOfPrimaryTracks)
3910 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
3911 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3912 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
3917 //_________________________________________________________________________
3918 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3919 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") ||
3920 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
3923 for (Int_t i = 0; i < fnHeaders; i++){
3924 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
3925 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
3927 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
3929 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
3930 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
3931 fGeneratorNames[i].Contains("hijing")){
3933 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
3935 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
3937 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
3939 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
3941 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
3943 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
3946 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") ){
3951 if (kCaseGen == 0) return 1;
3954 Double_t mesonPt = 0;
3955 Double_t mesonMass = 0;
3957 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3958 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
3959 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
3960 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
3962 else if(InputEvent->IsA()==AliAODEvent::Class()){
3963 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3964 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3965 mesonPt = aodMCParticle->Pt();
3966 mesonMass = aodMCParticle->GetCalcMass();
3967 PDGCode = aodMCParticle->GetPdgCode();
3970 Float_t functionResultMC = 1.;
3971 if (kCaseGen == 1){ // Pythia 6
3972 Float_t dNdyMC = 2.1462;
3973 Float_t nMC = 7.06055;
3974 Float_t tMC = 0.12533;
3975 if ( PDGCode == 111){
3979 } else if ( PDGCode == 221){
3984 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);
3985 } else if (kCaseGen == 2){ // Phojet
3986 Float_t dNdyMC = 2.35978;
3987 Float_t nMC = 6.81795;
3988 Float_t tMC = 0.11492;
3989 if ( PDGCode == 111){
3993 } else if ( PDGCode == 221){
3998 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);
3999 } else if (kCaseGen == 4){ // BOX generators pp
4000 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4001 Float_t a = 0.23437;
4003 Float_t c = -1430.5863;
4004 Float_t d = -0.6966624;
4005 Float_t e = 252.3742;
4006 if ( PDGCode == 111){
4012 } else if ( PDGCode == 221){
4019 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4020 // cout << functionResultMC << endl;
4021 } else if (kCaseGen == 3 ){ // HIJING
4022 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4023 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4025 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4026 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4028 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4029 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4033 Float_t functionResultData = 1;
4034 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4035 Float_t dNdyData = 2.2328;
4036 Float_t nData = 7.1473;
4037 Float_t tData = 0.1346;
4038 if ( PDGCode == 111){
4042 } else if ( PDGCode == 221){
4043 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4047 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);
4048 // cout << functionResultData << endl;
4050 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4051 functionResultData = fFitDataPi0->Eval(mesonPt);
4053 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4054 functionResultData = fFitDataEta->Eval(mesonPt);
4056 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4057 functionResultData = fFitDataK0s->Eval(mesonPt);
4062 Double_t weight = 1;
4063 if (PDGCode == 111 || PDGCode == 221){
4064 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4065 weight = functionResultData/functionResultMC;
4066 if ( kCaseGen == 3){
4067 if (PDGCode == 111){
4068 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4072 if (PDGCode == 221){
4073 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4078 if (!isfinite(functionResultData)) weight = 1.;
4079 if (!isfinite(weight)) weight = 1.;
4081 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4082 weight = functionResultMC;
4085 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4086 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4090 ///________________________________________________________________________
4091 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4092 //Create and return standard 2010 PbPb cuts
4093 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4094 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4095 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4099 ///________________________________________________________________________
4100 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4101 //Create and return standard 2010 PbPb cuts
4102 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4103 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4104 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4107 ///________________________________________________________________________
4108 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4110 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4111 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4112 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4113 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4114 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4115 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4116 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4117 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4118 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4119 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4120 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4121 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4122 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4123 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4124 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4125 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4126 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4127 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4128 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4129 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4130 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4131 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4132 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4133 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4134 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4135 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4136 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4137 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4138 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4139 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4141 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4142 SetEtaShift(-0.465);
4144 else if(periodName.CompareTo("LHC13f") == 0 ||
4145 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4146 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4147 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4149 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4150 SetEtaShift(+0.465);
4152 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4155 ///________________________________________________________________________
4156 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4158 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4159 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4160 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4161 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4162 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4164 if(!fInPlaneOutOfPlane){
4165 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4168 else if(fInPlaneOutOfPlane == 1){
4169 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4170 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4175 else if(fInPlaneOutOfPlane == 2){
4176 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4177 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);