CMS 3D CMS Logo

TauWPThreshold.h
Go to the documentation of this file.
1 #ifndef RecoTauTag_RecoTau_TauWPThreshold_h
2 #define RecoTauTag_RecoTau_TauWPThreshold_h
3 
6 
7 #include <TF1.h>
8 
9 #include <cmath>
10 #include <cstdlib>
11 
12 namespace tau {
14  public:
15  explicit TauWPThreshold(const std::string& cut_str) {
16  bool simple_value = false;
17  const char* cut_cstr = cut_str.c_str();
18  char* end_cstr{};
19  value_ = std::strtod(cut_cstr, &end_cstr);
20  // simple number if end_cstr is empty and not equal to initial string (cut_cstr), and returned value is finite
21  simple_value = !*end_cstr && cut_cstr != end_cstr && std::isfinite(value_);
22  if (!simple_value) {
23  static const std::string prefix =
24  "[&](double *x, double *p) { const int decayMode = p[0];"
25  "const double pt = p[1]; const double eta = p[2];";
26  static const int n_params = 3;
27  static const auto handler = [](int, Bool_t, const char*, const char*) -> void {};
28 
29  std::string fn_str = prefix;
30  if (cut_str.find("return") == std::string::npos)
31  fn_str += " return " + cut_str + ";}";
32  else
33  fn_str += cut_str + "}";
34  auto old_handler = SetErrorHandler(handler);
35  fn_ = std::make_unique<TF1>("fn_", fn_str.c_str(), 0, 1, n_params);
36  SetErrorHandler(old_handler);
37  if (!fn_->IsValid())
38  throw cms::Exception("TauWPThreshold: invalid formula") << "Invalid WP cut formula = '" << cut_str << "'.";
39  }
40  }
41 
42  double operator()(int dm, double pt, double eta) const {
43  if (!fn_)
44  return value_;
45 
46  fn_->SetParameter(0, dm);
47  fn_->SetParameter(1, pt);
48  fn_->SetParameter(2, eta);
49  return fn_->Eval(0);
50  }
51 
52  double operator()(const reco::BaseTau& tau, bool isPFTau) const {
53  const int dm =
54  isPFTau ? dynamic_cast<const reco::PFTau&>(tau).decayMode() : dynamic_cast<const pat::Tau&>(tau).decayMode();
55  return (*this)(dm, tau.pt(), tau.eta());
56  }
57 
58  double operator()(const reco::Candidate& tau) const { return (*this)(-1, tau.pt(), tau.eta()); }
59 
60  private:
61  std::unique_ptr<TF1> fn_;
62  double value_;
63  };
64 } // namespace tau
65 
66 #endif
double operator()(const reco::Candidate &tau) const
TauWPThreshold(const std::string &cut_str)
Analysis-level tau class.
Definition: Tau.h:53
std::unique_ptr< TF1 > fn_
double operator()(int dm, double pt, double eta) const
double operator()(const reco::BaseTau &tau, bool isPFTau) const