2 #include "fastjet/PseudoJet.hh"
3 #include "fastjet/ClusterSequence.hh"
10 : src_(iConfig.getParameter<edm::
InputTag>(
"src")),
12 Njets_(iConfig.getParameter<std::
vector<unsigned>>(
"Njets")),
13 cuts_(iConfig.getParameter<std::
vector<std::
string>>(
"cuts")),
14 ecftype_(iConfig.getParameter<std::
string>(
"ecftype")),
15 alpha_(iConfig.getParameter<double>(
"alpha")),
16 beta_(iConfig.getParameter<double>(
"beta")) {
18 throw cms::Exception(
"ConfigurationError") <<
"cuts and Njets must be the same size in ECFAdder" << std::endl;
22 if (!srcWeights.
label().empty())
25 for (std::vector<unsigned>::const_iterator
n =
Njets_.begin();
n !=
Njets_.end(); ++
n) {
26 std::ostringstream ecfN_str;
27 std::shared_ptr<fastjet::FunctionOfPseudoJet<double>> pfunc;
30 ecfN_str <<
"ecf" << *
n;
31 pfunc.reset(
new fastjet::contrib::EnergyCorrelator(*n,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
33 ecfN_str <<
"ecfC" << *
n;
34 pfunc.reset(
new fastjet::contrib::EnergyCorrelatorCseries(*n,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
36 ecfN_str <<
"ecfD" << *
n;
38 new fastjet::contrib::EnergyCorrelatorGeneralizedD2(
alpha_,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
40 ecfN_str <<
"ecfN" << *
n;
41 pfunc.reset(
new fastjet::contrib::EnergyCorrelatorNseries(*n,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
43 ecfN_str <<
"ecfM" << *
n;
44 pfunc.reset(
new fastjet::contrib::EnergyCorrelatorMseries(*n,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
46 ecfN_str <<
"ecfU" << *
n;
47 pfunc.reset(
new fastjet::contrib::EnergyCorrelatorUseries(*n,
beta_, fastjet::contrib::EnergyCorrelator::pt_R));
50 produces<edm::ValueMap<float>>(ecfN_str.str());
67 for (std::vector<unsigned>::const_iterator
n =
Njets_.begin();
n !=
Njets_.end(); ++
n) {
69 std::vector<float> ecfN;
70 ecfN.reserve(jets->size());
82 auto outT = std::make_unique<edm::ValueMap<float>>();
84 fillerT.insert(jets, ecfN.begin(), ecfN.end());
93 std::vector<fastjet::PseudoJet> fjParticles;
94 for (
unsigned k = 0;
k <
object->numberOfDaughters(); ++
k) {
98 if (dp->numberOfDaughters() == 0) {
99 if (object->isWeighted()) {
102 <<
"ECFAdder: No weights (e.g. PUPPI) given for weighted jet collection" << std::endl;
103 float w = (*weightsHandle_)[dp];
104 fjParticles.push_back(fastjet::PseudoJet(dp->px() *
w, dp->py() *
w, dp->pz() *
w, dp->energy() *
w));
106 fjParticles.push_back(fastjet::PseudoJet(dp->px(), dp->py(), dp->pz(), dp->energy()));
109 for (
unsigned l = 0;
l < subjet->numberOfDaughters(); ++
l) {
110 if (subjet !=
nullptr) {
112 if (subjet->isWeighted()) {
115 <<
"ECFAdder: No weights (e.g. PUPPI) given for weighted jet collection" << std::endl;
116 float w = (*weightsHandle_)[ddp];
117 fjParticles.push_back(fastjet::PseudoJet(ddp->px() *
w, ddp->py() *
w, ddp->pz() *
w, ddp->energy() *
w));
119 fjParticles.push_back(fastjet::PseudoJet(ddp->px(), ddp->py(), ddp->pz(), ddp->energy()));
121 edm::LogWarning(
"MissingJetConstituent") <<
"BasicJet constituent required for ECF computation is missing!";
127 edm::LogWarning(
"MissingJetConstituent") <<
"Jet constituent required for ECF computation is missing!";
139 iDesc.
setComment(
"Energy Correlation Functions adder");
142 iDesc.
add<std::vector<unsigned>>(
"Njets", {1, 2, 3})->setComment(
"Number of jets to emulate");
143 iDesc.
add<std::vector<std::string>>(
"cuts", {
"",
"",
""})
144 ->setComment(
"Jet selections for each N value. Size must match Njets.");
145 iDesc.
add<
double>(
"alpha", 1.0)->
setComment(
"alpha factor, only valid for N2");
146 iDesc.
add<
double>(
"beta", 1.0)->
setComment(
"angularity factor");
147 iDesc.
add<
std::string>(
"ecftype",
"")->setComment(
"ECF type: ECF or empty; C; D; N; M; U;");
149 descriptions.
add(
"ECFAdder", iDesc);
void setComment(std::string const &value)
edm::EDGetTokenT< edm::ValueMap< float > > input_weights_token_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
ECFAdder(const edm::ParameterSet &iConfig)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
T const * get() const
Returns C++ pointer to the item.
Base class for all types of Jets.
edm::ValueMap< float > const * weightsHandle_
constexpr bool isUninitialized() const noexcept
float getECF(unsigned index, const edm::Ptr< reco::Jet > &object) const
std::vector< std::string > variables_
std::vector< std::string > cuts_
std::vector< std::shared_ptr< fastjet::FunctionOfPseudoJet< double > > > routine_
void setComment(std::string const &value)
bool get(ProductID const &oid, Handle< PROD > &result) const
edm::EDGetTokenT< edm::View< reco::Jet > > src_token_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< unsigned > Njets_
bool isNonnull() const
Checks for non-null.
static std::string join(char **cmd)
T getParameter(std::string const &) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Log< level::Warning, false > LogWarning
std::vector< StringCutObjectSelector< reco::Jet > > selectors_