rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2017_I1610623

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: Beams: p+ p+
Beam energies: (6500.0, 6500.0) GeV
Run details:
  • 13 TeV $pp \to 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 ($H_T$), 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 $p_T > 25$ GeV and pseudorapidity $|\eta| < 2.4$, and by a transverse mass between the muon and the missing transverse energy $M_T > 50$ GeV. Jets are reconstructed using the anti-kT algorithm with a distance parameter R = 0.4, and only jets with $p_T > 30$ GeV, $|y| < 2.4$, and a separation of $\Delta 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 $p_T > 100$ GeV and the leading jet with $p_T > 300$ GeV.

Source code: CMS_2017_I1610623.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/VetoedFinalState.hh"
  6#include "Rivet/Projections/LeptonFinder.hh"
  7#include "Rivet/Projections/MissingMomentum.hh"
  8
  9namespace Rivet {
 10
 11
 12  /// Differential cross-sections for W boson and jets in proton-proton collisions at 13 TeV
 13  class CMS_2017_I1610623 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2017_I1610623);
 18
 19
 20    /// @name Analysis methods
 21    /// @{
 22
 23    /// Book histograms and initialise projections before the run
 24    void init() {
 25
 26      // Initialise and register projections
 27      LeptonFinder lf(0.1, Cuts::abseta < 2.4 && Cuts::abspid == PID::MUON);
 28      declare(lf, "Leptons");
 29      declare(MissingMom(), "MET");
 30
 31      // Define veto FS
 32      VetoedFinalState vfs;
 33      vfs.addVetoOnThisFinalState(lf);
 34      vfs.addVetoPairId(PID::MUON);
 35      vfs.vetoNeutrinos();
 36
 37      FastJets fastjets(vfs, JetAlg::ANTIKT, 0.4);
 38      declare(fastjets, "Jets");
 39
 40
 41      book(_hist_Mult_exc      ,"d01-x01-y01");
 42      book(_hist_inc_WJetMult  ,"d02-x01-y01");
 43
 44      book(_hist_JetPt1j ,"d03-x01-y01");
 45      book(_hist_JetPt2j ,"d04-x01-y01");
 46      book(_hist_JetPt3j ,"d05-x01-y01");
 47      book(_hist_JetPt4j ,"d06-x01-y01");
 48
 49      book(_hist_JetRap1j ,"d07-x01-y01");
 50      book(_hist_JetRap2j ,"d08-x01-y01");
 51      book(_hist_JetRap3j ,"d09-x01-y01");
 52      book(_hist_JetRap4j ,"d10-x01-y01");
 53
 54      book(_hist_Ht_1j ,"d11-x01-y01");
 55      book(_hist_Ht_2j ,"d12-x01-y01");
 56      book(_hist_Ht_3j ,"d13-x01-y01");
 57      book(_hist_Ht_4j ,"d14-x01-y01");
 58
 59      book(_hist_dphij1mu_1j , "d15-x01-y01");
 60      book(_hist_dphij2mu_2j , "d16-x01-y01");
 61      book(_hist_dphij3mu_3j , "d17-x01-y01");
 62      book(_hist_dphij4mu_4j , "d18-x01-y01");
 63
 64      book(_hist_dRmuj_1j , "d19-x01-y01");
 65
 66    }
 67
 68
 69    /// Used for filling inc Njets histo
 70    void _fill(Histo1DPtr& _histJetMult, vector<FourMomentum>& finaljet_list) {
 71      _histJetMult->fill(0);
 72      for (size_t i=0 ; i<finaljet_list.size() ; ++i) {
 73        if (i==6) break;
 74        _histJetMult->fill(i+1);  // inclusive multiplicity
 75      }
 76    }
 77
 78
 79    /// Perform the per-event analysis
 80    void analyze(const Event& event) {
 81
 82      // Identify the closest-matching mu+MET to m == mW
 83      const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
 84      const Particles& mus = apply<LeptonFinder>(event, "Leptons").particles();
 85      const Particles mus_mtfilt = select(mus, [&](const Particle& m){ return mT(m, pmiss) > 50*GeV; });
 86      const int imfound = closestMatchIndex(mus_mtfilt, pmiss, Kin::mass, 80.4*GeV);
 87
 88      // Make cuts on the identified mT and lepton
 89      if (imfound < 0) vetoEvent;
 90      const FourMomentum& lepton0 = mus_mtfilt[imfound].momentum();
 91      if (lepton0.abseta() > 2.4 || lepton0.pT() < 25.0*GeV) vetoEvent;
 92
 93      // Obtain the jets
 94      vector<FourMomentum> finaljet_list, jet100_list;
 95      double HT = 0.0;
 96      const Jets& js = apply<FastJets>(event, "Jets").jetsByPt(Cuts::pT > 30*GeV && Cuts::absrap < 2.4);
 97      for (const Jet& j : js) {
 98        const double jpt = j.momentum().pT();
 99        if (deltaR(lepton0, j.momentum()) > 0.4) {
100          if (jpt > 30.0*GeV) {
101            finaljet_list.push_back(j.momentum());
102            HT += j.momentum().pT();
103          }
104          if (jpt > 100.0*GeV) {
105            jet100_list.push_back(j.momentum());
106          }
107        }
108      }
109
110      // Multiplicity plots
111      _hist_Mult_exc->fill(finaljet_list.size());
112      _fill(_hist_inc_WJetMult, finaljet_list);
113
114      // dRmuj plot.
115      double mindR(99999);
116      if (jet100_list.size() >= 1) {
117        for (unsigned ji = 0; ji < jet100_list.size(); ji++){
118          double dr_(9999);
119          dr_ = fabs(deltaR(lepton0, jet100_list[ji]));
120          if (dr_ < mindR){
121            mindR = dr_;
122          }
123        }
124        if (jet100_list[0].pT() > 300.0*GeV) {
125          _hist_dRmuj_1j->fill(mindR);
126        }
127      }
128
129      if (finaljet_list.size()>=1) {
130        _hist_JetPt1j->fill(finaljet_list[0].pT());
131        _hist_JetRap1j->fill(fabs(finaljet_list[0].rap()));
132        _hist_Ht_1j->fill(HT);
133        _hist_dphij1mu_1j->fill(deltaPhi(finaljet_list[0].phi(), lepton0.phi()));
134      }
135
136      if (finaljet_list.size()>=2) {
137        _hist_JetPt2j->fill(finaljet_list[1].pT());
138        _hist_JetRap2j->fill(fabs(finaljet_list[1].rap()));
139        _hist_Ht_2j->fill(HT);
140        _hist_dphij2mu_2j->fill(deltaPhi(finaljet_list[1].phi(), lepton0.phi()));
141      }
142
143      if (finaljet_list.size()>=3) {
144        _hist_JetPt3j->fill(finaljet_list[2].pT());
145        _hist_JetRap3j->fill(fabs(finaljet_list[2].rap()));
146        _hist_Ht_3j->fill(HT);
147        _hist_dphij3mu_3j->fill(deltaPhi(finaljet_list[2].phi(), lepton0.phi()));
148      }
149
150      if (finaljet_list.size()>=4) {
151        _hist_JetPt4j->fill(finaljet_list[3].pT());
152        _hist_JetRap4j->fill(fabs(finaljet_list[3].rap()));
153        _hist_Ht_4j->fill(HT);
154        _hist_dphij4mu_4j->fill(deltaPhi(finaljet_list[3].phi(), lepton0.phi()));
155      }
156    }
157
158
159    /// Normalise histograms etc., after the run
160    void finalize() {
161      const double crossec = !std::isnan(crossSectionPerEvent()) ? crossSection() : 61526.7*picobarn;
162      if (std::isnan(crossSectionPerEvent())){
163        MSG_INFO("No valid cross-section given, using NNLO xsec calculated by FEWZ " << crossec/picobarn << " pb");
164      }
165
166      scale(_hist_Mult_exc, crossec/picobarn/sumOfWeights());
167      scale(_hist_inc_WJetMult, crossec/picobarn/sumOfWeights());
168
169      scale(_hist_JetPt1j, crossec/picobarn/sumOfWeights());
170      scale(_hist_JetPt2j, crossec/picobarn/sumOfWeights());
171      scale(_hist_JetPt3j, crossec/picobarn/sumOfWeights());
172      scale(_hist_JetPt4j, crossec/picobarn/sumOfWeights());
173
174      scale(_hist_JetRap1j, crossec/picobarn/sumOfWeights());
175      scale(_hist_JetRap2j, crossec/picobarn/sumOfWeights());
176      scale(_hist_JetRap3j, crossec/picobarn/sumOfWeights());
177      scale(_hist_JetRap4j, crossec/picobarn/sumOfWeights());
178
179      scale(_hist_Ht_1j, crossec/picobarn/sumOfWeights());
180      scale(_hist_Ht_2j, crossec/picobarn/sumOfWeights());
181      scale(_hist_Ht_3j, crossec/picobarn/sumOfWeights());
182      scale(_hist_Ht_4j, crossec/picobarn/sumOfWeights());
183
184      scale(_hist_dphij1mu_1j, crossec/picobarn/sumOfWeights());
185      scale(_hist_dphij2mu_2j, crossec/picobarn/sumOfWeights());
186      scale(_hist_dphij3mu_3j, crossec/picobarn/sumOfWeights());
187      scale(_hist_dphij4mu_4j, crossec/picobarn/sumOfWeights());
188
189      scale(_hist_dRmuj_1j, crossec/picobarn/sumOfWeights());
190    }
191
192    /// @}
193
194
195  private:
196
197    /// @name Histograms
198    /// @{
199    Histo1DPtr _hist_Mult_exc;
200    Histo1DPtr _hist_inc_WJetMult;
201
202    Histo1DPtr _hist_JetPt1j;
203    Histo1DPtr _hist_JetPt2j;
204    Histo1DPtr _hist_JetPt3j;
205    Histo1DPtr _hist_JetPt4j;
206
207    Histo1DPtr _hist_JetRap1j;
208    Histo1DPtr _hist_JetRap2j;
209    Histo1DPtr _hist_JetRap3j;
210    Histo1DPtr _hist_JetRap4j;
211
212    Histo1DPtr _hist_Ht_1j;
213    Histo1DPtr _hist_Ht_2j;
214    Histo1DPtr _hist_Ht_3j;
215    Histo1DPtr _hist_Ht_4j;
216
217    Histo1DPtr _hist_dphij1mu_1j;
218    Histo1DPtr _hist_dphij2mu_2j;
219    Histo1DPtr _hist_dphij3mu_3j;
220    Histo1DPtr _hist_dphij4mu_4j;
221
222    Histo1DPtr _hist_dRmuj_1j;
223    /// @}
224
225  };
226
227
228  RIVET_DECLARE_PLUGIN(CMS_2017_I1610623);
229
230}