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[11][2] =
3594 { 0, 0} // 100 // only max accessible
3596 Int_t PrimaryTracks5a[11][2] =
3608 { 0, 162} // 50 only max accessible
3610 Int_t PrimaryTracks5b[11][2] =
3622 { 0, 0} // 100 only max accessible
3625 if(event->IsA()==AliESDEvent::Class()) column = 0;
3626 if(event->IsA()==AliAODEvent::Class()) column = 1;
3628 if (fModCentralityClass == 3){
3630 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3635 centralityC= Int_t(centrality/10);
3636 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3641 else if (fModCentralityClass ==4){
3643 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3648 centralityC= Int_t(centrality);
3649 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3651 } else return kFALSE;
3654 else if (fModCentralityClass ==5){
3656 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3661 centralityC= Int_t(centrality);
3662 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3670 ///________________________________________________________________________
3671 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3672 // Cut on z position of primary vertex
3673 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3674 Double_t fVertexZSPD = 0;
3675 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3677 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3679 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3681 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3684 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3686 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3687 ->GetTask("V0ReaderV1"))->GetPeriodName();
3688 if (periodName.CompareTo("LHC11h")==0){
3689 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3691 if (fIsHeavyIon == 2){
3692 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3693 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3694 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3699 ///________________________________________________________________________
3701 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3702 // returns number of contributors to the vertex
3704 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3706 if (fESDEvent->GetPrimaryVertex() != NULL){
3707 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3708 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3709 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3713 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3714 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3715 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3716 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3718 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3719 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3725 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3727 if (fAODEvent->GetPrimaryVertex() != NULL){
3728 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3729 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3732 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3733 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3734 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3736 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3741 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3745 ///________________________________________________________________________
3747 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3750 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3751 // AliTRDTriggerAnalysis *trdSelection= new AliTRDTriggerAnalysis();
3752 // trdSelection->CalcTriggers(fInputEvent);
3754 UInt_t isSelected = AliVEvent::kAny;
3755 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3756 // cout << periodName.Data() << endl;
3758 if (fInputHandler==NULL) return kFALSE;
3759 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3761 TString firedTrigClass = fInputEvent->GetFiredTriggerClasses();
3762 if (!fTriggerSelectedManually){
3763 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3765 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3766 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3767 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 ) {
3768 fOfflineTriggerMask = AliVEvent::kINT7;
3769 // cout << "will take kINT7 as trigger mask" << endl;
3771 else fOfflineTriggerMask = AliVEvent::kMB;
3774 // Get the actual offline trigger mask for the event and AND it with the
3775 // requested mask. If no mask requested select by default the event.
3776 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3777 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3779 if (fOfflineTriggerMask){
3780 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3781 if (isSelected && !fPreSelCut){
3782 // if (fSpecialTriggerName.Contains("kTRD")){ // make special selection for TRD trigger
3783 // Bool_t bTRDHasFiredConfirmed= 0; // bool whether the TRD has triggered and has been read out due to that trigger & should have triggered
3784 // Bool_t bTRDClassContainedInTriggerList= 1; //check whether the trigger list contains the requested trigger
3785 // if (fSpecialSubTrigger>0){
3786 // if (fSpecialSubTriggerName.Contains("HSE")){
3787 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHSE);
3788 // } else if (fSpecialSubTriggerName.Contains("HJT")){
3789 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHJT);
3790 // } else if (fSpecialSubTriggerName.Contains("HEE")){
3791 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHEE);
3792 // } else if (fSpecialSubTriggerName.Contains("HQU")){
3793 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHQU);
3795 // if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) bTRDClassContainedInTriggerList = 0;
3797 // bTRDHasFiredConfirmed = trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHQU) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHSE) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHJT) || trdSelection->HasTriggeredConfirmed(AliTRDTriggerAnalysis::kHEE);
3799 // if (!bTRDHasFiredConfirmed || !bTRDClassContainedInTriggerList) isSelected = 0;
3800 // } else { // more general condition for all other sub-triggers
3801 // if (fSpecialTriggerName.Contains("kEMCE"))cout << fSpecialTriggerName.Data() << "\t" <<fSpecialSubTriggerName.Data()<< endl;
3802 if (fSpecialSubTrigger>0){
3803 if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) isSelected = 0;
3805 // if (fSpecialTriggerName.Contains("kEMCE"))cout <<firedTrigClass << endl;
3810 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3814 if (fIsSDDFired) hTriggerClass->Fill(33);
3815 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3816 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3817 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3818 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3819 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3820 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3821 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3822 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3823 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3824 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3825 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3826 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3827 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3828 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3829 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3830 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3831 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3832 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3833 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3834 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3835 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3836 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3837 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3838 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3839 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3840 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3841 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3842 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3843 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3844 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3845 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3846 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3847 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3848 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3849 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3850 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3851 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3852 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3853 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3854 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3855 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3858 if(hTriggerClassSelected && isSelected){
3859 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3860 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3861 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3862 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3863 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3864 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3865 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3866 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3867 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3868 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3869 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3870 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3871 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3872 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3873 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3874 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3875 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3876 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3877 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3878 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3879 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3880 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3881 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3882 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3883 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3884 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3885 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3886 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3887 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3888 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3889 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3890 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3891 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3892 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3893 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3894 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3895 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3896 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3897 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3898 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3899 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3902 if(!isSelected)return kFALSE;
3908 ///________________________________________________________________________
3909 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3910 // Get first TPC row
3911 Int_t firstTPCRow = 0;
3912 Double_t radiusI = 84.8;
3913 Double_t radiusO = 134.6;
3914 Double_t radiusOB = 198.;
3915 Double_t rSizeI = 0.75;
3916 Double_t rSizeO = 1.;
3917 Double_t rSizeOB = 1.5;
3921 if(radius <= radiusI){
3924 if(radius>radiusI && radius<=radiusO){
3925 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3927 if(radius>radiusO && radius<=radiusOB){
3928 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3931 if(radius>radiusOB){
3932 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3938 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3939 ///Check if passes cosine of pointing angle cut
3940 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3946 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3947 // calculates the pointing angle of the recalculated V0
3949 Double_t momV0[3] = {0,0,0};
3950 if(event->IsA()==AliESDEvent::Class()){
3951 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3952 if(!esdEvent) return -999;
3953 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3954 if(!v0) return -999;
3955 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3957 if(event->IsA()==AliAODEvent::Class()){
3958 momV0[0] = photon->GetPx();
3959 momV0[1] = photon->GetPy();
3960 momV0[2] = photon->GetPz();
3963 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3964 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3965 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3966 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3968 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3969 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3972 Double_t cosinePointingAngle = -999;
3973 if(momV02*PosV02 > 0.0)
3974 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3976 return cosinePointingAngle;
3979 ///________________________________________________________________________
3980 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3982 if (fDo2DPsiPairChi2){
3983 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3989 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3995 ///________________________________________________________________________
3996 TString AliConversionCuts::GetCutNumber(){
3997 // returns TString with current cut number
3999 for(Int_t ii=0;ii<kNCuts;ii++){
4000 a.Append(Form("%d",fCuts[ii]));
4005 ///________________________________________________________________________
4006 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
4008 Int_t posLabel = photon->GetTrackLabelPositive();
4009 Int_t negLabel = photon->GetTrackLabelNegative();
4011 fElectronLabelArray[nV0*2] = posLabel;
4012 fElectronLabelArray[(nV0*2)+1] = negLabel;
4014 ///________________________________________________________________________
4015 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
4017 Int_t posLabel = photon->GetTrackLabelPositive();
4018 Int_t negLabel = photon->GetTrackLabelNegative();
4020 for(Int_t i = 0; i<nV0s*2;i++){
4021 if(i==nV0*2) continue;
4022 if(i==(nV0*2)+1) continue;
4023 if(fElectronLabelArray[i] == posLabel){
4025 if(fElectronLabelArray[i] == negLabel){
4031 ///________________________________________________________________________
4032 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
4035 Double_t posX = photon->GetConversionX();
4036 Double_t posY = photon->GetConversionY();
4037 Double_t posZ = photon->GetConversionZ();
4039 for(Int_t i = 0;i<photons->GetEntries();i++){
4040 if(nV0 == i) continue;
4041 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
4042 Double_t posCompX = photonComp->GetConversionX();
4043 Double_t posCompY = photonComp->GetConversionY();
4044 Double_t posCompZ = photonComp->GetConversionZ();
4046 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
4048 if(dist < fminV0Dist*fminV0Dist){
4049 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
4057 ///________________________________________________________________________
4058 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
4060 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
4063 if(fNotRejectedStart){
4064 delete[] fNotRejectedStart;
4065 fNotRejectedStart = NULL;
4067 if(fNotRejectedEnd){
4068 delete[] fNotRejectedEnd;
4069 fNotRejectedEnd = NULL;
4071 if(fGeneratorNames){
4072 delete[] fGeneratorNames;
4073 fGeneratorNames = NULL;
4076 if(rejection == 0) return; // No Rejection
4078 AliGenCocktailEventHeader *cHeader = 0x0;
4079 AliAODMCHeader *cHeaderAOD = 0x0;
4080 Bool_t headerFound = kFALSE;
4081 AliStack *fMCStack = 0x0;
4082 TClonesArray *fMCStackAOD = 0x0;
4083 if(MCEvent->IsA()==AliMCEvent::Class()){
4084 if (dynamic_cast<AliMCEvent*>(MCEvent)){
4085 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4086 if(cHeader) headerFound = kTRUE;
4087 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
4090 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
4091 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
4092 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4095 if(cHeaderAOD) headerFound = kTRUE;
4099 TList *genHeaders = 0x0;
4100 if(cHeader) genHeaders = cHeader->GetHeaders();
4102 genHeaders = cHeaderAOD->GetCocktailHeaders();
4103 if(genHeaders->GetEntries()==1){
4104 SetRejectExtraSignalsCut(0);
4108 AliGenEventHeader* gh = 0;
4110 Int_t firstindexA = 0;
4111 Int_t lastindexA = -1;
4112 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
4113 if(rejection == 2){ // TList of Headers Names
4114 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
4115 gh = (AliGenEventHeader*)genHeaders->At(i);
4116 TString GeneratorName = gh->GetName();
4117 lastindexA = lastindexA + gh->NProduced();
4118 // cout << i << "\t" << GeneratorName.Data() << endl;
4119 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
4120 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
4121 if(GeneratorName.CompareTo(GeneratorInList) == 0){
4122 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
4124 if (fMCStack->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
4125 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4126 if (gh->NProduced() > 10 && fMCStack->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
4127 // cout << "cond 1: "<< fnHeaders << endl;
4133 // cout << "cond 2: " << fnHeaders << endl;
4140 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
4141 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
4142 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4143 if (gh->NProduced() > 10){
4144 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA+10));
4145 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
4146 // cout << "cond 1: " << fnHeaders << endl;
4153 // cout << "cond 2: " << fnHeaders << endl;
4161 // cout << "cond 3: "<< fnHeaders << endl;
4166 firstindexA = firstindexA + gh->NProduced();
4169 // cout << "number of headers: " <<fnHeaders << endl;
4171 fNotRejectedStart = new Int_t[fnHeaders];
4172 fNotRejectedEnd = new Int_t[fnHeaders];
4173 fGeneratorNames = new TString[fnHeaders];
4175 if(rejection == 1 || rejection == 3){
4176 fNotRejectedStart[0] = 0;
4177 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
4178 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
4182 Int_t firstindex = 0;
4183 Int_t lastindex = -1;
4186 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
4187 gh = (AliGenEventHeader*)genHeaders->At(i);
4188 TString GeneratorName = gh->GetName();
4189 lastindex = lastindex + gh->NProduced();
4190 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
4191 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
4192 // cout << i << "\t" << GeneratorName.Data() << endl;
4193 if(GeneratorName.CompareTo(GeneratorInList) == 0){
4194 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
4196 if (fMCStack->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
4197 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4198 // cout << "produced " << gh->NProduced() << " with box generator" << endl;
4199 if (gh->NProduced() > 10 && fMCStack->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
4200 // cout << "one of them was a pi0 or eta" << endl;
4201 fNotRejectedStart[number] = firstindex;
4202 fNotRejectedEnd[number] = lastindex;
4203 fGeneratorNames[number] = GeneratorName;
4205 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
4209 fNotRejectedStart[number] = firstindex;
4210 fNotRejectedEnd[number] = lastindex;
4211 fGeneratorNames[number] = GeneratorName;
4218 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
4219 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
4220 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
4221 if (gh->NProduced() > 10) {
4222 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex+10));
4223 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
4224 fNotRejectedEnd[number] = lastindex;
4225 fNotRejectedStart[number] = firstindex;
4226 fGeneratorNames[number] = GeneratorName;
4232 fNotRejectedStart[number] = firstindex;
4233 fNotRejectedEnd[number] = lastindex;
4234 fGeneratorNames[number] = GeneratorName;
4242 fNotRejectedStart[number] = firstindex;
4243 fNotRejectedEnd[number] = lastindex;
4244 fGeneratorNames[number] = GeneratorName;
4245 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
4252 firstindex = firstindex + gh->NProduced();
4254 // for (Int_t i = 0; i < number; i++){
4255 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
4258 } else { // No Cocktail Header Found
4259 fNotRejectedStart = new Int_t[1];
4260 fNotRejectedEnd = new Int_t[1];
4263 fNotRejectedStart[0] = 0;
4264 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
4265 fGeneratorNames = new TString[1];
4266 fGeneratorNames[0] = "NoCocktailGeneratorFound";
4268 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4269 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
4270 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4271 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
4272 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
4273 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
4275 SetRejectExtraSignalsCut(0);
4280 //_________________________________________________________________________
4281 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4283 // Not Accepted == kFALSE == 0
4284 // Accepted == kTRUE == 1
4285 // FirstHeader == kTRUE == 3
4286 if(index < 0) return 0; // No Particle
4288 // if (index == 100){
4289 // cout << "possible headers" << endl;
4290 // for(Int_t i = 0;i<fnHeaders;i++){
4291 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
4295 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4296 if( index >= MCStack->GetNprimary()){ // Secondary Particle
4297 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
4298 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
4300 for(Int_t i = 0;i<fnHeaders;i++){
4301 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
4303 if(i == 0) accepted = 2; // MB Header
4307 else if(InputEvent->IsA()==AliAODEvent::Class()){
4308 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4309 if (AODMCTrackArray){
4310 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4311 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
4312 if(!aodMCParticle->IsPrimary()){
4313 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
4314 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
4316 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
4317 for(Int_t i = 0;i<fnHeaders;i++){
4318 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
4320 if(i == 0) accepted = 2; // MB Header
4329 //_________________________________________________________________________
4330 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
4332 if ( !IsTriggerSelected(InputEvent) )
4335 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
4336 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
4339 if(isHeavyIon == 0 && GetIsFromPileup()){
4340 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
4342 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
4346 Bool_t hasV0And = ReaderCuts->HasV0AND();
4347 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
4348 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
4349 return 7; // With SDD requested but no fired
4351 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
4352 return 8; // V0AND requested but no fired
4354 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
4355 if(hCentralityVsNumberOfPrimaryTracks)
4356 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
4357 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
4358 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
4363 //_________________________________________________________________________
4364 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4365 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") ||
4366 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.CompareTo("LHC14b2") == 0 )) return 1.;
4369 for (Int_t i = 0; i < fnHeaders; i++){
4370 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
4371 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
4373 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
4375 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
4376 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
4377 fGeneratorNames[i].Contains("hijing")){
4379 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
4381 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
4383 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
4385 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
4387 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
4389 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
4392 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") || period.CompareTo("LHC14b2") == 0 ){
4397 if (kCaseGen == 0) return 1;
4400 Double_t mesonPt = 0;
4401 Double_t mesonMass = 0;
4403 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4404 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
4405 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
4406 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
4408 else if(InputEvent->IsA()==AliAODEvent::Class()){
4409 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4410 if (AODMCTrackArray){
4411 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4412 mesonPt = aodMCParticle->Pt();
4413 mesonMass = aodMCParticle->GetCalcMass();
4414 PDGCode = aodMCParticle->GetPdgCode();
4420 Float_t functionResultMC = 1.;
4421 if (kCaseGen == 1){ // Pythia 6
4422 Float_t dNdyMC = 2.1462;
4423 Float_t nMC = 7.06055;
4424 Float_t tMC = 0.12533;
4425 if ( PDGCode == 111){
4429 } else if ( PDGCode == 221){
4434 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);
4435 } else if (kCaseGen == 2){ // Phojet
4436 Float_t dNdyMC = 2.35978;
4437 Float_t nMC = 6.81795;
4438 Float_t tMC = 0.11492;
4439 if ( PDGCode == 111){
4443 } else if ( PDGCode == 221){
4448 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);
4449 } else if (kCaseGen == 4){ // BOX generators pp
4450 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4451 Float_t a = 0.23437;
4453 Float_t c = -1430.5863;
4454 Float_t d = -0.6966624;
4455 Float_t e = 252.3742;
4456 if ( PDGCode == 111){
4462 } else if ( PDGCode == 221){
4469 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4470 // cout << functionResultMC << endl;
4471 } else if (kCaseGen == 3 ){ // HIJING
4472 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4473 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4475 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4476 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4478 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4479 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4483 Float_t functionResultData = 1;
4484 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4485 Float_t dNdyData = 2.2328;
4486 Float_t nData = 7.1473;
4487 Float_t tData = 0.1346;
4488 if ( PDGCode == 111){
4492 } else if ( PDGCode == 221){
4493 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4497 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);
4498 // cout << functionResultData << endl;
4500 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4501 functionResultData = fFitDataPi0->Eval(mesonPt);
4503 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4504 functionResultData = fFitDataEta->Eval(mesonPt);
4506 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4507 functionResultData = fFitDataK0s->Eval(mesonPt);
4512 Double_t weight = 1;
4513 if (PDGCode == 111 || PDGCode == 221){
4514 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4515 weight = functionResultData/functionResultMC;
4516 if ( kCaseGen == 3){
4517 if (PDGCode == 111){
4518 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4522 if (PDGCode == 221){
4523 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4528 if (!isfinite(functionResultData)) weight = 1.;
4529 if (!isfinite(weight)) weight = 1.;
4531 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4532 weight = functionResultMC;
4535 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4536 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4540 ///________________________________________________________________________
4541 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4542 //Create and return standard 2010 PbPb cuts
4543 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4544 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4545 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4549 ///________________________________________________________________________
4550 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4551 //Create and return standard 2010 PbPb cuts
4552 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4553 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4554 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4557 ///________________________________________________________________________
4558 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4560 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4561 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4562 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4563 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4564 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4565 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4566 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4567 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4568 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4569 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4570 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4571 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4572 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4573 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4574 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4575 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4576 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4577 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4578 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4579 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4580 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4581 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4582 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4583 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4584 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4585 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4586 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4587 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4588 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4589 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4591 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4592 SetEtaShift(-0.465);
4594 else if(periodName.CompareTo("LHC13f") == 0 ||
4595 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4596 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4597 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4599 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4600 SetEtaShift(+0.465);
4602 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4605 ///________________________________________________________________________
4606 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4608 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4609 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4610 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4611 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4612 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4614 if(!fInPlaneOutOfPlane){
4615 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4618 else if(fInPlaneOutOfPlane == 1){
4619 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4620 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4625 else if(fInPlaneOutOfPlane == 2){
4626 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4627 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4636 ///________________________________________________________________________
4637 UChar_t AliConversionCuts::DeterminePhotonQualityAOD(AliAODConversionPhoton* photon, AliVEvent* eventDummy){
4639 AliAODTrack * negTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelNegative()));
4640 AliAODTrack * posTrack = static_cast<AliAODTrack*>(GetTrack(eventDummy, photon->GetTrackLabelPositive()));
4642 if(!negTrack || !posTrack) {
4645 if(negTrack->Charge() == posTrack->Charge()){
4648 Int_t nClusterITSneg = negTrack->GetITSNcls();
4649 Int_t nClusterITSpos = posTrack->GetITSNcls();
4650 // cout << nClusterITSneg << "\t" << nClusterITSpos <<endl;
4652 if (nClusterITSneg > 1 && nClusterITSpos > 1){
4654 } else if (nClusterITSneg > 1 || nClusterITSpos > 1){