1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#ifndef CommonTools_ParticleFlow_IsolatedPFCandidateSelectorDefinition
#define CommonTools_ParticleFlow_IsolatedPFCandidateSelectorDefinition
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
#include "CommonTools/ParticleFlow/interface/PFCandidateSelectorDefinition.h"
#include "DataFormats/Common/interface/ValueMap.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "FWCore/Utilities/interface/transform.h"
namespace pf2pat {
class IsolatedPFCandidateSelectorDefinition : public PFCandidateSelectorDefinition {
public:
typedef edm::ValueMap<double> IsoMap;
IsolatedPFCandidateSelectorDefinition(const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC)
: isolationValueMapChargedTokens_(
edm::vector_transform(cfg.getParameter<std::vector<edm::InputTag> >("isolationValueMapsCharged"),
[&](edm::InputTag const& tag) { return iC.consumes<IsoMap>(tag); })),
isolationValueMapNeutralTokens_(
edm::vector_transform(cfg.getParameter<std::vector<edm::InputTag> >("isolationValueMapsNeutral"),
[&](edm::InputTag const& tag) { return iC.consumes<IsoMap>(tag); })),
doDeltaBetaCorrection_(cfg.getParameter<bool>("doDeltaBetaCorrection")),
deltaBetaIsolationValueMapToken_(
iC.mayConsume<IsoMap>(cfg.getParameter<edm::InputTag>("deltaBetaIsolationValueMap"))),
deltaBetaFactor_(cfg.getParameter<double>("deltaBetaFactor")),
isRelative_(cfg.getParameter<bool>("isRelative")),
isolationCut_(cfg.getParameter<double>("isolationCut")) {}
void select(const HandleToCollection& hc, const edm::Event& e, const edm::EventSetup& s) {
selected_.clear();
// read all charged isolation value maps
std::vector<edm::Handle<IsoMap> > isoMapsCharged(isolationValueMapChargedTokens_.size());
for (unsigned iMap = 0; iMap < isolationValueMapChargedTokens_.size(); ++iMap) {
e.getByToken(isolationValueMapChargedTokens_[iMap], isoMapsCharged[iMap]);
}
// read all neutral isolation value maps
std::vector<edm::Handle<IsoMap> > isoMapsNeutral(isolationValueMapNeutralTokens_.size());
for (unsigned iMap = 0; iMap < isolationValueMapNeutralTokens_.size(); ++iMap) {
e.getByToken(isolationValueMapNeutralTokens_[iMap], isoMapsNeutral[iMap]);
}
edm::Handle<IsoMap> dBetaH;
if (doDeltaBetaCorrection_) {
e.getByToken(deltaBetaIsolationValueMapToken_, dBetaH);
}
unsigned key = 0;
for (collection::const_iterator pfc = hc->begin(); pfc != hc->end(); ++pfc, ++key) {
reco::PFCandidateRef candidate(hc, key);
bool passed = true;
double isoSumCharged = 0.0;
double isoSumNeutral = 0.0;
for (unsigned iMap = 0; iMap < isoMapsCharged.size(); ++iMap) {
const IsoMap& isoMap = *(isoMapsCharged[iMap]);
double val = isoMap[candidate];
isoSumCharged += val;
}
for (unsigned iMap = 0; iMap < isoMapsNeutral.size(); ++iMap) {
const IsoMap& isoMap = *(isoMapsNeutral[iMap]);
double val = isoMap[candidate];
isoSumNeutral += val;
}
if (doDeltaBetaCorrection_) {
const IsoMap& isoMap = *dBetaH;
double dBetaVal = isoMap[candidate];
double dBetaCorIsoSumNeutral = isoSumNeutral + deltaBetaFactor_ * dBetaVal;
isoSumNeutral = dBetaCorIsoSumNeutral > 0 ? dBetaCorIsoSumNeutral : 0; //follow muon POG definition in 2012
}
double isoSum = isoSumCharged + isoSumNeutral;
if (isRelative_) {
isoSum /= candidate->pt();
}
if (isoSum > isolationCut_) {
passed = false;
}
if (passed) {
// passed all cuts, selected
selected_.push_back(reco::PFCandidate(*pfc));
reco::PFCandidatePtr ptrToMother(hc, key);
selected_.back().setSourceCandidatePtr(ptrToMother);
}
}
}
static void fillPSetDescription(edm::ParameterSetDescription& desc) {
desc.add<std::vector<edm::InputTag> >("isolationValueMapsCharged", {});
desc.add<std::vector<edm::InputTag> >("isolationValueMapsNeutral", {});
desc.add<bool>("doDeltaBetaCorrection", false);
desc.add<edm::InputTag>("deltaBetaIsolationValueMap", edm::InputTag(""));
desc.add<double>("deltaBetaFactor", -0.5);
desc.add<bool>("isRelative", true)->setComment("if True isolation is relative to pT");
desc.add<double>("isolationCut", 999);
}
private:
std::vector<edm::EDGetTokenT<IsoMap> > isolationValueMapChargedTokens_;
std::vector<edm::EDGetTokenT<IsoMap> > isolationValueMapNeutralTokens_;
bool doDeltaBetaCorrection_;
edm::EDGetTokenT<IsoMap> deltaBetaIsolationValueMapToken_;
double deltaBetaFactor_;
bool isRelative_;
double isolationCut_;
};
} // namespace pf2pat
#endif
|