TwoBody.hh
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include <boost/range/algorithm/unique.hpp>
7 #include <boost/range/algorithm_ext/erase.hpp>
8 
10 #include "boca/generic/Vector.hh"
12 #include "boca/fastjet/Sort.hh"
13 #include "boca/Settings.hh"
14 
15 namespace boca
16 {
17 
23 template <typename Multiplet_1_, typename Multiplet_2_>
24 class TwoBody : public Multiplet
25 {
26 
27 public:
28 
38  TwoBody() {};
39 
43  TwoBody(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
44  {
45  multiplet_1_ = multiplet_1;
46  multiplet_2_ = multiplet_2;
47  if (multiplet_1.Bdt() != InitialValue() && multiplet_2.Bdt() != InitialValue()) SetBdt(multiplet_1.Bdt(), multiplet_2.Bdt());
48  else if (multiplet_1.Bdt() != InitialValue()) SetBdt(multiplet_1.Bdt());
49  else if (multiplet_2.Bdt() != InitialValue()) SetBdt(multiplet_2.Bdt());
50  }
52 
63  template<typename Multiplet_3_, typename Multiplet_4_>
65  {
66  multiplet_1_.Enforce(multiplet.Multiplet1());
67  multiplet_2_.Enforce(multiplet.Multiplet2());
68  SetBdt(multiplet.Bdt());
69  }
70 
74  void Enforce(boca::Jet const &jet)
75  {
76  Enforce(jet, jet.Bdt());
77  }
78 
82  void Enforce(std::vector<boca::Jet> const &jets)
83  {
84  if (jets.empty()) return;
85  if (jets.size() == 1) return EnforceJet(jets.front(), jets.front().Bdt());
86  multiplet_1_.Enforce(jets.at(0));
87  multiplet_2_.Enforce(jets.at(1));
88  SetBdt(jets.at(0).Bdt(), jets.at(1).Bdt());
89  if (jets.size() > 2) std::cout << "to many jets to enforce a multiplet" << '\n';
90  }
91 
95  void Enforce(boca::Jet const &jet, double bdt)
96  {
97  if (jet.Constituents().size() < 2) return EnforceJet(jet, bdt);
98  ClusterSequence cluster_sequence(jet.Constituents(), Settings::SubJetDefinition());
99  auto jets = cluster_sequence.ExclusiveJetsUpTo(2);
100  if (jets.size() != 2) std::cout << "not the sub-jet number we expected: " << jets.size();
101  multiplet_1_.Enforce(jets.at(0), bdt);
102  multiplet_2_.Enforce(jets.at(1), bdt);
103  SetBdt(bdt);
104  }
105 
109  void EnforceJet(boca::Jet jet, double bdt)
110  {
111  jet.Info().SetSubStructure(false);
112  multiplet_1_.Enforce(jet / 2, bdt);
113  multiplet_2_.Enforce(jet / 2, bdt);
114  SetBdt(bdt);
115  }
117 
121  void Set(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
122  {
123  multiplet_1_ = multiplet_1;
124  multiplet_2_ = multiplet_2;
125  }
126 
136  {
137  return event_shapes_.Get([this]() {
138  return boca::EventShapes(Jets());
139  });
140  }
141 
145  std::vector<boca::Jet> Jets() const override
146  {
147  return Combine(Multiplet1().Jets(), Multiplet2().Jets());
148  }
149 
153  std::vector<LorentzVector<Momentum>> LorentzVectors() const override
154  {
155  return DeltaR() > Settings::JetConeSize() ? Combine(Multiplet1().LorentzVectors(), Multiplet2().LorentzVectors()) : std::vector<LorentzVector<Momentum>> {Jet().LorentzVector()};
156  }
158 
167  Multiplet_1_ &Multiplet1()
168  {
169  return multiplet_1_;
170  }
171 
175  Multiplet_1_ const &Multiplet1() const
176  {
177  return multiplet_1_;
178  }
179 
183  Multiplet_2_ &Multiplet2()
184  {
185  return multiplet_2_;
186  }
187 
191  Multiplet_2_ const &Multiplet2() const
192  {
193  return multiplet_2_;
194  }
196 
205  template <typename Multiplet_3_>
206  bool Overlap(Multiplet_3_ const &multiplet) const
207  {
208  return multiplet.Overlap(multiplet_1_) || multiplet.Overlap(multiplet_2_);
209  }
210 
214  bool Overlap(boca::Singlet const &singlet) const
215  {
216  return multiplet_1_.Overlap(singlet) || multiplet_2_.Overlap(singlet);
217  }
218 
222  bool Overlap(boca::Jet const &jet) const
223  {
224  return multiplet_1_.Overlap(jet) || multiplet_2_.Overlap(jet);
225  }
226 
230  bool Overlap() const
231  {
232  return multiplet_1_.Overlap(multiplet_2_);
233  }
235 
245  {
246  return Multiplet2().Pt() - Multiplet1().Pt();
247  }
248 
252  Momentum Ht() const
253  {
254  return Multiplet1().Ht() + Multiplet2().Ht();
255  }
256 
261  {
262  return Multiplet2().Mass() - Multiplet1().Mass();
263  }
264 
269  {
270  return Multiplet2().Ht() - Multiplet1().Ht();
271  }
272 
277  {
278  return boost::units::abs(Mass() - MassOf(id));
279  }
281 
290  Angle DeltaRap() const
291  {
292  return Multiplet1().DeltaRapTo(Multiplet2());
293  }
294 
298  Angle DeltaPhi() const
299  {
300  return Multiplet1().DeltaPhiTo(Multiplet2());
301  }
302 
306  Angle DeltaR() const
307  {
308  return Multiplet1().DeltaRTo(Multiplet2());
309  }
310 
315  {
316  return {Multiplet2().Angles(), Multiplet1().AnglesMinTo(Multiplet2())};
317  }
319 
328  template<typename Multiplet_>
329  Angle PullTo(Multiplet_ const &multiplet) const
330  {
331  return ConstituentJet().PullAngle(DeltaTo(multiplet));
332  }
333 
337  Angle Pull12() const
338  {
339  return Multiplet1().PullTo(Multiplet2());
340  }
341 
345  Angle Pull21() const
346  {
347  return Multiplet2().PullTo(Multiplet1());
348  }
349 
353  double Dipolarity() const
354  {
355  if (Pt() <= Settings::MinCellPt() || DeltaR() <= Settings::MinCellResolution()) return 0;
357  auto dipolarity = sum / Pt() / sqr(DeltaR());
358  if(dipolarity > 100) std::cerr << "dipol: " << dipolarity << " sum: " << sum << " mom: " << Pt() << " deltar: " << DeltaR() << '\n';
359  return dipolarity < mU ? -6 : std::log10(dipolarity);
360  }
362 
372  return Multiplet1().Pt() > Multiplet2().Pt() ? Multiplet1().Jet() : Multiplet2().Jet();
373  }
374 
379  return Multiplet1().Pt() < Multiplet2().Pt() ? Multiplet1().Jet() : Multiplet2().Jet();
380  }
381 
386  return Multiplet1().MassDifferenceTo(id) < Multiplet2().MassDifferenceTo(id) ? Multiplet1().Jet() : Multiplet2().Jet();
387  }
388 
390  return Multiplet1().MassDifferenceTo(id) > Multiplet2().MassDifferenceTo(id) ? Multiplet1().Jet() : Multiplet2().Jet();
391  }
393 
400  double Rho() const
401  {
402  return Pt() > Settings::MinCellPt() && DeltaR() > Settings::MinCellResolution() ? static_cast<double>(Mass() / Pt() / DeltaR() * 2_rad) : 0;
403  }
404 
408  int Charge() const
409  {
410  return Multiplet1().Charge() + Multiplet2().Charge();
411  }
412 
413  friend std::ostream & operator<<(std::ostream & stream, TwoBody const& two_body){
414  stream << two_body.Name() << '\n' << two_body.multiplet_1_ << '\n' << two_body.multiplet_2_;
415  return stream;
416  }
417 
418 protected:
419 
420  std::string Name() const override {
421  return "Two-Body";
422  }
423 
424  void SetMultiplet1(Multiplet_1_ const &multiplet_1)
425  {
426  multiplet_1_ = multiplet_1;
427  }
428 
429  void SetMultiplet2(Multiplet_2_ const &multiplet_2)
430  {
431  multiplet_2_ = multiplet_2;
432  }
433 
434 private:
435 
436  boca::Jet GetJet() const override
437  {
438  return Join(Multiplet1(), Multiplet2());
439  }
440 
441  Singlet GetConstituentJet() const override
442  {
444  }
445 
446  Multiplet_1_ multiplet_1_;
447 
448  Multiplet_2_ multiplet_2_;
449 
450 };
451 
452 template<typename Multiplet_1_, typename Multiplet_2_>
453 Jet Join(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
454 {
455  return Join(multiplet_1.Jet(), multiplet_2.Jet());
456 }
457 
458 template<typename Multiplet_1_, typename Multiplet_2_>
459 boca::Singlet JoinConstituents(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
460 {
461  auto constituents = SortedByPt(Combine(multiplet_1.Constituents(), multiplet_2.Constituents()));
462  boost::erase(constituents, boost::unique<boost::return_found_end>(constituents));
463  return Join(constituents);
464 }
465 
466 template<typename Multiplet_>
467 Jet Join(Jet const &jet, Multiplet_ const &multiplet)
468 {
469  return Join(jet, multiplet.Jet());
470 }
471 
472 template<typename Multiplet_>
473 Jet Join(Multiplet_ const &multiplet, Jet const &jet)
474 {
475  return Join(jet, multiplet.Jet());
476 }
477 
478 }
479 
static Angle JetConeSize()
Definition: Settings.cpp:59
void EnforceJet(boca::Jet jet, double bdt)
Enforce a Multiplet from a jet and a seperate bdt.
Definition: TwoBody.hh:109
Jet.
Definition: Jet.hh:15
Multiplet_2_ & Multiplet2()
Accessor to the second multiplet.
Definition: TwoBody.hh:183
Angle PullAngle(Vector2< Angle > const &reference) const
Pull angle towards the reference angel.
Definition: Singlet.cpp:97
int Charge() const
Charge.
Definition: TwoBody.hh:408
Angle PullTo(Multiplet_ const &multiplet) const
Pull towards another multiplet.
Definition: TwoBody.hh:329
Angle Pull21() const
Pull from the second component to the first.
Definition: TwoBody.hh:345
Jet()
Definition: Jet.cpp:18
static fastjet::JetDefinition SubJetDefinition()
Definition: Settings.cpp:102
static Momentum MinCellPt()
Definition: Settings.cpp:73
boca::Mass Mass() const
Definition: Multiplet.cpp:61
boca::Singlet JoinConstituents(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2, Multiplet_3_ const &multiplet_3)
Definition: ThreeBody.hh:161
boca::Jet ComponentWithWorseMass(Id id) const
Harder subcomponent.
Definition: TwoBody.hh:389
boost::units::quantity< boost::units::si::plane_angle > Angle
Angle measured in radian.
Definition: Si.hh:35
boca::Singlet ConstituentJet() const
Jet of all constituents.
Definition: Multiplet.cpp:22
double Rho() const
Particle likeliness .
Definition: TwoBody.hh:400
boca::EventShapes EventShapes() const
Accessor for event shapes.
Definition: TwoBody.hh:135
boca::Jet SofterComponent() const
Softer subcomponent.
Definition: TwoBody.hh:378
Vector2< Angle > DeltaTo(Multiplet_ const &multiplet) const
Angular distance to a jet.
Definition: Multiplet.hh:88
boca::Jet Jet() const
Definition: Multiplet.cpp:29
Mutable< boca::EventShapes > event_shapes_
Definition: Multiplet.hh:153
virtual double Bdt() const
Definition: Identification.cpp:27
Momentum Pt() const
Definition: Multiplet.cpp:36
void Set(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
Setter for two Multiplets.
Definition: TwoBody.hh:121
bool Overlap(boca::Singlet const &singlet) const
Overlap with a singlet.
Definition: TwoBody.hh:214
Id
PDG particle naming conventions.
Definition: Id.hh:23
TwoBody()
Default constructor.
Definition: TwoBody.hh:38
slighly more complicated estimator for significance
Wrapper for a Jet in order to make it behave like a Multiplet.
Definition: Singlet.hh:19
Two body base class.
Definition: TwoBody.hh:24
AngleSquareMomentum DipolaritySum(Line2< Angle > const &line) const
Sum for Dipolarity calculation.
Definition: Singlet.cpp:83
Angle DeltaR() const
Difference in angular distance .
Definition: TwoBody.hh:306
auto sqr(Value const &value)
square of value
Definition: Math.hh:24
friend std::ostream & operator<<(std::ostream &stream, TwoBody const &two_body)
Definition: TwoBody.hh:413
Angle DeltaRap() const
Difference rapidity .
Definition: TwoBody.hh:290
std::vector< Jet > Constituents() const
Definition: Jet.cpp:240
Momentum DeltaPt() const
Transverse momentum .
Definition: TwoBody.hh:244
static Angle MinCellResolution()
Definition: Settings.cpp:78
Momentum Ht() const
Scalar sum of transverse momenta .
Definition: TwoBody.hh:252
std::vector< Element_ > Combine(std::vector< Element_ > const &vector_1, std::vector< Element_ > const &vector_2)
Combine two std::vector.
Definition: Vector.hh:101
void SetMultiplet1(Multiplet_1_ const &multiplet_1)
Definition: TwoBody.hh:424
boca::Jet HarderComponent() const
Harder subcomponent.
Definition: TwoBody.hh:371
JetInfo const & Info() const
Definition: Jet.cpp:151
Line2< Angle > AngleLine() const
Line in agular space from the second component to the first.
Definition: TwoBody.hh:314
Boosted Collider Analysis.
Definition: Analysis.hh:15
boca::LorentzVector< Momentum > LorentzVector() const
Momentum lorentz vector.
Definition: PseudoJet.cpp:73
Value abs(Value const &value)
Absolute value.
Definition: Units.hh:235
boca::Jet ComponentWithBetterMass(Id id) const
Subcomponent with the better mass of an object with Id.
Definition: TwoBody.hh:385
Jet Join(std::vector< Jet > const &jets)
Definition: Jet.cpp:202
Angle Pull12() const
Pull from the first component to the second.
Definition: TwoBody.hh:337
double Bdt() const
Definition: Jet.cpp:248
std::vector< LorentzVector< Momentum > > LorentzVectors() const override
Accessor for lorentz vectors.
Definition: TwoBody.hh:153
bool Overlap() const
Overlap within a multiplet.
Definition: TwoBody.hh:230
void SetSubStructure(bool sub_structure)
Definition: JetInfo.cpp:329
boca::Mass MassDifferenceTo(Id id) const
Mass difference to a particle with Id.
Definition: TwoBody.hh:276
std::string Name() const override
Definition: TwoBody.hh:420
Multiplet base class
Definition: Multiplet.hh:21
Multiplet_1_ const & Multiplet1() const
Const accessor to the first multiplet.
Definition: TwoBody.hh:175
TwoBody(Multiplet_1_ const &multiplet_1, Multiplet_2_ const &multiplet_2)
Constructor accepting two different Multiplets.
Definition: TwoBody.hh:43
Mass MassOf(Id id)
Mass of particle with given Id.
Definition: Id.cpp:103
double Dipolarity() const
Dipolarity according to .
Definition: TwoBody.hh:353
Angle DeltaPhi() const
Difference in azimuth .
Definition: TwoBody.hh:298
std::vector< Jet > ExclusiveJetsUpTo(int sub_jet_number) const
Definition: ClusterSequence.cpp:70
bool Overlap(Multiplet_3_ const &multiplet) const
Overlap with another multiplet.
Definition: TwoBody.hh:206
static double InitialValue()
Definition: Identification.cpp:47
Multiplet_2_ const & Multiplet2() const
Const accessor to the second multiplet.
Definition: TwoBody.hh:191
Energy Momentum
Momentum measured in electronvolt.
Definition: ElectronVolt.hh:68
void SetMultiplet2(Multiplet_2_ const &multiplet_2)
Definition: TwoBody.hh:429
Line between two points.
Definition: Line.hh:15
void Enforce(boca::Jet const &jet)
Enforce a Multiplet from a Jet.
Definition: TwoBody.hh:74
std::vector< Multiplet > SortedByPt(std::vector< Multiplet > multiplets)
Definition: Sort.hh:53
void Enforce(std::vector< boca::Jet > const &jets)
Enforce a Multiplet from a vector of jets.
Definition: TwoBody.hh:82
std::vector< boca::Jet > Jets() const override
Accessor for jets.
Definition: TwoBody.hh:145
Wrapper around fastjet:ClusterSequence taking care of memory managment.
Definition: ClusterSequence.hh:30
virtual void SetBdt(double bdt)
Definition: Identification.cpp:17
Energy Mass
Mass measured in electronvolt.
Definition: ElectronVolt.hh:62
Multiplet_1_ & Multiplet1()
Accessor to the first multiplet.
Definition: TwoBody.hh:167
Calculates the event shapes for a given collection of jets.
Definition: EventShapes.hh:25
bool Overlap(boca::Jet const &jet) const
Overlap with a jet.
Definition: TwoBody.hh:222
void Enforce(TwoBody< Multiplet_3_, Multiplet_4_ > const &multiplet)
Enforce Multiplet from a single other Multiplet.
Definition: TwoBody.hh:64
boca::Mass DeltaM() const
Mass difference.
Definition: TwoBody.hh:260
void Enforce(boca::Jet const &jet, double bdt)
Enforce a Multiplet from a jet and a seperate bdt.
Definition: TwoBody.hh:95
Momentum DeltaHt() const
Difference in the scalar sum of transverse moenta.
Definition: TwoBody.hh:268