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);

}