Rivet analyses referenceCMS_2013_I1256943Cross-section and angular correlations in $Z$ boson with $b$-hadrons events at $\sqrt{s} = 7$ TeVExperiment: CMS (LHC) Inspire ID: 1256943 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
A study of proton-proton collisions in which two $b$-hadrons are produced in association with a $Z$ boson is reported. The collisions were recorded at a centre-of-mass energy of 7 TeV with the CMS detector at the LHC, for an integrated luminosity of 5.2/fb. The $b$-hadrons are identified by means of displaced secondary vertices, without the use of reconstructed jets, permitting the study of $b$-hadron pair production at small angular separation. Differential cross sections are presented as a function of the angular separation of the $b$-hadrons and the $Z$ boson. In addition, inclusive measurements are presented. For both the inclusive and differential studies,different ranges of $Z$ boson momentum are considered. Source code: CMS_2013_I1256943.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/DileptonFinder.hh"
4#include "Rivet/Projections/FinalState.hh"
5#include "Rivet/Projections/UnstableParticles.hh"
6
7namespace Rivet {
8
9
10 /// CMS cross-section and angular correlations in Z boson + b-hadrons events at 7 TeV
11 class CMS_2013_I1256943 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2013_I1256943);
16
17
18 /// Add projections and book histograms
19 void init() {
20 book(_sumW, "sumW");
21 book(_sumW50, "sumW50");
22 book(_sumWpT, "sumWpT");
23
24 //FinalState fs(Cuts::abseta < 2.4 && Cuts::pT > 20*GeV); //< likely wrong for dressing inputs
25 UnstableParticles ufs(Cuts::abseta < 2 && Cuts::pT > 15*GeV);
26 declare(ufs, "UFS");
27
28 Cut zetacut = Cuts::abseta < 2.4;
29 DileptonFinder zfindermu(91.2*GeV, 0.1, zetacut && Cuts::pT > 20*GeV &&
30 Cuts::abspid == PID::MUON, Cuts::massIn(81*GeV, 101*GeV));
31 declare(zfindermu, "DileptonFinderMu");
32
33 DileptonFinder zfinderel(91.2*GeV, 0.1, zetacut && Cuts::pT > 20*GeV &&
34 Cuts::abspid == PID::ELECTRON, Cuts::massIn(81*GeV, 101*GeV));
35 declare(zfinderel, "DileptonFinderEl");
36
37
38 // Histograms in non-boosted region of Z pT
39 book(_h_dR_BB ,1, 1, 1);
40 book(_h_dphi_BB ,2, 1, 1);
41 book(_h_min_dR_ZB ,3, 1, 1);
42 book(_h_A_ZBB ,4, 1, 1);
43
44 // Histograms in boosted region of Z pT (pT > 50 GeV)
45 book(_h_dR_BB_boost ,5, 1, 1);
46 book(_h_dphi_BB_boost ,6, 1, 1);
47 book(_h_min_dR_ZB_boost ,7, 1, 1);
48 book(_h_A_ZBB_boost ,8, 1, 1);
49
50 book(_h_min_ZpT ,9,1,1);
51 }
52
53
54 /// Do the analysis
55 void analyze(const Event& e) {
56
57 const UnstableParticles& ufs = apply<UnstableParticles>(e, "UFS");
58 const DileptonFinder& zfindermu = apply<DileptonFinder>(e, "DileptonFinderMu");
59 const DileptonFinder& zfinderel = apply<DileptonFinder>(e, "DileptonFinderEl");
60
61 // Look for a Z --> mu+ mu- event in the final state
62 if (zfindermu.empty() && zfinderel.empty()) vetoEvent;
63
64 const Particles& z = !zfindermu.empty() ? zfindermu.bosons() : zfinderel.bosons();
65 const bool is_boosted = ( z[0].pT() > 50*GeV );
66
67 // Loop over the unstable particles
68 vector<FourMomentum> Bmom;
69 for (const Particle& p : ufs.particles()) {
70 const PdgId pid = p.pid();
71
72 // Look for particles with a bottom quark
73 if (PID::hasBottom(pid)) {
74
75 bool good_B = false;
76 ConstGenParticlePtr pgen = p.genParticle();
77 ConstGenVertexPtr vgen = pgen -> end_vertex();
78
79 // Loop over the decay products of each unstable particle, looking for a b-hadron pair
80 /// @todo Avoid HepMC API
81 for (ConstGenParticlePtr it: HepMCUtils::particles(vgen, Relatives::CHILDREN)){
82 // If the particle produced has a bottom quark do not count it and go to the next loop cycle.
83 if (!( PID::hasBottom( it->pdg_id() ) ) ) {
84 good_B = true;
85 continue;
86 } else {
87 good_B = false;
88 break;
89 }
90 }
91 if (good_B ) Bmom.push_back( p.momentum() );
92 }
93 else continue;
94 }
95
96 // If there are more than two B's in the final state veto the event
97 if (Bmom.size() != 2 ) vetoEvent;
98
99 // Calculate the observables
100 double dphiBB = deltaPhi(Bmom[0], Bmom[1]);
101 double dRBB = deltaR(Bmom[0], Bmom[1]);
102
103 const FourMomentum& pZ = z[0].momentum();
104 const bool closest_B = ( deltaR(pZ, Bmom[0]) < deltaR(pZ, Bmom[1]) );
105 const double mindR_ZB = closest_B ? deltaR(pZ, Bmom[0]) : deltaR(pZ, Bmom[1]);
106 const double maxdR_ZB = closest_B ? deltaR(pZ, Bmom[1]) : deltaR(pZ, Bmom[0]);
107 const double AZBB = ( maxdR_ZB - mindR_ZB ) / ( maxdR_ZB + mindR_ZB );
108
109 // Fill the histograms in the non-boosted region
110 _h_dphi_BB->fill(dphiBB);
111 _h_dR_BB->fill(dRBB);
112 _h_min_dR_ZB->fill(mindR_ZB);
113 _h_A_ZBB->fill(AZBB);
114 _sumW->fill();
115 _sumWpT->fill();
116
117 // Fill the histograms in the boosted region
118 if (is_boosted) {
119 _sumW50->fill();
120 _h_dphi_BB_boost->fill(dphiBB);
121 _h_dR_BB_boost->fill(dRBB);
122 _h_min_dR_ZB_boost->fill(mindR_ZB);
123 _h_A_ZBB_boost->fill(AZBB);
124 }
125
126 // Fill Z pT (cumulative) histogram
127 _h_min_ZpT->fill(0);
128 if (pZ.pT() > 40*GeV ) {
129 _sumWpT->fill();
130 _h_min_ZpT->fill(40);
131 }
132 if (pZ.pT() > 80*GeV ) {
133 _sumWpT->fill();
134 _h_min_ZpT->fill(80);
135 }
136 if (pZ.pT() > 120*GeV ) {
137 _sumWpT->fill();
138 _h_min_ZpT->fill(120);
139 }
140
141 Bmom.clear();
142 }
143
144
145 /// Finalize
146 void finalize() {
147
148 // Normalize excluding overflow bins (d'oh)
149 normalize(_h_dR_BB, 0.7*crossSection()/picobarn*dbl(*_sumW)/sumOfWeights(), false); // d01-x01-y01
150 normalize(_h_dphi_BB, 0.53*crossSection()/picobarn*dbl(*_sumW)/sumOfWeights(), false); // d02-x01-y01
151 normalize(_h_min_dR_ZB, 0.84*crossSection()/picobarn*dbl(*_sumW)/sumOfWeights(), false); // d03-x01-y01
152 normalize(_h_A_ZBB, 0.2*crossSection()/picobarn*dbl(*_sumW)/sumOfWeights(), false); // d04-x01-y01
153
154 normalize(_h_dR_BB_boost, 0.84*crossSection()/picobarn*dbl(*_sumW50)/sumOfWeights(), false); // d05-x01-y01
155 normalize(_h_dphi_BB_boost, 0.63*crossSection()/picobarn*dbl(*_sumW50)/sumOfWeights(), false); // d06-x01-y01
156 normalize(_h_min_dR_ZB_boost, 1*crossSection()/picobarn*dbl(*_sumW50)/sumOfWeights(), false); // d07-x01-y01
157 normalize(_h_A_ZBB_boost, 0.25*crossSection()/picobarn*dbl(*_sumW50)/sumOfWeights(), false); // d08-x01-y01
158
159 normalize(_h_min_ZpT, 40*crossSection()/picobarn*dbl(*_sumWpT)/sumOfWeights(), false); // d09-x01-y01
160 }
161
162
163 private:
164
165 /// @name Weight counters
166 /// @{
167 CounterPtr _sumW, _sumW50, _sumWpT;
168 /// @}
169
170 /// @name Histograms
171 /// @{
172 Histo1DPtr _h_dphi_BB, _h_dR_BB, _h_min_dR_ZB, _h_A_ZBB;
173 Histo1DPtr _h_dphi_BB_boost, _h_dR_BB_boost, _h_min_dR_ZB_boost, _h_A_ZBB_boost, _h_min_ZpT;
174 /// @}
175
176 };
177
178
179 RIVET_DECLARE_PLUGIN(CMS_2013_I1256943);
180
181}
|