22 #include <unordered_map> 41 typedef std::unordered_map<std::string, int>
TypeMap;
42 typedef std::vector<std::unique_ptr<IsolationConeDefinitionBase>>
IsoTypes;
63 : _typeMap({{
"h+", 1}, {
"h0", 5}, {
"gamma", 4}, {
"electron", 2}, {
"muon", 3}, {
"HFh", 6}, {
"HFgamma", 7}}) {
64 _to_isolate = consumes<CandView>(
c.getParameter<
edm::InputTag>(
"srcToIsolate"));
65 _isolate_with = consumes<CandView>(
c.getParameter<
edm::InputTag>(
"srcForIsolationCone"));
67 puppiValueMapToken_ = mayConsume<edm::ValueMap<float>>(
69 useValueMapForPUPPI =
true;
71 useValueMapForPUPPI =
false;
74 const std::vector<edm::ParameterSet>& isoDefs =
c.getParameterSetVector(
"isolationConeDefinitions");
75 for (
const auto& isodef : isoDefs) {
77 const float coneSize = isodef.getParameter<
double>(
"coneSize");
81 auto decimal = coneName.find(
'.');
82 if (decimal != std::string::npos)
83 coneName.erase(decimal, 1);
86 theisolator->setConsumes(consumesCollector());
87 const auto thetype = _typeMap.find(isotype);
88 if (thetype == _typeMap.end()) {
89 throw cms::Exception(
"InvalidIsolationType") <<
"Isolation type: " << isotype <<
" is not available in the " 90 <<
"list of allowed isolations!.";
93 std::string pname = isotype + dash + coneName + dash + theisolator->additionalCode();
94 _product_names[thetype->second].emplace_back(
pname);
95 produces<edm::ValueMap<float>>(
pname);
96 _isolation_types[thetype->second].emplace_back(
std::move(theisolator));
102 for (
const auto& isolator : isolators_for_type) {
103 isolator->getEventSetupInfo(es);
109 typedef std::unique_ptr<edm::ValueMap<float>> product_type;
110 typedef std::vector<float> product_values;
119 std::array<std::vector<product_values>,
kNPFTypes> the_values;
123 the_values[
i++].resize(isolators_for_type.size());
124 for (
const auto& isolator : isolators_for_type) {
125 isolator->getEventInfo(
ev);
130 for (
size_t c = 0;
c < to_isolate->
size(); ++
c) {
131 auto cand_to_isolate = to_isolate->
ptrAt(
c);
132 std::array<std::vector<float>,
kNPFTypes> cand_values;
135 cand_values[
k].resize(isolators_for_type.size());
136 for (
auto&
value : cand_values[
k])
140 for (
size_t ic = 0; ic < isolate_with->
size(); ++ic) {
141 auto isocand = isolate_with->
ptrAt(ic);
143 auto isotype =
helper.translatePdgIdToType(isocand->pdgId());
145 for (
unsigned i = 0;
i < isolations.size(); ++
i) {
146 if (isolations[
i]->isInIsolationCone(cand_to_isolate, isocand)) {
147 double puppiWeight = 0.;
156 puppiWeight = (*puppiValueMap)[isocand];
157 if (puppiWeight > 0.)
158 cand_values[isotype][
i] +=
166 for (
unsigned j = 0;
j < cand_values[
i].size(); ++
j) {
167 the_values[
i][
j].push_back(cand_values[
i][
j]);
173 for (
unsigned j = 0;
j < the_values[
i].size(); ++
j) {
176 fillerprod.
insert(to_isolate, the_values[
i][
j].begin(), the_values[
i][
j].end());
186 iDesc.
setComment(
"PUPPI isolation sum producer");
189 ->setComment(
"calculate isolation for this collection");
191 ->setComment(
"collection for the isolation calculation: like particleFlow ");
193 ->setComment(
"source for puppi, if left empty weight from packedCandidate is taken");
196 descIsoConeDefinitions.
add<
std::string>(
"isolationAlgo",
"no default");
197 descIsoConeDefinitions.
add<
double>(
"coneSize", 0.3);
198 descIsoConeDefinitions.
add<
std::string>(
"isolateAgainst",
"no default");
199 descIsoConeDefinitions.
add<std::vector<unsigned>>(
"miniAODVertexCodes", {2, 3});
200 descIsoConeDefinitions.
addOptional<
double>(
"VetoConeSizeBarrel", 0.0);
201 descIsoConeDefinitions.
addOptional<
double>(
"VetoConeSizeEndcaps", 0.0);
202 descIsoConeDefinitions.
addOptional<
double>(
"VetoThreshold", 0.0);
203 descIsoConeDefinitions.
addOptional<
double>(
"VetoConeSize", 0.0);
204 descIsoConeDefinitions.
addOptional<
int>(
"vertexIndex", 0);
206 ->setComment(
"map for footprint removal that is used for photons");
214 iDesc.
add<
bool>(
"usePUPPINoLepton",
false);
216 descriptions.
add(
"CITKPFIsolationSumProducerForPUPPI", iDesc);
float puppiWeight() const
std::unordered_map< std::string, int > TypeMap
citk::PFIsolationSumProducerForPUPPI CITKPFIsolationSumProducerForPUPPI
float puppiWeightNoLep() const
Weight from full PUPPI.
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
Ptr< value_type > ptrAt(size_type i) const
void produce(edm::Event &, const edm::EventSetup &) final
edm::Handle< edm::ValueMap< float > > puppiValueMap
void insert(const H &h, I begin, I end)
std::array< std::vector< std::string >, kNPFTypes > _product_names
edm::EDGetTokenT< edm::ValueMap< float > > puppiValueMapToken_
void setComment(std::string const &value)
bool isNull() const
Checks for null.
edm::View< reco::Candidate > CandView
std::array< IsoTypes, kNPFTypes > _isolation_types
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) final
#define DEFINE_FWK_MODULE(type)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
PFIsolationSumProducerForPUPPI(const edm::ParameterSet &)
edm::EDGetTokenT< CandView > _to_isolate
TracksUtilities< TrackerTraits > helper
~PFIsolationSumProducerForPUPPI() override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Particle reconstructed by the particle flow algorithm.
std::vector< std::unique_ptr< IsolationConeDefinitionBase > > IsoTypes
static constexpr unsigned kNPFTypes
edm::EDGetTokenT< CandView > _isolate_with