CMS 3D CMS Logo

MuonIDTableProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // user include files
7 
9 
13 
18 
20 public:
21  explicit MuonIDTableProducer(const edm::ParameterSet& iConfig)
22  : name_(iConfig.getParameter<std::string>("name")),
23  src_(consumes<std::vector<pat::Muon>>(iConfig.getParameter<edm::InputTag>("muons"))),
24  srcVtx_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertices"))) {
25  produces<nanoaod::FlatTable>();
26  }
27 
28  ~MuonIDTableProducer() override{};
29 
30  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
32  desc.add<edm::InputTag>("muons")->setComment("input muon collection");
33  desc.add<edm::InputTag>("vertices", edm::InputTag("offlineSlimmedPrimaryVertices"))
34  ->setComment("input vertex collection, for dxy/dz");
35  desc.add<std::string>("name")->setComment("name of the muon nanoaod::FlatTable we are extending with IDs");
36  descriptions.add("muonIDTable", desc);
37  }
38 
39 private:
40  void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
41 
45 
46  static bool isMediumMuonHIP(const pat::Muon& muon);
47  static bool isSoftMuonHIP(const pat::Muon& muon, const reco::Vertex& vtx);
48  static bool isTrackerHighPt(const pat::Muon& mu, const reco::Vertex& primaryVertex);
49 };
50 
51 // ------------ method called to produce the data ------------
54  iEvent.getByToken(src_, muons);
56  iEvent.getByToken(srcVtx_, vertices);
57 
58  unsigned int ncand = muons->size();
59 
60  const reco::Vertex& pv = vertices->front(); // consistent with IP information in slimmedLeptons.
61 
62  bool isRun2016BCDEF = (272007 <= iEvent.run() && iEvent.run() <= 278808);
63  std::vector<uint8_t> tight(ncand, 0), highPt(ncand, 0), soft(ncand, 0), medium(ncand, 0);
64  for (unsigned int i = 0; i < ncand; ++i) {
65  const pat::Muon& mu = (*muons)[i];
66  tight[i] = muon::isTightMuon(mu, pv);
67  highPt[i] = muon::isHighPtMuon(mu, pv) ? 2 : isTrackerHighPt(mu, pv);
68  soft[i] = isRun2016BCDEF ? isSoftMuonHIP(mu, pv) : muon::isSoftMuon(mu, pv);
69  medium[i] = isRun2016BCDEF ? isMediumMuonHIP(mu) : muon::isMediumMuon(mu);
70  }
71 
72  auto tab = std::make_unique<nanoaod::FlatTable>(ncand, name_, false, true);
73  tab->addColumn<uint8_t>("tightId", tight, "POG Tight muon ID", nanoaod::FlatTable::BoolColumn);
74  tab->addColumn<uint8_t>(
75  "highPtId",
76  highPt,
77  "POG highPt muon ID (1 = tracker high pT, 2 = global high pT, which includes tracker high pT)",
79  tab->addColumn<uint8_t>(
80  "softId",
81  soft,
82  "POG Soft muon ID (using the relaxed cuts in the data Run 2016 B-F periods, and standard cuts elsewhere)",
84  tab->addColumn<uint8_t>(
85  "mediumId",
86  medium,
87  "POG Medium muon ID (using the relaxed cuts in the data Run 2016 B-F periods, and standard cuts elsewhere)",
89 
90  iEvent.put(std::move(tab));
91 }
92 
94  bool goodGlob = mu.isGlobalMuon() && mu.globalTrack()->normalizedChi2() < 3 &&
96  bool isMedium = muon::isLooseMuon(mu) && mu.innerTrack()->validFraction() > 0.49 &&
97  muon::segmentCompatibility(mu) > (goodGlob ? 0.303 : 0.451);
98  return isMedium;
99 }
100 
103  mu.innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
104  mu.innerTrack()->hitPattern().pixelLayersWithMeasurement() > 0 &&
105  std::abs(mu.innerTrack()->dxy(vtx.position())) < 0.3 && std::abs(mu.innerTrack()->dz(vtx.position())) < 20.;
106 }
107 
109  return (mu.numberOfMatchedStations() > 1 && (mu.muonBestTrack()->ptError() / mu.muonBestTrack()->pt()) < 0.3 &&
110  std::abs(mu.muonBestTrack()->dxy(primaryVertex.position())) < 0.2 &&
111  std::abs(mu.muonBestTrack()->dz(primaryVertex.position())) < 0.5 &&
112  mu.innerTrack()->hitPattern().numberOfValidPixelHits() > 0 &&
113  mu.innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5);
114 }
115 
117 //define this as a plug-in
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
Definition: MuonQuality.h:19
edm::EDGetTokenT< std::vector< reco::Vertex > > srcVtx_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
bool isMediumMuon(const reco::Muon &, bool run2016_hip_mitigation=false)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void produce(edm::StreamID, edm::Event &, edm::EventSetup const &) const override
float trkKink
value of the kink algorithm applied to the inner track stub
Definition: MuonQuality.h:11
edm::EDGetTokenT< std::vector< pat::Muon > > src_
const Point & position() const
position
Definition: Vertex.h:113
bool isLooseMuon(const reco::Muon &)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: HeavyIon.h:7
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
reco::TrackRef innerTrack() const override
reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
Definition: Muon.h:72
Definition: Muon.py:1
bool isGlobalMuon() const override
Definition: Muon.h:298
MuonQuality combinedQuality() const
get energy deposition information
Definition: Muon.h:119
RunNumber_t run() const
Definition: Event.h:107
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isSoftMuon(const reco::Muon &, const reco::Vertex &, bool run2016_hip_mitigation=false)
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
int numberOfMatchedStations(ArbitrationType type=SegmentAndTrackArbitration) const
static bool isSoftMuonHIP(const pat::Muon &muon, const reco::Vertex &vtx)
MuonIDTableProducer(const edm::ParameterSet &iConfig)
bool isHighPtMuon(const reco::Muon &, const reco::Vertex &)
reco::TrackRef globalTrack() const override
reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon) ...
Definition: Muon.h:80
static bool isMediumMuonHIP(const pat::Muon &muon)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
fixed size matrix
HLT enums.
reco::TrackRef muonBestTrack() const override
Track selected to be the best measurement of the muon parameters (including PFlow global information)...
static bool isTrackerHighPt(const pat::Muon &mu, const reco::Vertex &primaryVertex)
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
primaryVertex
hltOfflineBeamSpot for HLTMON
Analysis-level muon class.
Definition: Muon.h:51
def move(src, dest)
Definition: eostools.py:511