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())
180 m_formula = std::make_shared<TFormula>(
"jet_resolution_formula", m_formula_str.c_str());
182 for (
const auto&
bin: m_bins_name) {
183 const auto&
b = JetParameters::binning_to_string.right.find(
bin);
184 if (
b == JetParameters::binning_to_string.right.cend()) {
187 m_bins.push_back(
b->second);
190 for (
const auto&
v: m_variables_name) {
191 const auto&
var = JetParameters::binning_to_string.right.find(
v);
192 if (
var == JetParameters::binning_to_string.right.cend()) {
195 m_variables.push_back(
var->second);
201 std::vector<std::string> tokens = getTokens(line);
209 for (
size_t i = 0;
i < def.
nBins();
i++) {
210 Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
212 m_bins_range.push_back(r);
215 size_t n_parameters = std::stoul(tokens[pos++]);
222 Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
224 m_variables_range.push_back(r);
228 for (
size_t i = 0;
i < n_parameters;
i++) {
229 m_parameters_values.push_back(std::stof(tokens[pos++]));
236 std::ifstream
f(filename);
243 if ((
line.empty()) || (
line[0] ==
'#'))
248 if (!definition.empty()) {
251 m_records.push_back(
Record(
line, m_definition));
259 m_definition =
object.m_definition;
260 m_records =
object.m_records;
261 m_valid =
object.m_valid;
266 JetResolutionObject::JetResolutionObject() {
272 std::cout <<
"Definition: " << std::endl;
273 std::cout <<
" Number of binning variables: " << m_definition.nBins() << std::endl;
275 for (
const auto&
bin: m_definition.getBinsName()) {
279 std::cout <<
" Number of variables: " << m_definition.nVariables() << std::endl;
281 for (
const auto&
bin: m_definition.getVariablesName()) {
285 std::cout <<
" Formula: " << m_definition.getFormulaString() << std::endl;
287 std::cout << std::endl <<
"Bin contents" << std::endl;
289 for (
const auto&
record: m_records) {
292 for (
const auto&
bin:
record.getBinsRange()) {
293 std::cout <<
" " << m_definition.getBinName(index) <<
" [" <<
bin.min <<
" - " <<
bin.max <<
"]" << std::endl;
299 for (
const auto&
r:
record.getVariablesRange()) {
300 std::cout <<
" " << m_definition.getVariableName(index) <<
" [" <<
r.min <<
" - " <<
r.max <<
"] " << std::endl;
306 for (
const auto& par:
record.getParametersValues()) {
307 std::cout <<
" Parameter #" << index <<
" = " << par << std::endl;
315 std::ofstream
fout(file);
316 fout.setf(std::ios::right);
319 fout <<
"{" << m_definition.nBins();
321 for (
auto&
bin: m_definition.getBinsName())
324 fout <<
" " << m_definition.nVariables();
326 for (
auto&
var: m_definition.getVariablesName())
329 fout <<
" " << (m_definition.getFormulaString().empty() ?
"None" : m_definition.getFormulaString()) <<
" Resolution}" << std::endl;
332 for (
auto&
record: m_records) {
333 for (
auto&
r:
record.getBinsRange()) {
334 fout << std::left << std::setw(15) <<
r.min << std::setw(15) <<
r.max << std::setw(15);
338 for (
auto&
r:
record.getVariablesRange()) {
339 fout <<
r.min << std::setw(15) <<
r.max << std::setw(15);
342 for (
auto&
p:
record.getParametersValues()) {
343 fout <<
p << std::setw(15);
346 fout << std::endl << std::setw(0);
357 std::vector<float>
bins = bins_parameters.
createVector(m_definition.getBins());
360 const Record* good_record =
nullptr;
361 for (
const auto&
record: m_records) {
364 size_t valid_bins = 0;
365 size_t current_bin = 0;
366 for (
const auto&
bin:
record.getBinsRange()) {
367 if (
bin.is_inside(bins[current_bin]))
373 if (valid_bins == m_definition.nBins()) {
388 auto const* pFormula = m_definition.getFormula();
400 double variables_[4] = {0};
405 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)