2#ifndef RIVET_TOOLS_OBJECTBASEDMET_HH
3#define RIVET_TOOLS_OBJECTBASEDMET_HH
5#include "Rivet/Tools/ExptResolutionFunctions.hh"
22 ResolutionFunctorPtr<Jet> jet_phi_res,
24 ResolutionFunctorPtr<Particle> el_et_res,
25 ResolutionFunctorPtr<Particle> el_phi_res,
27 ResolutionFunctorPtr<Particle> mu_pt_res,
28 ResolutionFunctorPtr<Particle> mu_phi_res,
30 ResolutionFunctorPtr<Particle> photon_pt_res =
nullptr,
31 ResolutionFunctorPtr<Particle> photon_phi_res =
nullptr,
33 ResolutionFunctorPtr<Jet> hadtau_pt_res =
nullptr,
34 ResolutionFunctorPtr<Jet> hadtau_phi_res =
nullptr)
35 : _jet_pt_res(
std::move(jet_pt_res)),
36 _jet_phi_res(
std::move(jet_phi_res)),
37 _el_et_res(
std::move(el_et_res)),
38 _el_phi_res(
std::move(el_phi_res)),
39 _mu_pt_res(
std::move(mu_pt_res)),
40 _mu_phi_res(
std::move(mu_phi_res)),
41 _photon_pt_res(
std::move(photon_pt_res)),
42 _photon_phi_res(
std::move(photon_phi_res)),
43 _hadtau_pt_res(
std::move(hadtau_pt_res)),
44 _hadtau_phi_res(
std::move(hadtau_phi_res)) { }
52 const Jets& hadtaus = {}) {
54 ThreeMomentum softVec = MET;
57 Matrix<2> cov_sum = Matrix<2>::mkZero();
58 for (
const Jet& j : js) {
61 const double jptres = _jet_pt_res->resolution(j);
62 const double jphires = _jet_phi_res->resolution(j);
68 for (
const Particle& e : es) {
70 const double etres = _el_et_res->resolution(e);
71 const double phires = _el_phi_res->resolution(e);
75 for (
const Particle& mu : mus) {
77 const double ptres = _mu_pt_res->resolution(mu);
78 const double phires = _mu_phi_res->resolution(mu);
83 if (_photon_phi_res !=
nullptr && _photon_pt_res !=
nullptr) {
84 for (
const Particle& gamma : gammas) {
85 softVec += gamma.p3();
86 const double ptres = _photon_pt_res->resolution(gamma);
87 const double phires = _photon_phi_res->resolution(gamma);
94 else if (gammas.size() > 0) {
97 "You have passed photons to a ObjectBasedMET calculator without a photon resolution functor."
98 "\n\tThis is probably NOT what you intended to do. Photons will NOT count towards MET "
103 if (_hadtau_phi_res !=
nullptr && _hadtau_pt_res !=
nullptr) {
104 for (
const Jet& hadtau : hadtaus) {
105 softVec += hadtau.p3();
106 const double ptres = _hadtau_pt_res->resolution(hadtau);
107 const double phires = _hadtau_phi_res->resolution(hadtau);
109 update_matrix(cov_sum, ptres, phires, hadtau.pt2(), metangle);
114 else if (gammas.size() > 0) {
116 MSG_WARNING(
"You have passed taus to a ObjectBasedMET calculator without a tau resolution functor."
117 "\n\tThis is probably NOT what you intended to do. Taus will NOT count towards MET "
124 Matrix<2> softUncert = Matrix<2>::mkIdentity() * 100;
126 cov_sum += softUncert;
129 if (cov_sum.get(0, 0) == 0)
return 0;
131 double rho = cov_sum.get(0, 1) / sqrt(cov_sum.get(0, 0) * cov_sum.get(1, 1));
132 rho = rho < 0.9 ? rho : 0.;
134 const double significance = MET.
pT() / sqrt(cov_sum.get(0, 0) * (1 - rho * rho));
154 const double angle)
const {
155 Matrix<2> particle_uncert = Matrix<2>::mkZero();
156 particle_uncert.set(0, 0, ptres * ptres * pt2);
157 particle_uncert.set(1, 1, phires * phires * pt2);
159 mat += particle_uncert;
164 const double c = cos(phi);
165 const double s = sin(phi);
166 const double cc = c * c;
167 const double ss = s * s;
168 const double cs = c * s;
170 const double _00 = in.get(0, 0) * cc + in.get(1, 1) * ss - cs * (in.get(1, 0) + in.get(0, 1));
171 const double _01 = in.get(0, 1) * cc - in.get(1, 0) * ss + cs * (in.get(0, 0) - in.get(1, 1));
172 const double _10 = in.get(1, 0) * cc - in.get(0, 1) * ss + cs * (in.get(0, 0) - in.get(1, 1));
173 const double _11 = in.get(0, 0) * ss + in.get(1, 1) * cc - cs * (in.get(1, 0) + in.get(0, 1));
184 double dPhi = first.
phi() - second.phi();
185 if (dPhi >
PI / 2.)
return dPhi -
PI;
186 if (dPhi < -
PI / 2.)
return dPhi +
PI;
194 ResolutionFunctorPtr<Jet> _jet_pt_res;
195 ResolutionFunctorPtr<Jet> _jet_phi_res;
197 ResolutionFunctorPtr<Particle> _el_et_res;
198 ResolutionFunctorPtr<Particle> _el_phi_res;
200 ResolutionFunctorPtr<Particle> _mu_pt_res;
201 ResolutionFunctorPtr<Particle> _mu_phi_res;
203 ResolutionFunctorPtr<Particle> _photon_pt_res;
204 ResolutionFunctorPtr<Particle> _photon_phi_res;
206 ResolutionFunctorPtr<Jet> _hadtau_pt_res;
207 ResolutionFunctorPtr<Jet> _hadtau_phi_res;
218 template <
typename jet_pt_res,
219 typename jet_phi_res,
224 typename photon_pt_res = void,
225 typename photon_phi_res = void,
226 typename tau_pt_res = void,
227 typename tau_phi_res =
void>
231 ResolutionFunctorPtr<Particle> photon_pt_ptr =
nullptr;
232 ResolutionFunctorPtr<Particle> photon_phi_ptr =
nullptr;
233 ResolutionFunctorPtr<Jet> tau_pt_ptr =
nullptr;
234 ResolutionFunctorPtr<Jet> tau_phi_ptr =
nullptr;
236 if constexpr (!std::is_void_v<photon_pt_res>) {
237 photon_pt_ptr = std::make_unique<photon_pt_res>();
238 if constexpr (!std::is_void_v<photon_phi_res>) {
239 photon_phi_ptr = std::make_unique<photon_phi_res>();
242 if constexpr (!std::is_void_v<tau_pt_res>) {
243 tau_pt_ptr = std::make_unique<tau_pt_res>();
244 if constexpr (!std::is_void_v<tau_phi_res>) {
245 tau_phi_ptr = std::make_unique<tau_phi_res>();
249 return ObjectBasedMET(std::make_unique<jet_pt_res>(), std::make_unique<jet_phi_res>(),
250 std::make_unique<el_pt_res>(), std::make_unique<el_phi_res>(),
251 std::make_unique<mu_pt_res>(), std::make_unique<mu_phi_res>(),
252 std::move(photon_pt_ptr), std::move(photon_phi_ptr), std::move(tau_pt_ptr),
253 std::move(tau_phi_ptr));
Definition ExptResolutionFunctions.hh:85
Returns 0.004 as in SimpleAnalysisFramework/src/ObjectResolutions.cxx.
Definition ExptResolutionFunctions.hh:262
Definition ExptResolutionFunctions.hh:13
Definition ExptResolutionFunctions.hh:46
Returns 0.001 as in SimpleAnalysisFramework/src/ObjectResolutions.cxx.
Definition ExptResolutionFunctions.hh:249
Definition ExptResolutionFunctions.hh:127
Specialised vector of Jet objects.
Definition Jet.hh:21
Logging system for controlled & formatted writing to stdout.
Definition Logging.hh:10
static Log & getLog(const std::string &name)
General -dimensional mathematical matrix object.
Definition MatrixN.hh:30
Definition ObjectBasedMET.hh:14
ObjectBasedMET()
Nullary constructor.
Definition ObjectBasedMET.hh:18
ObjectBasedMET(ResolutionFunctorPtr< Jet > jet_pt_res, ResolutionFunctorPtr< Jet > jet_phi_res, ResolutionFunctorPtr< Particle > el_et_res, ResolutionFunctorPtr< Particle > el_phi_res, ResolutionFunctorPtr< Particle > mu_pt_res, ResolutionFunctorPtr< Particle > mu_phi_res, ResolutionFunctorPtr< Particle > photon_pt_res=nullptr, ResolutionFunctorPtr< Particle > photon_phi_res=nullptr, ResolutionFunctorPtr< Jet > hadtau_pt_res=nullptr, ResolutionFunctorPtr< Jet > hadtau_phi_res=nullptr)
Primary constructor.
Definition ObjectBasedMET.hh:21
double sig(const ThreeMomentum &MET, const Jets &js, const Particles &es, const Particles &mus, const Particles &gammas={}, const Jets &hadtaus={})
Calculate MET significance given the MET and other objects from event.
Definition ObjectBasedMET.hh:47
Rivet::Log & getLog() const
Get Logger object.
Definition ObjectBasedMET.hh:212
Specialised vector of Particle objects.
Definition Particle.hh:21
Specialized version of the ThreeVector with momentum functionality.
Definition Vector3.hh:377
double pT() const
Calculate the transverse momentum $p_T$.
Definition Vector3.hh:487
double phi(const PhiMapping mapping=ZERO_2PI) const
Synonym for azimuthalAngle.
Definition Vector3.hh:212
#define MSG_WARNING(x)
Warning messages for non-fatal bad things, using MSG_LVL.
Definition Logging.hh:200
void update_matrix(Matrix< 2 > &mat, const double ptres, const double phires, const double pt2, const double angle) const
Definition ObjectBasedMET.hh:150
double directionalDeltaPhi(const ThreeMomentum &first, const ThreeMomentum &second) const
Definition ObjectBasedMET.hh:183
void rotateMatrix2(Matrix< 2 > &in, const double phi) const
Rotate the (pt, phi) 2D matrix in in (x,y) space by phi.
Definition ObjectBasedMET.hh:163
Definition LHCbCommon.hh:9
ObjectBasedMET makeObjectBasedMET()
Factory function to avoid the need for make_unique<> unpleasantness.
Definition ObjectBasedMET.hh:228
ObjectBasedMET ATLAS_RUN2_DEFAULT_METSIG()
ObjectBasedMET object using ATLAS Run 2 defaults.
Definition ObjectBasedMET.hh:257
constexpr double PI
Definition MathConstants.hh:13
double angle(const Vector2 &a, const Vector2 &b)
Angle (in radians) between two 2-vectors.
Definition Vector2.hh:194