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 "AliAODHandler.h"
31 #include "AliPIDResponse.h"
35 #include "AliAODConversionMother.h"
36 #include "TObjString.h"
37 #include "AliAODEvent.h"
38 #include "AliESDEvent.h"
39 #include "AliCentrality.h"
45 ClassImp(AliConversionCuts)
48 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
60 "LowPRejectionSigmaCut",
62 "piMaxMomdedxSigmaCut",
67 "DegreesForRotationMethod",
77 "DoPhotonAsymmetryCut",
79 "CosinePointingAngle",
83 //________________________________________________________________________
84 AliConversionCuts::AliConversionCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
98 fLineCutZRSlopeMin(0.),
100 fChi2CutConversion(1000),
102 fPIDProbabilityCutNegativeParticle(0),
103 fPIDProbabilityCutPositiveParticle(0),
104 fDodEdxSigmaCut(kTRUE),
105 fDoTOFsigmaCut(kFALSE), // RRnewTOF
106 fPIDTRDEfficiency(1),
108 fPIDnSigmaAboveElectronLine(100),
109 fPIDnSigmaBelowElectronLine(-100),
110 fTofPIDnSigmaAboveElectronLine(100), // RRnewTOF
111 fTofPIDnSigmaBelowElectronLine(-100), // RRnewTOF
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.),
141 fUseCentrality(kFALSE),
142 fUseCentralityBin(kFALSE),
143 fUseCorrectedTPCClsInfo(kFALSE),
145 fAlphaMinCutMeson(0),
147 fRapidityCutMeson(1),
148 fUseRotationMethodInBG(kFALSE),
149 fdoBGProbability(kFALSE),
150 fUseTrackMultiplicityForBG(kFALSE),
151 fnDegreeRotationPMForBG(0),
152 fnumberOfRotationEventsForBG(0),
153 fUseMCPSmearing(kFALSE),
157 fUseMultiplicity(kFALSE),
158 fUseMultiplicityBin(0),
159 fSelectV0AND(kFALSE),
160 fRemovePileUp(kFALSE),
161 fOpeningAngle(0.005),
163 fCosPAngleCut(10000),
166 hTPCdEdxbefore(NULL),
170 hInvMassbefore(NULL),
171 hArmenterosbefore(NULL),
173 hArmenterosafter(NULL),
174 hAcceptanceCuts(NULL),
183 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
184 fCutString=new TObjString((GetCutNumber()).Data());
188 //________________________________________________________________________
189 AliConversionCuts::~AliConversionCuts() {
191 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
193 // delete fHistograms;
194 // fHistograms = NULL;
197 //________________________________________________________________________
198 void AliConversionCuts::InitCutHistograms(){
200 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
202 fHistograms=new TList();
203 fHistograms->SetName("ConversionCuts");
204 fHistograms->SetOwner(kTRUE);
207 fHistograms->Add(fCutString);
211 hCutIndex=new TH1F("IsPhotonSelected","IsPhotonSelected",10,-0.5,9.5);
212 hCutIndex->GetXaxis()->SetBinLabel(1,"in");
213 hCutIndex->GetXaxis()->SetBinLabel(2,"no tracks");
214 hCutIndex->GetXaxis()->SetBinLabel(3,"dEdx");
215 hCutIndex->GetXaxis()->SetBinLabel(4,"Track cuts");
216 hCutIndex->GetXaxis()->SetBinLabel(5,"PhotonCuts");
217 hCutIndex->GetXaxis()->SetBinLabel(6,"out");
218 fHistograms->Add(hCutIndex);
221 hTrackCuts=new TH1F("TrackCuts","TrackCuts",10,-0.5,9.5);
222 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
223 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
224 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
225 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
226 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
227 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
228 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
229 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
230 fHistograms->Add(hTrackCuts);
234 hPhotonCuts=new TH1F("PhotonCuts","PhotonCuts",12,-0.5,11.5);
235 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
236 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
237 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
238 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
239 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
240 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
241 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
242 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
243 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
244 hPhotonCuts->GetXaxis()->SetBinLabel(10,"out");
245 fHistograms->Add(hPhotonCuts);
247 hInvMassbefore=new TH1F("InvMass_before","InvMass_before",100,0,0.3);
248 fHistograms->Add(hInvMassbefore);
249 hArmenterosbefore=new TH2F("Armenteros_before","Armenteros_before",200,-1,1,250,0,0.25);
250 fHistograms->Add(hArmenterosbefore);
251 hInvMassafter=new TH1F("InvMass_after","InvMass_after",100,0,0.3);
252 fHistograms->Add(hInvMassafter);
253 hArmenterosafter=new TH2F("Armenteros_after","Armenteros_after",200,-1,1,250,0,0.25);
254 fHistograms->Add(hArmenterosafter);
256 hAcceptanceCuts=new TH1F("PhotonAcceptanceCuts","PhotonAcceptanceCuts",10,-0.5,9.5);
257 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
258 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
259 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
260 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
261 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
262 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
263 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
264 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
265 fHistograms->Add(hAcceptanceCuts);
269 hdEdxCuts=new TH1F("dEdxCuts","dEdxCuts",10,-0.5,9.5);
270 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
271 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
272 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
273 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
274 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
275 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
276 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
277 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
278 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
279 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
281 fHistograms->Add(hdEdxCuts);
283 hTPCdEdxbefore=new TH2F("Gamma_dEdx_before","dEdx Gamma before" ,100,0,25,400, 0,200);
284 fHistograms->Add(hTPCdEdxbefore);
285 hTPCdEdxafter=new TH2F("Gamma_dEdx_after","dEdx Gamma after" ,100,0,25,400, 0,200);
286 fHistograms->Add(hTPCdEdxafter);
288 // Event Cuts and Info
290 hV0EventCuts=new TH1F("ESD_EventCuts","Event Cuts",10,-0.5,9.5);
291 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
292 hV0EventCuts->GetXaxis()->SetBinLabel(2,"VertexZ");
293 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
294 hV0EventCuts->GetXaxis()->SetBinLabel(4,"centrsel");
295 hV0EventCuts->GetXaxis()->SetBinLabel(5,"out");
296 fHistograms->Add(hV0EventCuts);
298 hCentrality=new TH1F("Centrality","Centrality",100,0,100);
299 fHistograms->Add(hCentrality);
300 hVertexZ=new TH1F("VertexZ","VertexZ",1000,-50,50);
301 fHistograms->Add(hVertexZ);
305 hMesonCuts=new TH1F("MesonCuts","MesonCuts",10,-0.5,9.5);
306 hMesonCuts->GetXaxis()->SetBinLabel(1,"in");
307 hMesonCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
308 hMesonCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
309 hMesonCuts->GetXaxis()->SetBinLabel(4,"opening angle");
310 hMesonCuts->GetXaxis()->SetBinLabel(5,"alpha max");
311 hMesonCuts->GetXaxis()->SetBinLabel(6,"alpha min");
312 hMesonCuts->GetXaxis()->SetBinLabel(7,"out");
313 fHistograms->Add(hMesonCuts);
315 hMesonBGCuts=new TH1F("MesonBGCuts","MesonBGCuts",10,-0.5,9.5);
316 hMesonBGCuts->GetXaxis()->SetBinLabel(1,"in");
317 hMesonBGCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
318 hMesonBGCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
319 hMesonBGCuts->GetXaxis()->SetBinLabel(4,"opening angle");
320 hMesonBGCuts->GetXaxis()->SetBinLabel(5,"alpha max");
321 hMesonBGCuts->GetXaxis()->SetBinLabel(6,"alpha min");
322 hMesonBGCuts->GetXaxis()->SetBinLabel(7,"out");
323 fHistograms->Add(hMesonBGCuts);
326 //________________________________________________________________________
327 Bool_t AliConversionCuts::InitPIDResponse(){
328 // Set Pointer to AliPIDResponse
330 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
332 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
333 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
334 if(fPIDResponse)return kTRUE;
340 ///________________________________________________________________________
341 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent){
342 // Process Event Selection
345 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
348 // Z Vertex Position Cut
349 if(!VertexZCut(fInputEvent)){
350 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
355 // Number of Contributors Cut
356 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
357 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
362 // Centrality Selection
363 if(!IsCentralitySelected(fInputEvent)){
364 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
369 // Fill Event Histograms
370 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
371 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
372 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
377 ///________________________________________________________________________
378 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack){
379 // MonteCarlo Photon Selection
381 if(!fMCStack)return kFALSE;
383 if (particle->GetPdgCode() == 22){
384 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin) return kFALSE;
386 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
387 return kFALSE; // no photon as mothers!
390 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
391 return kFALSE; // the gamma has a mother, and it is not a primary particle
394 // looking for conversion (electron + positron from pairbuilding (= 5) )
395 TParticle* ePos = NULL;
396 TParticle* eNeg = NULL;
398 if(particle->GetNDaughters() >= 2){
399 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
400 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
401 if(tmpDaughter->GetUniqueID() == 5){
402 if(tmpDaughter->GetPdgCode() == 11){
404 } else if(tmpDaughter->GetPdgCode() == -11){
411 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
415 if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
420 //________________________________________________________________________
421 Bool_t AliConversionCuts::MesonIsSelectedMC(TParticle *fMCMother,AliStack *fMCStack,Bool_t bMCDaughtersInAcceptance){
422 // Returns true for all pions within acceptance cuts for decay into 2 photons
423 // If bMCDaughtersInAcceptance is selected, it requires in addition that both daughter photons are within acceptance cuts
425 if(!fMCStack)return kFALSE;
427 if(fMCMother->GetPdgCode()==111){
429 // PseudoRapidity Cut
430 if(TMath::Abs(fMCMother->Eta())>fRapidityCutMeson)return kFALSE;
432 // Select only -> 2y decay channel
433 if(fMCMother->GetNDaughters()!=2)return kFALSE;
435 for(Int_t i=0;i<2;i++){
436 TParticle *MDaughter=fMCStack->Particle(fMCMother->GetDaughter(i));
438 // Is Daughter a Photon?
439 if(MDaughter->GetPdgCode()!=22)return kFALSE;
440 // Is Photon in Acceptance?
441 if(bMCDaughtersInAcceptance){
442 if(!PhotonIsSelectedMC(MDaughter,fMCStack)){return kFALSE;}
450 ///________________________________________________________________________
451 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
452 { // Specific Photon Cuts
455 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
458 // Gamma selection based on QT from Armenteros
459 if(fDoQtGammaSelection == kTRUE){
460 if(!ArmenterosQtCut(photon)){
461 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
468 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
470 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
476 // Reconstruction Acceptance Cuts
477 if(!AcceptanceCuts(photon)){
478 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
484 if(fDoPhotonAsymmetryCut == kTRUE){
485 if(!AsymmetryCut(photon,event)){
486 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
491 //Check the pid probability
493 if(!PIDProbabilityCut(photon, event)) {
494 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
499 if(!CorrectedTPCClusterCut(photon, event)) {
500 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
506 if(!PsiPairCut(photon, event)) {
507 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
512 if(!CosinePAngleCut(photon, event)) {
513 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
518 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
523 ///________________________________________________________________________
524 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
525 { //Cut on corrected TPC Cluster Info
527 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
528 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
530 if(!negTrack||!posTrack)return kFALSE;
532 Double_t negclsToF=0;
534 if (!fUseCorrectedTPCClsInfo ){
535 if(negTrack->GetTPCNclsF()!=0){
536 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
539 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
542 Double_t posclsToF = 0.;
543 if (!fUseCorrectedTPCClsInfo ){
544 if(posTrack->GetTPCNclsF()!=0 ){
545 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
548 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
551 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
559 ///________________________________________________________________________
560 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event,Bool_t DoOnlyPhotonCuts) {
561 //Selection of Reconstructed Photons
564 if(hCutIndex)hCutIndex->Fill(cutIndex);
567 // Fill Histos before Cuts
568 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetPhotonMass());
569 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
572 if(!DoOnlyPhotonCuts){
574 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
575 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
577 if(!negTrack || !posTrack) {
578 if(hCutIndex)hCutIndex->Fill(cutIndex);
584 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
585 if(hCutIndex)hCutIndex->Fill(cutIndex);
591 if(!TracksAreSelected(negTrack, posTrack)){
592 if(hCutIndex)hCutIndex->Fill(cutIndex);//4
600 if(!PhotonCuts(photon,event)){
601 if(hCutIndex)hCutIndex->Fill(cutIndex);
607 // Photon passed cuts
608 if(hCutIndex)hCutIndex->Fill(cutIndex);
609 if(hInvMassafter)hInvMassafter->Fill(photon->GetPhotonMass());
610 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
615 ///________________________________________________________________________
616 Bool_t AliConversionCuts::MesonIsSelected(AliAODConversionMother *pi0,Bool_t IsSignal)
618 // Selection of reconstructed Meson candidates
619 // Use flag IsSignal in order to fill Fill different
620 // histograms for Signal and Background
623 if(IsSignal){hist=hMesonCuts;
625 else{hist=hMesonBGCuts;}
628 if(hist)hist->Fill(cutIndex);
631 // Undefined Rapidity -> Floating Point exception
632 if((pi0->E()+pi0->Pz())/(pi0->E()-pi0->Pz())<=0){
633 if(hist)hist->Fill(cutIndex);
638 // PseudoRapidity Cut
640 if(TMath::Abs(pi0->PseudoRapidity())>fRapidityCutMeson){
641 if(hist)hist->Fill(cutIndex);
648 fOpeningAngle=2*TMath::ATan(0.134/pi0->P());// physical minimum opening angle
649 if(pi0->GetOpeningAngle()<fOpeningAngle){
650 if(hist)hist->Fill(cutIndex);
656 if(pi0->GetAlpha()>fAlphaCutMeson){
657 if(hist)hist->Fill(cutIndex);
663 if(pi0->GetAlpha()<fAlphaMinCutMeson){
664 if(hist)hist->Fill(cutIndex);
669 if(hist)hist->Fill(cutIndex);
674 ///________________________________________________________________________
675 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
676 { // Armenteros Qt Cut
678 if(fDoHighPtQtGammaSelection){
679 if(photon->GetPhotonPt() < fPtBorderForQt){
680 if(photon->GetArmenterosQt()>fQtMax){
684 if(photon->GetArmenterosQt()>fHighPtQtMax){
690 if(photon->GetArmenterosQt()>fQtMax){
698 ///________________________________________________________________________
699 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
700 // Exclude certain areas for photon reconstruction
703 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
706 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
707 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
712 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
713 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
718 if(photon->GetConversionRadius() <= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
719 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
722 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
723 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
728 if(TMath::Abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
729 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
735 if(TMath::Abs(photon->GetPhotonEta())> fEtaCut || TMath::Abs(photon->GetPhotonEta())< fEtaCutMin){
736 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
742 if(photon->GetPhotonPt()<fPtCut){
743 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
748 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
754 ///________________________________________________________________________
755 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
756 // Track Cuts which require AOD/ESD specific implementation
758 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !negTrack->IsOn(AliESDtrack::kTPCrefit) ) {
759 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
764 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
765 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
766 if((NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
767 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
775 ///________________________________________________________________________
776 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
777 // Track Cuts which require AOD/ESD specific implementation
779 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !negTrack->IsOn(AliESDtrack::kTPCrefit) ) {
780 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
785 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
786 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
794 ///________________________________________________________________________
795 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
796 // Track Selection for Photon Reconstruction
799 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
803 if(negTrack->Charge() == posTrack->Charge()) {
804 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
809 // Number of TPC Clusters
810 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
811 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
818 if(TMath::Abs(negTrack->Eta()) > fEtaCut || TMath::Abs(negTrack->Eta()) < fEtaCutMin ||
819 TMath::Abs(posTrack->Eta())> fEtaCut || TMath::Abs(posTrack->Eta())< fEtaCutMin) {
820 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
826 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
827 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
832 // AOD ESD specific cuts
833 Bool_t passCuts = kTRUE;
835 if(negTrack->IsA()==AliAODTrack::Class()) {
836 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
838 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
842 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
847 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
853 ///________________________________________________________________________
854 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
855 // Electron Identification Cuts for Photon reconstruction
857 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
858 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
861 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
862 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
866 if(fDodEdxSigmaCut == kTRUE){
868 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
869 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
871 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
877 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
878 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
879 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
880 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
882 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
889 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
890 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
891 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
892 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
894 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
902 if(fDoKaonRejectionLowP == kTRUE){
903 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
904 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
906 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
913 if(fDoProtonRejectionLowP == kTRUE){
914 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
915 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
917 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
924 if(fDoPionRejectionLowP == kTRUE){
925 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
926 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
928 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
936 if( fDoTOFsigmaCut == kTRUE ){ // RRnewTOF start /////////////////////////////////////////////////////////////////////////////
938 if((fPIDResponse->NumberOfSigmasTOF(fCurrentTrack,AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine) || (fPIDResponse->NumberOfSigmasTOF(fCurrentTrack,AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine)){
940 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
943 } /////////////////////////////// RRnewTOF end ///////////////////////////////////////////////////////////////////////////////
948 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
950 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
956 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
957 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
962 ///________________________________________________________________________
963 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
964 // Cut on Energy Assymetry
966 for(Int_t ii=0;ii<2;ii++){
968 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
970 if( track->P() > fMinPPhotonAsymmetryCut ){
971 Double_t trackNegAsy=0;
972 if (photon->GetPhotonP()!=0.){
973 trackNegAsy= track->P()/photon->GetPhotonP();
976 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
985 ///________________________________________________________________________
986 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label) const{
987 //Returns pointer to the track with given ESD label
988 //(Important for AOD implementation, since Track array in AOD data is different
989 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
991 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
993 if(label > event->GetNumberOfTracks() ) return NULL;
994 AliESDtrack * track = esdEvent->GetTrack(label);
998 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
999 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1002 if(track->GetID() == label) {
1009 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
1014 ///________________________________________________________________________
1015 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1016 // Cut on Electron Probability for Photon Reconstruction
1018 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1022 Bool_t iResult=kFALSE;
1024 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1025 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1027 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1028 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1030 if(negProbArray && posProbArray){
1032 negTrack->GetTPCpid(negProbArray);
1033 posTrack->GetTPCpid(posProbArray);
1035 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1040 delete [] posProbArray;
1041 delete [] negProbArray;
1045 ///Not possible for AODs
1055 ///________________________________________________________________________
1056 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1057 // MC Acceptance Cuts
1058 //(Certain areas were excluded for photon reconstruction)
1060 if(particle->R()>fMaxR){
1063 if(ePos->R()>fMaxR){
1067 if(ePos->R()<fMinR){
1071 if( ePos->R() <= ((TMath::Abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1074 else if (fUseEtaMinCut && ePos->R() >= ((TMath::Abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1078 if(TMath::Abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1082 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1086 if(TMath::Abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1090 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin){
1094 if(TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin){
1098 if(TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin){
1102 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1106 if(particle->Pt()<fPtCut){
1112 ///________________________________________________________________________
1113 Bool_t AliConversionCuts::UpdateCutString(cutIds cutID, Int_t value) {
1114 ///Update the cut string (if it has been created yet)
1116 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1117 cout << "Updating cut id in spot number " << cutID << " to " << value << endl;
1118 fCutString->SetString(GetCutNumber());
1120 cout << "fCutString not yet initialized, will not be updated" << endl;
1123 cout << fCutString->GetString().Data() << endl;
1127 ///________________________________________________________________________
1128 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1129 // Initialize Cuts from a given Cut string
1131 cout<<"Set Cut Number: "<<analysisCutSelection.Data()<<endl;
1132 if(analysisCutSelection.Length()!=kNCuts) {
1133 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1136 if(!analysisCutSelection.IsDigit()){
1137 AliError("Cut selection contains characters");
1141 const char *cutSelection = analysisCutSelection.Data();
1142 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1143 for(Int_t ii=0;ii<kNCuts;ii++){
1149 AliError("Analysis Cut Selection does not start with 9");
1154 // Set Individual Cuts
1155 for(Int_t ii=0;ii<kNCuts;ii++){
1156 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1163 ///________________________________________________________________________
1164 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1165 ///Set individual cut ID
1167 cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
1169 if(cutID >= kNCuts) {
1170 cout << "Error:: Cut id "<< cutID << " outside range of kNCuts " << kNCuts << endl;
1178 fCuts[kgoodId] = value;
1180 cout << "Error:: First value of cut string is wrong, aborting!!" << endl;
1188 if( SetV0Finder(value)) {
1189 fCuts[kv0FinderType] = value;
1190 UpdateCutString(cutID, value);
1192 } else return kFALSE;
1195 if( SetElectronProbCut(value)) {
1196 fCuts[keProbCut] = value;
1197 UpdateCutString(cutID, value);
1199 } else return kFALSE;
1201 case kededxSigmaCut:
1202 if( SetTPCdEdxCutElectronLine(value)) {
1203 fCuts[kededxSigmaCut] = value;
1204 UpdateCutString(cutID, value);
1206 } else return kFALSE;
1208 case kpidedxSigmaCut:
1209 if( SetTPCdEdxCutPionLine(value)) {
1210 fCuts[kpidedxSigmaCut] = value;
1211 UpdateCutString(cutID, value);
1213 } else return kFALSE;
1215 case kpiMomdedxSigmaCut:
1216 if( SetMinMomPiondEdxCut(value)) {
1217 fCuts[kpiMomdedxSigmaCut] = value;
1218 UpdateCutString(cutID, value);
1220 } else return kFALSE;
1223 if( SetChi2GammaCut(value)) {
1224 fCuts[kchi2GammaCut] = value;
1225 UpdateCutString(cutID, value);
1227 } else return kFALSE;
1230 if( SetSinglePtCut(value)) {
1231 fCuts[ksinglePtCut] = value;
1232 UpdateCutString(cutID, value);
1234 } else return kFALSE;
1237 if( SetTPCClusterCut(value)) {
1238 fCuts[kclsTPCCut] = value;
1239 UpdateCutString(cutID, value);
1241 } else return kFALSE;
1244 if( SetEtaCut(value)) {
1245 fCuts[ketaCut] = value;
1246 UpdateCutString(cutID, value);
1248 } else return kFALSE;
1251 if( SetChi2MesonCut(value)) {
1252 fCuts[kchi2MesonCut] = value;
1253 UpdateCutString(cutID, value);
1255 } else return kFALSE;
1257 case kLowPRejectionSigmaCut:
1258 if( SetLowPRejectionCuts(value)) {
1259 fCuts[kLowPRejectionSigmaCut] = value;
1260 UpdateCutString(cutID, value);
1262 } else return kFALSE;
1265 if( SetQtMaxCut(value)) {
1266 fCuts[kQtMaxCut] = value;
1267 UpdateCutString(cutID, value);
1269 } else return kFALSE;
1271 case kpiMaxMomdedxSigmaCut:
1272 if( SetMaxMomPiondEdxCut(value)) {
1273 fCuts[kpiMaxMomdedxSigmaCut] = value;
1274 UpdateCutString(cutID, value);
1276 } else return kFALSE;
1278 case kalphaMesonCut:
1279 if( SetAlphaMesonCut(value)) {
1280 fCuts[kalphaMesonCut] = value;
1281 UpdateCutString(cutID, value);
1283 } else return kFALSE;
1286 if( SetRCut(value)) {
1287 fCuts[kminRCut] = value;
1288 UpdateCutString(cutID, value);
1290 } else return kFALSE;
1292 case kRapidityMesonCut:
1293 if( SetRapidityMesonCut(value)) {
1294 fCuts[kRapidityMesonCut] = value;
1295 UpdateCutString(cutID, value);
1297 } else return kFALSE;
1299 case kBackgroundScheme:
1300 if( SetBackgroundScheme(value)) {
1301 fCuts[kBackgroundScheme] = value;
1302 UpdateCutString(cutID, value);
1304 } else return kFALSE;
1306 case kDegreesForRotationMethod:
1307 if( SetNDegreesForRotationMethod(value)) {
1308 fCuts[kDegreesForRotationMethod] = value;
1309 UpdateCutString(cutID, value);
1311 } else return kFALSE;
1313 case kNumberOfRotations:
1314 if( SetNumberOfRotations(value)) {
1315 fCuts[kNumberOfRotations] = value;
1316 UpdateCutString(cutID, value);
1318 } else return kFALSE;
1321 if( SetRemovePileUp(value)) {
1322 fCuts[kremovePileUp] = value;
1323 UpdateCutString(cutID, value);
1325 } else return kFALSE;
1328 if( SetSelectV0AND(value)) {
1329 fCuts[kselectV0AND] = value;
1330 UpdateCutString(cutID, value);
1332 } else return kFALSE;
1334 case kmultiplicityBin:
1335 if( SetMultiplicityBin(value)) {
1336 fCuts[kmultiplicityBin] = value;
1337 UpdateCutString(cutID, value);
1339 } else return kFALSE;
1342 if( SetIsHeavyIon(value)) {
1343 fCuts[kisHeavyIon] = value;
1344 UpdateCutString(cutID, value);
1346 } else return kFALSE;
1348 case kuseCentrality:
1349 if( SetUseCentrality(value)) {
1350 fCuts[kuseCentrality] = value;
1351 UpdateCutString(cutID, value);
1353 } else return kFALSE;
1355 case kcentralityBin:
1356 if( SetCentralityBin(value)) {
1357 fCuts[kcentralityBin] = value;
1358 UpdateCutString(cutID, value);
1360 } else return kFALSE;
1362 case kTOFelectronPID:
1363 if( SetTOFElectronPIDCut(value)) {
1364 fCuts[kTOFelectronPID] = value;
1365 UpdateCutString(cutID, value);
1367 } else return kFALSE;
1369 case kuseMCPSmearing:
1370 if( SetMCPSmearing(value)) {
1371 fCuts[kuseMCPSmearing] = value;
1372 UpdateCutString(cutID, value);
1374 } else return kFALSE;
1376 case kdoPhotonAsymmetryCut:
1377 if( SetPhotonAsymmetryCut(value)) {
1378 fCuts[kdoPhotonAsymmetryCut] = value;
1379 UpdateCutString(cutID, value);
1381 } else return kFALSE;
1384 if( SetPsiPairCut(value)) {
1385 fCuts[kPsiPair] = value;
1386 UpdateCutString(cutID, value);
1388 } else return kFALSE;
1391 if( SetCosPAngleCut(value)) {
1392 fCuts[kCosPAngle] = value;
1393 UpdateCutString(cutID, value);
1395 } else return kFALSE;
1398 cout << "Error:: Cut id out of range"<< endl;
1410 // case kv0FinderType:
1411 // fCuts[kv0FinderType] = value;
1412 // if(!SetV0Finder(fCuts[kv0FinderType]))return kFALSE;
1413 // else return kTRUE;
1415 // fCuts[keProbCut] = value;
1416 // if(!SetElectronProbCut(fCuts[keProbCut]))return kFALSE;
1417 // else return kTRUE;
1418 // case kededxSigmaCut:
1419 // fCuts[kededxSigmaCut] = value;
1420 // if(!SetTPCdEdxCutElectronLine(fCuts[kededxSigmaCut]))return kFALSE;
1421 // else return kTRUE;
1422 // case kpidedxSigmaCut:
1423 // fCuts[kpidedxSigmaCut] = value;
1424 // if(!SetTPCdEdxCutPionLine(fCuts[kpidedxSigmaCut]))return kFALSE;
1425 // else return kTRUE;
1426 // case kpiMomdedxSigmaCut:
1427 // fCuts[kpiMomdedxSigmaCut] = value;
1428 // if(!SetMinMomPiondEdxCut(fCuts[kpiMomdedxSigmaCut]))return kFALSE;
1429 // else return kTRUE;
1430 // case kchi2GammaCut:
1431 // fCuts[kchi2GammaCut] = value;
1432 // if(!SetChi2GammaCut(fCuts[kchi2GammaCut]))return kFALSE;
1433 // else return kTRUE;
1434 // case ksinglePtCut:
1435 // fCuts[ksinglePtCut] = value;
1436 // if(!SetSinglePtCut(fCuts[ksinglePtCut]))return kFALSE;
1437 // else return kTRUE;
1439 // fCuts[kclsTPCCut] = value;
1440 // if(!SetTPCClusterCut(fCuts[kclsTPCCut]))return kFALSE;
1441 // else return kTRUE;
1443 // fCuts[ketaCut] = value;
1444 // if(!SetEtaCut(fCuts[ketaCut]))return kFALSE;
1445 // else return kTRUE;
1446 // case kchi2MesonCut:
1447 // fCuts[kchi2MesonCut] = value;
1448 // if(!SetChi2MesonCut(fCuts[kchi2MesonCut]))return kFALSE;
1449 // else return kTRUE;
1450 // case kLowPRejectionSigmaCut:
1451 // fCuts[kLowPRejectionSigmaCut] = value;
1452 // if(!SetLowPRejectionCuts(fCuts[kLowPRejectionSigmaCut]))return kFALSE;
1453 // else return kTRUE;
1455 // fCuts[kQtMaxCut] = value;
1456 // if(!SetQtMaxCut(fCuts[kQtMaxCut]))return kFALSE;
1457 // else return kTRUE;
1458 // case kpiMaxMomdedxSigmaCut:
1459 // fCuts[kpiMaxMomdedxSigmaCut] = value;
1460 // if(!SetMaxMomPiondEdxCut(fCuts[kpiMaxMomdedxSigmaCut]))return kFALSE;
1461 // else return kTRUE;
1462 // case kalphaMesonCut:
1463 // fCuts[kalphaMesonCut] = value;
1464 // if(!SetAlphaMesonCut(fCuts[kalphaMesonCut]))return kFALSE;
1465 // else return kTRUE;
1467 // fCuts[kminRCut] = value;
1468 // if(!SetRCut(fCuts[kminRCut]))return kFALSE;
1469 // else return kTRUE;
1470 // case kRapidityMesonCut:
1471 // fCuts[kRapidityMesonCut] = value;
1472 // if(!SetRapidityMesonCut(fCuts[kRapidityMesonCut]))return kFALSE;
1473 // else return kTRUE;
1474 // case kBackgroundScheme:
1475 // fCuts[kBackgroundScheme] = value;
1476 // if(!SetBackgroundScheme(fCuts[kBackgroundScheme]))return kFALSE;
1477 // else return kTRUE;
1478 // case kDegreesForRotationMethod:
1479 // fCuts[kDegreesForRotationMethod] = value;
1480 // if(!SetNDegreesForRotationMethod(fCuts[kDegreesForRotationMethod]))return kFALSE;
1481 // else return kTRUE;
1482 // case kNumberOfRotations:
1483 // fCuts[kNumberOfRotations] = value;
1484 // if(!SetNumberOfRotations(fCuts[kNumberOfRotations]))return kFALSE;
1485 // else return kTRUE;
1486 // case kremovePileUp:
1487 // fCuts[kremovePileUp] = value;
1488 // if(!SetRemovePileUp(fCuts[kremovePileUp]))return kFALSE;
1489 // else return kTRUE;
1490 // case kselectV0AND:
1491 // fCuts[kselectV0AND] = value;
1492 // if(!SetSelectV0AND(fCuts[kselectV0AND]))return kFALSE;
1493 // else return kTRUE;
1494 // case kmultiplicityBin:
1495 // fCuts[kmultiplicityBin] = value;
1496 // if(!SetMultiplicityBin(fCuts[kmultiplicityBin]))return kFALSE;
1497 // else return kTRUE;
1498 // case kisHeavyIon:
1499 // fCuts[kisHeavyIon] = value;
1500 // if(!SetIsHeavyIon(fCuts[kisHeavyIon]))return kFALSE;
1501 // else return kTRUE;
1502 // case kuseCentrality:
1503 // fCuts[kuseCentrality] = value;
1504 // if(!SetUseCentrality(fCuts[kuseCentrality]))return kFALSE;
1505 // else return kTRUE;
1506 // case kcentralityBin:
1507 // fCuts[kcentralityBin] = value;
1508 // if(!SetCentralityBin(fCuts[kcentralityBin]))return kFALSE;
1509 // else return kTRUE;
1510 // case kTOFelectronPID:
1511 // fCuts[kTOFelectronPID] = value;
1512 // if(!SetTOFElectronPIDCut(fCuts[kTOFelectronPID]))return kFALSE;
1513 // else return kTRUE;
1514 // case kuseMCPSmearing:
1515 // fCuts[kuseMCPSmearing] = value;
1516 // if(!SetMCPSmearing(fCuts[kuseMCPSmearing]))return kFALSE;
1517 // else return kTRUE;
1518 // case kdoPhotonAsymmetryCut:
1519 // fCuts[kdoPhotonAsymmetryCut] = value;
1520 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1521 // else return kTRUE;
1523 // fCuts[kPsiPair] = value;
1524 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1525 // else return kTRUE;
1527 // fCuts[kCosPAngle] = value;
1528 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1529 // else return kTRUE;
1531 // cout << "Error:: Cut id out of range"<< endl;
1538 ///________________________________________________________________________
1539 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
1541 switch(removePileUp){
1543 fRemovePileUp=kFALSE;
1546 fRemovePileUp=kTRUE;
1549 cout<<"Warning: RemovePileUpCut not defined"<<removePileUp<<endl;
1555 ///________________________________________________________________________
1556 Bool_t AliConversionCuts::SetSelectV0AND(Int_t selectV0AND)
1558 switch(selectV0AND){
1560 fSelectV0AND=kFALSE;
1566 cout<<"Warning: V0ANDCut not defined"<<selectV0AND<<endl;
1572 ///________________________________________________________________________
1573 Bool_t AliConversionCuts::SetMultiplicityBin(Int_t multiplicityBin)
1575 switch(multiplicityBin){
1577 fUseMultiplicity=kFALSE;
1578 fUseMultiplicityBin=0;
1581 fUseMultiplicity=kTRUE;
1582 fUseMultiplicityBin=1;
1585 fUseMultiplicity=kTRUE;
1586 fUseMultiplicityBin=2;
1589 fUseMultiplicity=kTRUE;
1590 fUseMultiplicityBin=3;
1593 fUseMultiplicity=kTRUE;
1594 fUseMultiplicityBin=4;
1597 fUseMultiplicity=kTRUE;
1598 fUseMultiplicityBin=5;
1601 cout<<"Warning: MultiplicityBinCut not defined"<<multiplicityBin<<endl;
1608 ///________________________________________________________________________
1609 Bool_t AliConversionCuts::SetMCPSmearing(Int_t useMCPSmearing)
1611 switch(useMCPSmearing){
1616 fPSigSmearingCte=0.;
1620 fPBremSmearing=1.0e-14;
1622 fPSigSmearingCte=0.;
1626 fPBremSmearing=1.0e-15;
1628 fPSigSmearingCte=0.;
1633 fPSigSmearing=0.003;
1634 fPSigSmearingCte=0.002;
1639 fPSigSmearing=0.003;
1640 fPSigSmearingCte=0.007;
1645 fPSigSmearing=0.003;
1646 fPSigSmearingCte=0.016;
1651 fPSigSmearing=0.007;
1652 fPSigSmearingCte=0.016;
1656 fPBremSmearing=1.0e-16;
1658 fPSigSmearingCte=0.;
1663 fPSigSmearing=0.007;
1664 fPSigSmearingCte=0.014;
1669 fPSigSmearing=0.007;
1670 fPSigSmearingCte=0.011;
1674 cout<<"Warning: UseMCPSmearing not defined"<<useMCPSmearing<<endl;
1680 ///________________________________________________________________________
1681 void AliConversionCuts::PrintCuts() {
1682 // Print out current Cut Selection
1683 for(Int_t ic = 0; ic < kNCuts; ic++) {
1684 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
1689 ///________________________________________________________________________
1690 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
1717 // High purity cuts for PbPb
1724 cout<<"Warning: RCut not defined"<<RCut<<endl;
1730 ///________________________________________________________________________
1731 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
1733 switch(ededxSigmaCut){
1735 fPIDnSigmaBelowElectronLine=-10;
1736 fPIDnSigmaAboveElectronLine=10;
1739 fPIDnSigmaBelowElectronLine=-5;
1740 fPIDnSigmaAboveElectronLine=5;
1743 fPIDnSigmaBelowElectronLine=-3;
1744 fPIDnSigmaAboveElectronLine=5;
1747 fPIDnSigmaBelowElectronLine=-4;
1748 fPIDnSigmaAboveElectronLine=5;
1751 cout<<"Warning: TPCdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
1758 ///________________________________________________________________________
1759 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
1762 switch(pidedxSigmaCut){
1764 fPIDnSigmaAbovePionLine=-10;
1765 fPIDnSigmaAbovePionLineHighPt=-10;
1768 fPIDnSigmaAbovePionLine=0;
1769 fPIDnSigmaAbovePionLineHighPt=-10;
1772 fPIDnSigmaAbovePionLine=1;
1773 fPIDnSigmaAbovePionLineHighPt=-10;
1776 fPIDnSigmaAbovePionLine=-1;
1777 fPIDnSigmaAbovePionLineHighPt=-10;
1780 fPIDnSigmaAbovePionLine=-1.5;
1781 fPIDnSigmaAbovePionLineHighPt=-10;
1784 fPIDnSigmaAbovePionLine=2.;
1785 fPIDnSigmaAbovePionLineHighPt=-10;
1788 fPIDnSigmaAbovePionLine=2.;
1789 fPIDnSigmaAbovePionLineHighPt=0.5;
1792 fPIDnSigmaAbovePionLine=3.5;
1793 fPIDnSigmaAbovePionLineHighPt=-10;
1796 fPIDnSigmaAbovePionLine=2.;
1797 fPIDnSigmaAbovePionLineHighPt=1.;
1800 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
1801 fPIDnSigmaAbovePionLineHighPt=-10;
1804 cout<<"Warning: pidedxSigmaCut not defined "<<pidedxSigmaCut<<endl;
1810 ///________________________________________________________________________
1811 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
1814 switch(chi2GammaCut){
1816 fChi2CutConversion = 100.;
1819 fChi2CutConversion = 50.;
1822 fChi2CutConversion = 30.;
1825 fChi2CutConversion = 200.;
1828 fChi2CutConversion = 500.;
1831 fChi2CutConversion = 1000.;
1834 fChi2CutConversion = 5.;
1837 fChi2CutConversion = 10.;
1840 fChi2CutConversion = 20.;
1843 fChi2CutConversion = 15.;
1846 cout<<"Warning: Chi2GammaCut not defined "<<chi2GammaCut<<endl;
1852 ///________________________________________________________________________
1853 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
1855 switch (v0FinderType){
1856 case 0: // on fly V0 finder
1857 fUseOnFlyV0Finder=kTRUE;
1859 case 1: // offline V0 finder
1860 fUseOnFlyV0Finder=kFALSE;
1863 cout<<"Warning: v0FinderType not defined "<<v0FinderType<<endl;
1869 ///________________________________________________________________________
1870 Bool_t AliConversionCuts::SetElectronProbCut(Int_t eProbCut)
1875 fPIDProbabilityCutNegativeParticle=0;
1876 fPIDProbabilityCutPositiveParticle=0;
1879 fPIDProbabilityCutNegativeParticle=0.1;
1880 fPIDProbabilityCutPositiveParticle=0.1;
1883 fPIDProbabilityCutNegativeParticle=0.5;
1884 fPIDProbabilityCutPositiveParticle=0.5;
1887 fPIDProbabilityCutNegativeParticle=0.7;
1888 fPIDProbabilityCutPositiveParticle=0.7;
1891 cout<<"Warning: eProbCut not defined "<<eProbCut<<endl;
1897 ///________________________________________________________________________
1898 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
1900 switch(singlePtCut){
1901 case 0: // 0.050 GeV
1902 fSinglePtCut = 0.050;
1904 case 1: // 0.100 GeV
1905 fSinglePtCut = 0.100;
1907 case 2: // 0.150 GeV
1908 fSinglePtCut = 0.150;
1910 case 3: // 0.200 GeV
1911 fSinglePtCut = 0.200;
1913 case 4: // 0.075 GeV
1914 fSinglePtCut = 0.075;
1916 case 5: // 0.125 GeV
1917 fSinglePtCut = 0.125;
1920 cout<<"Warning: singlePtCut not defined "<<singlePtCut<<endl;
1925 ///________________________________________________________________________
1926 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
1941 case 4: // 60% of findable clusters
1943 fUseCorrectedTPCClsInfo=0;
1945 case 5: // 0% of findable clusters
1947 fUseCorrectedTPCClsInfo=1;
1949 case 6: // 0% of findable clusters
1951 fUseCorrectedTPCClsInfo=0;
1953 case 7: // 0% of findable clusters
1954 fMinClsTPCToF= 0.35;
1955 fUseCorrectedTPCClsInfo=0;
1958 fMinClsTPCToF= 0.35;
1959 fUseCorrectedTPCClsInfo=1;
1963 fUseCorrectedTPCClsInfo=1;
1966 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
1972 ///________________________________________________________________________
1973 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
1978 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1980 fLineCutZRSlopeMin = 0.;
1984 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1986 fLineCutZRSlopeMin = 0.;
1990 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1992 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCut)));
1996 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1998 fLineCutZRSlopeMin = 0.;
2002 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2004 fLineCutZRSlopeMin = 0.;
2006 case 5: // 0.9 - 1.4
2008 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2010 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2012 case 6: // 0.9 - 1.2
2014 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2016 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2018 case 7: // 0.1 - 0.8
2020 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2022 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2024 case 8: // 0.1 - 0.8
2026 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2028 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2031 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
2037 ///________________________________________________________________________
2038 Bool_t AliConversionCuts::SetChi2MesonCut(Int_t chi2MesonCut)
2040 switch(chi2MesonCut){
2042 fChi2CutMeson = 100.;
2045 fChi2CutMeson = 50.;
2048 fChi2CutMeson = 30.;
2051 fChi2CutMeson = 200.;
2054 fChi2CutMeson = 500.;
2057 fChi2CutMeson = 1000.;
2060 cout<<"Warning: Chi2MesonCut not defined "<<chi2MesonCut<<endl;
2066 ///________________________________________________________________________
2067 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2069 switch(piMomdedxSigmaCut){
2071 fPIDMinPnSigmaAbovePionLine=0.5;
2074 fPIDMinPnSigmaAbovePionLine=1.;
2077 fPIDMinPnSigmaAbovePionLine=1.5;
2080 fPIDMinPnSigmaAbovePionLine=20.;
2083 fPIDMinPnSigmaAbovePionLine=50.;
2086 fPIDMinPnSigmaAbovePionLine=0.3;
2088 case 6: // 0.25 GeV // RRnew label was wrong in comment
2089 fPIDMinPnSigmaAbovePionLine=0.25;
2092 fPIDMinPnSigmaAbovePionLine=0.4;
2095 cout<<"Warning: piMomdedxSigmaCut not defined "<<piMomdedxSigmaCut<<endl;
2101 ///________________________________________________________________________
2102 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2104 switch(piMaxMomdedxSigmaCut){
2106 fPIDMaxPnSigmaAbovePionLine=100.;
2109 fPIDMaxPnSigmaAbovePionLine=5.;
2112 fPIDMaxPnSigmaAbovePionLine=4.;
2115 fPIDMaxPnSigmaAbovePionLine=3.5;
2118 fPIDMaxPnSigmaAbovePionLine=3.;
2121 cout<<"Warning: piMaxMomdedxSigmaCut not defined "<<piMaxMomdedxSigmaCut<<endl;
2127 ///________________________________________________________________________
2128 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2138 cout<<"Warning: SetHeavyIon not defined "<<isHeavyIon<<endl;
2144 ///________________________________________________________________________
2145 Bool_t AliConversionCuts::SetAlphaMesonCut(Int_t alphaMesonCut)
2147 switch(alphaMesonCut){
2149 fAlphaMinCutMeson = 0.0;
2150 fAlphaCutMeson = 0.7;
2153 fAlphaMinCutMeson = 0.0;
2154 fAlphaCutMeson = 0.5;
2157 fAlphaMinCutMeson = 0.5;
2158 fAlphaCutMeson = 1.;
2161 fAlphaMinCutMeson = 0.0;
2162 fAlphaCutMeson = 1.;
2165 fAlphaMinCutMeson = 0.0;
2166 fAlphaCutMeson = 0.65;
2169 fAlphaMinCutMeson = 0.0;
2170 fAlphaCutMeson = 0.75;
2173 fAlphaMinCutMeson = 0.0;
2174 fAlphaCutMeson = 0.8;
2177 fAlphaMinCutMeson = 0.0;
2178 fAlphaCutMeson = 0.85;
2181 fAlphaMinCutMeson = 0.0;
2182 fAlphaCutMeson = 0.6;
2185 cout<<"Warning: AlphaMesonCut not defined "<<alphaMesonCut<<endl;
2191 ///________________________________________________________________________
2192 Bool_t AliConversionCuts::SetRapidityMesonCut(Int_t RapidityMesonCut)
2194 switch(RapidityMesonCut){
2196 fRapidityCutMeson = 0.9;
2199 fRapidityCutMeson = 0.8;
2202 fRapidityCutMeson = 0.7;
2206 cout<<"Warning: RapidityMesonCut not defined "<<RapidityMesonCut<<endl;
2212 ///________________________________________________________________________
2213 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2215 switch(LowPRejectionSigmaCut){
2217 fPIDnSigmaAtLowPAroundKaonLine=0;
2218 fPIDnSigmaAtLowPAroundProtonLine=0;
2219 fPIDnSigmaAtLowPAroundPionLine=0;
2222 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2223 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2224 fPIDnSigmaAtLowPAroundPionLine=0.5;
2227 fPIDnSigmaAtLowPAroundKaonLine=1;
2228 fPIDnSigmaAtLowPAroundProtonLine=1;
2229 fPIDnSigmaAtLowPAroundPionLine=1;
2232 fPIDnSigmaAtLowPAroundKaonLine=2.;
2233 fPIDnSigmaAtLowPAroundProtonLine=2.;
2234 fPIDnSigmaAtLowPAroundPionLine=2.;
2237 fPIDnSigmaAtLowPAroundKaonLine=0.;
2238 fPIDnSigmaAtLowPAroundProtonLine=0.;
2239 fPIDnSigmaAtLowPAroundPionLine=1;
2242 fPIDnSigmaAtLowPAroundKaonLine=0.;
2243 fPIDnSigmaAtLowPAroundProtonLine=0.;
2244 fPIDnSigmaAtLowPAroundPionLine=1.5;
2247 fPIDnSigmaAtLowPAroundKaonLine=0.;
2248 fPIDnSigmaAtLowPAroundProtonLine=0.;
2249 fPIDnSigmaAtLowPAroundPionLine=2.;
2252 cout<<"Warning: LowPRejectionSigmaCut not defined "<<LowPRejectionSigmaCut<<endl;
2258 ///________________________________________________________________________
2259 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2261 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
2263 fUseTOFpid = kFALSE;
2264 fTofPIDnSigmaBelowElectronLine=-100;
2265 fTofPIDnSigmaAboveElectronLine=100;
2269 fTofPIDnSigmaBelowElectronLine=-7;
2270 fTofPIDnSigmaAboveElectronLine=7;
2274 fTofPIDnSigmaBelowElectronLine=-5;
2275 fTofPIDnSigmaAboveElectronLine=5;
2279 fTofPIDnSigmaBelowElectronLine=-3;
2280 fTofPIDnSigmaAboveElectronLine=5;
2284 fTofPIDnSigmaBelowElectronLine=-2;
2285 fTofPIDnSigmaAboveElectronLine=3;
2288 cout<<"Warning: TOFElectronCut not defined "<<TOFelectronPID<<endl;
2290 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
2294 ///________________________________________________________________________
2295 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
2297 switch(TRDElectronCut){
2302 fPIDTRDEfficiency=0.1;
2305 fPIDTRDEfficiency=0.8;
2308 fPIDTRDEfficiency=0.9;
2310 cout<<"Warning: TRDElectronCut not defined "<<TRDElectronCut<<endl;
2315 ///________________________________________________________________________
2316 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2321 fDoQtGammaSelection=kFALSE; //No Qt selection (true by default)
2322 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2323 fHighPtQtMax=100.; // RRnew
2324 fPtBorderForQt=100.; // RRnew
2328 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2329 fHighPtQtMax=100.; // RRnew
2330 fPtBorderForQt=100.; // RRnew
2334 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2335 fHighPtQtMax=100.; // RRnew
2336 fPtBorderForQt=100.; // RRnew
2340 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2341 fHighPtQtMax=100.; // RRnew
2342 fPtBorderForQt=100.; // RRnew
2346 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2347 fHighPtQtMax=100.; // RRnew
2348 fPtBorderForQt=100.; // RRnew
2350 case 5: // RR try to improve (get rid of) low InvMass peak in PbPb
2352 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2353 fHighPtQtMax=100.; // RRnew
2354 fPtBorderForQt=100.; // RRnew
2355 break; // end RR ///////////////////////////////////////////////
2356 case 6: // RRnew start: pT dependent qT cut
2358 fDoHighPtQtGammaSelection=kTRUE;
2361 break; // RRnew end ////////////////////////////////////////////
2364 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2365 fHighPtQtMax=100.; // RRnew
2366 fPtBorderForQt=100.; // RRnew
2369 cout<<"Warning: QtMaxCut not defined "<<QtMaxCut<<endl;
2375 //-------------------------------------------------------------
2376 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
2377 { // Get Event Centrality
2378 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
2380 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
2382 if(fUseCentrality==0){
2383 return fESDCentrality->GetCentralityPercentile("V0M"); // default
2386 if(fUseCentrality==1||fUseCentrality==3){
2387 return fESDCentrality->GetCentralityPercentile("V0M");
2390 if(fUseCentrality==2||fUseCentrality==4){
2391 return fESDCentrality->GetCentralityPercentile("CL1");
2394 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
2396 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
2401 //-------------------------------------------------------------
2402 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event)
2403 { // Centrality Selection
2404 if(!fIsHeavyIon)return kTRUE;
2406 Double_t centrality=GetCentrality(event);
2408 if(centrality<0)return kFALSE;
2410 Int_t centralityC=Int_t(centrality/10);
2412 // No CentralitySelection
2413 if(fUseCentrality==0)return kTRUE;
2415 // Use Percentiles10
2416 if(fUseCentrality==1||fUseCentrality==2){
2417 if(fUseCentralityBin==centralityC)return kTRUE;
2420 // Use User Defined Centrality Selection
2421 if(fUseCentrality==3||fUseCentrality==4){
2424 if( (fUseCentralityBin == 0) && (centralityC!=0) ){
2428 if( (fUseCentralityBin == 1) && (centralityC!=1) ){
2432 if( (fUseCentralityBin == 2) && (centralityC!=2) && (centralityC!=3) ){
2436 if( (fUseCentralityBin == 3) && (centralityC!=0) && (centralityC!=1) ){
2440 if( (fUseCentralityBin == 4) && (centralityC!=4) && (centralityC!=5) ){
2444 if( (fUseCentralityBin == 6) && (centralityC!=6) && (centralityC!=7) && (centralityC!=8) ){
2448 if( (fUseCentralityBin == 7) && (centralityC!=6) && (centralityC!=7) ){
2452 if( (fUseCentralityBin == 8) && (centralityC>=8) ){
2456 if( (fUseCentralityBin == 9) && (centralityC>=9) ){
2463 //-------------------------------------------------------------
2464 Bool_t AliConversionCuts::SetUseCentrality(Int_t useCentrality)
2467 switch(useCentrality){
2469 fUseCentrality=0; // No Centrality Selection
2472 fUseCentrality=1;// GetCentralityClass10("V0M")
2475 fUseCentrality=2; // GetCentralityClass10("CL1")
2477 case 3://////////////// RRnew start //////////////////////////////////////////////////////////////////////////////////////////////////////
2478 fUseCentrality=3;// GetCentralityClass10("V0M") but with merged bins
2481 fUseCentrality=4;// GetCentralityClass10("CL1") but with merged bins
2482 break;/////////////// RRnew end ////////////////////////////////////////////////////////////////////////////////////////////////////////
2484 cout<<"Warning: UseCentrality not defined "<<useCentrality<<endl;
2490 //-------------------------------------------------------------
2491 Bool_t AliConversionCuts::SetCentralityBin(Int_t centralityBin)
2494 if(centralityBin<0||centralityBin>9){
2495 cout<<"Warning: CentralityBin not defined "<<centralityBin<<endl;
2499 fUseCentralityBin=centralityBin;
2503 ///________________________________________________________________________
2504 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2506 switch(doPhotonAsymmetryCut){
2508 fDoPhotonAsymmetryCut=0;
2509 fMinPPhotonAsymmetryCut=100.;
2510 fMinPhotonAsymmetry=0.;
2513 fDoPhotonAsymmetryCut=1;
2514 fMinPPhotonAsymmetryCut=3.5;
2515 fMinPhotonAsymmetry=0.04;
2518 fDoPhotonAsymmetryCut=1;
2519 fMinPPhotonAsymmetryCut=3.5;
2520 fMinPhotonAsymmetry=0.06;
2523 cout<<"Warning: PhotonAsymmetryCut not defined "<<doPhotonAsymmetryCut<<endl;
2526 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2530 ///________________________________________________________________________
2531 Bool_t AliConversionCuts::SetBackgroundScheme(Int_t BackgroundScheme){
2533 switch(BackgroundScheme){
2535 fUseRotationMethodInBG=kTRUE;
2536 fdoBGProbability=kFALSE;
2538 case 1: // mixed event with track multiplicity
2539 fUseRotationMethodInBG=kFALSE;
2540 fUseTrackMultiplicityForBG=kFALSE;
2541 fdoBGProbability=kFALSE;
2543 case 2: // mixed event with V0 multiplicity
2544 fUseRotationMethodInBG=kFALSE;
2545 fUseTrackMultiplicityForBG=kTRUE;
2546 fdoBGProbability=kFALSE;
2549 fUseRotationMethodInBG=kTRUE;
2550 fdoBGProbability=kTRUE;
2553 cout<<"Warning: BackgroundScheme not defined "<<BackgroundScheme<<endl;
2559 ///________________________________________________________________________
2560 Bool_t AliConversionCuts::SetNDegreesForRotationMethod(Int_t DegreesForRotationMethod){
2562 switch(DegreesForRotationMethod){
2564 fnDegreeRotationPMForBG = 5;
2567 fnDegreeRotationPMForBG = 10;
2570 fnDegreeRotationPMForBG = 15;
2573 fnDegreeRotationPMForBG = 20;
2576 cout<<"Warning: DegreesForRotationMethod not defined "<<DegreesForRotationMethod<<endl;
2579 fCuts[kDegreesForRotationMethod]=DegreesForRotationMethod;
2583 ///________________________________________________________________________
2584 Bool_t AliConversionCuts::SetNumberOfRotations(Int_t NumberOfRotations)
2586 switch(NumberOfRotations){
2588 fnumberOfRotationEventsForBG = 5;
2591 fnumberOfRotationEventsForBG = 10;
2594 fnumberOfRotationEventsForBG = 15;
2597 fnumberOfRotationEventsForBG = 20;
2600 fnumberOfRotationEventsForBG = 2;
2603 fnumberOfRotationEventsForBG = 50;
2606 fnumberOfRotationEventsForBG = 80;
2609 fnumberOfRotationEventsForBG = 100;
2612 cout<<"Warning: NumberOfRotations not defined "<<NumberOfRotations<<endl;
2618 ///________________________________________________________________________
2619 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2624 fPsiPairCut = 10000; //
2627 fPsiPairCut = 0.1; //
2630 fPsiPairCut = 0.05; // Standard
2633 fPsiPairCut = 0.035; //
2636 fPsiPairCut = 0.15; //
2639 fPsiPairCut = 0.2; //
2642 fPsiPairCut = 0.03; //
2645 fPsiPairCut = 0.025; //
2648 fPsiPairCut = 0.01; //
2651 cout<<"Warning: PsiPairCut not defined "<<fPsiPairCut<<endl;
2658 ///________________________________________________________________________
2659 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2663 fCosPAngleCut = 10000; //
2666 fCosPAngleCut = 0.1; //
2669 fCosPAngleCut = 0.05; //
2672 fCosPAngleCut = 0.025; // Standard
2675 fCosPAngleCut = 0.01; //
2678 cout<<"Warning: Cosine Pointing Angle cut not defined "<<fCosPAngleCut<<endl;
2687 ///________________________________________________________________________
2688 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
2689 // Cut on z position of primary vertex
2690 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
2692 if(TMath::Abs(fVertexZ)>fMaxVertexZ)return kFALSE;
2699 ///________________________________________________________________________
2701 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
2702 // returns number of contributors to the vertex
2704 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2706 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
2707 return fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
2710 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
2712 //-AM test pi0s without SPD only vertex
2713 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2714 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
2717 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2723 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2725 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
2726 return fAODEvent->GetPrimaryVertex()->GetNContributors();
2728 if(fAODEvent->GetPrimaryVertex()->GetNContributors()<1) {
2729 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2730 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
2732 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2733 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
2743 /*Bool_t IsTriggerSelected()
2746 AliVEvent::IsTriggerClassFired ???
2748 if(fTriggerAnalysis== NULL){
2749 fTriggerAnalysis = new AliTriggerAnalysis;
2752 //Take Only events with proper trigger
2754 // if(fTriggerCINT1B){
2755 // if(!fV0Reader->GetESDEvent()->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) return;
2758 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(fV0Reader->GetESDEvent(), AliTriggerAnalysis::kV0A);
2759 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(fV0Reader->GetESDEvent(), AliTriggerAnalysis::kV0C);
2760 Bool_t v0AND = v0A && v0C;
2762 if(fSelectV0AND && !v0AND){
2769 ///________________________________________________________________________
2770 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
2771 // Get first TPC row
2772 Int_t firstTPCRow=0;
2773 Double_t radiusI = 84.8;
2774 Double_t radiusO = 134.6;
2775 Double_t radiusOB = 198.;
2776 Double_t rSizeI = 0.75;
2777 Double_t rSizeO = 1.;
2778 Double_t rSizeOB = 1.5;
2782 if(radius <= radiusI){
2785 if(radius>radiusI && radius<=radiusO){
2786 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
2788 if(radius>radiusO && radius<=radiusOB){
2789 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
2792 if(radius>radiusOB){
2793 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
2799 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, const AliVEvent * event) const {
2800 ///Check if passes cosine of pointing angle cut
2801 //cout << "cpa " << GetCosineOfPointingAngle(photon, event) << " " << 1 - fCosPAngleCut << endl;
2802 if(GetCosineOfPointingAngle(photon, event) < ( 1- fCosPAngleCut)) return kFALSE;
2808 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, const AliVEvent * event) const{
2809 // calculates the pointing angle of the recalculated V0
2811 Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
2812 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
2813 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
2814 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
2816 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
2817 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
2819 Double_t cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
2821 return cosinePointingAngle;
2825 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon, const AliVEvent * event) const {
2826 ///Cehck if passes psi pair cut, works for ESDs only
2827 const AliESDEvent * esdEvent = dynamic_cast<const AliESDEvent*>(event);
2828 if(!esdEvent) return kTRUE;
2829 AliESDv0 * v0 = esdEvent->GetV0(photon->GetV0Index());
2830 AliESDtrack * negTrack = esdEvent->GetTrack(photon->GetTrackLabel(0));
2831 AliESDtrack * posTrack = esdEvent->GetTrack(photon->GetTrackLabel(0));
2833 if(v0 && negTrack && posTrack) {
2834 if( GetPsiPair(v0, esdEvent) > fPsiPairCut)
2844 Double_t AliConversionCuts::GetPsiPair(const AliESDv0* v0, const AliESDEvent * event) const {
2846 // Angle between daughter momentum plane and plane
2849 Float_t magField = event->GetMagneticField();
2851 Double_t xyz[3] = {0.,0.,0.};
2852 v0->GetXYZ(xyz[0],xyz[1],xyz[2]);
2854 Double_t mn[3] = {0,0,0};
2855 Double_t mp[3] = {0,0,0};
2857 v0->GetNPxPyPz(mn[0],mn[1],mn[2]);//reconstructed cartesian momentum components of negative daughter;
2858 v0->GetPPxPyPz(mp[0],mp[1],mp[2]);//reconstructed cartesian momentum components of positive daughter;
2860 Double_t deltat = 1.;
2861 deltat = TMath::ATan(mp[2]/(TMath::Sqrt(mp[0]*mp[0] + mp[1]*mp[1])+1.e-13)) - TMath::ATan(mn[2]/(TMath::Sqrt(mn[0]*mn[0] + mn[1]*mn[1])+1.e-13));//difference of angles of the two daughter tracks with z-axis
2862 Double_t radiussum = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]) + 50;//radius to which tracks shall be propagated
2864 Double_t momPosProp[3] = {0,0,0};
2865 Double_t momNegProp[3] = {0,0,0};
2867 AliExternalTrackParam nt = *(v0->GetParamN());
2868 AliExternalTrackParam pt = *(v0->GetParamP());
2870 Double_t psiPair = 4.;
2871 if(nt.PropagateTo(radiussum,magField) == 0) return psiPair; //propagate tracks to the outside -> Better Purity and Efficiency
2873 if(pt.PropagateTo(radiussum,magField) == 0) return psiPair; //propagate tracks to the outside -> Better Purity and Efficiency
2875 pt.GetPxPyPz(momPosProp);//Get momentum vectors of tracks after propagation
2876 nt.GetPxPyPz(momNegProp);
2879 TMath::Sqrt(momNegProp[0]*momNegProp[0]+momNegProp[1]*momNegProp[1]+momNegProp[2]*momNegProp[2]);//absolute momentum value of negative daughter
2882 TMath::Sqrt(momPosProp[0]*momPosProp[0]+momPosProp[1]*momPosProp[1]+momPosProp[2]*momPosProp[2]);//absolute momentum value of positive daughter
2884 Double_t scalarproduct =
2885 momPosProp[0]*momNegProp[0]+momPosProp[1]*momNegProp[1]+momPosProp[2]*momNegProp[2];//scalar product of propagated positive and negative daughters' momenta
2887 Double_t chipair = TMath::ACos(scalarproduct/(pEle*pPos));//Angle between propagated daughter tracks
2889 psiPair = TMath::Abs(TMath::ASin(deltat/chipair));
2894 ///________________________________________________________________________
2895 TString AliConversionCuts::GetCutNumber(){
2896 // returns TString with current cut number
2898 for(Int_t ii=0;ii<kNCuts;ii++){
2899 a.Append(Form("%d",fCuts[ii]));
2906 ///________________________________________________________________________
2907 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
2908 //Create and return standard 2010 PbPb cuts
2909 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
2910 if(!cuts->InitializeCutsFromCutString("9003972054506132212400010020000")){
2911 cout<<"Warning: Initialization of Standardcuts2010PbPB failed"<<endl;}