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"
36 #include "AliAODConversionMother.h"
37 #include "TObjString.h"
38 #include "AliAODEvent.h"
39 #include "AliESDEvent.h"
40 #include "AliCentrality.h"
43 #include "AliGenCocktailEventHeader.h"
49 ClassImp(AliConversionCuts)
52 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
68 "piMaxMomdedxSigmaCut",
69 "LowPRejectionSigmaCut",
74 "DoPhotonAsymmetryCut",
75 "CosinePointingAngle",
81 //________________________________________________________________________
82 AliConversionCuts::AliConversionCuts(const char *name,const char *title) :
83 AliAnalysisCuts(name,title),
99 fLineCutZRSlopeMin(0.),
100 fLineCutZValueMin(0),
101 fChi2CutConversion(1000),
102 fPIDProbabilityCutNegativeParticle(0),
103 fPIDProbabilityCutPositiveParticle(0),
104 fDodEdxSigmaCut(kTRUE),
105 fDoTOFsigmaCut(kFALSE),
106 fPIDTRDEfficiency(1),
108 fPIDnSigmaAboveElectronLine(100),
109 fPIDnSigmaBelowElectronLine(-100),
110 fTofPIDnSigmaAboveElectronLine(100),
111 fTofPIDnSigmaBelowElectronLine(-100),
112 fPIDnSigmaAbovePionLine(0),
113 fPIDnSigmaAbovePionLineHighPt(-100),
114 fPIDMinPnSigmaAbovePionLine(0),
115 fPIDMaxPnSigmaAbovePionLine(0),
116 fDoKaonRejectionLowP(kFALSE),
117 fDoProtonRejectionLowP(kFALSE),
118 fDoPionRejectionLowP(kFALSE),
119 fPIDnSigmaAtLowPAroundKaonLine(0),
120 fPIDnSigmaAtLowPAroundProtonLine(0),
121 fPIDnSigmaAtLowPAroundPionLine(0),
122 fPIDMinPKaonRejectionLowP(0),
123 fPIDMinPProtonRejectionLowP(0),
124 fPIDMinPPionRejectionLowP(0),
125 fDoQtGammaSelection(kTRUE),
126 fDoHighPtQtGammaSelection(kFALSE), // RRnew
128 fHighPtQtMax(0.), // RRnew
129 fPtBorderForQt(0), // RRnew
134 fUseEtaMinCut(kFALSE),
135 fUseOnFlyV0Finder(kTRUE),
136 fDoPhotonAsymmetryCut(kTRUE),
137 fMinPPhotonAsymmetryCut(100.),
138 fMinPhotonAsymmetry(0.),
140 fDetectorCentrality(0),
141 fModCentralityClass(0),
145 fUseCorrectedTPCClsInfo(kFALSE),
147 fMultiplicityMethod(0),
148 fSelectV0AND(kFALSE),
149 fRemovePileUp(kFALSE),
150 fOpeningAngle(0.005),
152 fCosPAngleCut(10000),
153 fDoToCloseV0sCut(kFALSE),
154 fRejectExtraSignals(0),
156 fDoSharedElecCut(kFALSE),
157 fOfflineTriggerMask(0),
159 fSizeElectronArray(500),
160 fElectronLabelArray(NULL),
161 fConversionPointXArray(0),
162 fConversionPointYArray(0),
163 fConversionPointZArray(0),
165 fNotRejectedStart(NULL),
166 fNotRejectedEnd(NULL),
167 fGeneratorNames(NULL),
170 hTPCdEdxbefore(NULL),
176 hInvMassbefore(NULL),
177 hArmenterosbefore(NULL),
179 hArmenterosafter(NULL),
180 hAcceptanceCuts(NULL),
188 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
189 fCutString=new TObjString((GetCutNumber()).Data());
191 fElectronLabelArray = new Int_t[500];
195 //________________________________________________________________________
196 AliConversionCuts::~AliConversionCuts() {
198 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
200 // delete fHistograms;
201 // fHistograms = NULL;
202 if(fCutString != NULL){
206 if(fElectronLabelArray){
207 delete fElectronLabelArray;
208 fElectronLabelArray = NULL;
210 if(fNotRejectedStart){
211 delete[] fNotRejectedStart;
212 fNotRejectedStart = NULL;
215 delete[] fNotRejectedEnd;
216 fNotRejectedEnd = NULL;
219 delete[] fGeneratorNames;
220 fGeneratorNames = NULL;
224 //________________________________________________________________________
225 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
227 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
229 if(fHistograms != NULL){
233 if(fHistograms==NULL){
234 fHistograms=new TList();
235 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
236 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
240 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",10,-0.5,9.5);
241 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
242 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
243 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
244 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
245 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
246 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
247 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
248 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
249 fHistograms->Add(hCutIndex);
252 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",10,-0.5,9.5);
253 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
254 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
255 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
256 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
257 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
258 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
259 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
260 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
261 fHistograms->Add(hTrackCuts);
264 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",12,-0.5,11.5);
265 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
266 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
267 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
268 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
269 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
270 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
271 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
272 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
273 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
274 hPhotonCuts->GetXaxis()->SetBinLabel(10,"out");
275 fHistograms->Add(hPhotonCuts);
278 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",100,0,0.3);
279 fHistograms->Add(hInvMassbefore);
280 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,250,0,0.25);
281 fHistograms->Add(hArmenterosbefore);
283 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",100,0,0.3);
284 fHistograms->Add(hInvMassafter);
285 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
286 fHistograms->Add(hArmenterosafter);
288 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
289 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
290 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
291 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
292 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
293 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
294 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
295 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
296 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
297 fHistograms->Add(hAcceptanceCuts);
300 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
301 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
302 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
303 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
304 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
305 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
306 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
307 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
308 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
309 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
310 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
311 fHistograms->Add(hdEdxCuts);
313 TAxis *AxisBeforedEdx = NULL;
314 TAxis *AxisBeforeTOF = NULL;
316 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.05,20,400,-10,10);
317 fHistograms->Add(hTPCdEdxbefore);
318 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
320 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.05,20,400,-6,10);
321 fHistograms->Add(hTOFbefore);
322 AxisBeforeTOF = hTOFbefore->GetXaxis();
324 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.05,20,400, -10,10);
325 fHistograms->Add(hTPCdEdxafter);
327 hTOFafter=new TH2F(Form("Gamma_TOF_after %s",GetCutNumber().Data()),"TOF Gamma after" ,150,0.05,20,400,-6,10);
328 fHistograms->Add(hTOFafter);
330 TAxis *AxisAfter = hTPCdEdxafter->GetXaxis();
331 Int_t bins = AxisAfter->GetNbins();
332 Double_t from = AxisAfter->GetXmin();
333 Double_t to = AxisAfter->GetXmax();
334 Double_t *newBins = new Double_t[bins+1];
336 Double_t factor = TMath::Power(to/from, 1./bins);
337 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
338 AxisAfter->Set(bins, newBins);
339 AxisAfter = hTOFafter->GetXaxis();
340 AxisAfter->Set(bins, newBins);
342 AxisBeforedEdx->Set(bins, newBins);
343 AxisBeforeTOF->Set(bins, newBins);
347 // Event Cuts and Info
349 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",10,-0.5,9.5);
350 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
351 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
352 hV0EventCuts->GetXaxis()->SetBinLabel(3,"VertexZ");
353 hV0EventCuts->GetXaxis()->SetBinLabel(4,"nvtxcontr");
354 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
355 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
356 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
357 fHistograms->Add(hV0EventCuts);
359 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
360 fHistograms->Add(hCentrality);
361 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
362 fHistograms->Add(hVertexZ);
364 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",4,-0.5,5.5);
365 hTriggerClass->GetXaxis()->SetBinLabel(1,"kAny");
366 hTriggerClass->GetXaxis()->SetBinLabel(2,"kMB");
367 hTriggerClass->GetXaxis()->SetBinLabel(3,"kCentral");
368 hTriggerClass->GetXaxis()->SetBinLabel(4,"kSemiCentral");
369 hTriggerClass->GetXaxis()->SetBinLabel(4,"kCINT5");
370 hTriggerClass->GetXaxis()->SetBinLabel(5,"kINT7");
371 fHistograms->Add(hTriggerClass);
375 //________________________________________________________________________
376 Bool_t AliConversionCuts::InitPIDResponse(){
377 // Set Pointer to AliPIDResponse
379 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
381 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
382 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
383 if(fPIDResponse)return kTRUE;
390 ///________________________________________________________________________
391 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
392 // Process Event Selection
395 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
398 // Check for MC event
400 // Check if MC event is correctly loaded
401 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
406 if (!mcHandler->InitOk() ){
410 if (!mcHandler->TreeK() ){
414 if (!mcHandler->TreeTR() ) {
422 if(!IsTriggerSelected()){
423 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
429 // Z Vertex Position Cut
430 if(!VertexZCut(fInputEvent)){
431 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
437 // Number of Contributors Cut
438 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
439 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
448 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
449 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
456 // Centrality Selection
457 if(!IsCentralitySelected(fInputEvent)){
458 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
464 // Fill Event Histograms
465 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
466 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
467 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
473 ///________________________________________________________________________
474 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
475 // MonteCarlo Photon Selection
477 if(!fMCStack)return kFALSE;
479 if (particle->GetPdgCode() == 22){
481 if(particle->R() > fMaxR) return kFALSE;
482 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin) return kFALSE;
484 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
485 return kFALSE; // no photon as mothers!
488 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
489 return kFALSE; // the gamma has a mother, and it is not a primary particle
492 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
494 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
495 TParticle* ePos = NULL;
496 TParticle* eNeg = NULL;
498 if(particle->GetNDaughters() >= 2){
499 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
500 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
501 if(tmpDaughter->GetUniqueID() == 5){
502 if(tmpDaughter->GetPdgCode() == 11){
504 } else if(tmpDaughter->GetPdgCode() == -11){
511 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
515 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
516 return kFALSE; // no reconstruction below the Pt cut
519 if( TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin ||
520 TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin ) {
525 return kFALSE; // cuts on distance from collision point
528 if(TMath::Abs(ePos->Vz()) > fMaxZ){
529 return kFALSE; // outside material
531 if(TMath::Abs(eNeg->Vz()) > fMaxZ){
532 return kFALSE; // outside material
535 if( ePos->R() <= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
536 return kFALSE; // line cut to exclude regions where we do not reconstruct
537 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
541 if( eNeg->R() <= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
542 return kFALSE; // line cut to exclude regions where we do not reconstruct
543 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
548 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
554 ///________________________________________________________________________
555 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
556 { // Specific Photon Cuts
559 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
562 // Fill Histos before Cuts
563 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
564 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
566 // Gamma selection based on QT from Armenteros
567 if(fDoQtGammaSelection == kTRUE){
568 if(!ArmenterosQtCut(photon)){
569 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
576 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
578 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
584 // Reconstruction Acceptance Cuts
585 if(!AcceptanceCuts(photon)){
586 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
592 if(fDoPhotonAsymmetryCut == kTRUE){
593 if(!AsymmetryCut(photon,event)){
594 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
599 //Check the pid probability
601 if(!PIDProbabilityCut(photon, event)) {
602 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
607 if(!CorrectedTPCClusterCut(photon, event)) {
608 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
614 if(!PsiPairCut(photon)) {
615 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
620 if(!CosinePAngleCut(photon, event)) {
621 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
626 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
629 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
630 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
637 ///________________________________________________________________________
638 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
639 { //Cut on corrected TPC Cluster Info
641 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
642 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
644 if(!negTrack||!posTrack)return kFALSE;
646 Double_t negclsToF=0;
648 if (!fUseCorrectedTPCClsInfo ){
649 if(negTrack->GetTPCNclsF()!=0){
650 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
653 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
656 Double_t posclsToF = 0.;
657 if (!fUseCorrectedTPCClsInfo ){
658 if(posTrack->GetTPCNclsF()!=0 ){
659 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
662 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
665 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
672 ///________________________________________________________________________
673 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
675 //Selection of Reconstructed Photons
677 FillPhotonCutIndex(kPhotonIn);
680 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
681 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
683 if(!negTrack || !posTrack) {
684 FillPhotonCutIndex(kNoTracks);
689 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
690 FillPhotonCutIndex(kdEdxCuts);
695 if(!TracksAreSelected(negTrack, posTrack)){
696 FillPhotonCutIndex(kTrackCuts);
701 if(!PhotonCuts(photon,event)){
702 FillPhotonCutIndex(kPhotonCuts);
706 // Photon passed cuts
707 FillPhotonCutIndex(kPhotonOut);
711 ///________________________________________________________________________
712 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
713 { // Armenteros Qt Cut
715 if(fDoHighPtQtGammaSelection){
716 if(photon->GetPhotonPt() < fPtBorderForQt){
717 if(photon->GetArmenterosQt()>fQtMax){
721 if(photon->GetArmenterosQt()>fHighPtQtMax){
727 if(photon->GetArmenterosQt()>fQtMax){
735 ///________________________________________________________________________
736 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
737 // Exclude certain areas for photon reconstruction
740 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
743 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
744 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
749 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
750 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
755 if(photon->GetConversionRadius() <= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
756 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
759 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
760 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
765 if(TMath::Abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
766 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
772 if(TMath::Abs(photon->GetPhotonEta())> fEtaCut || TMath::Abs(photon->GetPhotonEta())< fEtaCutMin){
773 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
779 if(photon->GetPhotonPt()<fPtCut){
780 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
785 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
791 ///________________________________________________________________________
792 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
793 // Track Cuts which require AOD/ESD specific implementation
795 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
796 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
801 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
802 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
803 if((NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
804 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
812 ///________________________________________________________________________
813 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
814 // Track Cuts which require AOD/ESD specific implementation
816 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
817 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
822 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
823 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
831 ///________________________________________________________________________
832 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
833 // Track Selection for Photon Reconstruction
836 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
840 if(negTrack->Charge() == posTrack->Charge()) {
841 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
846 // Number of TPC Clusters
847 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
848 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
855 if(TMath::Abs(negTrack->Eta()) > fEtaCut || TMath::Abs(negTrack->Eta()) < fEtaCutMin ||
856 TMath::Abs(posTrack->Eta())> fEtaCut || TMath::Abs(posTrack->Eta())< fEtaCutMin) {
857 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
863 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
864 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
869 // AOD ESD specific cuts
870 Bool_t passCuts = kTRUE;
872 if(negTrack->IsA()==AliAODTrack::Class()) {
873 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
875 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
879 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
884 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
890 ///________________________________________________________________________
891 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
892 // Electron Identification Cuts for Photon reconstruction
894 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
895 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
898 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
899 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
903 if(fDodEdxSigmaCut == kTRUE){
905 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
906 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
908 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
914 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
915 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
916 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
917 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
919 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
926 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
927 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
928 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
929 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
931 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
939 if(fDoKaonRejectionLowP == kTRUE){
940 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
941 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
943 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
950 if(fDoProtonRejectionLowP == kTRUE){
951 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
952 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
954 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
961 if(fDoPionRejectionLowP == kTRUE){
962 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
963 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
965 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
972 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
973 if(hTOFbefore) hTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
975 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
976 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
977 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
981 if(hTOFafter)hTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
987 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
989 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
995 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
996 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1001 ///________________________________________________________________________
1002 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1003 // Cut on Energy Assymetry
1005 for(Int_t ii=0;ii<2;ii++){
1007 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1009 if( track->P() > fMinPPhotonAsymmetryCut ){
1010 Double_t trackNegAsy=0;
1011 if (photon->GetPhotonP()!=0.){
1012 trackNegAsy= track->P()/photon->GetPhotonP();
1015 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1024 ///________________________________________________________________________
1025 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1026 //Returns pointer to the track with given ESD label
1027 //(Important for AOD implementation, since Track array in AOD data is different
1028 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1030 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1032 if(label > event->GetNumberOfTracks() ) return NULL;
1033 AliESDtrack * track = esdEvent->GetTrack(label);
1037 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1038 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1041 if(track->GetID() == label) {
1048 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1053 ///________________________________________________________________________
1054 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1055 // Cut on Electron Probability for Photon Reconstruction
1057 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1061 Bool_t iResult=kFALSE;
1063 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1064 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1066 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1067 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1069 if(negProbArray && posProbArray){
1071 negTrack->GetTPCpid(negProbArray);
1072 posTrack->GetTPCpid(posProbArray);
1074 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1079 delete [] posProbArray;
1080 delete [] negProbArray;
1084 ///Not possible for AODs
1094 ///________________________________________________________________________
1095 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1096 // MC Acceptance Cuts
1097 //(Certain areas were excluded for photon reconstruction)
1099 if(particle->R()>fMaxR){
1102 if(ePos->R()>fMaxR){
1106 if(ePos->R()<fMinR){
1110 if( ePos->R() <= ((TMath::Abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1113 else if (fUseEtaMinCut && ePos->R() >= ((TMath::Abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1117 if(TMath::Abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1121 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1125 if(TMath::Abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1129 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin){
1133 if(TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin){
1137 if(TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin){
1141 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1145 if(particle->Pt()<fPtCut){
1151 ///________________________________________________________________________
1152 Bool_t AliConversionCuts::UpdateCutString(cutIds cutID, Int_t value) {
1153 ///Update the cut string (if it has been created yet)
1155 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1156 fCutString->SetString(GetCutNumber());
1163 ///________________________________________________________________________
1164 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1165 // Initialize Cuts from a given Cut string
1167 AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data()));
1168 if(analysisCutSelection.Length()!=kNCuts) {
1169 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1172 if(!analysisCutSelection.IsDigit()){
1173 AliError("Cut selection contains characters");
1177 const char *cutSelection = analysisCutSelection.Data();
1178 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1179 for(Int_t ii=0;ii<kNCuts;ii++){
1183 // Set Individual Cuts
1184 for(Int_t ii=0;ii<kNCuts;ii++){
1185 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1190 // Set StandardTriggers
1192 if(fIsHeavyIon)SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral);
1193 else SelectCollisionCandidates(AliVEvent::kMB);
1197 ///________________________________________________________________________
1198 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1199 ///Set individual cut ID
1205 if( SetV0Finder(value)) {
1206 fCuts[kv0FinderType] = value;
1207 UpdateCutString(cutID, value);
1209 } else return kFALSE;
1211 case kededxSigmaCut:
1212 if( SetTPCdEdxCutElectronLine(value)) {
1213 fCuts[kededxSigmaCut] = value;
1214 UpdateCutString(cutID, value);
1216 } else return kFALSE;
1218 case kpidedxSigmaCut:
1219 if( SetTPCdEdxCutPionLine(value)) {
1220 fCuts[kpidedxSigmaCut] = value;
1221 UpdateCutString(cutID, value);
1223 } else return kFALSE;
1225 case kpiMomdedxSigmaCut:
1226 if( SetMinMomPiondEdxCut(value)) {
1227 fCuts[kpiMomdedxSigmaCut] = value;
1228 UpdateCutString(cutID, value);
1230 } else return kFALSE;
1233 if( SetChi2GammaCut(value)) {
1234 fCuts[kchi2GammaCut] = value;
1235 UpdateCutString(cutID, value);
1237 } else return kFALSE;
1240 if( SetSinglePtCut(value)) {
1241 fCuts[ksinglePtCut] = value;
1242 UpdateCutString(cutID, value);
1244 } else return kFALSE;
1247 if( SetTPCClusterCut(value)) {
1248 fCuts[kclsTPCCut] = value;
1249 UpdateCutString(cutID, value);
1251 } else return kFALSE;
1254 if( SetEtaCut(value)) {
1255 fCuts[ketaCut] = value;
1256 UpdateCutString(cutID, value);
1258 } else return kFALSE;
1260 case kLowPRejectionSigmaCut:
1261 if( SetLowPRejectionCuts(value)) {
1262 fCuts[kLowPRejectionSigmaCut] = value;
1263 UpdateCutString(cutID, value);
1265 } else return kFALSE;
1268 if( SetQtMaxCut(value)) {
1269 fCuts[kQtMaxCut] = value;
1270 UpdateCutString(cutID, value);
1272 } else return kFALSE;
1274 case kpiMaxMomdedxSigmaCut:
1275 if( SetMaxMomPiondEdxCut(value)) {
1276 fCuts[kpiMaxMomdedxSigmaCut] = value;
1277 UpdateCutString(cutID, value);
1279 } else return kFALSE;
1282 if( SetRCut(value)) {
1283 fCuts[kRCut] = value;
1284 UpdateCutString(cutID, value);
1286 } else return kFALSE;
1289 if( SetRemovePileUp(value)) {
1290 fCuts[kremovePileUp] = value;
1291 UpdateCutString(cutID, value);
1293 } else return kFALSE;
1296 if( SetSelectV0AND(value)) {
1297 fCuts[kselectV0AND] = value;
1298 UpdateCutString(cutID, value);
1300 } else return kFALSE;
1302 case kmultiplicityMethod:
1303 if( SetMultiplicityMethod(value)) {
1304 fCuts[kmultiplicityMethod] = value;
1305 UpdateCutString(cutID, value);
1307 } else return kFALSE;
1310 if( SetIsHeavyIon(value)) {
1311 fCuts[kisHeavyIon] = value;
1312 UpdateCutString(cutID, value);
1314 } else return kFALSE;
1316 case kCentralityMin:
1317 if( SetCentralityMin(value)) {
1318 fCuts[kCentralityMin] = value;
1319 UpdateCutString(cutID, value);
1321 } else return kFALSE;
1323 case kCentralityMax:
1324 if( SetCentralityMax(value)) {
1325 fCuts[kCentralityMax] = value;
1326 UpdateCutString(cutID, value);
1328 } else return kFALSE;
1330 case kTOFelectronPID:
1331 if( SetTOFElectronPIDCut(value)) {
1332 fCuts[kTOFelectronPID] = value;
1333 UpdateCutString(cutID, value);
1335 } else return kFALSE;
1337 case kdoPhotonAsymmetryCut:
1338 if( SetPhotonAsymmetryCut(value)) {
1339 fCuts[kdoPhotonAsymmetryCut] = value;
1340 UpdateCutString(cutID, value);
1342 } else return kFALSE;
1345 if( SetPsiPairCut(value)) {
1346 fCuts[kPsiPair] = value;
1347 UpdateCutString(cutID, value);
1349 } else return kFALSE;
1352 if( SetCosPAngleCut(value)) {
1353 fCuts[kCosPAngle] = value;
1354 UpdateCutString(cutID, value);
1356 } else return kFALSE;
1360 if( SetSharedElectronCut(value)) {
1361 fCuts[kElecShare] = value;
1362 UpdateCutString(cutID, value);
1364 } else return kFALSE;
1368 if( SetToCloseV0sCut(value)) {
1369 fCuts[kToCloseV0s] = value;
1370 UpdateCutString(cutID, value);
1372 } else return kFALSE;
1375 if( SetRejectExtraSignalsCut(value)) {
1376 fCuts[kExtraSignals] = value;
1377 UpdateCutString(cutID, value);
1379 } else return kFALSE;
1383 AliError("Cut id out of range");
1387 AliError("Cut id %d not recognized");
1391 ///________________________________________________________________________
1392 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
1394 switch(removePileUp){
1396 fRemovePileUp=kFALSE;
1399 fRemovePileUp=kTRUE;
1402 AliError("RemovePileUpCut not defined");
1408 ///________________________________________________________________________
1409 Bool_t AliConversionCuts::SetSelectV0AND(Int_t selectV0AND)
1411 switch(selectV0AND){
1413 fSelectV0AND=kFALSE;
1419 AliError("Warning: V0ANDCut not defined");
1425 ///________________________________________________________________________
1426 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
1429 fMultiplicityMethod=multiplicityMethod;
1431 // 0 Photon Multiplicity
1432 // 1 TPC Track multiplicity
1440 ///________________________________________________________________________
1441 void AliConversionCuts::PrintCuts() {
1442 // Print out current Cut Selection
1443 for(Int_t ic = 0; ic < kNCuts; ic++) {
1444 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
1449 ///________________________________________________________________________
1450 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
1473 // High purity cuts for PbPb (remove first layers of material)
1496 AliError("RCut not defined");
1502 ///________________________________________________________________________
1503 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
1505 switch(ededxSigmaCut){
1507 fPIDnSigmaBelowElectronLine=-10;
1508 fPIDnSigmaAboveElectronLine=10;
1511 fPIDnSigmaBelowElectronLine=-5;
1512 fPIDnSigmaAboveElectronLine=5;
1515 fPIDnSigmaBelowElectronLine=-3;
1516 fPIDnSigmaAboveElectronLine=5;
1519 fPIDnSigmaBelowElectronLine=-4;
1520 fPIDnSigmaAboveElectronLine=5;
1523 fPIDnSigmaBelowElectronLine=-6;
1524 fPIDnSigmaAboveElectronLine=7;
1527 fPIDnSigmaBelowElectronLine=-4;
1528 fPIDnSigmaAboveElectronLine=4;
1531 fPIDnSigmaBelowElectronLine=-2.5;
1532 fPIDnSigmaAboveElectronLine=4;
1535 fPIDnSigmaBelowElectronLine=-2;
1536 fPIDnSigmaAboveElectronLine=3.5;
1539 AliError("TPCdEdxCutElectronLine not defined");
1546 ///________________________________________________________________________
1547 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
1550 switch(pidedxSigmaCut){
1552 fPIDnSigmaAbovePionLine=-10;
1553 fPIDnSigmaAbovePionLineHighPt=-10;
1556 fPIDnSigmaAbovePionLine=0;
1557 fPIDnSigmaAbovePionLineHighPt=-10;
1560 fPIDnSigmaAbovePionLine=1;
1561 fPIDnSigmaAbovePionLineHighPt=-10;
1564 fPIDnSigmaAbovePionLine=-1;
1565 fPIDnSigmaAbovePionLineHighPt=-10;
1568 fPIDnSigmaAbovePionLine=2.5;
1569 fPIDnSigmaAbovePionLineHighPt=-10;
1572 fPIDnSigmaAbovePionLine=2.;
1573 fPIDnSigmaAbovePionLineHighPt=-10;
1576 fPIDnSigmaAbovePionLine=2.;
1577 fPIDnSigmaAbovePionLineHighPt=0.5;
1580 fPIDnSigmaAbovePionLine=3.5;
1581 fPIDnSigmaAbovePionLineHighPt=-10;
1584 fPIDnSigmaAbovePionLine=2.;
1585 fPIDnSigmaAbovePionLineHighPt=1.;
1588 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
1589 fPIDnSigmaAbovePionLineHighPt=-10;
1592 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
1598 ///________________________________________________________________________
1599 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
1601 switch(piMomdedxSigmaCut){
1603 fPIDMinPnSigmaAbovePionLine=0.5;
1606 fPIDMinPnSigmaAbovePionLine=1.;
1609 fPIDMinPnSigmaAbovePionLine=1.5;
1612 fPIDMinPnSigmaAbovePionLine=20.;
1615 fPIDMinPnSigmaAbovePionLine=50.;
1618 fPIDMinPnSigmaAbovePionLine=0.3;
1621 fPIDMinPnSigmaAbovePionLine=0.25;
1624 fPIDMinPnSigmaAbovePionLine=0.4;
1627 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
1633 ///________________________________________________________________________
1634 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
1637 switch(chi2GammaCut){
1639 fChi2CutConversion = 100.;
1642 fChi2CutConversion = 50.;
1645 fChi2CutConversion = 30.;
1648 fChi2CutConversion = 200.;
1651 fChi2CutConversion = 500.;
1654 fChi2CutConversion = 100000.;
1657 fChi2CutConversion = 5.;
1660 fChi2CutConversion = 10.;
1663 fChi2CutConversion = 20.;
1666 fChi2CutConversion = 15.;
1669 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
1675 ///________________________________________________________________________
1676 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
1678 switch (v0FinderType){
1679 case 0: // on fly V0 finder
1680 fUseOnFlyV0Finder=kTRUE;
1682 case 1: // offline V0 finder
1683 fUseOnFlyV0Finder=kFALSE;
1686 AliError(Form(" v0FinderType not defined %d",v0FinderType));
1693 ///________________________________________________________________________
1694 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
1696 switch(singlePtCut){
1697 case 0: // 0.050 GeV
1698 fSinglePtCut = 0.050;
1700 case 1: // 0.100 GeV
1701 fSinglePtCut = 0.100;
1703 case 2: // 0.150 GeV
1704 fSinglePtCut = 0.150;
1706 case 3: // 0.200 GeV
1707 fSinglePtCut = 0.200;
1709 case 4: // 0.075 GeV
1710 fSinglePtCut = 0.075;
1712 case 5: // 0.125 GeV
1713 fSinglePtCut = 0.125;
1716 AliError(Form("singlePtCut not defined %d",singlePtCut));
1721 ///________________________________________________________________________
1722 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
1737 case 4: // 60% of findable clusters
1739 fUseCorrectedTPCClsInfo=0;
1741 case 5: // 0% of findable clusters
1743 fUseCorrectedTPCClsInfo=1;
1745 case 6: // 0% of findable clusters
1747 fUseCorrectedTPCClsInfo=1;
1749 case 7: // 0% of findable clusters
1750 fMinClsTPCToF= 0.35;
1751 fUseCorrectedTPCClsInfo=0;
1754 fMinClsTPCToF= 0.35;
1755 fUseCorrectedTPCClsInfo=1;
1759 fUseCorrectedTPCClsInfo=1;
1762 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
1768 ///________________________________________________________________________
1769 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
1772 //Set Standard LineCutZValues
1773 fLineCutZValueMin = -2;
1774 fLineCutZValue = 7.;
1779 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1781 fLineCutZRSlopeMin = 0.;
1785 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1787 fLineCutZRSlopeMin = 0.;
1791 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1793 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCut)));
1797 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1799 fLineCutZRSlopeMin = 0.;
1803 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1805 fLineCutZRSlopeMin = 0.;
1807 case 5: // 0.9 - 1.4
1809 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1811 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
1813 case 6: // 0.9 - 1.2
1815 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1817 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
1819 case 7: // 0.1 - 0.8
1821 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1823 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
1825 case 8: // 0.1 - 0.8
1827 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1829 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
1832 AliError(Form(" EtaCut not defined %d",etaCut));
1838 ///________________________________________________________________________
1839 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
1841 switch(piMaxMomdedxSigmaCut){
1843 fPIDMaxPnSigmaAbovePionLine=100.;
1846 fPIDMaxPnSigmaAbovePionLine=5.;
1849 fPIDMaxPnSigmaAbovePionLine=4.;
1852 fPIDMaxPnSigmaAbovePionLine=3.5;
1855 fPIDMaxPnSigmaAbovePionLine=3.;
1858 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
1864 ///________________________________________________________________________
1865 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
1873 fDetectorCentrality=0;
1877 fDetectorCentrality=1;
1879 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
1881 fDetectorCentrality=0;
1882 fModCentralityClass=1;
1884 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
1886 fDetectorCentrality=0;
1887 fModCentralityClass=2;
1890 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
1897 ///________________________________________________________________________
1898 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
1900 switch(LowPRejectionSigmaCut){
1902 fPIDnSigmaAtLowPAroundKaonLine=0;
1903 fPIDnSigmaAtLowPAroundProtonLine=0;
1904 fPIDnSigmaAtLowPAroundPionLine=0;
1907 fPIDnSigmaAtLowPAroundKaonLine=0.5;
1908 fPIDnSigmaAtLowPAroundProtonLine=0.5;
1909 fPIDnSigmaAtLowPAroundPionLine=0.5;
1912 fPIDnSigmaAtLowPAroundKaonLine=1;
1913 fPIDnSigmaAtLowPAroundProtonLine=1;
1914 fPIDnSigmaAtLowPAroundPionLine=1;
1917 fPIDnSigmaAtLowPAroundKaonLine=2.;
1918 fPIDnSigmaAtLowPAroundProtonLine=2.;
1919 fPIDnSigmaAtLowPAroundPionLine=2.;
1922 fPIDnSigmaAtLowPAroundKaonLine=0.;
1923 fPIDnSigmaAtLowPAroundProtonLine=0.;
1924 fPIDnSigmaAtLowPAroundPionLine=1;
1927 fPIDnSigmaAtLowPAroundKaonLine=0.;
1928 fPIDnSigmaAtLowPAroundProtonLine=0.;
1929 fPIDnSigmaAtLowPAroundPionLine=1.5;
1932 fPIDnSigmaAtLowPAroundKaonLine=0.;
1933 fPIDnSigmaAtLowPAroundProtonLine=0.;
1934 fPIDnSigmaAtLowPAroundPionLine=2.;
1937 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
1943 ///________________________________________________________________________
1944 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
1946 switch(TOFelectronPID){
1948 fUseTOFpid = kFALSE;
1949 fTofPIDnSigmaBelowElectronLine=-100;
1950 fTofPIDnSigmaAboveElectronLine=100;
1954 fTofPIDnSigmaBelowElectronLine=-7;
1955 fTofPIDnSigmaAboveElectronLine=7;
1959 fTofPIDnSigmaBelowElectronLine=-5;
1960 fTofPIDnSigmaAboveElectronLine=5;
1964 fTofPIDnSigmaBelowElectronLine=-3;
1965 fTofPIDnSigmaAboveElectronLine=5;
1969 fTofPIDnSigmaBelowElectronLine=-2;
1970 fTofPIDnSigmaAboveElectronLine=3;
1973 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
1979 ///________________________________________________________________________
1980 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
1982 switch(TRDElectronCut){
1988 fPIDTRDEfficiency=0.1;
1992 fPIDTRDEfficiency=0.8;
1996 fPIDTRDEfficiency=0.9;
1999 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
2005 ///________________________________________________________________________
2006 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2011 fDoQtGammaSelection=kFALSE; //No Qt selection (true by default)
2012 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2013 fHighPtQtMax=100.; // RRnew
2014 fPtBorderForQt=100.; // RRnew
2018 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2019 fHighPtQtMax=100.; // RRnew
2020 fPtBorderForQt=100.; // RRnew
2024 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2025 fHighPtQtMax=100.; // RRnew
2026 fPtBorderForQt=100.; // RRnew
2030 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2031 fHighPtQtMax=100.; // RRnew
2032 fPtBorderForQt=100.; // RRnew
2036 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2037 fHighPtQtMax=100.; // RRnew
2038 fPtBorderForQt=100.; // RRnew
2040 case 5: // RR try to improve (get rid of) low InvMass peak in PbPb
2042 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2043 fHighPtQtMax=100.; // RRnew
2044 fPtBorderForQt=100.; // RRnew
2045 break; // end RR ///////////////////////////////////////////////
2046 case 6: // RRnew start: pT dependent qT cut
2048 fDoHighPtQtGammaSelection=kTRUE;
2051 break; // RRnew end ////////////////////////////////////////////
2054 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2055 fHighPtQtMax=100.; // RRnew
2056 fPtBorderForQt=100.; // RRnew
2059 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2065 //-------------------------------------------------------------
2066 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
2067 { // Get Event Centrality
2069 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
2071 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
2073 if(fDetectorCentrality==0){
2074 return fESDCentrality->GetCentralityPercentile("V0M"); // default
2076 if(fDetectorCentrality==1){
2077 return fESDCentrality->GetCentralityPercentile("CL1");
2081 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
2083 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
2089 //-------------------------------------------------------------
2090 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event)
2091 { // Centrality Selection
2092 if(!fIsHeavyIon)return kTRUE;
2094 if(fCentralityMin == 0 && fCentralityMax == 0) return kTRUE;//0-100%
2095 if(fCentralityMin >= fCentralityMax) return kTRUE;//0-100%
2097 Double_t centrality=GetCentrality(event);
2098 if(centrality<0)return kFALSE;
2100 Int_t centralityC=0;
2101 if (fModCentralityClass == 0){
2102 centralityC= Int_t(centrality/10);
2103 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
2107 } else if (fModCentralityClass ==1){
2108 centralityC= Int_t(centrality);
2109 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
2114 } else if (fModCentralityClass ==2){
2115 centralityC= Int_t(centrality+1);
2116 if(centralityC >= (fCentralityMin*5+45) && centralityC < (fCentralityMax*5+45))
2124 //-------------------------------------------------------------
2125 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2128 if(minCentrality<0||minCentrality>9){
2129 AliError(Form("minCentrality not defined %d",minCentrality));
2133 fCentralityMin=minCentrality;
2136 //-------------------------------------------------------------
2137 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2140 if(maxCentrality<0||maxCentrality>9){
2141 AliError(Form("maxCentrality not defined %d",maxCentrality));
2145 fCentralityMax=maxCentrality;
2149 ///________________________________________________________________________
2150 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2152 switch(doPhotonAsymmetryCut){
2154 fDoPhotonAsymmetryCut=0;
2155 fMinPPhotonAsymmetryCut=100.;
2156 fMinPhotonAsymmetry=0.;
2159 fDoPhotonAsymmetryCut=1;
2160 fMinPPhotonAsymmetryCut=3.5;
2161 fMinPhotonAsymmetry=0.04;
2164 fDoPhotonAsymmetryCut=1;
2165 fMinPPhotonAsymmetryCut=3.5;
2166 fMinPhotonAsymmetry=0.06;
2169 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2172 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2177 ///________________________________________________________________________
2178 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2183 fPsiPairCut = 10000; //
2186 fPsiPairCut = 0.1; //
2189 fPsiPairCut = 0.05; // Standard
2192 fPsiPairCut = 0.035; //
2195 fPsiPairCut = 0.15; //
2198 fPsiPairCut = 0.2; //
2201 fPsiPairCut = 0.03; //
2204 fPsiPairCut = 0.025; //
2207 fPsiPairCut = 0.01; //
2210 AliError(Form("PsiPairCut not defined %d",psiCut));
2217 ///________________________________________________________________________
2218 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2222 fCosPAngleCut = TMath::Pi(); //
2225 fCosPAngleCut = 0.1; //
2228 fCosPAngleCut = 0.05; //
2231 fCosPAngleCut = 0.025; // Standard
2234 fCosPAngleCut = 0.01; //
2237 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2245 ///________________________________________________________________________
2246 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
2247 // Cut on z position of primary vertex
2248 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
2250 if(TMath::Abs(fVertexZ)>fMaxVertexZ)return kFALSE;
2254 ///________________________________________________________________________
2255 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
2259 fDoSharedElecCut = kFALSE;
2262 fDoSharedElecCut = kTRUE;
2265 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
2272 ///________________________________________________________________________
2273 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
2277 fDoToCloseV0sCut = kFALSE;
2281 fDoToCloseV0sCut = kTRUE;
2285 fDoToCloseV0sCut = kTRUE;
2289 fDoToCloseV0sCut = kTRUE;
2293 AliError(Form("Shared Electron Cut not defined %d",toClose));
2298 ///________________________________________________________________________
2299 Bool_t AliConversionCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
2301 switch(extraSignal){
2303 fRejectExtraSignals = 0;
2304 break; // No Rejection
2306 fRejectExtraSignals = 1;
2307 break; // MinBias Header
2309 fRejectExtraSignals = 2;
2310 break; // User String Array
2312 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
2318 ///________________________________________________________________________
2320 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
2321 // returns number of contributors to the vertex
2323 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2325 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
2326 return fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
2329 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
2331 //-AM test pi0s without SPD only vertex
2332 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2333 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
2336 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2342 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2344 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
2345 return fAODEvent->GetPrimaryVertex()->GetNContributors();
2347 if(fAODEvent->GetPrimaryVertex()->GetNContributors()<1) {
2348 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2349 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
2351 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2352 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
2362 ///________________________________________________________________________
2364 Bool_t AliConversionCuts::IsTriggerSelected()
2366 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2368 UInt_t isSelected = AliVEvent::kAny;
2369 if( fInputHandler && fInputHandler->GetEventSelection()) {
2370 // Get the actual offline trigger mask for the event and AND it with the
2371 // requested mask. If no mask requested select by default the event.
2372 if (fOfflineTriggerMask)
2373 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
2376 if(!isSelected)return kFALSE;
2380 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(0);
2381 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(1);
2382 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(2);
2383 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(3);
2384 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(4);
2385 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
2393 ///________________________________________________________________________
2394 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
2395 // Get first TPC row
2396 Int_t firstTPCRow=0;
2397 Double_t radiusI = 84.8;
2398 Double_t radiusO = 134.6;
2399 Double_t radiusOB = 198.;
2400 Double_t rSizeI = 0.75;
2401 Double_t rSizeO = 1.;
2402 Double_t rSizeOB = 1.5;
2406 if(radius <= radiusI){
2409 if(radius>radiusI && radius<=radiusO){
2410 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
2412 if(radius>radiusO && radius<=radiusOB){
2413 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
2416 if(radius>radiusOB){
2417 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
2423 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
2424 ///Check if passes cosine of pointing angle cut
2425 if(GetCosineOfPointingAngle(photon, event) < (TMath::Cos(fCosPAngleCut))){
2431 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
2432 // calculates the pointing angle of the recalculated V0
2434 Double_t momV0[3] = {0,0,0};
2435 if(event->IsA()==AliESDEvent::Class()){
2436 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
2437 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
2438 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
2440 if(event->IsA()==AliAODEvent::Class()){
2441 momV0[0] = photon->GetPx();
2442 momV0[1] = photon->GetPy();
2443 momV0[2] = photon->GetPz();
2446 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
2447 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
2448 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
2449 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
2451 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
2452 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
2454 Double_t cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
2456 return cosinePointingAngle;
2460 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
2462 if(photon->GetPsiPair() > fPsiPairCut){
2468 ///________________________________________________________________________
2469 TString AliConversionCuts::GetCutNumber(){
2470 // returns TString with current cut number
2472 for(Int_t ii=0;ii<kNCuts;ii++){
2473 a.Append(Form("%d",fCuts[ii]));
2478 ///________________________________________________________________________
2479 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
2481 Int_t posLabel = photon->GetTrackLabelPositive();
2482 Int_t negLabel = photon->GetTrackLabelNegative();
2484 fElectronLabelArray[nV0*2] = posLabel;
2485 fElectronLabelArray[(nV0*2)+1] = negLabel;
2487 ///________________________________________________________________________
2488 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
2490 Int_t posLabel = photon->GetTrackLabelPositive();
2491 Int_t negLabel = photon->GetTrackLabelNegative();
2493 for(Int_t i = 0; i<nV0s*2;i++){
2494 if(i==nV0*2) continue;
2495 if(i==(nV0*2)+1) continue;
2496 if(fElectronLabelArray[i] == posLabel){
2498 if(fElectronLabelArray[i] == negLabel){
2504 ///________________________________________________________________________
2505 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
2508 Double_t posX = photon->GetConversionX();
2509 Double_t posY = photon->GetConversionY();
2510 Double_t posZ = photon->GetConversionZ();
2512 for(Int_t i = 0;i<photons->GetEntries();i++){
2513 if(nV0 == i) continue;
2514 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
2515 Double_t posCompX = photonComp->GetConversionX();
2516 Double_t posCompY = photonComp->GetConversionY();
2517 Double_t posCompZ = photonComp->GetConversionZ();
2519 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
2521 if(dist < fminV0Dist*fminV0Dist){
2522 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;
2530 ///________________________________________________________________________
2531 void AliConversionCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliMCEvent *MCEvent){
2533 if(fNotRejectedStart){
2534 delete[] fNotRejectedStart;
2535 fNotRejectedStart = NULL;
2537 if(fNotRejectedEnd){
2538 delete[] fNotRejectedEnd;
2539 fNotRejectedEnd = NULL;
2541 if(fGeneratorNames){
2542 delete[] fGeneratorNames;
2543 fGeneratorNames = NULL;
2546 if(rejection == 0) return; // No Rejection
2547 AliGenCocktailEventHeader *cHeader = dynamic_cast<AliGenCocktailEventHeader*>(MCEvent->GenEventHeader());
2549 TList *genHeaders = cHeader->GetHeaders();
2550 AliGenEventHeader* gh = 0;
2552 if(rejection == 1) fnHeaders = 1; // MinBiasHeader
2553 if(rejection == 2){ // TList of Headers Names
2554 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
2555 gh = (AliGenEventHeader*)genHeaders->At(i);
2556 TString GeneratorName = gh->GetName();
2557 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
2558 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
2559 if(GeneratorName.CompareTo(GeneratorInList) == 0){
2567 fNotRejectedStart = new Int_t[fnHeaders];
2568 fNotRejectedEnd = new Int_t[fnHeaders];
2569 fGeneratorNames = new TString[fnHeaders];
2572 fNotRejectedStart[0] = 0;
2573 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced();
2574 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
2579 Int_t firstindex = 0;
2580 Int_t lastindex = -1;
2582 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
2583 gh = (AliGenEventHeader*)genHeaders->At(i);
2584 TString GeneratorName = gh->GetName();
2585 lastindex = lastindex + gh->NProduced();
2586 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
2587 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
2588 if(GeneratorName.CompareTo(GeneratorInList) == 0){
2589 fNotRejectedStart[nummer] = firstindex;
2590 fNotRejectedEnd[nummer] = lastindex;
2591 fGeneratorNames[nummer] = GeneratorName;
2596 firstindex = firstindex + gh->NProduced();
2600 fNotRejectedStart = new Int_t[1];
2601 fNotRejectedEnd = new Int_t[1];
2602 fGeneratorNames = new TString[1];
2603 if(rejection == 1 || rejection == 0){ fnHeaders = 1; } else {fnHeaders = 0;}
2604 fNotRejectedStart[0] = 0;
2605 fNotRejectedEnd[0] = MCEvent->Stack()->GetNprimary();
2606 fGeneratorNames[0] = "NoGenerator";
2607 //cout << "rejection: " << rejection << " start: " << fNotRejectedStart[0] << " end: " << fNotRejectedEnd[0] << endl;
2611 //_________________________________________________________________________
2612 Bool_t AliConversionCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack){
2614 if(index < 0) return kFALSE; // No Particle
2616 Bool_t accepted = kFALSE;
2617 if( index >= MCStack->GetNprimary()){ // Secondary Particle
2618 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return kTRUE; // Secondary Particle without Mother??
2619 //cout<<"Secondary "<<index<<" "<<((TParticle*)MCStack->Particle(index))->GetPdgCode()<<" "<<((TParticle*)MCStack->Particle(index))->GetMother(0)<<endl;
2620 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack);
2622 // cout<<index<<" "<<((TParticle*)MCStack->Particle(index))->GetPdgCode()<<" "<<fNotRejectedStart[0]<<" "<<fNotRejectedEnd[0]<<" "<<MCStack->GetNprimary()<<endl;
2623 for(Int_t i = 0;i<fnHeaders;i++){
2624 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i])