rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2013_I1258128

Rapidity distributions in exclusive $Z$ + jet and $\gamma$ + jet events in $pp$ collisions at $\sqrt{s} = 7$ TeV
Experiment: CMS (LHC)
Inspire ID: 1258128
Status: VALIDATED
Authors:
  • Steve Linn
  • Shin-Shan Eiko Yu
  • Anil Sing Pratap
  • Lovedeep Kaur Saini
  • Kittikul Kovitanggoon
  • Luis Lebolo
  • Vanessa Gaultney Werner
  • Yun-Ju Lu
  • Syue-Wei Li
  • Yu-Hsiang Chang
  • Sung-Won Lee
  • Pete E.C. Markowitz
  • Darko Mekterovic
  • Jorge Rodriguez
  • Bhawan Uppal
References:
  • arXiv: 1310.3082
  • https://twiki.cern.ch/twiki/bin/view/CMSPublic/PhysicsResultsSMP12004
  • Submitted to Phys. Rev. Lett
Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • Run MC generators with $Z$ decaying to leptonic modes + jets and photon + jets at 7 TeV centre-of-mass energy.

Rapidity distributions are presented for events containing either a $Z$ boson or a photon in association with a single jet in proton-proton collisions produced at the CERN LHC. The data, collected with the CMS detector at $\sqrt{s} = 7$ TeV, correspond to an integrated luminosity of 5.0/fb. The individual rapidity distributions of the boson and the jet are consistent within 5\% with expectations from perturbative QCD. However, QCD predictions for the sum and the difference in rapidities of the two final-state objects show significant discrepancies with CMS data. In particular, next-to-leading-order QCD calculations, and two Monte Carlo event generators using different methods to merge matrix-element partons with evolved parton showers, appear inconsistent with the data as well as with each other.

Source code: CMS_2013_I1258128.cc
  1#include "Rivet/Analysis.hh"
  2#include "Rivet/Projections/FinalState.hh"
  3#include "Rivet/Projections/FastJets.hh"
  4#include "Rivet/Projections/ZFinder.hh"
  5#include "Rivet/Projections/Thrust.hh"
  6#include "Rivet/Projections/LeadingParticlesFinalState.hh"
  7
  8namespace Rivet {
  9
 10
 11  /// CMS Z rapidity measurement
 12  class CMS_2013_I1258128 : public Analysis {
 13  public:
 14
 15    // Constructor
 16    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2013_I1258128);
 17
 18
 19    void init() {
 20      // Full final state
 21      const FinalState fs(Cuts::abseta < 5);
 22      declare(fs, "FS");
 23
 24      // Z finders for electrons and muons
 25      Cut cuts = Cuts::abseta < 2.1 && Cuts::pT > 20*GeV;
 26      const ZFinder zfe(fs, cuts, PID::ELECTRON, 76*GeV, 106*GeV);
 27      const ZFinder zfm(fs, cuts, PID::MUON, 76*GeV, 106*GeV);
 28      declare(zfe, "ZFE");
 29      declare(zfm, "ZFM");
 30
 31      // Try to get the leading photon
 32      LeadingParticlesFinalState photonfs(FinalState((Cuts::etaIn(-2.5, 2.5) && Cuts::pT >=  40.0*GeV)));
 33      photonfs.addParticleId(PID::PHOTON);
 34      declare(photonfs, "LeadingPhoton");
 35
 36      // Jets
 37      const FastJets jets(fs, FastJets::ANTIKT, 0.5);
 38      declare(jets, "JETS");
 39
 40      // Histograms
 41      book(_hist1YZ      ,1, 1, 1);
 42      book(_hist1YJet    ,2, 1, 1);
 43      book(_hist1YSum    ,3, 1, 1);
 44book(	  _hist1YDif	,4, 1, 1);
 45book(	  _hist2YPhoton ,5, 1, 1);
 46book(	  _hist2YJet	,6, 1, 1);
 47book(	  _hist2YSum	,7, 1, 1);
 48book(	  _hist2YDif	,8, 1, 1);
 49    }
 50
 51
 52    void makeZCut(const Event& event) {
 53      // Apply the Z finders and veto if no Z found
 54      const ZFinder& zfe = apply<ZFinder>(event, "ZFE");
 55      const ZFinder& zfm = apply<ZFinder>(event, "ZFM");
 56      if (zfe.empty() && zfm.empty()) vetoEvent;
 57
 58      // Choose the Z candidate
 59      const Particles& z = (!zfm.empty()) ? zfm.bosons() : zfe.bosons();
 60      const Particles& clusteredConstituents = (!zfm.empty()) ? zfm.constituents() : zfe.constituents();
 61
 62      // Insist that the Z is in a high-pT (boosted) regime
 63      if (z[0].pT() < 40*GeV) return;
 64
 65      // Build the jets
 66      const FastJets& jetfs = apply<FastJets>(event, "JETS");
 67      Jets jets = jetfs.jetsByPt(Cuts::pT > 30*GeV && Cuts::abseta < 2.4);
 68      if (jets.empty()) return;
 69
 70      // Clean the jets against the lepton candidates with a DeltaR cut of 0.5
 71      vector<const Jet*> cleanedJets;
 72      for (const Jet& j : jets) {
 73        bool isolated = true;
 74        for (const Particle& p : clusteredConstituents) {
 75          if (deltaR(p, j) < 0.5) {
 76            isolated = false;
 77            break;
 78          }
 79        }
 80        if (isolated) cleanedJets.push_back(&j);
 81      }
 82      // Require exactly 1 isolated jet
 83      if (cleanedJets.size() != 1) return;
 84
 85      // Fill histos
 86      const double weight = 1.0;
 87      const double yz = z[0].rapidity();
 88      const double yjet = cleanedJets[0]->momentum().rapidity();
 89      _hist1YZ->fill(fabs(yz), weight);
 90      _hist1YJet->fill(fabs(yjet), weight);
 91      _hist1YSum->fill(0.5*fabs(yz + yjet), weight);
 92      _hist1YDif->fill(0.5*fabs(yz - yjet), weight);
 93    }
 94
 95
 96    void makePhotonCut(const Event& event) {
 97        // Get the photon
 98        const FinalState& photonfs = apply<FinalState>(event, "LeadingPhoton");
 99        if (photonfs.particles().size() < 1) return;
100        const Particle& photon = photonfs.particles().front();
101        if (photon.pT() < 40*GeV) return;
102        if (fabs(photon.eta()) > 1.4442 ) return;
103
104      // Build the jets
105      const FastJets& jetfs = apply<FastJets>(event, "JETS");
106      Jets jets = jetfs.jetsByPt(Cuts::pT > 30*GeV && Cuts::abseta < 2.4);
107      if (jets.empty()) return;
108
109      // Clean the jets against the photon candidate with a DeltaR cut of 0.5
110      vector<const Jet*> cleanedJets;
111      for (const Jet& j : jets)
112        if (deltaR(photon, j) > 0.5)
113          cleanedJets.push_back(&j);
114      // Require exactly 1 jet
115      if (cleanedJets.size() != 1) return;
116
117      // Fill histos
118      const double weight = 1.0;
119      const double ypho = photon.rapidity();
120      const double yjet = cleanedJets[0]->momentum().rapidity();
121      _hist2YPhoton->fill(fabs(ypho), weight);
122      _hist2YJet->fill(fabs(yjet), weight);
123      _hist2YSum->fill(0.5*fabs(ypho + yjet), weight);
124      _hist2YDif->fill(0.5*fabs(ypho - yjet), weight);
125    }
126
127
128    void analyze(const Event& event) {
129      makeZCut(event);
130      makePhotonCut(event);
131    }
132
133
134    void finalize() {
135      normalizeByContents(_hist1YZ);
136      normalizeByContents(_hist1YJet);
137      normalizeByContents(_hist1YSum);
138      normalizeByContents(_hist1YDif);
139      normalizeByContents(_hist2YPhoton);
140      normalizeByContents(_hist2YJet);
141      normalizeByContents(_hist2YSum);
142      normalizeByContents(_hist2YDif);
143    }
144
145
146    // The CMS normalization in this analysis is that the sum over bin contents
147    // is equal to 1. This function normalizes to area = area*bin_width.  /
148    // @note This is a strange definition... why?
149    void normalizeByContents(Histo1DPtr h) {
150      normalize(h, h->bin(0).xWidth());
151    }
152
153
154  private:
155
156    Histo1DPtr _hist1YZ, _hist1YJet, _hist1YSum, _hist1YDif;
157    Histo1DPtr _hist2YPhoton, _hist2YJet, _hist2YSum, _hist2YDif;
158
159  };
160
161
162  // Plugin system hook
163  RIVET_DECLARE_PLUGIN(CMS_2013_I1258128);
164
165}