14 #include "Math/VectorUtil.h"
33 template<
typename Obj1,
typename Obj2>
struct Di :
public std::pair<Obj1*, Obj2*>,
36 using base = std::pair<Obj1*, Obj2*>;
38 using std::pair<Obj1*, Obj2*>::pair;
39 using std::pair<Obj1*, Obj2*>::first,
40 std::pair<Obj1*, Obj2*>::second;
43 explicit operator bool ()
const {
return first && second; }
45 inline void clear () { first =
nullptr; second =
nullptr; }
48 {
return first->CorrP4(v) + second->CorrP4(v); }
53 {
return CorrP4(v).Rapidity(); }
58 {
return second->CorrP4(v).Eta() - first->CorrP4(v).Eta(); }
60 {
return ROOT::Math::VectorUtil::DeltaPhi(first->CorrP4(v), second->CorrP4(v)); }
62 {
return ROOT::Math::VectorUtil::DeltaR (first->CorrP4(v), second->CorrP4(v)); }
65 {
return (first->Rapidity(v) + second->Rapidity(v))/2; }
67 {
return (first->Rapidity(v) - second->Rapidity(v))/2; }
70 {
return std::max(first->AbsRap(), second->AbsRap()); }
72 {
return (first->CorrPt(v) + second->CorrPt(v))/2; }
75 {
return first->Weight(v) * second->Weight(v); }
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)
103 template<
typename Obj1,
typename Obj2>
107 return s <<
'[' << *di.first <<
", " << *di.second <<
"] = " << di.
CorrP4();
109 return s <<
"\x1B[33minvalid system\x1B[0m";
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 +;
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 +;