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)