27         size_t first = line.find (
'{');
    28         size_t last = line.find (
'}');
    30         if (first != std::string::npos && last != std::string::npos && first < last)
    31             return std::string(line, first + 1, last - first - 1);
    37         std::stringstream error;
    38         error << message << 
" Error code: " << code;
    39         throw std::runtime_error(error.str());
    43         {Binning::JetPt, 
"JetPt"}, {Binning::JetEta, 
"JetEta"},
    44         {Binning::JetAbsEta, 
"JetAbsEta"}, {Binning::JetE, 
"JetE"},
    45         {Binning::JetArea, 
"JetArea"}, {Binning::Mu, 
"Mu"},
    46         {Binning::Rho, 
"Rho"}, {Binning::NPV, 
"NPV"}
    50         m_values = std::move(rhs.m_values);
    53     JetParameters::JetParameters(std::initializer_list<typename value_type::value_type> init) {
    55             set(i.first, i.second);
    60         m_values[Binning::JetPt] = pt;
    65         m_values[Binning::JetEta] = eta;
    66         m_values[Binning::JetAbsEta] = fabs(eta);
    71         m_values[Binning::JetE] = e;
    76         m_values[Binning::JetArea] = area;
    81         m_values[Binning::Mu] = mu;
    86         m_values[Binning::NPV] = npv;
    91         m_values[Binning::Rho] = rho;
    96         m_values.emplace(bin, value);
    99         if (bin == Binning::JetEta) {
   100             m_values.emplace(Binning::JetAbsEta, fabs(value));
   106     JetParameters& JetParameters::set(
const typename value_type::value_type& value) {
   107         set(value.first, value.second);
   111     std::vector<float> JetParameters::createVector(
const std::vector<Binning>& binning)
 const {
   112         std::vector<float> 
values;
   113         for (
const auto& bin: binning) {
   114             const auto& it = m_values.find(bin);
   115             if (it == m_values.cend()) {
   117                         JetParameters::binning_to_string.left.at(bin) +
   118                         "' but no value for this parameter has been specified. Please call the appropriate 'set' function of the JME::JetParameters object");
   121             values.push_back(it->second);
   128     JetResolutionObject::Definition::Definition(
const std::string& definition) {
   130         std::vector<std::string> tokens = getTokens(definition);
   133         if (tokens.size() < 3) {
   137         size_t n_bins = std::stoul(tokens[0]);
   139         if (tokens.size() < (n_bins + 2)) {
   143         for (
size_t i = 0; i < n_bins; i++) {
   144             m_bins_name.push_back(tokens[i + 1]);
   147         size_t n_variables = std::stoul(tokens[n_bins + 1]);
   149         if (tokens.size() < (1 + n_bins + 1 + n_variables + 1)) {
   153         for (
size_t i = 0; i < n_variables; i++) {
   154             m_variables_name.push_back(tokens[n_bins + 2 + i]);
   157         m_formula_str = tokens[n_bins + n_variables + 2];
   159         std::string formula_str_lower = m_formula_str;
   160         std::transform(formula_str_lower.begin(), formula_str_lower.end(), formula_str_lower.begin(), ::tolower);
   162         if (formula_str_lower == 
"none") {
   165           if ((tokens.size() > n_bins + n_variables + 3) && (std::atoi(tokens[n_bins + n_variables + 3].c_str()))) {
   166             size_t n_parameters = std::stoul(tokens[n_bins + n_variables + 3]);
   168             if (tokens.size() < (1 + n_bins + 1 + n_variables + 1 + 1 + n_parameters)) {
   172             for (
size_t i = 0; i < n_parameters; i++) {
   173               m_formula_str += tokens[n_bins + n_variables + 4 + i] + 
" ";
   181     void JetResolutionObject::Definition::init() {
   182         if (!m_formula_str.empty()) {
   183          if (m_formula_str.find(
' ') == std::string::npos)
   184             m_formula = std::make_shared<TFormula>(
"jet_resolution_formula", m_formula_str.c_str());
   186           m_parameters_name = getTokens(m_formula_str);
   188         for (
const auto& bin: m_bins_name) {
   189             const auto& b = JetParameters::binning_to_string.right.find(bin);
   190             if (b == JetParameters::binning_to_string.right.cend()) {
   193             m_bins.push_back(b->second);
   196         for (
const auto& v: m_variables_name) {
   197             const auto& var = JetParameters::binning_to_string.right.find(v);
   198             if (var == JetParameters::binning_to_string.right.cend()) {
   201             m_variables.push_back(var->second);
   205     JetResolutionObject::Record::Record(
const std::string& line, 
const Definition& def) {
   207         std::vector<std::string> tokens = getTokens(line);
   215         for (
size_t i = 0; i < def.
nBins(); i++) {
   216             Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
   218             m_bins_range.push_back(r);
   221         size_t n_parameters = std::stoul(tokens[pos++]);
   227         for (
size_t i = 0; i < def.
nVariables(); i++) {
   228             Range r(std::stof(tokens[pos]), std::stof(tokens[pos + 1]));
   230             m_variables_range.push_back(r);
   234         for (
size_t i = 0; i < n_parameters; i++) {
   235             m_parameters_values.push_back(std::stof(tokens[pos++]));
   239     JetResolutionObject::JetResolutionObject(
const std::string& filename) {
   242         std::ifstream 
f(filename);
   248         for (std::string line; std::getline(f, line); ) {
   249             if ((line.empty()) || (line[0] == 
'#'))
   254             if (!definition.empty()) {
   257                 m_records.push_back(
Record(line, m_definition));
   265         m_definition = 
object.m_definition;
   266         m_records = 
object.m_records;
   267         m_valid = 
object.m_valid;
   272     JetResolutionObject::JetResolutionObject() {
   277     void JetResolutionObject::dump()
 const {
   278         std::cout << 
"Definition: " << std::endl;
   279         std::cout << 
"    Number of binning variables: " << m_definition.nBins() << std::endl;
   281         for (
const auto& bin: m_definition.getBinsName()) {
   282             std::cout << bin << 
", ";
   284         std::cout << std::endl;
   285         std::cout << 
"    Number of variables: " << m_definition.nVariables() << std::endl;
   287         for (
const auto& bin: m_definition.getVariablesName()) {
   288             std::cout << bin << 
", ";
   290         std::cout << std::endl;
   291         std::cout << 
"    Formula: " << m_definition.getFormulaString() << std::endl;
   293         std::cout << std::endl << 
"Bin contents" << std::endl;
   295         for (
const auto& record: m_records) {
   296             std::cout << 
"    Bins" << std::endl;
   298             for (
const auto& bin: record.getBinsRange()) {
   299                 std::cout << 
"        " << m_definition.getBinName(index) << 
" [" << bin.min << 
" - " << bin.max << 
"]" << std::endl;
   303             std::cout << 
"    Variables" << std::endl;
   305             for (
const auto& r: record.getVariablesRange()) {
   306                 std::cout << 
"        " << m_definition.getVariableName(index) << 
" [" << r.min << 
" - " << r.max << 
"] " << std::endl;
   310             std::cout << 
"    Parameters" << std::endl;
   312             for (
const auto& par: record.getParametersValues()) {
   313                 std::cout << 
"        Parameter #" << index << 
" = " << par << std::endl;
   319     void JetResolutionObject::saveToFile(
const std::string& file)
 const {
   321         std::ofstream 
fout(file);
   322         fout.setf(std::ios::right);
   325         fout << 
"{" << m_definition.nBins();
   327         for (
auto& bin: m_definition.getBinsName())
   330         fout << 
"    " << m_definition.nVariables();
   332         for (
auto& var: m_definition.getVariablesName())
   335         fout << 
"    " << (m_definition.getFormulaString().empty() ? 
"None" : m_definition.getFormulaString()) << 
"    Resolution}" << std::endl;
   338         for (
auto& record: m_records) {
   339             for (
auto& r: record.getBinsRange()) {
   340                 fout << std::left << std::setw(15) << r.min << std::setw(15) << r.max << std::setw(15);
   342             fout << (record.nVariables() * 2 + record.nParameters()) << std::setw(15);
   344             for (
auto& r: record.getVariablesRange()) {
   345                 fout << r.min << std::setw(15) << r.max << std::setw(15);
   348             for (
auto& 
p: record.getParametersValues()) {
   349                 fout << 
p << std::setw(15);
   352             fout << std::endl << std::setw(0);
   363         std::vector<float> 
bins = bins_parameters.
createVector(m_definition.getBins());
   366         const Record* good_record = 
nullptr;
   367         for (
const auto& record: m_records) {
   370             size_t valid_bins = 0;
   371             size_t current_bin = 0;
   372             for (
const auto& bin: record.getBinsRange()) {
   373                 if (bin.is_inside(bins[current_bin]))
   379             if (valid_bins == m_definition.nBins()) {
   380                 good_record = &record;
   394         auto const* pFormula = m_definition.getFormula();
   397         auto formula = *pFormula;
   401         double variables_[4] = {0};
   402         for (
size_t index = 0; index < m_definition.nVariables(); index++) {
   407         for (
size_t index = 0; index < parameters.size(); index++) {
   408             formula.SetParameter(index, parameters[index]);
   411         return formula.EvalPar(variables_);
 
T clip(const T &n, const T &lower, const T &upper)
const std::vector< Range > & getVariablesRange() const 
size_t nVariables() const 
std::vector< float > createVector(const std::vector< Binning > &binning) const 
std::string getDefinitionLine(const std::string &line)
const std::vector< float > & getParametersValues() const 
void throwException(uint32_t code, const std::string &message)