Tagger.hh
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include "boca/generic/Types.hh"
7 #include "boca/fastjet/Sort.hh"
8 #include "boca/io/TreeBranch.hh"
9 #include "boca/fastjet/Vector.hh"
10 #include "boca/tagger/Base.hh"
13 #include "boca/generic/Debug.hh"
14 
15 namespace boca
16 {
17 
22 template<typename Multiplet_, typename Branch_>
23 class Tagger : public tagger::Base
24 {
25 
26 public:
27 
28  double Bdt(Multiplet_ const& multiplet, TMVA::Reader const& reader) {
29  FillBranch(multiplet);
30  return tagger::Base::Bdt(reader);
31  }
32 
33  bool Cut(Multiplet_ const& multiplet, TMVA::Reader const& reader, double effeciency) {
34  FillBranch(multiplet);
35  return tagger::Base::Cut(reader, effeciency);
36  }
37 
38  std::vector<bool> Cuts(Multiplet_ const& multiplet, TMVA::Reader const& reader) {
39  FillBranch(multiplet);
40  auto steps = 50;
41  // TODO why is this a 2?
42  return Transform(IntegerRange(2, steps), [&](int effeciency) {
43  return tagger::Base::Cut(reader, static_cast<double>(effeciency) / steps);
44  });
45  }
46 
47  Branch_& Branch() override {
48  return branch_;
49  }
50 
51  int SaveBdt(Event const& event, const PreCuts& pre_cuts, TMVA::Reader const& reader) override {
52  return SaveEntries(Multiplets(event, pre_cuts, reader), 1);
53  }
54 
55  template<typename Input_>
56  std::vector<Multiplet_> ReducedMultiplets(Input_ const& input, const PreCuts& pre_cuts, TMVA::Reader const& reader, std::size_t max = 4) {
57  return ReduceResult(Multiplets(input, pre_cuts, reader), max);
58  }
59 
60  Multiplet_ Multiplet() const {
61  return {};
62  }
63 
64 protected:
65 
66  virtual std::vector<Multiplet_> Multiplets(std::vector<Jet> const&, PreCuts const&, TMVA::Reader const&) {
67  Error("Never end up here! Must be overlaoded");
68  return {};
69  }
70 
71  template<typename Multiplet_2_>
72  std::vector<Multiplet_2_> ReduceResult(std::vector<Multiplet_2_> multiplets, std::size_t max = 4) const {
73  // DEBUG_CHECK(multiplets.size() >= max, multiplets.size());
74  if (multiplets.empty()) return multiplets;
75  multiplets = SortedByBdt(multiplets);
76  multiplets.erase(multiplets.begin() + std::min(max, multiplets.size()), multiplets.end());
77  return multiplets;
78  }
79 
80  std::vector<Multiplet_> BestRapidity(std::vector<Multiplet_> multiplets, std::size_t number = 1) const {
81  if (multiplets.size() <= number) return multiplets;
82  multiplets = SortedByMaxDeltaRap(multiplets);
83  multiplets.erase(multiplets.begin() + number, multiplets.end());
84  return multiplets;
85  }
86 
87  template<typename Multiplet_2_, typename Particle_>
88  std::vector<Multiplet_2_> BestMatch(std::vector<Multiplet_2_> const& multiplets, std::vector<Particle_> const& particles, Id id = Id::none) const {
89  if (Debug()) boca::Debug("multiplets", multiplets.size(), "particles", particles.size());
90  if (multiplets.empty()) return multiplets;
91  std::vector<Multiplet_2_> best;
92  for (auto const & particle : particles) Insert(best, BestMatch(multiplets, particle, id));
93  if (Debug()) boca::Debug("best", best.size());
94  return best;
95  }
96 
97  template<typename Multiplet_2_, typename Particle_>
98  std::vector<Multiplet_2_> BestMatch(std::vector<Multiplet_2_> const& multiplets, Particle_ const& particle, Id id = Id::none) const {
99  if (Debug()) boca::Debug("multiplets", multiplets.size());
100  if (multiplets.empty()) return multiplets;
101  auto close = CopyIfClose(multiplets, particle);
102  close = id == Id::none ? SortedByBdt(close) : SortedByMassTo(close, id);
103  if (Debug()) boca::Debug("close", close.size());
104  if (close.empty()) return close;
105  return {close.front()};
106  }
107 
108  template<typename Multiplet_2_>
109  std::vector<Multiplet_2_> RemoveBestMatch(std::vector<Multiplet_2_> const& multiplets, std::vector<Particle> const& particles) const {
110  return RemoveIfClose(multiplets, particles);
111  }
112 
113  template<typename Multiplet_2_>
114  std::vector<Multiplet_2_> RemoveBestMatch(std::vector<Multiplet_2_> const& multiplets, std::vector<std::pair<Particle, Particle>> const& particles) const {
115  return RemoveIfClose(multiplets, particles);
116  }
117 
118  template<typename Multiplet_2_>
119  std::vector<Multiplet_2_> BestMatches(std::vector<Multiplet_2_> multiplets, std::vector<Particle> const& particles, Tag tag, Id id = Id::none) const {
120  if (Debug()) boca::Debug("multiplets", multiplets.size(), "particles", particles.size());
121  if (multiplets.empty()) return multiplets;
122  multiplets = SortedByBdt(multiplets);
123  switch (tag) {
124  case Tag::signal : return BestMatch(multiplets, particles, id);
125  case Tag::background : return RemoveBestMatch(multiplets, particles);
126  default : return multiplets;
127  }
128  }
129 
130  template<typename Multiplet_2_>
131  std::vector<Multiplet_2_> BestMatches(std::vector<Multiplet_2_> multiplets, std::vector<std::pair<Particle, Particle>> const& particles, Tag tag, Id id = Id::none) const {
132  if (Debug()) boca::Debug("multiplets", multiplets.size(), "particles", particles.size());
133  if (multiplets.empty()) return multiplets;
134  multiplets = SortedByBdt(multiplets);
135  switch (tag) {
136  case Tag::signal : return BestMatch(multiplets, particles, id);
137  case Tag::background : return RemoveBestMatch(multiplets, particles);
138  default : return multiplets;
139  }
140  }
141 
142  int SaveEntries(std::vector<Multiplet_> multiplets, int max = std::numeric_limits<int>::max()) {
143  if (multiplets.size() > 1) multiplets = SortedByBdt(multiplets);
144  if (multiplets.empty()) return 0;
145  auto sum = std::min(static_cast<int>(multiplets.size()), max);
146  for (auto counter : IntegerRange(sum)) {
147  FillBranch(multiplets.at(counter));
148 // std::lock_guard<std::mutex> guard(mutex_);
150  }
151  return sum;
152  }
153 
154  int SaveEntries(std::vector<Multiplet_> multiplets, std::vector<Particle> const& particles, Tag tag, Id id = Id::none) {
155  if (Debug()) boca::Debug("multiplets", multiplets.size(), "particles", particles.size());
156  return SaveEntries(BestMatches(multiplets, particles, tag, id));
157  }
158 
159  int SaveEntries(std::vector<Multiplet_> multiplets, Tag tag) {
160  switch (tag) {
161  case Tag::signal : return SaveEntries(multiplets, 1);
162  case Tag::background : return SaveEntries(multiplets);
163  default : return {};
164  }
165  }
166 
167  int SaveEntries(std::vector<Multiplet_> multiplets, std::vector<std::pair<Particle, Particle>> const& particles, Tag tag, Id id = Id::none) {
168  return SaveEntries(BestMatches(multiplets, particles, tag, id));
169  }
170 
171  TClass& Class() const override {
172  return *Branch_::Class();
173  }
174 
175  void DefineVariables() override {
177  AddVariables();
178  AddSpectators();
179  }
180 
181  virtual auto Multiplets(Event const&, PreCuts const&, TMVA::Reader const&) -> std::vector<Multiplet_> = 0;
182 
183  std::vector<Multiplet_> Multiplets(Event const& event, TMVA::Reader const& reader) {
184  PreCuts pre_cuts;
185  return Multiplets(event, pre_cuts, reader);
186  };
187 
188 private:
189 
190  Branch_ const& Branch() const override {
191  return branch_;
192  }
193 
194  void AddVariables() {
195  Branch().Variables().AddFilter(Filter());
196  for (auto & variable : Branch().Variables().Vector()) AddVariable(variable);
197  }
198 
199  void AddSpectators() {
200  for (auto & spectator : Branch().Spectators().Vector()) AddSpectator(spectator);
201  }
202 
203  void FillBranch(Multiplet_ const& multiplet) {
204  Branch().Fill(multiplet);
205  }
206 
207  constexpr bool Debug() const {
208  return false;
209  }
210 
215  Branch_ branch_;
216 
217 };
218 
219 }
std::vector< Multiplet > SortedByMaxDeltaRap(std::vector< Multiplet > multiplets)
Definition: Sort.hh:22
TClass & Class() const override
Definition: Tagger.hh:171
decltype(auto) IntegerRange(Integer last)
Definition: Types.hh:18
std::vector< Observable > const & Spectators() const
Definition: Base.cpp:265
void AddSpectator(Observable &observable)
Definition: Base.cpp:374
void Debug(bool final=true)
Definition: Debug.cpp:60
void ClearObservables()
Definition: Base.cpp:380
double Bdt(TMVA::Reader const &reader) const
Definition: Base.cpp:54
std::vector< Multiplet_ > BestRapidity(std::vector< Multiplet_ > multiplets, std::size_t number=1) const
Definition: Tagger.hh:80
std::vector< Multiplet_2_ > ReduceResult(std::vector< Multiplet_2_ > multiplets, std::size_t max=4) const
Definition: Tagger.hh:72
Definition: PreCuts.hh:14
Id
PDG particle naming conventions.
Definition: Id.hh:23
slighly more complicated estimator for significance
Tag
The Tag distinguishes between signal and background events.
Definition: Tag.hh:14
int SaveEntries(std::vector< Multiplet_ > multiplets, Tag tag)
Definition: Tagger.hh:159
std::vector< Multiplet_2_ > BestMatches(std::vector< Multiplet_2_ > multiplets, std::vector< std::pair< Particle, Particle >> const &particles, Tag tag, Id id=Id::none) const
Definition: Tagger.hh:131
Base class for the event Topology.
Definition: Event.hh:53
int SaveEntries(std::vector< Multiplet_ > multiplets, std::vector< std::pair< Particle, Particle >> const &particles, Tag tag, Id id=Id::none)
Definition: Tagger.hh:167
std::vector< Observable > const & Variables() const
Definition: Base.cpp:259
std::vector< Multiplet_ > Multiplets(Event const &event, TMVA::Reader const &reader)
Definition: Tagger.hh:183
std::vector< Multiplet_2_ > BestMatch(std::vector< Multiplet_2_ > const &multiplets, Particle_ const &particle, Id id=Id::none) const
Definition: Tagger.hh:98
std::vector< Multiplet > SortedByBdt(std::vector< Multiplet > multiplets)
sort vector of jets with largest bdt at the front
Definition: Sort.hh:81
std::vector< Multiplet_2_ > RemoveBestMatch(std::vector< Multiplet_2_ > const &multiplets, std::vector< Particle > const &particles) const
Definition: Tagger.hh:109
std::vector< Multiplet_ > ReducedMultiplets(Input_ const &input, const PreCuts &pre_cuts, TMVA::Reader const &reader, std::size_t max=4)
Definition: Tagger.hh:56
std::vector< Multiplet_1_ > RemoveIfClose(std::vector< Multiplet_1_ > jets, std::vector< Multiplet_2_ > const &particles)
Definition: Vector.hh:98
Boosted Collider Analysis.
Definition: Analysis.hh:15
int SaveBdt(Event const &event, const PreCuts &pre_cuts, TMVA::Reader const &reader) override
Definition: Tagger.hh:51
Branch_ & AddEntry()
Definition: TreeBranch.hh:26
bool Cut(Multiplet_ const &multiplet, TMVA::Reader const &reader, double effeciency)
Definition: Tagger.hh:33
std::vector< Multiplet_2_ > RemoveBestMatch(std::vector< Multiplet_2_ > const &multiplets, std::vector< std::pair< Particle, Particle >> const &particles) const
Definition: Tagger.hh:114
virtual std::vector< Multiplet_ > Multiplets(std::vector< Jet > const &, PreCuts const &, TMVA::Reader const &)
Definition: Tagger.hh:66
void Insert(std::vector< Element_ > &vector_1, std::vector< Element_ > const &vector_2)
Insert two std::vector.
Definition: Vector.hh:130
std::vector< bool > Cuts(Multiplet_ const &multiplet, TMVA::Reader const &reader)
Definition: Tagger.hh:38
void Error(std::string const &variable)
Definition: Debug.cpp:69
std::vector< Multiplet_2_ > BestMatch(std::vector< Multiplet_2_ > const &multiplets, std::vector< Particle_ > const &particles, Id id=Id::none) const
Definition: Tagger.hh:88
virtual boca::Filter Filter() const
Definition: Base.cpp:411
std::vector< Multiplet > SortedByMassTo(std::vector< Multiplet > multiplets, Mass const &mass)
Definition: Sort.hh:30
Value max(Value const &value_1, Value const &value_2)
Maximal value.
Definition: Units.hh:260
double Bdt(Multiplet_ const &multiplet, TMVA::Reader const &reader)
Definition: Tagger.hh:28
boca::TreeBranch & TreeBranch() const
Definition: Base.cpp:387
Tagger base class using Branch template
Definition: Tagger.hh:23
void DefineVariables() override
Definition: Tagger.hh:175
int SaveEntries(std::vector< Multiplet_ > multiplets, int max=std::numeric_limits< int >::max())
Definition: Tagger.hh:142
Multiplet_ Multiplet() const
Definition: Tagger.hh:60
Reading stage.
Prepares multivariant analysis.
Definition: Base.hh:47
auto Transform(Input_ const &inputs, Function_ function)
Definition: Vector.hh:42
TCut Cut() const
Definition: Base.cpp:294
Branch_ & Branch() override
Definition: Tagger.hh:47
std::vector< Multiplet_2_ > BestMatches(std::vector< Multiplet_2_ > multiplets, std::vector< Particle > const &particles, Tag tag, Id id=Id::none) const
Definition: Tagger.hh:119
int SaveEntries(std::vector< Multiplet_ > multiplets, std::vector< Particle > const &particles, Tag tag, Id id=Id::none)
Definition: Tagger.hh:154
void AddVariable(Observable &observable)
Definition: Base.cpp:367
std::vector< Multiplet_1_ > CopyIfClose(std::vector< Multiplet_1_ > const &multiplets, std::vector< Multiplet_2_ > const &particles)
Definition: Vector.hh:120