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.),
142 fUseCentralityBin(0),
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(kPhotonIn+1,"in");
213 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
214 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
215 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
216 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
217 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
218 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
219 fHistograms->Add(hCutIndex);
222 hTrackCuts=new TH1F("TrackCuts","TrackCuts",10,-0.5,9.5);
223 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
224 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
225 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
226 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
227 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
228 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
229 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
230 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
231 fHistograms->Add(hTrackCuts);
235 hPhotonCuts=new TH1F("PhotonCuts","PhotonCuts",12,-0.5,11.5);
236 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
237 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
238 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
239 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
240 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
241 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
242 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
243 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
244 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
245 hPhotonCuts->GetXaxis()->SetBinLabel(10,"out");
246 fHistograms->Add(hPhotonCuts);
248 hInvMassbefore=new TH1F("InvMass_before","InvMass_before",100,0,0.3);
249 fHistograms->Add(hInvMassbefore);
250 hArmenterosbefore=new TH2F("Armenteros_before","Armenteros_before",200,-1,1,250,0,0.25);
251 fHistograms->Add(hArmenterosbefore);
252 hInvMassafter=new TH1F("InvMass_after","InvMass_after",100,0,0.3);
253 fHistograms->Add(hInvMassafter);
254 hArmenterosafter=new TH2F("Armenteros_after","Armenteros_after",200,-1,1,250,0,0.25);
255 fHistograms->Add(hArmenterosafter);
257 hAcceptanceCuts=new TH1F("PhotonAcceptanceCuts","PhotonAcceptanceCuts",10,-0.5,9.5);
258 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
259 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
260 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
261 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
262 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
263 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
264 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
265 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
266 fHistograms->Add(hAcceptanceCuts);
270 hdEdxCuts=new TH1F("dEdxCuts","dEdxCuts",10,-0.5,9.5);
271 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
272 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
273 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
274 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
275 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
276 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
277 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
278 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
279 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
280 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
282 fHistograms->Add(hdEdxCuts);
284 hTPCdEdxbefore=new TH2F("Gamma_dEdx_before","dEdx Gamma before" ,100,0,25,400, 0,200);
285 fHistograms->Add(hTPCdEdxbefore);
286 hTPCdEdxafter=new TH2F("Gamma_dEdx_after","dEdx Gamma after" ,100,0,25,400, 0,200);
287 fHistograms->Add(hTPCdEdxafter);
289 // Event Cuts and Info
291 hV0EventCuts=new TH1F("ESD_EventCuts","Event Cuts",10,-0.5,9.5);
292 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
293 hV0EventCuts->GetXaxis()->SetBinLabel(2,"VertexZ");
294 hV0EventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
295 hV0EventCuts->GetXaxis()->SetBinLabel(4,"centrsel");
296 hV0EventCuts->GetXaxis()->SetBinLabel(5,"out");
297 fHistograms->Add(hV0EventCuts);
299 hCentrality=new TH1F("Centrality","Centrality",100,0,100);
300 fHistograms->Add(hCentrality);
301 hVertexZ=new TH1F("VertexZ","VertexZ",1000,-50,50);
302 fHistograms->Add(hVertexZ);
306 hMesonCuts=new TH1F("MesonCuts","MesonCuts",10,-0.5,9.5);
307 hMesonCuts->GetXaxis()->SetBinLabel(1,"in");
308 hMesonCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
309 hMesonCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
310 hMesonCuts->GetXaxis()->SetBinLabel(4,"opening angle");
311 hMesonCuts->GetXaxis()->SetBinLabel(5,"alpha max");
312 hMesonCuts->GetXaxis()->SetBinLabel(6,"alpha min");
313 hMesonCuts->GetXaxis()->SetBinLabel(7,"out");
314 fHistograms->Add(hMesonCuts);
316 hMesonBGCuts=new TH1F("MesonBGCuts","MesonBGCuts",10,-0.5,9.5);
317 hMesonBGCuts->GetXaxis()->SetBinLabel(1,"in");
318 hMesonBGCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
319 hMesonBGCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
320 hMesonBGCuts->GetXaxis()->SetBinLabel(4,"opening angle");
321 hMesonBGCuts->GetXaxis()->SetBinLabel(5,"alpha max");
322 hMesonBGCuts->GetXaxis()->SetBinLabel(6,"alpha min");
323 hMesonBGCuts->GetXaxis()->SetBinLabel(7,"out");
324 fHistograms->Add(hMesonBGCuts);
327 //________________________________________________________________________
328 Bool_t AliConversionCuts::InitPIDResponse(){
329 // Set Pointer to AliPIDResponse
331 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
333 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
334 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
335 if(fPIDResponse)return kTRUE;
341 ///________________________________________________________________________
342 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent){
343 // Process Event Selection
346 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
349 // Z Vertex Position Cut
350 if(!VertexZCut(fInputEvent)){
351 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
356 // Number of Contributors Cut
357 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
358 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
363 // Centrality Selection
364 if(!IsCentralitySelected(fInputEvent)){
365 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
370 // Fill Event Histograms
371 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
372 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
373 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
378 ///________________________________________________________________________
379 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack){
380 // MonteCarlo Photon Selection
382 if(!fMCStack)return kFALSE;
384 if (particle->GetPdgCode() == 22){
385 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin) return kFALSE;
387 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
388 return kFALSE; // no photon as mothers!
391 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
392 return kFALSE; // the gamma has a mother, and it is not a primary particle
395 // looking for conversion (electron + positron from pairbuilding (= 5) )
396 TParticle* ePos = NULL;
397 TParticle* eNeg = NULL;
399 if(particle->GetNDaughters() >= 2){
400 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
401 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
402 if(tmpDaughter->GetUniqueID() == 5){
403 if(tmpDaughter->GetPdgCode() == 11){
405 } else if(tmpDaughter->GetPdgCode() == -11){
412 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
416 if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
421 //________________________________________________________________________
422 Bool_t AliConversionCuts::MesonIsSelectedMC(TParticle *fMCMother,AliStack *fMCStack,Bool_t bMCDaughtersInAcceptance){
423 // Returns true for all pions within acceptance cuts for decay into 2 photons
424 // If bMCDaughtersInAcceptance is selected, it requires in addition that both daughter photons are within acceptance cuts
426 if(!fMCStack)return kFALSE;
428 if(fMCMother->GetPdgCode()==111){
430 // PseudoRapidity Cut
431 if(TMath::Abs(fMCMother->Eta())>fRapidityCutMeson)return kFALSE;
433 // Select only -> 2y decay channel
434 if(fMCMother->GetNDaughters()!=2)return kFALSE;
436 for(Int_t i=0;i<2;i++){
437 TParticle *MDaughter=fMCStack->Particle(fMCMother->GetDaughter(i));
439 // Is Daughter a Photon?
440 if(MDaughter->GetPdgCode()!=22)return kFALSE;
441 // Is Photon in Acceptance?
442 if(bMCDaughtersInAcceptance){
443 if(!PhotonIsSelectedMC(MDaughter,fMCStack)){return kFALSE;}
451 ///________________________________________________________________________
452 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
453 { // Specific Photon Cuts
456 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
459 // Fill Histos before Cuts
460 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetPhotonMass());
461 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
463 // Gamma selection based on QT from Armenteros
464 if(fDoQtGammaSelection == kTRUE){
465 if(!ArmenterosQtCut(photon)){
466 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
473 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
475 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
481 // Reconstruction Acceptance Cuts
482 if(!AcceptanceCuts(photon)){
483 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
489 if(fDoPhotonAsymmetryCut == kTRUE){
490 if(!AsymmetryCut(photon,event)){
491 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
496 //Check the pid probability
498 if(!PIDProbabilityCut(photon, event)) {
499 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
504 if(!CorrectedTPCClusterCut(photon, event)) {
505 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
511 if(!PsiPairCut(photon, event)) {
512 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
517 if(!CosinePAngleCut(photon, event)) {
518 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
523 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
526 if(hInvMassafter)hInvMassafter->Fill(photon->GetPhotonMass());
527 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
534 ///________________________________________________________________________
535 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
536 { //Cut on corrected TPC Cluster Info
538 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
539 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
541 if(!negTrack||!posTrack)return kFALSE;
543 Double_t negclsToF=0;
545 if (!fUseCorrectedTPCClsInfo ){
546 if(negTrack->GetTPCNclsF()!=0){
547 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
550 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
553 Double_t posclsToF = 0.;
554 if (!fUseCorrectedTPCClsInfo ){
555 if(posTrack->GetTPCNclsF()!=0 ){
556 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
559 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
562 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
569 ///________________________________________________________________________
570 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
572 //Selection of Reconstructed Photons
574 FillPhotonCutIndex(kPhotonIn);
577 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
578 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
580 if(!negTrack || !posTrack) {
581 FillPhotonCutIndex(kNoTracks);
586 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
587 FillPhotonCutIndex(kdEdxCuts);
592 if(!TracksAreSelected(negTrack, posTrack)){
593 FillPhotonCutIndex(kTrackCuts);
598 if(!PhotonCuts(photon,event)){
599 FillPhotonCutIndex(kPhotonCuts);
603 // Photon passed cuts
604 FillPhotonCutIndex(kPhotonOut);
608 ///________________________________________________________________________
609 Bool_t AliConversionCuts::MesonIsSelected(AliAODConversionMother *pi0,Bool_t IsSignal)
611 // Selection of reconstructed Meson candidates
612 // Use flag IsSignal in order to fill Fill different
613 // histograms for Signal and Background
616 if(IsSignal){hist=hMesonCuts;
618 else{hist=hMesonBGCuts;}
621 if(hist)hist->Fill(cutIndex);
624 // Undefined Rapidity -> Floating Point exception
625 if((pi0->E()+pi0->Pz())/(pi0->E()-pi0->Pz())<=0){
626 if(hist)hist->Fill(cutIndex);
631 // PseudoRapidity Cut
633 if(TMath::Abs(pi0->PseudoRapidity())>fRapidityCutMeson){
634 if(hist)hist->Fill(cutIndex);
641 //fOpeningAngle=2*TMath::ATan(0.134/pi0->P());// physical minimum opening angle
642 if(pi0->GetOpeningAngle()<fOpeningAngle){
643 if(hist)hist->Fill(cutIndex);
649 if(pi0->GetAlpha()>fAlphaCutMeson){
650 if(hist)hist->Fill(cutIndex);
656 if(pi0->GetAlpha()<fAlphaMinCutMeson){
657 if(hist)hist->Fill(cutIndex);
662 if(hist)hist->Fill(cutIndex);
667 ///________________________________________________________________________
668 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
669 { // Armenteros Qt Cut
671 if(fDoHighPtQtGammaSelection){
672 if(photon->GetPhotonPt() < fPtBorderForQt){
673 if(photon->GetArmenterosQt()>fQtMax){
677 if(photon->GetArmenterosQt()>fHighPtQtMax){
683 if(photon->GetArmenterosQt()>fQtMax){
691 ///________________________________________________________________________
692 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
693 // Exclude certain areas for photon reconstruction
696 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
699 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
700 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
705 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
706 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
711 if(photon->GetConversionRadius() <= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
712 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
715 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
716 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
721 if(TMath::Abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
722 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
728 if(TMath::Abs(photon->GetPhotonEta())> fEtaCut || TMath::Abs(photon->GetPhotonEta())< fEtaCutMin){
729 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
735 if(photon->GetPhotonPt()<fPtCut){
736 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
741 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
747 ///________________________________________________________________________
748 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
749 // Track Cuts which require AOD/ESD specific implementation
751 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !negTrack->IsOn(AliESDtrack::kTPCrefit) ) {
752 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
757 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
758 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
759 if((NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
760 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
768 ///________________________________________________________________________
769 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
770 // Track Cuts which require AOD/ESD specific implementation
772 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !negTrack->IsOn(AliESDtrack::kTPCrefit) ) {
773 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
778 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
779 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
787 ///________________________________________________________________________
788 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
789 // Track Selection for Photon Reconstruction
792 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
796 if(negTrack->Charge() == posTrack->Charge()) {
797 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
802 // Number of TPC Clusters
803 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
804 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
811 if(TMath::Abs(negTrack->Eta()) > fEtaCut || TMath::Abs(negTrack->Eta()) < fEtaCutMin ||
812 TMath::Abs(posTrack->Eta())> fEtaCut || TMath::Abs(posTrack->Eta())< fEtaCutMin) {
813 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
819 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
820 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
825 // AOD ESD specific cuts
826 Bool_t passCuts = kTRUE;
828 if(negTrack->IsA()==AliAODTrack::Class()) {
829 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
831 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
835 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
840 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
846 ///________________________________________________________________________
847 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
848 // Electron Identification Cuts for Photon reconstruction
850 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
851 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
854 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
855 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
859 if(fDodEdxSigmaCut == kTRUE){
861 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
862 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
864 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
870 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
871 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
872 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
873 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
875 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
882 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
883 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
884 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
885 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
887 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
895 if(fDoKaonRejectionLowP == kTRUE){
896 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
897 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
899 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
906 if(fDoProtonRejectionLowP == kTRUE){
907 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
908 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
910 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
917 if(fDoPionRejectionLowP == kTRUE){
918 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
919 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
921 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
929 if( fDoTOFsigmaCut == kTRUE ){ // RRnewTOF start /////////////////////////////////////////////////////////////////////////////
931 if((fPIDResponse->NumberOfSigmasTOF(fCurrentTrack,AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine) || (fPIDResponse->NumberOfSigmasTOF(fCurrentTrack,AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine)){
933 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
936 } /////////////////////////////// RRnewTOF end ///////////////////////////////////////////////////////////////////////////////
941 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
943 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
949 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
950 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal());
955 ///________________________________________________________________________
956 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
957 // Cut on Energy Assymetry
959 for(Int_t ii=0;ii<2;ii++){
961 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
963 if( track->P() > fMinPPhotonAsymmetryCut ){
964 Double_t trackNegAsy=0;
965 if (photon->GetPhotonP()!=0.){
966 trackNegAsy= track->P()/photon->GetPhotonP();
969 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
978 ///________________________________________________________________________
979 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label) const{
980 //Returns pointer to the track with given ESD label
981 //(Important for AOD implementation, since Track array in AOD data is different
982 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
984 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
986 if(label > event->GetNumberOfTracks() ) return NULL;
987 AliESDtrack * track = esdEvent->GetTrack(label);
991 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
992 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
995 if(track->GetID() == label) {
1002 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
1007 ///________________________________________________________________________
1008 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1009 // Cut on Electron Probability for Photon Reconstruction
1011 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1015 Bool_t iResult=kFALSE;
1017 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1018 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1020 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1021 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1023 if(negProbArray && posProbArray){
1025 negTrack->GetTPCpid(negProbArray);
1026 posTrack->GetTPCpid(posProbArray);
1028 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1033 delete [] posProbArray;
1034 delete [] negProbArray;
1038 ///Not possible for AODs
1048 ///________________________________________________________________________
1049 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1050 // MC Acceptance Cuts
1051 //(Certain areas were excluded for photon reconstruction)
1053 if(particle->R()>fMaxR){
1056 if(ePos->R()>fMaxR){
1060 if(ePos->R()<fMinR){
1064 if( ePos->R() <= ((TMath::Abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1067 else if (fUseEtaMinCut && ePos->R() >= ((TMath::Abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1071 if(TMath::Abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1075 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1079 if(TMath::Abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1083 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin){
1087 if(TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin){
1091 if(TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin){
1095 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1099 if(particle->Pt()<fPtCut){
1105 ///________________________________________________________________________
1106 Bool_t AliConversionCuts::UpdateCutString(cutIds cutID, Int_t value) {
1107 ///Update the cut string (if it has been created yet)
1109 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1110 cout << "Updating cut id in spot number " << cutID << " to " << value << endl;
1111 fCutString->SetString(GetCutNumber());
1113 cout << "fCutString not yet initialized, will not be updated" << endl;
1116 cout << fCutString->GetString().Data() << endl;
1120 ///________________________________________________________________________
1121 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1122 // Initialize Cuts from a given Cut string
1124 cout<<"Set Cut Number: "<<analysisCutSelection.Data()<<endl;
1125 if(analysisCutSelection.Length()!=kNCuts) {
1126 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1129 if(!analysisCutSelection.IsDigit()){
1130 AliError("Cut selection contains characters");
1134 const char *cutSelection = analysisCutSelection.Data();
1135 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1136 for(Int_t ii=0;ii<kNCuts;ii++){
1142 AliError("Analysis Cut Selection does not start with 9");
1147 // Set Individual Cuts
1148 for(Int_t ii=0;ii<kNCuts;ii++){
1149 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1156 ///________________________________________________________________________
1157 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1158 ///Set individual cut ID
1160 cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
1165 fCuts[kgoodId] = value;
1167 cout << "Error:: First value of cut string is wrong, aborting!!" << endl;
1175 if( SetV0Finder(value)) {
1176 fCuts[kv0FinderType] = value;
1177 UpdateCutString(cutID, value);
1179 } else return kFALSE;
1182 if( SetElectronProbCut(value)) {
1183 fCuts[keProbCut] = value;
1184 UpdateCutString(cutID, value);
1186 } else return kFALSE;
1188 case kededxSigmaCut:
1189 if( SetTPCdEdxCutElectronLine(value)) {
1190 fCuts[kededxSigmaCut] = value;
1191 UpdateCutString(cutID, value);
1193 } else return kFALSE;
1195 case kpidedxSigmaCut:
1196 if( SetTPCdEdxCutPionLine(value)) {
1197 fCuts[kpidedxSigmaCut] = value;
1198 UpdateCutString(cutID, value);
1200 } else return kFALSE;
1202 case kpiMomdedxSigmaCut:
1203 if( SetMinMomPiondEdxCut(value)) {
1204 fCuts[kpiMomdedxSigmaCut] = value;
1205 UpdateCutString(cutID, value);
1207 } else return kFALSE;
1210 if( SetChi2GammaCut(value)) {
1211 fCuts[kchi2GammaCut] = value;
1212 UpdateCutString(cutID, value);
1214 } else return kFALSE;
1217 if( SetSinglePtCut(value)) {
1218 fCuts[ksinglePtCut] = value;
1219 UpdateCutString(cutID, value);
1221 } else return kFALSE;
1224 if( SetTPCClusterCut(value)) {
1225 fCuts[kclsTPCCut] = value;
1226 UpdateCutString(cutID, value);
1228 } else return kFALSE;
1231 if( SetEtaCut(value)) {
1232 fCuts[ketaCut] = value;
1233 UpdateCutString(cutID, value);
1235 } else return kFALSE;
1238 if( SetChi2MesonCut(value)) {
1239 fCuts[kchi2MesonCut] = value;
1240 UpdateCutString(cutID, value);
1242 } else return kFALSE;
1244 case kLowPRejectionSigmaCut:
1245 if( SetLowPRejectionCuts(value)) {
1246 fCuts[kLowPRejectionSigmaCut] = value;
1247 UpdateCutString(cutID, value);
1249 } else return kFALSE;
1252 if( SetQtMaxCut(value)) {
1253 fCuts[kQtMaxCut] = value;
1254 UpdateCutString(cutID, value);
1256 } else return kFALSE;
1258 case kpiMaxMomdedxSigmaCut:
1259 if( SetMaxMomPiondEdxCut(value)) {
1260 fCuts[kpiMaxMomdedxSigmaCut] = value;
1261 UpdateCutString(cutID, value);
1263 } else return kFALSE;
1265 case kalphaMesonCut:
1266 if( SetAlphaMesonCut(value)) {
1267 fCuts[kalphaMesonCut] = value;
1268 UpdateCutString(cutID, value);
1270 } else return kFALSE;
1273 if( SetRCut(value)) {
1274 fCuts[kminRCut] = value;
1275 UpdateCutString(cutID, value);
1277 } else return kFALSE;
1279 case kRapidityMesonCut:
1280 if( SetRapidityMesonCut(value)) {
1281 fCuts[kRapidityMesonCut] = value;
1282 UpdateCutString(cutID, value);
1284 } else return kFALSE;
1286 case kBackgroundScheme:
1287 if( SetBackgroundScheme(value)) {
1288 fCuts[kBackgroundScheme] = value;
1289 UpdateCutString(cutID, value);
1291 } else return kFALSE;
1293 case kDegreesForRotationMethod:
1294 if( SetNDegreesForRotationMethod(value)) {
1295 fCuts[kDegreesForRotationMethod] = value;
1296 UpdateCutString(cutID, value);
1298 } else return kFALSE;
1300 case kNumberOfRotations:
1301 if( SetNumberOfRotations(value)) {
1302 fCuts[kNumberOfRotations] = value;
1303 UpdateCutString(cutID, value);
1305 } else return kFALSE;
1308 if( SetRemovePileUp(value)) {
1309 fCuts[kremovePileUp] = value;
1310 UpdateCutString(cutID, value);
1312 } else return kFALSE;
1315 if( SetSelectV0AND(value)) {
1316 fCuts[kselectV0AND] = value;
1317 UpdateCutString(cutID, value);
1319 } else return kFALSE;
1321 case kmultiplicityBin:
1322 if( SetMultiplicityBin(value)) {
1323 fCuts[kmultiplicityBin] = value;
1324 UpdateCutString(cutID, value);
1326 } else return kFALSE;
1329 if( SetIsHeavyIon(value)) {
1330 fCuts[kisHeavyIon] = value;
1331 UpdateCutString(cutID, value);
1333 } else return kFALSE;
1335 case kuseCentrality:
1336 if( SetUseCentrality(value)) {
1337 fCuts[kuseCentrality] = value;
1338 UpdateCutString(cutID, value);
1340 } else return kFALSE;
1342 case kcentralityBin:
1343 if( SetCentralityBin(value)) {
1344 fCuts[kcentralityBin] = value;
1345 UpdateCutString(cutID, value);
1347 } else return kFALSE;
1349 case kTOFelectronPID:
1350 if( SetTOFElectronPIDCut(value)) {
1351 fCuts[kTOFelectronPID] = value;
1352 UpdateCutString(cutID, value);
1354 } else return kFALSE;
1356 case kuseMCPSmearing:
1357 if( SetMCPSmearing(value)) {
1358 fCuts[kuseMCPSmearing] = value;
1359 UpdateCutString(cutID, value);
1361 } else return kFALSE;
1363 case kdoPhotonAsymmetryCut:
1364 if( SetPhotonAsymmetryCut(value)) {
1365 fCuts[kdoPhotonAsymmetryCut] = value;
1366 UpdateCutString(cutID, value);
1368 } else return kFALSE;
1371 if( SetPsiPairCut(value)) {
1372 fCuts[kPsiPair] = value;
1373 UpdateCutString(cutID, value);
1375 } else return kFALSE;
1378 if( SetCosPAngleCut(value)) {
1379 fCuts[kCosPAngle] = value;
1380 UpdateCutString(cutID, value);
1382 } else return kFALSE;
1385 cout << "Error:: Cut id out of range"<< endl;
1389 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
1399 // case kv0FinderType:
1400 // fCuts[kv0FinderType] = value;
1401 // if(!SetV0Finder(fCuts[kv0FinderType]))return kFALSE;
1402 // else return kTRUE;
1404 // fCuts[keProbCut] = value;
1405 // if(!SetElectronProbCut(fCuts[keProbCut]))return kFALSE;
1406 // else return kTRUE;
1407 // case kededxSigmaCut:
1408 // fCuts[kededxSigmaCut] = value;
1409 // if(!SetTPCdEdxCutElectronLine(fCuts[kededxSigmaCut]))return kFALSE;
1410 // else return kTRUE;
1411 // case kpidedxSigmaCut:
1412 // fCuts[kpidedxSigmaCut] = value;
1413 // if(!SetTPCdEdxCutPionLine(fCuts[kpidedxSigmaCut]))return kFALSE;
1414 // else return kTRUE;
1415 // case kpiMomdedxSigmaCut:
1416 // fCuts[kpiMomdedxSigmaCut] = value;
1417 // if(!SetMinMomPiondEdxCut(fCuts[kpiMomdedxSigmaCut]))return kFALSE;
1418 // else return kTRUE;
1419 // case kchi2GammaCut:
1420 // fCuts[kchi2GammaCut] = value;
1421 // if(!SetChi2GammaCut(fCuts[kchi2GammaCut]))return kFALSE;
1422 // else return kTRUE;
1423 // case ksinglePtCut:
1424 // fCuts[ksinglePtCut] = value;
1425 // if(!SetSinglePtCut(fCuts[ksinglePtCut]))return kFALSE;
1426 // else return kTRUE;
1428 // fCuts[kclsTPCCut] = value;
1429 // if(!SetTPCClusterCut(fCuts[kclsTPCCut]))return kFALSE;
1430 // else return kTRUE;
1432 // fCuts[ketaCut] = value;
1433 // if(!SetEtaCut(fCuts[ketaCut]))return kFALSE;
1434 // else return kTRUE;
1435 // case kchi2MesonCut:
1436 // fCuts[kchi2MesonCut] = value;
1437 // if(!SetChi2MesonCut(fCuts[kchi2MesonCut]))return kFALSE;
1438 // else return kTRUE;
1439 // case kLowPRejectionSigmaCut:
1440 // fCuts[kLowPRejectionSigmaCut] = value;
1441 // if(!SetLowPRejectionCuts(fCuts[kLowPRejectionSigmaCut]))return kFALSE;
1442 // else return kTRUE;
1444 // fCuts[kQtMaxCut] = value;
1445 // if(!SetQtMaxCut(fCuts[kQtMaxCut]))return kFALSE;
1446 // else return kTRUE;
1447 // case kpiMaxMomdedxSigmaCut:
1448 // fCuts[kpiMaxMomdedxSigmaCut] = value;
1449 // if(!SetMaxMomPiondEdxCut(fCuts[kpiMaxMomdedxSigmaCut]))return kFALSE;
1450 // else return kTRUE;
1451 // case kalphaMesonCut:
1452 // fCuts[kalphaMesonCut] = value;
1453 // if(!SetAlphaMesonCut(fCuts[kalphaMesonCut]))return kFALSE;
1454 // else return kTRUE;
1456 // fCuts[kminRCut] = value;
1457 // if(!SetRCut(fCuts[kminRCut]))return kFALSE;
1458 // else return kTRUE;
1459 // case kRapidityMesonCut:
1460 // fCuts[kRapidityMesonCut] = value;
1461 // if(!SetRapidityMesonCut(fCuts[kRapidityMesonCut]))return kFALSE;
1462 // else return kTRUE;
1463 // case kBackgroundScheme:
1464 // fCuts[kBackgroundScheme] = value;
1465 // if(!SetBackgroundScheme(fCuts[kBackgroundScheme]))return kFALSE;
1466 // else return kTRUE;
1467 // case kDegreesForRotationMethod:
1468 // fCuts[kDegreesForRotationMethod] = value;
1469 // if(!SetNDegreesForRotationMethod(fCuts[kDegreesForRotationMethod]))return kFALSE;
1470 // else return kTRUE;
1471 // case kNumberOfRotations:
1472 // fCuts[kNumberOfRotations] = value;
1473 // if(!SetNumberOfRotations(fCuts[kNumberOfRotations]))return kFALSE;
1474 // else return kTRUE;
1475 // case kremovePileUp:
1476 // fCuts[kremovePileUp] = value;
1477 // if(!SetRemovePileUp(fCuts[kremovePileUp]))return kFALSE;
1478 // else return kTRUE;
1479 // case kselectV0AND:
1480 // fCuts[kselectV0AND] = value;
1481 // if(!SetSelectV0AND(fCuts[kselectV0AND]))return kFALSE;
1482 // else return kTRUE;
1483 // case kmultiplicityBin:
1484 // fCuts[kmultiplicityBin] = value;
1485 // if(!SetMultiplicityBin(fCuts[kmultiplicityBin]))return kFALSE;
1486 // else return kTRUE;
1487 // case kisHeavyIon:
1488 // fCuts[kisHeavyIon] = value;
1489 // if(!SetIsHeavyIon(fCuts[kisHeavyIon]))return kFALSE;
1490 // else return kTRUE;
1491 // case kuseCentrality:
1492 // fCuts[kuseCentrality] = value;
1493 // if(!SetUseCentrality(fCuts[kuseCentrality]))return kFALSE;
1494 // else return kTRUE;
1495 // case kcentralityBin:
1496 // fCuts[kcentralityBin] = value;
1497 // if(!SetCentralityBin(fCuts[kcentralityBin]))return kFALSE;
1498 // else return kTRUE;
1499 // case kTOFelectronPID:
1500 // fCuts[kTOFelectronPID] = value;
1501 // if(!SetTOFElectronPIDCut(fCuts[kTOFelectronPID]))return kFALSE;
1502 // else return kTRUE;
1503 // case kuseMCPSmearing:
1504 // fCuts[kuseMCPSmearing] = value;
1505 // if(!SetMCPSmearing(fCuts[kuseMCPSmearing]))return kFALSE;
1506 // else return kTRUE;
1507 // case kdoPhotonAsymmetryCut:
1508 // fCuts[kdoPhotonAsymmetryCut] = value;
1509 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1510 // else return kTRUE;
1512 // fCuts[kPsiPair] = value;
1513 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1514 // else return kTRUE;
1516 // fCuts[kCosPAngle] = value;
1517 // if(!SetPhotonAsymmetryCut(fCuts[kdoPhotonAsymmetryCut]))return kFALSE;
1518 // else return kTRUE;
1520 // cout << "Error:: Cut id out of range"<< endl;
1527 ///________________________________________________________________________
1528 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
1530 switch(removePileUp){
1532 fRemovePileUp=kFALSE;
1535 fRemovePileUp=kTRUE;
1538 cout<<"Warning: RemovePileUpCut not defined"<<removePileUp<<endl;
1544 ///________________________________________________________________________
1545 Bool_t AliConversionCuts::SetSelectV0AND(Int_t selectV0AND)
1547 switch(selectV0AND){
1549 fSelectV0AND=kFALSE;
1555 cout<<"Warning: V0ANDCut not defined"<<selectV0AND<<endl;
1561 ///________________________________________________________________________
1562 Bool_t AliConversionCuts::SetMultiplicityBin(Int_t multiplicityBin)
1564 switch(multiplicityBin){
1566 fUseMultiplicity=kFALSE;
1567 fUseMultiplicityBin=0;
1570 fUseMultiplicity=kTRUE;
1571 fUseMultiplicityBin=1;
1574 fUseMultiplicity=kTRUE;
1575 fUseMultiplicityBin=2;
1578 fUseMultiplicity=kTRUE;
1579 fUseMultiplicityBin=3;
1582 fUseMultiplicity=kTRUE;
1583 fUseMultiplicityBin=4;
1586 fUseMultiplicity=kTRUE;
1587 fUseMultiplicityBin=5;
1590 cout<<"Warning: MultiplicityBinCut not defined"<<multiplicityBin<<endl;
1597 ///________________________________________________________________________
1598 Bool_t AliConversionCuts::SetMCPSmearing(Int_t useMCPSmearing)
1600 switch(useMCPSmearing){
1605 fPSigSmearingCte=0.;
1609 fPBremSmearing=1.0e-14;
1611 fPSigSmearingCte=0.;
1615 fPBremSmearing=1.0e-15;
1617 fPSigSmearingCte=0.;
1622 fPSigSmearing=0.003;
1623 fPSigSmearingCte=0.002;
1628 fPSigSmearing=0.003;
1629 fPSigSmearingCte=0.007;
1634 fPSigSmearing=0.003;
1635 fPSigSmearingCte=0.016;
1640 fPSigSmearing=0.007;
1641 fPSigSmearingCte=0.016;
1645 fPBremSmearing=1.0e-16;
1647 fPSigSmearingCte=0.;
1652 fPSigSmearing=0.007;
1653 fPSigSmearingCte=0.014;
1658 fPSigSmearing=0.007;
1659 fPSigSmearingCte=0.011;
1663 cout<<"Warning: UseMCPSmearing not defined"<<useMCPSmearing<<endl;
1669 ///________________________________________________________________________
1670 void AliConversionCuts::PrintCuts() {
1671 // Print out current Cut Selection
1672 for(Int_t ic = 0; ic < kNCuts; ic++) {
1673 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
1678 ///________________________________________________________________________
1679 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
1706 // High purity cuts for PbPb
1713 cout<<"Warning: RCut not defined"<<RCut<<endl;
1719 ///________________________________________________________________________
1720 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
1722 switch(ededxSigmaCut){
1724 fPIDnSigmaBelowElectronLine=-10;
1725 fPIDnSigmaAboveElectronLine=10;
1728 fPIDnSigmaBelowElectronLine=-5;
1729 fPIDnSigmaAboveElectronLine=5;
1732 fPIDnSigmaBelowElectronLine=-3;
1733 fPIDnSigmaAboveElectronLine=5;
1736 fPIDnSigmaBelowElectronLine=-4;
1737 fPIDnSigmaAboveElectronLine=5;
1740 cout<<"Warning: TPCdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
1747 ///________________________________________________________________________
1748 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
1751 switch(pidedxSigmaCut){
1753 fPIDnSigmaAbovePionLine=-10;
1754 fPIDnSigmaAbovePionLineHighPt=-10;
1757 fPIDnSigmaAbovePionLine=0;
1758 fPIDnSigmaAbovePionLineHighPt=-10;
1761 fPIDnSigmaAbovePionLine=1;
1762 fPIDnSigmaAbovePionLineHighPt=-10;
1765 fPIDnSigmaAbovePionLine=-1;
1766 fPIDnSigmaAbovePionLineHighPt=-10;
1769 fPIDnSigmaAbovePionLine=-1.5;
1770 fPIDnSigmaAbovePionLineHighPt=-10;
1773 fPIDnSigmaAbovePionLine=2.;
1774 fPIDnSigmaAbovePionLineHighPt=-10;
1777 fPIDnSigmaAbovePionLine=2.;
1778 fPIDnSigmaAbovePionLineHighPt=0.5;
1781 fPIDnSigmaAbovePionLine=3.5;
1782 fPIDnSigmaAbovePionLineHighPt=-10;
1785 fPIDnSigmaAbovePionLine=2.;
1786 fPIDnSigmaAbovePionLineHighPt=1.;
1789 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
1790 fPIDnSigmaAbovePionLineHighPt=-10;
1793 cout<<"Warning: pidedxSigmaCut not defined "<<pidedxSigmaCut<<endl;
1799 ///________________________________________________________________________
1800 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
1803 switch(chi2GammaCut){
1805 fChi2CutConversion = 100.;
1808 fChi2CutConversion = 50.;
1811 fChi2CutConversion = 30.;
1814 fChi2CutConversion = 200.;
1817 fChi2CutConversion = 500.;
1820 fChi2CutConversion = 1000.;
1823 fChi2CutConversion = 5.;
1826 fChi2CutConversion = 10.;
1829 fChi2CutConversion = 20.;
1832 fChi2CutConversion = 15.;
1835 cout<<"Warning: Chi2GammaCut not defined "<<chi2GammaCut<<endl;
1841 ///________________________________________________________________________
1842 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
1844 switch (v0FinderType){
1845 case 0: // on fly V0 finder
1846 fUseOnFlyV0Finder=kTRUE;
1848 case 1: // offline V0 finder
1849 fUseOnFlyV0Finder=kFALSE;
1852 cout<<"Warning: v0FinderType not defined "<<v0FinderType<<endl;
1858 ///________________________________________________________________________
1859 Bool_t AliConversionCuts::SetElectronProbCut(Int_t eProbCut)
1864 fPIDProbabilityCutNegativeParticle=0;
1865 fPIDProbabilityCutPositiveParticle=0;
1868 fPIDProbabilityCutNegativeParticle=0.1;
1869 fPIDProbabilityCutPositiveParticle=0.1;
1872 fPIDProbabilityCutNegativeParticle=0.5;
1873 fPIDProbabilityCutPositiveParticle=0.5;
1876 fPIDProbabilityCutNegativeParticle=0.7;
1877 fPIDProbabilityCutPositiveParticle=0.7;
1880 cout<<"Warning: eProbCut not defined "<<eProbCut<<endl;
1886 ///________________________________________________________________________
1887 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
1889 switch(singlePtCut){
1890 case 0: // 0.050 GeV
1891 fSinglePtCut = 0.050;
1893 case 1: // 0.100 GeV
1894 fSinglePtCut = 0.100;
1896 case 2: // 0.150 GeV
1897 fSinglePtCut = 0.150;
1899 case 3: // 0.200 GeV
1900 fSinglePtCut = 0.200;
1902 case 4: // 0.075 GeV
1903 fSinglePtCut = 0.075;
1905 case 5: // 0.125 GeV
1906 fSinglePtCut = 0.125;
1909 cout<<"Warning: singlePtCut not defined "<<singlePtCut<<endl;
1914 ///________________________________________________________________________
1915 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
1930 case 4: // 60% of findable clusters
1932 fUseCorrectedTPCClsInfo=0;
1934 case 5: // 0% of findable clusters
1936 fUseCorrectedTPCClsInfo=1;
1938 case 6: // 0% of findable clusters
1940 fUseCorrectedTPCClsInfo=0;
1942 case 7: // 0% of findable clusters
1943 fMinClsTPCToF= 0.35;
1944 fUseCorrectedTPCClsInfo=0;
1947 fMinClsTPCToF= 0.35;
1948 fUseCorrectedTPCClsInfo=1;
1952 fUseCorrectedTPCClsInfo=1;
1955 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
1961 ///________________________________________________________________________
1962 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
1967 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1969 fLineCutZRSlopeMin = 0.;
1973 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1975 fLineCutZRSlopeMin = 0.;
1979 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1981 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCut)));
1985 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1987 fLineCutZRSlopeMin = 0.;
1991 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1993 fLineCutZRSlopeMin = 0.;
1995 case 5: // 0.9 - 1.4
1997 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
1999 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2001 case 6: // 0.9 - 1.2
2003 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2005 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2007 case 7: // 0.1 - 0.8
2009 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2011 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2013 case 8: // 0.1 - 0.8
2015 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2017 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2020 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
2026 ///________________________________________________________________________
2027 Bool_t AliConversionCuts::SetChi2MesonCut(Int_t chi2MesonCut)
2029 switch(chi2MesonCut){
2031 fChi2CutMeson = 100.;
2034 fChi2CutMeson = 50.;
2037 fChi2CutMeson = 30.;
2040 fChi2CutMeson = 200.;
2043 fChi2CutMeson = 500.;
2046 fChi2CutMeson = 1000.;
2049 cout<<"Warning: Chi2MesonCut not defined "<<chi2MesonCut<<endl;
2055 ///________________________________________________________________________
2056 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
2058 switch(piMomdedxSigmaCut){
2060 fPIDMinPnSigmaAbovePionLine=0.5;
2063 fPIDMinPnSigmaAbovePionLine=1.;
2066 fPIDMinPnSigmaAbovePionLine=1.5;
2069 fPIDMinPnSigmaAbovePionLine=20.;
2072 fPIDMinPnSigmaAbovePionLine=50.;
2075 fPIDMinPnSigmaAbovePionLine=0.3;
2077 case 6: // 0.25 GeV // RRnew label was wrong in comment
2078 fPIDMinPnSigmaAbovePionLine=0.25;
2081 fPIDMinPnSigmaAbovePionLine=0.4;
2084 cout<<"Warning: piMomdedxSigmaCut not defined "<<piMomdedxSigmaCut<<endl;
2090 ///________________________________________________________________________
2091 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2093 switch(piMaxMomdedxSigmaCut){
2095 fPIDMaxPnSigmaAbovePionLine=100.;
2098 fPIDMaxPnSigmaAbovePionLine=5.;
2101 fPIDMaxPnSigmaAbovePionLine=4.;
2104 fPIDMaxPnSigmaAbovePionLine=3.5;
2107 fPIDMaxPnSigmaAbovePionLine=3.;
2110 cout<<"Warning: piMaxMomdedxSigmaCut not defined "<<piMaxMomdedxSigmaCut<<endl;
2116 ///________________________________________________________________________
2117 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2127 cout<<"Warning: SetHeavyIon not defined "<<isHeavyIon<<endl;
2133 ///________________________________________________________________________
2134 Bool_t AliConversionCuts::SetAlphaMesonCut(Int_t alphaMesonCut)
2136 switch(alphaMesonCut){
2138 fAlphaMinCutMeson = 0.0;
2139 fAlphaCutMeson = 0.7;
2142 fAlphaMinCutMeson = 0.0;
2143 fAlphaCutMeson = 0.5;
2146 fAlphaMinCutMeson = 0.5;
2147 fAlphaCutMeson = 1.;
2150 fAlphaMinCutMeson = 0.0;
2151 fAlphaCutMeson = 1.;
2154 fAlphaMinCutMeson = 0.0;
2155 fAlphaCutMeson = 0.65;
2158 fAlphaMinCutMeson = 0.0;
2159 fAlphaCutMeson = 0.75;
2162 fAlphaMinCutMeson = 0.0;
2163 fAlphaCutMeson = 0.8;
2166 fAlphaMinCutMeson = 0.0;
2167 fAlphaCutMeson = 0.85;
2170 fAlphaMinCutMeson = 0.0;
2171 fAlphaCutMeson = 0.6;
2174 cout<<"Warning: AlphaMesonCut not defined "<<alphaMesonCut<<endl;
2180 ///________________________________________________________________________
2181 Bool_t AliConversionCuts::SetRapidityMesonCut(Int_t RapidityMesonCut)
2183 switch(RapidityMesonCut){
2185 fRapidityCutMeson = 0.9;
2188 fRapidityCutMeson = 0.8;
2191 fRapidityCutMeson = 0.7;
2195 cout<<"Warning: RapidityMesonCut not defined "<<RapidityMesonCut<<endl;
2201 ///________________________________________________________________________
2202 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2204 switch(LowPRejectionSigmaCut){
2206 fPIDnSigmaAtLowPAroundKaonLine=0;
2207 fPIDnSigmaAtLowPAroundProtonLine=0;
2208 fPIDnSigmaAtLowPAroundPionLine=0;
2211 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2212 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2213 fPIDnSigmaAtLowPAroundPionLine=0.5;
2216 fPIDnSigmaAtLowPAroundKaonLine=1;
2217 fPIDnSigmaAtLowPAroundProtonLine=1;
2218 fPIDnSigmaAtLowPAroundPionLine=1;
2221 fPIDnSigmaAtLowPAroundKaonLine=2.;
2222 fPIDnSigmaAtLowPAroundProtonLine=2.;
2223 fPIDnSigmaAtLowPAroundPionLine=2.;
2226 fPIDnSigmaAtLowPAroundKaonLine=0.;
2227 fPIDnSigmaAtLowPAroundProtonLine=0.;
2228 fPIDnSigmaAtLowPAroundPionLine=1;
2231 fPIDnSigmaAtLowPAroundKaonLine=0.;
2232 fPIDnSigmaAtLowPAroundProtonLine=0.;
2233 fPIDnSigmaAtLowPAroundPionLine=1.5;
2236 fPIDnSigmaAtLowPAroundKaonLine=0.;
2237 fPIDnSigmaAtLowPAroundProtonLine=0.;
2238 fPIDnSigmaAtLowPAroundPionLine=2.;
2241 cout<<"Warning: LowPRejectionSigmaCut not defined "<<LowPRejectionSigmaCut<<endl;
2247 ///________________________________________________________________________
2248 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2250 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
2252 fUseTOFpid = kFALSE;
2253 fTofPIDnSigmaBelowElectronLine=-100;
2254 fTofPIDnSigmaAboveElectronLine=100;
2258 fTofPIDnSigmaBelowElectronLine=-7;
2259 fTofPIDnSigmaAboveElectronLine=7;
2263 fTofPIDnSigmaBelowElectronLine=-5;
2264 fTofPIDnSigmaAboveElectronLine=5;
2268 fTofPIDnSigmaBelowElectronLine=-3;
2269 fTofPIDnSigmaAboveElectronLine=5;
2273 fTofPIDnSigmaBelowElectronLine=-2;
2274 fTofPIDnSigmaAboveElectronLine=3;
2277 cout<<"Warning: TOFElectronCut not defined "<<TOFelectronPID<<endl;
2279 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
2283 ///________________________________________________________________________
2284 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
2286 switch(TRDElectronCut){
2292 fPIDTRDEfficiency=0.1;
2296 fPIDTRDEfficiency=0.8;
2300 fPIDTRDEfficiency=0.9;
2303 cout<<"Warning: TRDElectronCut not defined "<<TRDElectronCut<<endl;
2309 ///________________________________________________________________________
2310 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2315 fDoQtGammaSelection=kFALSE; //No Qt selection (true by default)
2316 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2317 fHighPtQtMax=100.; // RRnew
2318 fPtBorderForQt=100.; // RRnew
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
2344 case 5: // RR try to improve (get rid of) low InvMass peak in PbPb
2346 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2347 fHighPtQtMax=100.; // RRnew
2348 fPtBorderForQt=100.; // RRnew
2349 break; // end RR ///////////////////////////////////////////////
2350 case 6: // RRnew start: pT dependent qT cut
2352 fDoHighPtQtGammaSelection=kTRUE;
2355 break; // RRnew end ////////////////////////////////////////////
2358 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2359 fHighPtQtMax=100.; // RRnew
2360 fPtBorderForQt=100.; // RRnew
2363 cout<<"Warning: QtMaxCut not defined "<<QtMaxCut<<endl;
2369 //-------------------------------------------------------------
2370 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
2371 { // Get Event Centrality
2372 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
2374 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
2376 if(fUseCentrality==0){
2377 return fESDCentrality->GetCentralityPercentile("V0M"); // default
2380 if(fUseCentrality==1||fUseCentrality==3){
2381 return fESDCentrality->GetCentralityPercentile("V0M");
2384 if(fUseCentrality==2||fUseCentrality==4){
2385 return fESDCentrality->GetCentralityPercentile("CL1");
2388 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
2390 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
2395 //-------------------------------------------------------------
2396 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event)
2397 { // Centrality Selection
2398 if(!fIsHeavyIon)return kTRUE;
2400 Double_t centrality=GetCentrality(event);
2402 if(centrality<0)return kFALSE;
2404 Int_t centralityC=Int_t(centrality/10);
2406 // No CentralitySelection
2407 if(fUseCentrality==0)return kTRUE;
2409 // Use Percentiles10
2410 if(fUseCentrality==1||fUseCentrality==2){
2411 if(fUseCentralityBin==centralityC)return kTRUE;
2414 // Use User Defined Centrality Selection
2415 if(fUseCentrality==3||fUseCentrality==4){
2418 if( (fUseCentralityBin == 0) && (centralityC!=0) ){
2422 if( (fUseCentralityBin == 1) && (centralityC!=1) ){
2426 if( (fUseCentralityBin == 2) && (centralityC!=2) && (centralityC!=3) ){
2430 if( (fUseCentralityBin == 3) && (centralityC!=0) && (centralityC!=1) ){
2434 if( (fUseCentralityBin == 4) && (centralityC!=4) && (centralityC!=5) ){
2438 if( (fUseCentralityBin == 6) && (centralityC!=6) && (centralityC!=7) && (centralityC!=8) ){
2442 if( (fUseCentralityBin == 7) && (centralityC!=6) && (centralityC!=7) ){
2446 if( (fUseCentralityBin == 8) && (centralityC>=8) ){
2450 if( (fUseCentralityBin == 9) && (centralityC>=9) ){
2457 //-------------------------------------------------------------
2458 Bool_t AliConversionCuts::SetUseCentrality(Int_t useCentrality)
2461 switch(useCentrality){
2463 fUseCentrality=0; // No Centrality Selection
2466 fUseCentrality=1;// GetCentralityClass10("V0M")
2469 fUseCentrality=2; // GetCentralityClass10("CL1")
2471 case 3://////////////// RRnew start //////////////////////////////////////////////////////////////////////////////////////////////////////
2472 fUseCentrality=3;// GetCentralityClass10("V0M") but with merged bins
2475 fUseCentrality=4;// GetCentralityClass10("CL1") but with merged bins
2476 break;/////////////// RRnew end ////////////////////////////////////////////////////////////////////////////////////////////////////////
2478 cout<<"Warning: UseCentrality not defined "<<useCentrality<<endl;
2484 //-------------------------------------------------------------
2485 Bool_t AliConversionCuts::SetCentralityBin(Int_t centralityBin)
2488 if(centralityBin<0||centralityBin>9){
2489 cout<<"Warning: CentralityBin not defined "<<centralityBin<<endl;
2493 fUseCentralityBin=centralityBin;
2497 ///________________________________________________________________________
2498 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2500 switch(doPhotonAsymmetryCut){
2502 fDoPhotonAsymmetryCut=0;
2503 fMinPPhotonAsymmetryCut=100.;
2504 fMinPhotonAsymmetry=0.;
2507 fDoPhotonAsymmetryCut=1;
2508 fMinPPhotonAsymmetryCut=3.5;
2509 fMinPhotonAsymmetry=0.04;
2512 fDoPhotonAsymmetryCut=1;
2513 fMinPPhotonAsymmetryCut=3.5;
2514 fMinPhotonAsymmetry=0.06;
2517 cout<<"Warning: PhotonAsymmetryCut not defined "<<doPhotonAsymmetryCut<<endl;
2520 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2524 ///________________________________________________________________________
2525 Bool_t AliConversionCuts::SetBackgroundScheme(Int_t BackgroundScheme){
2527 switch(BackgroundScheme){
2529 fUseRotationMethodInBG=kTRUE;
2530 fdoBGProbability=kFALSE;
2532 case 1: // mixed event with track multiplicity
2533 fUseRotationMethodInBG=kFALSE;
2534 fUseTrackMultiplicityForBG=kFALSE;
2535 fdoBGProbability=kFALSE;
2537 case 2: // mixed event with V0 multiplicity
2538 fUseRotationMethodInBG=kFALSE;
2539 fUseTrackMultiplicityForBG=kTRUE;
2540 fdoBGProbability=kFALSE;
2543 fUseRotationMethodInBG=kTRUE;
2544 fdoBGProbability=kTRUE;
2547 cout<<"Warning: BackgroundScheme not defined "<<BackgroundScheme<<endl;
2553 ///________________________________________________________________________
2554 Bool_t AliConversionCuts::SetNDegreesForRotationMethod(Int_t DegreesForRotationMethod){
2556 switch(DegreesForRotationMethod){
2558 fnDegreeRotationPMForBG = 5;
2561 fnDegreeRotationPMForBG = 10;
2564 fnDegreeRotationPMForBG = 15;
2567 fnDegreeRotationPMForBG = 20;
2570 cout<<"Warning: DegreesForRotationMethod not defined "<<DegreesForRotationMethod<<endl;
2573 fCuts[kDegreesForRotationMethod]=DegreesForRotationMethod;
2577 ///________________________________________________________________________
2578 Bool_t AliConversionCuts::SetNumberOfRotations(Int_t NumberOfRotations)
2580 switch(NumberOfRotations){
2582 fnumberOfRotationEventsForBG = 5;
2585 fnumberOfRotationEventsForBG = 10;
2588 fnumberOfRotationEventsForBG = 15;
2591 fnumberOfRotationEventsForBG = 20;
2594 fnumberOfRotationEventsForBG = 2;
2597 fnumberOfRotationEventsForBG = 50;
2600 fnumberOfRotationEventsForBG = 80;
2603 fnumberOfRotationEventsForBG = 100;
2606 cout<<"Warning: NumberOfRotations not defined "<<NumberOfRotations<<endl;
2612 ///________________________________________________________________________
2613 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2618 fPsiPairCut = 10000; //
2621 fPsiPairCut = 0.1; //
2624 fPsiPairCut = 0.05; // Standard
2627 fPsiPairCut = 0.035; //
2630 fPsiPairCut = 0.15; //
2633 fPsiPairCut = 0.2; //
2636 fPsiPairCut = 0.03; //
2639 fPsiPairCut = 0.025; //
2642 fPsiPairCut = 0.01; //
2645 cout<<"Warning: PsiPairCut not defined "<<fPsiPairCut<<endl;
2652 ///________________________________________________________________________
2653 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2657 fCosPAngleCut = 10000; //
2660 fCosPAngleCut = 0.1; //
2663 fCosPAngleCut = 0.05; //
2666 fCosPAngleCut = 0.025; // Standard
2669 fCosPAngleCut = 0.01; //
2672 cout<<"Warning: Cosine Pointing Angle cut not defined "<<fCosPAngleCut<<endl;
2681 ///________________________________________________________________________
2682 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
2683 // Cut on z position of primary vertex
2684 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
2686 if(TMath::Abs(fVertexZ)>fMaxVertexZ)return kFALSE;
2693 ///________________________________________________________________________
2695 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
2696 // returns number of contributors to the vertex
2698 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2700 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
2701 return fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
2704 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
2706 //-AM test pi0s without SPD only vertex
2707 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2708 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
2711 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2717 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2719 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
2720 return fAODEvent->GetPrimaryVertex()->GetNContributors();
2722 if(fAODEvent->GetPrimaryVertex()->GetNContributors()<1) {
2723 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2724 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
2726 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2727 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
2737 /*Bool_t IsTriggerSelected()
2740 AliVEvent::IsTriggerClassFired ???
2742 if(fTriggerAnalysis== NULL){
2743 fTriggerAnalysis = new AliTriggerAnalysis;
2746 //Take Only events with proper trigger
2748 // if(fTriggerCINT1B){
2749 // if(!fV0Reader->GetESDEvent()->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) return;
2752 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(fV0Reader->GetESDEvent(), AliTriggerAnalysis::kV0A);
2753 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(fV0Reader->GetESDEvent(), AliTriggerAnalysis::kV0C);
2754 Bool_t v0AND = v0A && v0C;
2756 if(fSelectV0AND && !v0AND){
2763 ///________________________________________________________________________
2764 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
2765 // Get first TPC row
2766 Int_t firstTPCRow=0;
2767 Double_t radiusI = 84.8;
2768 Double_t radiusO = 134.6;
2769 Double_t radiusOB = 198.;
2770 Double_t rSizeI = 0.75;
2771 Double_t rSizeO = 1.;
2772 Double_t rSizeOB = 1.5;
2776 if(radius <= radiusI){
2779 if(radius>radiusI && radius<=radiusO){
2780 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
2782 if(radius>radiusO && radius<=radiusOB){
2783 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
2786 if(radius>radiusOB){
2787 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
2793 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, const AliVEvent * event) const {
2794 ///Check if passes cosine of pointing angle cut
2795 //cout << "cpa " << GetCosineOfPointingAngle(photon, event) << " " << 1 - fCosPAngleCut << endl;
2796 if(GetCosineOfPointingAngle(photon, event) < ( 1- fCosPAngleCut)) return kFALSE;
2802 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, const AliVEvent * event) const{
2803 // calculates the pointing angle of the recalculated V0
2805 Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
2806 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
2807 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
2808 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
2810 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
2811 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
2813 Double_t cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
2815 return cosinePointingAngle;
2819 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon, const AliVEvent * event) const {
2820 ///Cehck if passes psi pair cut, works for ESDs only
2821 const AliESDEvent * esdEvent = dynamic_cast<const AliESDEvent*>(event);
2822 if(!esdEvent) return kTRUE;
2823 AliESDv0 * v0 = esdEvent->GetV0(photon->GetV0Index());
2824 AliESDtrack * negTrack = esdEvent->GetTrack(photon->GetTrackLabel(0));
2825 AliESDtrack * posTrack = esdEvent->GetTrack(photon->GetTrackLabel(0));
2827 if(v0 && negTrack && posTrack) {
2828 if( GetPsiPair(v0, esdEvent) > fPsiPairCut)
2838 Double_t AliConversionCuts::GetPsiPair(const AliESDv0* v0, const AliESDEvent * event) const {
2840 // Angle between daughter momentum plane and plane
2843 Float_t magField = event->GetMagneticField();
2845 Double_t xyz[3] = {0.,0.,0.};
2846 v0->GetXYZ(xyz[0],xyz[1],xyz[2]);
2848 Double_t mn[3] = {0,0,0};
2849 Double_t mp[3] = {0,0,0};
2851 v0->GetNPxPyPz(mn[0],mn[1],mn[2]);//reconstructed cartesian momentum components of negative daughter;
2852 v0->GetPPxPyPz(mp[0],mp[1],mp[2]);//reconstructed cartesian momentum components of positive daughter;
2854 Double_t deltat = 1.;
2855 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
2856 Double_t radiussum = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]) + 50;//radius to which tracks shall be propagated
2858 Double_t momPosProp[3] = {0,0,0};
2859 Double_t momNegProp[3] = {0,0,0};
2861 AliExternalTrackParam nt = *(v0->GetParamN());
2862 AliExternalTrackParam pt = *(v0->GetParamP());
2864 Double_t psiPair = 4.;
2865 if(nt.PropagateTo(radiussum,magField) == 0) return psiPair; //propagate tracks to the outside -> Better Purity and Efficiency
2867 if(pt.PropagateTo(radiussum,magField) == 0) return psiPair; //propagate tracks to the outside -> Better Purity and Efficiency
2869 pt.GetPxPyPz(momPosProp);//Get momentum vectors of tracks after propagation
2870 nt.GetPxPyPz(momNegProp);
2873 TMath::Sqrt(momNegProp[0]*momNegProp[0]+momNegProp[1]*momNegProp[1]+momNegProp[2]*momNegProp[2]);//absolute momentum value of negative daughter
2876 TMath::Sqrt(momPosProp[0]*momPosProp[0]+momPosProp[1]*momPosProp[1]+momPosProp[2]*momPosProp[2]);//absolute momentum value of positive daughter
2878 Double_t scalarproduct =
2879 momPosProp[0]*momNegProp[0]+momPosProp[1]*momNegProp[1]+momPosProp[2]*momNegProp[2];//scalar product of propagated positive and negative daughters' momenta
2881 Double_t chipair = TMath::ACos(scalarproduct/(pEle*pPos));//Angle between propagated daughter tracks
2883 psiPair = TMath::Abs(TMath::ASin(deltat/chipair));
2888 ///________________________________________________________________________
2889 TString AliConversionCuts::GetCutNumber(){
2890 // returns TString with current cut number
2892 for(Int_t ii=0;ii<kNCuts;ii++){
2893 a.Append(Form("%d",fCuts[ii]));
2900 ///________________________________________________________________________
2901 AliConversionCuts* AliConversionCuts::GetStandardCuts2010PbPb(){
2902 //Create and return standard 2010 PbPb cuts
2903 AliConversionCuts *cuts=new AliConversionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
2904 if(!cuts->InitializeCutsFromCutString("9003972054506132212400010020000")){
2905 cout<<"Warning: Initialization of Standardcuts2010PbPB failed"<<endl;}