/**************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Authors: Friederike Bock * * Version 1.0 * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * ***************************************************************************/ //////////////////////////////////////////////// //--------------------------------------------- // Class handling photon selection cuts for // Gamma Conversion analysis //--------------------------------------------- //////////////////////////////////////////////// #include "AliConversionPhotonCuts.h" #include "AliKFVertex.h" #include "AliAODTrack.h" #include "AliESDtrack.h" #include "AliAnalysisManager.h" #include "AliInputEventHandler.h" #include "AliMCEventHandler.h" #include "AliAODHandler.h" #include "AliPIDResponse.h" #include "TH1.h" #include "TH2.h" #include "TF1.h" #include "AliStack.h" #include "AliAODConversionMother.h" #include "TObjString.h" #include "AliAODEvent.h" #include "AliESDEvent.h" #include "AliCentrality.h" #include "TList.h" #include "TFile.h" #include "AliLog.h" #include "AliGenCocktailEventHeader.h" #include "AliGenDPMjetEventHeader.h" #include "AliGenPythiaEventHeader.h" #include "AliGenHijingEventHeader.h" #include "AliTriggerAnalysis.h" #include "AliV0ReaderV1.h" #include "AliAODMCParticle.h" #include "AliAODMCHeader.h" #include "AliTRDTriggerAnalysis.h" class iostream; using namespace std; ClassImp(AliConversionPhotonCuts) const char* AliConversionPhotonCuts::fgkCutNames[AliConversionPhotonCuts::kNCuts] = { "V0FinderType", // 0 "EtaCut", // 1 "MinRCut", // 2 "SinglePtCut", // 3 "ClsTPCCut", // 4 "ededxSigmaCut", // 5 "pidedxSigmaCut", // 6 "piMomdedxSigmaCut", // 7 "piMaxMomdedxSigmaCut", // 8 "LowPRejectionSigmaCut", // 9 "TOFelectronPID", // 10 "QtMaxCut", // 11 "Chi2GammaCut", // 12 "PsiPair", // 13 "DoPhotonAsymmetryCut", // 14 "CosinePointingAngle", // 15 "SharedElectronCuts", // 16 "RejectToCloseV0s", // 17 "DcaRPrimVtx", // 18 "DcaZPrimVtx", // 19 "EvetPlane" // 20 }; //________________________________________________________________________ AliConversionPhotonCuts::AliConversionPhotonCuts(const char *name,const char *title) : AliAnalysisCuts(name,title), fHistograms(NULL), fPIDResponse(NULL), fMaxR(200), fMinR(0), fEtaCut(0.9), fEtaCutMin(-0.1), fPtCut(0.02), fSinglePtCut(0), fMaxZ(1000), fMinClsTPC(0.), fMinClsTPCToF(0.), fLineCutZRSlope(0.), fLineCutZValue(0), fLineCutZRSlopeMin(0.), fLineCutZValueMin(0), fChi2CutConversion(1000), fPIDProbabilityCutNegativeParticle(0), fPIDProbabilityCutPositiveParticle(0), fDodEdxSigmaCut(kTRUE), fDoTOFsigmaCut(kFALSE), fPIDTRDEfficiency(1), fDoTRDPID(kFALSE), fPIDnSigmaAboveElectronLine(100), fPIDnSigmaBelowElectronLine(-100), fTofPIDnSigmaAboveElectronLine(100), fTofPIDnSigmaBelowElectronLine(-100), fPIDnSigmaAbovePionLine(0), fPIDnSigmaAbovePionLineHighPt(-100), fPIDMinPnSigmaAbovePionLine(0), fPIDMaxPnSigmaAbovePionLine(0), fDoKaonRejectionLowP(kFALSE), fDoProtonRejectionLowP(kFALSE), fDoPionRejectionLowP(kFALSE), fPIDnSigmaAtLowPAroundKaonLine(0), fPIDnSigmaAtLowPAroundProtonLine(0), fPIDnSigmaAtLowPAroundPionLine(0), fPIDMinPKaonRejectionLowP(1.5), fPIDMinPProtonRejectionLowP(2), fPIDMinPPionRejectionLowP(0), fDoQtGammaSelection(kTRUE), fDo2DQt(kFALSE), fQtMax(100), fNSigmaMass(0.), fUseEtaMinCut(kFALSE), fUseOnFlyV0Finder(kTRUE), fDoPhotonAsymmetryCut(kTRUE), fMinPPhotonAsymmetryCut(100.), fMinPhotonAsymmetry(0.), fUseCorrectedTPCClsInfo(kFALSE), fUseTOFpid(kFALSE), fOpeningAngle(0.005), fPsiPairCut(10000), fDo2DPsiPairChi2(kFALSE), fCosPAngleCut(10000), fDoToCloseV0sCut(kFALSE), fminV0Dist(200.), fDoSharedElecCut(kFALSE), fDoPhotonQualitySelectionCut(kFALSE), fPhotonQualityCut(0), fRandom(0), fElectronArraySize(500), fElectronLabelArray(NULL), fDCAZPrimVtxCut(1000), fDCARPrimVtxCut(1000), fInPlaneOutOfPlane(0), fConversionPointXArray(0.0), fConversionPointYArray(0.0), fConversionPointZArray(0.0), fCutString(NULL), fIsHeavyIon(0), hEtaDistV0s(NULL), hEtaDistV0sAfterdEdxCuts(NULL), hdEdxCuts(NULL), hTPCdEdxbefore(NULL), hTPCdEdxafter(NULL), hTPCdEdxSigbefore(NULL), hTPCdEdxSigafter(NULL), hTOFbefore(NULL), hTOFSigbefore(NULL), hTOFSigafter(NULL), hPsiPairDeltaPhiafter(NULL), hTrackCuts(NULL), hPhotonCuts(NULL), hInvMassbefore(NULL), hArmenterosbefore(NULL), hInvMassafter(NULL), hArmenterosafter(NULL), hAcceptanceCuts(NULL), hCutIndex(NULL), hEventPlanePhi(NULL), fPreSelCut(kFALSE) { InitPIDResponse(); for(Int_t jj=0;jjSetOwner(kTRUE); if(name=="")fHistograms->SetName(Form("ConvCuts_%s",GetCutNumber().Data())); else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data())); } // IsPhotonSelected hCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",11,-0.5,10.5); hCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in"); hCutIndex->GetXaxis()->SetBinLabel(kOnFly+1,"onfly"); hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks"); hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx"); hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts"); hCutIndex->GetXaxis()->SetBinLabel(kConvPointFail+1,"ConvPoint fail"); hCutIndex->GetXaxis()->SetBinLabel(kPhotonCuts+1,"PhotonCuts"); hCutIndex->GetXaxis()->SetBinLabel(kEventPlane+1,"EventPlane"); hCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out"); fHistograms->Add(hCutIndex); // Track Cuts hTrackCuts=new TH1F(Form("TrackCuts %s",GetCutNumber().Data()),"TrackCuts",9,-0.5,8.5); hTrackCuts->GetXaxis()->SetBinLabel(1,"in"); hTrackCuts->GetXaxis()->SetBinLabel(2,"likesign"); hTrackCuts->GetXaxis()->SetBinLabel(3,"ntpccl"); hTrackCuts->GetXaxis()->SetBinLabel(4,"acceptance"); hTrackCuts->GetXaxis()->SetBinLabel(5,"singlept"); hTrackCuts->GetXaxis()->SetBinLabel(6,"TPCrefit"); hTrackCuts->GetXaxis()->SetBinLabel(7,"kink"); hTrackCuts->GetXaxis()->SetBinLabel(8,"out"); fHistograms->Add(hTrackCuts); // Photon Cuts hPhotonCuts=new TH1F(Form("PhotonCuts %s",GetCutNumber().Data()),"PhotonCuts",15,-0.5,14.5); hPhotonCuts->GetXaxis()->SetBinLabel(1,"in"); hPhotonCuts->GetXaxis()->SetBinLabel(2,"qtcut"); hPhotonCuts->GetXaxis()->SetBinLabel(3,"chi2"); hPhotonCuts->GetXaxis()->SetBinLabel(4,"acceptance"); hPhotonCuts->GetXaxis()->SetBinLabel(5,"asymmetry"); hPhotonCuts->GetXaxis()->SetBinLabel(6,"pidprob"); hPhotonCuts->GetXaxis()->SetBinLabel(7,"cortpcclinfo"); hPhotonCuts->GetXaxis()->SetBinLabel(8,"PsiPair"); hPhotonCuts->GetXaxis()->SetBinLabel(9,"CosPAngle"); hPhotonCuts->GetXaxis()->SetBinLabel(10,"DCA R"); hPhotonCuts->GetXaxis()->SetBinLabel(11,"DCA Z"); hPhotonCuts->GetXaxis()->SetBinLabel(12,"Photon Quality"); hPhotonCuts->GetXaxis()->SetBinLabel(13,"out"); fHistograms->Add(hPhotonCuts); if(preCut){ hInvMassbefore=new TH1F(Form("InvMass_before %s",GetCutNumber().Data()),"InvMass_before",1000,0,0.3); fHistograms->Add(hInvMassbefore); hArmenterosbefore=new TH2F(Form("Armenteros_before %s",GetCutNumber().Data()),"Armenteros_before",200,-1,1,1000,0,1.); fHistograms->Add(hArmenterosbefore); hEtaDistV0s = new TH1F(Form("Eta_before %s",GetCutNumber().Data()),"Eta_before",2000,-2,2); fHistograms->Add(hEtaDistV0s); } hInvMassafter=new TH1F(Form("InvMass_after %s",GetCutNumber().Data()),"InvMass_after",1000,0,0.3); fHistograms->Add(hInvMassafter); hArmenterosafter=new TH2F(Form("Armenteros_after %s",GetCutNumber().Data()),"Armenteros_after",200,-1,1,250,0,0.25); fHistograms->Add(hArmenterosafter); hAcceptanceCuts=new TH1F(Form("PhotonAcceptanceCuts %s",GetCutNumber().Data()),"PhotonAcceptanceCuts",10,-0.5,9.5); hAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in"); hAcceptanceCuts->GetXaxis()->SetBinLabel(2,"maxR"); hAcceptanceCuts->GetXaxis()->SetBinLabel(3,"minR"); hAcceptanceCuts->GetXaxis()->SetBinLabel(4,"line"); hAcceptanceCuts->GetXaxis()->SetBinLabel(5,"maxZ"); hAcceptanceCuts->GetXaxis()->SetBinLabel(6,"eta"); hAcceptanceCuts->GetXaxis()->SetBinLabel(7,"minpt"); hAcceptanceCuts->GetXaxis()->SetBinLabel(8,"out"); fHistograms->Add(hAcceptanceCuts); // dEdx Cuts hdEdxCuts=new TH1F(Form("dEdxCuts %s",GetCutNumber().Data()),"dEdxCuts",10,-0.5,9.5); hdEdxCuts->GetXaxis()->SetBinLabel(1,"in"); hdEdxCuts->GetXaxis()->SetBinLabel(2,"TPCelectron"); hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion"); hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpionhighp"); hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCkaonlowprej"); hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCprotonlowprej"); hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCpionlowprej"); hdEdxCuts->GetXaxis()->SetBinLabel(8,"TOFelectron"); hdEdxCuts->GetXaxis()->SetBinLabel(9,"TRDelectron"); hdEdxCuts->GetXaxis()->SetBinLabel(10,"out"); fHistograms->Add(hdEdxCuts); TAxis *AxisBeforedEdx = NULL; TAxis *AxisBeforedEdxSig = NULL; TAxis *AxisBeforeTOF = NULL; TAxis *AxisBeforeTOFSig = NULL; if(preCut){ hTPCdEdxbefore=new TH2F(Form("Gamma_dEdx_before %s",GetCutNumber().Data()),"dEdx Gamma before" ,150,0.03,20,800,0,200); fHistograms->Add(hTPCdEdxbefore); AxisBeforedEdx = hTPCdEdxbefore->GetXaxis(); hTPCdEdxSigbefore=new TH2F(Form("Gamma_dEdxSig_before %s",GetCutNumber().Data()),"dEdx Sigma Gamma before" ,150,0.03,20,400,-10,10); fHistograms->Add(hTPCdEdxSigbefore); AxisBeforedEdxSig = hTPCdEdxSigbefore->GetXaxis(); hTOFbefore=new TH2F(Form("Gamma_TOF_before %s",GetCutNumber().Data()),"TOF Gamma before" ,150,0.03,20,11000,-1000,10000); fHistograms->Add(hTOFbefore); AxisBeforeTOF = hTOFbefore->GetXaxis(); hTOFSigbefore=new TH2F(Form("Gamma_TOFSig_before %s",GetCutNumber().Data()),"TOF Sigma Gamma before" ,150,0.03,20,400,-6,10); fHistograms->Add(hTOFSigbefore); AxisBeforeTOFSig = hTOFSigbefore->GetXaxis(); } hTPCdEdxSigafter=new TH2F(Form("Gamma_dEdxSig_after %s",GetCutNumber().Data()),"dEdx Sigma Gamma after" ,150,0.03,20,400, -10,10); fHistograms->Add(hTPCdEdxSigafter); hTPCdEdxafter=new TH2F(Form("Gamma_dEdx_after %s",GetCutNumber().Data()),"dEdx Gamma after" ,150,0.03,20,800,0,200); fHistograms->Add(hTPCdEdxafter); hTOFSigafter=new TH2F(Form("Gamma_TOFSig_after %s",GetCutNumber().Data()),"TOF Sigma Gamma after" ,150,0.03,20,400,-6,10); fHistograms->Add(hTOFSigafter); hEtaDistV0sAfterdEdxCuts = new TH1F(Form("Eta_afterdEdx %s",GetCutNumber().Data()),"Eta_afterdEdx",2000,-2,2); fHistograms->Add(hEtaDistV0sAfterdEdxCuts); hPsiPairDeltaPhiafter=new TH2F(Form("Gamma_PsiPairDeltaPhi_after %s",GetCutNumber().Data()),"Psi Pair vs Delta Phi Gamma after" ,200,-2,2,200,-2,2); fHistograms->Add(hPsiPairDeltaPhiafter); TAxis *AxisAfter = hTPCdEdxSigafter->GetXaxis(); Int_t bins = AxisAfter->GetNbins(); Double_t from = AxisAfter->GetXmin(); Double_t to = AxisAfter->GetXmax(); Double_t *newBins = new Double_t[bins+1]; newBins[0] = from; Double_t factor = TMath::Power(to/from, 1./bins); for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1]; AxisAfter->Set(bins, newBins); AxisAfter = hTOFSigafter->GetXaxis(); AxisAfter->Set(bins, newBins); AxisAfter = hTPCdEdxafter->GetXaxis(); AxisAfter->Set(bins, newBins); if(preCut){ AxisBeforedEdx->Set(bins, newBins); AxisBeforeTOF->Set(bins, newBins); AxisBeforedEdxSig->Set(bins, newBins); AxisBeforeTOFSig->Set(bins, newBins); } delete [] newBins; // Event Cuts and Info if(!preCut){ hEventPlanePhi=new TH1F(Form("EventPlaneMinusPhotonAngle %s",GetCutNumber().Data()),"EventPlaneMinusPhotonAngle",360,-TMath::Pi(),TMath::Pi()); fHistograms->Add(hEventPlanePhi); } TH1::AddDirectory(kTRUE); } //________________________________________________________________________ Bool_t AliConversionPhotonCuts::InitPIDResponse(){ // Set Pointer to AliPIDResponse AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); if(man) { AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse(); if(fPIDResponse)return kTRUE; } return kFALSE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PhotonIsSelectedMC(TParticle *particle,AliStack *fMCStack,Bool_t checkForConvertedGamma){ // MonteCarlo Photon Selection if(!fMCStack)return kFALSE; if (particle->GetPdgCode() == 22){ if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) ) return kFALSE; if(fEtaCutMin>-0.1){ if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) ) return kFALSE; } if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){ return kFALSE; // no photon as mothers! } if(particle->GetMother(0) >= fMCStack->GetNprimary()){ return kFALSE; // the gamma has a mother, and it is not a primary particle } if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma // looking for conversion gammas (electron + positron from pairbuilding (= 5) ) TParticle* ePos = NULL; TParticle* eNeg = NULL; if(particle->GetNDaughters() >= 2){ for(Int_t daughterIndex=particle->GetFirstDaughter();daughterIndex<=particle->GetLastDaughter();daughterIndex++){ TParticle *tmpDaughter = fMCStack->Particle(daughterIndex); if(tmpDaughter->GetUniqueID() == 5){ if(tmpDaughter->GetPdgCode() == 11){ eNeg = tmpDaughter; } else if(tmpDaughter->GetPdgCode() == -11){ ePos = tmpDaughter; } } } } if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production return kFALSE; } if(ePos->Pt()Pt()Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) || eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) ) return kFALSE; if(fEtaCutMin > -0.1){ if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) || (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) ) return kFALSE; } if(ePos->R()>fMaxR){ return kFALSE; // cuts on distance from collision point } if(abs(ePos->Vz()) > fMaxZ){ return kFALSE; // outside material } if(abs(eNeg->Vz()) > fMaxZ){ return kFALSE; // outside material } if( ePos->R() <= ((abs(ePos->Vz()) * fLineCutZRSlope) - fLineCutZValue)){ return kFALSE; // line cut to exclude regions where we do not reconstruct } else if ( fEtaCutMin != -0.1 && ePos->R() >= ((abs(ePos->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){ return kFALSE; } if( eNeg->R() <= ((abs(eNeg->Vz()) * fLineCutZRSlope) - fLineCutZValue)){ return kFALSE; // line cut to exclude regions where we do not reconstruct } else if ( fEtaCutMin != -0.1 && eNeg->R() >= ((abs(eNeg->Vz()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){ return kFALSE; } return kTRUE; //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE; } return kFALSE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PhotonIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray,Bool_t checkForConvertedGamma){ // MonteCarlo Photon Selection if(!aodmcArray)return kFALSE; if (particle->GetPdgCode() == 22){ if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) ) return kFALSE; if(fEtaCutMin>-0.1){ if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) ) return kFALSE; } if(particle->GetMother() > -1){ if((static_cast(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){ return kFALSE; // no photon as mothers! } if(!(static_cast(aodmcArray->At(particle->GetMother()))->IsPrimary())){ return kFALSE; // the gamma has a mother, and it is not a primary particle } } if(!checkForConvertedGamma) return kTRUE; // return in case of accepted gamma // looking for conversion gammas (electron + positron from pairbuilding (= 5) ) AliAODMCParticle* ePos = NULL; AliAODMCParticle* eNeg = NULL; if(particle->GetNDaughters() >= 2){ for(Int_t daughterIndex=particle->GetDaughter(0);daughterIndex<=particle->GetDaughter(1);daughterIndex++){ AliAODMCParticle *tmpDaughter = static_cast(aodmcArray->At(daughterIndex)); if(!tmpDaughter) continue; if(((tmpDaughter->GetMCProcessCode())) == 5){ // STILL A BUG IN ALIROOT >>8 HAS TPO BE REMOVED AFTER FIX if(tmpDaughter->GetPdgCode() == 11){ eNeg = tmpDaughter; } else if(tmpDaughter->GetPdgCode() == -11){ ePos = tmpDaughter; } } } } if(ePos == NULL || eNeg == NULL){ // means we do not have two daughters from pair production return kFALSE; } if(ePos->Pt()Pt()Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) || eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) ) return kFALSE; if(fEtaCutMin > -0.1){ if( (ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin)) || (eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin)) ) return kFALSE; } Double_t rPos = sqrt( (ePos->Xv()*ePos->Xv()) + (ePos->Yv()*ePos->Yv()) ); Double_t rNeg = sqrt( (eNeg->Xv()*eNeg->Xv()) + (eNeg->Yv()*eNeg->Yv()) ); if(rPos>fMaxR){ return kFALSE; // cuts on distance from collision point } if(abs(ePos->Zv()) > fMaxZ){ return kFALSE; // outside material } if(abs(eNeg->Zv()) > fMaxZ){ return kFALSE; // outside material } if( rPos <= ((abs(ePos->Zv()) * fLineCutZRSlope) - fLineCutZValue)){ return kFALSE; // line cut to exclude regions where we do not reconstruct } else if ( fEtaCutMin != -0.1 && rPos >= ((abs(ePos->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){ return kFALSE; } if( rNeg <= ((abs(eNeg->Zv()) * fLineCutZRSlope) - fLineCutZValue)){ return kFALSE; // line cut to exclude regions where we do not reconstruct } else if ( fEtaCutMin != -0.1 && rNeg >= ((abs(eNeg->Zv()) * fLineCutZRSlopeMin) - fLineCutZValueMin)){ return kFALSE; } return kTRUE; //if(AcceptanceCut(particle,ePos,eNeg))return kTRUE; } return kFALSE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PhotonCuts(AliConversionPhotonBase *photon,AliVEvent *event) { // Specific Photon Cuts Int_t cutIndex = 0; if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); cutIndex++; // Fill Histos before Cuts if(hInvMassbefore)hInvMassbefore->Fill(photon->GetMass()); if(hArmenterosbefore)hArmenterosbefore->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt()); // Gamma selection based on QT from Armenteros if(fDoQtGammaSelection == kTRUE){ if(!ArmenterosQtCut(photon)){ if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //1 return kFALSE; } } cutIndex++; //2 // Chi Cut if(photon->GetChi2perNDF() > fChi2CutConversion || photon->GetChi2perNDF() <=0){ { if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //2 return kFALSE; } } cutIndex++;//3 // Reconstruction Acceptance Cuts if(!AcceptanceCuts(photon)){ if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //3 return kFALSE; } cutIndex++; //4 // Asymmetry Cut if(fDoPhotonAsymmetryCut == kTRUE){ if(!AsymmetryCut(photon,event)){ if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //4 return kFALSE; } } //Check the pid probability cutIndex++; //5 if(!PIDProbabilityCut(photon, event)) { if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //5 return kFALSE; } cutIndex++; //6 if(!CorrectedTPCClusterCut(photon, event)) { if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //6 return kFALSE; } Double_t magField = event->GetMagneticField(); if( magField < 0.0 ){ magField = 1.0; } else { magField = -1.0; } AliVTrack * electronCandidate = GetTrack(event,photon->GetTrackLabelNegative() ); AliVTrack * positronCandidate = GetTrack(event,photon->GetTrackLabelPositive() ); Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->Phi()-positronCandidate->Phi()); cutIndex++; //7 if(!PsiPairCut(photon)) { if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //7 return kFALSE; } cutIndex++; //8 if(!CosinePAngleCut(photon, event)) { if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //8 return kFALSE; } AliAODConversionPhoton* photonAOD = dynamic_cast(photon); if (photonAOD){ photonAOD->CalculateDistanceOfClossetApproachToPrimVtx(event->GetPrimaryVertex()); cutIndex++; //9 if(photonAOD->GetDCArToPrimVtx() > fDCARPrimVtxCut) { //DCA R cut of photon to primary vertex if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //9 return kFALSE; } cutIndex++; //10 if(abs(photonAOD->GetDCAzToPrimVtx()) > fDCAZPrimVtxCut) { //DCA Z cut of photon to primary vertex if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //10 return kFALSE; } } else { cutIndex++; //9 cutIndex++; //10 } cutIndex++; //11 if (photonAOD){ UChar_t photonQuality = 0; AliAODEvent * aodEvent = dynamic_cast(event); if(aodEvent) { photonQuality = DeterminePhotonQualityAOD(photonAOD, event); } else { photonQuality = photonAOD->GetPhotonQuality(); } if (fDoPhotonQualitySelectionCut && photonQuality != fPhotonQualityCut){ if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11 return kFALSE; } } cutIndex++; //12 if(hPhotonCuts)hPhotonCuts->Fill(cutIndex); //11 // Histos after Cuts if(hInvMassafter)hInvMassafter->Fill(photon->GetMass()); if(hArmenterosafter)hArmenterosafter->Fill(photon->GetArmenterosAlpha(),photon->GetArmenterosQt()); if(hPsiPairDeltaPhiafter)hPsiPairDeltaPhiafter->Fill(deltaPhi,photon->GetPsiPair()); return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::CorrectedTPCClusterCut(AliConversionPhotonBase *photon, AliVEvent * event) { //Cut on corrected TPC Cluster Info AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative()); AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive()); if(!negTrack||!posTrack)return kFALSE; Double_t negclsToF=0; if (!fUseCorrectedTPCClsInfo ){ if(negTrack->GetTPCNclsF()!=0){ negclsToF = (Double_t)negTrack->GetNcls(1)/(Double_t)negTrack->GetTPCNclsF();}// Ncluster/Nfindablecluster } else { negclsToF = negTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius())); } Double_t posclsToF = 0.; if (!fUseCorrectedTPCClsInfo ){ if(posTrack->GetTPCNclsF()!=0){ posclsToF = (Double_t)posTrack->GetNcls(1)/(Double_t)posTrack->GetTPCNclsF(); } }else{ posclsToF = posTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius())); } if( negclsToF < fMinClsTPCToF || posclsToF < fMinClsTPCToF ){ return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent * event) { //Selection of Reconstructed Photons FillPhotonCutIndex(kPhotonIn); if(event->IsA()==AliESDEvent::Class()) { if(!SelectV0Finder( ( ((AliESDEvent*)event)->GetV0(photon->GetV0Index()))->GetOnFlyStatus() ) ){ FillPhotonCutIndex(kOnFly); return kFALSE; } } // else if(event->IsA()==AliAODEvent::Class()) { // if(!SelectV0Finder( ( ((AliAODEvent*)event)->GetV0(photon->GetV0Index())) ) ){ // FillPhotonCutIndex(kOnFly); // return kFALSE; // } // } // Get Tracks AliVTrack * negTrack = GetTrack(event, photon->GetTrackLabelNegative()); AliVTrack * posTrack = GetTrack(event, photon->GetTrackLabelPositive()); if(!negTrack || !posTrack) { FillPhotonCutIndex(kNoTracks); return kFALSE; } photon->DeterminePhotonQuality(negTrack,posTrack); // Track Cuts if(!TracksAreSelected(negTrack, posTrack)){ FillPhotonCutIndex(kTrackCuts); return kFALSE; } if (hEtaDistV0s)hEtaDistV0s->Fill(photon->GetPhotonEta()); // dEdx Cuts if(!dEdxCuts(negTrack) || !dEdxCuts(posTrack)) { FillPhotonCutIndex(kdEdxCuts); return kFALSE; } if (hEtaDistV0sAfterdEdxCuts)hEtaDistV0sAfterdEdxCuts->Fill(photon->GetPhotonEta()); // Photon Cuts if(!PhotonCuts(photon,event)){ FillPhotonCutIndex(kPhotonCuts); return kFALSE; } // Photon passed cuts FillPhotonCutIndex(kPhotonOut); return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::ArmenterosQtCut(AliConversionPhotonBase *photon) { // Armenteros Qt Cut if(fDo2DQt){ if ( !(TMath::Power(photon->GetArmenterosAlpha()/0.95,2)+TMath::Power(photon->GetArmenterosQt()/fQtMax,2) < 1) ){ return kFALSE; } } else { if(photon->GetArmenterosQt()>fQtMax){ return kFALSE; } } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::AcceptanceCuts(AliConversionPhotonBase *photon) { // Exclude certain areas for photon reconstruction Int_t cutIndex=0; if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); cutIndex++; if(photon->GetConversionRadius()>fMaxR){ // cuts on distance from collision point if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } cutIndex++; if(photon->GetConversionRadius()Fill(cutIndex); return kFALSE; } cutIndex++; if(photon->GetConversionRadius() <= ((abs(photon->GetConversionZ())*fLineCutZRSlope)-fLineCutZValue)){ if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } else if (fUseEtaMinCut && photon->GetConversionRadius() >= ((abs(photon->GetConversionZ())*fLineCutZRSlopeMin)-fLineCutZValueMin )){ if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } cutIndex++; if(abs(photon->GetConversionZ()) > fMaxZ ){ // cuts out regions where we do not reconstruct if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } cutIndex++; if( photon->GetPhotonEta() > (fEtaCut) || photon->GetPhotonEta() < (-fEtaCut) ){ if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } if(fEtaCutMin>-0.1){ if( photon->GetPhotonEta() < (fEtaCutMin) && photon->GetPhotonEta() > (-fEtaCutMin) ){ if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kFALSE; } } cutIndex++; if(photon->GetPhotonPt()Fill(cutIndex); return kFALSE; } cutIndex++; if(hAcceptanceCuts)hAcceptanceCuts->Fill(cutIndex); return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SpecificTrackCuts(AliAODTrack * negTrack, AliAODTrack * posTrack,Int_t &cutIndex) { // Track Cuts which require AOD/ESD specific implementation if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; AliAODVertex * NegVtxType=negTrack->GetProdVertex(); AliAODVertex * PosVtxType=posTrack->GetProdVertex(); if( (NegVtxType->GetType())==AliAODVertex::kKink || (PosVtxType->GetType())==AliAODVertex::kKink) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SpecificTrackCuts(AliESDtrack * negTrack, AliESDtrack * posTrack,Int_t &cutIndex) { // Track Cuts which require AOD/ESD specific implementation if( !negTrack->IsOn(AliESDtrack::kTPCrefit) || !posTrack->IsOn(AliESDtrack::kTPCrefit) ) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; if(negTrack->GetKinkIndex(0) > 0 || posTrack->GetKinkIndex(0) > 0 ) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::TracksAreSelected(AliVTrack * negTrack, AliVTrack * posTrack) { // Track Selection for Photon Reconstruction Int_t cutIndex=0; if(hTrackCuts)hTrackCuts->Fill(cutIndex); cutIndex++; // avoid like sign if(negTrack->Charge() == posTrack->Charge()) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; // Number of TPC Clusters if( negTrack->GetNcls(1) < fMinClsTPC || posTrack->GetNcls(1) < fMinClsTPC ) { if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; // Acceptance if( posTrack->Eta() > (fEtaCut) || posTrack->Eta() < (-fEtaCut) || negTrack->Eta() > (fEtaCut) || negTrack->Eta() < (-fEtaCut) ){ if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } if(fEtaCutMin>-0.1){ if( (posTrack->Eta() < (fEtaCutMin) && posTrack->Eta() > (-fEtaCutMin)) || (negTrack->Eta() < (fEtaCutMin) && negTrack->Eta() > (-fEtaCutMin)) ){ if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } } cutIndex++; // Single Pt Cut if( negTrack->Pt()< fSinglePtCut || posTrack->Pt()< fSinglePtCut){ if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; // AOD ESD specific cuts Bool_t passCuts = kTRUE; if(negTrack->IsA()==AliAODTrack::Class()) { passCuts = passCuts * SpecificTrackCuts(static_cast(negTrack), static_cast(posTrack),cutIndex); } else { passCuts = passCuts * SpecificTrackCuts(static_cast(negTrack), static_cast(posTrack),cutIndex); } if(!passCuts){ if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kFALSE; } cutIndex++; if(hTrackCuts)hTrackCuts->Fill(cutIndex); return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::dEdxCuts(AliVTrack *fCurrentTrack){ // Electron Identification Cuts for Photon reconstruction if(!fPIDResponse){InitPIDResponse();}// Try to reinitialize PID Response if(!fPIDResponse){AliError("No PID Response"); return kTRUE;}// if still missing fatal error Int_t cutIndex=0; if(hdEdxCuts)hdEdxCuts->Fill(cutIndex); if(hTPCdEdxSigbefore)hTPCdEdxSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron)); if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal()); cutIndex++; if(fDodEdxSigmaCut == kTRUE){ // TPC Electron Line if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLine){ if(hdEdxCuts)hdEdxCuts->Fill(cutIndex); return kFALSE; } cutIndex++; // TPC Pion Line if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLine && fCurrentTrack->P()NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine && fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)Fill(cutIndex); return kFALSE; } } cutIndex++; // High Pt Pion rej if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLine ){ if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLine && fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)Fill(cutIndex); return kFALSE; } } cutIndex++; } else{cutIndex+=3;} if(fDoKaonRejectionLowP == kTRUE){ if(fCurrentTrack->P()NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))Fill(cutIndex); return kFALSE; } } } cutIndex++; if(fDoProtonRejectionLowP == kTRUE){ if( fCurrentTrack->P()NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))Fill(cutIndex); return kFALSE; } } } cutIndex++; if(fDoPionRejectionLowP == kTRUE){ if( fCurrentTrack->P()NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion))Fill(cutIndex); return kFALSE; } } } cutIndex++; // cout<<"Start"<CheckPIDStatus(AliPIDResponse::kTOF,fCurrentTrack); // if( ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) && ( (status & AliVTrack::kTIME) == AliVTrack::kTIME )) // {cout<<"TOF DA"<GetTOFMismatchProbability(fCurrentTrack); // cout<<"--> "< 0.01){ // } // } if((fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid) && !(fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch)){ if(hTOFbefore){ Double_t t0 = fPIDResponse->GetTOFResponse().GetStartTime(fCurrentTrack->P()); Double_t times[AliPID::kSPECIESC]; fCurrentTrack->GetIntegratedTimes(times); Double_t TOFsignal = fCurrentTrack->GetTOFsignal(); Double_t dT = TOFsignal - t0 - times[0]; hTOFbefore->Fill(fCurrentTrack->P(),dT); } if(hTOFSigbefore) hTOFSigbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)); if(fUseTOFpid){ if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine || fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)Fill(cutIndex); return kFALSE; } } if(hTOFSigafter)hTOFSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)); } cutIndex++; // Apply TRD PID if(fDoTRDPID){ if(!fPIDResponse->IdentifiedAsElectronTRD(fCurrentTrack,fPIDTRDEfficiency)){ if(hdEdxCuts)hdEdxCuts->Fill(cutIndex); return kFALSE; } } cutIndex++; if(hdEdxCuts)hdEdxCuts->Fill(cutIndex); if(hTPCdEdxSigafter)hTPCdEdxSigafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron)); if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fCurrentTrack->GetTPCsignal()); return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::AsymmetryCut(AliConversionPhotonBase * photon,AliVEvent *event) { // Cut on Energy Assymetry for(Int_t ii=0;ii<2;ii++){ AliVTrack *track=GetTrack(event,photon->GetTrackLabel(ii)); if( track->P() > fMinPPhotonAsymmetryCut ){ Double_t trackNegAsy=0; if (photon->GetPhotonP()!=0.){ trackNegAsy= track->P()/photon->GetPhotonP(); } if( trackNegAsy(1.- fMinPhotonAsymmetry)){ return kFALSE; } } } return kTRUE; } ///________________________________________________________________________ AliVTrack *AliConversionPhotonCuts::GetTrack(AliVEvent * event, Int_t label){ //Returns pointer to the track with given ESD label //(Important for AOD implementation, since Track array in AOD data is different //from ESD array, but ESD tracklabels are stored in AOD Tracks) AliESDEvent * esdEvent = dynamic_cast(event); if(esdEvent) { if(label > event->GetNumberOfTracks() ) return NULL; AliESDtrack * track = esdEvent->GetTrack(label); return track; } else { AliVTrack * track = 0x0; if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){ track = dynamic_cast(event->GetTrack(label)); return track; } else{ for(Int_t ii=0; iiGetNumberOfTracks(); ii++) { track = dynamic_cast(event->GetTrack(ii)); if(track){ if(track->GetID() == label) { return track; } } } } } //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks())); return NULL; } ///________________________________________________________________________ AliESDtrack *AliConversionPhotonCuts::GetESDTrack(AliESDEvent * event, Int_t label){ //Returns pointer to the track with given ESD label //(Important for AOD implementation, since Track array in AOD data is different //from ESD array, but ESD tracklabels are stored in AOD Tracks) if(event) { if(label > event->GetNumberOfTracks() ) return NULL; AliESDtrack * track = event->GetTrack(label); return track; } //AliDebug(5,(Form("track not found %d %d",label,event->GetNumberOfTracks())); return NULL; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PIDProbabilityCut(AliConversionPhotonBase *photon, AliVEvent * event){ // Cut on Electron Probability for Photon Reconstruction AliESDEvent * esdEvent = dynamic_cast(event); if(esdEvent){ Bool_t iResult=kFALSE; Double_t *posProbArray = new Double_t[AliPID::kSPECIES]; Double_t *negProbArray = new Double_t[AliPID::kSPECIES]; AliESDtrack* negTrack = esdEvent->GetTrack(photon->GetTrackLabelNegative()); AliESDtrack* posTrack = esdEvent->GetTrack(photon->GetTrackLabelPositive()); if(negProbArray && posProbArray){ negTrack->GetTPCpid(negProbArray); posTrack->GetTPCpid(posProbArray); if(negProbArray[AliPID::kElectron]>=fPIDProbabilityCutNegativeParticle && posProbArray[AliPID::kElectron]>=fPIDProbabilityCutPositiveParticle){ iResult=kTRUE; } } delete [] posProbArray; delete [] negProbArray; return iResult; } else { ///Not possible for AODs return kTRUE; } } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::AcceptanceCut(TParticle *particle, TParticle * ePos,TParticle* eNeg){ // MC Acceptance Cuts //(Certain areas were excluded for photon reconstruction) if(particle->R()>fMaxR){ return kFALSE;} if(ePos->R()>fMaxR){ return kFALSE; } if(ePos->R()R() <= ((abs(ePos->Vz())*fLineCutZRSlope)-fLineCutZValue)){ return kFALSE; } else if (fUseEtaMinCut && ePos->R() >= ((abs(ePos->Vz())*fLineCutZRSlopeMin)-fLineCutZValueMin )){ return kFALSE; } if(abs(eNeg->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct return kFALSE; } if(eNeg->Vz()!=ePos->Vz()||eNeg->R()!=ePos->R()){ return kFALSE; } if(abs(ePos->Vz()) > fMaxZ ){ // cuts out regions where we do not reconstruct return kFALSE; } if( particle->Eta() > (fEtaCut) || particle->Eta() < (-fEtaCut) ){ return kFALSE; } if( ePos->Eta() > (fEtaCut) || ePos->Eta() < (-fEtaCut) ){ return kFALSE; } if( eNeg->Eta() > (fEtaCut) || eNeg->Eta() < (-fEtaCut) ){ return kFALSE; } if(fEtaCutMin>-0.1){ if( particle->Eta() < (fEtaCutMin) && particle->Eta() > (-fEtaCutMin) ){ return kFALSE; } if( ePos->Eta() < (fEtaCutMin) && ePos->Eta() > (-fEtaCutMin) ){ return kFALSE; } if( eNeg->Eta() < (fEtaCutMin) && eNeg->Eta() > (-fEtaCutMin) ){ return kFALSE; } } if( ePos->Pt()< fSinglePtCut || eNeg->Pt()< fSinglePtCut){ return kFALSE; } if(particle->Pt()GetString().Length() == kNCuts) { fCutString->SetString(GetCutNumber()); } else { return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) { // Initialize Cuts from a given Cut string AliInfo(Form("Set Photoncut Number: %s",analysisCutSelection.Data())); if(analysisCutSelection.Length()!=kNCuts) { AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts)); return kFALSE; } if(!analysisCutSelection.IsDigit()){ AliError("Cut selection contains characters"); return kFALSE; } const char *cutSelection = analysisCutSelection.Data(); #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0' for(Int_t ii=0;ii %3.2f \n", fMinClsTPC); if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{e} < %3.2f\n", fEtaCutMin, fEtaCut ); else printf("\t eta_{e} < %3.2f\n", fEtaCut ); printf("\t p_{T,e} > %3.2f\n", fSinglePtCut ); printf("\t TPC refit \n"); printf("\t no kinks \n"); printf("\t accept: %3.2f < n sigma_{e,TPC} < %3.2f\n", fPIDnSigmaBelowElectronLine, fPIDnSigmaAboveElectronLine ); printf("\t reject: %3.2f < p_{e,T} < %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMinPnSigmaAbovePionLine, fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLine ); printf("\t reject: p_{e,T} > %3.2f, n sigma_{pi,TPC} < %3.2f\n", fPIDMaxPnSigmaAbovePionLine, fPIDnSigmaAbovePionLineHighPt ); if (fDoPionRejectionLowP) printf("\t reject: p_{e,T} < %3.2f, -%3.2f < n sigma_{pi,TPC} < %3.2f\n", fPIDMinPPionRejectionLowP, fPIDnSigmaAtLowPAroundPionLine, fPIDnSigmaAtLowPAroundPionLine ); if (fDoKaonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{K,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundKaonLine, fPIDnSigmaAtLowPAroundKaonLine ); if (fDoProtonRejectionLowP) printf("\t reject: -%3.2f < n sigma_{K,TPC} < %3.2f\n", fPIDnSigmaAtLowPAroundProtonLine, fPIDnSigmaAtLowPAroundProtonLine ); if (fUseTOFpid) printf("\t accept: %3.2f < n sigma_{e,TOF} < %3.2f\n", fTofPIDnSigmaBelowElectronLine, fTofPIDnSigmaAboveElectronLine); printf("Photon cuts: \n"); if (fUseOnFlyV0Finder) printf("\t using Onfly V0 finder \n"); else printf("\t using Offline V0 finder \n"); if (fDo2DQt){ printf("\t 2 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax ); } else { printf("\t 1 dimensional q_{T} cut applied with maximum of %3.2f \n", fQtMax ); } if (fDo2DPsiPairChi2){ printf("\t 2 dimensional triangle chi^{2} and psi_{pair} cut applied with maximum of chi^{2} = %3.2f and |psi_{pair}| = %3.2f \n", fChi2CutConversion, fPsiPairCut ); } else { printf("\t chi^{2} max cut chi^{2} < %3.2f \n", fChi2CutConversion ); printf("\t psi_{pair} max cut |psi_{pair}| < %3.2f \n", fPsiPairCut ); } printf("\t %3.2f < R_{conv} < %3.2f\n", fMinR, fMaxR ); printf("\t Z_{conv} < %3.2f\n", fMaxZ ); if (fEtaCutMin > -0.1) printf("\t %3.2f < eta_{conv} < %3.2f\n", fEtaCutMin, fEtaCut ); else printf("\t eta_{conv} < %3.2f\n", fEtaCut ); if (fDoPhotonAsymmetryCut) printf("\t for p_{T,track} > %3.2f, A_{gamma} < %3.2f \n", fMinPPhotonAsymmetryCut, fMinPhotonAsymmetry ); if (fUseCorrectedTPCClsInfo) printf("\t #cluster TPC/ #findable clusters TPC (corrected for radius) > %3.2f\n", fMinClsTPCToF ); printf("\t p_{T,gamma} > %3.2f\n", fPtCut ); printf("\t cos(Theta_{point}) > %3.2f \n", fCosPAngleCut ); printf("\t dca_{R} < %3.2f \n", fDCARPrimVtxCut ); printf("\t dca_{Z} < %3.2f \n", fDCAZPrimVtxCut ); if (fDoPhotonQualitySelectionCut) printf("\t selection based on photon quality with quality %d \n", fPhotonQualityCut ); } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetV0Finder(Int_t v0FinderType) { // Set Cut switch (v0FinderType){ case 0: // on fly V0 finder cout << "have chosen onfly V0" << endl; fUseOnFlyV0Finder=kTRUE; break; case 1: // offline V0 finder cout << "have chosen offline V0" << endl; fUseOnFlyV0Finder=kFALSE; break; default: AliError(Form(" v0FinderType not defined %d",v0FinderType)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetEtaCut(Int_t etaCut) { // Set Cut //Set Standard LineCutZValues fLineCutZValueMin = -2; fLineCutZValue = 7.; switch(etaCut){ case 0: // 0.9 fEtaCut = 0.9; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 1: // 0.6 // changed from 1.2 to 0.6 on 2013.06.10 fEtaCut = 0.6; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 2: // 1.4 fEtaCut = 1.4; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 3: // 0.65 fEtaCut = 0.65; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 4: // 0.75 fEtaCut = 0.75; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 5: // 0.5 fEtaCut = 0.5; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 6: // 5. fEtaCut = 5.; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 7: if (fIsHeavyIon==1){ fEtaCut = 0.7; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; } else { fEtaCut = 0.3; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; } // case 8: // 0.1 - 0.8 // fEtaCut = 0.9; // fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); // fEtaCutMin = 0.1; // fLineCutZRSlopeMin = tan(2*atan(exp(-fEtaCutMin))); // break; case 8: // 0.4 fEtaCut = 0.4; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; case 9: // 10 fEtaCut = 10; fLineCutZRSlope = tan(2*atan(exp(-fEtaCut))); fEtaCutMin = -0.1; fLineCutZRSlopeMin = 0.; break; default: AliError(Form(" EtaCut not defined %d",etaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetRCut(Int_t RCut){ // Set Cut switch(RCut){ case 0: fMinR=0; fMaxR = 180.; break; case 1: fMinR=2.8; fMaxR = 180.; break; case 2: fMinR=5.; fMaxR = 180.; break; case 3: fMaxR = 70.; fMinR = 10.; break; case 4: fMaxR = 70.; fMinR = 5.; break; case 5: fMaxR = 180.; fMinR = 10.; break; case 6: fMaxR = 180.; fMinR = 20.; break; case 7: fMaxR = 180.; fMinR = 35.; //old 26. break; case 8: fMaxR = 180.; fMinR = 12.5; break; case 9: fMaxR = 180.; fMinR = 7.5; break; default: AliError("RCut not defined"); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetSinglePtCut(Int_t singlePtCut) { // Set Cut switch(singlePtCut){ case 0: // 0.050 GeV fSinglePtCut = 0.050; break; case 1: // 0.100 GeV fSinglePtCut = 0.100; break; case 2: // 0.150 GeV fSinglePtCut = 0.150; break; case 3: // 0.200 GeV fSinglePtCut = 0.200; break; case 4: // 0.075 GeV fSinglePtCut = 0.075; break; case 5: // 0.125 GeV fSinglePtCut = 0.125; break; case 6: // 0.04 GeV fSinglePtCut = 0.040; break; case 7: // 0.0 GeV fSinglePtCut = 0.0; break; default: AliError(Form("singlePtCut not defined %d",singlePtCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetTPCClusterCut(Int_t clsTPCCut) { // Set Cut switch(clsTPCCut){ case 0: // 0 fMinClsTPC= 0.; break; case 1: // 60 fMinClsTPC= 60.; break; case 2: // 80 fMinClsTPC= 80.; break; case 3: // 100 fMinClsTPC= 100.; break; case 4: // 95% of findable clusters fMinClsTPCToF= 0.95; fUseCorrectedTPCClsInfo=1; break; case 5: // 0% of findable clusters fMinClsTPCToF= 0.0; fUseCorrectedTPCClsInfo=1; break; case 6: // 70% of findable clusters fMinClsTPCToF= 0.7; fUseCorrectedTPCClsInfo=1; break; case 7: // 0% of findable clusters fMinClsTPCToF= 0.35; fUseCorrectedTPCClsInfo=0; break; case 8: fMinClsTPCToF= 0.35; fUseCorrectedTPCClsInfo=1; break; case 9: fMinClsTPCToF= 0.6; fUseCorrectedTPCClsInfo=1; break; default: AliError(Form("Warning: clsTPCCut not defined %d",clsTPCCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut) { // Set Cut switch(ededxSigmaCut){ case 0: // -10,10 fPIDnSigmaBelowElectronLine=-10; fPIDnSigmaAboveElectronLine=10; break; case 1: // -5,5 fPIDnSigmaBelowElectronLine=-5; fPIDnSigmaAboveElectronLine=5; break; case 2: // -3,5 fPIDnSigmaBelowElectronLine=-3; fPIDnSigmaAboveElectronLine=5; break; case 3: // -4,5 fPIDnSigmaBelowElectronLine=-4; fPIDnSigmaAboveElectronLine=5; break; case 4: // -6,7 fPIDnSigmaBelowElectronLine=-6; fPIDnSigmaAboveElectronLine=7; break; case 5: // -4,4 fPIDnSigmaBelowElectronLine=-4; fPIDnSigmaAboveElectronLine=4; break; case 6: // -2.5,4 fPIDnSigmaBelowElectronLine=-2.5; fPIDnSigmaAboveElectronLine=4; break; case 7: // -2,3.5 fPIDnSigmaBelowElectronLine=-2; fPIDnSigmaAboveElectronLine=3.5; break; default: AliError("TPCdEdxCutElectronLine not defined"); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut) { // Set Cut switch(pidedxSigmaCut){ case 0: // -10 fPIDnSigmaAbovePionLine=-10; fPIDnSigmaAbovePionLineHighPt=-10; break; case 1: // 0 fPIDnSigmaAbovePionLine=0; fPIDnSigmaAbovePionLineHighPt=-10; break; case 2: // 1 fPIDnSigmaAbovePionLine=1; fPIDnSigmaAbovePionLineHighPt=-10; break; case 3: // 1 fPIDnSigmaAbovePionLine=2.5; fPIDnSigmaAbovePionLineHighPt=-10; break; case 4: // 1 fPIDnSigmaAbovePionLine=0.5; fPIDnSigmaAbovePionLineHighPt=-10; break; case 5: // 1 fPIDnSigmaAbovePionLine=2.; fPIDnSigmaAbovePionLineHighPt=-10; break; case 6: // 1 fPIDnSigmaAbovePionLine=2.; fPIDnSigmaAbovePionLineHighPt=0.5; break; case 7: // 1 fPIDnSigmaAbovePionLine=3.5; fPIDnSigmaAbovePionLineHighPt=-10; break; case 8: // 1 fPIDnSigmaAbovePionLine=2.; fPIDnSigmaAbovePionLineHighPt=1.; break; case 9: fPIDnSigmaAbovePionLine=3.0; // We need a bit less tight cut on dE/dx fPIDnSigmaAbovePionLineHighPt=-10; break; default: AliError(Form("Warning: pidedxSigmaCut not defined %d",pidedxSigmaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetMinMomPiondEdxCut(Int_t piMomdedxSigmaCut) { // Set Cut switch(piMomdedxSigmaCut){ case 0: // 0.5 GeV fPIDMinPnSigmaAbovePionLine=0.5; break; case 1: // 1. GeV fPIDMinPnSigmaAbovePionLine=1.; break; case 2: // 1.5 GeV fPIDMinPnSigmaAbovePionLine=1.5; break; case 3: // 20.0 GeV fPIDMinPnSigmaAbovePionLine=20.; break; case 4: // 50.0 GeV fPIDMinPnSigmaAbovePionLine=50.; break; case 5: // 0.3 GeV fPIDMinPnSigmaAbovePionLine=0.3; break; case 6: // 0.25 GeV fPIDMinPnSigmaAbovePionLine=0.25; break; case 7: // 0.4 GeV fPIDMinPnSigmaAbovePionLine=0.4; break; case 8: // 0.2 GeV fPIDMinPnSigmaAbovePionLine=0.2; break; default: AliError(Form("piMomdedxSigmaCut not defined %d",piMomdedxSigmaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetMaxMomPiondEdxCut(Int_t piMaxMomdedxSigmaCut) { // Set Cut switch(piMaxMomdedxSigmaCut){ case 0: // 100. GeV fPIDMaxPnSigmaAbovePionLine=100.; break; case 1: // 5. GeV fPIDMaxPnSigmaAbovePionLine=5.; break; case 2: // 4. GeV fPIDMaxPnSigmaAbovePionLine=4.; break; case 3: // 3.5 GeV fPIDMaxPnSigmaAbovePionLine=3.5; break; case 4: // 3. GeV fPIDMaxPnSigmaAbovePionLine=3.; break; case 5: // 7. GeV fPIDMaxPnSigmaAbovePionLine=7.; break; default: AliError(Form("piMaxMomdedxSigmaCut not defined %d",piMaxMomdedxSigmaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut) { // Set Cut switch(LowPRejectionSigmaCut){ case 0: // fPIDnSigmaAtLowPAroundKaonLine=0; fPIDnSigmaAtLowPAroundProtonLine=0; fPIDnSigmaAtLowPAroundPionLine=0; fDoKaonRejectionLowP = kFALSE; fDoProtonRejectionLowP = kFALSE; fDoPionRejectionLowP = kFALSE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 1: // fPIDnSigmaAtLowPAroundKaonLine=0.5; fPIDnSigmaAtLowPAroundProtonLine=0.5; fPIDnSigmaAtLowPAroundPionLine=0.5; fDoKaonRejectionLowP = kTRUE; fDoProtonRejectionLowP = kTRUE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 2: // fPIDnSigmaAtLowPAroundKaonLine=1; fPIDnSigmaAtLowPAroundProtonLine=1; fPIDnSigmaAtLowPAroundPionLine=1; fDoKaonRejectionLowP = kTRUE; fDoProtonRejectionLowP = kTRUE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 3: // fPIDnSigmaAtLowPAroundKaonLine=2.; fPIDnSigmaAtLowPAroundProtonLine=2.; fPIDnSigmaAtLowPAroundPionLine=2.; fDoKaonRejectionLowP = kTRUE; fDoProtonRejectionLowP = kTRUE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 4: // fPIDnSigmaAtLowPAroundKaonLine=0.; fPIDnSigmaAtLowPAroundProtonLine=0.; fPIDnSigmaAtLowPAroundPionLine=1; fDoKaonRejectionLowP = kFALSE; fDoProtonRejectionLowP = kFALSE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 5: // fPIDnSigmaAtLowPAroundKaonLine=0.; fPIDnSigmaAtLowPAroundProtonLine=0.; fPIDnSigmaAtLowPAroundPionLine=1.5; fDoKaonRejectionLowP = kFALSE; fDoProtonRejectionLowP = kFALSE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 6: // fPIDnSigmaAtLowPAroundKaonLine=0.; fPIDnSigmaAtLowPAroundProtonLine=0.; fPIDnSigmaAtLowPAroundPionLine=2.; fDoKaonRejectionLowP = kFALSE; fDoProtonRejectionLowP = kFALSE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; case 7: // fPIDnSigmaAtLowPAroundKaonLine=0.; fPIDnSigmaAtLowPAroundProtonLine=0.; fPIDnSigmaAtLowPAroundPionLine=0.5; fDoKaonRejectionLowP = kFALSE; fDoProtonRejectionLowP = kFALSE; fDoPionRejectionLowP = kTRUE; fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLine; break; default: AliError(Form("LowPRejectionSigmaCut not defined %d",LowPRejectionSigmaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){ // Set Cut switch(TOFelectronPID){ case 0: // no cut fUseTOFpid = kFALSE; fTofPIDnSigmaBelowElectronLine=-100; fTofPIDnSigmaAboveElectronLine=100; break; case 1: // -7,7 fUseTOFpid = kTRUE; fTofPIDnSigmaBelowElectronLine=-7; fTofPIDnSigmaAboveElectronLine=7; break; case 2: // -5,5 fUseTOFpid = kTRUE; fTofPIDnSigmaBelowElectronLine=-5; fTofPIDnSigmaAboveElectronLine=5; break; case 3: // -3,5 fUseTOFpid = kTRUE; fTofPIDnSigmaBelowElectronLine=-3; fTofPIDnSigmaAboveElectronLine=5; break; case 4: // -2,3 fUseTOFpid = kTRUE; fTofPIDnSigmaBelowElectronLine=-2; fTofPIDnSigmaAboveElectronLine=3; break; case 5: // -3,3 fUseTOFpid = kTRUE; fTofPIDnSigmaBelowElectronLine=-3; fTofPIDnSigmaAboveElectronLine=3; break; default: AliError(Form("TOFElectronCut not defined %d",TOFelectronPID)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetQtMaxCut(Int_t QtMaxCut) { // Set Cut switch(QtMaxCut){ case 0: // fQtMax=1.; fDoQtGammaSelection=kFALSE; fDo2DQt=kFALSE; break; case 1: fQtMax=0.1; fDo2DQt=kFALSE; break; case 2: fQtMax=0.07; fDo2DQt=kFALSE; break; case 3: fQtMax=0.05; fDo2DQt=kFALSE; break; case 4: fQtMax=0.03; fDo2DQt=kFALSE; break; case 5: fQtMax=0.02; fDo2DQt=kFALSE; break; case 6: fQtMax=0.02; fDo2DQt=kTRUE; break; case 7: fQtMax=0.15; fDo2DQt=kFALSE; break; case 8: fQtMax=0.05; fDo2DQt=kTRUE; break; case 9: fQtMax=0.03; fDo2DQt=kTRUE; break; default: AliError(Form("Warning: QtMaxCut not defined %d",QtMaxCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetChi2GammaCut(Int_t chi2GammaCut) { // Set Cut switch(chi2GammaCut){ case 0: // 100 fChi2CutConversion = 100.; break; case 1: // 50 fChi2CutConversion = 50.; break; case 2: // 30 fChi2CutConversion = 30.; break; case 3: fChi2CutConversion = 200.; break; case 4: fChi2CutConversion = 500.; break; case 5: fChi2CutConversion = 100000.; break; case 6: fChi2CutConversion = 5.; break; case 7: fChi2CutConversion = 10.; break; case 8: fChi2CutConversion = 20.; break; case 9: fChi2CutConversion = 15.; break; default: AliError(Form("Warning: Chi2GammaCut not defined %d",chi2GammaCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetPsiPairCut(Int_t psiCut) { switch(psiCut) { case 0: fPsiPairCut = 10000; // break; case 1: fPsiPairCut = 0.1; // break; case 2: fPsiPairCut = 0.05; // Standard break; case 3: fPsiPairCut = 0.035; // break; case 4: fPsiPairCut = 0.2; // break; case 5: fPsiPairCut = 0.1; // fDo2DPsiPairChi2 = kTRUE; break; case 6: fPsiPairCut = 0.05; // fDo2DPsiPairChi2 = kTRUE; break; case 7: fPsiPairCut = 0.035; // fDo2DPsiPairChi2 = kTRUE; break; case 8: fPsiPairCut = 0.2; // fDo2DPsiPairChi2 = kTRUE; // break; case 9: fPsiPairCut = 0.5; // break; default: AliError(Form("PsiPairCut not defined %d",psiCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetPhotonAsymmetryCut(Int_t doPhotonAsymmetryCut){ // Set Cut switch(doPhotonAsymmetryCut){ case 0: fDoPhotonAsymmetryCut=0; fMinPPhotonAsymmetryCut=100.; fMinPhotonAsymmetry=0.; break; case 1: fDoPhotonAsymmetryCut=1; fMinPPhotonAsymmetryCut=3.5; fMinPhotonAsymmetry=0.04; break; case 2: fDoPhotonAsymmetryCut=1; fMinPPhotonAsymmetryCut=3.5; fMinPhotonAsymmetry=0.06; break; case 3: fDoPhotonAsymmetryCut=1; fMinPPhotonAsymmetryCut=0.0; fMinPhotonAsymmetry=0.05; break; default: AliError(Form("PhotonAsymmetryCut not defined %d",doPhotonAsymmetryCut)); return kFALSE; } fCuts[kdoPhotonAsymmetryCut]=doPhotonAsymmetryCut; return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetCosPAngleCut(Int_t cosCut) { switch(cosCut){ case 0: fCosPAngleCut = -1; break; case 1: fCosPAngleCut = 0; break; case 2: fCosPAngleCut = 0.5; break; case 3: fCosPAngleCut = 0.75; break; case 4: fCosPAngleCut = 0.85; break; case 5: fCosPAngleCut = 0.88; break; case 6: fCosPAngleCut = 0.9; break; case 7: fCosPAngleCut = 0.95; break; default: AliError(Form("Cosine Pointing Angle cut not defined %d",cosCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetSharedElectronCut(Int_t sharedElec) { switch(sharedElec){ case 0: fDoSharedElecCut = kFALSE; fDoPhotonQualitySelectionCut = kFALSE; fPhotonQualityCut = 0; break; case 1: fDoSharedElecCut = kTRUE; fDoPhotonQualitySelectionCut = kFALSE; fPhotonQualityCut = 0; break; case 2: fDoSharedElecCut = kFALSE; fDoPhotonQualitySelectionCut = kTRUE; fPhotonQualityCut = 1; break; case 3: fDoSharedElecCut = kFALSE; fDoPhotonQualitySelectionCut = kTRUE; fPhotonQualityCut = 2; break; case 4: fDoSharedElecCut = kFALSE; fDoPhotonQualitySelectionCut = kTRUE; fPhotonQualityCut = 3; break; default: AliError(Form("Shared Electron Cut not defined %d",sharedElec)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetToCloseV0sCut(Int_t toClose) { switch(toClose){ case 0: fDoToCloseV0sCut = kFALSE; fminV0Dist = 250; break; case 1: fDoToCloseV0sCut = kTRUE; fminV0Dist = 1; break; case 2: fDoToCloseV0sCut = kTRUE; fminV0Dist = 2; break; case 3: fDoToCloseV0sCut = kTRUE; fminV0Dist = 3; break; default: AliError(Form("Shared Electron Cut not defined %d",toClose)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetTRDElectronCut(Int_t TRDElectronCut) { // Set Cut switch(TRDElectronCut){ case 0: fDoTRDPID=kFALSE; break; case 1: fDoTRDPID=kTRUE; fPIDTRDEfficiency=0.1; break; case 8: fDoTRDPID=kTRUE; fPIDTRDEfficiency=0.8; break; case 9: fDoTRDPID=kTRUE; fPIDTRDEfficiency=0.9; break; default: AliError(Form("TRDElectronCut not defined %d",TRDElectronCut)); return kFALSE; } return kTRUE; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::SetDCAZPhotonPrimVtxCut(Int_t DCAZPhotonPrimVtx){ // Set Cut switch(DCAZPhotonPrimVtx){ case 0: // fDCAZPrimVtxCut = 1000; break; case 1: // fDCAZPrimVtxCut = 10; break; case 2: // fDCAZPrimVtxCut = 5; break; case 3: // fDCAZPrimVtxCut = 4; break; case 4: // fDCAZPrimVtxCut = 3; break; case 5: // fDCAZPrimVtxCut = 2.5; break; case 6: // fDCAZPrimVtxCut = 2; break; case 7: // fDCAZPrimVtxCut = 1.5; break; case 8: // fDCAZPrimVtxCut = 1; break; case 9: // fDCAZPrimVtxCut = 0.5; break; default: cout<<"Warning: DCAZPhotonPrimVtx not defined "<radiusI && radius<=radiusO){ firstTPCRow = (Int_t)((radius-radiusI)/rSizeI); } if(radius>radiusO && radius<=radiusOB){ firstTPCRow = (Int_t)(nClsI+(radius-radiusO)/rSizeO); } if(radius>radiusOB){ firstTPCRow =(Int_t)(nClsIO+(radius-radiusOB)/rSizeOB); } return firstTPCRow; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::CosinePAngleCut(const AliConversionPhotonBase * photon, AliVEvent * event) const { ///Check if passes cosine of pointing angle cut if(GetCosineOfPointingAngle(photon, event) < fCosPAngleCut){ return kFALSE; } return kTRUE; } ///________________________________________________________________________ Double_t AliConversionPhotonCuts::GetCosineOfPointingAngle( const AliConversionPhotonBase * photon, AliVEvent * event) const{ // calculates the pointing angle of the recalculated V0 Double_t momV0[3] = {0,0,0}; if(event->IsA()==AliESDEvent::Class()){ AliESDEvent *esdEvent = dynamic_cast(event); if(!esdEvent) return -999; AliESDv0 *v0 = esdEvent->GetV0(photon->GetV0Index()); if(!v0) return -999; v0->GetPxPyPz(momV0[0],momV0[1],momV0[2]); } if(event->IsA()==AliAODEvent::Class()){ momV0[0] = photon->GetPx(); momV0[1] = photon->GetPy(); momV0[2] = photon->GetPz(); } //Double_t momV0[3] = { photon->GetPx(), photon->GetPy(), photon->GetPz() }; //momentum of the V0 Double_t PosV0[3] = { photon->GetConversionX() - event->GetPrimaryVertex()->GetX(), photon->GetConversionY() - event->GetPrimaryVertex()->GetY(), photon->GetConversionZ() - event->GetPrimaryVertex()->GetZ() }; //Recalculated V0 Position vector Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2]; Double_t PosV02 = PosV0[0]*PosV0[0] + PosV0[1]*PosV0[1] + PosV0[2]*PosV0[2]; Double_t cosinePointingAngle = -999; if(momV02*PosV02 > 0.0) cosinePointingAngle = (PosV0[0]*momV0[0] + PosV0[1]*momV0[1] + PosV0[2]*momV0[2] ) / TMath::Sqrt(momV02 * PosV02); return cosinePointingAngle; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::PsiPairCut(const AliConversionPhotonBase * photon) const { if (fDo2DPsiPairChi2){ if (abs(photon->GetPsiPair()) < -fPsiPairCut/fChi2CutConversion*photon->GetChi2perNDF() + fPsiPairCut ){ return kTRUE; } else { return kFALSE; } } else { if(abs(photon->GetPsiPair()) > fPsiPairCut){ return kFALSE;} else{return kTRUE;} } } ///________________________________________________________________________ TString AliConversionPhotonCuts::GetCutNumber(){ // returns TString with current cut number TString a(kNCuts); for(Int_t ii=0;iiGetTrackLabelPositive(); Int_t negLabel = photon->GetTrackLabelNegative(); fElectronLabelArray[nV0*2] = posLabel; fElectronLabelArray[(nV0*2)+1] = negLabel; } ///________________________________________________________________________ Bool_t AliConversionPhotonCuts::RejectSharedElectronV0s(AliAODConversionPhoton* photon, Int_t nV0, Int_t nV0s){ Int_t posLabel = photon->GetTrackLabelPositive(); Int_t negLabel = photon->GetTrackLabelNegative(); for(Int_t i = 0; iGetConversionX(); Double_t posY = photon->GetConversionY(); Double_t posZ = photon->GetConversionZ(); for(Int_t i = 0;iGetEntries();i++){ if(nV0 == i) continue; AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i); Double_t posCompX = photonComp->GetConversionX(); Double_t posCompY = photonComp->GetConversionY(); Double_t posCompZ = photonComp->GetConversionZ(); Double_t dist = pow((posX - posCompX),2)+pow((posY - posCompY),2)+pow((posZ - posCompZ),2); if(dist < fminV0Dist*fminV0Dist){ if(photon->GetChi2perNDF() < photonComp->GetChi2perNDF()) return kTRUE; else { return kFALSE;} } } return kTRUE; } ///________________________________________________________________________ AliConversionPhotonCuts* AliConversionPhotonCuts::GetStandardCuts2010PbPb(){ //Create and return standard 2010 PbPb cuts AliConversionPhotonCuts *cuts=new AliConversionPhotonCuts("StandardCuts2010PbPb","StandardCuts2010PbPb"); if(!cuts->InitializeCutsFromCutString("04209297002322000000")){ cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<InitializeCutsFromCutString("00209366300380000000")){ cout<<"Warning: Initialization of Standardcuts2010pp failed"<Fill(gammaToEPAngle); return kTRUE; } else if(fInPlaneOutOfPlane == 1){ if(abs(gammaToEPAngle)<=0.25*TMath::Pi() || abs(gammaToEPAngle)>=0.75*TMath::Pi()){ if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle); return kTRUE; } else return kFALSE; } else if(fInPlaneOutOfPlane == 2){ if(abs(gammaToEPAngle)>0.25*TMath::Pi() && abs(gammaToEPAngle)<0.75*TMath::Pi()){ if(fill&&hEventPlanePhi)hEventPlanePhi->Fill(gammaToEPAngle); return kTRUE; } else return kFALSE; } return kFALSE; } ///________________________________________________________________________ UChar_t AliConversionPhotonCuts::DeterminePhotonQualityAOD(AliAODConversionPhoton* photon, AliVEvent* eventDummy){ AliAODTrack * negTrack = static_cast(GetTrack(eventDummy, photon->GetTrackLabelNegative())); AliAODTrack * posTrack = static_cast(GetTrack(eventDummy, photon->GetTrackLabelPositive())); if(!negTrack || !posTrack) { return 0; } if(negTrack->Charge() == posTrack->Charge()){ return 0; } Int_t nClusterITSneg = negTrack->GetITSNcls(); Int_t nClusterITSpos = posTrack->GetITSNcls(); // cout << nClusterITSneg << "\t" << nClusterITSpos < 1 && nClusterITSpos > 1){ return 3; } else if (nClusterITSneg > 1 || nClusterITSpos > 1){ return 2; } else { return 1; } return 0; }