Rivet analyses


title: CMS_2021_I1866118

Study of Z boson plus jets events using variables sensitive to double-parton scattering in pp collisions at 13 TeV

Experiment: CMS (LHC)

Inspire ID: 1866118

Status: VALIDATED

Authors: - cms-pag-conveners-smp@cern.ch - Rajat Gupta - Meena - Sunil Bansal - J.B. Singh

References: - Expt page: CMS-SMP-20-009 - arXiv: 2105.14511 - JHEP 10 (2021) 176

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - Drell-Yan events with $Z/\gamma^* \to \mu\mu$.

Double parton scattering is investigated using events with a Z boson and jets. The measurements are performed with proton-proton collision data recorded by the CMS experiment at the LHC at $\sqrt{s} = 13$ TeV, corresponding to an integrated luminosity of $35.8~\mathrm{fb}^{-1}$ collected in the year 2016. Differential cross sections of Z$+ \geq$ 1 jet and Z$+ \geq$ 2 jets are measured with transverse momentum of the jets above 20 GeV and pseudorapidity $|\eta| <$ 2.4. Several distributions with sensitivity to double parton scattering effects are measured as functions of the angle and the transverse momentum imbalance between the Z boson and the jets. The measured distributions are compared with predictions from several event generators with different hadronization models and different parameter settings for multiparton interactions. The measured distributions show a dependence on the hadronization and multiparton interaction simulation parameters, and are important input for future improvements of the simulations.

Source code:CMS_2021_I1866118.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/ChargedFinalState.hh"

include "Rivet/Projections/DileptonFinder.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

/// Z boson + jets sensitive to double-parton scattering at 13 TeV class CMS_2021_I1866118 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2021_I1866118);


/// Initialization
void init() {

  Cut cut = Cuts::abseta < 2.4 && Cuts::pT > 27 * GeV;
  DileptonFinder zmumufinder(91.2 * GeV, 0.1, cut && Cuts::abspid == PID::MUON,
                             Cuts::massIn(70 * GeV, 110 * GeV));
  declare(zmumufinder, "zmumufinder");

  // Define veto FS in order to prevent Z-decay products entering the jet algorithm

  VetoedFinalState had_fs;
  had_fs.addVetoOnThisFinalState(zmumufinder);
  FastJets jets(had_fs, JetAlg::ANTIKT, 0.4);
  jets.useInvisibles();
  declare(jets, "jets");

  book(h_dphi_Z1J_cn, 1, 1, 1);
  book(h_reldpt_Z1J_cn, 2, 1, 1);
  book(h_dphi_Zdijet_Z2J_cn, 3, 1, 1);
  book(h_reldpt_Zdijet_Z2J_cn, 4, 1, 1);
  book(h_reldpt_j1j2_Z2J_cn, 5, 1, 1);

  book(_h["dphi_Z1J"], 6, 1, 1);
  book(_h["reldpt_Z1J"], 7, 1, 1);
  book(_h["dphi_Zdijet_Z2J"], 8, 1, 1);
  book(_h["reldpt_Zdijet_Z2J"], 9, 1, 1);
  book(_h["reldpt_j1j2_Z2J"], 10, 1, 1);
}


/// Perform the per-event analysis
void analyze(const Event& event) {
  const DileptonFinder& zmumufinder = apply<DileptonFinder>(event, "zmumufinder");
  const Particles& zmumus = zmumufinder.bosons();
  if (zmumus.size() != 1) {
    vetoEvent;
  }

  // Find the (dressed!) leptons
  const Particles& leptons = zmumufinder.constituents();
  if (leptons.size() != 2) vetoEvent;

  Jets jets = apply<FastJets>(event, "jets").jetsByPt(Cuts::pT > 20 * GeV && Cuts::abseta < 2.4);
  idiscardIfAnyDeltaRLess(jets, leptons, 0.4);

  const size_t Njets = jets.size();

  if (Njets < 1) vetoEvent;

  if (Njets >= 1) {
    h_dphi_Z1J_cn->fill(deltaPhi(zmumus[0], jets[0]));
    h_reldpt_Z1J_cn->fill((zmumus[0] + jets[0].momentum()).pt() / (zmumus[0].pt() + jets[0].pt()));

    _h["dphi_Z1J"]->fill(deltaPhi(zmumus[0], jets[0]));
    _h["reldpt_Z1J"]->fill((zmumus[0] + jets[0].momentum()).pt() / (zmumus[0].pt() + jets[0].pt()));
  }

  if (Njets >= 2) {
    FourMomentum dij = jets[0].momentum() + jets[1].momentum();

    h_dphi_Zdijet_Z2J_cn->fill(deltaPhi(zmumus[0], dij));
    h_reldpt_Zdijet_Z2J_cn->fill((zmumus[0] + dij).pt() / (zmumus[0].pt() + dij.pt()));
    h_reldpt_j1j2_Z2J_cn->fill(dij.pt() / (jets[0].pt() + jets[1].pt()));

    _h["dphi_Zdijet_Z2J"]->fill(deltaPhi(zmumus[0], dij));
    _h["reldpt_Zdijet_Z2J"]->fill((zmumus[0] + dij).pt() / (zmumus[0].pt() + dij.pt()));
    _h["reldpt_j1j2_Z2J"]->fill(dij.pt() / (jets[0].pt() + jets[1].pt()));
  }
}


/// Normalise histograms etc., after the run
void finalize() {
  double norm = (sumOfWeights() != 0) ? crossSection() / picobarn / sumOfWeights() : 1.0;

  scale(h_dphi_Z1J_cn, norm);
  scale(h_reldpt_Z1J_cn, norm);
  scale(h_dphi_Zdijet_Z2J_cn, norm);
  scale(h_reldpt_Zdijet_Z2J_cn, norm);
  scale(h_reldpt_j1j2_Z2J_cn, norm);

  for (auto& item : _h) {
    double rho = item.second->densitySum(false);
    if (rho) scale(item.second, 1.0 / rho);
  }
}

private:

/// @name Histogram objects
/// @{
Histo1DPtr h_dphi_Z1J_cn;
Histo1DPtr h_reldpt_Z1J_cn;
Histo1DPtr h_dphi_Zdijet_Z2J_cn;
Histo1DPtr h_reldpt_Zdijet_Z2J_cn;
Histo1DPtr h_reldpt_j1j2_Z2J_cn;
map<string, Histo1DPtr> _h;
/// @}

};

RIVET_DECLARE_PLUGIN(CMS_2021_I1866118);

} ```