Rivet analyses
Distributions sensitive to the underlying event in inclusive Z-boson production at 7 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1315949
Status: VALIDATED
Authors: - Deepak Kar
References: - Expt page: ATLAS-STDM-2011-42 - Eur.Phys.J. C74 (2014) 3195 - DOI: 10.1140/epjc/s10052-014-3195-6 - arXiv: 1409.3433
Beams: p+ p+
Beam energies: (3500.0, 3500.0)GeV
Run details: - p + p -> Z + X ( Z -> mu^+ mu^- or e^+ e^- ) at 7 TeV
Charged-particle distributions sensitive to the properties of the underlying event are measured for an inclusive sample of events containing a Z-boson, decaying to an electron or muon pair. The measurement is based on data collected using the ATLAS detector at the LHC in proton–proton collisions at a centre-of-mass energy of 7 TeV with an integrated luminosity of 4.6 fb−1. Distributions of the charged particle multiplicity and of the charged particle transverse momentum are measured in regions of azimuthal angle defined with respect to the Z-boson direction.
Source
code:ATLAS_2014_I1315949.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/DileptonFinder.hh"
#include "Rivet/Projections/FinalState.hh"
namespace Rivet {
class ATLAS_2014_I1315949 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2014_I1315949);
void init() {
DileptonFinder zfinder(91.2 * GeV, 0.1,
Cuts::abseta < 2.4 && Cuts::pT > 20 * GeV && Cuts::abspid == PID::MUON,
Cuts::massIn(66 * GeV, 116 * GeV));
declare(zfinder, "DileptonFinder");
ChargedFinalState cfs(zfinder.remainingFinalState());
declare(cfs, "cfs");
book(_h_pTsum_tow, 67, 1, 1);
book(_h_pTsum_trv, 68, 1, 1);
book(_h_pTsum_away, 69, 1, 1);
book(_h_pTsum_tmin, 70, 1, 1);
book(_h_pTsum_tmax, 71, 1, 1);
book(_h_pTsum_tdif, 125, 1, 1);
book(_h_Nchg_tow, 72, 1, 1);
book(_h_Nchg_trv, 73, 1, 1);
book(_h_Nchg_away, 74, 1, 1);
book(_h_Nchg_tmin, 75, 1, 1);
book(_h_Nchg_tmax, 82, 1, 1);
book(_h_Nchg_tdif, 126, 1, 1);
book(_h_pTavg_tow, 113, 1, 1);
book(_h_pTavg_trv, 114, 1, 1);
book(_h_pTavg_away, 115, 1, 1);
book(_h_pTavgvsmult_tow, 116, 1, 1);
book(_h_pTavgvsmult_trv, 117, 1, 1);
book(_h_pTavgvsmult_away, 118, 1, 1);
// Book sumpt and nch histos
for (size_t id = 0; id < 6.; ++id) {
book(_h_ptSum_1D[0][id], 76 + id, 1, 1);
book(_h_ptSum_1D[1][id], 107 + id, 1, 1);
book(_h_ptSum_1D[2][id], 119 + id, 1, 1);
book(_h_ptSum_1D[3][id], 127 + id, 1, 1);
book(_h_Nchg_1D[0][id], 83 + id, 1, 1);
book(_h_Nchg_1D[1][id], 89 + id, 1, 1);
book(_h_Nchg_1D[2][id], 95 + id, 1, 1);
book(_h_Nchg_1D[3][id], 101 + id, 1, 1);
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
const DileptonFinder& zfinder = apply<DileptonFinder>(event, "DileptonFinder");
if (zfinder.bosons().size() != 1) vetoEvent;
double Zpt = zfinder.bosons()[0].momentum().pT() / GeV;
double Zphi = zfinder.bosons()[0].momentum().phi(MINUSPI_PLUSPI);
double Zmass = zfinder.bosons()[0].momentum().mass() / GeV;
if (Zmass < 66. || Zmass > 116.) vetoEvent;
// Initialise counters for Nch and sumPt for all regions
int nTowards(0), nTransverse(0), nLeft(0), nRight(0), nTrmin(0), nTrmax(0), nAway(0);
double ptSumTowards(0.0), ptSumTransverse(0.0), ptSumLeft(0.0), ptSumRight(0.0), ptSumTrmin(0.0),
ptSumTrmax(0.0), ptSumAway(0.0);
// The charged particles
Particles particles = apply<ChargedFinalState>(event, "cfs")
.particlesByPt(Cuts::pT > 0.5 * GeV && Cuts::abseta < 2.5);
// Loop over charged particles with pT>500 MeV and |eta|<2.5
for (const Particle& p : particles) {
double dphi = p.momentum().phi(MINUSPI_PLUSPI) - Zphi;
double pT = p.momentum().pT();
// Get multiples of 2pi right
for (; std::fabs(dphi) > M_PI; dphi += (dphi > 0. ? -2. * M_PI : 2. * M_PI));
// Towards region
if (std::fabs(dphi) < M_PI / 3.) {
nTowards++;
ptSumTowards += pT;
}
// Transverse region
else if (std::fabs(dphi) < 2. * M_PI / 3.) {
nTransverse++;
ptSumTransverse += pT;
if (dphi > 0.) {
nRight++;
ptSumRight += pT;
}
else {
nLeft++;
ptSumLeft += pT;
}
}
// Away region
else {
nAway++;
ptSumAway += pT;
}
}
// TransMAX, TransMIN regions
if (ptSumLeft > ptSumRight) {
ptSumTrmax = ptSumLeft;
ptSumTrmin = ptSumRight;
nTrmax = nLeft;
nTrmin = nRight;
}
else {
ptSumTrmax = ptSumRight;
ptSumTrmin = ptSumLeft;
nTrmax = nRight;
nTrmin = nLeft;
}
// min max regions have difference are than all other regions
const double area = 5. * 2. / 3. * M_PI;
// Fill sumPt vs. Zpt region profiles
_h_pTsum_tow->fill(Zpt, ptSumTowards / area);
_h_pTsum_trv->fill(Zpt, ptSumTransverse / area);
_h_pTsum_away->fill(Zpt, ptSumAway / area);
_h_pTsum_tmin->fill(Zpt, ptSumTrmin / (0.5 * area));
_h_pTsum_tmax->fill(Zpt, ptSumTrmax / (0.5 * area));
_h_pTsum_tdif->fill(Zpt, (ptSumTrmax - ptSumTrmin) / (0.5 * area));
// Fill Nch vs. Zpt region profiles
_h_Nchg_tow->fill(Zpt, nTowards / area);
_h_Nchg_trv->fill(Zpt, nTransverse / area);
_h_Nchg_away->fill(Zpt, nAway / area);
_h_Nchg_tmin->fill(Zpt, nTrmin / (0.5 * area));
_h_Nchg_tmax->fill(Zpt, nTrmax / (0.5 * area));
_h_Nchg_tdif->fill(Zpt, (nTrmax - nTrmin) / (0.5 * area));
// Fill <pT> vs. ZpT profiles
_h_pTavg_tow->fill(Zpt, nTowards > 0. ? ptSumTowards / nTowards : 0.);
_h_pTavg_trv->fill(Zpt, nTransverse > 0. ? ptSumTransverse / nTransverse : 0.);
_h_pTavg_away->fill(Zpt, nAway > 0. ? ptSumAway / nAway : 0.);
// Fill <Nch> vs. ZpT profiles
_h_pTavgvsmult_tow->fill(nTowards, nTowards > 0. ? ptSumTowards / nTowards : 0.);
_h_pTavgvsmult_trv->fill(nTransverse, nTransverse > 0. ? ptSumTransverse / nTransverse : 0.);
_h_pTavgvsmult_away->fill(nAway, nAway > 0. ? ptSumAway / nAway : 0.);
// Determine Zpt region histo to fill
int i_bin(0);
if (inRange(Zpt, 0, 5)) i_bin = 0;
if (inRange(Zpt, 5, 10)) i_bin = 1;
if (inRange(Zpt, 10, 20)) i_bin = 2;
if (inRange(Zpt, 20, 50)) i_bin = 3;
if (inRange(Zpt, 50, 110)) i_bin = 4;
if (Zpt > 110) i_bin = 5;
// SumPt histos for Zpt region
_h_ptSum_1D[0][i_bin]->fill(ptSumTowards / area);
_h_ptSum_1D[1][i_bin]->fill(ptSumTransverse / area);
_h_ptSum_1D[2][i_bin]->fill(ptSumTrmin / (0.5 * area));
_h_ptSum_1D[3][i_bin]->fill(ptSumTrmax / (0.5 * area));
// Nch histos for Zpt region
_h_Nchg_1D[0][i_bin]->fill(nTowards / area);
_h_Nchg_1D[1][i_bin]->fill(nTransverse / area);
_h_Nchg_1D[2][i_bin]->fill(nTrmin / (0.5 * area));
_h_Nchg_1D[3][i_bin]->fill(nTrmax / (0.5 * area));
}
/// Normalise histograms etc., after the run
void finalize() {
for (int i_reg = 0; i_reg < 4; i_reg++) {
for (int i_bin = 0; i_bin < 6; i_bin++) {
normalize(_h_ptSum_1D[i_reg][i_bin]);
normalize(_h_Nchg_1D[i_reg][i_bin]);
}
}
}
private:
Profile1DPtr _h_pTsum_tow, _h_pTsum_trv, _h_pTsum_away, _h_pTsum_tmin, _h_pTsum_tmax, _h_pTsum_tdif,
_h_Nchg_tow, _h_Nchg_trv, _h_Nchg_away, _h_Nchg_tmin, _h_Nchg_tmax, _h_Nchg_tdif,
_h_pTavg_tow, _h_pTavg_trv, _h_pTavg_away, _h_pTavgvsmult_tow, _h_pTavgvsmult_trv,
_h_pTavgvsmult_away;
Histo1DPtr _h_ptSum_1D[4][6], _h_Nchg_1D[4][6];
};
RIVET_DECLARE_PLUGIN(ATLAS_2014_I1315949);
}