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"
53 #include "AliTRDTriggerAnalysis.h"
59 ClassImp(AliConversionCuts)
62 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
66 "SelectSpecialTrigger",//3
67 "SelectSpecialSubTriggerClass",//4
69 "RejectExtraSignals",//6
77 "piMomdedxSigmaCut",//14
78 "piMaxMomdedxSigmaCut",//15
79 "LowPRejectionSigmaCut",//16
84 "DoPhotonAsymmetryCut",//21
85 "CosinePointingAngle", //22
86 "SharedElectronCuts", //23
87 "RejectToCloseV0s", //24
94 //________________________________________________________________________
95 AliConversionCuts::AliConversionCuts(const char *name,const char *title) :
96 AliAnalysisCuts(name,title),
112 fLineCutZRSlopeMin(0.),
113 fLineCutZValueMin(0),
114 fChi2CutConversion(1000),
115 fPIDProbabilityCutNegativeParticle(0),
116 fPIDProbabilityCutPositiveParticle(0),
117 fDodEdxSigmaCut(kTRUE),
118 fDoTOFsigmaCut(kFALSE),
119 fPIDTRDEfficiency(1),
121 fPIDnSigmaAboveElectronLine(100),
122 fPIDnSigmaBelowElectronLine(-100),
123 fTofPIDnSigmaAboveElectronLine(100),
124 fTofPIDnSigmaBelowElectronLine(-100),
125 fPIDnSigmaAbovePionLine(0),
126 fPIDnSigmaAbovePionLineHighPt(-100),
127 fPIDMinPnSigmaAbovePionLine(0),
128 fPIDMaxPnSigmaAbovePionLine(0),
129 fDoKaonRejectionLowP(kFALSE),
130 fDoProtonRejectionLowP(kFALSE),
131 fDoPionRejectionLowP(kFALSE),
132 fPIDnSigmaAtLowPAroundKaonLine(0),
133 fPIDnSigmaAtLowPAroundProtonLine(0),
134 fPIDnSigmaAtLowPAroundPionLine(0),
135 fPIDMinPKaonRejectionLowP(1.5),
136 fPIDMinPProtonRejectionLowP(2),
137 fPIDMinPPionRejectionLowP(0),
138 fDoQtGammaSelection(kTRUE),
145 fUseEtaMinCut(kFALSE),
146 fUseOnFlyV0Finder(kTRUE),
147 fDoPhotonAsymmetryCut(kTRUE),
148 fMinPPhotonAsymmetryCut(100.),
149 fMinPhotonAsymmetry(0.),
151 fDetectorCentrality(0),
152 fModCentralityClass(0),
156 fUseCorrectedTPCClsInfo(kFALSE),
158 fMultiplicityMethod(0),
160 fSpecialSubTrigger(0),
161 fRemovePileUp(kFALSE),
162 fOpeningAngle(0.005),
164 fDo2DPsiPairChi2(kFALSE),
165 fCosPAngleCut(10000),
166 fDoToCloseV0sCut(kFALSE),
167 fRejectExtraSignals(0),
169 fDoSharedElecCut(kFALSE),
170 fDoPhotonQualitySelectionCut(kFALSE),
171 fPhotonQualityCut(0),
172 fOfflineTriggerMask(0),
176 fElectronArraySize(500),
177 fElectronLabelArray(NULL),
178 fDCAZPrimVtxCut(1000),
179 fDCARPrimVtxCut(1000),
180 fInPlaneOutOfPlane(0),
181 fConversionPointXArray(0.0),
182 fConversionPointYArray(0.0),
183 fConversionPointZArray(0.0),
185 fNotRejectedStart(NULL),
186 fNotRejectedEnd(NULL),
187 fGeneratorNames(NULL),
192 fDoReweightHistoMCPi0(kFALSE),
193 fDoReweightHistoMCEta(kFALSE),
194 fDoReweightHistoMCK0s(kFALSE),
195 fPathTrFReweighting(""),
196 fNameHistoReweightingPi0(""),
197 fNameHistoReweightingEta(""),
198 fNameHistoReweightingK0s(""),
203 hEtaDistV0sAfterdEdxCuts(NULL),
205 hTPCdEdxbefore(NULL),
207 hTPCdEdxSigbefore(NULL),
208 hTPCdEdxSigafter(NULL),
212 hPsiPairDeltaPhiafter(NULL),
215 hInvMassbefore(NULL),
216 hArmenterosbefore(NULL),
218 hArmenterosafter(NULL),
219 hAcceptanceCuts(NULL),
223 hCentralityVsNumberOfPrimaryTracks(NULL),
225 hEventPlanePhi(NULL),
227 hTriggerClassSelected(NULL),
228 hReweightMCHistPi0(NULL),
229 hReweightMCHistEta(NULL),
230 hReweightMCHistK0s(NULL),
234 fAddedSignalPDGCode(0),
236 fTriggerSelectedManually(kFALSE),
237 fSpecialTriggerName(""),
238 fSpecialSubTriggerName(""),
239 fNSpecialSubTriggerOptions(0)
243 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
244 fCutString=new TObjString((GetCutNumber()).Data());
246 fElectronLabelArray = new Int_t[fElectronArraySize];
247 fUtils = new AliAnalysisUtils();
248 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
249 //fUtils->SetCutOnZVertexSPD(kFALSE);
254 //________________________________________________________________________
255 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
256 AliAnalysisCuts(ref),
258 fHeaderList(ref.fHeaderList),
260 fEventQuality(ref.fEventQuality),
263 fEtaCut(ref.fEtaCut),
264 fEtaCutMin(ref.fEtaCutMin),
266 fSinglePtCut(ref.fSinglePtCut),
268 fMinClsTPC(ref.fMinClsTPC),
269 fMinClsTPCToF(ref.fMinClsTPCToF),
270 fLineCutZRSlope(ref.fLineCutZRSlope),
271 fLineCutZValue(ref.fLineCutZValue),
272 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
273 fLineCutZValueMin(ref.fLineCutZValueMin),
274 fChi2CutConversion(ref.fChi2CutConversion),
275 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
276 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
277 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
278 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
279 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
280 fDoTRDPID(ref.fDoTRDPID),
281 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
282 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
283 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
284 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
285 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
286 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
287 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
288 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
289 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
290 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
291 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
292 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
293 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
294 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
295 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
296 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
297 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
298 fDoQtGammaSelection(ref.fDoQtGammaSelection),
299 fDo2DQt(ref.fDo2DQt),
301 fXVertexCut(ref.fXVertexCut),
302 fYVertexCut(ref.fYVertexCut),
303 fZVertexCut(ref.fZVertexCut),
304 fNSigmaMass(ref.fNSigmaMass),
305 fUseEtaMinCut(ref.fUseEtaMinCut),
306 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
307 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
308 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
309 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
310 fIsHeavyIon(ref.fIsHeavyIon),
311 fDetectorCentrality(ref.fDetectorCentrality),
312 fModCentralityClass(ref.fModCentralityClass),
313 fMaxVertexZ(ref.fMaxVertexZ),
314 fCentralityMin(ref.fCentralityMin),
315 fCentralityMax(ref.fCentralityMax),
316 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
317 fUseTOFpid(ref.fUseTOFpid),
318 fMultiplicityMethod(ref.fMultiplicityMethod),
319 fSpecialTrigger(ref.fSpecialTrigger),
320 fSpecialSubTrigger(ref.fSpecialSubTrigger),
321 fRemovePileUp(ref.fRemovePileUp),
322 fOpeningAngle(ref.fOpeningAngle),
323 fPsiPairCut(ref.fPsiPairCut),
324 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
325 fCosPAngleCut(ref.fCosPAngleCut),
326 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
327 fRejectExtraSignals(ref.fRejectExtraSignals),
328 fminV0Dist(ref.fminV0Dist),
329 fDoSharedElecCut(ref.fDoSharedElecCut),
330 fDoPhotonQualitySelectionCut(ref.fDoPhotonQualitySelectionCut),
331 fPhotonQualityCut(ref.fPhotonQualityCut),
332 fOfflineTriggerMask(ref.fOfflineTriggerMask),
333 fHasV0AND(ref.fHasV0AND),
334 fIsSDDFired(ref.fIsSDDFired),
335 fRandom(ref.fRandom),
336 fElectronArraySize(ref.fElectronArraySize),
337 fElectronLabelArray(NULL),
338 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
339 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
340 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
341 fConversionPointXArray(ref.fConversionPointXArray),
342 fConversionPointYArray(ref.fConversionPointYArray),
343 fConversionPointZArray(ref.fConversionPointZArray),
344 fnHeaders(ref.fnHeaders),
345 fNotRejectedStart(NULL),
346 fNotRejectedEnd(NULL),
347 fGeneratorNames(ref.fGeneratorNames),
350 fEtaShift(ref.fEtaShift),
351 fDoEtaShift(ref.fDoEtaShift),
352 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
353 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
354 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
355 fPathTrFReweighting(ref.fPathTrFReweighting),
356 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
357 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
358 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
359 fNameFitDataPi0(ref.fNameFitDataPi0),
360 fNameFitDataEta(ref.fNameFitDataEta),
361 fNameFitDataK0s(ref.fNameFitDataK0s),
363 hEtaDistV0sAfterdEdxCuts(NULL),
365 hTPCdEdxbefore(NULL),
367 hTPCdEdxSigbefore(NULL),
368 hTPCdEdxSigafter(NULL),
372 hPsiPairDeltaPhiafter(NULL),
375 hInvMassbefore(NULL),
376 hArmenterosbefore(NULL),
378 hArmenterosafter(NULL),
379 hAcceptanceCuts(NULL),
383 hCentralityVsNumberOfPrimaryTracks(NULL),
385 hEventPlanePhi(NULL),
387 hTriggerClassSelected(NULL),
388 hReweightMCHistPi0(ref.hReweightMCHistPi0),
389 hReweightMCHistEta(ref.hReweightMCHistEta),
390 hReweightMCHistK0s(ref.hReweightMCHistK0s),
391 fFitDataPi0(ref.fFitDataPi0),
392 fFitDataEta(ref.fFitDataEta),
393 fFitDataK0s(ref.fFitDataK0s),
394 fAddedSignalPDGCode(ref.fAddedSignalPDGCode),
395 fPreSelCut(ref.fPreSelCut),
396 fTriggerSelectedManually(ref.fTriggerSelectedManually),
397 fSpecialTriggerName(ref.fSpecialTriggerName),
398 fSpecialSubTriggerName(ref.fSpecialSubTriggerName),
399 fNSpecialSubTriggerOptions(ref.fNSpecialSubTriggerOptions)
402 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
403 fCutString=new TObjString((GetCutNumber()).Data());
404 fElectronLabelArray = new Int_t[fElectronArraySize];
405 fUtils = new AliAnalysisUtils();
406 // dont copy histograms (if you like histograms, call InitCutHistograms())
411 //________________________________________________________________________
412 AliConversionCuts::~AliConversionCuts() {
414 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
416 // delete fHistograms;
417 // fHistograms = NULL;
418 if(fCutString != NULL){
422 if(fElectronLabelArray){
423 delete fElectronLabelArray;
424 fElectronLabelArray = NULL;
426 if(fNotRejectedStart){
427 delete[] fNotRejectedStart;
428 fNotRejectedStart = NULL;
431 delete[] fNotRejectedEnd;
432 fNotRejectedEnd = NULL;
435 delete[] fGeneratorNames;
436 fGeneratorNames = NULL;
445 //________________________________________________________________________
446 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
448 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
449 TH1::AddDirectory(kFALSE);
451 if(fHistograms != NULL){
455 if(fHistograms==NULL){
456 fHistograms=new TList();
457 fHistograms->SetOwner(kTRUE);
458 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
459 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
462 if (hReweightMCHistPi0){
463 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
464 fHistograms->Add(hReweightMCHistPi0);
466 if (hReweightMCHistEta){
467 hReweightMCHistEta->SetName("MCInputForWeightingEta");
468 fHistograms->Add(hReweightMCHistEta);
470 if (hReweightMCHistK0s){
471 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
472 fHistograms->Add(hReweightMCHistK0s);
475 // fFitDataPi0->SetName("DataFitForWeightingPi0");
476 // fHistograms->Add(fFitDataPi0);
479 // fFitDataEta->SetName("DataFitForWeightingEta");
480 // fHistograms->Add(fFitDataEta);
483 // fFitDataK0s->SetName("DataFitForWeightingK0s");
484 // fHistograms->Add(fFitDataK0s);
487 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
488 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
489 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
490 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
491 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
492 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
493 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
494 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
495 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
496 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
497 fHistograms->Add(hCutIndex);
500 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
501 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
502 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
503 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
504 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
505 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
506 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
507 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
508 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
509 fHistograms->Add(hTrackCuts);
512 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",15,-0.5,14.5);
513 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
514 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
515 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
516 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
517 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
518 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
519 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
520 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
521 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
522 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
523 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
524 hPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality");
525 hPhotonCuts->GetXaxis()->SetBinLabel(13,"out");
526 fHistograms->Add(hPhotonCuts);
529 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
530 fHistograms->Add(hInvMassbefore);
531 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
532 fHistograms->Add(hArmenterosbefore);
533 hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
534 fHistograms->Add(hEtaDistV0s);
537 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
538 fHistograms->Add(hInvMassafter);
539 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
540 fHistograms->Add(hArmenterosafter);
542 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
543 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
544 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
545 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
546 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
547 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
548 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
549 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
550 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
551 fHistograms->Add(hAcceptanceCuts);
554 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
555 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
556 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
557 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
558 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
559 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
560 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
561 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
562 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
563 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
564 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
565 fHistograms->Add(hdEdxCuts);
567 TAxis *AxisBeforedEdx = NULL;
568 TAxis *AxisBeforedEdxSig = NULL;
569 TAxis *AxisBeforeTOF = NULL;
570 TAxis *AxisBeforeTOFSig = NULL;
572 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
573 fHistograms->Add(hTPCdEdxbefore);
574 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
575 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
576 fHistograms->Add(hTPCdEdxSigbefore);
577 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
579 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
580 fHistograms->Add(hTOFbefore);
581 AxisBeforeTOF = hTOFbefore->GetXaxis();
582 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
583 fHistograms->Add(hTOFSigbefore);
584 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
587 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
588 fHistograms->Add(hTPCdEdxSigafter);
590 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
591 fHistograms->Add(hTPCdEdxafter);
593 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
594 fHistograms->Add(hTOFSigafter);
596 hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
597 fHistograms->Add(hEtaDistV0sAfterdEdxCuts);
599 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
600 fHistograms->Add(hPsiPairDeltaPhiafter);
602 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
603 Int_t bins = AxisAfter->GetNbins();
604 Double_t from = AxisAfter->GetXmin();
605 Double_t to = AxisAfter->GetXmax();
606 Double_t *newBins = new Double_t[bins+1];
608 Double_t factor = TMath::Power(to/from, 1./bins);
609 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
610 AxisAfter->Set(bins, newBins);
611 AxisAfter = hTOFSigafter->GetXaxis();
612 AxisAfter->Set(bins, newBins);
613 AxisAfter = hTPCdEdxafter->GetXaxis();
614 AxisAfter->Set(bins, newBins);
616 AxisBeforedEdx->Set(bins, newBins);
617 AxisBeforeTOF->Set(bins, newBins);
618 AxisBeforedEdxSig->Set(bins, newBins);
619 AxisBeforeTOFSig->Set(bins, newBins);
623 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
624 fHistograms->Add(hCentrality);
625 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
626 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
628 // Event Cuts and Info
630 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
631 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
632 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
633 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
634 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
635 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
636 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
637 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
638 fHistograms->Add(hV0EventCuts);
640 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
641 fHistograms->Add(hVertexZ);
643 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
644 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
645 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
646 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
647 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
648 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
649 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
650 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
651 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
652 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
653 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
654 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
655 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
656 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
657 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
658 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
659 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
660 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
661 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
662 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
663 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
664 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
665 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
666 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
667 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
668 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
669 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
670 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
671 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
672 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
673 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
674 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
675 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
676 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
677 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
678 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
679 fHistograms->Add(hTriggerClass);
682 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
683 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
693 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
694 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
695 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
696 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
697 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
698 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
699 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
700 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
701 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
702 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
703 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
704 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
705 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
706 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
707 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
708 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
709 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
710 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
711 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
712 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
713 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
714 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
715 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
716 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
717 fHistograms->Add(hTriggerClassSelected);
719 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
720 fHistograms->Add(hEventPlanePhi);
724 TH1::AddDirectory(kTRUE);
727 //________________________________________________________________________
728 Bool_t AliConversionCuts::InitPIDResponse(){
729 // Set Pointer to AliPIDResponse
731 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
733 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
734 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
735 if(fPIDResponse)return kTRUE;
742 ///________________________________________________________________________
743 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
744 // Process Event Selection
747 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
750 // Check for MC event
751 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
752 // Check if MC event is correctly loaded
753 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
758 if (!mcHandler->InitOk() ){
762 if (!mcHandler->TreeK() ){
766 if (!mcHandler->TreeTR() ) {
773 // cout << "before event trigger" << endl;
774 if(!IsTriggerSelected(fInputEvent)){
775 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
781 if(fInputEvent->IsA()==AliESDEvent::Class()){
782 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
783 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
784 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
786 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
789 // Number of Contributors Cut
790 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
791 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
797 // Z Vertex Position Cut
798 if(!VertexZCut(fInputEvent)){
799 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
808 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
809 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
816 // Centrality Selection
817 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
818 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
824 // Fill Event Histograms
825 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
826 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
827 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
828 if(hCentralityVsNumberOfPrimaryTracks)
829 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
830 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
831 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
836 ///________________________________________________________________________
837 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
838 // MonteCarlo Photon Selection
840 if(!fMCStack)return kFALSE;
842 if (particle->GetPdgCode() == 22){
845 if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) )
848 if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) )
852 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
853 return kFALSE; // no photon as mothers!
856 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
857 return kFALSE; // the gamma has a mother, and it is not a primary particle
860 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
862 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
863 TParticle* ePos = NULL;
864 TParticle* eNeg = NULL;
866 if(particle->GetNDaughters() >= 2){
867 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
868 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
869 if(tmpDaughter->GetUniqueID() == 5){
870 if(tmpDaughter->GetPdgCode() == 11){
872 } else if(tmpDaughter->GetPdgCode() == -11){
879 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
883 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
884 return kFALSE; // no reconstruction below the Pt cut
887 if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ||
888 eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) )
891 if(fEtaCutMin > -0.1){
892 if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) ||
893 (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) )
898 return kFALSE; // cuts on distance from collision point
901 if(abs(ePos->Vz()) > fMaxZ){
902 return kFALSE; // outside material
904 if(abs(eNeg->Vz()) > fMaxZ){
905 return kFALSE; // outside material
908 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
909 return kFALSE; // line cut to exclude regions where we do not reconstruct
910 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
914 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
915 return kFALSE; // line cut to exclude regions where we do not reconstruct
916 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
921 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
925 ///________________________________________________________________________
926 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
927 // MonteCarlo Photon Selection
929 if(!aodmcArray)return kFALSE;
931 if (particle->GetPdgCode() == 22){
932 if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) )
935 if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) )
939 if(particle->GetMother() > -1){
940 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
941 return kFALSE; // no photon as mothers!
943 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
944 return kFALSE; // the gamma has a mother, and it is not a primary particle
948 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
950 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
951 AliAODMCParticle* ePos = NULL;
952 AliAODMCParticle* eNeg = NULL;
954 if(particle->GetNDaughters() >= 2){
955 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
956 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
957 if(!tmpDaughter) continue;
958 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
959 if(tmpDaughter->GetPdgCode() == 11){
961 } else if(tmpDaughter->GetPdgCode() == -11){
968 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
972 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
973 return kFALSE; // no reconstruction below the Pt cut
976 if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ||
977 eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) )
980 if(fEtaCutMin > -0.1){
981 if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) ||
982 (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) )
986 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
987 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
990 return kFALSE; // cuts on distance from collision point
992 if(abs(ePos->Zv()) > fMaxZ){
993 return kFALSE; // outside material
995 if(abs(eNeg->Zv()) > fMaxZ){
996 return kFALSE; // outside material
999 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
1000 return kFALSE; // line cut to exclude regions where we do not reconstruct
1001 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1005 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
1006 return kFALSE; // line cut to exclude regions where we do not reconstruct
1007 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1012 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1016 ///________________________________________________________________________
1017 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1018 { // Specific Photon Cuts
1021 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1024 // Fill Histos before Cuts
1025 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1026 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1028 // Gamma selection based on QT from Armenteros
1029 if(fDoQtGammaSelection == kTRUE){
1030 if(!ArmenterosQtCut(photon)){
1031 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1038 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1040 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1046 // Reconstruction Acceptance Cuts
1047 if(!AcceptanceCuts(photon)){
1048 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1054 if(fDoPhotonAsymmetryCut == kTRUE){
1055 if(!AsymmetryCut(photon,event)){
1056 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1061 //Check the pid probability
1063 if(!PIDProbabilityCut(photon, event)) {
1064 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1069 if(!CorrectedTPCClusterCut(photon, event)) {
1070 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1074 Double_t magField = event->GetMagneticField();
1075 if( magField < 0.0 ){
1081 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1082 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1083 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1086 if(!PsiPairCut(photon)) {
1087 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1092 if(!CosinePAngleCut(photon, event)) {
1093 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1097 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1099 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1102 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1103 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1108 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1109 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1119 UChar_t photonQuality = 0;
1120 AliAODEvent * aodEvent = dynamic_cast<AliAODEvent*>(event);
1122 photonQuality = DeterminePhotonQualityAOD(photonAOD, event);
1124 photonQuality = photonAOD->GetPhotonQuality();
1126 if (fDoPhotonQualitySelectionCut && photonQuality != fPhotonQualityCut){
1127 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1132 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1134 // Histos after Cuts
1135 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1136 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1137 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1142 ///________________________________________________________________________
1143 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1144 { //Cut on corrected TPC Cluster Info
1146 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1147 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1149 if(!negTrack||!posTrack)return kFALSE;
1151 Double_t negclsToF=0;
1153 if (!fUseCorrectedTPCClsInfo ){
1154 if(negTrack->GetTPCNclsF()!=0){
1155 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1158 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1161 Double_t posclsToF = 0.;
1162 if (!fUseCorrectedTPCClsInfo ){
1163 if(posTrack->GetTPCNclsF()!=0){
1164 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1167 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1170 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1177 ///________________________________________________________________________
1178 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1180 //Selection of Reconstructed Photons
1182 FillPhotonCutIndex(kPhotonIn);
1184 if(event->IsA()==AliESDEvent::Class()) {
1185 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1186 FillPhotonCutIndex(kOnFly);
1190 // else if(event->IsA()==AliAODEvent::Class()) {
1191 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1192 // FillPhotonCutIndex(kOnFly);
1198 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1199 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1201 if(!negTrack || !posTrack) {
1202 FillPhotonCutIndex(kNoTracks);
1205 photon->DeterminePhotonQuality(negTrack,posTrack);
1207 if(!TracksAreSelected(negTrack, posTrack)){
1208 FillPhotonCutIndex(kTrackCuts);
1211 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1213 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1214 FillPhotonCutIndex(kdEdxCuts);
1217 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1219 if(!PhotonCuts(photon,event)){
1220 FillPhotonCutIndex(kPhotonCuts);
1224 // Photon passed cuts
1225 FillPhotonCutIndex(kPhotonOut);
1229 ///________________________________________________________________________
1230 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1231 { // Armenteros Qt Cut
1233 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1237 if(photon->GetArmenterosQt()>fQtMax){
1245 ///________________________________________________________________________
1246 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1247 // Exclude certain areas for photon reconstruction
1250 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1253 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1254 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1259 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1260 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1265 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1266 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1269 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1270 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1275 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1276 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1282 if( photon->GetPhotonEta() > (fEtaCut) || photon->GetPhotonEta() < (-fEtaCut) ){
1283 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1286 if(fEtaCutMin>-0.1){
1287 if( photon->GetPhotonEta() < (fEtaCutMin) && photon->GetPhotonEta() > (-fEtaCutMin) ){
1288 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1294 if(photon->GetPhotonPt()<fPtCut){
1295 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1300 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1306 ///________________________________________________________________________
1307 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1308 // Track Cuts which require AOD/ESD specific implementation
1310 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1311 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1316 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1317 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1318 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1319 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1327 ///________________________________________________________________________
1328 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1329 // Track Cuts which require AOD/ESD specific implementation
1331 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1332 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1337 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1338 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1346 ///________________________________________________________________________
1347 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1348 // Track Selection for Photon Reconstruction
1351 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1355 if(negTrack->Charge() == posTrack->Charge()) {
1356 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1361 // Number of TPC Clusters
1364 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1365 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1371 if( posTrack->Eta() > (fEtaCut) || posTrack->Eta() < (-fEtaCut) ||
1372 negTrack->Eta() > (fEtaCut) || negTrack->Eta() < (-fEtaCut) ){
1373 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1376 if(fEtaCutMin>-0.1){
1377 if( (posTrack->Eta() < (fEtaCutMin) && posTrack->Eta() > (-fEtaCutMin)) ||
1378 (negTrack->Eta() < (fEtaCutMin) && negTrack->Eta() > (-fEtaCutMin)) ){
1379 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1386 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1387 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1392 // AOD ESD specific cuts
1393 Bool_t passCuts = kTRUE;
1395 if(negTrack->IsA()==AliAODTrack::Class()) {
1396 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1398 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1402 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1407 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1413 ///________________________________________________________________________
1414 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1415 // Electron Identification Cuts for Photon reconstruction
1416 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1417 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1420 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1421 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1422 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1425 if(fDodEdxSigmaCut == kTRUE){
1426 // TPC Electron Line
1427 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1428 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1430 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1436 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1437 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1438 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1439 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1441 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1448 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1449 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1450 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1451 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1453 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1461 if(fDoKaonRejectionLowP == kTRUE){
1462 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1463 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1465 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1471 if(fDoProtonRejectionLowP == kTRUE){
1472 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1473 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1475 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1482 if(fDoPionRejectionLowP == kTRUE){
1483 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1484 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1486 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1494 // cout<<"Start"<<endl;
1495 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1497 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1498 // {cout<<"TOF DA"<<endl;}
1499 // if(status == AliPIDResponse::kDetPidOk){
1500 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1501 // cout<<"--> "<<probMis<<endl;
1502 // if(probMis > 0.01){
1507 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1509 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1510 Double_t times[AliPID::kSPECIESC];
1511 fCurrentTrack->GetIntegratedTimes(times);
1512 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1513 Double_t dT = TOFsignal - t0 - times[0];
1514 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1516 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1518 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1519 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1520 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1524 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1529 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1530 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1536 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1537 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1538 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1543 ///________________________________________________________________________
1544 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1545 // Cut on Energy Assymetry
1547 for(Int_t ii=0;ii<2;ii++){
1549 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1551 if( track->P() > fMinPPhotonAsymmetryCut ){
1552 Double_t trackNegAsy=0;
1553 if (photon->GetPhotonP()!=0.){
1554 trackNegAsy= track->P()/photon->GetPhotonP();
1557 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1566 ///________________________________________________________________________
1567 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1568 //Returns pointer to the track with given ESD label
1569 //(Important for AOD implementation, since Track array in AOD data is different
1570 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1572 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1574 if(label > event->GetNumberOfTracks() ) return NULL;
1575 AliESDtrack * track = esdEvent->GetTrack(label);
1579 AliVTrack * track = 0x0;
1580 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1581 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1585 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1586 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1588 if(track->GetID() == label) {
1595 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1599 ///________________________________________________________________________
1600 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1601 //Returns pointer to the track with given ESD label
1602 //(Important for AOD implementation, since Track array in AOD data is different
1603 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1606 if(label > event->GetNumberOfTracks() ) return NULL;
1607 AliESDtrack * track = event->GetTrack(label);
1610 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1616 ///________________________________________________________________________
1617 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1618 // Cut on Electron Probability for Photon Reconstruction
1620 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1624 Bool_t iResult=kFALSE;
1626 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1627 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1629 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1630 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1632 if(negProbArray && posProbArray){
1634 negTrack->GetTPCpid(negProbArray);
1635 posTrack->GetTPCpid(posProbArray);
1637 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1642 delete [] posProbArray;
1643 delete [] negProbArray;
1647 ///Not possible for AODs
1657 ///________________________________________________________________________
1658 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1659 // MC Acceptance Cuts
1660 //(Certain areas were excluded for photon reconstruction)
1662 if(particle->R()>fMaxR){
1665 if(ePos->R()>fMaxR){
1669 if(ePos->R()<fMinR){
1673 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1676 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1680 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1684 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1688 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1693 if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) ){
1696 if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ){
1699 if( eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) ){
1702 if(fEtaCutMin>-0.1){
1703 if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) ){
1706 if( ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin) ){
1709 if( eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin) ){
1714 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1718 if(particle->Pt()<fPtCut){
1724 ///________________________________________________________________________
1725 Bool_t AliConversionCuts::UpdateCutString() {
1726 ///Update the cut string (if it has been created yet)
1728 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1729 fCutString->SetString(GetCutNumber());
1735 ///________________________________________________________________________
1736 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1738 AliInfo("Entering loading of histograms for weighting");
1739 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1741 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1744 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1745 cout << "I have to find: " << fNameHistoReweightingPi0.Data() << endl;
1746 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1747 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1748 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1749 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1750 hReweightMCHistPi0->SetDirectory(0);
1752 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1753 cout << "I have to find: " << fNameFitDataPi0.Data() << endl;
1754 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1755 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1756 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1757 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1760 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1761 cout << "I have to find: " << fNameHistoReweightingEta.Data() << endl;
1762 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1763 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1764 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1765 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1766 hReweightMCHistEta->SetDirectory(0);
1769 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1770 cout << "I have to find: " << fNameFitDataEta.Data() << endl;
1771 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1772 fFitDataEta = new TF1(*fFitDataEtatemp);
1773 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1774 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1777 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1778 cout << "I have to find: " << fNameHistoReweightingK0s.Data() << endl;
1779 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1780 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1781 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1782 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1783 hReweightMCHistK0s->SetDirectory(0);
1786 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1787 cout << "I have to find: " << fNameFitDataK0s.Data() << endl;
1788 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1789 fFitDataK0s = new TF1(*fFitDataK0stemp);
1790 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1791 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1799 ///________________________________________________________________________
1800 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1801 // Initialize Cuts from a given Cut string
1802 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1803 AliInfo("Weighting was enabled");
1804 LoadReweightingHistosMCFromFile();
1807 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1808 if(analysisCutSelection.Length()!=kNCuts) {
1809 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1812 if(!analysisCutSelection.IsDigit()){
1813 AliError("Cut selection contains characters");
1817 const char *cutSelection = analysisCutSelection.Data();
1818 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1819 for(Int_t ii=0;ii<kNCuts;ii++){
1823 // Set Individual Cuts
1824 for(Int_t ii=0;ii<kNCuts;ii++){
1825 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1828 PrintCutsWithValues();
1832 ///________________________________________________________________________
1833 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1834 ///Set individual cut ID
1839 if( SetV0Finder(value)) {
1840 fCuts[kv0FinderType] = value;
1843 } else return kFALSE;
1845 case kededxSigmaCut:
1846 if( SetTPCdEdxCutElectronLine(value)) {
1847 fCuts[kededxSigmaCut] = value;
1850 } else return kFALSE;
1852 case kpidedxSigmaCut:
1853 if( SetTPCdEdxCutPionLine(value)) {
1854 fCuts[kpidedxSigmaCut] = value;
1857 } else return kFALSE;
1859 case kpiMomdedxSigmaCut:
1860 if( SetMinMomPiondEdxCut(value)) {
1861 fCuts[kpiMomdedxSigmaCut] = value;
1864 } else return kFALSE;
1867 if( SetChi2GammaCut(value)) {
1868 fCuts[kchi2GammaCut] = value;
1871 } else return kFALSE;
1874 if( SetSinglePtCut(value)) {
1875 fCuts[ksinglePtCut] = value;
1878 } else return kFALSE;
1881 if( SetTPCClusterCut(value)) {
1882 fCuts[kclsTPCCut] = value;
1885 } else return kFALSE;
1888 if( SetEtaCut(value)) {
1889 fCuts[ketaCut] = value;
1892 } else return kFALSE;
1894 case kLowPRejectionSigmaCut:
1895 if( SetLowPRejectionCuts(value)) {
1896 fCuts[kLowPRejectionSigmaCut] = value;
1899 } else return kFALSE;
1902 if( SetQtMaxCut(value)) {
1903 fCuts[kQtMaxCut] = value;
1906 } else return kFALSE;
1908 case kpiMaxMomdedxSigmaCut:
1909 if( SetMaxMomPiondEdxCut(value)) {
1910 fCuts[kpiMaxMomdedxSigmaCut] = value;
1913 } else return kFALSE;
1916 if( SetRCut(value)) {
1917 fCuts[kRCut] = value;
1920 } else return kFALSE;
1923 if( SetRemovePileUp(value)) {
1924 fCuts[kremovePileUp] = value;
1927 } else return kFALSE;
1929 case kSelectSpecialTriggerAlias:
1930 if( SetSelectSpecialTrigger(value)) {
1931 fCuts[kSelectSpecialTriggerAlias] = value;
1934 } else return kFALSE;
1936 case kSelectSubTriggerClass:
1937 if( SetSelectSubTriggerClass(value)) {
1938 fCuts[kSelectSubTriggerClass] = value;
1941 } else return kFALSE;
1944 if( SetIsHeavyIon(value)) {
1945 fCuts[kisHeavyIon] = value;
1948 } else return kFALSE;
1950 case kCentralityMin:
1951 if( SetCentralityMin(value)) {
1952 fCuts[kCentralityMin] = value;
1955 } else return kFALSE;
1957 case kCentralityMax:
1958 if( SetCentralityMax(value)) {
1959 fCuts[kCentralityMax] = value;
1962 } else return kFALSE;
1964 case kTOFelectronPID:
1965 if( SetTOFElectronPIDCut(value)) {
1966 fCuts[kTOFelectronPID] = value;
1969 } else return kFALSE;
1971 case kdoPhotonAsymmetryCut:
1972 if( SetPhotonAsymmetryCut(value)) {
1973 fCuts[kdoPhotonAsymmetryCut] = value;
1976 } else return kFALSE;
1979 if( SetPsiPairCut(value)) {
1980 fCuts[kPsiPair] = value;
1983 } else return kFALSE;
1986 if( SetCosPAngleCut(value)) {
1987 fCuts[kCosPAngle] = value;
1990 } else return kFALSE;
1994 if( SetSharedElectronCut(value)) {
1995 fCuts[kElecShare] = value;
1998 } else return kFALSE;
2001 if( SetToCloseV0sCut(value)) {
2002 fCuts[kToCloseV0s] = value;
2005 } else return kFALSE;
2008 if( SetRejectExtraSignalsCut(value)) {
2009 fCuts[kExtraSignals] = value;
2012 } else return kFALSE;
2015 if( SetDCARPhotonPrimVtxCut(value)) {
2016 fCuts[kDcaRPrimVtx] = value;
2019 } else return kFALSE;
2022 if( SetDCAZPhotonPrimVtxCut(value)) {
2023 fCuts[kDcaZPrimVtx] = value;
2026 } else return kFALSE;
2028 case kInPlaneOutOfPlane:
2029 if( SetInPlaneOutOfPlane(value)) {
2030 fCuts[kInPlaneOutOfPlane] = value;
2033 } else return kFALSE;
2039 AliError("Cut id out of range");
2043 AliError("Cut id %d not recognized");
2048 ///________________________________________________________________________
2049 void AliConversionCuts::PrintCuts() {
2050 // Print out current Cut Selection
2051 for(Int_t ic = 0; ic < kNCuts; ic++) {
2052 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2056 void AliConversionCuts::PrintCutsWithValues() {
2057 // Print out current Cut Selection with value
2058 printf("\nConversion cutnumber \n");
2059 for(Int_t ic = 0; ic < kNCuts; ic++) {
2060 printf("%d",fCuts[ic]);
2065 if (fIsHeavyIon == 0) {
2066 printf("Running in pp mode \n");
2067 if (fSpecialTrigger == 0){
2068 printf("\t only events triggered by V0OR will be analysed \n");
2069 } else if (fSpecialTrigger == 1){
2070 printf("\t only events triggered by V0AND will be analysed \n");
2071 } else if (fSpecialTrigger == 2){
2072 printf("\t only events where SDD was present will be analysed \n");
2073 } else if (fSpecialTrigger == 3){
2074 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2075 } else if (fSpecialTrigger > 3){
2076 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
2078 } else if (fIsHeavyIon == 1){
2079 printf("Running in PbPb mode \n");
2080 if (fDetectorCentrality == 0){
2081 printf("\t centrality selection based on V0M \n");
2082 } else if (fDetectorCentrality == 1){
2083 printf("\t centrality selection based on Cl1 \n");
2085 if (fModCentralityClass == 0){
2086 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2087 } else if ( fModCentralityClass == 1){
2088 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2089 } else if ( fModCentralityClass == 2){
2090 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2091 } else if (fModCentralityClass == 3){
2092 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2093 } else if ( fModCentralityClass == 4){
2094 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2095 } else if ( fModCentralityClass == 5){
2096 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2098 if (fSpecialTrigger == 0){
2099 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2100 } else if (fSpecialTrigger > 4){
2101 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
2103 } else if (fIsHeavyIon == 2){
2104 printf("Running in pPb mode \n");
2105 if (fDetectorCentrality == 0){
2106 printf("\t centrality selection based on V0A \n");
2107 } else if (fDetectorCentrality == 1){
2108 printf("\t centrality selection based on Cl1 \n");
2110 if (fModCentralityClass == 0){
2111 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2113 if (fSpecialTrigger == 0){
2114 printf("\t only events triggered by kINT7 will be analysed \n");
2115 } else if (fSpecialTrigger > 4){
2116 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
2119 printf("MC event cuts: \n");
2120 if (fRejectExtraSignals == 0) printf("\t no rejection was applied \n");
2121 else if (fRejectExtraSignals == 1) printf("\t only MB header will be inspected \n");
2122 else if (fRejectExtraSignals > 1) printf("\t special header have been selected \n");
2124 printf("Electron cuts & Secondary Track Cuts - only track from secondaries enter analysis: \n");
2125 printf("\t no like sign pairs from V0s \n");
2126 if (!fUseCorrectedTPCClsInfo) printf("\t # TPC clusters > %3.2f \n", fMinClsTPC);
2127 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut );
2128 else printf("\t eta_{e} < %3.2f\n", fEtaCut );
2129 printf("\t p_{T,e} > %3.2f\n", fSinglePtCut );
2130 printf("\t TPC refit \n");
2131 printf("\t no kinks \n");
2132 printf("\t accept: %3.2f < n sigma_{e,TPC} < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine );
2133 printf("\t reject: %3.2f < p_{e,T} < %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMinPnSigmaAbovePionLine, fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLine );
2134 printf("\t reject: p_{e,T} > %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLineHighPt );
2135 if (fDoPionRejectionLowP) printf("\t reject: p_{e,T} < %3.2f, -%3.2f < n sigma_{pi,TPC} < %3.2f\n", fPIDMinPPionRejectionLowP, fPIDnSigmaAtLowPAroundPionLine, fPIDnSigmaAtLowPAroundPionLine );
2136 if (fDoKaonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{K,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundKaonLine, fPIDnSigmaAtLowPAroundKaonLine );
2137 if (fDoProtonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{K,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundProtonLine, fPIDnSigmaAtLowPAroundProtonLine );
2138 if (fUseTOFpid) printf("\t accept: %3.2f < n sigma_{e,TOF} < %3.2f\n", fTofPIDnSigmaBelowElectronLine, fTofPIDnSigmaAboveElectronLine);
2140 printf("Photon cuts: \n");
2141 if (fUseOnFlyV0Finder) printf("\t using Onfly V0 finder \n");
2142 else printf("\t using Offline V0 finder \n");
2144 printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2146 printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2148 if (fDo2DPsiPairChi2){
2149 printf("\t 2 dimensional triangle chi^{2} and psi_{pair} cut applied with maximum of chi^{2} = %3.2f and |psi_{pair}| = %3.2f \n", fChi2CutConversion, fPsiPairCut );
2151 printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion );
2152 printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut );
2154 printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR );
2155 printf("\t Z_{conv} < %3.2f\n", fMaxZ );
2156 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut );
2157 else printf("\t eta_{conv} < %3.2f\n", fEtaCut );
2158 if (fDoPhotonAsymmetryCut) printf("\t for p_{T,track} > %3.2f, A_{gamma} < %3.2f \n", fMinPPhotonAsymmetryCut, fMinPhotonAsymmetry );
2159 if (fUseCorrectedTPCClsInfo) printf("\t #cluster TPC/ #findable clusters TPC (corrected for radius) > %3.2f\n", fMinClsTPCToF );
2160 printf("\t p_{T,gamma} > %3.2f\n", fPtCut );
2161 printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut );
2162 printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut );
2163 printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut );
2164 if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut );
2167 ///________________________________________________________________________
2168 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2176 fDetectorCentrality=0;
2180 fDetectorCentrality=1;
2182 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2184 fDetectorCentrality=0;
2185 fModCentralityClass=1;
2187 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2189 fDetectorCentrality=0;
2190 fModCentralityClass=2;
2192 case 5: //strict cut on v0 tracks for MC
2194 fDetectorCentrality=0;
2195 fModCentralityClass=3;
2197 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2198 //strict cut on v0 tracks for MC
2200 fDetectorCentrality=0;
2201 fModCentralityClass=4;
2203 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2204 //strict cut on v0 tracks for MC
2206 fDetectorCentrality=0;
2207 fModCentralityClass=5;
2211 fDetectorCentrality=0;
2215 fDetectorCentrality=1;
2218 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2224 //___________________________________________________________________
2225 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2228 if(minCentrality<0||minCentrality>9){
2229 AliError(Form("minCentrality not defined %d",minCentrality));
2233 fCentralityMin=minCentrality;
2236 //___________________________________________________________________
2237 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2240 if(maxCentrality<0||maxCentrality>9){
2241 AliError(Form("maxCentrality not defined %d",maxCentrality));
2244 fCentralityMax=maxCentrality;
2247 ///________________________________________________________________________
2248 Bool_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2251 switch(selectSpecialTrigger){
2253 fSpecialTrigger=0; // dont care
2256 fSpecialTrigger=1; // V0AND
2259 fSpecialTrigger=2; // with SDD requested
2262 fSpecialTrigger=3; // V0AND plus with SDD requested
2264 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2266 fSpecialTrigger=4; // trigger alias kTRD
2267 fOfflineTriggerMask=AliVEvent::kTRD;
2268 fTriggerSelectedManually = kTRUE;
2269 fSpecialTriggerName="AliVEvent::kTRD";
2272 fSpecialTrigger=5; // trigger alias kEMC
2273 fOfflineTriggerMask=AliVEvent::kEMC7 | AliVEvent::kEMC8 | AliVEvent::kEMC1 ;
2274 fTriggerSelectedManually = kTRUE;
2275 fSpecialTriggerName="AliVEvent::kEMC7/kEMC8/kEMC1";
2278 fSpecialTrigger=6; // trigger alias kPHI
2279 fOfflineTriggerMask=AliVEvent::kPHI7 | AliVEvent::kPHI1 | AliVEvent::kPHI8 | AliVEvent::kPHOSPb;
2280 fTriggerSelectedManually = kTRUE;
2281 fSpecialTriggerName="AliVEvent::kPHI7/kPHI1/kPHI8/kPHOSPb";
2284 fSpecialTrigger=7; // trigger alias kHighMult
2285 fOfflineTriggerMask=AliVEvent::kHighMult;
2286 fTriggerSelectedManually = kTRUE;
2287 fSpecialTriggerName="AliVEvent::kHighMult";
2290 fSpecialTrigger=8; // trigger alias kEMCEGA
2291 fOfflineTriggerMask=AliVEvent::kEMCEGA;
2292 fTriggerSelectedManually = kTRUE;
2293 fSpecialTriggerName="AliVEvent::kEMCEGA";
2296 fSpecialTrigger=9; // trigger alias kEMCEJE
2297 fOfflineTriggerMask=AliVEvent::kEMCEJE;
2298 fTriggerSelectedManually = kTRUE;
2299 fSpecialTriggerName="AliVEvent::kEMCEJE";
2302 AliError("Warning: Special Trigger Not known");
2308 ///________________________________________________________________________
2309 Bool_t AliConversionCuts::SetSelectSubTriggerClass(Int_t selectSpecialSubTriggerClass)
2312 if (fSpecialTrigger == 1){ //V0AND with different detectors
2313 switch(selectSpecialSubTriggerClass){
2314 case 0: //with VZERO
2316 fSpecialSubTrigger=0;
2317 // AliInfo("Info: Nothing to be done");
2319 case 1: //with TZERO
2321 fSpecialSubTrigger=0;
2322 fOfflineTriggerMask=AliVEvent::kINT8;
2323 fTriggerSelectedManually = kTRUE;
2324 fSpecialTriggerName="AliVEvent::kINT8";
2327 AliError("Warning: Special Subtrigger Class Not known");
2331 } else if (fSpecialTrigger == 4){ // Subdivision of TRD trigger classes
2332 switch(selectSpecialSubTriggerClass){
2333 case 0: // all together
2334 fSpecialSubTrigger=0;
2335 fSpecialSubTriggerName="";
2336 // AliInfo("Info: Nothing to be done");
2338 case 1: // 7WUHSH - V0AND with single electron in TRD & EMCAL
2339 fSpecialSubTrigger=1;
2340 fNSpecialSubTriggerOptions=1;
2341 fSpecialSubTriggerName="7WUHEE";
2343 case 2: // 8WUHSH - T0AND with single electron in TRD & EMCAL
2344 fSpecialSubTrigger=1;
2345 fNSpecialSubTriggerOptions=1;
2346 fSpecialSubTriggerName="8WUHEE";
2348 case 3: // 7WUHSE - V0AND with single high pt electron in TRD
2349 fSpecialSubTrigger=1;
2350 fNSpecialSubTriggerOptions=1;
2351 fSpecialSubTriggerName="7WUHSE";
2353 case 4: // 8WUHSE - T0AND with single high pt electron in TRD
2354 fSpecialSubTrigger=1;
2355 fNSpecialSubTriggerOptions=1;
2356 fSpecialSubTriggerName="8WUHSE";
2358 case 5: // 7WUHJE - V0AND with jet in TRD
2359 fSpecialSubTrigger=1;
2360 fNSpecialSubTriggerOptions=1;
2361 fSpecialSubTriggerName="7WUHJT";
2363 case 6: // 8WUHJE - T0AND with jet in TRD
2364 fSpecialSubTrigger=1;
2365 fNSpecialSubTriggerOptions=1;
2366 fSpecialSubTriggerName="8WUHJT";
2368 case 7: // 7WUHQU - V0AND with dielectron pair in TRD
2369 fSpecialSubTrigger=1;
2370 fNSpecialSubTriggerOptions=1;
2371 fSpecialSubTriggerName="7WUHQU";
2373 case 8: // 8WUHQU - T0AND with dielectron pair in TRD
2374 fSpecialSubTrigger=1;
2375 fNSpecialSubTriggerOptions=1;
2376 fSpecialSubTriggerName="8WUHQU";
2379 AliError("Warning: Special Subtrigger Class Not known");
2382 } else if (fSpecialTrigger == 5){ // Subdivision of kEMC trigger classes
2383 switch(selectSpecialSubTriggerClass){
2384 case 0: // all together
2385 fSpecialSubTrigger=0;
2386 fSpecialSubTriggerName="";
2387 // AliInfo("Info: Nothing to be done");
2389 case 1: // CEMC1 - V0OR and EMCAL fired
2390 fOfflineTriggerMask=AliVEvent::kEMC1;
2391 fSpecialTriggerName="AliVEvent::kEMC1";
2392 fSpecialSubTrigger=1;
2393 fNSpecialSubTriggerOptions=1;
2394 fSpecialSubTriggerName="CEMC1";
2396 case 2: // CEMC7 - V0AND and EMCAL fired
2397 fSpecialSubTrigger=1;
2398 fOfflineTriggerMask=AliVEvent::kEMC7;
2399 fSpecialTriggerName="AliVEvent::kEMC7";
2400 fNSpecialSubTriggerOptions=1;
2401 fSpecialSubTriggerName="CEMC7";
2403 case 3: // CEMC8 - T0OR and EMCAL fired
2404 fOfflineTriggerMask=AliVEvent::kEMC8;
2405 fSpecialTriggerName="AliVEvent::kEMC8";
2406 fSpecialSubTrigger=1;
2407 fNSpecialSubTriggerOptions=1;
2408 fSpecialSubTriggerName="CEMC8";
2411 AliError("Warning: Special Subtrigger Class Not known");
2414 } else if (fSpecialTrigger == 6){ // Subdivision of kPHI trigger classes
2415 switch(selectSpecialSubTriggerClass){
2416 case 0: // all together
2417 fSpecialSubTrigger=0;
2418 fSpecialSubTriggerName="";
2419 // AliInfo("Info: Nothing to be done");
2421 case 1: // CEMC1 - V0OR and EMCAL fired
2422 fOfflineTriggerMask=AliVEvent::kPHI1;
2423 fSpecialTriggerName="AliVEvent::kPHI1";
2424 fSpecialSubTrigger=1;
2425 fNSpecialSubTriggerOptions=1;
2426 fSpecialSubTriggerName="CPHI1";
2428 case 2: // CEMC7 - V0AND and EMCAL fired
2429 fSpecialSubTrigger=1;
2430 fOfflineTriggerMask=AliVEvent::kPHI7;
2431 fSpecialTriggerName="AliVEvent::kPHI7";
2432 fNSpecialSubTriggerOptions=1;
2433 fSpecialSubTriggerName="CPHI7";
2435 case 3: // CEMC8 - T0OR and EMCAL fired
2436 fOfflineTriggerMask=AliVEvent::kPHI8;
2437 fSpecialTriggerName="AliVEvent::kPHI8";
2438 fSpecialSubTrigger=1;
2439 fNSpecialSubTriggerOptions=1;
2440 fSpecialSubTriggerName="CPHI8";
2443 AliError("Warning: Special Subtrigger Class Not known");
2446 } else if (fSpecialTrigger == 7){ // Subdivision of kHighMult trigger classes
2447 switch(selectSpecialSubTriggerClass){
2448 case 0: // all together
2449 fSpecialSubTrigger=0;
2450 fSpecialSubTriggerName="";
2451 // AliInfo("Info: Nothing to be done");
2453 case 1: // CSHM1 - V0OR and high mult fired
2454 fSpecialSubTrigger=1;
2455 fNSpecialSubTriggerOptions=1;
2456 fSpecialSubTriggerName="CSHM1";
2458 case 2: // CSHM7 - V0AND and high mult fired
2459 fSpecialSubTrigger=1;
2460 fNSpecialSubTriggerOptions=1;
2461 fSpecialSubTriggerName="CSHM7";
2463 case 3: // CSHM8 - T0OR and high mult fired
2464 fSpecialSubTrigger=1;
2465 fNSpecialSubTriggerOptions=1;
2466 fSpecialSubTriggerName="CSHM8";
2469 AliError("Warning: Special Subtrigger Class Not known");
2472 } else if (fSpecialTrigger == 8){ // Subdivision of kEMCEGA trigger classes
2473 switch(selectSpecialSubTriggerClass){
2474 case 0: // all together
2475 fSpecialSubTrigger=0;
2476 fSpecialSubTriggerName="";
2477 // AliInfo("Info: Nothing to be done");
2479 case 1: // 7EGA - CINT7 EGA
2480 fSpecialSubTrigger=1;
2481 fNSpecialSubTriggerOptions=1;
2482 fSpecialSubTriggerName="7EGA";
2484 case 2: // 8EGA - CINT8 EGA
2485 fSpecialSubTrigger=1;
2486 fNSpecialSubTriggerOptions=1;
2487 fSpecialSubTriggerName="8EGA";
2489 case 3: // 7EG1 - CINT7 EG1
2490 fSpecialSubTrigger=1;
2491 fNSpecialSubTriggerOptions=1;
2492 fSpecialSubTriggerName="7EG1";
2494 case 4: // 8EG1 - CINT8 EG1
2495 fSpecialSubTrigger=1;
2496 fNSpecialSubTriggerOptions=1;
2497 fSpecialSubTriggerName="8EG1";
2499 case 5: // 7EG2 - CINT7 EG2
2500 fSpecialSubTrigger=1;
2501 fNSpecialSubTriggerOptions=1;
2502 fSpecialSubTriggerName="7EG2";
2504 case 6: // 8EG2 - CINT8 EG2
2505 fSpecialSubTrigger=1;
2506 fNSpecialSubTriggerOptions=1;
2507 fSpecialSubTriggerName="8EG2";
2510 AliError("Warning: Special Subtrigger Class Not known");
2513 } else if (fSpecialTrigger == 9){ // Subdivision of kEMCEGA trigger classes
2514 switch(selectSpecialSubTriggerClass){
2515 case 0: // all together
2516 fSpecialSubTrigger=0;
2517 fSpecialSubTriggerName="";
2518 // AliInfo("Info: Nothing to be done");
2520 case 1: // 7EJE - CINT7 EJE
2521 fSpecialSubTrigger=1;
2522 fNSpecialSubTriggerOptions=1;
2523 fSpecialSubTriggerName="7EJE";
2525 case 2: // 8EJE - CINT8 EJE
2526 fSpecialSubTrigger=1;
2527 fNSpecialSubTriggerOptions=1;
2528 fSpecialSubTriggerName="8EJE";
2530 case 3: // 7EJ1 - CINT7 EJ1
2531 fSpecialSubTrigger=1;
2532 fNSpecialSubTriggerOptions=1;
2533 fSpecialSubTriggerName="7EJ1";
2535 case 4: // 8EJ1 - CINT8 EJ1
2536 fSpecialSubTrigger=1;
2537 fNSpecialSubTriggerOptions=1;
2538 fSpecialSubTriggerName="8EJ1";
2540 case 5: // 7EJ2 - CINT7 EJ2
2541 fSpecialSubTrigger=1;
2542 fNSpecialSubTriggerOptions=1;
2543 fSpecialSubTriggerName="7EJ2";
2545 case 6: // 8EJ2 - CINT8 EJ2
2546 fSpecialSubTrigger=1;
2547 fNSpecialSubTriggerOptions=1;
2548 fSpecialSubTriggerName="8EJ2";
2551 AliError("Warning: Special Subtrigger Class Not known");
2558 ///________________________________________________________________________
2559 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2562 fMultiplicityMethod=multiplicityMethod;
2564 // 0 Photon Multiplicity
2565 // 1 TPC Track multiplicity
2571 ///________________________________________________________________________
2572 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2574 switch(removePileUp){
2576 fRemovePileUp=kFALSE;
2579 fRemovePileUp=kTRUE;
2582 AliError("RemovePileUpCut not defined");
2587 ///________________________________________________________________________
2588 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2590 switch(extraSignal){
2592 fRejectExtraSignals = 0;
2593 break; // No Rejection
2595 fRejectExtraSignals = 1;
2596 break; // MinBias Header
2598 fRejectExtraSignals = 2;
2599 break; // User String Array
2601 fRejectExtraSignals = 3;
2602 break; // Rejection for Gamma Correction only
2604 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2609 ///________________________________________________________________________
2610 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2612 switch (v0FinderType){
2613 case 0: // on fly V0 finder
2614 cout << "have chosen onfly V0" << endl;
2615 fUseOnFlyV0Finder=kTRUE;
2617 case 1: // offline V0 finder
2618 cout << "have chosen offline V0" << endl;
2619 fUseOnFlyV0Finder=kFALSE;
2622 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2627 ///________________________________________________________________________
2628 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2631 //Set Standard LineCutZValues
2632 fLineCutZValueMin = -2;
2633 fLineCutZValue = 7.;
2638 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2640 fLineCutZRSlopeMin = 0.;
2642 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2644 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2646 fLineCutZRSlopeMin = 0.;
2650 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2652 fLineCutZRSlopeMin = 0.;
2656 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2658 fLineCutZRSlopeMin = 0.;
2662 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2664 fLineCutZRSlopeMin = 0.;
2668 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2670 fLineCutZRSlopeMin = 0.;
2674 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2676 fLineCutZRSlopeMin = 0.;
2679 if (fIsHeavyIon==1){
2681 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2683 fLineCutZRSlopeMin = 0.;
2687 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2689 fLineCutZRSlopeMin = 0.;
2692 // case 8: // 0.1 - 0.8
2694 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2695 // fEtaCutMin = 0.1;
2696 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2700 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2702 fLineCutZRSlopeMin = 0.;
2706 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2708 fLineCutZRSlopeMin = 0.;
2711 AliError(Form(" EtaCut not defined %d",etaCut));
2716 ///________________________________________________________________________
2717 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2750 fMinR = 35.; //old 26.
2762 AliError("RCut not defined");
2767 ///________________________________________________________________________
2768 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2770 switch(singlePtCut){
2771 case 0: // 0.050 GeV
2772 fSinglePtCut = 0.050;
2774 case 1: // 0.100 GeV
2775 fSinglePtCut = 0.100;
2777 case 2: // 0.150 GeV
2778 fSinglePtCut = 0.150;
2780 case 3: // 0.200 GeV
2781 fSinglePtCut = 0.200;
2783 case 4: // 0.075 GeV
2784 fSinglePtCut = 0.075;
2786 case 5: // 0.125 GeV
2787 fSinglePtCut = 0.125;
2790 fSinglePtCut = 0.040;
2796 AliError(Form("singlePtCut not defined %d",singlePtCut));
2801 ///________________________________________________________________________
2802 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2817 case 4: // 95% of findable clusters
2818 fMinClsTPCToF= 0.95;
2819 fUseCorrectedTPCClsInfo=1;
2821 case 5: // 0% of findable clusters
2823 fUseCorrectedTPCClsInfo=1;
2825 case 6: // 70% of findable clusters
2827 fUseCorrectedTPCClsInfo=1;
2829 case 7: // 0% of findable clusters
2830 fMinClsTPCToF= 0.35;
2831 fUseCorrectedTPCClsInfo=0;
2834 fMinClsTPCToF= 0.35;
2835 fUseCorrectedTPCClsInfo=1;
2839 fUseCorrectedTPCClsInfo=1;
2842 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2847 ///________________________________________________________________________
2848 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2850 switch(ededxSigmaCut){
2852 fPIDnSigmaBelowElectronLine=-10;
2853 fPIDnSigmaAboveElectronLine=10;
2856 fPIDnSigmaBelowElectronLine=-5;
2857 fPIDnSigmaAboveElectronLine=5;
2860 fPIDnSigmaBelowElectronLine=-3;
2861 fPIDnSigmaAboveElectronLine=5;
2864 fPIDnSigmaBelowElectronLine=-4;
2865 fPIDnSigmaAboveElectronLine=5;
2868 fPIDnSigmaBelowElectronLine=-6;
2869 fPIDnSigmaAboveElectronLine=7;
2872 fPIDnSigmaBelowElectronLine=-4;
2873 fPIDnSigmaAboveElectronLine=4;
2876 fPIDnSigmaBelowElectronLine=-2.5;
2877 fPIDnSigmaAboveElectronLine=4;
2880 fPIDnSigmaBelowElectronLine=-2;
2881 fPIDnSigmaAboveElectronLine=3.5;
2884 AliError("TPCdEdxCutElectronLine not defined");
2890 ///________________________________________________________________________
2891 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2894 switch(pidedxSigmaCut){
2896 fPIDnSigmaAbovePionLine=-10;
2897 fPIDnSigmaAbovePionLineHighPt=-10;
2900 fPIDnSigmaAbovePionLine=0;
2901 fPIDnSigmaAbovePionLineHighPt=-10;
2904 fPIDnSigmaAbovePionLine=1;
2905 fPIDnSigmaAbovePionLineHighPt=-10;
2908 fPIDnSigmaAbovePionLine=2.5;
2909 fPIDnSigmaAbovePionLineHighPt=-10;
2912 fPIDnSigmaAbovePionLine=0.5;
2913 fPIDnSigmaAbovePionLineHighPt=-10;
2916 fPIDnSigmaAbovePionLine=2.;
2917 fPIDnSigmaAbovePionLineHighPt=-10;
2920 fPIDnSigmaAbovePionLine=2.;
2921 fPIDnSigmaAbovePionLineHighPt=0.5;
2924 fPIDnSigmaAbovePionLine=3.5;
2925 fPIDnSigmaAbovePionLineHighPt=-10;
2928 fPIDnSigmaAbovePionLine=2.;
2929 fPIDnSigmaAbovePionLineHighPt=1.;
2932 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2933 fPIDnSigmaAbovePionLineHighPt=-10;
2936 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2941 ///________________________________________________________________________
2942 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2944 switch(piMomdedxSigmaCut){
2946 fPIDMinPnSigmaAbovePionLine=0.5;
2949 fPIDMinPnSigmaAbovePionLine=1.;
2952 fPIDMinPnSigmaAbovePionLine=1.5;
2955 fPIDMinPnSigmaAbovePionLine=20.;
2958 fPIDMinPnSigmaAbovePionLine=50.;
2961 fPIDMinPnSigmaAbovePionLine=0.3;
2964 fPIDMinPnSigmaAbovePionLine=0.25;
2967 fPIDMinPnSigmaAbovePionLine=0.4;
2970 fPIDMinPnSigmaAbovePionLine=0.2;
2973 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2978 ///________________________________________________________________________
2979 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2981 switch(piMaxMomdedxSigmaCut){
2983 fPIDMaxPnSigmaAbovePionLine=100.;
2986 fPIDMaxPnSigmaAbovePionLine=5.;
2989 fPIDMaxPnSigmaAbovePionLine=4.;
2992 fPIDMaxPnSigmaAbovePionLine=3.5;
2995 fPIDMaxPnSigmaAbovePionLine=3.;
2998 fPIDMaxPnSigmaAbovePionLine=7.;
3001 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
3006 ///________________________________________________________________________
3007 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
3009 switch(LowPRejectionSigmaCut){
3011 fPIDnSigmaAtLowPAroundKaonLine=0;
3012 fPIDnSigmaAtLowPAroundProtonLine=0;
3013 fPIDnSigmaAtLowPAroundPionLine=0;
3014 fDoKaonRejectionLowP = kFALSE;
3015 fDoProtonRejectionLowP = kFALSE;
3016 fDoPionRejectionLowP = kFALSE;
3017 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3020 fPIDnSigmaAtLowPAroundKaonLine=0.5;
3021 fPIDnSigmaAtLowPAroundProtonLine=0.5;
3022 fPIDnSigmaAtLowPAroundPionLine=0.5;
3023 fDoKaonRejectionLowP = kTRUE;
3024 fDoProtonRejectionLowP = kTRUE;
3025 fDoPionRejectionLowP = kTRUE;
3026 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3029 fPIDnSigmaAtLowPAroundKaonLine=1;
3030 fPIDnSigmaAtLowPAroundProtonLine=1;
3031 fPIDnSigmaAtLowPAroundPionLine=1;
3032 fDoKaonRejectionLowP = kTRUE;
3033 fDoProtonRejectionLowP = kTRUE;
3034 fDoPionRejectionLowP = kTRUE;
3035 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3038 fPIDnSigmaAtLowPAroundKaonLine=2.;
3039 fPIDnSigmaAtLowPAroundProtonLine=2.;
3040 fPIDnSigmaAtLowPAroundPionLine=2.;
3041 fDoKaonRejectionLowP = kTRUE;
3042 fDoProtonRejectionLowP = kTRUE;
3043 fDoPionRejectionLowP = kTRUE;
3044 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3047 fPIDnSigmaAtLowPAroundKaonLine=0.;
3048 fPIDnSigmaAtLowPAroundProtonLine=0.;
3049 fPIDnSigmaAtLowPAroundPionLine=1;
3050 fDoKaonRejectionLowP = kFALSE;
3051 fDoProtonRejectionLowP = kFALSE;
3052 fDoPionRejectionLowP = kTRUE;
3053 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3056 fPIDnSigmaAtLowPAroundKaonLine=0.;
3057 fPIDnSigmaAtLowPAroundProtonLine=0.;
3058 fPIDnSigmaAtLowPAroundPionLine=1.5;
3059 fDoKaonRejectionLowP = kFALSE;
3060 fDoProtonRejectionLowP = kFALSE;
3061 fDoPionRejectionLowP = kTRUE;
3062 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3065 fPIDnSigmaAtLowPAroundKaonLine=0.;
3066 fPIDnSigmaAtLowPAroundProtonLine=0.;
3067 fPIDnSigmaAtLowPAroundPionLine=2.;
3068 fDoKaonRejectionLowP = kFALSE;
3069 fDoProtonRejectionLowP = kFALSE;
3070 fDoPionRejectionLowP = kTRUE;
3071 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3074 fPIDnSigmaAtLowPAroundKaonLine=0.;
3075 fPIDnSigmaAtLowPAroundProtonLine=0.;
3076 fPIDnSigmaAtLowPAroundPionLine=0.5;
3077 fDoKaonRejectionLowP = kFALSE;
3078 fDoProtonRejectionLowP = kFALSE;
3079 fDoPionRejectionLowP = kTRUE;
3080 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
3083 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
3088 ///________________________________________________________________________
3089 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
3091 switch(TOFelectronPID){
3093 fUseTOFpid = kFALSE;
3094 fTofPIDnSigmaBelowElectronLine=-100;
3095 fTofPIDnSigmaAboveElectronLine=100;
3099 fTofPIDnSigmaBelowElectronLine=-7;
3100 fTofPIDnSigmaAboveElectronLine=7;
3104 fTofPIDnSigmaBelowElectronLine=-5;
3105 fTofPIDnSigmaAboveElectronLine=5;
3109 fTofPIDnSigmaBelowElectronLine=-3;
3110 fTofPIDnSigmaAboveElectronLine=5;
3114 fTofPIDnSigmaBelowElectronLine=-2;
3115 fTofPIDnSigmaAboveElectronLine=3;
3119 fTofPIDnSigmaBelowElectronLine=-3;
3120 fTofPIDnSigmaAboveElectronLine=3;
3123 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
3128 ///________________________________________________________________________
3129 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
3134 fDoQtGammaSelection=kFALSE;
3174 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
3179 ///________________________________________________________________________
3180 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
3183 switch(chi2GammaCut){
3185 fChi2CutConversion = 100.;
3188 fChi2CutConversion = 50.;
3191 fChi2CutConversion = 30.;
3194 fChi2CutConversion = 200.;
3197 fChi2CutConversion = 500.;
3200 fChi2CutConversion = 100000.;
3203 fChi2CutConversion = 5.;
3206 fChi2CutConversion = 10.;
3209 fChi2CutConversion = 20.;
3212 fChi2CutConversion = 15.;
3215 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
3220 ///________________________________________________________________________
3221 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
3225 fPsiPairCut = 10000; //
3228 fPsiPairCut = 0.1; //
3231 fPsiPairCut = 0.05; // Standard
3234 fPsiPairCut = 0.035; //
3237 fPsiPairCut = 0.2; //
3240 fPsiPairCut = 0.1; //
3241 fDo2DPsiPairChi2 = kTRUE;
3244 fPsiPairCut = 0.05; //
3245 fDo2DPsiPairChi2 = kTRUE;
3248 fPsiPairCut = 0.035; //
3249 fDo2DPsiPairChi2 = kTRUE;
3252 fPsiPairCut = 0.2; //
3253 fDo2DPsiPairChi2 = kTRUE; //
3256 fPsiPairCut = 0.5; //
3259 AliError(Form("PsiPairCut not defined %d",psiCut));
3265 ///________________________________________________________________________
3266 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
3268 switch(doPhotonAsymmetryCut){
3270 fDoPhotonAsymmetryCut=0;
3271 fMinPPhotonAsymmetryCut=100.;
3272 fMinPhotonAsymmetry=0.;
3275 fDoPhotonAsymmetryCut=1;
3276 fMinPPhotonAsymmetryCut=3.5;
3277 fMinPhotonAsymmetry=0.04;
3280 fDoPhotonAsymmetryCut=1;
3281 fMinPPhotonAsymmetryCut=3.5;
3282 fMinPhotonAsymmetry=0.06;
3285 fDoPhotonAsymmetryCut=1;
3286 fMinPPhotonAsymmetryCut=0.0;
3287 fMinPhotonAsymmetry=0.05;
3290 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
3293 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
3296 ///________________________________________________________________________
3297 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
3307 fCosPAngleCut = 0.5;
3310 fCosPAngleCut = 0.75;
3313 fCosPAngleCut = 0.85;
3316 fCosPAngleCut = 0.88;
3319 fCosPAngleCut = 0.9;
3322 fCosPAngleCut = 0.95;
3325 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
3331 ///________________________________________________________________________
3332 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
3336 fDoSharedElecCut = kFALSE;
3337 fDoPhotonQualitySelectionCut = kFALSE;
3338 fPhotonQualityCut = 0;
3341 fDoSharedElecCut = kTRUE;
3342 fDoPhotonQualitySelectionCut = kFALSE;
3343 fPhotonQualityCut = 0;
3346 fDoSharedElecCut = kFALSE;
3347 fDoPhotonQualitySelectionCut = kTRUE;
3348 fPhotonQualityCut = 1;
3351 fDoSharedElecCut = kFALSE;
3352 fDoPhotonQualitySelectionCut = kTRUE;
3353 fPhotonQualityCut = 2;
3356 fDoSharedElecCut = kFALSE;
3357 fDoPhotonQualitySelectionCut = kTRUE;
3358 fPhotonQualityCut = 3;
3361 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3367 ///________________________________________________________________________
3368 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3372 fDoToCloseV0sCut = kFALSE;
3376 fDoToCloseV0sCut = kTRUE;
3380 fDoToCloseV0sCut = kTRUE;
3384 fDoToCloseV0sCut = kTRUE;
3388 AliError(Form("Shared Electron Cut not defined %d",toClose));
3393 ///________________________________________________________________________
3394 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3396 switch(TRDElectronCut){
3402 fPIDTRDEfficiency=0.1;
3406 fPIDTRDEfficiency=0.8;
3410 fPIDTRDEfficiency=0.9;
3413 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3420 ///________________________________________________________________________
3421 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3423 switch(DCAZPhotonPrimVtx){
3425 fDCAZPrimVtxCut = 1000;
3428 fDCAZPrimVtxCut = 10;
3431 fDCAZPrimVtxCut = 5;
3434 fDCAZPrimVtxCut = 4;
3437 fDCAZPrimVtxCut = 3;
3440 fDCAZPrimVtxCut = 2.5;
3443 fDCAZPrimVtxCut = 2;
3446 fDCAZPrimVtxCut = 1.5;
3449 fDCAZPrimVtxCut = 1;
3452 fDCAZPrimVtxCut = 0.5;
3455 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3461 ///________________________________________________________________________
3462 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3464 switch(DCARPhotonPrimVtx){
3466 fDCARPrimVtxCut = 1000;
3469 fDCARPrimVtxCut = 10;
3472 fDCARPrimVtxCut = 5;
3475 fDCARPrimVtxCut = 4;
3478 fDCARPrimVtxCut = 3;
3481 fDCARPrimVtxCut = 2.5;
3484 fDCARPrimVtxCut = 2;
3487 fDCARPrimVtxCut = 1.5;
3490 fDCARPrimVtxCut = 1;
3493 fDCARPrimVtxCut = 0.5;
3496 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3502 ///________________________________________________________________________
3503 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3507 fInPlaneOutOfPlane = 0; // No Event Plane
3510 fInPlaneOutOfPlane = 1; // In-Plane
3513 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3516 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3523 //-------------------------------------------------------------
3524 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3525 { // Get Event Centrality
3527 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3529 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3531 if(fDetectorCentrality==0){
3532 if (fIsHeavyIon==2){
3533 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3535 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3538 if(fDetectorCentrality==1){
3539 return fESDCentrality->GetCentralityPercentile("CL1");
3543 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3545 if(aodEvent->GetHeader()){return ((AliVAODHeader*)aodEvent->GetHeader())->GetCentrality();}
3550 //-------------------------------------------------------------
3551 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3552 { // Centrality Selection
3553 if(!fIsHeavyIon)return kTRUE;
3555 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3556 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3558 Double_t centrality=GetCentrality(event);
3559 if(centrality<0)return kFALSE;
3561 Int_t centralityC=0;
3562 if (fModCentralityClass == 0){
3563 centralityC= Int_t(centrality/10);
3564 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3568 else if (fModCentralityClass ==1){
3569 centralityC= Int_t(centrality);
3570 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3572 } else return kFALSE;
3574 else if (fModCentralityClass ==2){
3575 centralityC= Int_t(centrality);
3576 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3581 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3582 Int_t PrimaryTracks10[10][2] =
3595 Int_t PrimaryTracks5a[10][2] =
3608 Int_t PrimaryTracks5b[10][2] =
3622 if(event->IsA()==AliESDEvent::Class()) column = 0;
3623 if(event->IsA()==AliAODEvent::Class()) column = 1;
3625 if (fModCentralityClass == 3){
3627 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3632 centralityC= Int_t(centrality/10);
3633 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3638 else if (fModCentralityClass ==4){
3640 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3645 centralityC= Int_t(centrality);
3646 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3648 } else return kFALSE;
3651 else if (fModCentralityClass ==5){
3653 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3658 centralityC= Int_t(centrality);
3659 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3667 ///________________________________________________________________________
3668 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3669 // Cut on z position of primary vertex
3670 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3671 Double_t fVertexZSPD = 0;
3672 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3674 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3676 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3678 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3681 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3683 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3684 ->GetTask("V0ReaderV1"))->GetPeriodName();
3685 if (periodName.CompareTo("LHC11h")==0){
3686 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3688 if (fIsHeavyIon == 2){
3689 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3690 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3691 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3696 ///________________________________________________________________________
3698 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3699 // returns number of contributors to the vertex
3701 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3703 if (fESDEvent->GetPrimaryVertex() != NULL){
3704 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3705 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3706 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3710 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3711 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3712 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3713 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3715 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3716 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3722 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3724 if (fAODEvent->GetPrimaryVertex() != NULL){
3725 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3726 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3729 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3730 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3731 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3733 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3738 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3742 ///________________________________________________________________________
3744 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3747 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3748 // AliTRDTriggerAnalysis *trdSelection= new AliTRDTriggerAnalysis();
3749 // trdSelection->CalcTriggers(fInputEvent);
3751 UInt_t isSelected = AliVEvent::kAny;
3752 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3753 // cout << periodName.Data() << endl;
3755 if (fInputHandler==NULL) return kFALSE;
3756 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3758 TString firedTrigClass = fInputEvent->GetFiredTriggerClasses();
3759 if (!fTriggerSelectedManually){
3760 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3762 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3763 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3764 else if (periodName.CompareTo("LHC11c") == 0 || periodName.CompareTo("LHC11d") == 0 || periodName.CompareTo("LHC11e") == 0 || periodName.CompareTo("LHC11f") == 0 || periodName.CompareTo("LHC11g") == 0 || periodName.CompareTo("LHC12a") == 0 || periodName.CompareTo("LHC12b") == 0 || periodName.CompareTo("LHC12c") == 0 || periodName.CompareTo("LHC12d") == 0 || periodName.CompareTo("LHC12f") == 0 || periodName.CompareTo("LHC12g") == 0 || periodName.CompareTo("LHC12h") == 0 || periodName.CompareTo("LHC12i") == 0 ||periodName.CompareTo("LHC13g") == 0 ) {
3765 fOfflineTriggerMask = AliVEvent::kINT7;
3766 // cout << "will take kINT7 as trigger mask" << endl;
3768 else fOfflineTriggerMask = AliVEvent::kMB;
3771 // Get the actual offline trigger mask for the event and AND it with the
3772 // requested mask. If no mask requested select by default the event.
3773 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3774 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3776 if (fOfflineTriggerMask){
3777 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3778 if (isSelected && !fPreSelCut){
3779 // if (fSpecialTriggerName.Contains("kTRD")){ // make special selection for TRD trigger
3780 // Bool_t bTRDHasFiredConfirmed= 0; // bool whether the TRD has triggered and has been read out due to that trigger & should have triggered
3781 // Bool_t bTRDClassContainedInTriggerList= 1; //check whether the trigger list contains the requested trigger
3782 // if (fSpecialSubTrigger>0){
3783 // if (fSpecialSubTriggerName.Contains("HSE")){
3784 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHSE);
3785 // } else if (fSpecialSubTriggerName.Contains("HJT")){
3786 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHJT);
3787 // } else if (fSpecialSubTriggerName.Contains("HEE")){
3788 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHEE);
3789 // } else if (fSpecialSubTriggerName.Contains("HQU")){
3790 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHQU);
3792 // if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) bTRDClassContainedInTriggerList = 0;
3794 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHQU) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHSE) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHJT) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHEE);
3796 // if (!bTRDHasFiredConfirmed || !bTRDClassContainedInTriggerList) isSelected = 0;
3797 // } else { // more general condition for all other sub-triggers
3798 // if (fSpecialTriggerName.Contains("kEMCE"))cout << fSpecialTriggerName.Data() << "\t" <<fSpecialSubTriggerName.Data()<< endl;
3799 if (fSpecialSubTrigger>0){
3800 if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) isSelected = 0;
3802 // if (fSpecialTriggerName.Contains("kEMCE"))cout <<firedTrigClass << endl;
3807 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3811 if (fIsSDDFired) hTriggerClass->Fill(33);
3812 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3813 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3814 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3815 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3816 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3817 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3818 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3819 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3820 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3821 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3822 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3823 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3824 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3825 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3826 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3827 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3828 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3829 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3830 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3831 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3832 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3833 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3834 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3835 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3836 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3837 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3838 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3839 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3840 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3841 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3842 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3843 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3844 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3845 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3846 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3847 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3848 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3849 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3850 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3851 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3852 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3855 if(hTriggerClassSelected && isSelected){
3856 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3857 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3858 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3859 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3860 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3861 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3862 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3863 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3864 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3865 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3866 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3867 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3868 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3869 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3870 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3871 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3872 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3873 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3874 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3875 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3876 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3877 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3878 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3879 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3880 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3881 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3882 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3883 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3884 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3885 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3886 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3887 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3888 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3889 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3890 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3891 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3892 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3893 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3894 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3895 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3896 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3899 if(!isSelected)return kFALSE;
3905 ///________________________________________________________________________
3906 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3907 // Get first TPC row
3908 Int_t firstTPCRow = 0;
3909 Double_t radiusI = 84.8;
3910 Double_t radiusO = 134.6;
3911 Double_t radiusOB = 198.;
3912 Double_t rSizeI = 0.75;
3913 Double_t rSizeO = 1.;
3914 Double_t rSizeOB = 1.5;
3918 if(radius <= radiusI){
3921 if(radius>radiusI && radius<=radiusO){
3922 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3924 if(radius>radiusO && radius<=radiusOB){
3925 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3928 if(radius>radiusOB){
3929 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3935 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3936 ///Check if passes cosine of pointing angle cut
3937 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3943 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3944 // calculates the pointing angle of the recalculated V0
3946 Double_t momV0[3] = {0,0,0};
3947 if(event->IsA()==AliESDEvent::Class()){
3948 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3949 if(!esdEvent) return -999;
3950 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3951 if(!v0) return -999;
3952 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3954 if(event->IsA()==AliAODEvent::Class()){
3955 momV0[0] = photon->GetPx();
3956 momV0[1] = photon->GetPy();
3957 momV0[2] = photon->GetPz();
3960 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3961 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3962 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3963 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3965 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3966 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3969 Double_t cosinePointingAngle = -999;
3970 if(momV02*PosV02 > 0.0)
3971 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3973 return cosinePointingAngle;
3976 ///________________________________________________________________________
3977 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3979 if (fDo2DPsiPairChi2){
3980 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3986 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3992 ///________________________________________________________________________
3993 TString AliConversionCuts::GetCutNumber(){
3994 // returns TString with current cut number
3996 for(Int_t ii=0;ii<kNCuts;ii++){
3997 a.Append(Form("%d",fCuts[ii]));
4002 ///________________________________________________________________________
4003 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
4005 Int_t posLabel = photon->GetTrackLabelPositive();
4006 Int_t negLabel = photon->GetTrackLabelNegative();
4008 fElectronLabelArray[nV0*2] = posLabel;
4009 fElectronLabelArray[(nV0*2)+1] = negLabel;
4011 ///________________________________________________________________________
4012 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
4014 Int_t posLabel = photon->GetTrackLabelPositive();
4015 Int_t negLabel = photon->GetTrackLabelNegative();
4017 for(Int_t i = 0; i<nV0s*2;i++){
4018 if(i==nV0*2) continue;
4019 if(i==(nV0*2)+1) continue;
4020 if(fElectronLabelArray[i] == posLabel){
4022 if(fElectronLabelArray[i] == negLabel){
4028 ///________________________________________________________________________
4029 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
4032 Double_t posX = photon->GetConversionX();
4033 Double_t posY = photon->GetConversionY();
4034 Double_t posZ = photon->GetConversionZ();
4036 for(Int_t i = 0;i<photons->GetEntries();i++){
4037 if(nV0 == i) continue;
4038 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
4039 Double_t posCompX = photonComp->GetConversionX();
4040 Double_t posCompY = photonComp->GetConversionY();
4041 Double_t posCompZ = photonComp->GetConversionZ();
4043 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
4045 if(dist < fminV0Dist*fminV0Dist){
4046 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
4054 ///________________________________________________________________________
4055 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
4057 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
4060 if(fNotRejectedStart){
4061 delete[] fNotRejectedStart;
4062 fNotRejectedStart = NULL;
4064 if(fNotRejectedEnd){
4065 delete[] fNotRejectedEnd;
4066 fNotRejectedEnd = NULL;
4068 if(fGeneratorNames){
4069 delete[] fGeneratorNames;
4070 fGeneratorNames = NULL;
4073 if(rejection == 0) return; // No Rejection
4075 AliGenCocktailEventHeader *cHeader = 0x0;
4076 AliAODMCHeader *cHeaderAOD = 0x0;
4077 Bool_t headerFound = kFALSE;
4078 AliStack *fMCStack = 0x0;
4079 TClonesArray *fMCStackAOD = 0x0;
4080 if(MCEvent->IsA()==AliMCEvent::Class()){
4081 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4082 if(cHeader) headerFound = kTRUE;
4083 if(dynamic_cast<AliMCEvent*>(MCEvent))fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
4085 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
4086 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
4087 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4090 if(cHeaderAOD) headerFound = kTRUE;
4094 TList *genHeaders = 0x0;
4095 if(cHeader) genHeaders = cHeader->GetHeaders();
4097 genHeaders = cHeaderAOD->GetCocktailHeaders();
4098 if(genHeaders->GetEntries()==1){
4099 SetRejectExtraSignalsCut(0);
4103 AliGenEventHeader* gh = 0;
4105 Int_t firstindexA = 0;
4106 Int_t lastindexA = -1;
4107 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
4108 if(rejection == 2){ // TList of Headers Names
4109 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
4110 gh = (AliGenEventHeader*)genHeaders->At(i);
4111 TString GeneratorName = gh->GetName();
4112 lastindexA = lastindexA + gh->NProduced();
4113 // cout << i << "\t" << GeneratorName.Data() << endl;
4114 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
4115 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
4116 if(GeneratorName.CompareTo(GeneratorInList) == 0){
4117 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
4119 if (fMCStack->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
4120 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4121 if (gh->NProduced() > 10 && fMCStack->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
4122 // cout << "cond 1: "<< fnHeaders << endl;
4128 // cout << "cond 2: " << fnHeaders << endl;
4135 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
4136 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
4137 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4138 if (gh->NProduced() > 10){
4139 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA+10));
4140 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
4141 // cout << "cond 1: " << fnHeaders << endl;
4148 // cout << "cond 2: " << fnHeaders << endl;
4156 // cout << "cond 3: "<< fnHeaders << endl;
4161 firstindexA = firstindexA + gh->NProduced();
4164 // cout << "number of headers: " <<fnHeaders << endl;
4166 fNotRejectedStart = new Int_t[fnHeaders];
4167 fNotRejectedEnd = new Int_t[fnHeaders];
4168 fGeneratorNames = new TString[fnHeaders];
4170 if(rejection == 1 || rejection == 3){
4171 fNotRejectedStart[0] = 0;
4172 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
4173 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
4177 Int_t firstindex = 0;
4178 Int_t lastindex = -1;
4181 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
4182 gh = (AliGenEventHeader*)genHeaders->At(i);
4183 TString GeneratorName = gh->GetName();
4184 lastindex = lastindex + gh->NProduced();
4185 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
4186 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
4187 // cout << i << "\t" << GeneratorName.Data() << endl;
4188 if(GeneratorName.CompareTo(GeneratorInList) == 0){
4189 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
4191 if (fMCStack->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
4192 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4193 // cout << "produced " << gh->NProduced() << " with box generator" << endl;
4194 if (gh->NProduced() > 10 && fMCStack->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
4195 // cout << "one of them was a pi0 or eta" << endl;
4196 fNotRejectedStart[number] = firstindex;
4197 fNotRejectedEnd[number] = lastindex;
4198 fGeneratorNames[number] = GeneratorName;
4200 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
4204 fNotRejectedStart[number] = firstindex;
4205 fNotRejectedEnd[number] = lastindex;
4206 fGeneratorNames[number] = GeneratorName;
4213 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
4214 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
4215 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4216 if (gh->NProduced() > 10) {
4217 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex+10));
4218 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
4219 fNotRejectedEnd[number] = lastindex;
4220 fNotRejectedStart[number] = firstindex;
4221 fGeneratorNames[number] = GeneratorName;
4227 fNotRejectedStart[number] = firstindex;
4228 fNotRejectedEnd[number] = lastindex;
4229 fGeneratorNames[number] = GeneratorName;
4237 fNotRejectedStart[number] = firstindex;
4238 fNotRejectedEnd[number] = lastindex;
4239 fGeneratorNames[number] = GeneratorName;
4240 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
4247 firstindex = firstindex + gh->NProduced();
4249 // for (Int_t i = 0; i < number; i++){
4250 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
4253 } else { // No Cocktail Header Found
4254 fNotRejectedStart = new Int_t[1];
4255 fNotRejectedEnd = new Int_t[1];
4258 fNotRejectedStart[0] = 0;
4259 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
4260 fGeneratorNames = new TString[1];
4261 fGeneratorNames[0] = "NoCocktailGeneratorFound";
4263 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4264 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
4265 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4266 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
4267 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4268 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
4270 SetRejectExtraSignalsCut(0);
4275 //_________________________________________________________________________
4276 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4278 // Not Accepted == kFALSE == 0
4279 // Accepted == kTRUE == 1
4280 // FirstHeader == kTRUE == 3
4281 if(index < 0) return 0; // No Particle
4283 // if (index == 100){
4284 // cout << "possible headers" << endl;
4285 // for(Int_t i = 0;i<fnHeaders;i++){
4286 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
4290 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4291 if( index >= MCStack->GetNprimary()){ // Secondary Particle
4292 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
4293 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
4295 for(Int_t i = 0;i<fnHeaders;i++){
4296 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
4298 if(i == 0) accepted = 2; // MB Header
4302 else if(InputEvent->IsA()==AliAODEvent::Class()){
4303 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4304 if (AODMCTrackArray){
4305 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4306 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
4307 if(!aodMCParticle->IsPrimary()){
4308 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
4309 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
4311 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
4312 for(Int_t i = 0;i<fnHeaders;i++){
4313 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
4315 if(i == 0) accepted = 2; // MB Header
4324 //_________________________________________________________________________
4325 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
4327 if ( !IsTriggerSelected(InputEvent) )
4330 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
4331 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
4334 if(isHeavyIon == 0 && GetIsFromPileup()){
4335 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
4337 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
4341 Bool_t hasV0And = ReaderCuts->HasV0AND();
4342 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
4343 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
4344 return 7; // With SDD requested but no fired
4346 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
4347 return 8; // V0AND requested but no fired
4349 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
4350 if(hCentralityVsNumberOfPrimaryTracks)
4351 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
4352 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
4353 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
4358 //_________________________________________________________________________
4359 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4360 if (!(period.CompareTo("LHC12f1a") == 0 || period.CompareTo("LHC12f1b") == 0 || period.CompareTo("LHC12i3") == 0 || period.CompareTo("LHC11a10a") == 0 || period.CompareTo("LHC11a10b") == 0 || period.CompareTo("LHC11a10b_bis") == 0 || period.CompareTo("LHC11a10a_bis") == 0 || period.CompareTo("LHC11a10b_plus") == 0 || period.Contains("LHC13d2")|| period.Contains("LHC14a1") ||
4361 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.CompareTo("LHC14b2") == 0 )) return 1.;
4364 for (Int_t i = 0; i < fnHeaders; i++){
4365 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
4366 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
4368 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
4370 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
4371 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
4372 fGeneratorNames[i].Contains("hijing")){
4374 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
4376 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
4378 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
4380 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
4382 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
4384 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
4387 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") || period.CompareTo("LHC14b2") == 0 ){
4392 if (kCaseGen == 0) return 1;
4395 Double_t mesonPt = 0;
4396 Double_t mesonMass = 0;
4398 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4399 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
4400 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
4401 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
4403 else if(InputEvent->IsA()==AliAODEvent::Class()){
4404 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4405 if (AODMCTrackArray){
4406 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4407 mesonPt = aodMCParticle->Pt();
4408 mesonMass = aodMCParticle->GetCalcMass();
4409 PDGCode = aodMCParticle->GetPdgCode();
4415 Float_t functionResultMC = 1.;
4416 if (kCaseGen == 1){ // Pythia 6
4417 Float_t dNdyMC = 2.1462;
4418 Float_t nMC = 7.06055;
4419 Float_t tMC = 0.12533;
4420 if ( PDGCode == 111){
4424 } else if ( PDGCode == 221){
4429 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);
4430 } else if (kCaseGen == 2){ // Phojet
4431 Float_t dNdyMC = 2.35978;
4432 Float_t nMC = 6.81795;
4433 Float_t tMC = 0.11492;
4434 if ( PDGCode == 111){
4438 } else if ( PDGCode == 221){
4443 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);
4444 } else if (kCaseGen == 4){ // BOX generators pp
4445 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4446 Float_t a = 0.23437;
4448 Float_t c = -1430.5863;
4449 Float_t d = -0.6966624;
4450 Float_t e = 252.3742;
4451 if ( PDGCode == 111){
4457 } else if ( PDGCode == 221){
4464 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4465 // cout << functionResultMC << endl;
4466 } else if (kCaseGen == 3 ){ // HIJING
4467 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4468 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4470 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4471 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4473 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4474 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4478 Float_t functionResultData = 1;
4479 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4480 Float_t dNdyData = 2.2328;
4481 Float_t nData = 7.1473;
4482 Float_t tData = 0.1346;
4483 if ( PDGCode == 111){
4487 } else if ( PDGCode == 221){
4488 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4492 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);
4493 // cout << functionResultData << endl;
4495 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4496 functionResultData = fFitDataPi0->Eval(mesonPt);
4498 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4499 functionResultData = fFitDataEta->Eval(mesonPt);
4501 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4502 functionResultData = fFitDataK0s->Eval(mesonPt);
4507 Double_t weight = 1;
4508 if (PDGCode == 111 || PDGCode == 221){
4509 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4510 weight = functionResultData/functionResultMC;
4511 if ( kCaseGen == 3){
4512 if (PDGCode == 111){
4513 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4517 if (PDGCode == 221){
4518 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4523 if (!isfinite(functionResultData)) weight = 1.;
4524 if (!isfinite(weight)) weight = 1.;
4526 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4527 weight = functionResultMC;
4530 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4531 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4535 ///________________________________________________________________________
4536 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4537 //Create and return standard 2010 PbPb cuts
4538 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4539 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4540 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4544 ///________________________________________________________________________
4545 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4546 //Create and return standard 2010 PbPb cuts
4547 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4548 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4549 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4552 ///________________________________________________________________________
4553 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4555 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4556 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4557 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4558 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4559 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4560 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4561 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4562 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4563 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4564 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4565 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4566 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4567 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4568 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4569 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4570 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4571 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4572 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4573 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4574 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4575 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4576 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4577 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4578 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4579 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4580 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4581 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4582 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4583 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4584 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4586 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4587 SetEtaShift(-0.465);
4589 else if(periodName.CompareTo("LHC13f") == 0 ||
4590 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4591 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4592 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4594 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4595 SetEtaShift(+0.465);
4597 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4600 ///________________________________________________________________________
4601 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4603 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4604 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4605 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4606 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4607 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4609 if(!fInPlaneOutOfPlane){
4610 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4613 else if(fInPlaneOutOfPlane == 1){
4614 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4615 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4620 else if(fInPlaneOutOfPlane == 2){
4621 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4622 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4631 ///________________________________________________________________________
4632 UChar_t AliConversionCuts::DeterminePhotonQualityAOD(AliAODConversionPhoton* photon, AliVEvent* eventDummy){
4634 AliAODTrack * negTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelNegative()));
4635 AliAODTrack * posTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelPositive()));
4637 if(!negTrack || !posTrack) {
4640 if(negTrack->Charge() == posTrack->Charge()){
4643 Int_t nClusterITSneg = negTrack->GetITSNcls();
4644 Int_t nClusterITSpos = posTrack->GetITSNcls();
4645 // cout << nClusterITSneg << "\t" << nClusterITSpos <<endl;
4647 if (nClusterITSneg > 1 && nClusterITSpos > 1){
4649 } else if (nClusterITSneg > 1 || nClusterITSpos > 1){