rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2013_I1256943

Cross-section and angular correlations in $Z$ boson with $b$-hadrons events at $\sqrt{s} = 7$ TeV
Experiment: CMS (LHC)
Inspire ID: 1256943
Status: VALIDATED
Authors:
  • Lorenzo Viliani
  • Piergiulio Lenzi
References:
  • 10.1007 / JHEP12(2013)039
  • arXiv: 1310.1349
  • CERN-PH-EP-2013-153
  • CMS-EWK-11-015
Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • $pp$ collisions with $\sqrt{s} = 7$ TeV. Selection of events with exactly two $b$-hadrons and a lepton pair from the $Z$ boson decay. Each lepton has $p_T > 20$ GeV and $|\eta| < 2.4$ and the dilepton invariant mass is $81 < M_{\ell\ell} < 101$ GeV. The $b$-hadrons have $p_T > 15$ GeV and $|\eta| < 2$. The differential cross sections are measured for $p_T > 0$ and $p_T > 50$ GeV.

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}