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 #include <TF1.h>
7 
8 namespace tau {
9  class TauWPThreshold {
10  public:
11  explicit TauWPThreshold(const std::string& cut_str) {
12  bool simple_value = false;
13  try {
14  size_t pos = 0;
15  value_ = std::stod(cut_str, &pos);
16  simple_value = (pos == cut_str.size());
17  } catch (std::invalid_argument&) {
18  } catch (std::out_of_range&) {
19  }
20  if (!simple_value) {
21  static const std::string prefix =
22  "[&](double *x, double *p) { const int decayMode = p[0];"
23  "const double pt = p[1]; const double eta = p[2];";
24  static const int n_params = 3;
25  static const auto handler = [](int, Bool_t, const char*, const char*) -> void {};
26 
27  std::string fn_str = prefix;
28  if (cut_str.find("return") == std::string::npos)
29  fn_str += " return " + cut_str + ";}";
30  else
31  fn_str += cut_str + "}";
32  auto old_handler = SetErrorHandler(handler);
33  fn_ = std::make_unique<TF1>("fn_", fn_str.c_str(), 0, 1, n_params);
34  SetErrorHandler(old_handler);
35  if (!fn_->IsValid())
36  throw cms::Exception("TauWPThreshold: invalid formula") << "Invalid WP cut formula = '" << cut_str << "'.";
37  }
38  }
39 
40  double operator()(int dm, double pt, double eta) const {
41  if (!fn_)
42  return value_;
43 
44  fn_->SetParameter(0, dm);
45  fn_->SetParameter(1, pt);
46  fn_->SetParameter(2, eta);
47  return fn_->Eval(0);
48  }
49 
50  double operator()(const reco::BaseTau& tau, bool isPFTau) const {
51  const int dm =
52  isPFTau ? dynamic_cast<const reco::PFTau&>(tau).decayMode() : dynamic_cast<const pat::Tau&>(tau).decayMode();
53  return (*this)(dm, tau.pt(), tau.eta());
54  }
55 
56  double operator()(const reco::Candidate& tau) const { return (*this)(-1, tau.pt(), tau.eta()); }
57 
58  private:
59  std::unique_ptr<TF1> fn_;
60  double value_;
61  };
62 } // namespace tau
63 
64 #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