Rivet analyses
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 pT > 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
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.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);
}