1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Svein Lindal, Daniel Lohner *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
21 ////////////////////////////////////////////////
23 #include "AliConversionCuts.h"
25 #include "AliKFVertex.h"
26 #include "AliAODTrack.h"
27 #include "AliESDtrack.h"
28 #include "AliAnalysisManager.h"
29 #include "AliInputEventHandler.h"
30 #include "AliMCEventHandler.h"
31 #include "AliAODHandler.h"
32 #include "AliPIDResponse.h"
36 #include "AliAODConversionMother.h"
37 #include "TObjString.h"
38 #include "AliAODEvent.h"
39 #include "AliESDEvent.h"
40 #include "AliCentrality.h"
48 ClassImp(AliConversionCuts)
51 const char* AliConversionCuts::fgkCutNames[AliConversionCuts::kNCuts] = {
63 "LowPRejectionSigmaCut",
65 "piMaxMomdedxSigmaCut",
70 "DegreesForRotationMethod",
80 "DoPhotonAsymmetryCut",
82 "CosinePointingAngle",
88 //________________________________________________________________________
89 AliConversionCuts::AliConversionCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
104 fLineCutZRSlopeMin(0.),
105 fLineCutZValueMin(0),
106 fChi2CutConversion(1000),
108 fPIDProbabilityCutNegativeParticle(0),
109 fPIDProbabilityCutPositiveParticle(0),
110 fDodEdxSigmaCut(kTRUE),
111 fDoTOFsigmaCut(kFALSE), // RRnewTOF
112 fPIDTRDEfficiency(1),
114 fPIDnSigmaAboveElectronLine(100),
115 fPIDnSigmaBelowElectronLine(-100),
116 fTofPIDnSigmaAboveElectronLine(100), // RRnewTOF
117 fTofPIDnSigmaBelowElectronLine(-100), // RRnewTOF
118 fPIDnSigmaAbovePionLine(0),
119 fPIDnSigmaAbovePionLineHighPt(-100),
120 fPIDMinPnSigmaAbovePionLine(0),
121 fPIDMaxPnSigmaAbovePionLine(0),
122 fDoKaonRejectionLowP(kFALSE),
123 fDoProtonRejectionLowP(kFALSE),
124 fDoPionRejectionLowP(kFALSE),
125 fPIDnSigmaAtLowPAroundKaonLine(0),
126 fPIDnSigmaAtLowPAroundProtonLine(0),
127 fPIDnSigmaAtLowPAroundPionLine(0),
128 fPIDMinPKaonRejectionLowP(0),
129 fPIDMinPProtonRejectionLowP(0),
130 fPIDMinPPionRejectionLowP(0),
131 fDoQtGammaSelection(kTRUE),
132 fDoHighPtQtGammaSelection(kFALSE), // RRnew
134 fHighPtQtMax(0.), // RRnew
135 fPtBorderForQt(0), // RRnew
140 fUseEtaMinCut(kFALSE),
141 fUseOnFlyV0Finder(kTRUE),
142 fDoPhotonAsymmetryCut(kTRUE),
143 fMinPPhotonAsymmetryCut(100.),
144 fMinPhotonAsymmetry(0.),
146 fDetectorCentrality(0),
147 fModCentralityClass(0),
151 fUseCorrectedTPCClsInfo(kFALSE),
153 fAlphaMinCutMeson(0),
155 fRapidityCutMeson(1),
156 fUseRotationMethodInBG(kFALSE),
157 fdoBGProbability(kFALSE),
158 fUseTrackMultiplicityForBG(kFALSE),
159 fnDegreeRotationPMForBG(0),
160 fnumberOfRotationEventsForBG(0),
161 fUseMCPSmearing(kFALSE),
166 fMultiplicityMethod(0),
167 fSelectV0AND(kFALSE),
168 fRemovePileUp(kFALSE),
169 fOpeningAngle(0.005),
171 fCosPAngleCut(10000),
172 fDoToCloseV0sCut(kFALSE),
174 fDoSharedElecCut(kFALSE),
175 fOfflineTriggerMask(0),
177 fElectronLabelArray(NULL),
180 hTPCdEdxbefore(NULL),
186 hInvMassbefore(NULL),
187 hArmenterosbefore(NULL),
189 hArmenterosafter(NULL),
190 hAcceptanceCuts(NULL),
200 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
201 fCutString=new TObjString((GetCutNumber()).Data());
204 fBrem = new TF1("fBrem","pow(-log(x),[0]/log(2.0)-1.0)/TMath::Gamma([0]/log(2.0))",0.00001,0.999999999);
205 // tests done with 1.0e-14
206 fBrem->SetParameter(0,fPBremSmearing);
207 fBrem->SetNpx(100000);
210 fElectronLabelArray = new Int_t[500];
213 //________________________________________________________________________
214 AliConversionCuts::~AliConversionCuts() {
216 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
218 // delete fHistograms;
219 // fHistograms = NULL;
220 if(fCutString != NULL){
228 if(fElectronLabelArray){
229 delete fElectronLabelArray;
230 fElectronLabelArray = NULL;
235 //________________________________________________________________________
236 void AliConversionCuts::InitCutHistograms(TString name, Bool_t preCut){
238 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
240 if(fHistograms != NULL){
244 if(fHistograms==NULL){
245 fHistograms=new TList();
246 if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data()));
247 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
251 hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",10,-0.5,9.5);
252 hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
253 hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly");
254 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
255 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
256 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
257 hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail");
258 hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts");
259 hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
260 fHistograms->Add(hCutIndex);
263 hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",10,-0.5,9.5);
264 hTrackCuts->GetXaxis()->SetBinLabel(1,"in");
265 hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign");
266 hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl");
267 hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance");
268 hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept");
269 hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit");
270 hTrackCuts->GetXaxis()->SetBinLabel(7,"kink");
271 hTrackCuts->GetXaxis()->SetBinLabel(8,"out");
272 fHistograms->Add(hTrackCuts);
275 hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",12,-0.5,11.5);
276 hPhotonCuts->GetXaxis()->SetBinLabel(1,"in");
277 hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut");
278 hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2");
279 hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance");
280 hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry");
281 hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob");
282 hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo");
283 hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair");
284 hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle");
285 hPhotonCuts->GetXaxis()->SetBinLabel(10,"out");
286 fHistograms->Add(hPhotonCuts);
289 hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",100,0,0.3);
290 fHistograms->Add(hInvMassbefore);
291 hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,250,0,0.25);
292 fHistograms->Add(hArmenterosbefore);
294 hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",100,0,0.3);
295 fHistograms->Add(hInvMassafter);
296 hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25);
297 fHistograms->Add(hArmenterosafter);
299 hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5);
300 hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
301 hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR");
302 hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR");
303 hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line");
304 hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ");
305 hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta");
306 hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt");
307 hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out");
308 fHistograms->Add(hAcceptanceCuts);
311 hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5);
312 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
313 hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron");
314 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
315 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp");
316 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej");
317 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej");
318 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej");
319 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron");
320 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron");
321 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
322 fHistograms->Add(hdEdxCuts);
324 TAxis *AxisBeforedEdx = NULL;
325 TAxis *AxisBeforeTOF = NULL;
327 hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.05,20,400,-10,10);
328 fHistograms->Add(hTPCdEdxbefore);
329 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
331 hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.05,20,400,-6,10);
332 fHistograms->Add(hTOFbefore);
333 AxisBeforeTOF = hTOFbefore->GetXaxis();
335 hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.05,20,400, -10,10);
336 fHistograms->Add(hTPCdEdxafter);
338 hTOFafter=new TH2F(Form("Gamma_TOF_after %s",GetCutNumber().Data()),"TOF Gamma after" ,150,0.05,20,400,-6,10);
339 fHistograms->Add(hTOFafter);
341 TAxis *AxisAfter = hTPCdEdxafter->GetXaxis();
342 Int_t bins = AxisAfter->GetNbins();
343 Double_t from = AxisAfter->GetXmin();
344 Double_t to = AxisAfter->GetXmax();
345 Double_t *newBins = new Double_t[bins+1];
347 Double_t factor = TMath::Power(to/from, 1./bins);
348 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
349 AxisAfter->Set(bins, newBins);
350 AxisAfter = hTOFafter->GetXaxis();
351 AxisAfter->Set(bins, newBins);
353 AxisBeforedEdx->Set(bins, newBins);
354 AxisBeforeTOF->Set(bins, newBins);
358 // Event Cuts and Info
360 hV0EventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",10,-0.5,9.5);
361 hV0EventCuts->GetXaxis()->SetBinLabel(1,"in");
362 hV0EventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
363 hV0EventCuts->GetXaxis()->SetBinLabel(3,"VertexZ");
364 hV0EventCuts->GetXaxis()->SetBinLabel(4,"nvtxcontr");
365 hV0EventCuts->GetXaxis()->SetBinLabel(5,"pileup");
366 hV0EventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
367 hV0EventCuts->GetXaxis()->SetBinLabel(7,"out");
368 fHistograms->Add(hV0EventCuts);
370 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
371 fHistograms->Add(hCentrality);
372 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
373 fHistograms->Add(hVertexZ);
375 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",4,-0.5,3.5);
376 hTriggerClass->GetXaxis()->SetBinLabel(1,"kAny");
377 hTriggerClass->GetXaxis()->SetBinLabel(2,"kMB");
378 hTriggerClass->GetXaxis()->SetBinLabel(3,"kCentral");
379 hTriggerClass->GetXaxis()->SetBinLabel(4,"kSemiCentral");
380 fHistograms->Add(hTriggerClass);
384 hMesonCuts=new TH1F(Form("MesonCuts %s",GetCutNumber().Data()),"MesonCuts",10,-0.5,9.5);
385 hMesonCuts->GetXaxis()->SetBinLabel(1,"in");
386 hMesonCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
387 hMesonCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
388 hMesonCuts->GetXaxis()->SetBinLabel(4,"opening angle");
389 hMesonCuts->GetXaxis()->SetBinLabel(5,"alpha max");
390 hMesonCuts->GetXaxis()->SetBinLabel(6,"alpha min");
391 hMesonCuts->GetXaxis()->SetBinLabel(7,"out");
392 fHistograms->Add(hMesonCuts);
394 hMesonBGCuts=new TH1F(Form("MesonBGCuts %s",GetCutNumber().Data()),"MesonBGCuts",10,-0.5,9.5);
395 hMesonBGCuts->GetXaxis()->SetBinLabel(1,"in");
396 hMesonBGCuts->GetXaxis()->SetBinLabel(2,"undef rapidity");
397 hMesonBGCuts->GetXaxis()->SetBinLabel(3,"rapidity cut");
398 hMesonBGCuts->GetXaxis()->SetBinLabel(4,"opening angle");
399 hMesonBGCuts->GetXaxis()->SetBinLabel(5,"alpha max");
400 hMesonBGCuts->GetXaxis()->SetBinLabel(6,"alpha min");
401 hMesonBGCuts->GetXaxis()->SetBinLabel(7,"out");
402 fHistograms->Add(hMesonBGCuts);
405 //________________________________________________________________________
406 Bool_t AliConversionCuts::InitPIDResponse(){
407 // Set Pointer to AliPIDResponse
409 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
411 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
412 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
413 if(fPIDResponse)return kTRUE;
419 ///________________________________________________________________________
420 Bool_t AliConversionCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
421 // Process Event Selection
424 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
427 // Check for MC event
429 // Check if MC event is correctly loaded
430 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
435 if (!mcHandler->InitOk() ){
439 if (!mcHandler->TreeK() ){
443 if (!mcHandler->TreeTR() ) {
451 if(!IsTriggerSelected()){
452 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
458 // Z Vertex Position Cut
459 if(!VertexZCut(fInputEvent)){
460 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
466 // Number of Contributors Cut
467 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
468 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
477 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
478 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
485 // Centrality Selection
486 if(!IsCentralitySelected(fInputEvent)){
487 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
493 // Fill Event Histograms
494 if(hV0EventCuts)hV0EventCuts->Fill(cutindex);
495 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
496 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
502 ///________________________________________________________________________
503 Bool_t AliConversionCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){
504 // MonteCarlo Photon Selection
506 if(!fMCStack)return kFALSE;
508 if (particle->GetPdgCode() == 22){
510 if(particle->R() > fMaxR) return kFALSE;
511 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin) return kFALSE;
513 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
514 return kFALSE; // no photon as mothers!
517 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
518 return kFALSE; // the gamma has a mother, and it is not a primary particle
521 if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma
523 // looking for conversion gammas (electron + positron from pairbuilding (= 5) )
524 TParticle* ePos = NULL;
525 TParticle* eNeg = NULL;
527 if(particle->GetNDaughters() >= 2){
528 for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){
529 TParticle *tmpDaughter = fMCStack->Particle(daughterIndex);
530 if(tmpDaughter->GetUniqueID() == 5){
531 if(tmpDaughter->GetPdgCode() == 11){
533 } else if(tmpDaughter->GetPdgCode() == -11){
540 if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production
544 if(ePos->Pt()<fSinglePtCut || eNeg->Pt()<fSinglePtCut){
545 return kFALSE; // no reconstruction below the Pt cut
548 if( TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin ||
549 TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin ) {
554 return kFALSE; // cuts on distance from collision point
557 if(TMath::Abs(ePos->Vz()) > fMaxZ){
558 return kFALSE; // outside material
560 if(TMath::Abs(eNeg->Vz()) > fMaxZ){
561 return kFALSE; // outside material
564 if( ePos->R() <= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
565 return kFALSE; // line cut to exclude regions where we do not reconstruct
566 } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((TMath::Abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
570 if( eNeg->R() <= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){
571 return kFALSE; // line cut to exclude regions where we do not reconstruct
572 } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((TMath::Abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){
577 //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE;
582 //________________________________________________________________________
583 Bool_t AliConversionCuts::MesonIsSelectedMC(TParticle *fMCMother,AliStack *fMCStack,Bool_t bMCDaughtersInAcceptance){
584 // Returns true for all pions within acceptance cuts for decay into 2 photons
585 // If bMCDaughtersInAcceptance is selected, it requires in addition that both daughter photons are within acceptance cuts
587 if(!fMCStack)return kFALSE;
589 if(fMCMother->GetPdgCode()==111 || fMCMother->GetPdgCode()==221){
591 if(fMCMother->R()>fMaxR) return kFALSE; // cuts on distance from collision point
593 Double_t rapidity = 10.;
594 if(fMCMother->Energy() - fMCMother->Pz() == 0 || fMCMother->Energy() + fMCMother->Pz() == 0){
598 rapidity = 0.5*(TMath::Log((fMCMother->Energy()+fMCMother->Pz()) / (fMCMother->Energy()-fMCMother->Pz())));
602 if(TMath::Abs(rapidity)>fRapidityCutMeson)return kFALSE;
604 // Select only -> 2y decay channel
605 if(fMCMother->GetNDaughters()!=2)return kFALSE;
607 for(Int_t i=0;i<2;i++){
608 TParticle *MDaughter=fMCStack->Particle(fMCMother->GetDaughter(i));
610 // Is Daughter a Photon?
611 if(MDaughter->GetPdgCode()!=22)return kFALSE;
612 // Is Photon in Acceptance?
613 if(bMCDaughtersInAcceptance){
614 if(!PhotonIsSelectedMC(MDaughter,fMCStack)){return kFALSE;}
622 ///________________________________________________________________________
623 Bool_t AliConversionCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event)
624 { // Specific Photon Cuts
627 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex);
630 // Fill Histos before Cuts
631 if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass());
632 if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
634 // Gamma selection based on QT from Armenteros
635 if(fDoQtGammaSelection == kTRUE){
636 if(!ArmenterosQtCut(photon)){
637 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1
644 if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){
646 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2
652 // Reconstruction Acceptance Cuts
653 if(!AcceptanceCuts(photon)){
654 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3
660 if(fDoPhotonAsymmetryCut == kTRUE){
661 if(!AsymmetryCut(photon,event)){
662 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4
667 //Check the pid probability
669 if(!PIDProbabilityCut(photon, event)) {
670 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5
675 if(!CorrectedTPCClusterCut(photon, event)) {
676 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6
682 if(!PsiPairCut(photon)) {
683 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7
688 if(!CosinePAngleCut(photon, event)) {
689 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8
694 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9
697 if(hInvMassafter)hInvMassafter->Fill(photon->GetMass());
698 if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt());
705 ///________________________________________________________________________
706 Bool_t AliConversionCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event)
707 { //Cut on corrected TPC Cluster Info
709 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
710 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
712 if(!negTrack||!posTrack)return kFALSE;
714 Double_t negclsToF=0;
716 if (!fUseCorrectedTPCClsInfo ){
717 if(negTrack->GetTPCNclsF()!=0){
718 negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster
721 negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
724 Double_t posclsToF = 0.;
725 if (!fUseCorrectedTPCClsInfo ){
726 if(posTrack->GetTPCNclsF()!=0 ){
727 posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF();
730 posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
733 if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){
740 ///________________________________________________________________________
741 Bool_t AliConversionCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event)
743 //Selection of Reconstructed Photons
745 FillPhotonCutIndex(kPhotonIn);
748 AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative());
749 AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive());
751 if(!negTrack || !posTrack) {
752 FillPhotonCutIndex(kNoTracks);
757 if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) {
758 FillPhotonCutIndex(kdEdxCuts);
763 if(!TracksAreSelected(negTrack, posTrack)){
764 FillPhotonCutIndex(kTrackCuts);
769 if(!PhotonCuts(photon,event)){
770 FillPhotonCutIndex(kPhotonCuts);
774 // Photon passed cuts
775 FillPhotonCutIndex(kPhotonOut);
779 ///________________________________________________________________________
780 Bool_t AliConversionCuts::MesonIsSelected(AliAODConversionMother *pi0,Bool_t IsSignal)
782 // Selection of reconstructed Meson candidates
783 // Use flag IsSignal in order to fill Fill different
784 // histograms for Signal and Background
787 if(IsSignal){hist=hMesonCuts;
789 else{hist=hMesonBGCuts;}
792 if(hist)hist->Fill(cutIndex);
795 // Undefined Rapidity -> Floating Point exception
796 if((pi0->E()+pi0->Pz())/(pi0->E()-pi0->Pz())<=0){
797 if(hist)hist->Fill(cutIndex);
802 // PseudoRapidity Cut --> But we cut on Rapidity !!!
804 if(TMath::Abs(pi0->Rapidity())>fRapidityCutMeson){
805 //if(TMath::Abs(pi0->PseudoRapidity())>fRapidityCutMeson){
806 if(hist)hist->Fill(cutIndex);
813 //fOpeningAngle=2*TMath::ATan(0.134/pi0->P());// physical minimum opening angle
814 if(pi0->GetOpeningAngle()<fOpeningAngle){
815 if(hist)hist->Fill(cutIndex);
821 if(pi0->GetAlpha()>fAlphaCutMeson){
822 if(hist)hist->Fill(cutIndex);
828 if(pi0->GetAlpha()<fAlphaMinCutMeson){
829 if(hist)hist->Fill(cutIndex);
834 if(hist)hist->Fill(cutIndex);
839 ///________________________________________________________________________
840 Bool_t AliConversionCuts::ArmenterosQtCut(AliConversionPhotonBase *photon)
841 { // Armenteros Qt Cut
843 if(fDoHighPtQtGammaSelection){
844 if(photon->GetPhotonPt() < fPtBorderForQt){
845 if(photon->GetArmenterosQt()>fQtMax){
849 if(photon->GetArmenterosQt()>fHighPtQtMax){
855 if(photon->GetArmenterosQt()>fQtMax){
863 ///________________________________________________________________________
864 Bool_t AliConversionCuts::AcceptanceCuts(AliConversionPhotonBase *photon) {
865 // Exclude certain areas for photon reconstruction
868 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
871 if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point
872 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
877 if(photon->GetConversionRadius()<fMinR){ // cuts on distance from collision point
878 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
883 if(photon->GetConversionRadius() <= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){
884 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
887 else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((TMath::Abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
888 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
893 if(TMath::Abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct
894 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
900 if(TMath::Abs(photon->GetPhotonEta())> fEtaCut || TMath::Abs(photon->GetPhotonEta())< fEtaCutMin){
901 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
907 if(photon->GetPhotonPt()<fPtCut){
908 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
913 if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex);
919 ///________________________________________________________________________
920 Bool_t AliConversionCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) {
921 // Track Cuts which require AOD/ESD specific implementation
923 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
924 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
929 AliAODVertex * NegVtxType=negTrack->GetProdVertex();
930 AliAODVertex * PosVtxType=posTrack->GetProdVertex();
931 if((NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) {
932 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
940 ///________________________________________________________________________
941 Bool_t AliConversionCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) {
942 // Track Cuts which require AOD/ESD specific implementation
944 if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) {
945 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
950 if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) {
951 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
959 ///________________________________________________________________________
960 Bool_t AliConversionCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) {
961 // Track Selection for Photon Reconstruction
964 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
968 if(negTrack->Charge() == posTrack->Charge()) {
969 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
974 // Number of TPC Clusters
975 if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) {
976 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
983 if(TMath::Abs(negTrack->Eta()) > fEtaCut || TMath::Abs(negTrack->Eta()) < fEtaCutMin ||
984 TMath::Abs(posTrack->Eta())> fEtaCut || TMath::Abs(posTrack->Eta())< fEtaCutMin) {
985 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
991 if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){
992 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
997 // AOD ESD specific cuts
998 Bool_t passCuts = kTRUE;
1000 if(negTrack->IsA()==AliAODTrack::Class()) {
1001 passCuts = passCuts * SpecificTrackCuts(static_cast<AliAODTrack*>(negTrack), static_cast<AliAODTrack*>(posTrack),cutIndex);
1003 passCuts = passCuts * SpecificTrackCuts(static_cast<AliESDtrack*>(negTrack), static_cast<AliESDtrack*>(posTrack),cutIndex);
1007 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1012 if(hTrackCuts)hTrackCuts->Fill(cutIndex);
1018 ///________________________________________________________________________
1019 Bool_t AliConversionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
1020 // Electron Identification Cuts for Photon reconstruction
1022 if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response
1023 if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error
1026 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1027 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1031 if(fDodEdxSigmaCut == kTRUE){
1032 // TPC Electron Line
1033 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLine ||
1034 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){
1036 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1042 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLine ){
1043 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1044 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1045 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLine){
1047 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1054 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){
1055 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine &&
1056 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLine&&
1057 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineHighPt){
1059 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1067 if(fDoKaonRejectionLowP == kTRUE){
1068 if(fCurrentTrack->P()<fPIDMinPKaonRejectionLowP ){
1069 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
1071 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1078 if(fDoProtonRejectionLowP == kTRUE){
1079 if( fCurrentTrack->P()<fPIDMinPProtonRejectionLowP ){
1080 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
1082 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1089 if(fDoPionRejectionLowP == kTRUE){
1090 if( fCurrentTrack->P()<fPIDMinPPionRejectionLowP ){
1091 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))<fPIDnSigmaAtLowPAroundPionLine){
1093 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1100 if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
1101 if(hTOFbefore) hTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1103 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
1104 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
1105 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1109 if(hTOFafter)hTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
1115 if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){
1117 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1123 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
1124 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
1129 ///________________________________________________________________________
1130 Bool_t AliConversionCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) {
1131 // Cut on Energy Assymetry
1133 for(Int_t ii=0;ii<2;ii++){
1135 AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii));
1137 if( track->P() > fMinPPhotonAsymmetryCut ){
1138 Double_t trackNegAsy=0;
1139 if (photon->GetPhotonP()!=0.){
1140 trackNegAsy= track->P()/photon->GetPhotonP();
1143 if( trackNegAsy<fMinPhotonAsymmetry ||trackNegAsy>(1.- fMinPhotonAsymmetry)){
1152 ///________________________________________________________________________
1153 AliVTrack *AliConversionCuts::GetTrack(AliVEvent * event, Int_t label){
1154 //Returns pointer to the track with given ESD label
1155 //(Important for AOD implementation, since Track array in AOD data is different
1156 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
1158 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1160 if(label > event->GetNumberOfTracks() ) return NULL;
1161 AliESDtrack * track = esdEvent->GetTrack(label);
1165 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
1166 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
1169 if(track->GetID() == label) {
1176 //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks()));
1181 ///________________________________________________________________________
1182 Bool_t AliConversionCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){
1183 // Cut on Electron Probability for Photon Reconstruction
1185 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
1189 Bool_t iResult=kFALSE;
1191 Double_t *posProbArray = new Double_t[AliPID::kSPECIES];
1192 Double_t *negProbArray = new Double_t[AliPID::kSPECIES];
1194 AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative());
1195 AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive());
1197 if(negProbArray && posProbArray){
1199 negTrack->GetTPCpid(negProbArray);
1200 posTrack->GetTPCpid(posProbArray);
1202 if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){
1207 delete [] posProbArray;
1208 delete [] negProbArray;
1212 ///Not possible for AODs
1222 ///________________________________________________________________________
1223 Bool_t AliConversionCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){
1224 // MC Acceptance Cuts
1225 //(Certain areas were excluded for photon reconstruction)
1227 if(particle->R()>fMaxR){
1230 if(ePos->R()>fMaxR){
1234 if(ePos->R()<fMinR){
1238 if( ePos->R() <= ((TMath::Abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){
1241 else if (fUseEtaMinCut && ePos->R() >= ((TMath::Abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){
1245 if(TMath::Abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1249 if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){
1253 if(TMath::Abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct
1257 if(TMath::Abs(particle->Eta())> fEtaCut || TMath::Abs(particle->Eta())< fEtaCutMin){
1261 if(TMath::Abs(ePos->Eta())> fEtaCut || TMath::Abs(ePos->Eta())< fEtaCutMin){
1265 if(TMath::Abs(eNeg->Eta())> fEtaCut || TMath::Abs(eNeg->Eta())< fEtaCutMin){
1269 if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){
1273 if(particle->Pt()<fPtCut){
1279 ///________________________________________________________________________
1280 Bool_t AliConversionCuts::UpdateCutString(cutIds cutID, Int_t value) {
1281 ///Update the cut string (if it has been created yet)
1283 if(fCutString && fCutString->GetString().Length() == kNCuts) {
1284 fCutString->SetString(GetCutNumber());
1291 ///________________________________________________________________________
1292 Bool_t AliConversionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
1293 // Initialize Cuts from a given Cut string
1295 AliInfo(Form("Set Cut Number: %s",analysisCutSelection.Data()));
1296 if(analysisCutSelection.Length()!=kNCuts) {
1297 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
1300 if(!analysisCutSelection.IsDigit()){
1301 AliError("Cut selection contains characters");
1305 const char *cutSelection = analysisCutSelection.Data();
1306 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
1307 for(Int_t ii=0;ii<kNCuts;ii++){
1313 AliError("Analysis Cut Selection does not start with 9");
1318 // Set Individual Cuts
1319 for(Int_t ii=0;ii<kNCuts;ii++){
1320 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
1325 // Set StandardTriggers
1327 if(fIsHeavyIon)SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral);
1328 else SelectCollisionCandidates(AliVEvent::kMB);
1332 ///________________________________________________________________________
1333 Bool_t AliConversionCuts::SetCut(cutIds cutID, const Int_t value) {
1334 ///Set individual cut ID
1339 fCuts[kgoodId] = value;
1341 AliError("First value of cut string is wrong, aborting!!");
1348 if( SetV0Finder(value)) {
1349 fCuts[kv0FinderType] = value;
1350 UpdateCutString(cutID, value);
1352 } else return kFALSE;
1355 if( SetElectronProbCut(value)) {
1356 fCuts[keProbCut] = value;
1357 UpdateCutString(cutID, value);
1359 } else return kFALSE;
1361 case kededxSigmaCut:
1362 if( SetTPCdEdxCutElectronLine(value)) {
1363 fCuts[kededxSigmaCut] = value;
1364 UpdateCutString(cutID, value);
1366 } else return kFALSE;
1368 case kpidedxSigmaCut:
1369 if( SetTPCdEdxCutPionLine(value)) {
1370 fCuts[kpidedxSigmaCut] = value;
1371 UpdateCutString(cutID, value);
1373 } else return kFALSE;
1375 case kpiMomdedxSigmaCut:
1376 if( SetMinMomPiondEdxCut(value)) {
1377 fCuts[kpiMomdedxSigmaCut] = value;
1378 UpdateCutString(cutID, value);
1380 } else return kFALSE;
1383 if( SetChi2GammaCut(value)) {
1384 fCuts[kchi2GammaCut] = value;
1385 UpdateCutString(cutID, value);
1387 } else return kFALSE;
1390 if( SetSinglePtCut(value)) {
1391 fCuts[ksinglePtCut] = value;
1392 UpdateCutString(cutID, value);
1394 } else return kFALSE;
1397 if( SetTPCClusterCut(value)) {
1398 fCuts[kclsTPCCut] = value;
1399 UpdateCutString(cutID, value);
1401 } else return kFALSE;
1404 if( SetEtaCut(value)) {
1405 fCuts[ketaCut] = value;
1406 UpdateCutString(cutID, value);
1408 } else return kFALSE;
1411 if( SetChi2MesonCut(value)) {
1412 fCuts[kchi2MesonCut] = value;
1413 UpdateCutString(cutID, value);
1415 } else return kFALSE;
1417 case kLowPRejectionSigmaCut:
1418 if( SetLowPRejectionCuts(value)) {
1419 fCuts[kLowPRejectionSigmaCut] = value;
1420 UpdateCutString(cutID, value);
1422 } else return kFALSE;
1425 if( SetQtMaxCut(value)) {
1426 fCuts[kQtMaxCut] = value;
1427 UpdateCutString(cutID, value);
1429 } else return kFALSE;
1431 case kpiMaxMomdedxSigmaCut:
1432 if( SetMaxMomPiondEdxCut(value)) {
1433 fCuts[kpiMaxMomdedxSigmaCut] = value;
1434 UpdateCutString(cutID, value);
1436 } else return kFALSE;
1438 case kalphaMesonCut:
1439 if( SetAlphaMesonCut(value)) {
1440 fCuts[kalphaMesonCut] = value;
1441 UpdateCutString(cutID, value);
1443 } else return kFALSE;
1446 if( SetRCut(value)) {
1447 fCuts[kminRCut] = value;
1448 UpdateCutString(cutID, value);
1450 } else return kFALSE;
1452 case kRapidityMesonCut:
1453 if( SetRapidityMesonCut(value)) {
1454 fCuts[kRapidityMesonCut] = value;
1455 UpdateCutString(cutID, value);
1457 } else return kFALSE;
1459 case kBackgroundScheme:
1460 if( SetBackgroundScheme(value)) {
1461 fCuts[kBackgroundScheme] = value;
1462 UpdateCutString(cutID, value);
1464 } else return kFALSE;
1466 case kDegreesForRotationMethod:
1467 if( SetNDegreesForRotationMethod(value)) {
1468 fCuts[kDegreesForRotationMethod] = value;
1469 UpdateCutString(cutID, value);
1471 } else return kFALSE;
1473 case kNumberOfRotations:
1474 if( SetNumberOfRotations(value)) {
1475 fCuts[kNumberOfRotations] = value;
1476 UpdateCutString(cutID, value);
1478 } else return kFALSE;
1481 if( SetRemovePileUp(value)) {
1482 fCuts[kremovePileUp] = value;
1483 UpdateCutString(cutID, value);
1485 } else return kFALSE;
1488 if( SetSelectV0AND(value)) {
1489 fCuts[kselectV0AND] = value;
1490 UpdateCutString(cutID, value);
1492 } else return kFALSE;
1494 case kmultiplicityMethod:
1495 if( SetMultiplicityMethod(value)) {
1496 fCuts[kmultiplicityMethod] = value;
1497 UpdateCutString(cutID, value);
1499 } else return kFALSE;
1502 if( SetIsHeavyIon(value)) {
1503 fCuts[kisHeavyIon] = value;
1504 UpdateCutString(cutID, value);
1506 } else return kFALSE;
1508 case kCentralityMin:
1509 if( SetCentralityMin(value)) {
1510 fCuts[kCentralityMin] = value;
1511 UpdateCutString(cutID, value);
1513 } else return kFALSE;
1515 case kCentralityMax:
1516 if( SetCentralityMax(value)) {
1517 fCuts[kCentralityMax] = value;
1518 UpdateCutString(cutID, value);
1520 } else return kFALSE;
1522 case kTOFelectronPID:
1523 if( SetTOFElectronPIDCut(value)) {
1524 fCuts[kTOFelectronPID] = value;
1525 UpdateCutString(cutID, value);
1527 } else return kFALSE;
1529 case kuseMCPSmearing:
1530 if( SetMCPSmearing(value)) {
1531 fCuts[kuseMCPSmearing] = value;
1532 UpdateCutString(cutID, value);
1534 } else return kFALSE;
1536 case kdoPhotonAsymmetryCut:
1537 if( SetPhotonAsymmetryCut(value)) {
1538 fCuts[kdoPhotonAsymmetryCut] = value;
1539 UpdateCutString(cutID, value);
1541 } else return kFALSE;
1544 if( SetPsiPairCut(value)) {
1545 fCuts[kPsiPair] = value;
1546 UpdateCutString(cutID, value);
1548 } else return kFALSE;
1551 if( SetCosPAngleCut(value)) {
1552 fCuts[kCosPAngle] = value;
1553 UpdateCutString(cutID, value);
1555 } else return kFALSE;
1559 if( SetSharedElectronCut(value)) {
1560 fCuts[kElecShare] = value;
1561 UpdateCutString(cutID, value);
1563 } else return kFALSE;
1567 if( SetToCloseV0sCut(value)) {
1568 fCuts[kToCloseV0s] = value;
1569 UpdateCutString(cutID, value);
1571 } else return kFALSE;
1574 AliError("Cut id out of range");
1578 AliError("Cut id %d not recognized");
1582 ///________________________________________________________________________
1583 Bool_t AliConversionCuts::SetRemovePileUp(Int_t removePileUp)
1585 switch(removePileUp){
1587 fRemovePileUp=kFALSE;
1590 fRemovePileUp=kTRUE;
1593 AliError("RemovePileUpCut not defined");
1599 ///________________________________________________________________________
1600 Bool_t AliConversionCuts::SetSelectV0AND(Int_t selectV0AND)
1602 switch(selectV0AND){
1604 fSelectV0AND=kFALSE;
1610 AliError("Warning: V0ANDCut not defined");
1616 ///________________________________________________________________________
1617 Bool_t AliConversionCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
1620 fMultiplicityMethod=multiplicityMethod;
1622 // 0 Photon Multiplicity
1623 // 1 TPC Track multiplicity
1630 ///________________________________________________________________________
1631 Bool_t AliConversionCuts::SetMCPSmearing(Int_t useMCPSmearing)
1633 switch(useMCPSmearing){
1638 fPSigSmearingCte=0.;
1642 fPBremSmearing=1.0e-14;
1644 fPSigSmearingCte=0.;
1648 fPBremSmearing=1.0e-15;
1650 fPSigSmearingCte=0.;
1655 fPSigSmearing=0.003;
1656 fPSigSmearingCte=0.002;
1661 fPSigSmearing=0.003;
1662 fPSigSmearingCte=0.007;
1667 fPSigSmearing=0.003;
1668 fPSigSmearingCte=0.016;
1673 fPSigSmearing=0.007;
1674 fPSigSmearingCte=0.016;
1678 fPBremSmearing=1.0e-16;
1680 fPSigSmearingCte=0.;
1685 fPSigSmearing=0.007;
1686 fPSigSmearingCte=0.014;
1691 fPSigSmearing=0.007;
1692 fPSigSmearingCte=0.011;
1696 AliError("Warning: UseMCPSmearing not defined");
1702 ///________________________________________________________________________
1703 void AliConversionCuts::PrintCuts() {
1704 // Print out current Cut Selection
1705 for(Int_t ic = 0; ic < kNCuts; ic++) {
1706 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
1711 ///________________________________________________________________________
1712 Bool_t AliConversionCuts::SetRCut(Int_t RCut){
1739 // High purity cuts for PbPb
1746 AliError("RCut not defined");
1752 ///________________________________________________________________________
1753 Bool_t AliConversionCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
1755 switch(ededxSigmaCut){
1757 fPIDnSigmaBelowElectronLine=-10;
1758 fPIDnSigmaAboveElectronLine=10;
1761 fPIDnSigmaBelowElectronLine=-5;
1762 fPIDnSigmaAboveElectronLine=5;
1765 fPIDnSigmaBelowElectronLine=-3;
1766 fPIDnSigmaAboveElectronLine=5;
1769 fPIDnSigmaBelowElectronLine=-4;
1770 fPIDnSigmaAboveElectronLine=5;
1773 fPIDnSigmaBelowElectronLine=-6;
1774 fPIDnSigmaAboveElectronLine=7;
1777 fPIDnSigmaBelowElectronLine=-4;
1778 fPIDnSigmaAboveElectronLine=4;
1781 fPIDnSigmaBelowElectronLine=-2.5;
1782 fPIDnSigmaAboveElectronLine=4;
1785 fPIDnSigmaBelowElectronLine=-2;
1786 fPIDnSigmaAboveElectronLine=3.5;
1789 AliError("TPCdEdxCutElectronLine not defined");
1796 ///________________________________________________________________________
1797 Bool_t AliConversionCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
1800 switch(pidedxSigmaCut){
1802 fPIDnSigmaAbovePionLine=-10;
1803 fPIDnSigmaAbovePionLineHighPt=-10;
1806 fPIDnSigmaAbovePionLine=0;
1807 fPIDnSigmaAbovePionLineHighPt=-10;
1810 fPIDnSigmaAbovePionLine=1;
1811 fPIDnSigmaAbovePionLineHighPt=-10;
1814 fPIDnSigmaAbovePionLine=-1;
1815 fPIDnSigmaAbovePionLineHighPt=-10;
1818 fPIDnSigmaAbovePionLine=2.5;
1819 fPIDnSigmaAbovePionLineHighPt=-10;
1822 fPIDnSigmaAbovePionLine=2.;
1823 fPIDnSigmaAbovePionLineHighPt=-10;
1826 fPIDnSigmaAbovePionLine=2.;
1827 fPIDnSigmaAbovePionLineHighPt=0.5;
1830 fPIDnSigmaAbovePionLine=3.5;
1831 fPIDnSigmaAbovePionLineHighPt=-10;
1834 fPIDnSigmaAbovePionLine=2.;
1835 fPIDnSigmaAbovePionLineHighPt=1.;
1838 fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx
1839 fPIDnSigmaAbovePionLineHighPt=-10;
1842 AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut));
1848 ///________________________________________________________________________
1849 Bool_t AliConversionCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut)
1851 switch(piMomdedxSigmaCut){
1853 fPIDMinPnSigmaAbovePionLine=0.5;
1856 fPIDMinPnSigmaAbovePionLine=1.;
1859 fPIDMinPnSigmaAbovePionLine=1.5;
1862 fPIDMinPnSigmaAbovePionLine=20.;
1865 fPIDMinPnSigmaAbovePionLine=50.;
1868 fPIDMinPnSigmaAbovePionLine=0.3;
1871 fPIDMinPnSigmaAbovePionLine=0.25;
1874 fPIDMinPnSigmaAbovePionLine=0.4;
1877 AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut));
1883 ///________________________________________________________________________
1884 Bool_t AliConversionCuts::SetChi2GammaCut(Int_t chi2GammaCut)
1887 switch(chi2GammaCut){
1889 fChi2CutConversion = 100.;
1892 fChi2CutConversion = 50.;
1895 fChi2CutConversion = 30.;
1898 fChi2CutConversion = 200.;
1901 fChi2CutConversion = 500.;
1904 fChi2CutConversion = 100000.;
1907 fChi2CutConversion = 5.;
1910 fChi2CutConversion = 10.;
1913 fChi2CutConversion = 20.;
1916 fChi2CutConversion = 15.;
1919 AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut));
1925 ///________________________________________________________________________
1926 Bool_t AliConversionCuts::SetV0Finder(Int_t v0FinderType)
1928 switch (v0FinderType){
1929 case 0: // on fly V0 finder
1930 fUseOnFlyV0Finder=kTRUE;
1932 case 1: // offline V0 finder
1933 fUseOnFlyV0Finder=kFALSE;
1936 AliError(Form(" v0FinderType not defined %d",v0FinderType));
1942 ///________________________________________________________________________
1943 Bool_t AliConversionCuts::SetElectronProbCut(Int_t eProbCut)
1948 fPIDProbabilityCutNegativeParticle=0;
1949 fPIDProbabilityCutPositiveParticle=0;
1952 fPIDProbabilityCutNegativeParticle=0.1;
1953 fPIDProbabilityCutPositiveParticle=0.1;
1956 fPIDProbabilityCutNegativeParticle=0.5;
1957 fPIDProbabilityCutPositiveParticle=0.5;
1960 fPIDProbabilityCutNegativeParticle=0.7;
1961 fPIDProbabilityCutPositiveParticle=0.7;
1964 AliError(Form("Warning: eProbCut not defined %d",eProbCut));
1970 ///________________________________________________________________________
1971 Bool_t AliConversionCuts::SetSinglePtCut(Int_t singlePtCut)
1973 switch(singlePtCut){
1974 case 0: // 0.050 GeV
1975 fSinglePtCut = 0.050;
1977 case 1: // 0.100 GeV
1978 fSinglePtCut = 0.100;
1980 case 2: // 0.150 GeV
1981 fSinglePtCut = 0.150;
1983 case 3: // 0.200 GeV
1984 fSinglePtCut = 0.200;
1986 case 4: // 0.075 GeV
1987 fSinglePtCut = 0.075;
1989 case 5: // 0.125 GeV
1990 fSinglePtCut = 0.125;
1993 AliError(Form("singlePtCut not defined %d",singlePtCut));
1998 ///________________________________________________________________________
1999 Bool_t AliConversionCuts::SetTPCClusterCut(Int_t clsTPCCut)
2014 case 4: // 60% of findable clusters
2016 fUseCorrectedTPCClsInfo=0;
2018 case 5: // 0% of findable clusters
2020 fUseCorrectedTPCClsInfo=1;
2022 case 6: // 0% of findable clusters
2024 fUseCorrectedTPCClsInfo=1;
2026 case 7: // 0% of findable clusters
2027 fMinClsTPCToF= 0.35;
2028 fUseCorrectedTPCClsInfo=0;
2031 fMinClsTPCToF= 0.35;
2032 fUseCorrectedTPCClsInfo=1;
2036 fUseCorrectedTPCClsInfo=1;
2039 AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut));
2045 ///________________________________________________________________________
2046 Bool_t AliConversionCuts::SetEtaCut(Int_t etaCut)
2049 //Set Standard LineCutZValues
2050 fLineCutZValueMin = -2;
2051 fLineCutZValue = 7.;
2056 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2058 fLineCutZRSlopeMin = 0.;
2062 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2064 fLineCutZRSlopeMin = 0.;
2068 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2070 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCut)));
2074 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2076 fLineCutZRSlopeMin = 0.;
2080 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2082 fLineCutZRSlopeMin = 0.;
2084 case 5: // 0.9 - 1.4
2086 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2088 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2090 case 6: // 0.9 - 1.2
2092 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2094 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2096 case 7: // 0.1 - 0.8
2098 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2100 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2102 case 8: // 0.1 - 0.8
2104 fLineCutZRSlope = tan(2*atan(exp(-fEtaCut)));
2106 fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin)));
2109 AliError(Form(" EtaCut not defined %d",etaCut));
2115 ///________________________________________________________________________
2116 Bool_t AliConversionCuts::SetChi2MesonCut(Int_t chi2MesonCut)
2118 switch(chi2MesonCut){
2120 fChi2CutMeson = 100.;
2123 fChi2CutMeson = 50.;
2126 fChi2CutMeson = 30.;
2129 fChi2CutMeson = 200.;
2132 fChi2CutMeson = 500.;
2135 fChi2CutMeson = 1000.;
2138 AliError(Form("Chi2MesonCut not defined %d",chi2MesonCut));
2144 ///________________________________________________________________________
2145 Bool_t AliConversionCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut)
2147 switch(piMaxMomdedxSigmaCut){
2149 fPIDMaxPnSigmaAbovePionLine=100.;
2152 fPIDMaxPnSigmaAbovePionLine=5.;
2155 fPIDMaxPnSigmaAbovePionLine=4.;
2158 fPIDMaxPnSigmaAbovePionLine=3.5;
2161 fPIDMaxPnSigmaAbovePionLine=3.;
2164 AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut));
2170 ///________________________________________________________________________
2171 Bool_t AliConversionCuts::SetIsHeavyIon(Int_t isHeavyIon)
2179 fDetectorCentrality=0;
2183 fDetectorCentrality=1;
2185 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
2187 fDetectorCentrality=0;
2188 fModCentralityClass=1;
2190 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
2192 fDetectorCentrality=0;
2193 fModCentralityClass=2;
2196 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
2202 ///________________________________________________________________________
2203 Bool_t AliConversionCuts::SetAlphaMesonCut(Int_t alphaMesonCut)
2205 switch(alphaMesonCut){
2207 fAlphaMinCutMeson = 0.0;
2208 fAlphaCutMeson = 0.7;
2211 fAlphaMinCutMeson = 0.0;
2212 fAlphaCutMeson = 0.5;
2215 fAlphaMinCutMeson = 0.5;
2216 fAlphaCutMeson = 1.;
2219 fAlphaMinCutMeson = 0.0;
2220 fAlphaCutMeson = 1.;
2223 fAlphaMinCutMeson = 0.0;
2224 fAlphaCutMeson = 0.65;
2227 fAlphaMinCutMeson = 0.0;
2228 fAlphaCutMeson = 0.75;
2231 fAlphaMinCutMeson = 0.0;
2232 fAlphaCutMeson = 0.8;
2235 fAlphaMinCutMeson = 0.0;
2236 fAlphaCutMeson = 0.85;
2239 fAlphaMinCutMeson = 0.0;
2240 fAlphaCutMeson = 0.6;
2243 AliError(Form("AlphaMesonCut not defined %d",alphaMesonCut));
2249 ///________________________________________________________________________
2250 Bool_t AliConversionCuts::SetRapidityMesonCut(Int_t RapidityMesonCut)
2252 switch(RapidityMesonCut){
2254 fRapidityCutMeson = 0.9;
2257 fRapidityCutMeson = 0.8;
2260 fRapidityCutMeson = 0.7;
2264 AliError(Form("RapidityMesonCut not defined %d",RapidityMesonCut));
2270 ///________________________________________________________________________
2271 Bool_t AliConversionCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
2273 switch(LowPRejectionSigmaCut){
2275 fPIDnSigmaAtLowPAroundKaonLine=0;
2276 fPIDnSigmaAtLowPAroundProtonLine=0;
2277 fPIDnSigmaAtLowPAroundPionLine=0;
2280 fPIDnSigmaAtLowPAroundKaonLine=0.5;
2281 fPIDnSigmaAtLowPAroundProtonLine=0.5;
2282 fPIDnSigmaAtLowPAroundPionLine=0.5;
2285 fPIDnSigmaAtLowPAroundKaonLine=1;
2286 fPIDnSigmaAtLowPAroundProtonLine=1;
2287 fPIDnSigmaAtLowPAroundPionLine=1;
2290 fPIDnSigmaAtLowPAroundKaonLine=2.;
2291 fPIDnSigmaAtLowPAroundProtonLine=2.;
2292 fPIDnSigmaAtLowPAroundPionLine=2.;
2295 fPIDnSigmaAtLowPAroundKaonLine=0.;
2296 fPIDnSigmaAtLowPAroundProtonLine=0.;
2297 fPIDnSigmaAtLowPAroundPionLine=1;
2300 fPIDnSigmaAtLowPAroundKaonLine=0.;
2301 fPIDnSigmaAtLowPAroundProtonLine=0.;
2302 fPIDnSigmaAtLowPAroundPionLine=1.5;
2305 fPIDnSigmaAtLowPAroundKaonLine=0.;
2306 fPIDnSigmaAtLowPAroundProtonLine=0.;
2307 fPIDnSigmaAtLowPAroundPionLine=2.;
2310 AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut));
2316 ///________________________________________________________________________
2317 Bool_t AliConversionCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
2319 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
2321 fUseTOFpid = kFALSE;
2322 fTofPIDnSigmaBelowElectronLine=-100;
2323 fTofPIDnSigmaAboveElectronLine=100;
2327 fTofPIDnSigmaBelowElectronLine=-7;
2328 fTofPIDnSigmaAboveElectronLine=7;
2332 fTofPIDnSigmaBelowElectronLine=-5;
2333 fTofPIDnSigmaAboveElectronLine=5;
2337 fTofPIDnSigmaBelowElectronLine=-3;
2338 fTofPIDnSigmaAboveElectronLine=5;
2342 fTofPIDnSigmaBelowElectronLine=-2;
2343 fTofPIDnSigmaAboveElectronLine=3;
2346 AliError(Form("TOFElectronCut not defined %d",TOFelectronPID));
2348 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
2352 ///________________________________________________________________________
2353 Bool_t AliConversionCuts::SetTRDElectronCut(Int_t TRDElectronCut)
2355 switch(TRDElectronCut){
2361 fPIDTRDEfficiency=0.1;
2365 fPIDTRDEfficiency=0.8;
2369 fPIDTRDEfficiency=0.9;
2372 AliError(Form("TRDElectronCut not defined %d",TRDElectronCut));
2378 ///________________________________________________________________________
2379 Bool_t AliConversionCuts::SetQtMaxCut(Int_t QtMaxCut)
2384 fDoQtGammaSelection=kFALSE; //No Qt selection (true by default)
2385 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2386 fHighPtQtMax=100.; // RRnew
2387 fPtBorderForQt=100.; // RRnew
2391 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2392 fHighPtQtMax=100.; // RRnew
2393 fPtBorderForQt=100.; // RRnew
2397 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2398 fHighPtQtMax=100.; // RRnew
2399 fPtBorderForQt=100.; // RRnew
2403 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2404 fHighPtQtMax=100.; // RRnew
2405 fPtBorderForQt=100.; // RRnew
2409 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2410 fHighPtQtMax=100.; // RRnew
2411 fPtBorderForQt=100.; // RRnew
2413 case 5: // RR try to improve (get rid of) low InvMass peak in PbPb
2415 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2416 fHighPtQtMax=100.; // RRnew
2417 fPtBorderForQt=100.; // RRnew
2418 break; // end RR ///////////////////////////////////////////////
2419 case 6: // RRnew start: pT dependent qT cut
2421 fDoHighPtQtGammaSelection=kTRUE;
2424 break; // RRnew end ////////////////////////////////////////////
2427 fDoHighPtQtGammaSelection=kFALSE; // RRnew
2428 fHighPtQtMax=100.; // RRnew
2429 fPtBorderForQt=100.; // RRnew
2432 AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut));
2438 //-------------------------------------------------------------
2439 Double_t AliConversionCuts::GetCentrality(AliVEvent *event)
2440 { // Get Event Centrality
2442 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
2444 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
2446 if(fDetectorCentrality==0){
2447 return fESDCentrality->GetCentralityPercentile("V0M"); // default
2449 if(fDetectorCentrality==1){
2450 return fESDCentrality->GetCentralityPercentile("CL1");
2454 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
2456 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
2462 //-------------------------------------------------------------
2463 Bool_t AliConversionCuts::IsCentralitySelected(AliVEvent *event)
2464 { // Centrality Selection
2465 if(!fIsHeavyIon)return kTRUE;
2467 if(fCentralityMin == 0 && fCentralityMax == 0) return kTRUE;//0-100%
2468 if(fCentralityMin >= fCentralityMax) return kTRUE;//0-100%
2470 Double_t centrality=GetCentrality(event);
2471 if(centrality<0)return kFALSE;
2473 Int_t centralityC=0;
2474 if (fModCentralityClass == 0){
2475 centralityC= Int_t(centrality/10);
2476 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
2480 } else if (fModCentralityClass ==1){
2481 centralityC= Int_t(centrality);
2482 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
2487 } else if (fModCentralityClass ==2){
2488 centralityC= Int_t(centrality+1);
2489 if(centralityC >= (fCentralityMin*5+45) && centralityC < (fCentralityMax*5+45))
2497 //-------------------------------------------------------------
2498 Bool_t AliConversionCuts::SetCentralityMin(Int_t minCentrality)
2501 if(minCentrality<0||minCentrality>9){
2502 AliError(Form("minCentrality not defined %d",minCentrality));
2506 fCentralityMin=minCentrality;
2509 //-------------------------------------------------------------
2510 Bool_t AliConversionCuts::SetCentralityMax(Int_t maxCentrality)
2513 if(maxCentrality<0||maxCentrality>9){
2514 AliError(Form("maxCentrality not defined %d",maxCentrality));
2518 fCentralityMax=maxCentrality;
2522 ///________________________________________________________________________
2523 Bool_t AliConversionCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){
2525 switch(doPhotonAsymmetryCut){
2527 fDoPhotonAsymmetryCut=0;
2528 fMinPPhotonAsymmetryCut=100.;
2529 fMinPhotonAsymmetry=0.;
2532 fDoPhotonAsymmetryCut=1;
2533 fMinPPhotonAsymmetryCut=3.5;
2534 fMinPhotonAsymmetry=0.04;
2537 fDoPhotonAsymmetryCut=1;
2538 fMinPPhotonAsymmetryCut=3.5;
2539 fMinPhotonAsymmetry=0.06;
2542 AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut));
2545 fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut;
2549 ///________________________________________________________________________
2550 Bool_t AliConversionCuts::SetBackgroundScheme(Int_t BackgroundScheme){
2552 switch(BackgroundScheme){
2554 fUseRotationMethodInBG=kTRUE;
2555 fdoBGProbability=kFALSE;
2557 case 1: // mixed event with V0 multiplicity
2558 fUseRotationMethodInBG=kFALSE;
2559 fUseTrackMultiplicityForBG=kFALSE;
2560 fdoBGProbability=kFALSE;
2562 case 2: // mixed event with track multiplicity
2563 fUseRotationMethodInBG=kFALSE;
2564 fUseTrackMultiplicityForBG=kTRUE;
2565 fdoBGProbability=kFALSE;
2568 fUseRotationMethodInBG=kTRUE;
2569 fdoBGProbability=kTRUE;
2572 AliError(Form("BackgroundScheme not defined %d",BackgroundScheme));
2578 ///________________________________________________________________________
2579 Bool_t AliConversionCuts::SetNDegreesForRotationMethod(Int_t DegreesForRotationMethod){
2581 switch(DegreesForRotationMethod){
2583 fnDegreeRotationPMForBG = 5;
2586 fnDegreeRotationPMForBG = 10;
2589 fnDegreeRotationPMForBG = 15;
2592 fnDegreeRotationPMForBG = 20;
2595 AliError(Form("DegreesForRotationMethod not defined %d",DegreesForRotationMethod));
2598 fCuts[kDegreesForRotationMethod]=DegreesForRotationMethod;
2602 ///________________________________________________________________________
2603 Bool_t AliConversionCuts::SetNumberOfRotations(Int_t NumberOfRotations)
2605 switch(NumberOfRotations){
2607 fnumberOfRotationEventsForBG = 5;
2610 fnumberOfRotationEventsForBG = 10;
2613 fnumberOfRotationEventsForBG = 15;
2616 fnumberOfRotationEventsForBG = 20;
2619 fnumberOfRotationEventsForBG = 2;
2622 fnumberOfRotationEventsForBG = 50;
2625 fnumberOfRotationEventsForBG = 80;
2628 fnumberOfRotationEventsForBG = 100;
2631 AliError(Form("NumberOfRotations not defined %d",NumberOfRotations));
2637 ///________________________________________________________________________
2638 Bool_t AliConversionCuts::SetPsiPairCut(Int_t psiCut) {
2643 fPsiPairCut = 10000; //
2646 fPsiPairCut = 0.1; //
2649 fPsiPairCut = 0.05; // Standard
2652 fPsiPairCut = 0.035; //
2655 fPsiPairCut = 0.15; //
2658 fPsiPairCut = 0.2; //
2661 fPsiPairCut = 0.03; //
2664 fPsiPairCut = 0.025; //
2667 fPsiPairCut = 0.01; //
2670 AliError(Form("PsiPairCut not defined %d",psiCut));
2677 ///________________________________________________________________________
2678 Bool_t AliConversionCuts::SetCosPAngleCut(Int_t cosCut) {
2682 fCosPAngleCut = TMath::Pi(); //
2685 fCosPAngleCut = 0.1; //
2688 fCosPAngleCut = 0.05; //
2691 fCosPAngleCut = 0.025; // Standard
2694 fCosPAngleCut = 0.01; //
2697 AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut));
2705 ///________________________________________________________________________
2706 Bool_t AliConversionCuts::VertexZCut(AliVEvent *event){
2707 // Cut on z position of primary vertex
2708 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
2710 if(TMath::Abs(fVertexZ)>fMaxVertexZ)return kFALSE;
2714 ///________________________________________________________________________
2715 Bool_t AliConversionCuts::SetSharedElectronCut(Int_t sharedElec) {
2719 fDoSharedElecCut = kFALSE;
2722 fDoSharedElecCut = kTRUE;
2725 AliError(Form("Shared Electron Cut not defined %d",sharedElec));
2732 ///________________________________________________________________________
2733 Bool_t AliConversionCuts::SetToCloseV0sCut(Int_t toClose) {
2737 fDoToCloseV0sCut = kFALSE;
2741 fDoToCloseV0sCut = kTRUE;
2745 fDoToCloseV0sCut = kTRUE;
2749 fDoToCloseV0sCut = kTRUE;
2753 AliError(Form("Shared Electron Cut not defined %d",toClose));
2761 ///________________________________________________________________________
2763 Int_t AliConversionCuts::GetNumberOfContributorsVtx(AliVEvent *event){
2764 // returns number of contributors to the vertex
2766 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2768 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
2769 return fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
2772 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
2774 //-AM test pi0s without SPD only vertex
2775 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2776 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
2779 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2785 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2787 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
2788 return fAODEvent->GetPrimaryVertex()->GetNContributors();
2790 if(fAODEvent->GetPrimaryVertex()->GetNContributors()<1) {
2791 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2792 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
2794 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
2795 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
2805 ///________________________________________________________________________
2807 Bool_t AliConversionCuts::IsTriggerSelected()
2809 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2811 UInt_t isSelected = AliVEvent::kAny;
2812 if( fInputHandler && fInputHandler->GetEventSelection()) {
2813 // Get the actual offline trigger mask for the event and AND it with the
2814 // requested mask. If no mask requested select by default the event.
2815 if (fOfflineTriggerMask)
2816 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
2819 if(!isSelected)return kFALSE;
2823 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(0);
2824 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(1);
2825 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(2);
2826 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(3);
2834 ///________________________________________________________________________
2835 Int_t AliConversionCuts::GetFirstTPCRow(Double_t radius){
2836 // Get first TPC row
2837 Int_t firstTPCRow=0;
2838 Double_t radiusI = 84.8;
2839 Double_t radiusO = 134.6;
2840 Double_t radiusOB = 198.;
2841 Double_t rSizeI = 0.75;
2842 Double_t rSizeO = 1.;
2843 Double_t rSizeOB = 1.5;
2847 if(radius <= radiusI){
2850 if(radius>radiusI && radius<=radiusO){
2851 firstTPCRow = (Int_t)((radius-radiusI)/rSizeI);
2853 if(radius>radiusO && radius<=radiusOB){
2854 firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO);
2857 if(radius>radiusOB){
2858 firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB);
2864 Bool_t AliConversionCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const {
2865 ///Check if passes cosine of pointing angle cut
2866 if(GetCosineOfPointingAngle(photon, event) < (TMath::Cos(fCosPAngleCut))){
2872 Double_t AliConversionCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{
2873 // calculates the pointing angle of the recalculated V0
2875 Double_t momV0[3] = {0,0,0};
2876 if(event->IsA()==AliESDEvent::Class()){
2877 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
2878 AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index());
2879 v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]);
2881 if(event->IsA()==AliAODEvent::Class()){
2882 momV0[0] = photon->GetPx();
2883 momV0[1] = photon->GetPy();
2884 momV0[2] = photon->GetPz();
2887 //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0
2888 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(),
2889 photon->GetConversionY() - event->GetPrimaryVertex()->GetY(),
2890 photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector
2892 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
2893 Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2];
2895 Double_t cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02);
2897 return cosinePointingAngle;
2901 Bool_t AliConversionCuts::PsiPairCut(const AliConversionPhotonBase * photon) const {
2903 if(photon->GetPsiPair() > fPsiPairCut){
2909 ///________________________________________________________________________
2910 TString AliConversionCuts::GetCutNumber(){
2911 // returns TString with current cut number
2913 for(Int_t ii=0;ii<kNCuts;ii++){
2914 a.Append(Form("%d",fCuts[ii]));
2919 ///________________________________________________________________________
2920 void AliConversionCuts::SmearParticle(AliAODConversionPhoton* photon)
2922 Double_t facPBrem = 1.;
2923 Double_t facPSig = 0.;
2932 if( photon->P()!=0){
2933 theta=acos( photon->Pz()/ photon->P());
2936 if( fPSigSmearing != 0. || fPSigSmearingCte!=0. ){
2937 facPSig = TMath::Sqrt(fPSigSmearingCte*fPSigSmearingCte+fPSigSmearing*fPSigSmearing*P*P)*fRandom.Gaus(0.,1.);
2940 if( fPBremSmearing != 1.){
2942 facPBrem = fBrem->GetRandom();
2946 photon->SetPx(facPBrem* (1+facPSig)* P*sin(theta)*cos(phi)) ;
2947 photon->SetPy(facPBrem* (1+facPSig)* P*sin(theta)*sin(phi)) ;
2948 photon->SetPz(facPBrem* (1+facPSig)* P*cos(theta)) ;
2949 photon->SetE(photon->P());
2951 ///________________________________________________________________________
2952 void AliConversionCuts::FillElectonLabelArray(AliAODConversionPhoton* photon, Int_t nV0){
2954 Int_t posLabel = photon->GetTrackLabelPositive();
2955 Int_t negLabel = photon->GetTrackLabelNegative();
2957 fElectronLabelArray[nV0*2] = posLabel;
2958 fElectronLabelArray[(nV0*2)+1] = negLabel;
2960 ///________________________________________________________________________
2961 Bool_t AliConversionCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){
2963 Int_t posLabel = photon->GetTrackLabelPositive();
2964 Int_t negLabel = photon->GetTrackLabelNegative();
2966 for(Int_t i = 0; i<nV0s*2;i++){
2967 if(i==nV0*2) continue;
2968 if(i==(nV0*2)+1) continue;
2969 if(fElectronLabelArray[i] == posLabel){
2971 if(fElectronLabelArray[i] == negLabel){
2977 ///________________________________________________________________________
2978 Bool_t AliConversionCuts::RejectToCloseV0s(AliAODConversionPhoton* photon, TList *photons, Int_t nV0){
2981 Double_t posX = photon->GetConversionX();
2982 Double_t posY = photon->GetConversionY();
2983 Double_t posZ = photon->GetConversionZ();
2985 for(Int_t i = 0;i<photons->GetEntries();i++){
2986 if(nV0 == i) continue;
2987 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
2988 Double_t posCompX = photonComp->GetConversionX();
2989 Double_t posCompY = photonComp->GetConversionY();
2990 Double_t posCompZ = photonComp->GetConversionZ();
2992 Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2);
2994 if(dist < fminV0Dist*fminV0Dist){
2995 if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE;