1 #ifndef PhysicsTools_IsolationAlgos_CITKIsolationSumProducer_H
2 #define PhysicsTools_IsolationAlgos_CITKIsolationSumProducer_H
26 #include <unordered_map>
51 typedef std::unordered_map<std::
string,
int>
TypeMap;
68 : _typeMap({{
"h+", 1}, {
"h0", 5}, {
"gamma", 4}, {
"electron", 2}, {
"muon", 3}, {
"HFh", 6}, {
"HFgamma", 7}}) {
69 _to_isolate = consumes<CandView>(
c.getParameter<
edm::InputTag>(
"srcToIsolate"));
70 _isolate_with = consumes<CandView>(
c.getParameter<
edm::InputTag>(
"srcForIsolationCone"));
71 const std::vector<edm::ParameterSet>&
isoDefs =
c.getParameterSetVector(
"isolationConeDefinitions");
72 for (
const auto& isodef : isoDefs) {
74 const float coneSize = isodef.getParameter<
double>(
"coneSize");
76 sprintf(buf,
"DR%.2f", coneSize);
78 auto decimal = coneName.find(
'.');
79 if (decimal != std::string::npos)
80 coneName.erase(decimal, 1);
83 theisolator->setConsumes(consumesCollector());
84 const auto thetype = _typeMap.find(isotype);
85 if (thetype == _typeMap.end()) {
86 throw cms::Exception(
"InvalidIsolationType") <<
"Isolation type: " << isotype <<
" is not available in the "
87 <<
"list of allowed isolations!.";
90 std::string pname = isotype + dash + coneName + dash + theisolator->additionalCode();
91 _product_names[thetype->second].emplace_back(pname);
92 produces<edm::ValueMap<float>>(
pname);
93 _isolation_types[thetype->second].emplace_back(
std::move(theisolator));
99 for (
const auto& isolator : isolators_for_type) {
100 isolator->getEventSetupInfo(es);
106 typedef std::unique_ptr<edm::ValueMap<float>> product_type;
107 typedef std::vector<float> product_values;
113 std::array<std::vector<product_values>,
kNPFTypes> the_values;
117 the_values[i++].resize(isolators_for_type.size());
118 for (
const auto& isolator : isolators_for_type) {
119 isolator->getEventInfo(ev);
124 for (
size_t c = 0;
c < to_isolate->size(); ++
c) {
125 auto cand_to_isolate = to_isolate->ptrAt(
c);
126 std::array<std::vector<float>,
kNPFTypes> cand_values;
128 for (
const auto& isolators_for_type : _isolation_types) {
129 cand_values[
k].resize(isolators_for_type.size());
130 for (
auto&
value : cand_values[k])
134 for (
size_t ic = 0; ic < isolate_with->size(); ++ic) {
135 auto isocand = isolate_with->ptrAt(ic);
137 const auto& isolations = _isolation_types[isotype];
138 for (
unsigned i = 0; i < isolations.size(); ++
i) {
139 if (isolations[i]->isInIsolationCone(cand_to_isolate, isocand)) {
140 cand_values[isotype][
i] += isocand->pt();
146 for (
unsigned j = 0;
j < cand_values[
i].size(); ++
j) {
147 the_values[
i][
j].push_back(cand_values[i][
j]);
153 for (
unsigned j = 0;
j < the_values[
i].size(); ++
j) {
156 fillerprod.
insert(to_isolate, the_values[i][
j].
begin(), the_values[i][
j].
end());
169 ->setComment(
"calculate isolation for this collection");
171 ->setComment(
"collection for the isolation calculation: like particleFlow ");
174 descIsoConeDefinitions.
add<
std::string>(
"isolationAlgo",
"no default");
175 descIsoConeDefinitions.
add<
double>(
"coneSize", 0.3);
176 descIsoConeDefinitions.
add<
std::string>(
"isolateAgainst",
"no default");
177 descIsoConeDefinitions.
add<std::vector<unsigned>>(
"miniAODVertexCodes", {2, 3});
178 descIsoConeDefinitions.
addOptional<
double>(
"VetoConeSizeBarrel", 0.0);
179 descIsoConeDefinitions.
addOptional<
double>(
"VetoConeSizeEndcaps", 0.0);
180 descIsoConeDefinitions.
addOptional<
int>(
"vertexIndex", 0);
182 ->setComment(
"map for footprint removal that is used for photons");
184 std::vector<edm::ParameterSet> isolationConeDefinitions;
186 isolationConeDefinitions.push_back(chargedHadrons);
187 isolationConeDefinitions.push_back(neutralHadrons);
188 isolationConeDefinitions.push_back(photons);
189 iDesc.
addVPSet(
"isolationConeDefinitions", descIsoConeDefinitions, isolationConeDefinitions);
191 descriptions.
add(
"CITKPFIsolationSumProducer", iDesc);
PFIsolationSumProducer(const edm::ParameterSet &)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const edm::EventSetup & c
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
~PFIsolationSumProducer() override
std::vector< std::unique_ptr< IsolationConeDefinitionBase > > IsoTypes
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
const std::vector< edm::ParameterSet > & isoDefs
void insert(const H &h, I begin, I end)
std::unique_ptr< T, impl::DeviceDeleter > unique_ptr
std::unordered_map< std::string, int > TypeMap
std::array< IsoTypes, kNPFTypes > _isolation_types
void setComment(std::string const &value)
void produce(edm::Event &, const edm::EventSetup &) final
edm::EDGetTokenT< CandView > _to_isolate
std::array< std::vector< std::string >, kNPFTypes > _product_names
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) final
void add(std::string const &label, ParameterSetDescription const &psetDescription)
ParticleType translatePdgIdToType(int pdgid) const
static constexpr unsigned kNPFTypes
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Particle reconstructed by the particle flow algorithm.
edm::EDGetTokenT< CandView > _isolate_with