PreCuts.hh
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include "boca/math/Range.hh"
7 
9 #include "boca/generic/Vector.hh"
10 
11 namespace boca
12 {
13 
14 class PreCuts
15 {
16 
17  template <typename>
18  struct IsVector : std::false_type {};
19 
20  template <typename Value>
21  struct IsVector<std::vector<Value>> : std::true_type {};
22 
23  template<typename Value>
24  using OnlyIfNotVector = typename std::enable_if < !IsVector<Value>::value >::type;
25 
26 public:
27 
28  template <typename Multiplet>
29  bool PtTooSmall(Id id, Multiplet const& multiplet) const {
30  return pt_lower_cut_.TooSmall(id, multiplet.Pt());
31  }
32 
33  template <typename Multiplet>
34  bool PtTooLarge(Id id, Multiplet const& multiplet) const {
35  return pt_upper_cut_.TooLarge(id, multiplet.Pt());
36  }
37 
38  template <typename Multiplet>
39  bool MassTooSmall(Id id, Multiplet const& multiplet) const {
40  return mass_lower_cut_.TooSmall(id, multiplet.Mass());
41  }
42 
43  template <typename Multiplet>
44  bool MassTooLarge(Id id, Multiplet const& multiplet) const {
45  return mass_upper_cut_.TooLarge(id, multiplet.Mass());
46  }
47 
48  template <typename Multiplet>
49  bool OutsideTracker(Id id, Multiplet const& multiplet) const {
50  return tracker_eta_upper_cut_.TooLarge(id, boost::units::abs(multiplet.Rap()));
51  }
52 
53  template <typename Multiplet>
54  std::vector<Multiplet> ApplyCuts(MultiId multi_id, std::vector<Multiplet> const& multiplets) const {
55  return ApplyCuts(Resolve(multi_id).front(), multiplets);
56  }
57 
58  template <typename Multiplet>
59  std::vector<Multiplet> ApplyCuts(Id id, std::vector<Multiplet> const& multiplets) const {
60  return CopyIf(multiplets, [=](Multiplet const & multiplet) {
61  return !ApplyCuts(id, multiplet);
62  });
63  }
64 
65  template <typename Multiplet, typename = OnlyIfNotVector<Multiplet>>
66  bool ApplyCuts(Id id, Multiplet const& multiplet) const {
67  return PtTooSmall(id, multiplet) || PtTooLarge(id, multiplet) || MassTooSmall(id, multiplet) || MassTooLarge(id, multiplet) || OutsideTracker(id, multiplet);
68  }
69 
70  template <typename Multiplet, typename = OnlyIfNotVector<Multiplet>>
71  bool ApplyCuts(MultiId id, Multiplet const& multiplet) const {
72  return ApplyCuts(Resolve(id).front(), multiplet);
73  }
74 
75  bool DoSubJets(Id id) const;
76 
77  bool SemiLeptonic() const;
78 
79  void SetSemiLeptonic(bool semi_leptonic);
80 
81  template <typename Multiplet>
82  bool NotParticleRho(Multiplet const& multiplet, Range<double> range = {0.5, 2}) const {
83  return multiplet.Rho() > 0 && (multiplet.Rho() < range.Min() || multiplet.Rho() > range.Max());
84  }
85 
86  template<typename Multiplet>
87  bool OutSideMassWindow(Multiplet const& multiplet, Mass const& mass_window, Id id) const {
88  return boost::units::abs(multiplet.Mass() - MassOf(id)) > mass_window;
89  }
90 
91  Angle JetConeMax(Id id) const;
92 
94 
96 
98 
100 
102 
104 
105  PreCut<Momentum> const& PtLowerCut() const;
106 
107  PreCut<Momentum> const& PtUpperCut() const;
108 
109  PreCut<Mass> const& MassLowerCut() const;
110 
111  PreCut<Mass> const& MassUpperCut() const;
112 
113  PreCut<Angle> const& TrackerMaxEta() const;
114 
115  PreCut<bool> const& ConsiderBuildingBlock() const;
116 
117 private:
118 
119  PreCut<Momentum> pt_lower_cut_;
120 
121  PreCut<Momentum> pt_upper_cut_;
122 
123  PreCut<Mass> mass_lower_cut_;
124 
125  PreCut<Mass> mass_upper_cut_;
126 
127  PreCut<Angle> tracker_eta_upper_cut_;
128 
129  PreCut<bool> consider_building_block_;
130 
131  bool semi_leptonic_ = true;
132 
133 };
134 
135 }
bool MassTooSmall(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:39
bool OutSideMassWindow(Multiplet const &multiplet, Mass const &mass_window, Id id) const
Definition: PreCuts.hh:87
PreCut< Mass > & MassLowerCut()
Definition: PreCuts.cpp:31
bool ApplyCuts(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:66
boca::Mass Mass() const
Definition: Multiplet.cpp:61
boost::units::quantity< boost::units::si::plane_angle > Angle
Angle measured in radian.
Definition: Si.hh:35
PreCut< Angle > & TrackerMaxEta()
Definition: PreCuts.cpp:39
bool SemiLeptonic() const
Definition: PreCuts.cpp:10
Momentum Pt() const
Definition: Multiplet.cpp:36
Definition: PreCuts.hh:14
Id
PDG particle naming conventions.
Definition: Id.hh:23
PreCut< Momentum > & PtLowerCut()
Definition: PreCuts.cpp:23
bool MassTooLarge(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:44
MultiId
Groups of PDG particles.
Definition: Id.hh:125
PreCut< bool > & ConsiderBuildingBlock()
Definition: PreCuts.cpp:43
std::vector< Multiplet > ApplyCuts(Id id, std::vector< Multiplet > const &multiplets) const
Definition: PreCuts.hh:59
std::vector< Multiplet > ApplyCuts(MultiId multi_id, std::vector< Multiplet > const &multiplets) const
Definition: PreCuts.hh:54
Boosted Collider Analysis.
Definition: Analysis.hh:15
Value abs(Value const &value)
Absolute value.
Definition: Units.hh:235
void SetSemiLeptonic(bool semi_leptonic)
Definition: PreCuts.cpp:15
bool DoSubJets(Id id) const
Definition: PreCuts.cpp:19
bool NotParticleRho(Multiplet const &multiplet, Range< double > range={0.5, 2}) const
Definition: PreCuts.hh:82
PreCut< Momentum > & PtUpperCut()
Definition: PreCuts.cpp:27
Multiplet base class
Definition: Multiplet.hh:21
Mass MassOf(Id id)
Mass of particle with given Id.
Definition: Id.cpp:103
bool PtTooLarge(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:34
bool OutsideTracker(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:49
Angle Rap() const
Rapidity .
Definition: Multiplet.cpp:41
bool ApplyCuts(MultiId id, Multiplet const &multiplet) const
Definition: PreCuts.hh:71
Angle JetConeMax(Id id) const
Definition: PreCuts.cpp:71
std::vector< Elements_ > CopyIf(std::vector< Elements_ > const &inputs, Function_ function)
Definition: Vector.hh:63
bool PtTooSmall(Id id, Multiplet const &multiplet) const
Definition: PreCuts.hh:29
std::vector< Id > Resolve(MultiId multi_id)
Vector if PDG particle Ids for a given MultiId.
Definition: Id.cpp:159
Energy Mass
Mass measured in electronvolt.
Definition: ElectronVolt.hh:62
PreCut< Mass > & MassUpperCut()
Definition: PreCuts.cpp:35