Rivet analyses

Measurement of the underlying event using inclusive Z-boson production in proton-proton collisions at $\sqrt{s} = 13$ TeV

Experiment: CMS (LHC)

Inspire ID: 1635889

Status: VALIDATED

Authors: - Rajat Gupta - Ramandeep Kumar - Ankita Mehta - Sunil Bansal - J.B. Singh

References: - CMS FSQ-16-008 - arXiv: 1711.04299

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - Drell-Yan events with Z/γ* → μμ.

Measurement of the underlying event activity, in proton-proton collisions at a centre-of-mass energy of 13 TeV, performedusinginclusiveZ − bosoneventscollectedbytheCMSexperimentattheLargeHadronCollider.Theanalyzeddatacorrespondstoanintegratedluminosityof2.1fb{}^{-1}.TheunderlyingeventactivityisquantifiedintermsofchargedparticlemultiplicityandtheirscalarsumoftheirtransversemomentumindifferenttopologicalregionsdefinedwithrespecttotheresultatntazimuthaldirectionofthetwomuonscomingfromthedecayofaZ − boson.Thedistributionsareunfoldedtostablecharged − particlelevelandarecomparedwithpredictionsfromvarioussimulations, aswellaswiththemeasurementsatacentre − of − massenergyof1.96TeV and 7 TeV by the CDF and CMS experiments.

Source code:CMS_2017_I1635889.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/DileptonFinder.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {


  /// Underlying event activity in the Drell-Yan process at 13 TeV
  class CMS_2017_I1635889 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2017_I1635889);


    /// Initialization
    void init() {

      /// @note Using a bare muon Z (but with a clustering radius!?)
      Cut cut = Cuts::abseta < 2.4 && Cuts::pT > 10 * GeV;
      DileptonFinder zfinder(91.2 * GeV, 0.2, cut && Cuts::abspid == PID::MUON,
                             Cuts::massIn(81 * GeV, 101 * GeV));
      declare(zfinder, "DileptonFinder");

      ChargedFinalState cfs(zfinder.remainingFinalState());
      declare(cfs, "cfs");

      book(_h_Nchg_towards_pTmumu, 1, 1, 1);
      book(_h_Nchg_transverse_pTmumu, 2, 1, 1);
      book(_h_Nchg_away_pTmumu, 3, 1, 1);
      book(_h_pTsum_towards_pTmumu, 4, 1, 1);
      book(_h_pTsum_transverse_pTmumu, 5, 1, 1);
      book(_h_pTsum_away_pTmumu, 6, 1, 1);
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const DileptonFinder& zfinder = apply<DileptonFinder>(event, "DileptonFinder");

      if (zfinder.bosons().size() != 1) vetoEvent;
      if (zfinder.constituents()[0].pT() < 20 && zfinder.constituents()[1].pT() < 20) vetoEvent;
      //std::cout<<"pt[0] = "<<zfinder.constituents()[0].pT()<<"pt[1] = "<<zfinder.constituents()[1].pT()<<std::endl;
      double Zpt = zfinder.bosons()[0].pT() / GeV;
      double Zphi = zfinder.bosons()[0].phi();
      //double Zmass = zfinder.bosons()[0].mass()/GeV;

      Particles particles = apply<ChargedFinalState>(event, "cfs")
                                .particlesByPt(Cuts::pT > 0.5 * GeV && Cuts::abseta < 2.0);

      int nTowards = 0;
      int nTransverse = 0;
      int nAway = 0;
      double ptSumTowards = 0;
      double ptSumTransverse = 0;
      double ptSumAway = 0;

      for (const Particle& p : particles) {
        double dphi = fabs(deltaPhi(Zphi, p.phi()));
        double pT = p.pT();

        if (dphi < M_PI / 3) {
          nTowards++;
          ptSumTowards += pT;
        }
        else if (dphi < 2. * M_PI / 3) {
          nTransverse++;
          ptSumTransverse += pT;
        }
        else {
          nAway++;
          ptSumAway += pT;
        }

      } // Loop over particles


      const double area = 8. / 3. * M_PI;
      _h_Nchg_towards_pTmumu->fill(Zpt, 1. / area * nTowards);
      _h_Nchg_transverse_pTmumu->fill(Zpt, 1. / area * nTransverse);
      _h_Nchg_away_pTmumu->fill(Zpt, 1. / area * nAway);
      _h_pTsum_towards_pTmumu->fill(Zpt, 1. / area * ptSumTowards);
      _h_pTsum_transverse_pTmumu->fill(Zpt, 1. / area * ptSumTransverse);
      _h_pTsum_away_pTmumu->fill(Zpt, 1. / area * ptSumAway);
    }


    /// Normalise histograms etc., after the run
    void finalize() { }


  private:


    /// @name Histogram objects
    /// @{
    Profile1DPtr _h_Nchg_towards_pTmumu;
    Profile1DPtr _h_Nchg_transverse_pTmumu;
    Profile1DPtr _h_Nchg_away_pTmumu;
    Profile1DPtr _h_pTsum_towards_pTmumu;
    Profile1DPtr _h_pTsum_transverse_pTmumu;
    Profile1DPtr _h_pTsum_away_pTmumu;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(CMS_2017_I1635889);

}