File indexing completed on 2024-04-06 12:27:00
0001 #include "PhysicsTools/SelectorUtils/interface/CutApplicatorBase.h"
0002 #include "DataFormats/MuonReco/interface/Muon.h"
0003 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
0004
0005 class MuonTypeByOrCut : public CutApplicatorBase {
0006 public:
0007 MuonTypeByOrCut(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 unsigned int type_;
0015 };
0016 DEFINE_EDM_PLUGIN(CutApplicatorFactory, MuonTypeByOrCut, "MuonTypeByOrCut");
0017
0018
0019 MuonTypeByOrCut::MuonTypeByOrCut(const edm::ParameterSet& c) : CutApplicatorBase(c), type_(0) {
0020 const auto muonTypes = c.getParameter<std::vector<std::string> >("types");
0021 for (auto x : muonTypes) {
0022 std::transform(x.begin(), x.end(), x.begin(), ::tolower);
0023 if (x == "globalmuon")
0024 type_ |= reco::Muon::GlobalMuon;
0025 else if (x == "trackermuon")
0026 type_ |= reco::Muon::TrackerMuon;
0027 else if (x == "standalonemuon")
0028 type_ |= reco::Muon::StandAloneMuon;
0029 else if (x == "calomuon")
0030 type_ |= reco::Muon::CaloMuon;
0031 else if (x == "pfmuon")
0032 type_ |= reco::Muon::PFMuon;
0033 else if (x == "rpcmuon")
0034 type_ |= reco::Muon::RPCMuon;
0035 }
0036 }
0037
0038
0039 CutApplicatorBase::result_type MuonTypeByOrCut::operator()(const reco::MuonPtr& muon) const {
0040 return (muon->type() & type_) != 0;
0041 }
0042
0043 double MuonTypeByOrCut::value(const reco::CandidatePtr& cand) const {
0044 const reco::MuonPtr muon(cand);
0045 return muon->type() & type_;
0046 }