Skip to content

Commit 3cca89c

Browse files
Code for custom Muon POG NanoAOD
1 parent e0f88d0 commit 3cca89c

File tree

4 files changed

+425
-0
lines changed

4 files changed

+425
-0
lines changed

Configuration/PyReleaseValidation/python/relval_steps.py

+1
Original file line numberDiff line numberDiff line change
@@ -3895,6 +3895,7 @@ def gen2022HiMix(fragment,howMuch):
38953895
steps['NANOUP17'] = merge([{'--conditions':'auto:phase1_2017_realistic','--era': 'Run2_2017','-n':'10' ,'--filein':'file:step3_inMINIAODSIM.root', '--geometry':'DB:Extended', '--nThreads':'2'}, stepNanoEDMMCProd])
38963896
steps['NANOUP15Had']=merge([{'--filein':'file:step4_inMINIAODSIM.root'},steps['NANOUP15']])
38973897
steps['NANOUP15MC_PU25_JME']=merge([{'--customise':'PhysicsTools/NanoAOD/custom_jme_cff.PrepJMECustomNanoAOD_MC'},steps['NANOUP15']])
3898+
steps['NANOUP15MC_PU25_Muon']=merge([{'--customise':'PhysicsTools/NanoAOD/custom_muon_cff.PrepMuonCustomNanoAOD'},steps['NANOUP15']])
38983899
steps['NANOUP17Had']=merge([{'--filein':'file:step4_inMINIAODSIM.root'},steps['NANOUP17']])
38993900
steps['NANOUP18'] = merge([{'--conditions': 'auto:phase1_2018_realistic', '--era': 'Run2_2018','-n':'10', '--filein':'file:step3_inMINIAODSIM.root', '--nThreads':'2'}, stepNanoEDMMCProd ])
39003901
steps['NANOUP18Had']=merge([{'--filein':'file:step4_inMINIAODSIM.root'},steps['NANOUP18']])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#include "FWCore/Framework/interface/stream/EDProducer.h"
2+
#include "FWCore/Framework/interface/Event.h"
3+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
4+
#include "FWCore/Utilities/interface/InputTag.h"
5+
#include "DataFormats/Common/interface/View.h"
6+
7+
#include "DataFormats/PatCandidates/interface/UserData.h"
8+
#include "PhysicsTools/PatAlgos/interface/PATUserDataMerger.h"
9+
10+
#include "DataFormats/MuonReco/interface/Muon.h"
11+
#include "DataFormats/MuonReco/interface/MuonSelectors.h"
12+
#include "DataFormats/PatCandidates/interface/Muon.h"
13+
14+
#include "DataFormats/VertexReco/interface/Vertex.h"
15+
#include "DataFormats/VertexReco/interface/VertexFwd.h"
16+
17+
#include "DataFormats/PatCandidates/interface/PackedCandidate.h"
18+
#include "DataFormats/TrackReco/interface/Track.h"
19+
#include "DataFormats/Math/interface/deltaR.h"
20+
#include "DataFormats/MuonReco/interface/MuonSimInfo.h"
21+
#include "MuonAnalysis/MuonAssociators/interface/PropagateToMuon.h"
22+
23+
class MuonSpecialVariables : public edm::stream::EDProducer<> {
24+
public:
25+
explicit MuonSpecialVariables(const edm::ParameterSet &iConfig)
26+
: muonSrc_(consumes<std::vector<pat::Muon>>(iConfig.getParameter<edm::InputTag>("muonSrc"))),
27+
vertexSrc_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vertexSrc"))),
28+
trkSrc_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("trkSrc"))) {
29+
produces<std::vector<pat::Muon>>();
30+
}
31+
~MuonSpecialVariables() override {}
32+
33+
void setArbitratedTracker(pat::Muon &mu) const;
34+
void setInnerTrackDxyz(pat::Muon &mu, const reco::Vertex &vtx) const;
35+
void setTrkiso04(pat::Muon &mu, const std::vector<reco::Track> tracks) const;
36+
void setNSegements(pat::Muon &mu) const;
37+
38+
private:
39+
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override;
40+
41+
edm::EDGetToken muonSrc_;
42+
edm::EDGetToken vertexSrc_;
43+
edm::EDGetToken trkSrc_;
44+
};
45+
46+
void MuonSpecialVariables::setArbitratedTracker(pat::Muon &mu) const {
47+
mu.addUserInt("isArbitratedTracker", muon::isGoodMuon(mu, muon::TrackerMuonArbitrated));
48+
}
49+
50+
void MuonSpecialVariables::setInnerTrackDxyz(pat::Muon &mu, const reco::Vertex &vtx) const {
51+
float innerTrackDxy =
52+
mu.innerTrack().isNonnull() ? mu.innerTrack()->dxy(reco::TrackBase::Point(vtx.x(), vtx.y(), vtx.z())) : -999.9;
53+
float innerTrackDz =
54+
mu.innerTrack().isNonnull() ? mu.innerTrack()->dz(reco::TrackBase::Point(vtx.x(), vtx.y(), vtx.z())) : -999.9;
55+
mu.addUserFloat("innerTrackDxy", innerTrackDxy);
56+
mu.addUserFloat("innerTrackDz", innerTrackDz);
57+
}
58+
59+
void MuonSpecialVariables::setTrkiso04(pat::Muon &mu, const std::vector<reco::Track> tracks) const {
60+
float energy = 0;
61+
for (const auto &trk : tracks) {
62+
if (deltaR(mu.eta(), mu.phi(), trk.eta(), trk.phi()) > 0.4)
63+
continue;
64+
energy += trk.pt();
65+
}
66+
float Trkiso04 = (energy - mu.pt()) / mu.pt();
67+
float relTrkiso4 = (Trkiso04 > 0) ? Trkiso04 : 0;
68+
mu.addUserFloat("relTrkiso4", relTrkiso4);
69+
}
70+
71+
void MuonSpecialVariables::setNSegements(pat::Muon &mu) const {
72+
int nsegments = 0;
73+
for (auto &chamber : mu.matches()) {
74+
if (chamber.id.det() != DetId::Muon)
75+
continue;
76+
if (chamber.id.subdetId() != MuonSubdetId::DT && chamber.id.subdetId() != MuonSubdetId::CSC)
77+
continue;
78+
nsegments += chamber.segmentMatches.size();
79+
}
80+
mu.addUserInt("nsegments", nsegments);
81+
}
82+
83+
void MuonSpecialVariables::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
84+
edm::Handle<std::vector<pat::Muon>> muonSrc;
85+
iEvent.getByToken(muonSrc_, muonSrc);
86+
87+
edm::Handle<std::vector<reco::Vertex>> vertices;
88+
iEvent.getByToken(vertexSrc_, vertices);
89+
90+
edm::Handle<reco::TrackCollection> trkCollection;
91+
iEvent.getByToken(trkSrc_, trkCollection);
92+
93+
std::unique_ptr<std::vector<pat::Muon>> muonCollection(new std::vector<pat::Muon>(*muonSrc));
94+
95+
std::unique_ptr<std::vector<pat::Muon>> out(new std::vector<pat::Muon>());
96+
97+
out->reserve(muonCollection->size());
98+
99+
for (unsigned int i = 0; i < muonCollection->size(); i++) {
100+
pat::Muon &mu = (*muonCollection).at(i);
101+
setArbitratedTracker(mu);
102+
int good_vertex = 0;
103+
for (auto &vtx : *vertices) {
104+
if (vtx.isFake() || !vtx.isValid())
105+
continue;
106+
setInnerTrackDxyz(mu, vtx);
107+
good_vertex = 1;
108+
break;
109+
}
110+
mu.addUserInt("isGoodVertex", good_vertex);
111+
setTrkiso04(mu, *trkCollection);
112+
setNSegements(mu);
113+
out->push_back(mu);
114+
}
115+
116+
iEvent.put(std::move(out));
117+
}
118+
119+
#include "FWCore/Framework/interface/MakerMacros.h"
120+
DEFINE_FWK_MODULE(MuonSpecialVariables);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include "FWCore/Framework/interface/stream/EDProducer.h"
2+
#include "FWCore/Framework/interface/Event.h"
3+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
4+
#include "FWCore/Utilities/interface/InputTag.h"
5+
#include "DataFormats/Common/interface/View.h"
6+
7+
#include "DataFormats/PatCandidates/interface/UserData.h"
8+
#include "PhysicsTools/PatAlgos/interface/PATUserDataMerger.h"
9+
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
10+
11+
#include "DataFormats/VertexReco/interface/Vertex.h"
12+
#include "DataFormats/VertexReco/interface/VertexFwd.h"
13+
14+
#include "DataFormats/PatCandidates/interface/PackedCandidate.h"
15+
#include "DataFormats/TrackReco/interface/Track.h"
16+
#include "DataFormats/Math/interface/deltaR.h"
17+
#include "DataFormats/MuonReco/interface/MuonSimInfo.h"
18+
#include "MuonAnalysis/MuonAssociators/interface/PropagateToMuon.h"
19+
20+
class pfTracksProducer : public edm::stream::EDProducer<> {
21+
public:
22+
explicit pfTracksProducer(const edm::ParameterSet& iConfig)
23+
: PFCands_(consumes<std::vector<pat::PackedCandidate>>(iConfig.getParameter<edm::InputTag>("PFCands"))),
24+
LostTracks_(consumes<std::vector<pat::PackedCandidate>>(iConfig.getParameter<edm::InputTag>("lostTracks"))),
25+
trkSelection_(iConfig.getParameter<std::string>("trkSelection")),
26+
HighPurity_(iConfig.getParameter<bool>("TrkHPurity")) {
27+
produces<reco::TrackCollection>();
28+
}
29+
~pfTracksProducer() override {}
30+
31+
private:
32+
void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
33+
34+
edm::EDGetToken PFCands_;
35+
edm::EDGetToken LostTracks_;
36+
const StringCutObjectSelector<pat::PackedCandidate> trkSelection_;
37+
const bool HighPurity_;
38+
};
39+
40+
void pfTracksProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
41+
edm::Handle<std::vector<pat::PackedCandidate>> pfcands;
42+
iEvent.getByToken(PFCands_, pfcands);
43+
44+
edm::Handle<std::vector<pat::PackedCandidate>> lostTracks;
45+
iEvent.getByToken(LostTracks_, lostTracks);
46+
47+
std::unique_ptr<std::vector<reco::Track>> tracks(new std::vector<reco::Track>());
48+
tracks->reserve(pfcands->size() + lostTracks->size());
49+
50+
for (const auto& container : {pfcands, lostTracks}) {
51+
for (const pat::PackedCandidate& trk : *container) {
52+
if (!trk.hasTrackDetails())
53+
continue;
54+
if (!trkSelection_(trk))
55+
continue;
56+
if (HighPurity_ && !trk.trackHighPurity())
57+
continue;
58+
tracks->emplace_back(*trk.bestTrack());
59+
}
60+
}
61+
62+
iEvent.put(std::move(tracks));
63+
}
64+
65+
#include "FWCore/Framework/interface/MakerMacros.h"
66+
DEFINE_FWK_MODULE(pfTracksProducer);

0 commit comments

Comments
 (0)