File indexing completed on 2023-10-25 10:01:16
0001 #include "PhysicsTools/SelectorUtils/interface/CutApplicatorBase.h"
0002 #include "DataFormats/MuonReco/interface/Muon.h"
0003 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
0004
0005 class MuonMomQualityCut : public CutApplicatorBase {
0006 public:
0007 MuonMomQualityCut(const edm::ParameterSet& c);
0008
0009 result_type operator()(const reco::MuonPtr&) const final;
0010 CandidateType candidateType() const final { return MUON; }
0011 double value(const reco::CandidatePtr&) const final;
0012
0013 private:
0014 const double maxRelPtErr_;
0015 };
0016 DEFINE_EDM_PLUGIN(CutApplicatorFactory, MuonMomQualityCut, "MuonMomQualityCut");
0017
0018
0019 MuonMomQualityCut::MuonMomQualityCut(const edm::ParameterSet& c)
0020 : CutApplicatorBase(c), maxRelPtErr_(c.getParameter<double>("maxRelPtErr")) {}
0021
0022
0023 CutApplicatorBase::result_type MuonMomQualityCut::operator()(const reco::MuonPtr& cand) const {
0024 const auto trackRef = cand->muonBestTrack();
0025 return trackRef.isNonnull() and trackRef->ptError() <= maxRelPtErr_ * trackRef->pt();
0026
0027 return true;
0028 }
0029
0030 double MuonMomQualityCut::value(const reco::CandidatePtr& cand) const {
0031 const reco::MuonPtr muon(cand);
0032 const auto trackRef = muon->muonBestTrack();
0033 if (trackRef.isNull() or trackRef->pt() <= 0)
0034 return -1;
0035
0036 return trackRef->ptError() / trackRef->pt();
0037 }