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