Warning, file /include/Rivet/Projections/SmearedMET.hh was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002 #ifndef RIVET_SmearedMET_HH
0003 #define RIVET_SmearedMET_HH
0004
0005 #include "Rivet/Projection.hh"
0006 #include "Rivet/Projections/METFinder.hh"
0007 #include "Rivet/Projections/MissingMomentum.hh"
0008 #include "Rivet/Tools/SmearingFunctions.hh"
0009 #include <functional>
0010
0011 namespace Rivet {
0012
0013
0014
0015 class SmearedMET : public METFinder {
0016 public:
0017
0018
0019
0020
0021
0022
0023
0024 template<typename SMEARPARAMSFN, typename std::enable_if_t<is_same_v<invoke_result_t<SMEARPARAMSFN, Vector3, double>, METSmearParams>, int> = 0>
0025 SmearedMET(const MissingMomentum& mm, const SMEARPARAMSFN& metSmearParamsFn)
0026 : _metSmearParamsFn(metSmearParamsFn), _metSmearFn(nullptr)
0027
0028
0029
0030
0031 {
0032 setName("SmearedMET");
0033 declare(mm, "TruthMET");
0034 _noSmear = getEnvParam<bool>("RIVET_DISABLE_SMEARING", false);
0035 }
0036
0037
0038
0039
0040 template<typename SMEARPARAMSFN, typename std::enable_if_t<is_same_v<invoke_result_t<SMEARPARAMSFN, Vector3, double>, METSmearParams>, int> = 0>
0041 SmearedMET(const SMEARPARAMSFN& metSmearParamsFn, const Cut& cut=Cuts::OPEN)
0042 : SmearedMET(MissingMomentum(cut), metSmearParamsFn)
0043 { }
0044
0045
0046
0047
0048 template<typename SMEARFN, typename std::enable_if_t<is_same_v<invoke_result_t<SMEARFN, Vector3, double>, Vector3>, int> = 0>
0049 SmearedMET(const MissingMomentum& mm, const SMEARFN& metSmearFn)
0050 : _metSmearParamsFn(nullptr), _metSmearFn(metSmearFn)
0051 {
0052 setName("SmearedMET");
0053 declare(mm, "TruthMET");
0054 _noSmear = getEnvParam<bool>("RIVET_DISABLE_SMEARING", false);
0055 }
0056
0057
0058
0059
0060 template<typename SMEARFN, typename std::enable_if_t<is_same_v<invoke_result_t<SMEARFN, Vector3, double>, Vector3>, int> = 0>
0061 SmearedMET(const SMEARFN& metSmearFn, const Cut& cut=Cuts::OPEN)
0062 : SmearedMET(MissingMomentum(cut), metSmearFn)
0063 { }
0064
0065
0066
0067
0068
0069
0070 template <typename SMEARPARAMSFN, typename SMEARFN,
0071 typename std::enable_if_t<is_same_v<invoke_result_t<SMEARFN, Vector3, double>, Vector3> &&
0072 is_same_v<invoke_result_t<SMEARPARAMSFN, Vector3, double>, METSmearParams>, int> = 0>
0073 SmearedMET(const MissingMomentum& mm, const SMEARPARAMSFN& metSmearParamsFn, const SMEARFN& metSmearFn)
0074 : _metSmearParamsFn(metSmearParamsFn), _metSmearFn(metSmearFn)
0075 {
0076 setName("SmearedMET");
0077 declare(mm, "TruthMET");
0078 _noSmear = getEnvParam<bool>("RIVET_DISABLE_SMEARING", false);
0079 }
0080
0081
0082
0083
0084
0085
0086 template <typename SMEARPARAMSFN, typename SMEARFN,
0087 typename std::enable_if_t<is_same_v<invoke_result_t<SMEARFN, Vector3, double>, Vector3> &&
0088 is_same_v<invoke_result_t<SMEARPARAMSFN, Vector3, double>, METSmearParams>, int> = 0>
0089 SmearedMET(const SMEARPARAMSFN& metSmearParamsFn, const SMEARFN& metSmearFn, const Cut& cut=Cuts::OPEN)
0090 : SmearedMET(MissingMomentum(cut), metSmearParamsFn, metSmearFn)
0091 { }
0092
0093
0094
0095 RIVET_DEFAULT_PROJ_CLONE(SmearedMET);
0096
0097
0098
0099
0100 using Projection::operator =;
0101
0102
0103
0104 CmpState compare(const Projection& p) const {
0105
0106
0107
0108
0109
0110
0111
0112
0113 if (_noSmear) return CmpState::EQ;
0114 return CmpState::UNDEF;
0115 }
0116
0117
0118
0119 void project(const Event& e) {
0120 const METFinder& mm = apply<MissingMomentum>(e, "TruthMET");
0121 _spt = mm.scalarPt();
0122 _set = mm.scalarEt();
0123 _vpt = mm.vectorPt();
0124 _vet = mm.vectorEt();
0125
0126
0127 if (_noSmear) return;
0128
0129 if (_metSmearFn) {
0130 _vpt = _metSmearFn(_vpt, _spt);
0131 _vet = _metSmearFn(_vet, _set);
0132 } else if (_metSmearParamsFn) {
0133 const METSmearParams msps_p = _metSmearParamsFn(_vpt, _set);
0134 _vpt = MET_SMEAR_NORM(msps_p);
0135 const METSmearParams msps_e = _metSmearParamsFn(_vet, _set);
0136 _vet = MET_SMEAR_NORM(msps_e);
0137 } else {
0138 throw SmearError("Attempt to smear MPT and MET with neither a smearing function nor a smearing-params function set");
0139 }
0140 }
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 const Vector3& vectorSumPt() const { return _vpt; }
0153
0154
0155 double scalarSumPt() const { return _spt; }
0156
0157
0158 double missingPtResolution() const {
0159 if (!_metSmearParamsFn)
0160 throw UserError("Trying to compute MPT significance without a registered significance function");
0161 METSmearParams msps = _metSmearParamsFn(vectorPt(), scalarPt());
0162 return msps.pResolution;
0163 }
0164
0165
0166 double missingPtSignf() const {
0167 return missingPt() / missingPtResolution();
0168 }
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 const Vector3& vectorSumEt() const { return _vet; }
0185
0186
0187 double scalarSumEt() const { return _set; }
0188
0189
0190 double missingEtResolution() const {
0191 if (!_metSmearParamsFn)
0192 throw UserError("Trying to compute MET significance without a registered significance function");
0193 METSmearParams msps = _metSmearParamsFn(vectorEt(), scalarEt());
0194
0195 return msps.pResolution;
0196 }
0197
0198
0199 double missingEtSignf() const {
0200 return missingEt() / missingEtResolution();
0201 }
0202
0203
0204
0205
0206
0207 void reset() { }
0208
0209
0210 protected:
0211
0212 Vector3 _vpt, _vet;
0213 double _spt, _set;
0214
0215
0216 METSmearParamsFn _metSmearParamsFn;
0217
0218
0219 METSmearFn _metSmearFn;
0220
0221
0222
0223
0224 bool _noSmear{false};
0225
0226 };
0227
0228
0229 }
0230
0231 #endif