DAS  3.0
Das Analysis System
Di.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cmath>
4 
5 #include <algorithm>
6 #include <iostream>
7 #include <type_traits>
8 
13 
14 #include "Math/VectorUtil.h"
15 
16 namespace DAS {
17 
33 template<typename Obj1, typename Obj2> struct Di : public std::pair<Obj1*, Obj2*>,
34  public AbstractPhysicsObject {
35 
36  using base = std::pair<Obj1*, Obj2*>;
37 
38  using std::pair<Obj1*, Obj2*>::pair;
39  using std::pair<Obj1*, Obj2*>::first,
40  std::pair<Obj1*, Obj2*>::second;
41 
42 public:
43  explicit operator bool () const { return first && second; }
44 
45  inline void clear () { first = nullptr; second = nullptr; }
46 
48  { return first->CorrP4(v) + second->CorrP4(v); }
49  inline float CorrPt (const Uncertainties::Variation& v = Uncertainties::nominal) const override
50  { return CorrP4(v).Pt(); }
51 
52  inline float Rapidity (const Uncertainties::Variation& v = Uncertainties::nominal) const override
53  { return CorrP4(v).Rapidity(); }
54  inline float AbsRap (const Uncertainties::Variation& v = Uncertainties::nominal) const override
55  { return std::abs(Rapidity(v)); }
56 
58  { return second->CorrP4(v).Eta() - first->CorrP4(v).Eta(); }
60  { return ROOT::Math::VectorUtil::DeltaPhi(first->CorrP4(v), second->CorrP4(v)); }
61  inline float DeltaR (const Uncertainties::Variation& v = Uncertainties::nominal) const
62  { return ROOT::Math::VectorUtil::DeltaR (first->CorrP4(v), second->CorrP4(v)); }
63 
64  inline float Yboost (const Uncertainties::Variation& v = Uncertainties::nominal) const
65  { return (first->Rapidity(v) + second->Rapidity(v))/2; }
66  inline float Ystar (const Uncertainties::Variation& v = Uncertainties::nominal) const
67  { return (first->Rapidity(v) - second->Rapidity(v))/2; }
68 
69  inline float Ymax (const Uncertainties::Variation& v = Uncertainties::nominal) const
70  { return std::max(first->AbsRap(), second->AbsRap()); }
71  inline float HT (const Uncertainties::Variation& v = Uncertainties::nominal) const
72  { return (first->CorrPt(v) + second->CorrPt(v))/2; }
73 
74  inline double Weight (const Uncertainties::Variation& v = Uncertainties::nominal) const override
75  { return first->Weight(v) * second->Weight(v); }
76 };
77 
86 
87 } // end of DAS namespace
88 
95 template<typename Obj1, typename Obj2,
96  class = typename std::enable_if_t<std::is_base_of_v<DAS::AbstractPhysicsObject, Obj1>>,
97  class = typename std::enable_if_t<std::is_base_of_v<DAS::AbstractPhysicsObject, Obj2>>>
98 auto operator+ (Obj1& o1, Obj2& o2)
99 {
100  return DAS::Di<Obj1,Obj2>{&o1,&o2};
101 }
102 
103 template<typename Obj1, typename Obj2>
104 std::ostream& operator<< (std::ostream& s, const DAS::Di<Obj1,Obj2>& di)
105 {
106  if (di)
107  return s << '[' << *di.first << ", " << *di.second << "] = " << di.CorrP4();
108  else
109  return s << "\x1B[33minvalid system\x1B[0m";
110 }
111 
112 #if defined(__ROOTCLING__)
113 #pragma link C++ class DAS::GenDijet::base +;
114 #pragma link C++ class DAS::GenDimuon::base +;
115 #pragma link C++ class DAS::GenZJet::base +;
116 #pragma link C++ class DAS::RecDijet::base +;
117 #pragma link C++ class DAS::RecDimuon::base +;
118 #pragma link C++ class DAS::RecZJet::base +;
119 
120 #pragma link C++ class DAS::GenDijet +;
121 #pragma link C++ class DAS::GenDimuon +;
122 #pragma link C++ class DAS::GenZJet +;
123 #pragma link C++ class DAS::RecDijet +;
124 #pragma link C++ class DAS::RecDimuon +;
125 #pragma link C++ class DAS::RecZJet +;
126 #endif
DAS
Definition: applyBTagSF.cc:31
DAS::Di::Ystar
float Ystar(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:66
DAS::Di::Weight
double Weight(const Uncertainties::Variation &v=Uncertainties::nominal) const override
Definition: Di.h:74
DAS::Di< const DAS::RecMuon, const DAS::RecMuon >::base
std::pair< const DAS::RecMuon *, const DAS::RecMuon * > base
Definition: Di.h:36
DAS::Di::HT
float HT(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:71
Jet.h
DAS::Di::DeltaR
float DeltaR(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:61
DAS::Di::CorrPt
float CorrPt(const Uncertainties::Variation &v=Uncertainties::nominal) const override
Definition: Di.h:49
DAS::Di::Rapidity
float Rapidity(const Uncertainties::Variation &v=Uncertainties::nominal) const override
Definition: Di.h:52
DAS::Di
Definition: Di.h:34
DAS::Uncertainties::nominal
const Variation nominal
Definition: Variation.h:55
DAS::AbstractPhysicsObject
Definition: PhysicsObject.h:22
operator<<
std::ostream & operator<<(std::ostream &s, const DAS::Di< Obj1, Obj2 > &di)
Definition: Di.h:104
Photon.h
DAS::Di::Yboost
float Yboost(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:64
DAS::Di::DeltaEta
float DeltaEta(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:57
DAS::Di::Ymax
float Ymax(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:69
DAS::Di::CorrP4
FourVector CorrP4(const Uncertainties::Variation &v=Uncertainties::nominal) const override
Definition: Di.h:47
DAS::FourVector
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< float > > FourVector
Definition: PhysicsObject.h:15
DAS::Di::clear
void clear()
Definition: Di.h:45
DAS::Di::DeltaPhi
float DeltaPhi(const Uncertainties::Variation &v=Uncertainties::nominal) const
Definition: Di.h:59
Lepton.h
DAS::Uncertainties::Variation
Definition: Variation.h:22
Variation.h
DAS::Di::AbsRap
float AbsRap(const Uncertainties::Variation &v=Uncertainties::nominal) const override
Definition: Di.h:54