AnalysisTree
Loading...
Searching...
No Matches
HelperFunctions.hpp
1#ifndef ANALYSISTREE_INFRA_HELPER_FUNCTIONS_HPP
2#define ANALYSISTREE_INFRA_HELPER_FUNCTIONS_HPP
3
4#include "SimpleCut.hpp"
5
6#include <sstream>
7#include <string>
8#include <vector>
9
10namespace HelperFunctions {
11
12template<typename T>
13inline std::string ToStringWithPrecision(const T a_value, const int n) {
14 std::ostringstream out;
15 out.precision(n);
16 out << std::fixed << a_value;
17 return out.str();
18}
19
20template<typename T>
21inline std::string ToStringWithSignificantFigures(const T a_value, const int n) {
22 if(a_value == 0) return "0";
23
24 const double dMag = std::log10(std::abs(a_value)); // scale of the a_value (e.g 1.* for 1.2345, 2.* for 12.345 etc)
25 const int iMag = static_cast<int>(dMag-n+1 > 0 ? dMag-n+1 : dMag-n);
26 const T shifted_value = a_value/std::pow(10, iMag); // shift decimal point to have all required digits to l.h.s. from it
27 const T rounded_value = static_cast<T>(std::round(shifted_value)); // get rid of r.h.s. from decimal point
28 const T reshifted_value = rounded_value*std::pow(10, iMag); // return decimal point to its original place
29 const int precision = iMag < 0 ? -iMag : 0; // determine how many digits after decimal point one needs
30 return ToStringWithPrecision(reshifted_value, precision);
31}
32
33inline std::vector<AnalysisTree::SimpleCut> CreateRangeCuts(const std::vector<float>& ranges, const std::string& cutNamePrefix, const std::string& branchFieldName, int precision=2) {
34 std::vector<AnalysisTree::SimpleCut> sliceCuts;
35 for (int iRange = 0; iRange < ranges.size() - 1; iRange++) {
36 const std::string cutName = cutNamePrefix + ToStringWithPrecision(ranges.at(iRange), 2) + "_" + ToStringWithPrecision(ranges.at(iRange + 1), precision);
37 sliceCuts.emplace_back(AnalysisTree::RangeCut(branchFieldName, ranges.at(iRange), ranges.at(iRange + 1), cutName));
38 }
39
40 return sliceCuts;
41}
42
43inline std::vector<AnalysisTree::SimpleCut> CreateEqualCuts(const std::vector<float>& values, const std::string& cutNamePrefix, const std::string& branchFieldName, int precision=2) {
44 std::vector<AnalysisTree::SimpleCut> sliceCuts;
45 for (int iValue = 0; iValue < values.size(); iValue++) {
46 const std::string cutName = cutNamePrefix + ToStringWithPrecision(values.at(iValue), precision);
47 sliceCuts.emplace_back(AnalysisTree::EqualsCut(branchFieldName, values.at(iValue), cutName));
48 }
49
50 return sliceCuts;
51}
52
53}// namespace HelperFunctions
54#endif// ANALYSISTREE_INFRA_HELPER_FUNCTIONS_HPP
SimpleCut EqualsCut(const std::string &variable_name, int value, const std::string &title)
Definition SimpleCut.cpp:36
SimpleCut RangeCut(const std::string &variable_name, double lo, double hi, const std::string &title)
Definition SimpleCut.cpp:32