rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2013_I1209721

Azimuthal correlations and event shapes in $Z$ + jets in $pp$ collisions at 7 TeV
Experiment: CMS (LHC)
Inspire ID: 1209721
Status: VALIDATED
Authors:
  • Io Odderskov
References:
  • http://cms.cern.ch/iCMS/analysisadmin/cadi?ancode=EWK-11-021
  • https://cds.cern.ch/record/1503578
  • http://inspirehep.net/record/1209721
  • arXiv: 1301.1646
  • Submitted to Phys. Lett. B
Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • Run MC generators with Z decaying to leptonic modes at 7TeV comEnergy

Measurements are presented of event shapes and azimuthal correlations in the inclusive production of a Z boson in association with jets in proton-proton collisions. The data correspond to an integrated luminosity of 5.0/fb, collected with the CMS detector at the CERN LHC at $\sqrt{s} = 7$ TeV. This to test perturbative QCD predictions and evaluate a substantial background to most physics channels. Studies performed as a function of jet multiplicity for inclusive $Z$ boson production and for $Z$ bosons with transverse-momenta greater than 150 GeV, are compared to predictions from Monte Carlo event generators that include leading-order multiparton matrix-element (with up to four hard partons in the final state) and next-to-leading-order simulations of Z + 1-jet events. The results are corrected for detector effects, and can therefore be used as input to improve models for describing these processes.

Source code: CMS_2013_I1209721.cc
  1#include "Rivet/Analysis.hh"
  2#include "Rivet/Projections/FinalState.hh"
  3#include "Rivet/Projections/FastJets.hh"
  4#include "Rivet/Projections/DileptonFinder.hh"
  5#include "Rivet/Projections/Thrust.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// CMS Z+jets delta(phi) and jet thrust measurement at 7 TeV
 11  class CMS_2013_I1209721 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2013_I1209721);
 16
 17
 18    /// Book projections and histograms
 19    void init() {
 20      // Full final state
 21      const FinalState fs(Cuts::abseta < 5.0);
 22      // Z finders for electrons and muons
 23      Cut cuts = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
 24      const DileptonFinder zfe(fs, 91.2*GeV, 0.1, cuts && Cuts::abspid == PID::ELECTRON, Cuts::massIn(71*GeV, 111*GeV));
 25      declare(zfe, "ZFE");
 26      const DileptonFinder zfm(fs, 91.2*GeV, 0.1, cuts && Cuts::abspid == PID::MUON, Cuts::massIn(71*GeV, 111*GeV));
 27      declare(zfm, "ZFM");
 28      // Jets
 29      const FastJets jets(fs, JetAlg::ANTIKT, 0.5);
 30      declare(jets, "JETS");
 31
 32      // Book histograms from data
 33      for (size_t i = 0; i < 2; ++i) {
 34        book(_histDeltaPhiZJ1_1[i]  ,1+i*9, 1, 1);
 35        book(_histDeltaPhiZJ1_2[i]  ,2+i*9, 1, 1);
 36        book(_histDeltaPhiZJ1_3[i]  ,4+i*9, 1, 1);
 37        book(_histDeltaPhiZJ2_3[i]  ,5+i*9, 1, 1);
 38        book(_histDeltaPhiZJ3_3[i]  ,3+i*9, 1, 1);
 39        book(_histDeltaPhiJ1J2_3[i] ,6+i*9, 1, 1);
 40        book(_histDeltaPhiJ1J3_3[i] ,7+i*9, 1, 1);
 41        book(_histDeltaPhiJ2J3_3[i] ,8+i*9, 1, 1);
 42        book(_histTransvThrust[i]   ,9+i*9, 1, 1);
 43      }
 44    }
 45
 46
 47    void analyze(const Event& event) {
 48
 49      // Apply the Z finders
 50      const DileptonFinder& zfe = apply<DileptonFinder>(event, "ZFE");
 51      const DileptonFinder& zfm = apply<DileptonFinder>(event, "ZFM");
 52
 53      // Choose the Z candidate (there must be one)
 54      if (zfe.empty() && zfm.empty()) vetoEvent;
 55      const Particles& z = !zfm.empty() ? zfm.bosons() : zfe.bosons();
 56      const Particles& leptons = !zfm.empty() ? zfm.constituents() : zfe.constituents();
 57
 58      // Determine whether we are in the boosted regime
 59      const bool is_boosted = (z[0].pT() > 150*GeV);
 60
 61      // Build the jets
 62      const FastJets& jetfs = apply<FastJets>(event, "JETS");
 63      const Jets& jets = jetfs.jetsByPt(Cuts::pT > 50*GeV && Cuts::abseta < 2.5);
 64
 65      // Clean the jets against the lepton candidates, as in the paper, with a deltaR cut of 0.4 against the clustered leptons
 66      vector<const Jet*> cleanedJets;
 67      for (size_t i = 0; i < jets.size(); ++i) {
 68        bool isolated = true;
 69        for (size_t j = 0; j < 2; ++j) {
 70          if (deltaR(leptons[j], jets[i]) < 0.4) {
 71            isolated = false;
 72            break;
 73          }
 74        }
 75        if (isolated) cleanedJets.push_back(&jets[i]);
 76      }
 77
 78      // Require at least 1 jet
 79      const unsigned int Njets = cleanedJets.size();
 80      if (Njets < 1) vetoEvent;
 81
 82      // Now compute the thrust
 83      // Collect Z and jets transverse momenta to calculate transverse thrust
 84      vector<Vector3> momenta;
 85      momenta.clear();
 86      Vector3 mom = z[0].p3();
 87      mom.setZ(0);
 88      momenta.push_back(mom);
 89
 90      for (size_t i = 0; i < cleanedJets.size(); ++i) {
 91        Vector3 mj = cleanedJets[i]->momentum().p3();
 92        mj.setZ(0);
 93        momenta.push_back(mj);
 94      }
 95
 96      if (momenta.size() <= 2){
 97        // We need to use a ghost so that Thrust.calc() doesn't return 1.
 98        momenta.push_back(Vector3(0.0000001,0.0000001,0.));
 99      }
100
101      Thrust thrust; thrust.calc(momenta);
102      const double T = thrust.thrust();
103      FILLx2(_histTransvThrust, is_boosted, log(max(1-T, 1e-6)));
104
105      const double dphiZJ1 = deltaPhi(z[0], *cleanedJets[0]);
106      FILLx2(_histDeltaPhiZJ1_1, is_boosted, dphiZJ1);
107      if (Njets > 1) {
108        FILLx2(_histDeltaPhiZJ1_2, is_boosted, dphiZJ1);
109        if (Njets > 2) {
110          FILLx2(_histDeltaPhiZJ1_3,  is_boosted, dphiZJ1);
111          FILLx2(_histDeltaPhiZJ2_3,  is_boosted, deltaPhi(z[0], *cleanedJets[1]));
112          FILLx2(_histDeltaPhiZJ3_3,  is_boosted, deltaPhi(z[0], *cleanedJets[2]));
113          FILLx2(_histDeltaPhiJ1J2_3, is_boosted, deltaPhi(*cleanedJets[0], *cleanedJets[1]));
114          FILLx2(_histDeltaPhiJ1J3_3, is_boosted, deltaPhi(*cleanedJets[0], *cleanedJets[2]));
115          FILLx2(_histDeltaPhiJ2J3_3, is_boosted, deltaPhi(*cleanedJets[1], *cleanedJets[2]));
116        }
117      }
118    }
119
120
121    /// Normalizations
122    /// @note Most of these data normalizations neglect the overflow bins
123    void finalize() {
124      for (size_t i = 0; i < 2; ++i) {
125        normalize(_histDeltaPhiZJ1_1[i], 1, false);
126        normalize(_histDeltaPhiZJ1_2[i], 1, false);
127        normalize(_histDeltaPhiZJ1_3[i], 1, false);
128        normalize(_histDeltaPhiZJ2_3[i], 1, false);
129        normalize(_histDeltaPhiZJ3_3[i], 1, false);
130        normalize(_histDeltaPhiJ1J2_3[i], 1, false);
131        normalize(_histDeltaPhiJ1J3_3[i], 1, false);
132        normalize(_histDeltaPhiJ2J3_3[i], 1, false);
133        normalize(_histTransvThrust[i]);
134      }
135    }
136
137
138  private:
139
140
141    // Define a helper to appropriately fill both unboosted and boosted histo versions
142    void FILLx2(Histo1DPtr* HNAME, bool is_boosted, double VAL) {
143      double x = VAL;
144      for (size_t i = 0; i < 2; ++i) {
145        if (i == 0 || is_boosted)
146          HNAME[i]->fill(x);
147      }
148    }
149
150
151
152    // Arrays of unboosted/boosted histos
153    Histo1DPtr _histDeltaPhiZJ1_1[2];
154    Histo1DPtr _histDeltaPhiZJ1_2[2];
155    Histo1DPtr _histDeltaPhiZJ1_3[2];
156    Histo1DPtr _histDeltaPhiZJ2_3[2];
157    Histo1DPtr _histDeltaPhiZJ3_3[2];
158    Histo1DPtr _histDeltaPhiJ1J2_3[2];
159    Histo1DPtr _histDeltaPhiJ1J3_3[2];
160    Histo1DPtr _histDeltaPhiJ2J3_3[2];
161    Histo1DPtr _histTransvThrust[2];
162
163  };
164
165
166  RIVET_DECLARE_PLUGIN(CMS_2013_I1209721);
167
168}