1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Svein Lindal, Daniel Lohner *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
21 ////////////////////////////////////////////////
23 #include "AliConversionCuts.h"
25 #include "AliKFVertex.h"
26 #include "AliAODTrack.h"
27 #include "AliESDtrack.h"
28 #include "AliAnalysisManager.h"
29 #include "AliInputEventHandler.h"
30 #include "AliMCEventHandler.h"
31 #include "AliAODHandler.h"
32 #include "AliPIDResponse.h"
37 #include "AliAODConversionMother.h"
38 #include "TObjString.h"
39 #include "AliAODEvent.h"
40 #include "AliESDEvent.h"
41 #include "AliCentrality.h"
45 #include "AliGenCocktailEventHeader.h"
46 #include "AliGenDPMjetEventHeader.h"
47 #include "AliGenPythiaEventHeader.h"
48 #include "AliGenHijingEventHeader.h"
49 #include "AliTriggerAnalysis.h"
50 #include "AliV0ReaderV1.h"
51 #include "AliAODMCParticle.h"
52 #include "AliAODMCHeader.h"
58 ClassImp(AliConversionCuts)
61 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
66 "MultiplicityMethod",//4
68 "RejectExtraSignals",//6
76 "piMomdedxSigmaCut",//14
77 "piMaxMomdedxSigmaCut",//15
78 "LowPRejectionSigmaCut",//16
83 "DoPhotonAsymmetryCut",//21
84 "CosinePointingAngle", //22
85 "SharedElectronCuts", //23
86 "RejectToCloseV0s", //24
93 //________________________________________________________________________
94 AliConversionCuts::AliConversionCuts(const char *name,const char *title) :
95 AliAnalysisCuts(name,title),
111 fLineCutZRSlopeMin(0.),
112 fLineCutZValueMin(0),
113 fChi2CutConversion(1000),
114 fPIDProbabilityCutNegativeParticle(0),
115 fPIDProbabilityCutPositiveParticle(0),
116 fDodEdxSigmaCut(kTRUE),
117 fDoTOFsigmaCut(kFALSE),
118 fPIDTRDEfficiency(1),
120 fPIDnSigmaAboveElectronLine(100),
121 fPIDnSigmaBelowElectronLine(-100),
122 fTofPIDnSigmaAboveElectronLine(100),
123 fTofPIDnSigmaBelowElectronLine(-100),
124 fPIDnSigmaAbovePionLine(0),
125 fPIDnSigmaAbovePionLineHighPt(-100),
126 fPIDMinPnSigmaAbovePionLine(0),
127 fPIDMaxPnSigmaAbovePionLine(0),
128 fDoKaonRejectionLowP(kFALSE),
129 fDoProtonRejectionLowP(kFALSE),
130 fDoPionRejectionLowP(kFALSE),
131 fPIDnSigmaAtLowPAroundKaonLine(0),
132 fPIDnSigmaAtLowPAroundProtonLine(0),
133 fPIDnSigmaAtLowPAroundPionLine(0),
134 fPIDMinPKaonRejectionLowP(1.5),
135 fPIDMinPProtonRejectionLowP(2),
136 fPIDMinPPionRejectionLowP(0),
137 fDoQtGammaSelection(kTRUE),
144 fUseEtaMinCut(kFALSE),
145 fUseOnFlyV0Finder(kTRUE),
146 fDoPhotonAsymmetryCut(kTRUE),
147 fMinPPhotonAsymmetryCut(100.),
148 fMinPhotonAsymmetry(0.),
150 fDetectorCentrality(0),
151 fModCentralityClass(0),
155 fUseCorrectedTPCClsInfo(kFALSE),
157 fMultiplicityMethod(0),
159 fRemovePileUp(kFALSE),
160 fOpeningAngle(0.005),
162 fDo2DPsiPairChi2(kFALSE),
163 fCosPAngleCut(10000),
164 fDoToCloseV0sCut(kFALSE),
165 fRejectExtraSignals(0),
167 fDoSharedElecCut(kFALSE),
168 fDoPhotonQualitySelectionCut(kFALSE),
169 fPhotonQualityCut(0),
170 fOfflineTriggerMask(0),
174 fElectronArraySize(500),
175 fElectronLabelArray(NULL),
176 fDCAZPrimVtxCut(1000),
177 fDCARPrimVtxCut(1000),
178 fInPlaneOutOfPlane(0),
179 fConversionPointXArray(0.0),
180 fConversionPointYArray(0.0),
181 fConversionPointZArray(0.0),
183 fNotRejectedStart(NULL),
184 fNotRejectedEnd(NULL),
185 fGeneratorNames(NULL),
190 fDoReweightHistoMCPi0(kFALSE),
191 fDoReweightHistoMCEta(kFALSE),
192 fDoReweightHistoMCK0s(kFALSE),
193 fPathTrFReweighting(""),
194 fNameHistoReweightingPi0(""),
195 fNameHistoReweightingEta(""),
196 fNameHistoReweightingK0s(""),
201 hEtaDistV0sAfterdEdxCuts(NULL),
203 hTPCdEdxbefore(NULL),
205 hTPCdEdxSigbefore(NULL),
206 hTPCdEdxSigafter(NULL),
210 hPsiPairDeltaPhiafter(NULL),
213 hInvMassbefore(NULL),
214 hArmenterosbefore(NULL),
216 hArmenterosafter(NULL),
217 hAcceptanceCuts(NULL),
221 hCentralityVsNumberOfPrimaryTracks(NULL),
223 hEventPlanePhi(NULL),
225 hTriggerClassSelected(NULL),
226 hReweightMCHistPi0(NULL),
227 hReweightMCHistEta(NULL),
228 hReweightMCHistK0s(NULL),
232 fAddedSignalPDGCode(0),
234 fTriggerSelectedManually(kFALSE),
235 fSpecialTriggerName("")
239 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
240 fCutString=new TObjString((GetCutNumber()).Data());
242 fElectronLabelArray = new Int_t[fElectronArraySize];
243 fUtils = new AliAnalysisUtils();
244 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
245 //fUtils->SetCutOnZVertexSPD(kFALSE);
250 //________________________________________________________________________
251 AliConversionCuts::AliConversionCuts(const AliConversionCuts &ref) :
252 AliAnalysisCuts(ref),
254 fHeaderList(ref.fHeaderList),
256 fEventQuality(ref.fEventQuality),
259 fEtaCut(ref.fEtaCut),
260 fEtaCutMin(ref.fEtaCutMin),
262 fSinglePtCut(ref.fSinglePtCut),
264 fMinClsTPC(ref.fMinClsTPC),
265 fMinClsTPCToF(ref.fMinClsTPCToF),
266 fLineCutZRSlope(ref.fLineCutZRSlope),
267 fLineCutZValue(ref.fLineCutZValue),
268 fLineCutZRSlopeMin(ref.fLineCutZRSlopeMin),
269 fLineCutZValueMin(ref.fLineCutZValueMin),
270 fChi2CutConversion(ref.fChi2CutConversion),
271 fPIDProbabilityCutNegativeParticle(ref.fPIDProbabilityCutNegativeParticle),
272 fPIDProbabilityCutPositiveParticle(ref.fPIDProbabilityCutPositiveParticle),
273 fDodEdxSigmaCut(ref. fDodEdxSigmaCut),
274 fDoTOFsigmaCut(ref.fDoTOFsigmaCut),
275 fPIDTRDEfficiency(ref.fPIDTRDEfficiency),
276 fDoTRDPID(ref.fDoTRDPID),
277 fPIDnSigmaAboveElectronLine(ref.fPIDnSigmaAboveElectronLine),
278 fPIDnSigmaBelowElectronLine(ref.fPIDnSigmaBelowElectronLine),
279 fTofPIDnSigmaAboveElectronLine(ref.fTofPIDnSigmaAboveElectronLine),
280 fTofPIDnSigmaBelowElectronLine(ref.fTofPIDnSigmaBelowElectronLine),
281 fPIDnSigmaAbovePionLine(ref.fPIDnSigmaAbovePionLine),
282 fPIDnSigmaAbovePionLineHighPt(ref.fPIDnSigmaAbovePionLineHighPt),
283 fPIDMinPnSigmaAbovePionLine(ref.fPIDMinPnSigmaAbovePionLine),
284 fPIDMaxPnSigmaAbovePionLine(ref.fPIDMaxPnSigmaAbovePionLine),
285 fDoKaonRejectionLowP(ref.fDoKaonRejectionLowP),
286 fDoProtonRejectionLowP(ref.fDoProtonRejectionLowP),
287 fDoPionRejectionLowP(ref.fDoPionRejectionLowP),
288 fPIDnSigmaAtLowPAroundKaonLine(ref.fPIDnSigmaAtLowPAroundKaonLine),
289 fPIDnSigmaAtLowPAroundProtonLine(ref.fPIDnSigmaAtLowPAroundProtonLine),
290 fPIDnSigmaAtLowPAroundPionLine(ref.fPIDnSigmaAtLowPAroundPionLine),
291 fPIDMinPKaonRejectionLowP(ref.fPIDMinPKaonRejectionLowP),
292 fPIDMinPProtonRejectionLowP(ref.fPIDMinPProtonRejectionLowP),
293 fPIDMinPPionRejectionLowP(ref.fPIDMinPPionRejectionLowP),
294 fDoQtGammaSelection(ref.fDoQtGammaSelection),
295 fDo2DQt(ref.fDo2DQt),
297 fXVertexCut(ref.fXVertexCut),
298 fYVertexCut(ref.fYVertexCut),
299 fZVertexCut(ref.fZVertexCut),
300 fNSigmaMass(ref.fNSigmaMass),
301 fUseEtaMinCut(ref.fUseEtaMinCut),
302 fUseOnFlyV0Finder(ref.fUseOnFlyV0Finder),
303 fDoPhotonAsymmetryCut(ref.fDoPhotonAsymmetryCut),
304 fMinPPhotonAsymmetryCut(ref.fMinPPhotonAsymmetryCut),
305 fMinPhotonAsymmetry(ref.fMinPhotonAsymmetry),
306 fIsHeavyIon(ref.fIsHeavyIon),
307 fDetectorCentrality(ref.fDetectorCentrality),
308 fModCentralityClass(ref.fModCentralityClass),
309 fMaxVertexZ(ref.fMaxVertexZ),
310 fCentralityMin(ref.fCentralityMin),
311 fCentralityMax(ref.fCentralityMax),
312 fUseCorrectedTPCClsInfo(ref.fUseCorrectedTPCClsInfo),
313 fUseTOFpid(ref.fUseTOFpid),
314 fMultiplicityMethod(ref.fMultiplicityMethod),
315 fSpecialTrigger(ref.fSpecialTrigger),
316 fRemovePileUp(ref.fRemovePileUp),
317 fOpeningAngle(ref.fOpeningAngle),
318 fPsiPairCut(ref.fPsiPairCut),
319 fDo2DPsiPairChi2(ref.fDo2DPsiPairChi2),
320 fCosPAngleCut(ref.fCosPAngleCut),
321 fDoToCloseV0sCut(ref.fDoToCloseV0sCut),
322 fRejectExtraSignals(ref.fRejectExtraSignals),
323 fminV0Dist(ref.fminV0Dist),
324 fDoSharedElecCut(ref.fDoSharedElecCut),
325 fDoPhotonQualitySelectionCut(ref.fDoPhotonQualitySelectionCut),
326 fPhotonQualityCut(ref.fPhotonQualityCut),
327 fOfflineTriggerMask(ref.fOfflineTriggerMask),
328 fHasV0AND(ref.fHasV0AND),
329 fIsSDDFired(ref.fIsSDDFired),
330 fRandom(ref.fRandom),
331 fElectronArraySize(ref.fElectronArraySize),
332 fElectronLabelArray(NULL),
333 fDCAZPrimVtxCut(ref.fDCAZPrimVtxCut),
334 fDCARPrimVtxCut(ref.fDCAZPrimVtxCut),
335 fInPlaneOutOfPlane(ref.fInPlaneOutOfPlane),
336 fConversionPointXArray(ref.fConversionPointXArray),
337 fConversionPointYArray(ref.fConversionPointYArray),
338 fConversionPointZArray(ref.fConversionPointZArray),
339 fnHeaders(ref.fnHeaders),
340 fNotRejectedStart(NULL),
341 fNotRejectedEnd(NULL),
342 fGeneratorNames(ref.fGeneratorNames),
345 fEtaShift(ref.fEtaShift),
346 fDoEtaShift(ref.fDoEtaShift),
347 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
348 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
349 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
350 fPathTrFReweighting(ref.fPathTrFReweighting),
351 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
352 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
353 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
354 fNameFitDataPi0(ref.fNameFitDataPi0),
355 fNameFitDataEta(ref.fNameFitDataEta),
356 fNameFitDataK0s(ref.fNameFitDataK0s),
358 hEtaDistV0sAfterdEdxCuts(NULL),
360 hTPCdEdxbefore(NULL),
362 hTPCdEdxSigbefore(NULL),
363 hTPCdEdxSigafter(NULL),
367 hPsiPairDeltaPhiafter(NULL),
370 hInvMassbefore(NULL),
371 hArmenterosbefore(NULL),
373 hArmenterosafter(NULL),
374 hAcceptanceCuts(NULL),
378 hCentralityVsNumberOfPrimaryTracks(NULL),
380 hEventPlanePhi(NULL),
382 hTriggerClassSelected(NULL),
383 hReweightMCHistPi0(ref.hReweightMCHistPi0),
384 hReweightMCHistEta(ref.hReweightMCHistEta),
385 hReweightMCHistK0s(ref.hReweightMCHistK0s),
386 fFitDataPi0(ref.fFitDataPi0),
387 fFitDataEta(ref.fFitDataEta),
388 fFitDataK0s(ref.fFitDataK0s),
389 fAddedSignalPDGCode(ref.fAddedSignalPDGCode),
390 fPreSelCut(ref.fPreSelCut),
391 fTriggerSelectedManually(ref.fTriggerSelectedManually),
392 fSpecialTriggerName(ref.fSpecialTriggerName)
395 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
396 fCutString=new TObjString((GetCutNumber()).Data());
397 fElectronLabelArray = new Int_t[fElectronArraySize];
398 fUtils = new AliAnalysisUtils();
399 // dont copy histograms (if you like histograms, call InitCutHistograms())
404 //________________________________________________________________________
405 AliConversionCuts::~AliConversionCuts() {
407 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
409 // delete fHistograms;
410 // fHistograms = NULL;
411 if(fCutString != NULL){
415 if(fElectronLabelArray){
416 delete fElectronLabelArray;
417 fElectronLabelArray = NULL;
419 if(fNotRejectedStart){
420 delete[] fNotRejectedStart;
421 fNotRejectedStart = NULL;
424 delete[] fNotRejectedEnd;
425 fNotRejectedEnd = NULL;
428 delete[] fGeneratorNames;
429 fGeneratorNames = NULL;
438 //________________________________________________________________________
439 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
441 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
442 TH1::AddDirectory(kFALSE);
444 if(fHistograms != NULL){
448 if(fHistograms==NULL){
449 fHistograms=new TList();
450 fHistograms->SetOwner(kTRUE);
451 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
452 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
455 if (hReweightMCHistPi0){
456 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
457 fHistograms->Add(hReweightMCHistPi0);
459 if (hReweightMCHistEta){
460 hReweightMCHistEta->SetName("MCInputForWeightingEta");
461 fHistograms->Add(hReweightMCHistEta);
463 if (hReweightMCHistK0s){
464 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
465 fHistograms->Add(hReweightMCHistK0s);
468 // fFitDataPi0->SetName("DataFitForWeightingPi0");
469 // fHistograms->Add(fFitDataPi0);
472 // fFitDataEta->SetName("DataFitForWeightingEta");
473 // fHistograms->Add(fFitDataEta);
476 // fFitDataK0s->SetName("DataFitForWeightingK0s");
477 // fHistograms->Add(fFitDataK0s);
480 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5);
481 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
482 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
483 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
484 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
485 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
486 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
487 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
488 hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane");
489 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
490 fHistograms->Add(hCutIndex);
493 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5);
494 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
495 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
496 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
497 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
498 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
499 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
500 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
501 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
502 fHistograms->Add(hTrackCuts);
505 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",15,-0.5,14.5);
506 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
507 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
508 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
509 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
510 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
511 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
512 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
513 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
514 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
515 hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R");
516 hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z");
517 hPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality");
518 hPhotonCuts->GetXaxis()->SetBinLabel(13,"out");
519 fHistograms->Add(hPhotonCuts);
522 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3);
523 fHistograms->Add(hInvMassbefore);
524 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.);
525 fHistograms->Add(hArmenterosbefore);
526 hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2);
527 fHistograms->Add(hEtaDistV0s);
530 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3);
531 fHistograms->Add(hInvMassafter);
532 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
533 fHistograms->Add(hArmenterosafter);
535 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
536 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
537 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
538 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
539 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
540 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
541 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
542 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
543 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
544 fHistograms->Add(hAcceptanceCuts);
547 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
548 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
549 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
550 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
551 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
552 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
553 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
554 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
555 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
556 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
557 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
558 fHistograms->Add(hdEdxCuts);
560 TAxis *AxisBeforedEdx = NULL;
561 TAxis *AxisBeforedEdxSig = NULL;
562 TAxis *AxisBeforeTOF = NULL;
563 TAxis *AxisBeforeTOFSig = NULL;
565 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200);
566 fHistograms->Add(hTPCdEdxbefore);
567 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
568 hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10);
569 fHistograms->Add(hTPCdEdxSigbefore);
570 AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis();
572 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000);
573 fHistograms->Add(hTOFbefore);
574 AxisBeforeTOF = hTOFbefore->GetXaxis();
575 hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10);
576 fHistograms->Add(hTOFSigbefore);
577 AxisBeforeTOFSig = hTOFSigbefore->GetXaxis();
580 hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10);
581 fHistograms->Add(hTPCdEdxSigafter);
583 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200);
584 fHistograms->Add(hTPCdEdxafter);
586 hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10);
587 fHistograms->Add(hTOFSigafter);
589 hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2);
590 fHistograms->Add(hEtaDistV0sAfterdEdxCuts);
592 hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2);
593 fHistograms->Add(hPsiPairDeltaPhiafter);
595 TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis();
596 Int_t bins = AxisAfter->GetNbins();
597 Double_t from = AxisAfter->GetXmin();
598 Double_t to = AxisAfter->GetXmax();
599 Double_t *newBins = new Double_t[bins+1];
601 Double_t factor = TMath::Power(to/from, 1./bins);
602 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
603 AxisAfter->Set(bins, newBins);
604 AxisAfter = hTOFSigafter->GetXaxis();
605 AxisAfter->Set(bins, newBins);
606 AxisAfter = hTPCdEdxafter->GetXaxis();
607 AxisAfter->Set(bins, newBins);
609 AxisBeforedEdx->Set(bins, newBins);
610 AxisBeforeTOF->Set(bins, newBins);
611 AxisBeforedEdxSig->Set(bins, newBins);
612 AxisBeforeTOFSig->Set(bins, newBins);
616 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
617 fHistograms->Add(hCentrality);
618 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
619 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
621 // Event Cuts and Info
623 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
624 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
625 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
626 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
627 hV0EventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
628 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
629 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
630 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
631 fHistograms->Add(hV0EventCuts);
633 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
634 fHistograms->Add(hVertexZ);
636 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
637 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
638 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
639 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
640 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
641 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
642 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
643 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
644 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
645 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
646 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
647 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
648 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
649 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
650 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
651 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
652 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
653 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
654 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
655 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
656 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
657 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
658 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
659 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
660 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
661 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
662 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
663 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
664 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
665 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
666 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
667 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
668 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
669 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
670 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
671 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
672 fHistograms->Add(hTriggerClass);
675 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
676 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
677 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
678 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
679 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
680 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
681 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
682 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
683 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
684 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
685 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
686 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
687 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
688 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
689 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
690 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
691 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
692 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
693 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
694 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
695 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
696 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
697 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
698 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
699 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
700 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
701 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
702 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
703 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
704 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
705 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
706 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
707 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
708 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
709 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
710 fHistograms->Add(hTriggerClassSelected);
712 hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi());
713 fHistograms->Add(hEventPlanePhi);
717 TH1::AddDirectory(kTRUE);
720 //________________________________________________________________________
721 Bool_t AliConversionCuts::InitPIDResponse(){
722 // Set Pointer to AliPIDResponse
724 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
726 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
727 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
728 if(fPIDResponse)return kTRUE;
735 ///________________________________________________________________________
736 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
737 // Process Event Selection
740 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
743 // Check for MC event
744 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
745 // Check if MC event is correctly loaded
746 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
751 if (!mcHandler->InitOk() ){
755 if (!mcHandler->TreeK() ){
759 if (!mcHandler->TreeTR() ) {
766 // cout << "before event trigger" << endl;
767 if(!IsTriggerSelected(fInputEvent)){
768 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
774 if(fInputEvent->IsA()==AliESDEvent::Class()){
775 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
776 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
777 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
779 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
782 // Number of Contributors Cut
783 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
784 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
790 // Z Vertex Position Cut
791 if(!VertexZCut(fInputEvent)){
792 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
801 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
802 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
809 // Centrality Selection
810 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
811 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
817 // Fill Event Histograms
818 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
819 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
820 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
821 if(hCentralityVsNumberOfPrimaryTracks)
822 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
823 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
824 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
829 ///________________________________________________________________________
830 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
831 // MonteCarlo Photon Selection
833 if(!fMCStack)return kFALSE;
835 if (particle->GetPdgCode() == 22){
838 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
841 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
845 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
846 return kFALSE; // no photon as mothers!
849 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
850 return kFALSE; // the gamma has a mother, and it is not a primary particle
853 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
855 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
856 TParticle* ePos = NULL;
857 TParticle* eNeg = NULL;
859 if(particle->GetNDaughters() >= 2){
860 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
861 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
862 if(tmpDaughter->GetUniqueID() == 5){
863 if(tmpDaughter->GetPdgCode() == 11){
865 } else if(tmpDaughter->GetPdgCode() == -11){
872 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
876 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
877 return kFALSE; // no reconstruction below the Pt cut
880 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
881 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
884 if(fEtaCutMin > -0.1){
885 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
886 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
891 return kFALSE; // cuts on distance from collision point
894 if(abs(ePos->Vz()) > fMaxZ){
895 return kFALSE; // outside material
897 if(abs(eNeg->Vz()) > fMaxZ){
898 return kFALSE; // outside material
901 if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
902 return kFALSE; // line cut to exclude regions where we do not reconstruct
903 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
907 if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
908 return kFALSE; // line cut to exclude regions where we do not reconstruct
909 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
914 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
918 ///________________________________________________________________________
919 Bool_t AliConversionCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){
920 // MonteCarlo Photon Selection
922 if(!aodmcArray)return kFALSE;
924 if (particle->GetPdgCode() == 22){
925 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
928 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) )
932 if(particle->GetMother() > -1){
933 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
934 return kFALSE; // no photon as mothers!
936 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
937 return kFALSE; // the gamma has a mother, and it is not a primary particle
941 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
943 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
944 AliAODMCParticle* ePos = NULL;
945 AliAODMCParticle* eNeg = NULL;
947 if(particle->GetNDaughters() >= 2){
948 for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){
949 AliAODMCParticle *tmpDaughter = static_cast<AliAODMCParticle*>(aodmcArray->At(daughterIndex));
950 if(!tmpDaughter) continue;
951 if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX
952 if(tmpDaughter->GetPdgCode() == 11){
954 } else if(tmpDaughter->GetPdgCode() == -11){
961 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
965 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
966 return kFALSE; // no reconstruction below the Pt cut
969 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ||
970 eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) )
973 if(fEtaCutMin > -0.1){
974 if( (ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift)) ||
975 (eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift)) )
979 Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) );
980 Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) );
983 return kFALSE; // cuts on distance from collision point
985 if(abs(ePos->Zv()) > fMaxZ){
986 return kFALSE; // outside material
988 if(abs(eNeg->Zv()) > fMaxZ){
989 return kFALSE; // outside material
992 if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
993 return kFALSE; // line cut to exclude regions where we do not reconstruct
994 } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
998 if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){
999 return kFALSE; // line cut to exclude regions where we do not reconstruct
1000 } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
1005 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
1009 ///________________________________________________________________________
1010 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
1011 { // Specific Photon Cuts
1014 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
1017 // Fill Histos before Cuts
1018 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
1019 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1021 // Gamma selection based on QT from Armenteros
1022 if(fDoQtGammaSelection == kTRUE){
1023 if(!ArmenterosQtCut(photon)){
1024 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
1031 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
1033 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
1039 // Reconstruction Acceptance Cuts
1040 if(!AcceptanceCuts(photon)){
1041 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
1047 if(fDoPhotonAsymmetryCut == kTRUE){
1048 if(!AsymmetryCut(photon,event)){
1049 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
1054 //Check the pid probability
1056 if(!PIDProbabilityCut(photon, event)) {
1057 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
1062 if(!CorrectedTPCClusterCut(photon, event)) {
1063 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
1067 Double_t magField = event->GetMagneticField();
1068 if( magField < 0.0 ){
1074 AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() );
1075 AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() );
1076 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi());
1079 if(!PsiPairCut(photon)) {
1080 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
1085 if(!CosinePAngleCut(photon, event)) {
1086 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
1090 AliAODConversionPhoton* photonAOD = dynamic_cast<AliAODConversionPhoton*>(photon);
1092 photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex());
1095 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex
1096 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
1101 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex
1102 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10
1112 if (fDoPhotonQualitySelectionCut && photonAOD->GetPhotonQuality() != fPhotonQualityCut){
1113 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1118 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11
1120 // Histos after Cuts
1121 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
1122 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
1123 if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair());
1128 ///________________________________________________________________________
1129 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
1130 { //Cut on corrected TPC Cluster Info
1132 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1133 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1135 if(!negTrack||!posTrack)return kFALSE;
1137 Double_t negclsToF=0;
1139 if (!fUseCorrectedTPCClsInfo ){
1140 if(negTrack->GetTPCNclsF()!=0){
1141 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
1144 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1147 Double_t posclsToF = 0.;
1148 if (!fUseCorrectedTPCClsInfo ){
1149 if(posTrack->GetTPCNclsF()!=0){
1150 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
1153 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
1156 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
1163 ///________________________________________________________________________
1164 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
1166 //Selection of Reconstructed Photons
1168 FillPhotonCutIndex(kPhotonIn);
1170 if(event->IsA()==AliESDEvent::Class()) {
1171 if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){
1172 FillPhotonCutIndex(kOnFly);
1176 // else if(event->IsA()==AliAODEvent::Class()) {
1177 // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){
1178 // FillPhotonCutIndex(kOnFly);
1184 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
1185 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
1187 if(!negTrack || !posTrack) {
1188 FillPhotonCutIndex(kNoTracks);
1191 photon->DeterminePhotonQuality(negTrack,posTrack);
1193 if(!TracksAreSelected(negTrack, posTrack)){
1194 FillPhotonCutIndex(kTrackCuts);
1197 if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta());
1199 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
1200 FillPhotonCutIndex(kdEdxCuts);
1203 if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta());
1205 if(!PhotonCuts(photon,event)){
1206 FillPhotonCutIndex(kPhotonCuts);
1210 // Photon passed cuts
1211 FillPhotonCutIndex(kPhotonOut);
1215 ///________________________________________________________________________
1216 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
1217 { // Armenteros Qt Cut
1219 if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){
1223 if(photon->GetArmenterosQt()>fQtMax){
1231 ///________________________________________________________________________
1232 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
1233 // Exclude certain areas for photon reconstruction
1236 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1239 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
1240 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1245 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
1246 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1251 if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
1252 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1255 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1256 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1261 if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1262 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1268 if( photon->GetPhotonEta() > (fEtaCut + fEtaShift) || photon->GetPhotonEta() < (-fEtaCut + fEtaShift) ){
1269 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1272 if(fEtaCutMin>-0.1){
1273 if( photon->GetPhotonEta() < (fEtaCutMin + fEtaShift) && photon->GetPhotonEta() > (-fEtaCutMin + fEtaShift) ){
1274 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1280 if(photon->GetPhotonPt()<fPtCut){
1281 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1286 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
1292 ///________________________________________________________________________
1293 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
1294 // Track Cuts which require AOD/ESD specific implementation
1296 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1297 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1302 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
1303 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
1304 if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
1305 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1313 ///________________________________________________________________________
1314 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
1315 // Track Cuts which require AOD/ESD specific implementation
1317 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
1318 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1323 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
1324 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1332 ///________________________________________________________________________
1333 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
1334 // Track Selection for Photon Reconstruction
1337 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1341 if(negTrack->Charge() == posTrack->Charge()) {
1342 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1347 // Number of TPC Clusters
1350 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
1351 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1357 if( posTrack->Eta() > (fEtaCut + fEtaShift) || posTrack->Eta() < (-fEtaCut + fEtaShift) ||
1358 negTrack->Eta() > (fEtaCut + fEtaShift) || negTrack->Eta() < (-fEtaCut + fEtaShift) ){
1359 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1362 if(fEtaCutMin>-0.1){
1363 if( (posTrack->Eta() < (fEtaCutMin + fEtaShift) && posTrack->Eta() > (-fEtaCutMin + fEtaShift)) ||
1364 (negTrack->Eta() < (fEtaCutMin + fEtaShift) && negTrack->Eta() > (-fEtaCutMin + fEtaShift)) ){
1365 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1372 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
1373 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1378 // AOD ESD specific cuts
1379 Bool_t passCuts = kTRUE;
1381 if(negTrack->IsA()==AliAODTrack::Class()) {
1382 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1384 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1388 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1393 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1399 ///________________________________________________________________________
1400 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1401 // Electron Identification Cuts for Photon reconstruction
1402 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1403 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1406 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1407 if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1408 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1411 if(fDodEdxSigmaCut == kTRUE){
1412 // TPC Electron Line
1413 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1414 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1416 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1422 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1423 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1424 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1425 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1427 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1434 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1435 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1436 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine &&
1437 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1439 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1447 if(fDoKaonRejectionLowP == kTRUE){
1448 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1449 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1451 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1457 if(fDoProtonRejectionLowP == kTRUE){
1458 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1459 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1461 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1468 if(fDoPionRejectionLowP == kTRUE){
1469 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1470 if( abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1472 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1480 // cout<<"Start"<<endl;
1481 // AliPIDResponse::EDetPidStatus status=fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack);
1483 // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME ))
1484 // {cout<<"TOF DA"<<endl;}
1485 // if(status == AliPIDResponse::kDetPidOk){
1486 // Float_t probMis = fPIDResponse->GetTOFMismatchProbability(fCurrentTrack);
1487 // cout<<"--> "<<probMis<<endl;
1488 // if(probMis > 0.01){
1493 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1495 Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P());
1496 Double_t times[AliPID::kSPECIESC];
1497 fCurrentTrack->GetIntegratedTimes(times);
1498 Double_t TOFsignal = fCurrentTrack->GetTOFsignal();
1499 Double_t dT = TOFsignal - t0 - times[0];
1500 hTOFbefore->Fill(fCurrentTrack->P(),dT);
1502 if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1504 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1505 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1506 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1510 if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1515 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1516 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1522 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1523 if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1524 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
1529 ///________________________________________________________________________
1530 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1531 // Cut on Energy Assymetry
1533 for(Int_t ii=0;ii<2;ii++){
1535 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1537 if( track->P() > fMinPPhotonAsymmetryCut ){
1538 Double_t trackNegAsy=0;
1539 if (photon->GetPhotonP()!=0.){
1540 trackNegAsy= track->P()/photon->GetPhotonP();
1543 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1552 ///________________________________________________________________________
1553 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1554 //Returns pointer to the track with given ESD label
1555 //(Important for AOD implementation, since Track array in AOD data is different
1556 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1558 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1560 if(label > event->GetNumberOfTracks() ) return NULL;
1561 AliESDtrack * track = esdEvent->GetTrack(label);
1565 AliVTrack * track = 0x0;
1566 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
1567 track = dynamic_cast<AliVTrack*>(event->GetTrack(label));
1571 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1572 track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1574 if(track->GetID() == label) {
1581 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1585 ///________________________________________________________________________
1586 AliESDtrack *AliConversionCuts::GetESDTrack(AliESDEvent * event, Int_t label){
1587 //Returns pointer to the track with given ESD label
1588 //(Important for AOD implementation, since Track array in AOD data is different
1589 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1592 if(label > event->GetNumberOfTracks() ) return NULL;
1593 AliESDtrack * track = event->GetTrack(label);
1596 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1602 ///________________________________________________________________________
1603 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1604 // Cut on Electron Probability for Photon Reconstruction
1606 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1610 Bool_t iResult=kFALSE;
1612 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1613 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1615 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1616 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1618 if(negProbArray && posProbArray){
1620 negTrack->GetTPCpid(negProbArray);
1621 posTrack->GetTPCpid(posProbArray);
1623 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1628 delete [] posProbArray;
1629 delete [] negProbArray;
1633 ///Not possible for AODs
1643 ///________________________________________________________________________
1644 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1645 // MC Acceptance Cuts
1646 //(Certain areas were excluded for photon reconstruction)
1648 if(particle->R()>fMaxR){
1651 if(ePos->R()>fMaxR){
1655 if(ePos->R()<fMinR){
1659 if( ePos->R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1662 else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1666 if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1670 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1674 if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1679 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) ){
1682 if( ePos->Eta() > (fEtaCut + fEtaShift) || ePos->Eta() < (-fEtaCut + fEtaShift) ){
1685 if( eNeg->Eta() > (fEtaCut + fEtaShift) || eNeg->Eta() < (-fEtaCut + fEtaShift) ){
1688 if(fEtaCutMin>-0.1){
1689 if( particle->Eta() < (fEtaCutMin + fEtaShift) && particle->Eta() > (-fEtaCutMin + fEtaShift) ){
1692 if( ePos->Eta() < (fEtaCutMin + fEtaShift) && ePos->Eta() > (-fEtaCutMin + fEtaShift) ){
1695 if( eNeg->Eta() < (fEtaCutMin + fEtaShift) && eNeg->Eta() > (-fEtaCutMin + fEtaShift) ){
1700 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1704 if(particle->Pt()<fPtCut){
1710 ///________________________________________________________________________
1711 Bool_t AliConversionCuts::UpdateCutString() {
1712 ///Update the cut string (if it has been created yet)
1714 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1715 fCutString->SetString(GetCutNumber());
1721 ///________________________________________________________________________
1722 void AliConversionCuts::LoadReweightingHistosMCFromFile() {
1724 AliInfo("Entering loading of histograms for weighting");
1725 TFile *f = TFile::Open(fPathTrFReweighting.Data());
1727 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
1730 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1731 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
1732 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
1733 hReweightMCHistPi0->SetDirectory(0);
1734 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
1735 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
1737 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
1738 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
1739 fFitDataPi0 = new TF1(*fFitDataPi0temp);
1740 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
1741 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
1744 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1745 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
1746 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
1747 hReweightMCHistEta->SetDirectory(0);
1748 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1749 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
1752 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
1753 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
1754 fFitDataEta = new TF1(*fFitDataEtatemp);
1755 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1756 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
1759 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1760 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
1761 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
1762 hReweightMCHistK0s->SetDirectory(0);
1763 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1764 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
1767 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
1768 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
1769 fFitDataK0s = new TF1(*fFitDataK0stemp);
1770 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1771 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
1779 ///________________________________________________________________________
1780 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1781 // Initialize Cuts from a given Cut string
1782 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
1783 AliInfo("Weighting was enabled");
1784 LoadReweightingHistosMCFromFile();
1787 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1788 if(analysisCutSelection.Length()!=kNCuts) {
1789 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1792 if(!analysisCutSelection.IsDigit()){
1793 AliError("Cut selection contains characters");
1797 const char *cutSelection = analysisCutSelection.Data();
1798 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1799 for(Int_t ii=0;ii<kNCuts;ii++){
1803 // Set Individual Cuts
1804 for(Int_t ii=0;ii<kNCuts;ii++){
1805 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1808 PrintCutsWithValues();
1812 ///________________________________________________________________________
1813 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1814 ///Set individual cut ID
1819 if( SetV0Finder(value)) {
1820 fCuts[kv0FinderType] = value;
1823 } else return kFALSE;
1825 case kededxSigmaCut:
1826 if( SetTPCdEdxCutElectronLine(value)) {
1827 fCuts[kededxSigmaCut] = value;
1830 } else return kFALSE;
1832 case kpidedxSigmaCut:
1833 if( SetTPCdEdxCutPionLine(value)) {
1834 fCuts[kpidedxSigmaCut] = value;
1837 } else return kFALSE;
1839 case kpiMomdedxSigmaCut:
1840 if( SetMinMomPiondEdxCut(value)) {
1841 fCuts[kpiMomdedxSigmaCut] = value;
1844 } else return kFALSE;
1847 if( SetChi2GammaCut(value)) {
1848 fCuts[kchi2GammaCut] = value;
1851 } else return kFALSE;
1854 if( SetSinglePtCut(value)) {
1855 fCuts[ksinglePtCut] = value;
1858 } else return kFALSE;
1861 if( SetTPCClusterCut(value)) {
1862 fCuts[kclsTPCCut] = value;
1865 } else return kFALSE;
1868 if( SetEtaCut(value)) {
1869 fCuts[ketaCut] = value;
1872 } else return kFALSE;
1874 case kLowPRejectionSigmaCut:
1875 if( SetLowPRejectionCuts(value)) {
1876 fCuts[kLowPRejectionSigmaCut] = value;
1879 } else return kFALSE;
1882 if( SetQtMaxCut(value)) {
1883 fCuts[kQtMaxCut] = value;
1886 } else return kFALSE;
1888 case kpiMaxMomdedxSigmaCut:
1889 if( SetMaxMomPiondEdxCut(value)) {
1890 fCuts[kpiMaxMomdedxSigmaCut] = value;
1893 } else return kFALSE;
1896 if( SetRCut(value)) {
1897 fCuts[kRCut] = value;
1900 } else return kFALSE;
1903 if( SetRemovePileUp(value)) {
1904 fCuts[kremovePileUp] = value;
1907 } else return kFALSE;
1910 if( SetSelectSpecialTrigger(value)) {
1911 fCuts[kselectV0AND] = value;
1914 } else return kFALSE;
1916 case kmultiplicityMethod:
1917 if( SetMultiplicityMethod(value)) {
1918 fCuts[kmultiplicityMethod] = value;
1921 } else return kFALSE;
1924 if( SetIsHeavyIon(value)) {
1925 fCuts[kisHeavyIon] = value;
1928 } else return kFALSE;
1930 case kCentralityMin:
1931 if( SetCentralityMin(value)) {
1932 fCuts[kCentralityMin] = value;
1935 } else return kFALSE;
1937 case kCentralityMax:
1938 if( SetCentralityMax(value)) {
1939 fCuts[kCentralityMax] = value;
1942 } else return kFALSE;
1944 case kTOFelectronPID:
1945 if( SetTOFElectronPIDCut(value)) {
1946 fCuts[kTOFelectronPID] = value;
1949 } else return kFALSE;
1951 case kdoPhotonAsymmetryCut:
1952 if( SetPhotonAsymmetryCut(value)) {
1953 fCuts[kdoPhotonAsymmetryCut] = value;
1956 } else return kFALSE;
1959 if( SetPsiPairCut(value)) {
1960 fCuts[kPsiPair] = value;
1963 } else return kFALSE;
1966 if( SetCosPAngleCut(value)) {
1967 fCuts[kCosPAngle] = value;
1970 } else return kFALSE;
1974 if( SetSharedElectronCut(value)) {
1975 fCuts[kElecShare] = value;
1978 } else return kFALSE;
1981 if( SetToCloseV0sCut(value)) {
1982 fCuts[kToCloseV0s] = value;
1985 } else return kFALSE;
1988 if( SetRejectExtraSignalsCut(value)) {
1989 fCuts[kExtraSignals] = value;
1992 } else return kFALSE;
1995 if( SetDCARPhotonPrimVtxCut(value)) {
1996 fCuts[kDcaRPrimVtx] = value;
1999 } else return kFALSE;
2002 if( SetDCAZPhotonPrimVtxCut(value)) {
2003 fCuts[kDcaZPrimVtx] = value;
2006 } else return kFALSE;
2008 case kInPlaneOutOfPlane:
2009 if( SetInPlaneOutOfPlane(value)) {
2010 fCuts[kInPlaneOutOfPlane] = value;
2013 } else return kFALSE;
2019 AliError("Cut id out of range");
2023 AliError("Cut id %d not recognized");
2028 ///________________________________________________________________________
2029 void AliConversionCuts::PrintCuts() {
2030 // Print out current Cut Selection
2031 for(Int_t ic = 0; ic < kNCuts; ic++) {
2032 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
2036 void AliConversionCuts::PrintCutsWithValues() {
2037 // Print out current Cut Selection with value
2038 if (fIsHeavyIon == 0) {
2039 printf("Running in pp mode \n");
2040 if (fSpecialTrigger == 0){
2041 printf("\t only events triggered by V0OR will be analysed \n");
2042 } else if (fSpecialTrigger == 1){
2043 printf("\t only events triggered by V0AND will be analysed \n");
2044 } else if (fSpecialTrigger == 2){
2045 printf("\t only events where SDD was present will be analysed \n");
2046 } else if (fSpecialTrigger == 3){
2047 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
2048 } else if (fSpecialTrigger > 3){
2049 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2051 } else if (fIsHeavyIon == 1){
2052 printf("Running in PbPb mode \n");
2053 if (fDetectorCentrality == 0){
2054 printf("\t centrality selection based on V0M \n");
2055 } else if (fDetectorCentrality == 1){
2056 printf("\t centrality selection based on Cl1 \n");
2058 if (fModCentralityClass == 0){
2059 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2060 } else if ( fModCentralityClass == 1){
2061 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
2062 } else if ( fModCentralityClass == 2){
2063 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
2064 } else if (fModCentralityClass == 3){
2065 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
2066 } else if ( fModCentralityClass == 4){
2067 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
2068 } else if ( fModCentralityClass == 5){
2069 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
2071 if (fSpecialTrigger == 0){
2072 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
2073 } else if (fSpecialTrigger > 4){
2074 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2076 } else if (fIsHeavyIon == 2){
2077 printf("Running in pPb mode \n");
2078 if (fDetectorCentrality == 0){
2079 printf("\t centrality selection based on V0A \n");
2080 } else if (fDetectorCentrality == 1){
2081 printf("\t centrality selection based on Cl1 \n");
2083 if (fModCentralityClass == 0){
2084 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
2086 if (fSpecialTrigger == 0){
2087 printf("\t only events triggered by kINT7 will be analysed \n");
2088 } else if (fSpecialTrigger > 4){
2089 printf("\t only events triggered by %s \n", fSpecialTriggerName.Data());
2092 printf("Electron cuts: \n");
2093 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut );
2094 else printf("\t eta_{e} < %3.2f\n", fEtaCut );
2095 printf("\t p_{T,e} > %3.2f\n", fSinglePtCut );
2096 printf("\t %3.2f < n sigma e < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine );
2098 printf("Photon cuts: \n");
2099 printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR );
2100 printf("\t Z_{conv} < %3.2f\n", fMaxZ );
2101 if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut );
2102 else printf("\t eta_{conv} < %3.2f\n", fEtaCut );
2103 printf("\t p_{T,gamma} > %3.2f\n", fPtCut );
2105 printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2107 printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax );
2109 if (fDo2DPsiPairChi2){
2110 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 );
2112 printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion );
2113 printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut );
2115 printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut );
2116 printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut );
2117 printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut );
2118 if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut );
2121 ///________________________________________________________________________
2122 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2130 fDetectorCentrality=0;
2134 fDetectorCentrality=1;
2136 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2138 fDetectorCentrality=0;
2139 fModCentralityClass=1;
2141 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2143 fDetectorCentrality=0;
2144 fModCentralityClass=2;
2146 case 5: //strict cut on v0 tracks for MC
2148 fDetectorCentrality=0;
2149 fModCentralityClass=3;
2151 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
2152 //strict cut on v0 tracks for MC
2154 fDetectorCentrality=0;
2155 fModCentralityClass=4;
2157 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2158 //strict cut on v0 tracks for MC
2160 fDetectorCentrality=0;
2161 fModCentralityClass=5;
2165 fDetectorCentrality=0;
2169 fDetectorCentrality=1;
2172 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2178 //___________________________________________________________________
2179 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2182 if(minCentrality<0||minCentrality>9){
2183 AliError(Form("minCentrality not defined %d",minCentrality));
2187 fCentralityMin=minCentrality;
2190 //___________________________________________________________________
2191 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2194 if(maxCentrality<0||maxCentrality>9){
2195 AliError(Form("maxCentrality not defined %d",maxCentrality));
2198 fCentralityMax=maxCentrality;
2201 ///________________________________________________________________________
2202 Int_t AliConversionCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
2205 switch(selectSpecialTrigger){
2207 fSpecialTrigger=0; // dont care
2210 fSpecialTrigger=1; // V0AND
2213 fSpecialTrigger=2; // with SDD requested
2216 fSpecialTrigger=3; // V0AND plus with SDD requested
2218 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
2220 fSpecialTrigger=4; // different trigger class as MB
2221 fTriggerSelectedManually = kTRUE;
2224 fSpecialTrigger=4; // different trigger class as MB
2225 fTriggerSelectedManually = kTRUE;
2228 fSpecialTrigger=4; // different trigger class as MB
2229 fTriggerSelectedManually = kTRUE;
2232 fSpecialTrigger=4; // different trigger class as MB
2233 fTriggerSelectedManually = kTRUE;
2236 fSpecialTrigger=4; // different trigger class as MB
2237 fTriggerSelectedManually = kTRUE;
2240 fSpecialTrigger=4; // different trigger class as MB
2241 fTriggerSelectedManually = kTRUE;
2244 AliError("Warning: Special Trigger Not known");
2249 ///________________________________________________________________________
2250 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
2253 fMultiplicityMethod=multiplicityMethod;
2255 // 0 Photon Multiplicity
2256 // 1 TPC Track multiplicity
2262 ///________________________________________________________________________
2263 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
2265 switch(removePileUp){
2267 fRemovePileUp=kFALSE;
2270 fRemovePileUp=kTRUE;
2273 AliError("RemovePileUpCut not defined");
2278 ///________________________________________________________________________
2279 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2281 switch(extraSignal){
2283 fRejectExtraSignals = 0;
2284 break; // No Rejection
2286 fRejectExtraSignals = 1;
2287 break; // MinBias Header
2289 fRejectExtraSignals = 2;
2290 break; // User String Array
2292 fRejectExtraSignals = 3;
2293 break; // Rejection for Gamma Correction only
2295 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2300 ///________________________________________________________________________
2301 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
2303 switch (v0FinderType){
2304 case 0: // on fly V0 finder
2305 cout << "have chosen onfly V0" << endl;
2306 fUseOnFlyV0Finder=kTRUE;
2308 case 1: // offline V0 finder
2309 cout << "have chosen offline V0" << endl;
2310 fUseOnFlyV0Finder=kFALSE;
2313 AliError(Form(" v0FinderType not defined %d",v0FinderType));
2318 ///________________________________________________________________________
2319 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2322 //Set Standard LineCutZValues
2323 fLineCutZValueMin = -2;
2324 fLineCutZValue = 7.;
2329 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2331 fLineCutZRSlopeMin = 0.;
2333 case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10
2335 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2337 fLineCutZRSlopeMin = 0.;
2341 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2343 fLineCutZRSlopeMin = 0.;
2347 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2349 fLineCutZRSlopeMin = 0.;
2353 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2355 fLineCutZRSlopeMin = 0.;
2359 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2361 fLineCutZRSlopeMin = 0.;
2365 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2367 fLineCutZRSlopeMin = 0.;
2370 if (fIsHeavyIon==1){
2372 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2374 fLineCutZRSlopeMin = 0.;
2378 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2380 fLineCutZRSlopeMin = 0.;
2383 // case 8: // 0.1 - 0.8
2385 // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2386 // fEtaCutMin = 0.1;
2387 // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2391 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2393 fLineCutZRSlopeMin = 0.;
2397 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2399 fLineCutZRSlopeMin = 0.;
2402 AliError(Form(" EtaCut not defined %d",etaCut));
2407 ///________________________________________________________________________
2408 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
2431 // High purity cuts for PbPb (remove first layers of material)
2454 AliError("RCut not defined");
2459 ///________________________________________________________________________
2460 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
2462 switch(singlePtCut){
2463 case 0: // 0.050 GeV
2464 fSinglePtCut = 0.050;
2466 case 1: // 0.100 GeV
2467 fSinglePtCut = 0.100;
2469 case 2: // 0.150 GeV
2470 fSinglePtCut = 0.150;
2472 case 3: // 0.200 GeV
2473 fSinglePtCut = 0.200;
2475 case 4: // 0.075 GeV
2476 fSinglePtCut = 0.075;
2478 case 5: // 0.125 GeV
2479 fSinglePtCut = 0.125;
2482 fSinglePtCut = 0.040;
2488 AliError(Form("singlePtCut not defined %d",singlePtCut));
2493 ///________________________________________________________________________
2494 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2509 case 4: // 95% of findable clusters
2510 fMinClsTPCToF= 0.95;
2511 fUseCorrectedTPCClsInfo=1;
2513 case 5: // 0% of findable clusters
2515 fUseCorrectedTPCClsInfo=1;
2517 case 6: // 70% of findable clusters
2519 fUseCorrectedTPCClsInfo=1;
2521 case 7: // 0% of findable clusters
2522 fMinClsTPCToF= 0.35;
2523 fUseCorrectedTPCClsInfo=0;
2526 fMinClsTPCToF= 0.35;
2527 fUseCorrectedTPCClsInfo=1;
2531 fUseCorrectedTPCClsInfo=1;
2534 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2539 ///________________________________________________________________________
2540 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
2542 switch(ededxSigmaCut){
2544 fPIDnSigmaBelowElectronLine=-10;
2545 fPIDnSigmaAboveElectronLine=10;
2548 fPIDnSigmaBelowElectronLine=-5;
2549 fPIDnSigmaAboveElectronLine=5;
2552 fPIDnSigmaBelowElectronLine=-3;
2553 fPIDnSigmaAboveElectronLine=5;
2556 fPIDnSigmaBelowElectronLine=-4;
2557 fPIDnSigmaAboveElectronLine=5;
2560 fPIDnSigmaBelowElectronLine=-6;
2561 fPIDnSigmaAboveElectronLine=7;
2564 fPIDnSigmaBelowElectronLine=-4;
2565 fPIDnSigmaAboveElectronLine=4;
2568 fPIDnSigmaBelowElectronLine=-2.5;
2569 fPIDnSigmaAboveElectronLine=4;
2572 fPIDnSigmaBelowElectronLine=-2;
2573 fPIDnSigmaAboveElectronLine=3.5;
2576 AliError("TPCdEdxCutElectronLine not defined");
2582 ///________________________________________________________________________
2583 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
2586 switch(pidedxSigmaCut){
2588 fPIDnSigmaAbovePionLine=-10;
2589 fPIDnSigmaAbovePionLineHighPt=-10;
2592 fPIDnSigmaAbovePionLine=0;
2593 fPIDnSigmaAbovePionLineHighPt=-10;
2596 fPIDnSigmaAbovePionLine=1;
2597 fPIDnSigmaAbovePionLineHighPt=-10;
2600 fPIDnSigmaAbovePionLine=2.5;
2601 fPIDnSigmaAbovePionLineHighPt=-10;
2604 fPIDnSigmaAbovePionLine=0.5;
2605 fPIDnSigmaAbovePionLineHighPt=-10;
2608 fPIDnSigmaAbovePionLine=2.;
2609 fPIDnSigmaAbovePionLineHighPt=-10;
2612 fPIDnSigmaAbovePionLine=2.;
2613 fPIDnSigmaAbovePionLineHighPt=0.5;
2616 fPIDnSigmaAbovePionLine=3.5;
2617 fPIDnSigmaAbovePionLineHighPt=-10;
2620 fPIDnSigmaAbovePionLine=2.;
2621 fPIDnSigmaAbovePionLineHighPt=1.;
2624 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
2625 fPIDnSigmaAbovePionLineHighPt=-10;
2628 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
2633 ///________________________________________________________________________
2634 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2636 switch(piMomdedxSigmaCut){
2638 fPIDMinPnSigmaAbovePionLine=0.5;
2641 fPIDMinPnSigmaAbovePionLine=1.;
2644 fPIDMinPnSigmaAbovePionLine=1.5;
2647 fPIDMinPnSigmaAbovePionLine=20.;
2650 fPIDMinPnSigmaAbovePionLine=50.;
2653 fPIDMinPnSigmaAbovePionLine=0.3;
2656 fPIDMinPnSigmaAbovePionLine=0.25;
2659 fPIDMinPnSigmaAbovePionLine=0.4;
2662 fPIDMinPnSigmaAbovePionLine=0.2;
2665 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
2670 ///________________________________________________________________________
2671 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2673 switch(piMaxMomdedxSigmaCut){
2675 fPIDMaxPnSigmaAbovePionLine=100.;
2678 fPIDMaxPnSigmaAbovePionLine=5.;
2681 fPIDMaxPnSigmaAbovePionLine=4.;
2684 fPIDMaxPnSigmaAbovePionLine=3.5;
2687 fPIDMaxPnSigmaAbovePionLine=3.;
2690 fPIDMaxPnSigmaAbovePionLine=7.;
2693 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2698 ///________________________________________________________________________
2699 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2701 switch(LowPRejectionSigmaCut){
2703 fPIDnSigmaAtLowPAroundKaonLine=0;
2704 fPIDnSigmaAtLowPAroundProtonLine=0;
2705 fPIDnSigmaAtLowPAroundPionLine=0;
2706 fDoKaonRejectionLowP = kFALSE;
2707 fDoProtonRejectionLowP = kFALSE;
2708 fDoPionRejectionLowP = kFALSE;
2709 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2712 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2713 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2714 fPIDnSigmaAtLowPAroundPionLine=0.5;
2715 fDoKaonRejectionLowP = kTRUE;
2716 fDoProtonRejectionLowP = kTRUE;
2717 fDoPionRejectionLowP = kTRUE;
2718 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2721 fPIDnSigmaAtLowPAroundKaonLine=1;
2722 fPIDnSigmaAtLowPAroundProtonLine=1;
2723 fPIDnSigmaAtLowPAroundPionLine=1;
2724 fDoKaonRejectionLowP = kTRUE;
2725 fDoProtonRejectionLowP = kTRUE;
2726 fDoPionRejectionLowP = kTRUE;
2727 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2730 fPIDnSigmaAtLowPAroundKaonLine=2.;
2731 fPIDnSigmaAtLowPAroundProtonLine=2.;
2732 fPIDnSigmaAtLowPAroundPionLine=2.;
2733 fDoKaonRejectionLowP = kTRUE;
2734 fDoProtonRejectionLowP = kTRUE;
2735 fDoPionRejectionLowP = kTRUE;
2736 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2739 fPIDnSigmaAtLowPAroundKaonLine=0.;
2740 fPIDnSigmaAtLowPAroundProtonLine=0.;
2741 fPIDnSigmaAtLowPAroundPionLine=1;
2742 fDoKaonRejectionLowP = kFALSE;
2743 fDoProtonRejectionLowP = kFALSE;
2744 fDoPionRejectionLowP = kTRUE;
2745 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2748 fPIDnSigmaAtLowPAroundKaonLine=0.;
2749 fPIDnSigmaAtLowPAroundProtonLine=0.;
2750 fPIDnSigmaAtLowPAroundPionLine=1.5;
2751 fDoKaonRejectionLowP = kFALSE;
2752 fDoProtonRejectionLowP = kFALSE;
2753 fDoPionRejectionLowP = kTRUE;
2754 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2757 fPIDnSigmaAtLowPAroundKaonLine=0.;
2758 fPIDnSigmaAtLowPAroundProtonLine=0.;
2759 fPIDnSigmaAtLowPAroundPionLine=2.;
2760 fDoKaonRejectionLowP = kFALSE;
2761 fDoProtonRejectionLowP = kFALSE;
2762 fDoPionRejectionLowP = kTRUE;
2763 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2766 fPIDnSigmaAtLowPAroundKaonLine=0.;
2767 fPIDnSigmaAtLowPAroundProtonLine=0.;
2768 fPIDnSigmaAtLowPAroundPionLine=0.5;
2769 fDoKaonRejectionLowP = kFALSE;
2770 fDoProtonRejectionLowP = kFALSE;
2771 fDoPionRejectionLowP = kTRUE;
2772 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine;
2775 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2780 ///________________________________________________________________________
2781 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2783 switch(TOFelectronPID){
2785 fUseTOFpid = kFALSE;
2786 fTofPIDnSigmaBelowElectronLine=-100;
2787 fTofPIDnSigmaAboveElectronLine=100;
2791 fTofPIDnSigmaBelowElectronLine=-7;
2792 fTofPIDnSigmaAboveElectronLine=7;
2796 fTofPIDnSigmaBelowElectronLine=-5;
2797 fTofPIDnSigmaAboveElectronLine=5;
2801 fTofPIDnSigmaBelowElectronLine=-3;
2802 fTofPIDnSigmaAboveElectronLine=5;
2806 fTofPIDnSigmaBelowElectronLine=-2;
2807 fTofPIDnSigmaAboveElectronLine=3;
2811 fTofPIDnSigmaBelowElectronLine=-3;
2812 fTofPIDnSigmaAboveElectronLine=3;
2815 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2820 ///________________________________________________________________________
2821 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2826 fDoQtGammaSelection=kFALSE;
2866 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2871 ///________________________________________________________________________
2872 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
2875 switch(chi2GammaCut){
2877 fChi2CutConversion = 100.;
2880 fChi2CutConversion = 50.;
2883 fChi2CutConversion = 30.;
2886 fChi2CutConversion = 200.;
2889 fChi2CutConversion = 500.;
2892 fChi2CutConversion = 100000.;
2895 fChi2CutConversion = 5.;
2898 fChi2CutConversion = 10.;
2901 fChi2CutConversion = 20.;
2904 fChi2CutConversion = 15.;
2907 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
2912 ///________________________________________________________________________
2913 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2917 fPsiPairCut = 10000; //
2920 fPsiPairCut = 0.1; //
2923 fPsiPairCut = 0.05; // Standard
2926 fPsiPairCut = 0.035; //
2929 fPsiPairCut = 0.2; //
2932 fPsiPairCut = 0.1; //
2933 fDo2DPsiPairChi2 = kTRUE;
2936 fPsiPairCut = 0.05; //
2937 fDo2DPsiPairChi2 = kTRUE;
2940 fPsiPairCut = 0.035; //
2941 fDo2DPsiPairChi2 = kTRUE;
2944 fPsiPairCut = 0.2; //
2945 fDo2DPsiPairChi2 = kTRUE; //
2948 fPsiPairCut = 0.5; //
2951 AliError(Form("PsiPairCut not defined %d",psiCut));
2957 ///________________________________________________________________________
2958 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2960 switch(doPhotonAsymmetryCut){
2962 fDoPhotonAsymmetryCut=0;
2963 fMinPPhotonAsymmetryCut=100.;
2964 fMinPhotonAsymmetry=0.;
2967 fDoPhotonAsymmetryCut=1;
2968 fMinPPhotonAsymmetryCut=3.5;
2969 fMinPhotonAsymmetry=0.04;
2972 fDoPhotonAsymmetryCut=1;
2973 fMinPPhotonAsymmetryCut=3.5;
2974 fMinPhotonAsymmetry=0.06;
2977 fDoPhotonAsymmetryCut=1;
2978 fMinPPhotonAsymmetryCut=0.0;
2979 fMinPhotonAsymmetry=0.05;
2982 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2985 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2988 ///________________________________________________________________________
2989 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2999 fCosPAngleCut = 0.5;
3002 fCosPAngleCut = 0.75;
3005 fCosPAngleCut = 0.85;
3008 fCosPAngleCut = 0.88;
3011 fCosPAngleCut = 0.9;
3014 fCosPAngleCut = 0.95;
3017 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
3023 ///________________________________________________________________________
3024 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
3028 fDoSharedElecCut = kFALSE;
3029 fDoPhotonQualitySelectionCut = kFALSE;
3030 fPhotonQualityCut = 0;
3033 fDoSharedElecCut = kTRUE;
3034 fDoPhotonQualitySelectionCut = kFALSE;
3035 fPhotonQualityCut = 0;
3038 fDoSharedElecCut = kFALSE;
3039 fDoPhotonQualitySelectionCut = kTRUE;
3040 fPhotonQualityCut = 1;
3043 fDoSharedElecCut = kFALSE;
3044 fDoPhotonQualitySelectionCut = kTRUE;
3045 fPhotonQualityCut = 2;
3048 fDoSharedElecCut = kFALSE;
3049 fDoPhotonQualitySelectionCut = kTRUE;
3050 fPhotonQualityCut = 3;
3053 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
3059 ///________________________________________________________________________
3060 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
3064 fDoToCloseV0sCut = kFALSE;
3068 fDoToCloseV0sCut = kTRUE;
3072 fDoToCloseV0sCut = kTRUE;
3076 fDoToCloseV0sCut = kTRUE;
3080 AliError(Form("Shared Electron Cut not defined %d",toClose));
3085 ///________________________________________________________________________
3086 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
3088 switch(TRDElectronCut){
3094 fPIDTRDEfficiency=0.1;
3098 fPIDTRDEfficiency=0.8;
3102 fPIDTRDEfficiency=0.9;
3105 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
3112 ///________________________________________________________________________
3113 Bool_t AliConversionCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){
3115 switch(DCAZPhotonPrimVtx){
3117 fDCAZPrimVtxCut = 1000;
3120 fDCAZPrimVtxCut = 10;
3123 fDCAZPrimVtxCut = 5;
3126 fDCAZPrimVtxCut = 4;
3129 fDCAZPrimVtxCut = 3;
3132 fDCAZPrimVtxCut = 2.5;
3135 fDCAZPrimVtxCut = 2;
3138 fDCAZPrimVtxCut = 1.5;
3141 fDCAZPrimVtxCut = 1;
3144 fDCAZPrimVtxCut = 0.5;
3147 cout<<"Warning: DCAZPhotonPrimVtx not defined "<<DCAZPhotonPrimVtx<<endl;
3153 ///________________________________________________________________________
3154 Bool_t AliConversionCuts::SetDCARPhotonPrimVtxCut(Int_t DCARPhotonPrimVtx){
3156 switch(DCARPhotonPrimVtx){
3158 fDCARPrimVtxCut = 1000;
3161 fDCARPrimVtxCut = 10;
3164 fDCARPrimVtxCut = 5;
3167 fDCARPrimVtxCut = 4;
3170 fDCARPrimVtxCut = 3;
3173 fDCARPrimVtxCut = 2.5;
3176 fDCARPrimVtxCut = 2;
3179 fDCARPrimVtxCut = 1.5;
3182 fDCARPrimVtxCut = 1;
3185 fDCARPrimVtxCut = 0.5;
3188 cout<<"Warning: DCARPhotonPrimVtx not defined "<<DCARPhotonPrimVtx<<endl;
3194 ///________________________________________________________________________
3195 Bool_t AliConversionCuts::SetInPlaneOutOfPlane(Int_t inOutPlane){
3199 fInPlaneOutOfPlane = 0; // No Event Plane
3202 fInPlaneOutOfPlane = 1; // In-Plane
3205 fInPlaneOutOfPlane = 2; // Out-Of-Plane
3208 cout<<"Warning: In-Plane or Out-Of-Plane not defined "<<inOutPlane<<endl;
3215 //-------------------------------------------------------------
3216 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
3217 { // Get Event Centrality
3219 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3221 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3223 if(fDetectorCentrality==0){
3224 if (fIsHeavyIon==2){
3225 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
3227 return fESDCentrality->GetCentralityPercentile("V0M"); // default
3230 if(fDetectorCentrality==1){
3231 return fESDCentrality->GetCentralityPercentile("CL1");
3235 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3237 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
3242 //-------------------------------------------------------------
3243 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
3244 { // Centrality Selection
3245 if(!fIsHeavyIon)return kTRUE;
3247 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
3248 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
3250 Double_t centrality=GetCentrality(event);
3251 if(centrality<0)return kFALSE;
3253 Int_t centralityC=0;
3254 if (fModCentralityClass == 0){
3255 centralityC= Int_t(centrality/10);
3256 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3260 else if (fModCentralityClass ==1){
3261 centralityC= Int_t(centrality);
3262 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3264 } else return kFALSE;
3266 else if (fModCentralityClass ==2){
3267 centralityC= Int_t(centrality);
3268 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3273 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks();
3274 Int_t PrimaryTracks10[10][2] =
3287 Int_t PrimaryTracks5a[10][2] =
3300 Int_t PrimaryTracks5b[10][2] =
3315 if(event->IsA()==AliESDEvent::Class()) column = 0;
3316 if(event->IsA()==AliAODEvent::Class()) column = 1;
3318 if (fModCentralityClass == 3){
3320 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
3325 centralityC= Int_t(centrality/10);
3326 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
3331 else if (fModCentralityClass ==4){
3333 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
3338 centralityC= Int_t(centrality);
3339 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
3341 } else return kFALSE;
3344 else if (fModCentralityClass ==5){
3346 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
3351 centralityC= Int_t(centrality);
3352 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
3360 ///________________________________________________________________________
3361 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
3362 // Cut on z position of primary vertex
3363 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
3364 Double_t fVertexZSPD = 0;
3365 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3367 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
3369 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3371 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
3374 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
3376 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3377 ->GetTask("V0ReaderV1"))->GetPeriodName();
3378 if (periodName.CompareTo("LHC11h")==0){
3379 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
3381 if (fIsHeavyIon == 2){
3382 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
3383 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
3384 if(fUtils->IsPileUpEvent(event)) return kFALSE;
3389 ///________________________________________________________________________
3391 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
3392 // returns number of contributors to the vertex
3394 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
3396 if (fESDEvent->GetPrimaryVertex() != NULL){
3397 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
3398 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
3399 return fESDEvent->GetPrimaryVertex()->GetNContributors();
3403 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
3404 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3405 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
3406 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
3408 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
3409 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3415 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
3417 if (fAODEvent->GetPrimaryVertex() != NULL){
3418 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
3419 return fAODEvent->GetPrimaryVertex()->GetNContributors();
3422 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
3423 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
3424 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
3426 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
3431 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
3435 ///________________________________________________________________________
3437 Bool_t AliConversionCuts::IsTriggerSelected(AliVEvent *fInputEvent)
3440 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3442 UInt_t isSelected = AliVEvent::kAny;
3443 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3444 // cout << periodName.Data() << endl;
3446 if (fInputHandler==NULL) return kFALSE;
3447 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
3448 if (!fTriggerSelectedManually){
3449 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
3451 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
3452 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
3453 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("LHC13g") == 0 ) {
3454 fOfflineTriggerMask = AliVEvent::kINT7;
3455 // cout << "will take kINT7 as trigger mask" << endl;
3457 else fOfflineTriggerMask = AliVEvent::kMB;
3460 // Get the actual offline trigger mask for the event and AND it with the
3461 // requested mask. If no mask requested select by default the event.
3462 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
3463 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
3465 if (fOfflineTriggerMask)
3466 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
3468 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3472 if (fIsSDDFired) hTriggerClass->Fill(33);
3473 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3474 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3475 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3476 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3477 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3478 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3479 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3480 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3481 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3482 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3483 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3484 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3485 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3486 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3487 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3488 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3489 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3490 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3491 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3492 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3493 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3494 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3495 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3496 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3497 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3498 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3499 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3500 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3501 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3502 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3503 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3504 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3505 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3506 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3507 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3508 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3509 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3510 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3511 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3512 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3513 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3516 if(hTriggerClassSelected && isSelected){
3517 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3518 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3519 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3520 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3521 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3522 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3523 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3524 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3525 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3526 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3527 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3528 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3529 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3530 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3531 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3532 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3533 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3534 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3535 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3536 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3537 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3538 if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3539 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3540 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3541 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3542 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3543 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3544 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3545 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3546 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3547 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3548 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3549 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3550 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3551 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3552 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3553 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3554 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3555 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3556 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3557 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3560 if(!isSelected)return kFALSE;
3566 ///________________________________________________________________________
3567 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
3568 // Get first TPC row
3569 Int_t firstTPCRow = 0;
3570 Double_t radiusI = 84.8;
3571 Double_t radiusO = 134.6;
3572 Double_t radiusOB = 198.;
3573 Double_t rSizeI = 0.75;
3574 Double_t rSizeO = 1.;
3575 Double_t rSizeOB = 1.5;
3579 if(radius <= radiusI){
3582 if(radius>radiusI && radius<=radiusO){
3583 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
3585 if(radius>radiusO && radius<=radiusOB){
3586 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
3589 if(radius>radiusOB){
3590 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
3596 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
3597 ///Check if passes cosine of pointing angle cut
3598 if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){
3604 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
3605 // calculates the pointing angle of the recalculated V0
3607 Double_t momV0[3] = {0,0,0};
3608 if(event->IsA()==AliESDEvent::Class()){
3609 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
3610 if(!esdEvent) return -999;
3611 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
3612 if(!v0) return -999;
3613 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
3615 if(event->IsA()==AliAODEvent::Class()){
3616 momV0[0] = photon->GetPx();
3617 momV0[1] = photon->GetPy();
3618 momV0[2] = photon->GetPz();
3621 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
3622 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
3623 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
3624 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
3626 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
3627 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
3630 Double_t cosinePointingAngle = -999;
3631 if(momV02*PosV02 > 0.0)
3632 cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
3634 return cosinePointingAngle;
3637 ///________________________________________________________________________
3638 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
3640 if (fDo2DPsiPairChi2){
3641 if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){
3647 if(abs(photon->GetPsiPair()) > fPsiPairCut){
3653 ///________________________________________________________________________
3654 TString AliConversionCuts::GetCutNumber(){
3655 // returns TString with current cut number
3657 for(Int_t ii=0;ii<kNCuts;ii++){
3658 a.Append(Form("%d",fCuts[ii]));
3663 ///________________________________________________________________________
3664 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
3666 Int_t posLabel = photon->GetTrackLabelPositive();
3667 Int_t negLabel = photon->GetTrackLabelNegative();
3669 fElectronLabelArray[nV0*2] = posLabel;
3670 fElectronLabelArray[(nV0*2)+1] = negLabel;
3672 ///________________________________________________________________________
3673 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
3675 Int_t posLabel = photon->GetTrackLabelPositive();
3676 Int_t negLabel = photon->GetTrackLabelNegative();
3678 for(Int_t i = 0; i<nV0s*2;i++){
3679 if(i==nV0*2) continue;
3680 if(i==(nV0*2)+1) continue;
3681 if(fElectronLabelArray[i] == posLabel){
3683 if(fElectronLabelArray[i] == negLabel){
3689 ///________________________________________________________________________
3690 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
3693 Double_t posX = photon->GetConversionX();
3694 Double_t posY = photon->GetConversionY();
3695 Double_t posZ = photon->GetConversionZ();
3697 for(Int_t i = 0;i<photons->GetEntries();i++){
3698 if(nV0 == i) continue;
3699 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
3700 Double_t posCompX = photonComp->GetConversionX();
3701 Double_t posCompY = photonComp->GetConversionY();
3702 Double_t posCompZ = photonComp->GetConversionZ();
3704 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
3706 if(dist < fminV0Dist*fminV0Dist){
3707 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
3715 ///________________________________________________________________________
3716 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
3718 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->GetPeriodName();
3721 if(fNotRejectedStart){
3722 delete[] fNotRejectedStart;
3723 fNotRejectedStart = NULL;
3725 if(fNotRejectedEnd){
3726 delete[] fNotRejectedEnd;
3727 fNotRejectedEnd = NULL;
3729 if(fGeneratorNames){
3730 delete[] fGeneratorNames;
3731 fGeneratorNames = NULL;
3734 if(rejection == 0) return; // No Rejection
3736 AliGenCocktailEventHeader *cHeader = 0x0;
3737 AliAODMCHeader *cHeaderAOD = 0x0;
3738 Bool_t headerFound = kFALSE;
3739 AliStack *fMCStack = 0x0;
3740 TClonesArray *fMCStackAOD = 0x0;
3741 if(MCEvent->IsA()==AliMCEvent::Class()){
3742 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3743 if(cHeader) headerFound = kTRUE;
3744 fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
3746 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
3747 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
3748 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3751 if(cHeaderAOD) headerFound = kTRUE;
3755 TList *genHeaders = 0x0;
3756 if(cHeader) genHeaders = cHeader->GetHeaders();
3758 genHeaders = cHeaderAOD->GetCocktailHeaders();
3759 if(genHeaders->GetEntries()==1){
3760 SetRejectExtraSignalsCut(0);
3764 AliGenEventHeader* gh = 0;
3766 Int_t firstindexA = 0;
3767 Int_t lastindexA = -1;
3768 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3769 if(rejection == 2){ // TList of Headers Names
3770 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3771 gh = (AliGenEventHeader*)genHeaders->At(i);
3772 TString GeneratorName = gh->GetName();
3773 lastindexA = lastindexA + gh->NProduced();
3774 // cout << i << "\t" << GeneratorName.Data() << endl;
3775 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3776 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3777 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3778 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3780 if (fMCStack->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
3781 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3782 if (gh->NProduced() > 10 && fMCStack->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
3783 // cout << "cond 1: "<< fnHeaders << endl;
3789 // cout << "cond 2: " << fnHeaders << endl;
3796 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
3797 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3798 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3799 if (gh->NProduced() > 10){
3800 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA+10));
3801 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3802 // cout << "cond 1: " << fnHeaders << endl;
3809 // cout << "cond 2: " << fnHeaders << endl;
3817 // cout << "cond 3: "<< fnHeaders << endl;
3822 firstindexA = firstindexA + gh->NProduced();
3825 // cout << "number of headers: " <<fnHeaders << endl;
3827 fNotRejectedStart = new Int_t[fnHeaders];
3828 fNotRejectedEnd = new Int_t[fnHeaders];
3829 fGeneratorNames = new TString[fnHeaders];
3831 if(rejection == 1 || rejection == 3){
3832 fNotRejectedStart[0] = 0;
3833 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3834 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3838 Int_t firstindex = 0;
3839 Int_t lastindex = -1;
3842 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3843 gh = (AliGenEventHeader*)genHeaders->At(i);
3844 TString GeneratorName = gh->GetName();
3845 lastindex = lastindex + gh->NProduced();
3846 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3847 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3848 // cout << i << "\t" << GeneratorName.Data() << endl;
3849 if(GeneratorName.CompareTo(GeneratorInList) == 0){
3850 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3852 if (fMCStack->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
3853 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3854 // cout << "produced " << gh->NProduced() << " with box generator" << endl;
3855 if (gh->NProduced() > 10 && fMCStack->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
3856 // cout << "one of them was a pi0 or eta" << endl;
3857 fNotRejectedStart[number] = firstindex;
3858 fNotRejectedEnd[number] = lastindex;
3859 fGeneratorNames[number] = GeneratorName;
3861 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3865 fNotRejectedStart[number] = firstindex;
3866 fNotRejectedEnd[number] = lastindex;
3867 fGeneratorNames[number] = GeneratorName;
3874 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
3875 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3876 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
3877 if (gh->NProduced() > 10) {
3878 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex+10));
3879 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3880 fNotRejectedEnd[number] = lastindex;
3881 fNotRejectedStart[number] = firstindex;
3882 fGeneratorNames[number] = GeneratorName;
3888 fNotRejectedStart[number] = firstindex;
3889 fNotRejectedEnd[number] = lastindex;
3890 fGeneratorNames[number] = GeneratorName;
3898 fNotRejectedStart[number] = firstindex;
3899 fNotRejectedEnd[number] = lastindex;
3900 fGeneratorNames[number] = GeneratorName;
3901 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3908 firstindex = firstindex + gh->NProduced();
3910 // for (Int_t i = 0; i < number; i++){
3911 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
3914 } else { // No Cocktail Header Found
3915 fNotRejectedStart = new Int_t[1];
3916 fNotRejectedEnd = new Int_t[1];
3919 fNotRejectedStart[0] = 0;
3920 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
3921 fGeneratorNames = new TString[1];
3922 fGeneratorNames[0] = "NoCocktailGeneratorFound";
3924 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3925 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
3926 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3927 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
3928 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
3929 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
3931 SetRejectExtraSignalsCut(0);
3936 //_________________________________________________________________________
3937 Int_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
3939 // Not Accepted == kFALSE == 0
3940 // Accepted == kTRUE == 1
3941 // FirstHeader == kTRUE == 3
3942 if(index < 0) return 0; // No Particle
3944 // if (index == 100){
3945 // cout << "possible headers" << endl;
3946 // for(Int_t i = 0;i<fnHeaders;i++){
3947 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
3951 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3952 if( index >= MCStack->GetNprimary()){ // Secondary Particle
3953 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
3954 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
3956 for(Int_t i = 0;i<fnHeaders;i++){
3957 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3959 if(i == 0) accepted = 2; // MB Header
3963 else if(InputEvent->IsA()==AliAODEvent::Class()){
3964 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3965 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3966 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
3967 if(!aodMCParticle->IsPrimary()){
3968 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
3969 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
3971 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3972 for(Int_t i = 0;i<fnHeaders;i++){
3973 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3975 if(i == 0) accepted = 2; // MB Header
3983 //_________________________________________________________________________
3984 Int_t AliConversionCuts::IsEventAcceptedByConversionCut(AliConversionCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
3986 if ( !IsTriggerSelected(InputEvent) )
3989 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
3990 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3993 if(isHeavyIon == 0 && GetIsFromPileup()){
3994 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
3996 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
4000 Bool_t hasV0And = ReaderCuts->HasV0AND();
4001 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
4002 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
4003 return 7; // With SDD requested but no fired
4005 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
4006 return 8; // V0AND requested but no fired
4008 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
4009 if(hCentralityVsNumberOfPrimaryTracks)
4010 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
4011 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
4012 ->GetTask("V0ReaderV1"))->GetNumberOfPrimaryTracks());
4017 //_________________________________________________________________________
4018 Float_t AliConversionCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
4019 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") ||
4020 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix"))) return 1.;
4023 for (Int_t i = 0; i < fnHeaders; i++){
4024 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
4025 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
4027 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
4029 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
4030 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
4031 fGeneratorNames[i].Contains("hijing")){
4033 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
4035 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
4037 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
4039 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
4041 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
4043 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
4046 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") ){
4051 if (kCaseGen == 0) return 1;
4054 Double_t mesonPt = 0;
4055 Double_t mesonMass = 0;
4057 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
4058 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
4059 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
4060 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
4062 else if(InputEvent->IsA()==AliAODEvent::Class()){
4063 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
4064 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
4065 mesonPt = aodMCParticle->Pt();
4066 mesonMass = aodMCParticle->GetCalcMass();
4067 PDGCode = aodMCParticle->GetPdgCode();
4070 Float_t functionResultMC = 1.;
4071 if (kCaseGen == 1){ // Pythia 6
4072 Float_t dNdyMC = 2.1462;
4073 Float_t nMC = 7.06055;
4074 Float_t tMC = 0.12533;
4075 if ( PDGCode == 111){
4079 } else if ( PDGCode == 221){
4084 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);
4085 } else if (kCaseGen == 2){ // Phojet
4086 Float_t dNdyMC = 2.35978;
4087 Float_t nMC = 6.81795;
4088 Float_t tMC = 0.11492;
4089 if ( PDGCode == 111){
4093 } else if ( PDGCode == 221){
4098 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);
4099 } else if (kCaseGen == 4){ // BOX generators pp
4100 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
4101 Float_t a = 0.23437;
4103 Float_t c = -1430.5863;
4104 Float_t d = -0.6966624;
4105 Float_t e = 252.3742;
4106 if ( PDGCode == 111){
4112 } else if ( PDGCode == 221){
4119 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
4120 // cout << functionResultMC << endl;
4121 } else if (kCaseGen == 3 ){ // HIJING
4122 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
4123 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
4125 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
4126 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
4128 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
4129 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
4133 Float_t functionResultData = 1;
4134 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
4135 Float_t dNdyData = 2.2328;
4136 Float_t nData = 7.1473;
4137 Float_t tData = 0.1346;
4138 if ( PDGCode == 111){
4142 } else if ( PDGCode == 221){
4143 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
4147 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);
4148 // cout << functionResultData << endl;
4150 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
4151 functionResultData = fFitDataPi0->Eval(mesonPt);
4153 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
4154 functionResultData = fFitDataEta->Eval(mesonPt);
4156 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
4157 functionResultData = fFitDataK0s->Eval(mesonPt);
4162 Double_t weight = 1;
4163 if (PDGCode == 111 || PDGCode == 221){
4164 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
4165 weight = functionResultData/functionResultMC;
4166 if ( kCaseGen == 3){
4167 if (PDGCode == 111){
4168 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
4172 if (PDGCode == 221){
4173 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
4178 if (!isfinite(functionResultData)) weight = 1.;
4179 if (!isfinite(weight)) weight = 1.;
4181 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
4182 weight = functionResultMC;
4185 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
4186 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
4190 ///________________________________________________________________________
4191 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
4192 //Create and return standard 2010 PbPb cuts
4193 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
4194 if(!cuts->InitializeCutsFromCutString("100000204209297002322000000")){
4195 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
4199 ///________________________________________________________________________
4200 AliConversionCuts* AliConversionCuts::GetStandardCuts2010pp(){
4201 //Create and return standard 2010 PbPb cuts
4202 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010pp","StandardCuts2010pp");
4203 if(!cuts->InitializeCutsFromCutString("000001100209366300380000000")){
4204 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
4207 ///________________________________________________________________________
4208 void AliConversionCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
4210 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
4211 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
4212 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
4213 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
4214 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
4215 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
4216 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
4217 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
4218 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
4219 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
4220 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
4221 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
4222 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
4223 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
4224 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
4225 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
4226 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
4227 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
4228 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
4229 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
4230 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
4231 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
4232 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
4233 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
4234 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
4235 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
4236 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
4237 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
4238 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
4239 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
4241 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
4242 SetEtaShift(-0.465);
4244 else if(periodName.CompareTo("LHC13f") == 0 ||
4245 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
4246 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
4247 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
4249 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
4250 SetEtaShift(+0.465);
4252 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
4255 ///________________________________________________________________________
4256 Bool_t AliConversionCuts::InPlaneOutOfPlaneCut(Double_t photonPhi, Double_t eventPlaneAngle, Bool_t fill){
4258 //GetPhotonPhi() 0-2 Pi //eventPlaneAngle -1pi-1pi
4259 eventPlaneAngle=eventPlaneAngle+TMath::Pi();
4260 Double_t gammaToEPAngle = eventPlaneAngle-photonPhi;
4261 if(gammaToEPAngle < 0) gammaToEPAngle=gammaToEPAngle+2*TMath::Pi();
4262 gammaToEPAngle = gammaToEPAngle-TMath::Pi(); // angle from -pi +pi
4264 if(!fInPlaneOutOfPlane){
4265 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4268 else if(fInPlaneOutOfPlane == 1){
4269 if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){
4270 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);
4275 else if(fInPlaneOutOfPlane == 2){
4276 if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){
4277 if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle);