Rivet analyses


title: ATLAS_2016_I1419070

Number of tracks in jets

Experiment: ATLAS (LHC)

Inspire ID: 1419070

Status: VALIDATED

Authors: - Ben Nachman - Christian Gutschow

References: - Expt page: ATLAS-STDM-2015-12 - arXiv: 1602.00988 - Eur.Phys.J. C76 (2016) no.6, 322 - DOI: 10.1140/epjc/s10052-016-4126-5

Beams: p+ p+

Beam energies: (4000.0, 4000.0)GeV

Run details: - dijet production

The number of charged particles inside jets is a widely used discriminant for identifying the quark or gluon nature of the initiating parton and is sensitive to both the perturbative and non-perturbative components of fragmentation. This analysis presents a measurement of the average number of charged particles with $p_\text{T}>500$ MeV inside high-momentum jets in dijet events using 20.3 fb${}^{-1}$ of data recorded with the ATLAS detector in $pp$ collisions at $\sqrt{s}=8$ TeV collisions at the LHC. The jets considered have transverse momenta from 50 GeV up to and beyond 1.5 TeV. The reconstructed charged-particle track multiplicity distribution is unfolded to remove distortions from detector effects.

Source code:ATLAS_2016_I1419070.cc

```c++

include "Rivet/Analysis.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

namespace Rivet {

class ATLAS_2016_I1419070 : public Analysis { public:

/// Constructor
ATLAS_2016_I1419070()
    : Analysis("ATLAS_2016_I1419070") { }

public:

void init() {

  declare(FastJets(FinalState(), JetAlg::ANTIKT, 0.4), "Jets");

  book(forward_500MeV, 1, 1, 1);
  book(forward_2GeV, 2, 1, 1);
  book(forward_5GeV, 3, 1, 1);

  book(central_500MeV, 4, 1, 1);
  book(central_2GeV, 5, 1, 1);
  book(central_5GeV, 6, 1, 1);

  book(diff_500MeV, "d07-x01-y01");
  book(diff_2GeV, "d08-x01-y01");
  book(diff_5GeV, "d09-x01-y01");

  book(sum_500MeV, "d10-x01-y01");
  book(sum_2GeV, "d11-x01-y01");
  book(sum_5GeV, "d12-x01-y01");
}

/// Perform the per-event analysis
void analyze(const Event& event) {
  Jets m_goodJets = apply<JetFinder>(event, "Jets").jetsByPt(Cuts::pT > 25 * GeV && Cuts::abseta < 2.1);

  if (m_goodJets.size() < 2) vetoEvent;
  if (m_goodJets[0].pT() < 50 * GeV) vetoEvent;
  if (m_goodJets[1].pT() < 50 * GeV) vetoEvent;
  if (fabs(1.0 - m_goodJets[0].pT() / m_goodJets[1].pT()) > 0.5) vetoEvent;

  bool check = m_goodJets[0].abseta() < m_goodJets[1].abseta();
  int pos_f = int(check);
  int pos_c = int(!check);

  double pt500MeV_f = CalculateNCharge(m_goodJets[pos_f], 0.5);
  double pt2GeV_f = CalculateNCharge(m_goodJets[pos_f], 2.0);
  double pt5GeV_f = CalculateNCharge(m_goodJets[pos_f], 5.0);
  double pT_f = m_goodJets[pos_f].pT();

  double pt500MeV_c = CalculateNCharge(m_goodJets[pos_c], 0.5);
  double pt2GeV_c = CalculateNCharge(m_goodJets[pos_c], 2.0);
  double pt5GeV_c = CalculateNCharge(m_goodJets[pos_c], 5.0);
  double pT_c = m_goodJets[pos_c].pT();

  forward_500MeV->fill(pT_f, pt500MeV_f);
  forward_2GeV->fill(pT_f, pt2GeV_f);
  forward_5GeV->fill(pT_f, pt5GeV_f);

  central_500MeV->fill(pT_c, pt500MeV_c);
  central_2GeV->fill(pT_c, pt2GeV_c);
  central_5GeV->fill(pT_c, pt5GeV_c);
}

double CalculateNCharge(Jet& jet, double pTcut = 0.5) {
  unsigned int ncharge = 0;
  for (const Particle& p : jet.particles()) {
    if (p.pT() < pTcut) continue;
    if (p.charge3()) ++ncharge;
  }
  if (ncharge > 60) ncharge = 60;
  return double(ncharge);
}

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

  if (numEvents() > 2) {
    for (unsigned int i = 1; i < forward_500MeV->numBins() + 1; ++i) {
      const YODA::Dbn2D& bsum = central_500MeV->bin(i) + forward_500MeV->bin(i);
      const YODA::Dbn2D& bsum2 = central_2GeV->bin(i) + forward_2GeV->bin(i);
      const YODA::Dbn2D& bsum5 = central_5GeV->bin(i) + forward_5GeV->bin(i);

      double ydiff = central_500MeV->bin(i).effNumEntries() ? central_500MeV->bin(i).yMean() : 0.0;
      double ydiff2 = central_2GeV->bin(i).effNumEntries() ? central_2GeV->bin(i).yMean() : 0.0;
      double ydiff5 = central_5GeV->bin(i).effNumEntries() ? central_5GeV->bin(i).yMean() : 0.0;
      ydiff -= forward_500MeV->bin(i).effNumEntries() ? forward_500MeV->bin(i).yMean() : 0.0;
      ydiff2 -= forward_2GeV->bin(i).effNumEntries() ? forward_2GeV->bin(i).yMean() : 0.0;
      ydiff5 -= forward_5GeV->bin(i).effNumEntries() ? forward_5GeV->bin(i).yMean() : 0.0;

      double yerr = bsum.effNumEntries() > 1.0 ? bsum.yStdErr() : 0.0;
      double yerr2 = bsum2.effNumEntries() > 1.0 ? bsum2.yStdErr() : 0.0;
      double yerr5 = bsum5.effNumEntries() > 1.0 ? bsum5.yStdErr() : 0.0;

      diff_500MeV->bin(i).set(ydiff, yerr);
      diff_2GeV->bin(i).set(ydiff2, yerr2);
      diff_5GeV->bin(i).set(ydiff5, yerr5);

      sum_500MeV->bin(i).set(bsum.effNumEntries() ? bsum.yMean() : 0.0, yerr);
      sum_2GeV->bin(i).set(bsum2.effNumEntries() ? bsum2.yMean() : 0.0, yerr2);
      sum_5GeV->bin(i).set(bsum5.effNumEntries() ? bsum5.yMean() : 0.0, yerr5);
    }
  }
}

private:

Profile1DPtr forward_500MeV;
Profile1DPtr forward_2GeV;
Profile1DPtr forward_5GeV;

Profile1DPtr central_500MeV;
Profile1DPtr central_2GeV;
Profile1DPtr central_5GeV;

Estimate1DPtr sum_500MeV;
Estimate1DPtr sum_2GeV;
Estimate1DPtr sum_5GeV;

Estimate1DPtr diff_500MeV;
Estimate1DPtr diff_2GeV;
Estimate1DPtr diff_5GeV;

};

RIVET_DECLARE_PLUGIN(ATLAS_2016_I1419070); } ```