Loading [MathJax]/extensions/tex2jax.js
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include "TMVA/Reader.h"
7 
9 // #include "boca/io/TreeWriter.hh"
10 // #include "boca/fastjet/Sort.hh"
13 #include "boca/event/Event.hh"
14 
15 namespace boca
16 {
17 
18 class TreeWriter;
19 
25 template<typename Tagger_>
26 class Reader
27 {
28 
29 public:
30 
32  stage_(stage),
33  reader_(Options()) {
34 // Initialize();
35  }
36 
37  Reader(Reader const& reader) :
38  stage_(reader.stage_),
39  reader_(Options()),
40  tagger_(reader.tagger_) {
41 // Initialize();
42  }
43 
44  Reader(Reader const && reader) :
45  stage_(std::move(reader.stage_)),
46  reader_(Options()),
47  tagger_(std::move(reader.tagger_)) {
48 // Initialize();
49  }
50 
51  void Initialize() {
52  initialized_ = true;
53  if (Debug()) std::cout << "Reader: " << Tagger().Name() << '\n';
54  Tagger().Initialize();
55  if (stage_ == Stage::trainer) return;
56  std::ofstream cout_file(Tagger().AnalysisName() + "/Reader.txt", std::ios_base::app | std::ios_base::out);
57  auto cout = std::cout.rdbuf();
58  std::cout.rdbuf(cout_file.rdbuf());
59  AddObservables();
60  BookMva();
61  std::cout.rdbuf(cout);
62  }
63 
64  int Bdt(Event const& event, PreCuts const& pre_cuts) {
65  return Tagger().SaveBdt(event, pre_cuts, TReader());
66  }
67 
68  template <typename Multiplet_>
69  double Bdt(Multiplet_ const& multiplet) {
70  if (Debug()) std::cout << "Reader: " << Tagger().Name() << " reading bdt" << '\n';
71  return Tagger().Bdt(multiplet, TReader());
72  }
73 
74  template <typename Multiplet_>
75  Multiplet_ Multiplet(Multiplet_ multiplet, PreCuts const& pre_cuts) const {
76  try {
77  return Tagger().Multiplet(multiplet, pre_cuts, TReader());
78  } catch (std::exception const&) {
79  multiplet.SetBdt(Tagger().MvaRange().Min());
80  return multiplet;
81  }
82  }
83 
84  template <typename Input_>
85  auto Multiplets(Input_ const& input, std::size_t number = 4) {
86  PreCuts pre_cuts;
87  return Tagger().ReducedMultiplets(input, pre_cuts, TReader(), number);
88  }
89 
90  template <typename Input_>
91  auto Jets(Input_ const& input) {
92  PreCuts pre_cuts;
93  return Tagger().Jets(input, pre_cuts, TReader());
94  }
95 
96  auto Particles(Event const& event) const {
97  return Tagger().Particles(event);
98  }
99 
100  auto Multiplet(Jet& input) {
101  return Tagger().Multiplet(input, TReader());
102  }
103 
104  template <typename Input_>
105  auto Multiplet(Input_ const& input) {
106  return Tagger().Multiplet(input, TReader());
107  }
108 
109  template <typename Input_1_, typename Input_2_>
110  auto Multiplet(Input_1_ const& input_1, Input_2_ const& input_2) {
111  return Tagger().Multiplet(input_1, input_2, TReader());
112  }
113 
114  template <typename Input_>
115  auto SubMultiplet(Input_ const& input, int number) {
116  return Tagger().SubMultiplet(input, TReader(), number);
117  }
118 
119  template <typename Input_>
120  auto SubMultiplet(Input_ const& input) {
121  return Tagger().SubMultiplet(input, TReader());
122  }
123 
124  Tagger_ const& Tagger() const {
125  if (!initialized_) const_cast<Reader*>(this)->Initialize();
126  return tagger_;
127  }
128 
129  void NewBranch(TreeWriter& tree_writer, Stage stage) {
130  Tagger().NewBranch(tree_writer, stage);
131  }
132 
133  template<typename Multiplet_>
134  auto Transform(Event const& event) {
135  auto multiplets = std::vector<Multiplet_>{};
136  for (auto const & multiplet : Multiplets(event)) {
137  auto new_multiplet = Multiplet_{};
138  new_multiplet.Enforce(multiplet);
139  multiplets.emplace_back(new_multiplet);
140  }
141  return multiplets;
142  }
143 
144  Tagger_& Tagger() {
145  if (!initialized_) Initialize();
146  return tagger_;
147  }
148 
149 protected:
150 
151  TMVA::Reader const& TReader() const {
152  if (!initialized_) const_cast<Reader*>(this)->Initialize();
153  return reader_;
154  }
155 
156 private:
157 
158  std::string Options() const {
159  boca::Options options("Color", false);
160 // options.Add("V", false);
161 // options.Add("Silent");
162  return options;
163  }
164 
165  void AddObservables() {
166  for (auto const & variable : Tagger().Variables()) TReader().AddVariable(variable.Expression(), &variable.Value());
167  for (auto const & spectator : Tagger().Spectators()) TReader().AddSpectator(spectator.Expression(), &spectator.Value());
168  }
169 
170  TMVA::IMethod& BookMva() {
171  std::cout << Tagger().MethodName() << " " << Tagger().WeightFileName() << '\n';
172  return *TReader().BookMVA(Tagger().MethodName(), Tagger().WeightFileName());
173  }
174 
175  TMVA::Reader& TReader() {
176  if (!initialized_) Initialize();
177  return reader_;
178  }
179 
180  constexpr bool Debug() const {
181  return false;
182  }
183 
184  Stage stage_;
185 
186  TMVA::Reader reader_;
187 
188  Tagger_ tagger_;
189 
190  bool initialized_ = false;
191 
192 };
193 
194 }
195 
196 
197 
Training stage.
Jet.
Definition: Jet.hh:15
auto SubMultiplet(Input_ const &input)
Definition: Reader.hh:120
Reader(Stage stage=Stage::reader)
Definition: Reader.hh:31
Stage
The stage of the multivariant tagging process.
Definition: Stage.hh:15
STL namespace.
read results of multivariant analysis wrapper for TMVA::Reader
Definition: Reader.hh:26
auto Transform(Event const &event)
Definition: Reader.hh:134
Definition: PreCuts.hh:14
TMVA::Reader const & TReader() const
Definition: Reader.hh:151
auto Jets(Input_ const &input)
Definition: Reader.hh:91
Key-value-pair options.
Definition: Options.hh:29
auto Multiplets(Input_ const &input, std::size_t number=4)
Definition: Reader.hh:85
Multiplet_ Multiplet(Multiplet_ multiplet, PreCuts const &pre_cuts) const
Definition: Reader.hh:75
auto SubMultiplet(Input_ const &input, int number)
Definition: Reader.hh:115
void NewBranch(TreeWriter &tree_writer, Stage stage)
Definition: Reader.hh:129
Reader(Reader const &&reader)
Definition: Reader.hh:44
double Bdt(Multiplet_ const &multiplet)
Definition: Reader.hh:69
Base class for the event Topology.
Definition: Event.hh:53
int Bdt(Event const &event, PreCuts const &pre_cuts)
Definition: Reader.hh:64
auto Multiplet(Jet &input)
Definition: Reader.hh:100
Definition: TreeWriter.hh:14
Boosted Collider Analysis.
Definition: Analysis.hh:15
void Initialize()
Definition: Reader.hh:51
Reader(Reader const &reader)
Definition: Reader.hh:37
Tagger_ const & Tagger() const
Definition: Reader.hh:124
auto Multiplet(Input_ const &input)
Definition: Reader.hh:105
Tagger_ & Tagger()
Definition: Reader.hh:144
Reading stage.
auto Particles(Event const &event) const
Definition: Reader.hh:96
auto Multiplet(Input_1_ const &input_1, Input_2_ const &input_2)
Definition: Reader.hh:110