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