32 size_t first = line.find (
'{');
33 size_t last = line.find (
'}');
35 if (first != std::string::npos && last != std::string::npos && first < last)
36 return std::string(line, first + 1, last - first - 1);
43 throw edm::Exception(static_cast<edm::errors::ErrorCodes>(code), message);
45 std::stringstream
error;
46 error << message <<
" Error code: " << code;
47 throw std::runtime_error(error.str());
54 {Binning::JetAbsEta,
"JetAbsEta"}, {Binning::JetE,
"JetE"},
63 JetParameters::JetParameters(std::initializer_list<typename value_type::value_type>
init) {
65 set(
i.first,
i.second);
76 m_values[Binning::JetAbsEta] = fabs(eta);
81 m_values[Binning::JetE] =
e;
86 m_values[Binning::JetArea] =
area;
101 m_values[Binning::Rho] = rho;
106 m_values.emplace(bin, value);
110 m_values.emplace(Binning::JetAbsEta, fabs(value));
117 set(value.first, value.second);
121 std::vector<float> JetParameters::createVector(
const std::vector<Binning>&
binning)
const {
122 std::vector<float>
values;
123 for (
const auto&
bin: binning) {
124 const auto& it = m_values.find(
bin);
125 if (it == m_values.cend()) {
127 JetParameters::binning_to_string.left.at(
bin) +
128 "' but no value for this parameter has been specified. Please call the appropriate 'set' function of the JME::JetParameters object");
131 values.push_back(it->second);
138 JetResolutionObject::Definition::Definition(
const std::string& definition) {
140 std::vector<std::string> tokens = getTokens(definition);
143 if (tokens.size() < 3) {
147 size_t n_bins = std::stoul(tokens[0]);
149 if (tokens.size() < (n_bins + 2)) {
153 for (
size_t i = 0;
i < n_bins;
i++) {
154 m_bins_name.push_back(tokens[
i + 1]);
157 size_t n_variables = std::stoul(tokens[n_bins + 1]);
159 if (tokens.size() < (1 + n_bins + 1 + n_variables + 1)) {
163 for (
size_t i = 0;
i < n_variables;
i++) {
164 m_variables_name.push_back(tokens[n_bins + 2 +
i]);
167 m_formula_str = tokens[n_bins + n_variables + 2];
170 std::transform(formula_str_lower.begin(), formula_str_lower.end(), formula_str_lower.begin(), ::tolower);
172 if (formula_str_lower ==
"none")
179 if (!m_formula_str.empty())
181 m_formula = std::make_shared<reco::FormulaEvaluator>(m_formula_str);
183 m_formula = std::make_shared<TFormula>(
"jet_resolution_formula", m_formula_str.c_str());
185 for (
const auto&
bin: m_bins_name) {
186 const auto&
b = JetParameters::binning_to_string.right.find(
bin);
187 if (
b == JetParameters::binning_to_string.right.cend()) {
190 m_bins.push_back(
b->second);
193 for (
const auto&
v: m_variables_name) {
194 const auto&
var = JetParameters::binning_to_string.right.find(
v);
195 if (
var == JetParameters::binning_to_string.right.cend()) {
198 m_variables.push_back(
var->second);
204 std::vector<std::string> tokens = getTokens(line);
212 for (
size_t i = 0;
i < def.
nBins();
i++) {
213 Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
215 m_bins_range.push_back(r);
218 size_t n_parameters = std::stoul(tokens[pos++]);
225 Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
227 m_variables_range.push_back(r);
231 for (
size_t i = 0;
i < n_parameters;
i++) {
232 m_parameters_values.push_back(std::stof(tokens[pos++]));
239 std::ifstream
f(filename);
246 if ((
line.empty()) || (
line[0] ==
'#'))
251 if (!definition.empty()) {
254 m_records.push_back(
Record(
line, m_definition));
262 m_definition =
object.m_definition;
263 m_records =
object.m_records;
264 m_valid =
object.m_valid;
269 JetResolutionObject::JetResolutionObject() {
275 std::cout <<
"Definition: " << std::endl;
276 std::cout <<
" Number of binning variables: " << m_definition.nBins() << std::endl;
278 for (
const auto&
bin: m_definition.getBinsName()) {
282 std::cout <<
" Number of variables: " << m_definition.nVariables() << std::endl;
284 for (
const auto&
bin: m_definition.getVariablesName()) {
288 std::cout <<
" Formula: " << m_definition.getFormulaString() << std::endl;
290 std::cout << std::endl <<
"Bin contents" << std::endl;
292 for (
const auto&
record: m_records) {
295 for (
const auto&
bin:
record.getBinsRange()) {
296 std::cout <<
" " << m_definition.getBinName(index) <<
" [" <<
bin.min <<
" - " <<
bin.max <<
"]" << std::endl;
302 for (
const auto&
r:
record.getVariablesRange()) {
303 std::cout <<
" " << m_definition.getVariableName(index) <<
" [" <<
r.min <<
" - " <<
r.max <<
"] " << std::endl;
309 for (
const auto& par:
record.getParametersValues()) {
310 std::cout <<
" Parameter #" << index <<
" = " << par << std::endl;
318 std::ofstream
fout(file);
319 fout.setf(std::ios::right);
322 fout <<
"{" << m_definition.nBins();
324 for (
auto&
bin: m_definition.getBinsName())
327 fout <<
" " << m_definition.nVariables();
329 for (
auto&
var: m_definition.getVariablesName())
332 fout <<
" " << (m_definition.getFormulaString().empty() ?
"None" : m_definition.getFormulaString()) <<
" Resolution}" << std::endl;
335 for (
auto&
record: m_records) {
336 for (
auto&
r:
record.getBinsRange()) {
337 fout << std::left << std::setw(15) <<
r.min << std::setw(15) <<
r.max << std::setw(15);
341 for (
auto&
r:
record.getVariablesRange()) {
342 fout <<
r.min << std::setw(15) <<
r.max << std::setw(15);
345 for (
auto&
p:
record.getParametersValues()) {
346 fout <<
p << std::setw(15);
349 fout << std::endl << std::setw(0);
360 std::vector<float>
bins = bins_parameters.
createVector(m_definition.getBins());
363 const Record* good_record =
nullptr;
364 for (
const auto&
record: m_records) {
367 size_t valid_bins = 0;
368 size_t current_bin = 0;
369 for (
const auto&
bin:
record.getBinsRange()) {
370 if (
bin.is_inside(bins[current_bin]))
376 if (valid_bins == m_definition.nBins()) {
391 const auto*
formula = m_definition.getFormula();
394 auto const* pFormula = m_definition.getFormula();
402 double variables_[4] = {0};
410 std::vector<double> parametersD(parameters.begin(),parameters.end());
420 return formula.EvalPar(variables_);
ErrorCode
Error code: whether the classification was successful or failed.
T clip(const T &n, const T &lower, const T &upper)
const std::vector< Range > & getVariablesRange() const
Container::value_type value_type
size_t nVariables() const
std::vector< float > createVector(const std::vector< Binning > &binning) const
std::string getDefinitionLine(const std::string &line)
bin
set the eta bin as selection string.
#define TYPELOOKUP_DATA_REG(_dataclass_)
const std::vector< float > & getParametersValues() const
unsigned nParameters() const
T first(std::pair< T, U > const &p)
void throwException(uint32_t code, const std::string &message)