Rivet analyses

Differential cross-sections for W boson and jets in proton-proton collisions at 13 TeV

Experiment: CMS (LHC)

Inspire ID: 1610623

Status: VALIDATED

Authors: - Emanuela Barberis - Apichart Hortiangtham - Kadir Ocalan

References: - DOI:10.1103/PhysRevD.96.072005 - arXiv: 1707.05979 - Expt page: CMS-SMP-16-005

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - 13 TeV pp → W + jets.

Differential cross sections for a W boson produced in association with jets are measured in a data sample of proton-proton collisions at a center-of-mass energy of 13 TeV recorded with the CMS detector and corresponding to an integrated luminosity of 2.2 inverse femtobarns. The W bosons are identified through their decay into a muon and a neutrino. The cross sections are reported as functions of jet multiplicity, jet transverse momenta, jet rapidity |y|, the scalar sum of jet transverse momenta (HT), and angular correlations between the muon and each jet for different jet multiplicities. The cross sections are measured in the fiducial region defined by a muon with pT > 25 GeV and pseudorapidity |η| < 2.4, and by a transverse mass between the muon and the missing transverse energy MT > 50 GeV. Jets are reconstructed using the anti-kT algorithm with a distance parameter R = 0.4, and only jets with pT > 30 GeV, |y| < 2.4, and a separation of ΔR > 0.4 from the muon are considered. In addition, the differential cross section is measured as a function of the angular distance (DeltaR) between the muon and the closest jet for events with one or more jets, requiring jets with pT > 100 GeV and the leading jet with pT > 300 GeV.

Source code:CMS_2017_I1610623.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/Projections/LeptonFinder.hh"
#include "Rivet/Projections/MissingMomentum.hh"

namespace Rivet {


  /// Differential cross-sections for W boson and jets in proton-proton collisions at 13 TeV
  class CMS_2017_I1610623 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2017_I1610623);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {

      // Initialise and register projections
      LeptonFinder lf(0.1, Cuts::abseta < 2.4 && Cuts::abspid == PID::MUON);
      declare(lf, "Leptons");
      declare(MissingMom(), "MET");

      // Define veto FS
      VetoedFinalState vfs;
      vfs.addVetoOnThisFinalState(lf);
      vfs.addVetoPairId(PID::MUON);
      vfs.vetoNeutrinos();

      FastJets fastjets(vfs, JetAlg::ANTIKT, 0.4);
      declare(fastjets, "Jets");


      book(_hist_Mult_exc      ,"d01-x01-y01");
      book(_hist_inc_WJetMult  ,"d02-x01-y01");

      book(_hist_JetPt1j ,"d03-x01-y01");
      book(_hist_JetPt2j ,"d04-x01-y01");
      book(_hist_JetPt3j ,"d05-x01-y01");
      book(_hist_JetPt4j ,"d06-x01-y01");

      book(_hist_JetRap1j ,"d07-x01-y01");
      book(_hist_JetRap2j ,"d08-x01-y01");
      book(_hist_JetRap3j ,"d09-x01-y01");
      book(_hist_JetRap4j ,"d10-x01-y01");

      book(_hist_Ht_1j ,"d11-x01-y01");
      book(_hist_Ht_2j ,"d12-x01-y01");
      book(_hist_Ht_3j ,"d13-x01-y01");
      book(_hist_Ht_4j ,"d14-x01-y01");

      book(_hist_dphij1mu_1j , "d15-x01-y01");
      book(_hist_dphij2mu_2j , "d16-x01-y01");
      book(_hist_dphij3mu_3j , "d17-x01-y01");
      book(_hist_dphij4mu_4j , "d18-x01-y01");

      book(_hist_dRmuj_1j , "d19-x01-y01");

    }


    /// Used for filling inc Njets histo
    void _fill(Histo1DPtr& _histJetMult, vector<FourMomentum>& finaljet_list) {
      _histJetMult->fill(0);
      for (size_t i=0 ; i<finaljet_list.size() ; ++i) {
        if (i==6) break;
        _histJetMult->fill(i+1);  // inclusive multiplicity
      }
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {

      // Identify the closest-matching mu+MET to m == mW
      const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
      const Particles& mus = apply<LeptonFinder>(event, "Leptons").particles();
      const Particles mus_mtfilt = select(mus, [&](const Particle& m){ return mT(m, pmiss) > 50*GeV; });
      const int imfound = closestMatchIndex(mus_mtfilt, pmiss, Kin::mass, 80.4*GeV);

      // Make cuts on the identified mT and lepton
      if (imfound < 0) vetoEvent;
      const FourMomentum& lepton0 = mus_mtfilt[imfound].momentum();
      if (lepton0.abseta() > 2.4 || lepton0.pT() < 25.0*GeV) vetoEvent;

      // Obtain the jets
      vector<FourMomentum> finaljet_list, jet100_list;
      double HT = 0.0;
      const Jets& js = apply<FastJets>(event, "Jets").jetsByPt(Cuts::pT > 30*GeV && Cuts::absrap < 2.4);
      for (const Jet& j : js) {
        const double jpt = j.momentum().pT();
        if (deltaR(lepton0, j.momentum()) > 0.4) {
          if (jpt > 30.0*GeV) {
            finaljet_list.push_back(j.momentum());
            HT += j.momentum().pT();
          }
          if (jpt > 100.0*GeV) {
            jet100_list.push_back(j.momentum());
          }
        }
      }

      // Multiplicity plots
      _hist_Mult_exc->fill(finaljet_list.size());
      _fill(_hist_inc_WJetMult, finaljet_list);

      // dRmuj plot.
      double mindR(99999);
      if (jet100_list.size() >= 1) {
        for (unsigned ji = 0; ji < jet100_list.size(); ji++){
          double dr_(9999);
          dr_ = fabs(deltaR(lepton0, jet100_list[ji]));
          if (dr_ < mindR){
            mindR = dr_;
          }
        }
        if (jet100_list[0].pT() > 300.0*GeV) {
          _hist_dRmuj_1j->fill(mindR);
        }
      }

      if (finaljet_list.size()>=1) {
        _hist_JetPt1j->fill(finaljet_list[0].pT());
        _hist_JetRap1j->fill(fabs(finaljet_list[0].rap()));
        _hist_Ht_1j->fill(HT);
        _hist_dphij1mu_1j->fill(deltaPhi(finaljet_list[0].phi(), lepton0.phi()));
      }

      if (finaljet_list.size()>=2) {
        _hist_JetPt2j->fill(finaljet_list[1].pT());
        _hist_JetRap2j->fill(fabs(finaljet_list[1].rap()));
        _hist_Ht_2j->fill(HT);
        _hist_dphij2mu_2j->fill(deltaPhi(finaljet_list[1].phi(), lepton0.phi()));
      }

      if (finaljet_list.size()>=3) {
        _hist_JetPt3j->fill(finaljet_list[2].pT());
        _hist_JetRap3j->fill(fabs(finaljet_list[2].rap()));
        _hist_Ht_3j->fill(HT);
        _hist_dphij3mu_3j->fill(deltaPhi(finaljet_list[2].phi(), lepton0.phi()));
      }

      if (finaljet_list.size()>=4) {
        _hist_JetPt4j->fill(finaljet_list[3].pT());
        _hist_JetRap4j->fill(fabs(finaljet_list[3].rap()));
        _hist_Ht_4j->fill(HT);
        _hist_dphij4mu_4j->fill(deltaPhi(finaljet_list[3].phi(), lepton0.phi()));
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      const double crossec = !std::isnan(crossSectionPerEvent()) ? crossSection() : 61526.7*picobarn;
      if (std::isnan(crossSectionPerEvent())){
        MSG_INFO("No valid cross-section given, using NNLO xsec calculated by FEWZ " << crossec/picobarn << " pb");
      }

      scale(_hist_Mult_exc, crossec/picobarn/sumOfWeights());
      scale(_hist_inc_WJetMult, crossec/picobarn/sumOfWeights());

      scale(_hist_JetPt1j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetPt2j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetPt3j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetPt4j, crossec/picobarn/sumOfWeights());

      scale(_hist_JetRap1j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetRap2j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetRap3j, crossec/picobarn/sumOfWeights());
      scale(_hist_JetRap4j, crossec/picobarn/sumOfWeights());

      scale(_hist_Ht_1j, crossec/picobarn/sumOfWeights());
      scale(_hist_Ht_2j, crossec/picobarn/sumOfWeights());
      scale(_hist_Ht_3j, crossec/picobarn/sumOfWeights());
      scale(_hist_Ht_4j, crossec/picobarn/sumOfWeights());

      scale(_hist_dphij1mu_1j, crossec/picobarn/sumOfWeights());
      scale(_hist_dphij2mu_2j, crossec/picobarn/sumOfWeights());
      scale(_hist_dphij3mu_3j, crossec/picobarn/sumOfWeights());
      scale(_hist_dphij4mu_4j, crossec/picobarn/sumOfWeights());

      scale(_hist_dRmuj_1j, crossec/picobarn/sumOfWeights());
    }

    /// @}


  private:

    /// @name Histograms
    /// @{
    Histo1DPtr _hist_Mult_exc;
    Histo1DPtr _hist_inc_WJetMult;

    Histo1DPtr _hist_JetPt1j;
    Histo1DPtr _hist_JetPt2j;
    Histo1DPtr _hist_JetPt3j;
    Histo1DPtr _hist_JetPt4j;

    Histo1DPtr _hist_JetRap1j;
    Histo1DPtr _hist_JetRap2j;
    Histo1DPtr _hist_JetRap3j;
    Histo1DPtr _hist_JetRap4j;

    Histo1DPtr _hist_Ht_1j;
    Histo1DPtr _hist_Ht_2j;
    Histo1DPtr _hist_Ht_3j;
    Histo1DPtr _hist_Ht_4j;

    Histo1DPtr _hist_dphij1mu_1j;
    Histo1DPtr _hist_dphij2mu_2j;
    Histo1DPtr _hist_dphij3mu_3j;
    Histo1DPtr _hist_dphij4mu_4j;

    Histo1DPtr _hist_dRmuj_1j;
    /// @}

  };


  RIVET_DECLARE_PLUGIN(CMS_2017_I1610623);

}