Rivet analyses
Monte Carlo validation observables for missing transverse energy
Experiment: ()
Status: VALIDATED
Authors: - Andy Buckley
References: none listed
Beams: * *
Beam energies: ANY
Run details: - Any event type, with or without “real MET”.
Reports vector and scalar transverse momentum sums, based on total or |η| < 5 detector acceptances.
Source
code:MC_MET.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/InvisibleFinalState.hh"
#include "Rivet/Projections/MissingMomentum.hh"
#include "Rivet/Projections/Smearing.hh"
namespace Rivet {
/// @brief MC validation analysis for truth and reco MET and SET observables
class MC_MET : public Analysis {
public:
RIVET_DEFAULT_ANALYSIS_CTOR(MC_MET);
void init() {
const FinalState inclfs;
const FinalState calofs(Cuts::abseta < 5);
const MissingMomentum inclmm(inclfs);
const MissingMomentum calomm(calofs);
declare(inclmm, "InclMET");
declare(calomm, "CaloMET");
declare(SmearedMET(calomm, MET_SMEARPARAMS_ATLAS_RUN2), "RecoMET");
declare(InvisibleFinalState(), "InvisibleFS");
declare(InvisibleFinalState(OnlyDirect::YES), "DirectInvisibleFS");
const double METMAX = sqrtS()/5, SETMAX = sqrtS()/3;
book(_h["met_incl"], "met_incl", logspace(50, 10, METMAX/GeV));
book(_h["met_calo"], "met_calo", logspace(50, 10, METMAX/GeV));
book(_h["met_reco"], "met_reco", logspace(50, 10, METMAX/GeV));
book(_h["mpt_incl"], "mpt_incl", logspace(50, 10, METMAX/GeV));
book(_h["mpt_calo"], "mpt_calo", logspace(50, 10, METMAX/GeV));
book(_h["mpt_reco"], "mpt_reco", logspace(50, 10, METMAX/GeV));
book(_h["set_incl"], "set_incl", logspace(50, 10, SETMAX/GeV));
book(_h["set_calo"], "set_calo", logspace(50, 10, SETMAX/GeV));
book(_h["set_reco"], "set_reco", logspace(50, 10, SETMAX/GeV));
book(_h["pT_inv"], "pT_inv", logspace(50, 10, METMAX/GeV));
book(_h["pT_directinv"], "pT_directinv", logspace(50, 10, METMAX/GeV));
book(_h["mass_inv"], "mass_inv", logspace(100, 10, METMAX/GeV));
book(_h["mass_directinv"], "mass_directinv", logspace(100, 10, METMAX/GeV));
book(_h["rap_inv"], "rap_inv", 50, -5., 5.);
book(_h["rap_directinv"], "rap_directinv", 50, -5., 5.);
}
void analyze(const Event& event) {
// Inclusive truth MET, etc.
const METFinder& mmincl = apply<MissingMomentum>(event, "InclMET");
_h["met_incl"]->fill(mmincl.met()/GeV);
_h["mpt_incl"]->fill(mmincl.mpt()/GeV);
_h["set_incl"]->fill(mmincl.set()/GeV);
// Calo-acceptance truth MET, etc.
const METFinder& mmcalo = apply<MissingMomentum>(event, "CaloMET");
_h["met_calo"]->fill(mmcalo.met()/GeV);
_h["mpt_calo"]->fill(mmcalo.mpt()/GeV);
_h["set_calo"]->fill(mmcalo.set()/GeV);
// (ATLAS) reco MET, etc.
const METFinder& mmreco = apply<SmearedMET>(event, "RecoMET");
_h["met_reco"]->fill(mmreco.met()/GeV);
_h["mpt_reco"]->fill(mmreco.mpt()/GeV);
_h["set_reco"]->fill(mmreco.set()/GeV);
// Compute alternative MET from invisible particles, including from hadron decays
const ParticleFinder& allinvisibles = apply<FinalState>(event, "InvisibleFS");
if (!allinvisibles.empty()) {
FourMomentum invsum = sumP4(allinvisibles.particles());
_h["pT_inv"]->fill(invsum.pT()/GeV);
_h["mass_inv"]->fill(invsum.mass()/GeV);
_h["rap_inv"]->fill(invsum.rapidity());
}
// Compute alternative MET from direct, invisible particles only
const ParticleFinder& directinvisibles = apply<FinalState>(event, "DirectInvisibleFS");
if (!directinvisibles.empty()) {
FourMomentum invsum = sumP4(directinvisibles.particles());
_h["pT_directinv"]->fill(invsum.pT()/GeV);
_h["mass_directinv"]->fill(invsum.mass()/GeV);
_h["rap_directinv"]->fill(invsum.rapidity());
}
}
void finalize() {
const double sf = crossSectionPerEvent()/picobarn;
scale(_h, sf);
}
private:
map<string, Histo1DPtr> _h;
};
RIVET_DECLARE_PLUGIN(MC_MET);
}