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/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}
|