Rivet analyses
Study of the underlying event in top quark pair production in pp collisions at 13 TeV
Experiment: CMS (LHC)
Inspire ID: 1681435
Status: VALIDATED
Authors: - Niels Van den Bossche - Pedro Manuel Vieira De Castro Ferreira Da Silva
References: - Eur. Phys. J. C 79 (2019) 123 - Expt page: CMS-TOP-17-015 - arXiv: 1807.02810
Beams: p+ p+
Beam energies: (6500.0, 6500.0)GeV
Run details: - ttbar inclusive or dilepton events at 13 TeV
Measurements of normalized differential cross sections as functions of the multiplicity and kinematic variables of charged-particle tracks from the underlying event in top quark and antiquark pair production are presented. The measurements are performed in proton-proton collisions at a center-of-mass energy of 13 TeV, and are based on data collected by the CMS experiment at the LHC in 2016 corresponding to an integrated luminosity of 35.9/fb. Events containing one electron, one muon, and two jets from the hadronization and fragmentation of b quarks are used. These measurements characterize, for the first time, properties of the underlying event in top quark pair production and show no deviation from the universality hypothesis at energy scales typically above twice the top quark mass.
Source
code:CMS_2018_I1681435.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/DressedLepton.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/PromptFinalState.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/LeptonFinder.hh"
#include "Rivet/Projections/ChargedLeptons.hh"
#include "Rivet/Projections/Sphericity.hh"
namespace Rivet {
/// @brief Study of the underlying event in top quark pair production in pp collisions at 13 TeV
class CMS_2018_I1681435 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2018_I1681435);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Complete final state
FinalState fs(Cuts::abseta < 5.0);
// Leptonfinder to identify dressed leptons:
Cut lepton_acc = Cuts::abseta < 2.5 && Cuts::pT > 20*GeV;
FinalState photons(fs, Cuts::abspid == PID::PHOTON);
ChargedLeptons charged_leptons(fs);
PromptFinalState prompt_leptons(charged_leptons);
prompt_leptons.acceptMuonDecays(true);
prompt_leptons.acceptTauDecays(true);
PromptFinalState prompt_photons(photons);
prompt_photons.acceptMuonDecays(true);
prompt_photons.acceptTauDecays(true);
LeptonFinder dressed_leptons(prompt_leptons, prompt_photons, 0.1,
lepton_acc, DressingType::AKT);
declare(dressed_leptons, "LeptonFinder");
// Jets
VetoedFinalState fsForJets(fs);
fsForJets.addVetoOnThisFinalState(dressed_leptons);
declare(FastJets(fsForJets, JetAlg::ANTIKT, 0.4, JetMuons::ALL, JetInvisibles::NONE), "Jets");
//charged particles
ChargedFinalState baseChfs(Cuts::abseta < 2.1 && Cuts::pT > 0.9*GeV);
VetoedFinalState chfs_veto(baseChfs);
// veto the dressed leptons from the charged-particle collection
chfs_veto.addVetoOnThisFinalState(dressed_leptons);
declare(chfs_veto, "charged");
//ue
book(_h["chmult"], 1, 1, 1);
book(_h["chflux"], 2, 1, 1);
book(_h["chavgpt"], 3, 1, 1);
book(_h["magpt"], 4, 1, 1);
book(_h["chfluxz"], 5, 1, 1);
book(_h["chavgpz"], 6, 1, 1);
book(_h["sphericity"], 7, 1, 1);
book(_h["aplanarity"], 8, 1, 1);
book(_h["C"], 9, 1, 1);
book(_h["D"], 10, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// Select the dilepton pair
const DressedLeptons dressedLeptons = apply<LeptonFinder>(event, "LeptonFinder").dressedLeptons();
if (dressedLeptons.size() < 2) vetoEvent;
int chId(abs(dressedLeptons[0].pid() * dressedLeptons[1].pid()));
int reqChId((PID::ELECTRON) * (PID::MUON));
if (chId != reqChId) vetoEvent;
if (dressedLeptons[0].pT() < 25*GeV) vetoEvent;
//dilepton kinematics
FourMomentum ll(dressedLeptons[0].mom() + dressedLeptons[1].mom());
if (ll.mass() < 12) vetoEvent;
// jet selection
const FastJets& jetpro = apply<FastJets>(event, "Jets");
Jets jets = jetpro.jetsByPt(Cuts::pT > 30.0*GeV && Cuts::abseta < 2.4);
idiscardIfAnyDeltaRLess(jets, dressedLeptons, 0.4);
Jets selJets,selBJets;
for (const Jet& j : jets) {
selJets.push_back(j);
// b-tags
bool isBJet(j.bTagged());
if (!isBJet) continue;
selBJets.push_back(j);
}
if (selBJets.size() < 2) vetoEvent;
// loop over selected charged particles
int nch(0);
double chflux(0.),chfluxz(0.);
const VetoedFinalState& charged = apply<VetoedFinalState>(event, "charged");
std::vector<FourMomentum> selCharged;
FourMomentum pTch;
for (const Particle& p : charged.particles()) {
// remove particles matching the b-jets
if (selBJets[0].containsParticle(p) || selBJets[1].containsParticle(p)) continue;
//add particle
nch++;
chflux += p.momentum().pT();
chfluxz += fabs(p.momentum().pz());
selCharged.push_back( p.momentum() );
// Only add the transverse momentum
pTch += p.momentum();
}
// fill UE histos
if(nch==0) vetoEvent;
double chavgpt(chflux/nch);
double chavgpz(chfluxz/nch);
double rparam_sphericity = 1.0;
Sphericity _spher(rparam_sphericity);
_spher.calc( selCharged );
double sphericity(_spher.sphericity());
if (isZero(sphericity)) sphericity = 0.;
double aplanarity(_spher.aplanarity());
double C(3*(_spher.lambda1()*_spher.lambda2()+_spher.lambda1()*_spher.lambda3()+_spher.lambda2()*_spher.lambda3()));
double D(27*_spher.lambda1()*_spher.lambda2()*_spher.lambda3());
_h["chmult"]->fill(nch);
_h["chflux"]->fill(chflux/GeV);
_h["chavgpt"]->fill(chavgpt/GeV);
_h["magpt"]->fill(pTch.pT()/GeV);
_h["chfluxz"]->fill(chfluxz/GeV);
_h["chavgpz"]->fill(chavgpz/GeV);
_h["sphericity"]->fill(sphericity);
_h["aplanarity"]->fill(aplanarity);
_h["C"]->fill(C);
_h["D"]->fill(D);
}
/// Normalise histograms etc., after the run
void finalize() {
// Normalize to 2 due to mistake in the original normalization
normalize(_h, 2.0);
}
/// @}
/// @name Histograms
/// @{
map<string, Histo1DPtr> _h;
/// @}
};
RIVET_DECLARE_PLUGIN(CMS_2018_I1681435);
}