Rivet analyses referenceCMS_2013_I1209721Azimuthal correlations and event shapes in $Z$ + jets in $pp$ collisions at 7 TeVExperiment: CMS (LHC) Inspire ID: 1209721 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
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}
|