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/ZFinder.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);
25 declare(fs, "FS");
26
27 UnstableParticles ufs(Cuts::abseta < 2 && Cuts::pT > 15*GeV);
28 declare(ufs, "UFS");
29
30 Cut zetacut = Cuts::abseta < 2.4;
31
32 ZFinder zfindermu(fs, zetacut, PID::MUON, 81.0*GeV, 101.0*GeV, 0.1, ZFinder::ClusterPhotons::NONE, ZFinder::AddPhotons::YES, 91.2*GeV);
33 declare(zfindermu, "ZFinderMu");
34
35 ZFinder zfinderel(fs, zetacut, PID::ELECTRON, 81.0*GeV, 101.0*GeV, 0.1, ZFinder::ClusterPhotons::NONE, ZFinder::AddPhotons::YES, 91.2*GeV);
36 declare(zfinderel, "ZFinderEl");
37
38
39 // Histograms in non-boosted region of Z pT
40 book(_h_dR_BB ,1, 1, 1);
41 book(_h_dphi_BB ,2, 1, 1);
42 book(_h_min_dR_ZB ,3, 1, 1);
43 book(_h_A_ZBB ,4, 1, 1);
44
45 // Histograms in boosted region of Z pT (pT > 50 GeV)
46 book(_h_dR_BB_boost ,5, 1, 1);
47 book(_h_dphi_BB_boost ,6, 1, 1);
48 book(_h_min_dR_ZB_boost ,7, 1, 1);
49 book(_h_A_ZBB_boost ,8, 1, 1);
50
51 book(_h_min_ZpT ,9,1,1);
52 }
53
54
55 /// Do the analysis
56 void analyze(const Event& e) {
57
58 const UnstableParticles& ufs = apply<UnstableParticles>(e, "UFS");
59 const ZFinder& zfindermu = apply<ZFinder>(e, "ZFinderMu");
60 const ZFinder& zfinderel = apply<ZFinder>(e, "ZFinderEl");
61
62 // Look for a Z --> mu+ mu- event in the final state
63 if (zfindermu.empty() && zfinderel.empty()) vetoEvent;
64
65 const Particles& z = !zfindermu.empty() ? zfindermu.bosons() : zfinderel.bosons();
66 const bool is_boosted = ( z[0].pT() > 50*GeV );
67
68 // Loop over the unstable particles
69 vector<FourMomentum> Bmom;
70 for (const Particle& p : ufs.particles()) {
71 const PdgId pid = p.pid();
72
73 // Look for particles with a bottom quark
74 if (PID::hasBottom(pid)) {
75
76 bool good_B = false;
77 ConstGenParticlePtr pgen = p.genParticle();
78 ConstGenVertexPtr vgen = pgen -> end_vertex();
79
80 // Loop over the decay products of each unstable particle, looking for a b-hadron pair
81 /// @todo Avoid HepMC API
82 for (ConstGenParticlePtr it: HepMCUtils::particles(vgen, Relatives::CHILDREN)){
83 // If the particle produced has a bottom quark do not count it and go to the next loop cycle.
84 if (!( PID::hasBottom( it->pdg_id() ) ) ) {
85 good_B = true;
86 continue;
87 } else {
88 good_B = false;
89 break;
90 }
91 }
92 if (good_B ) Bmom.push_back( p.momentum() );
93 }
94 else continue;
95 }
96
97 // If there are more than two B's in the final state veto the event
98 if (Bmom.size() != 2 ) vetoEvent;
99
100 // Calculate the observables
101 double dphiBB = deltaPhi(Bmom[0], Bmom[1]);
102 double dRBB = deltaR(Bmom[0], Bmom[1]);
103
104 const FourMomentum& pZ = z[0].momentum();
105 const bool closest_B = ( deltaR(pZ, Bmom[0]) < deltaR(pZ, Bmom[1]) );
106 const double mindR_ZB = closest_B ? deltaR(pZ, Bmom[0]) : deltaR(pZ, Bmom[1]);
107 const double maxdR_ZB = closest_B ? deltaR(pZ, Bmom[1]) : deltaR(pZ, Bmom[0]);
108 const double AZBB = ( maxdR_ZB - mindR_ZB ) / ( maxdR_ZB + mindR_ZB );
109
110 // Fill the histograms in the non-boosted region
111 _h_dphi_BB->fill(dphiBB);
112 _h_dR_BB->fill(dRBB);
113 _h_min_dR_ZB->fill(mindR_ZB);
114 _h_A_ZBB->fill(AZBB);
115 _sumW->fill();
116 _sumWpT->fill();
117
118 // Fill the histograms in the boosted region
119 if (is_boosted) {
120 _sumW50->fill();
121 _h_dphi_BB_boost->fill(dphiBB);
122 _h_dR_BB_boost->fill(dRBB);
123 _h_min_dR_ZB_boost->fill(mindR_ZB);
124 _h_A_ZBB_boost->fill(AZBB);
125 }
126
127 // Fill Z pT (cumulative) histogram
128 _h_min_ZpT->fill(0);
129 if (pZ.pT() > 40*GeV ) {
130 _sumWpT->fill();
131 _h_min_ZpT->fill(40);
132 }
133 if (pZ.pT() > 80*GeV ) {
134 _sumWpT->fill();
135 _h_min_ZpT->fill(80);
136 }
137 if (pZ.pT() > 120*GeV ) {
138 _sumWpT->fill();
139 _h_min_ZpT->fill(120);
140 }
141
142 Bmom.clear();
143 }
144
145
146 /// Finalize
147 void finalize() {
148
149 // Normalize excluding overflow bins (d'oh)
150 normalize(_h_dR_BB, 0.7*crossSection()*dbl(*_sumW)/sumOfWeights(), false); // d01-x01-y01
151 normalize(_h_dphi_BB, 0.53*crossSection()*dbl(*_sumW)/sumOfWeights(), false); // d02-x01-y01
152 normalize(_h_min_dR_ZB, 0.84*crossSection()*dbl(*_sumW)/sumOfWeights(), false); // d03-x01-y01
153 normalize(_h_A_ZBB, 0.2*crossSection()*dbl(*_sumW)/sumOfWeights(), false); // d04-x01-y01
154
155 normalize(_h_dR_BB_boost, 0.84*crossSection()*dbl(*_sumW50)/sumOfWeights(), false); // d05-x01-y01
156 normalize(_h_dphi_BB_boost, 0.63*crossSection()*dbl(*_sumW50)/sumOfWeights(), false); // d06-x01-y01
157 normalize(_h_min_dR_ZB_boost, 1*crossSection()*dbl(*_sumW50)/sumOfWeights(), false); // d07-x01-y01
158 normalize(_h_A_ZBB_boost, 0.25*crossSection()*dbl(*_sumW50)/sumOfWeights(), false); // d08-x01-y01
159
160 normalize(_h_min_ZpT, 40*crossSection()*dbl(*_sumWpT)/sumOfWeights(), false); // d09-x01-y01
161 }
162
163
164 private:
165
166 /// @name Weight counters
167 //@{
168 CounterPtr _sumW, _sumW50, _sumWpT;
169 //@}
170
171 /// @name Histograms
172 //@{
173 Histo1DPtr _h_dphi_BB, _h_dR_BB, _h_min_dR_ZB, _h_A_ZBB;
174 Histo1DPtr _h_dphi_BB_boost, _h_dR_BB_boost, _h_min_dR_ZB_boost, _h_A_ZBB_boost, _h_min_ZpT;
175 //@}
176
177 };
178
179
180 RIVET_DECLARE_PLUGIN(CMS_2013_I1256943);
181
182}
|