Skip to content

Commit 4173b91

Browse files
committed
Update KMuon
- Isolation and cutbased ID variables moved to KLepton - Reduced amount of isolation variables
1 parent b33bbd2 commit 4173b91

File tree

2 files changed

+128
-94
lines changed

2 files changed

+128
-94
lines changed

DataFormats/interface/KMuon.h

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -50,72 +50,69 @@ struct KMuonMetadata
5050

5151
struct KMuon : public KLepton
5252
{
53-
/*
54-
virtual ~KMuon() {};
55-
56-
virtual bool isMuon() {
57-
return true;
58-
};
59-
*/
60-
53+
/// global track in addition to KLepton track == innerTrack, no outer or best track
6154
KTrack globalTrack;
62-
KTrack innerTrack;
63-
KTrack outerTrack;
64-
KTrack bestTrack;
65-
66-
/// type of the muon: bits are set according to reco::Muon::type_;
67-
unsigned char type;
68-
69-
inline bool isTrackerMuon() const { return (type & (1 << 2)); };
70-
inline bool isCaloMuon() const { return (type & (1 << 4)); };
71-
inline bool isStandAloneMuon() const { return (type & (1 << 3)); };
72-
inline bool isGlobalMuon() const { return (type & (1 << 1)); };
73-
inline bool isPFMuon() const { return (type & (1 << 5)); };
74-
75-
float hcalIso03; ///< hcal isolation as given by muon.isolationR03().hadEt
76-
float ecalIso03; ///< ecal isolation as given by muon.isolationR03().emEt
77-
float trackIso03; ///< tracker isolation as given by muon.isolationR03().sumPt
78-
79-
float pfIso04; ///< PF isolation
8055

81-
float hcalIso05;
82-
float ecalIso05;
83-
float trackIso05;
56+
/// ID variables
57+
unsigned long isGoodMuonBits; //< isGoodMuon bitmask, used by soft ID
58+
unsigned char type; //< type of the muon: bits are set according to reco::Muon::type_ (used by various IDs)
8459

85-
unsigned int isGoodMuon; ///< bitmask
60+
/// ID var from track: nValidPixelHits, nTrackerLayers
61+
/// ID var from globalTrack: normalizedChi2=chi2/nDOF, nValidMuonHits
62+
/// ID var from the bestTrack which is not saved entirely:
63+
float dxy; //< dxy from vertex using IPTools like PAT
64+
float dz; //< dz from vertex using bestTrack->dz(vtx)
8665

87-
float caloComp, segComp;
66+
/// muon system information
67+
short nMatchedStations;
68+
// unused variables
69+
short nChambers, nMatches;
70+
float caloCompatibility, segmentCompatibility;
8871

89-
int nChambers;
90-
int nMatches;
72+
/// isolation results
73+
float trackIso03; ///< tracker isolation as given by muon.isolationR03().sumPt
74+
float pfIso03; ///< PF isolation R = 0.3
75+
// deleted: hcalIso03, ecalIso03 and all 05
9176

92-
unsigned long long hltMatch;
77+
/// additional isolation variables for PF isolation which are not stored in a KLepton
78+
/// DataFormats/MuonReco/interface/MuonPFIsolation.h
79+
float sumChargedParticlePt;
80+
float sumNeutralHadronEtHighThreshold;
81+
float sumPhotonEtHighThreshold;
9382

9483
/// \f$\eta\f$ and \f$\phi\f$ after the propagation to the muon system, this quantity
9584
/// is necessary for the matching to L1 trigger objects
9685
float eta_propagated, phi_propagated;
9786

87+
unsigned long long hltMatch;
88+
89+
/// accessor functions to CMSSW muon bitsets
90+
inline bool isGoodMuon(KGoodMuon::KGoodMuonType bit) const { return (isGoodMuonBits & (1 << bit)); };
91+
inline bool isGlobalMuon() const { return (type & (1 << 1)); };
92+
inline bool isTrackerMuon() const { return (type & (1 << 2)); };
93+
inline bool isStandAloneMuon() const { return (type & (1 << 3)); };
94+
inline bool isCaloMuon() const { return (type & (1 << 4)); };
95+
inline bool isPFMuon() const { return (type & (1 << 5)); };
96+
inline bool isRPCMuon() const { return (type & (1 << 6)); };
97+
98+
double pfIso04high(const double puFraction=0.5) const
99+
{
100+
return sumChargedHadronPt + std::max(0.0,
101+
sumNeutralHadronEtHighThreshold + sumPhotonEtHighThreshold - puFraction * sumPUPt);
102+
}
103+
98104
/// returns whether a given HLT fired
99105
/** the information is read from the metadata
100-
@param name Name of the HLT
101-
@param muonMetadata reference to the meta data object
106+
@param hltName Name of the HLT
107+
@param meta reference to the muon meta data object
102108
*/
103-
bool hltFired(const std::string& name, const KMuonMetadata* muonMetadata) const
109+
bool hltFired(const std::string& hltName, const KMuonMetadata* meta) const
104110
{
105-
std::vector<std::string>::const_iterator itSearch = std::lower_bound(muonMetadata->hltNames.begin(), muonMetadata->hltNames.end(), name);
106-
if (itSearch != muonMetadata->hltNames.end())
107-
return (hltMatch & (1ull << (itSearch - muonMetadata->hltNames.begin()))) != 0;
111+
std::vector<std::string>::const_iterator itSearch = std::lower_bound(meta->hltNames.begin(), meta->hltNames.end(), hltName);
112+
if (itSearch != meta->hltNames.end())
113+
return (hltMatch & (1ull << (itSearch - meta->hltNames.begin()))) != 0;
108114
return false; // given HLT does not exist
109115
}
110-
111-
double puSubtractedPFIso04(const KPileupDensity* puRho) const
112-
{
113-
// jetArea == NULL --> no PU subtraction
114-
if(puRho == NULL) return pfIso04;
115-
116-
static const double coneSize = 0.4;
117-
return std::max(0.0, pfIso04 - puRho->rho * coneSize * coneSize * 3.14159);
118-
}
119116
};
120117
typedef std::vector<KMuon> KMuons;
121118

Producers/interface/KMuonProducer.h

Lines changed: 82 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
4242
propagatorToMuonSystem(cfg)
4343
{
4444
std::sort(selectedMuonTriggerObjects.begin(), selectedMuonTriggerObjects.end());
45-
std::vector<std::string>::iterator tempIt = std::unique (selectedMuonTriggerObjects.begin(), selectedMuonTriggerObjects.end());
45+
std::vector<std::string>::iterator tempIt = std::unique(
46+
selectedMuonTriggerObjects.begin(), selectedMuonTriggerObjects.end());
4647
selectedMuonTriggerObjects.resize(tempIt - selectedMuonTriggerObjects.begin());
4748

4849
muonMetadata = new KMuonMetadata();
@@ -98,10 +99,14 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
9899
pfIsoVetoCone = pset.getParameter<double>("pfIsoVetoCone");
99100
pfIsoVetoMinPt = pset.getParameter<double>("pfIsoVetoMinPt");
100101

102+
edm::InputTag VertexCollectionSource = pset.getParameter<edm::InputTag>("vertexcollection");
103+
cEvent->getByLabel(VertexCollectionSource, VertexHandle);
104+
101105
// Continue normally
102106
KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>::fillProduct(in, out, name, tag, pset);
103107
}
104108

109+
/// fill muon from DataFormats/MuonReco/interface/Muon.h
105110
virtual void fillSingle(const SingleInputType &in, SingleOutputType &out)
106111
{
107112
out.flavour = KLepton::MUON;
@@ -114,35 +119,51 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
114119
KTrackProducer::fillTrack(*in.track(), out.track);
115120
if (in.globalTrack().isNonnull())
116121
KTrackProducer::fillTrack(*in.globalTrack(), out.globalTrack);
117-
if (in.innerTrack().isNonnull())
118-
KTrackProducer::fillTrack(*in.innerTrack(), out.innerTrack);
119-
if (in.outerTrack().isNonnull())
120-
KTrackProducer::fillTrack(*in.outerTrack(), out.outerTrack);
121-
if (in.bestTrack())
122-
KTrackProducer::fillTrack(*in.bestTrack(), out.bestTrack);
123122

123+
edm::View<reco::Vertex> vertices = *VertexHandle;
124+
reco::Vertex vtx = vertices.at(0);
125+
if (in.muonBestTrack().isNonnull()) // && &vtx != NULL) TODO
126+
{
127+
/// ID var from the bestTrack which is not saved entirely
128+
out.dxy = 0; //dxy from vertex using IPTools like PAT
129+
out.dz = in.bestTrack()->dz(vtx.position());
130+
}
131+
// propagated values of eta and phi
132+
out.eta_propagated = -1000.;
133+
out.phi_propagated = -1000.;
134+
if (in.innerTrack().isNonnull() && !noPropagation)
135+
{
136+
TrajectoryStateOnSurface prop = propagatorToMuonSystem.extrapolate(in);
137+
if (prop.isValid())
138+
{
139+
out.eta_propagated = prop.globalPosition().eta();
140+
out.phi_propagated = prop.globalPosition().phi();
141+
}
142+
}
124143

125-
// Charge, ...
126-
out.charge = in.charge();
144+
// Charge, muon system information
145+
assert(in.charge() == 1 || in.charge() == -1);
146+
out.leptonInfo |= (in.charge() > 0) ? KLeptonChargeMask : 0;
127147
out.nChambers = in.numberOfChambers();
128148
out.nMatches = in.numberOfMatches();
129-
out.caloComp = in.caloCompatibility();
130-
out.segComp = muon::segmentCompatibility(in);
149+
out.nMatchedStations = in.numberOfMatchedStations();
150+
out.caloCompatibility = muon::caloCompatibility(in);
151+
out.segmentCompatibility = muon::segmentCompatibility(in);
131152

132-
assert(in.type() <= 255);
153+
assert(in.type() < 256);
133154
out.type = in.type();
134155

135-
// muon ID selection, described in AN-2008/098
136-
// http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/doxygen/CMSSW_3_3_6/doc/html/dd/de0/MuonSelectors_8cc-source.html#l00005
156+
// muon ID selection
157+
// DataFormats/MuonReco/src/MuonSelectors.cc
137158
std::bitset<32> tmpBits;
138159
for (size_t i = 0; i < 16; ++i)
139-
tmpBits.set(i, muon::isGoodMuon(in, (muon::SelectionType)i));
140-
out.isGoodMuon = (unsigned int)tmpBits.to_ulong();
160+
tmpBits.set(i, muon::isGoodMuon(in, (muon::SelectionType) i));
161+
out.isGoodMuonBits = (unsigned int) tmpBits.to_ulong();
141162

142-
// Isolation
163+
/// Isolation
164+
// source?
143165
edm::RefToBase<reco::Muon> muonref(edm::Ref<edm::View<reco::Muon> >(handle, this->nCursor));
144166
reco::IsoDeposit muonIsoDepositPF = (*isoDepsPF)[muonref];
145-
146167
reco::isodeposit::Direction dir = reco::isodeposit::Direction(in.eta(), in.phi());
147168
reco::isodeposit::ConeVeto pf_cone_veto(dir, pfIsoVetoCone);
148169
reco::isodeposit::ThresholdVeto pf_threshold_veto(pfIsoVetoMinPt);
@@ -151,31 +172,48 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
151172
vetosPF.push_back(&pf_cone_veto);
152173
vetosPF.push_back(&pf_threshold_veto);
153174

154-
out.ecalIso03 = in.isolationR03().emEt;
155-
out.hcalIso03 = in.isolationR03().hadEt;
156-
out.trackIso03 = in.isolationR03().sumPt;
157-
158-
out.pfIso04 = muonIsoDepositPF.depositWithin(0.4, vetosPF);
159-
160-
out.ecalIso05 = in.isolationR05().emEt;
161-
out.hcalIso05 = in.isolationR05().hadEt;
162-
out.trackIso05 = in.isolationR05().sumPt;
163-
164-
out.eta_propagated = -1000.;
165-
out.phi_propagated = -1000.;
166-
167-
// propagated values
168-
if (in.innerTrack().isNonnull() && !noPropagation)
169-
{
170-
TrajectoryStateOnSurface prop = propagatorToMuonSystem.extrapolate(in);
171-
if (prop.isValid())
172-
{
173-
out.eta_propagated = prop.globalPosition().eta();
174-
out.phi_propagated = prop.globalPosition().phi();
175-
}
176-
}
175+
/// isolation results
176+
out.trackIso03 = in.isolationR03().sumPt;
177+
out.pfIso03 = muonIsoDepositPF.depositWithin(0.3, vetosPF);
178+
//out.pfIso04 = muonIsoDepositPF.depositWithin(0.4, vetosPF);
179+
180+
/// isolation variables for pfIso04
181+
/// DataFormats/MuonReco/interface/MuonPFIsolation.h
182+
out.sumChargedHadronPt = in.pfIsolationR04().sumChargedHadronPt;
183+
out.sumChargedParticlePt = in.pfIsolationR04().sumChargedParticlePt;
184+
out.sumNeutralHadronEt = in.pfIsolationR04().sumNeutralHadronEt;
185+
out.sumPhotonEt = in.pfIsolationR04().sumPhotonEt;
186+
out.sumPUPt = in.pfIsolationR04().sumPUPt;
187+
out.sumNeutralHadronEtHighThreshold = in.pfIsolationR04().sumNeutralHadronEtHighThreshold;
188+
out.sumPhotonEtHighThreshold = in.pfIsolationR04().sumPhotonEtHighThreshold;
189+
190+
/// highpt ID variables
191+
/** needed variables according to
192+
https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideMuonId#New_HighPT_Version_recommended
193+
not in new CMSSW versions
194+
195+
reco::TrackRef cktTrack = muon::improvedMuonBestTrack(const reco::Muon & recoMu, muon::improvedTuneP);
196+
dxy_high = cktTrack->db...
197+
dz_high = 0;
198+
pt_high = cktTrack->pt();
199+
pte_high = cktTrack->ptError();
200+
*/
177201

178202
out.hltMatch = getHLTInfo(out.p4);
203+
204+
/// precomputed muon IDs
205+
/** https://hypernews.cern.ch/HyperNews/CMS/get/muon/868.html
206+
https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideMuonId#Baseline_muon_selections_for_201
207+
DataFormats/MuonReco/src/MuonSelectors.cc
208+
automatically use muon::improvedTuneP default as in CMSSW
209+
last update: 2014-10-03
210+
*/
211+
out.ids = KLeptonId::ANY;
212+
out.ids |= (muon::isLooseMuon(in) << KLeptonId::LOOSE);
213+
out.ids |= (muon::isTightMuon(in, vtx) << KLeptonId::TIGHT);
214+
out.ids |= (muon::isSoftMuon(in, vtx) << KLeptonId::SOFT);
215+
out.ids |= (muon::isHighPtMuon(in, vtx, reco::improvedTuneP) << KLeptonId::HIGHPT); // a
216+
assert((out.ids & 148) == 0); // 148 = 0b10010100, these bits should be zero
179217
}
180218

181219
private:
@@ -185,10 +223,9 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
185223
std::vector<std::string> selectedMuonTriggerObjects;
186224
bool noPropagation;
187225
PropagateToMuon propagatorToMuonSystem;
188-
edm::Handle< edm::ValueMap<reco::IsoDeposit> > isoDepsPF;
189-
190-
edm::Handle< trigger::TriggerEvent > triggerEventHandle;
191-
226+
edm::Handle<edm::ValueMap<reco::IsoDeposit> > isoDepsPF;
227+
edm::Handle<trigger::TriggerEvent> triggerEventHandle;
228+
edm::Handle<edm::View<reco::Vertex> > VertexHandle;
192229
KMuonMetadata *muonMetadata;
193230

194231
std::map<std::string, int> muonTriggerObjectBitMap;

0 commit comments

Comments
 (0)