23 const std::vector<std::string> & otherSysTypes={});
58 const std::vector<std::string> & otherSysTypes):
67 <<
"Every otherSysType should only be given once. Duplicate: " 83 <<
"Data for this jet-flavor is already loaded: " 88 const std::vector<BTagEntry> &entries = c.
getEntries(params);
90 for (
const auto &be : entries) {
91 if (be.params.jetFlavor != jf) {
96 te.
etaMin = be.params.etaMin;
97 te.
etaMax = be.params.etaMax;
98 te.
ptMin = be.params.ptMin;
99 te.
ptMax = be.params.ptMax;
104 te.
func = TF1(
"", be.formula.c_str(),
105 be.params.discrMin, be.params.discrMax);
107 te.
func = TF1(
"", be.formula.c_str(),
108 be.params.ptMin, be.params.ptMax);
111 tmpData_[be.params.jetFlavor].push_back(te);
118 p.second->load(c, jf, measurementType);
135 const auto &entries =
tmpData_.at(jf);
136 for (
unsigned i=0;
i<entries.size(); ++
i) {
137 const auto &
e = entries.at(
i);
139 e.etaMin <= eta && eta <=
e.etaMax
140 &&
e.ptMin < pt && pt <=
e.ptMax
143 if (
e.discrMin <= discr && discr <
e.discrMax) {
144 return e.func.Eval(discr);
147 return e.func.Eval(pt);
163 bool eta_is_out_of_bounds =
false;
165 if (sf_bounds_eta.first < 0) sf_bounds_eta.first = -sf_bounds_eta.second;
171 if (eta <= sf_bounds_eta.first || eta > sf_bounds_eta.second ) {
172 eta_is_out_of_bounds =
true;
175 if (eta_is_out_of_bounds) {
181 float pt_for_eval =
pt;
182 bool is_out_of_bounds =
false;
184 if (pt <= sf_bounds.first) {
185 pt_for_eval = sf_bounds.first + .0001;
186 is_out_of_bounds =
true;
187 }
else if (pt > sf_bounds.second) {
188 pt_for_eval = sf_bounds.second - .0001;
189 is_out_of_bounds =
true;
193 double sf =
eval(jf, eta, pt_for_eval, discr);
201 <<
"sysType not available (maybe not loaded?): " 205 if (!is_out_of_bounds) {
210 sf_err = sf + 2*(sf_err - sf);
224 const auto &entries =
tmpData_.at(jf);
225 float min_pt = -1., max_pt = -1.;
226 for (
const auto &
e: entries) {
228 e.etaMin <= eta && eta <=
e.etaMax
237 if (
e.discrMin <= discr && discr <
e.discrMax) {
238 min_pt = min_pt <
e.ptMin ? min_pt :
e.ptMin;
239 max_pt = max_pt >
e.ptMax ? max_pt :
e.ptMax;
242 min_pt = min_pt <
e.ptMin ? min_pt :
e.ptMin;
243 max_pt = max_pt >
e.ptMax ? max_pt :
e.ptMax;
248 return std::make_pair(min_pt, max_pt);
257 const auto &entries =
tmpData_.at(jf);
259 for (
const auto &
e: entries) {
262 if (
e.discrMin <= discr && discr <
e.discrMax) {
263 min_eta = min_eta <
e.etaMin ? min_eta :
e.etaMin;
267 min_eta = min_eta <
e.etaMin ? min_eta :
e.etaMin;
273 return std::make_pair(min_eta,
max_eta);
279 const std::vector<std::string> & otherSysTypes):
286 pimpl->load(c, jf, measurementType);
294 return pimpl->eval(jf, eta, pt, discr);
303 return pimpl->eval_auto_bounds(sys, jf, eta, pt, discr);
310 return pimpl->min_max_pt(jf, eta, discr);
BTagEntry::OperatingPoint op_
std::vector< bool > useAbsEta_
std::vector< std::vector< TmpEntry > > tmpData_
const std::vector< BTagEntry > & getEntries(const BTagEntry::Parameters &par) const
double eval_auto_bounds(const std::string &sys, BTagEntry::JetFlavor jf, float eta, float pt, float discr) const
std::shared_ptr< BTagCalibrationReaderImpl > pimpl
double eval(BTagEntry::JetFlavor jf, float eta, float pt, float discr=0.) const
BTagCalibrationReaderImpl(BTagEntry::OperatingPoint op, const std::string &sysType, const std::vector< std::string > &otherSysTypes={})
void load(const BTagCalibration &c, BTagEntry::JetFlavor jf, const std::string &measurementType="comb")
std::pair< float, float > min_max_pt(BTagEntry::JetFlavor jf, float eta, float discr=0.) const
double eval_auto_bounds(const std::string &sys, BTagEntry::JetFlavor jf, float eta, float pt, float discr=0.) const
std::pair< float, float > min_max_eta(BTagEntry::JetFlavor jf, float discr) const
std::map< std::string, std::shared_ptr< BTagCalibrationReaderImpl > > otherSysTypeReaders_
std::pair< float, float > min_max_pt(BTagEntry::JetFlavor jf, float eta, float discr) const
double eval(BTagEntry::JetFlavor jf, float eta, float pt, float discr) const
void load(const BTagCalibration &c, BTagEntry::JetFlavor jf, std::string measurementType)