Rivet analyses


title: ATLAS_2014_I1306294

Measurement of Z boson in association with b-jets at 7 TeV in ATLAS (electron channel)

Experiment: ATLAS (LHC)

Inspire ID: 1306294

Status: VALIDATED

Authors: - Gavin Hesketh

References: - Expt page: ATLAS-STDM-2012-15 - arXiv: 1407.3643 - JHEP 1410 (2014) 141

Beams: p+ p+

Beam energies: (3500.0, 3500.0)GeV

Run details: - Z+b(b) production in $pp$ collisions at $\sqrt{s} = 7$ TeV, electronic Z-decays

Measurements of differential production cross-sections of a $Z$ boson in association with $b$-jets in $pp$ collisions at $\sqrt{s}=7$ TeV are reported. The data analysed correspond to an integrated luminosity of 4.6~fb$^{-1}$ recorded with the ATLAS detector at the Large Hadron Collider. Particle-level cross-sections are determined for events with a $Z$ boson decaying into an electron or muon pair, and containing $b$-jets. For events with at least one $b$-jet, the cross-section is presented as a function of the $Z$ boson transverse momentum and rapidity, together with the inclusive $b$-jet cross-section as a function of $b$-jet transverse momentum, rapidity and angular separations between the $b$-jet and the $Z$ boson. For events with at least two $b$-jets, the cross-section is determined as a function of the invariant mass and angular separation of the two highest transverse momentum $b$-jets, and as a function of the $Z$ boson transverse momentum and rapidity. Results are compared to leading-order and next-to-leading-order perturbative QCD calculations. This Rivet module implements the event selection for Z decaying into electrons. If you want to use muonic events, please refer to ATLAS_2014_I1306294_MU

Source code:ATLAS_2014_I1306294.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/DileptonFinder.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/HeavyHadrons.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

/// Electroweak Wjj production at 8 TeV class ATLAS_2014_I1306294 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2014_I1306294);


/// @name Analysis methods
/// @{

/// Book histograms and initialise projections before the run
void init() {

  // Get options from the new option system
  _mode = 1;
  if (getOption("LMODE") == "EL") _mode = 1;
  if (getOption("LMODE") == "MU") _mode = 2;

  Cut cuts = Cuts::abseta < 2.5 && Cuts::pT > 20 * GeV;
  DileptonFinder zfinder(91.2 * GeV, 0.1,
                         cuts && Cuts::abspid == (_mode == 1 ? PID::ELECTRON : PID::MUON),
                         Cuts::massIn(76.0 * GeV, 106.0 * GeV), LeptonOrigin::ALL, PhotonOrigin::NODECAY);
  declare(zfinder, "DileptonFinder");

  VetoedFinalState jet_fs;
  jet_fs.addVetoOnThisFinalState(getProjection<DileptonFinder>("DileptonFinder"));
  FastJets jetpro1(jet_fs, JetAlg::ANTIKT, 0.4, JetMuons::ALL, JetInvisibles::ALL);
  declare(jetpro1, "AntiKtJets04");
  declare(HeavyHadrons(), "BHadrons");

  // Histograms with data binning
  book(_h_bjet_Pt, 3, 1, 1);
  book(_h_bjet_Y, 5, 1, 1);
  book(_h_bjet_Yboost, 7, 1, 1);
  book(_h_bjet_DY20, 9, 1, 1);
  book(_h_bjet_ZdPhi20, 11, 1, 1);
  book(_h_bjet_ZdR20, 13, 1, 1);
  book(_h_bjet_ZPt, 15, 1, 1);
  book(_h_bjet_ZY, 17, 1, 1);
  book(_h_2bjet_dR, 21, 1, 1);
  book(_h_2bjet_Mbb, 23, 1, 1);
  book(_h_2bjet_ZPt, 25, 1, 1);
  book(_h_2bjet_ZY, 27, 1, 1);
}


/// Perform the per-event analysis
void analyze(const Event& e) {

  // Check we have a Z:
  const DileptonFinder& zfinder = apply<DileptonFinder>(e, "DileptonFinder");
  if (zfinder.bosons().size() != 1) vetoEvent;

  const Particles boson_s = zfinder.bosons();
  const Particle boson_f = boson_s[0];
  const Particles zleps = zfinder.constituents();

  // Stop processing the event if no true b-partons or hadrons are found
  const Particles allBs = apply<HeavyHadrons>(e, "BHadrons").bHadrons(Cuts::pT > 5.0 * GeV);
  Particles stableBs = select(allBs, Cuts::abseta < 2.5);
  if (stableBs.empty()) vetoEvent;

  // Get the b-jets
  const Jets& jets = apply<JetFinder>(e, "AntiKtJets04")
                         .jetsByPt(Cuts::pT > 20.0 * GeV && Cuts::abseta < 2.4);
  Jets b_jets;
  for (const Jet& jet : jets) {
    //veto overlaps with Z leptons:
    bool veto = false;
    for (const Particle& zlep : zleps) {
      if (deltaR(jet, zlep) < 0.5) veto = true;
    }
    if (veto) continue;

    for (const Particle& bhadron : stableBs) {
      if (deltaR(jet, bhadron) <= 0.3) {
        b_jets.push_back(jet);
        break; // match
      }
    }
  }

  // Make sure we have at least 1
  if (b_jets.empty()) vetoEvent;

  // Fill the plots
  const double ZpT = boson_f.pT() / GeV;
  const double ZY = boson_f.absrap();

  _h_bjet_ZPt->fill(ZpT);
  _h_bjet_ZY->fill(ZY);

  for (const Jet& jet : b_jets) {
    _h_bjet_Pt->fill(jet.pT() / GeV);
    _h_bjet_Y->fill(jet.absrap());

    const double Yboost = 0.5 * fabs(boson_f.rapidity() + jet.rapidity());

    _h_bjet_Yboost->fill(Yboost);

    if (ZpT > 20.) {

      const double ZBDY = fabs(boson_f.rapidity() - jet.rapidity());
      const double ZBDPHI = fabs(deltaPhi(jet.phi(), boson_f.phi()));
      const double ZBDR = deltaR(jet, boson_f, RAPIDITY);
      _h_bjet_DY20->fill(ZBDY);
      _h_bjet_ZdPhi20->fill(ZBDPHI);
      _h_bjet_ZdR20->fill(ZBDR);
    }

  } //loop over b-jets

  if (b_jets.size() < 2) return;

  _h_2bjet_ZPt->fill(ZpT);
  _h_2bjet_ZY->fill(ZY);

  const double BBDR = deltaR(b_jets[0], b_jets[1], RAPIDITY);
  const double Mbb = (b_jets[0].momentum() + b_jets[1].momentum()).mass();

  _h_2bjet_dR->fill(BBDR);
  _h_2bjet_Mbb->fill(Mbb);

} // end of analysis loop


/// Normalise histograms etc., after the run
void finalize() {

  const double normfac = crossSection() / picobarn / sumOfWeights();

  scale(_h_bjet_Pt, normfac);
  scale(_h_bjet_Y, normfac);
  scale(_h_bjet_Yboost, normfac);
  scale(_h_bjet_DY20, normfac);
  scale(_h_bjet_ZdPhi20, normfac);
  scale(_h_bjet_ZdR20, normfac);
  scale(_h_bjet_ZPt, normfac);
  scale(_h_bjet_ZY, normfac);
  scale(_h_2bjet_dR, normfac);
  scale(_h_2bjet_Mbb, normfac);
  scale(_h_2bjet_ZPt, normfac);
  scale(_h_2bjet_ZY, normfac);
}

/// @}

protected:

// Data members like post-cuts event weight counters go here
size_t _mode;

private:

Histo1DPtr _h_bjet_Pt;
Histo1DPtr _h_bjet_Y;
Histo1DPtr _h_bjet_Yboost;
Histo1DPtr _h_bjet_DY20;
Histo1DPtr _h_bjet_ZdPhi20;
Histo1DPtr _h_bjet_ZdR20;
Histo1DPtr _h_bjet_ZPt;
Histo1DPtr _h_bjet_ZY;
Histo1DPtr _h_2bjet_dR;
Histo1DPtr _h_2bjet_Mbb;
Histo1DPtr _h_2bjet_ZPt;
Histo1DPtr _h_2bjet_ZY;

};

RIVET_DECLARE_PLUGIN(ATLAS_2014_I1306294);

} ```