DAS  3.0
Das Analysis System
GenericObject.h
Go to the documentation of this file.
1 #pragma once
2 
3 // C
4 #include <cmath>
5 
6 // STD
7 #include <ostream>
8 #include <sstream>
9 #include <string_view>
10 #include <vector>
11 
12 // ROOT
13 #include <Math/Vector4D.h>
14 
15 // Darwin
16 #include <Variation.h>
17 #include <Weight.h>
18 
19 namespace Darwin::Physics {
20 
26 class WeightedObject {
27 protected:
28  virtual ~WeightedObject () = default;
29 public:
30  virtual double Weight (const Variation&) const = 0;
31 };
32 
37 
38 protected:
39  virtual std::string_view WeightGroup () const = 0;
40 
42  virtual ~AnonymousWeightableObject () = default;
43 
44 public:
45  Weights weights = {{1.,0}};
46 
47  virtual double Weight (const Variation& v) const
48  try {
49  if (v.Group() == WeightGroup()) {
50  const struct Weight& w = weights.at(v.Index());
51  if (w.i == v.Bit()) return w;
52  }
53  return weights.at(0);
54  }
55  catch (std::out_of_range& e) {
56  std::stringstream s;
57  s << e.what() << '\n'
58  << v.Group() << ' ' << v.Name() << " is not available.";
59  throw std::out_of_range(s.str());
60  }
61 
62  virtual void Clear ()
63  {
64  weights = {{1.,0}};
65  }
66 
67  bool operator== (const AnonymousWeightableObject& that) const
68  {
69  return this->weights == that.weights;
70  }
71 };
72 
73 using FourVector = ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float>>;
74 
80 class ScaledObject {
81 
82 protected:
83  virtual ~ScaledObject () = default;
84 
85 public:
86  virtual FourVector CorrP4 (const Variation& = nominal) const = 0;
87  virtual float CorrPt (const Variation& = nominal) const = 0;
88 
89  virtual float Rapidity (const Variation& = nominal) const = 0;
90  virtual float AbsRap (const Variation& = nominal) const = 0;
91 };
92 
99 
100 protected:
101  virtual std::string_view ScaleGroup () const = 0;
102 
104  virtual ~AnonymousScalableObject () = default;
105 
106 public:
107  FourVector p4 = FourVector(std::nan("pt"), std::nan("eta"), std::nan("phi"), std::nan("mass"));
108  std::vector<float> scales = {1.};
109 
110  FourVector CorrP4 (size_t i = 0) const { return p4 * scales.at(i); }
111  float CorrPt (size_t i = 0) const { return p4.Pt() * scales.at(i); }
112 
113  float Rapidity (const Variation& = nominal) const final { return p4.Rapidity() ; }
114  float AbsRap (const Variation& = nominal) const final { return std::abs(Rapidity()); }
115 
116  FourVector CorrP4 (const Variation& v) const final
117  {
118  size_t i = v.Group() == ScaleGroup() ? v.Index() : 0;
120  }
121 
122  float CorrPt (const Variation& v) const final
123  {
124  size_t i = v.Group() == ScaleGroup() ? v.Index() : 0;
126  }
127 
128  virtual void Clear ()
129  {
130  p4.SetCoordinates(std::nan("pt"), std::nan("eta"), std::nan("phi"), std::nan("mass"));
131  scales = {1.};
132  }
133 
134  bool operator== (const AnonymousScalableObject& that) const
135  {
136  return this->p4 == that.p4 && this->scales == that.scales;
137  }
138 
139  bool operator< (const AnonymousScalableObject& that) const
140  {
141  return this->CorrPt() < that.CorrPt();
142  }
143 
144  bool operator> (const AnonymousScalableObject& that) const
145  {
146  return this->CorrPt() > that.CorrPt();
147  }
148 };
149 
152 class AnonymousFinalStateObject : public AnonymousWeightableObject,
153  public AnonymousScalableObject {
154 
155 protected:
157  virtual ~AnonymousFinalStateObject () = default;
158 
159 public:
160  void Clear () override
161  {
164  }
165 
166  virtual bool operator== (const AnonymousFinalStateObject& that) const
167  {
170  }
171 };
172 
173 } // end of Darwin::Physics namespace
174 
175 #if 0
176 inline std::ostream& operator<< (std::ostream& s, const Darwin::Physics::FourVector& p4)
177 {
178  return s << '(' << p4.Pt() << ',' << p4.Eta() << ',' << p4.Phi() << ',' << p4.M() << ')';
179 }
180 #endif
181 
182 inline std::ostream& operator<< (std::ostream& s, const Darwin::Physics::AnonymousWeightableObject& obj)
183 {
184  for (const auto& w: obj.weights)
185  s << w << ' ';
186  return s;
187 }
188 
189 inline std::ostream& operator<< (std::ostream& s, const Darwin::Physics::AnonymousScalableObject& obj)
190 {
191  return s << obj.p4 << ' ';
192  for (const auto& f: obj.scales)
193  s << f << ' ';
194  return s;
195 }
196 
197 inline std::ostream& operator<< (std::ostream& s, const Darwin::Physics::AnonymousFinalStateObject& obj)
198 {
199  return s << (const Darwin::Physics::AnonymousWeightableObject&) obj << "-- "
201 }
Darwin::Physics::Weight
Definition: Weight.h:17
Darwin::Physics::AnonymousScalableObject
Abstract class for any object that carries its own 4-momentum.
Definition: GenericObject.h:98
Darwin::Physics::AnonymousFinalStateObject::Clear
void Clear() override
Definition: GenericObject.h:160
Darwin::Physics::AnonymousWeightableObject::Weight
virtual double Weight(const Variation &v) const
Definition: GenericObject.h:47
Darwin::Physics::AnonymousScalableObject::CorrP4
FourVector CorrP4(size_t i=0) const
corrected 4-vector
Definition: GenericObject.h:110
Darwin::Physics::AnonymousFinalStateObject::AnonymousFinalStateObject
AnonymousFinalStateObject()=default
Darwin::Physics::AnonymousWeightableObject::~AnonymousWeightableObject
virtual ~AnonymousWeightableObject()=default
Darwin::Physics::ScaledObject::AbsRap
virtual float AbsRap(const Variation &=nominal) const =0
Darwin::Physics::AnonymousFinalStateObject::~AnonymousFinalStateObject
virtual ~AnonymousFinalStateObject()=default
Darwin::Physics::WeightedObject::Weight
virtual double Weight(const Variation &) const =0
Darwin::Physics::WeightedObject
Abstract class for any object that can be weighted.
Definition: GenericObject.h:26
Ntupliser_cfg.f
f
Definition: Ntupliser_cfg.py:318
Darwin::Physics::AnonymousFinalStateObject
Generic class for jets, photons, muons, etc.
Definition: GenericObject.h:153
DAS::JetEnergy::w
static const float w
Definition: common.h:53
Darwin::Physics::Weights
std::vector< Weight > Weights
Definition: Weight.h:42
Darwin::Physics::AnonymousScalableObject::CorrPt
float CorrPt(size_t i=0) const
corrected transverse momentum
Definition: GenericObject.h:111
Weight.h
Darwin::Physics::AnonymousScalableObject::~AnonymousScalableObject
virtual ~AnonymousScalableObject()=default
Darwin::Physics::ScaledObject::CorrPt
virtual float CorrPt(const Variation &=nominal) const =0
Darwin::Physics::Variation
Definition: Variation.h:26
Darwin::Physics::AnonymousScalableObject::scales
std::vector< float > scales
energy scale corrections and variations
Definition: GenericObject.h:108
Variation.h
Darwin::Physics::AnonymousWeightableObject
Abstract class for any object that carries its own weights. A std::vector is used to carry the scale ...
Definition: GenericObject.h:36
Darwin::Physics::ScaledObject::CorrP4
virtual FourVector CorrP4(const Variation &=nominal) const =0
Darwin::Physics::AnonymousScalableObject::operator<
bool operator<(const AnonymousScalableObject &that) const
Definition: GenericObject.h:139
Darwin::Physics::ScaledObject::Rapidity
virtual float Rapidity(const Variation &=nominal) const =0
Darwin::Physics::ScaledObject::~ScaledObject
virtual ~ScaledObject()=default
Darwin::Physics::AnonymousWeightableObject::AnonymousWeightableObject
AnonymousWeightableObject()=default
Darwin::Physics::AnonymousScalableObject::operator==
bool operator==(const AnonymousScalableObject &that) const
Definition: GenericObject.h:134
Darwin::Physics::AnonymousScalableObject::Clear
virtual void Clear()
Definition: GenericObject.h:128
Darwin::Physics::ScaledObject
Abstract class for any object whose energy can be scaled.
Definition: GenericObject.h:80
Darwin::Physics::AnonymousWeightableObject::weights
Weights weights
e.g. cross section normalisation
Definition: GenericObject.h:45
Darwin::Physics::AnonymousScalableObject::CorrPt
float CorrPt(const Variation &v) const final
< corrected transverse momentum
Definition: GenericObject.h:122
Darwin::Physics::nominal
const Variation nominal("", "nominal")
Darwin::Physics::AnonymousScalableObject::CorrP4
FourVector CorrP4(const Variation &v) const final
< corrected 4-vector
Definition: GenericObject.h:116
Darwin::Physics::AnonymousScalableObject::operator>
bool operator>(const AnonymousScalableObject &that) const
Definition: GenericObject.h:144
Darwin::Physics::AnonymousScalableObject::AbsRap
float AbsRap(const Variation &=nominal) const final
absolute rapidity
Definition: GenericObject.h:114
Darwin::Physics::AnonymousFinalStateObject::operator==
virtual bool operator==(const AnonymousFinalStateObject &that) const
Definition: GenericObject.h:166
Darwin::Physics::AnonymousWeightableObject::WeightGroup
virtual std::string_view WeightGroup() const =0
Darwin::Physics::AnonymousWeightableObject::Clear
virtual void Clear()
Definition: GenericObject.h:62
Darwin::Physics::AnonymousScalableObject::ScaleGroup
virtual std::string_view ScaleGroup() const =0
Darwin::Physics::FourVector
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< float > > FourVector
Definition: GenericObject.h:73
Darwin::Physics::AnonymousScalableObject::Rapidity
float Rapidity(const Variation &=nominal) const final
Definition: GenericObject.h:113
operator<<
std::ostream & operator<<(std::ostream &s, const Darwin::Physics::AnonymousWeightableObject &obj)
Definition: GenericObject.h:182
Darwin::Physics::AnonymousWeightableObject::operator==
bool operator==(const AnonymousWeightableObject &that) const
Definition: GenericObject.h:67
Darwin::Physics
Everything what concerns physics analysis directly.
Definition: darwin.h:24
Darwin::Physics::AnonymousScalableObject::AnonymousScalableObject
AnonymousScalableObject()=default
Darwin::Physics::WeightedObject::~WeightedObject
virtual ~WeightedObject()=default
Darwin::Physics::AnonymousScalableObject::p4
FourVector p4
raw four-momentum directly after reconstruction
Definition: GenericObject.h:107