Vector.hh
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include <boost/range/algorithm_ext/erase.hpp>
7 #include <boost/range/algorithm/count_if.hpp>
8 #include <boost/range/algorithm/copy.hpp>
9 
10 #include "boca/generic/Vector.hh"
11 #include "boca/Settings.hh"
12 
13 namespace boca
14 {
15 
23 template <typename Multiplet_>
24 std::vector<Multiplet_> RemoveIfOutsidePtWindow(std::vector<Multiplet_> jets, Momentum const &lower_cut, Momentum const &upper_cut)
25 {
26  return boost::range::remove_erase_if(jets, [lower_cut, upper_cut](Multiplet_ const & jet) {
27  return jet.Pt() < lower_cut || jet.Pt() > upper_cut;
28  });
29 }
30 
35 template<typename Multiplet_>
36 std::vector<Multiplet_> CopyIfTag(std::vector<Multiplet_> const &multiplets, double value = 0)
37 {
38  return CopyIf(multiplets, [value](Multiplet_ const & multiplet) {
39  return multiplet.Bdt() > value;
40  });
41 }
42 
43 template<typename Multiplet_>
44 std::vector<Multiplet_> RemoveIfSoft(std::vector<Multiplet_> multiplets, Momentum const &pt_min)
45 {
46  return boost::range::remove_erase_if(multiplets, [&](Multiplet_ const & multiplet) {
47  return multiplet.Pt() < pt_min;
48  });
49 }
50 
51 template<typename Multiplet_>
52 std::vector<Multiplet_> RemoveIfHard(std::vector<Multiplet_> multiplets, Momentum const &pt_max)
53 {
54  return boost::range::remove_erase_if(multiplets, [&](Multiplet_ const & multiplet) {
55  return multiplet.Pt() > pt_max;
56  });
57 }
58 
59 template<typename Multiplet_>
60 int CountIfHard(std::vector<Multiplet_> multiplets, Momentum const &pt_min)
61 {
62  return boost::range::count_if(multiplets, [pt_min](Multiplet_ const & multiplet) {
63  return multiplet.Pt() > pt_min;
64  });
65 }
66 
67 template<typename Multiplet_>
68 auto CountIfBottom(std::vector<Multiplet_> const& jets)
69 {
70  return boost::range::count_if(jets, [](auto const & jet) {
71  return jet.Info().BTag();
72  });
73 }
74 
75 template <typename Multiplet_1_>
76 class Close
77 {
78 public:
79  Close(Multiplet_1_ const &particle) :
80  particle_(particle) ,
81  cone_size_(Settings::JetConeSize())
82  {}
83  Close(Multiplet_1_ const &particle, Angle const &cone_size) :
84  particle_(particle) ,
85  cone_size_(cone_size)
86  {}
87  template <typename Multiplet_2_>
88  bool operator()(Multiplet_2_ const &multiplet)
89  {
90  return multiplet.DeltaRTo(particle_) < cone_size_;
91  }
92 private:
93  Multiplet_1_ particle_;
94  Angle cone_size_;
95 };
96 
97 template <typename Multiplet_1_, typename Multiplet_2_>
98 std::vector<Multiplet_1_> RemoveIfClose(std::vector<Multiplet_1_> jets, std::vector<Multiplet_2_> const &particles)
99 {
100  for (auto const &particle : particles) jets = boost::range::remove_erase_if(jets, Close<Multiplet_2_>(particle));
101  return jets;
102 }
103 
104 template <typename Multiplet_1_, typename Multiplet_2_>
105 bool CrossComparison(Multiplet_1_ const &multiplet, std::pair<Multiplet_2_, Multiplet_2_> const &particles)
106 {
107  return (Close<Multiplet_2_>(particles.first)(multiplet.Multiplet1()) && Close<Multiplet_2_>(particles.second)(multiplet.Multiplet2())) || (Close<Multiplet_2_>(particles.first)(multiplet.Multiplet2()) && Close<Multiplet_2_>(particles.second)(multiplet.Multiplet1()));
108 }
109 
110 template <typename Multiplet_1_, typename Multiplet_2_>
111 std::vector<Multiplet_1_> RemoveIfClose(std::vector<Multiplet_1_> jets, std::vector<std::pair<Multiplet_2_, Multiplet_2_>> const &particles)
112 {
113  for (auto const &particle : particles) jets = boost::range::remove_erase_if(jets, [&](Multiplet_1_ const & multiplet) {
114  return CrossComparison(multiplet, particle);
115  });
116  return jets;
117 }
118 
119 template <typename Multiplet_1_, typename Multiplet_2_>
120 std::vector<Multiplet_1_> CopyIfClose(std::vector<Multiplet_1_> const &multiplets, std::vector<Multiplet_2_> const &particles)
121 {
122  if (multiplets.empty()) return multiplets;
123  auto close_multiplets = std::vector<Multiplet_1_> {};
124  for (auto const &particle : particles) Insert(close_multiplets, CopyIfClose(multiplets, particle));
125  return close_multiplets;
126 }
127 
128 template <typename Multiplet_1_, typename Multiplet_2_>
129 std::vector<Multiplet_1_> CopyIfClose(std::vector<Multiplet_1_> const &multiplets, Multiplet_2_ const &particle)
130 {
131  return CopyIf(multiplets, [&](Multiplet_1_ const & multiplet) {
132  return Close<Multiplet_2_>(particle)(multiplet);
133  });
134 }
135 
136 template <typename Multiplet_1_, typename Multiplet_2_>
137 std::vector<Multiplet_1_> CopyIfClose(std::vector<Multiplet_1_> const &multiplets, std::pair<Multiplet_2_, Multiplet_2_> const &particle)
138 {
139  return CopyIf(multiplets, [&](Multiplet_1_ const & multiplet) {
140  return CrossComparison(multiplet, particle);
141  });
142 }
143 
144 // template <typename Multiplet_>
145 // std::vector<Multiplet_> CopyIfClose(std::vector<Multiplet_> const& multiplets, std::vector<std::pair<Particle, Particle>> const& particles)
146 // {
147 // if (multiplets.empty()) return multiplets;
148 // std::vector<Multiplet_> final_multiplets;
149 // for (auto const & particle : particles) for (auto const & multiplet : multiplets) if (CrossComparison(multiplet, particle)) final_multiplets.emplace_back(multiplet);
150 // return final_multiplets;
151 // }
152 
153 // @}
154 
155 }
Close(Multiplet_1_ const &particle, Angle const &cone_size)
Definition: Vector.hh:83
Detector and Collider specific constants.
Definition: Settings.hh:53
auto CountIfBottom(std::vector< Multiplet_ > const &jets)
Definition: Vector.hh:68
boost::units::quantity< boost::units::si::plane_angle > Angle
Angle measured in radian.
Definition: Si.hh:35
std::vector< Multiplet_ > RemoveIfOutsidePtWindow(std::vector< Multiplet_ > jets, Momentum const &lower_cut, Momentum const &upper_cut)
Definition: Vector.hh:24
std::vector< Multiplet_ > RemoveIfSoft(std::vector< Multiplet_ > multiplets, Momentum const &pt_min)
Definition: Vector.hh:44
Definition: Vector.hh:76
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
bool operator()(Multiplet_2_ const &multiplet)
Definition: Vector.hh:88
void Insert(std::vector< Element_ > &vector_1, std::vector< Element_ > const &vector_2)
Insert two std::vector.
Definition: Vector.hh:130
std::vector< Multiplet_ > CopyIfTag(std::vector< Multiplet_ > const &multiplets, double value=0)
Copy if Bdt value of multiplet is larger than value (default = 0)
Definition: Vector.hh:36
std::vector< Multiplet_ > RemoveIfHard(std::vector< Multiplet_ > multiplets, Momentum const &pt_max)
Definition: Vector.hh:52
Close(Multiplet_1_ const &particle)
Definition: Vector.hh:79
int CountIfHard(std::vector< Multiplet_ > multiplets, Momentum const &pt_min)
Definition: Vector.hh:60
Energy Momentum
Momentum measured in electronvolt.
Definition: ElectronVolt.hh:68
std::vector< Elements_ > CopyIf(std::vector< Elements_ > const &inputs, Function_ function)
Definition: Vector.hh:63
bool CrossComparison(Multiplet_1_ const &multiplet, std::pair< Multiplet_2_, Multiplet_2_ > const &particles)
Definition: Vector.hh:105
std::vector< Multiplet_1_ > CopyIfClose(std::vector< Multiplet_1_ > const &multiplets, std::vector< Multiplet_2_ > const &particles)
Definition: Vector.hh:120