rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2015_I1393758

Jet charge
Experiment: ATLAS (LHC)
Inspire ID: 1393758
Status: VALIDATED
Authors:
  • Ben Nachman
References: Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • dijet production

The momentum-weighted sum of the charges of tracks associated to a jet is sensitive to the charge of the initiating quark or gluon. This paper presents a measurement of the distribution of momentum-weighted sums, called jet charge, in dijet events using 20.3 fb${}^{-1}$ of data recorded with the ATLAS detector at $\sqrt{s} = 8$ TeV in $pp$ collisions at the LHC. The jet charge distribution is unfolded to remove distortions from detector effects and the resulting particle-level distribution is compared with several models. The $p_\text{T}$ dependence of the jet charge distribution average and standard deviation are compared to predictions obtained with several leading-order and next-to-leading-order parton distribution functions. The data are also compared to different Monte Carlo simulations of QCD dijet production using various settings of the free parameters within these models. The chosen value of the strong coupling constant used to calculate gluon radiation is found to have a significant impact on the predicted jet charge. There is evidence for a $p_\text{T}$ dependence of the jet charge distribution for a given jet flavor. In agreement with perturbative QCD predictions, the data show that the average jet charge of quark-initiated jets decreases in magnitude as the energy of the jet increases.

Source code: ATLAS_2015_I1393758.cc
  1#include "Rivet/Analysis.hh"
  2#include "Rivet/Projections/FinalState.hh"
  3#include "Rivet/Projections/FastJets.hh"
  4
  5namespace Rivet {
  6
  7  class ATLAS_2015_I1393758 : public Analysis {
  8  public:
  9
 10    /// Constructor
 11    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2015_I1393758);
 12  
 13
 14    void init() {
 15
 16      declare(FastJets(FinalState(), FastJets::ANTIKT, 0.4), "Jets");
 17
 18      book(forward_kappa3, 1, 1, 1);
 19      book(forwardRMS_kappa3, "d02-x01-y01", true);
 20
 21      book(central_kappa3, 3, 1, 1);
 22      book(centralRMS_kappa3, "d04-x01-y01", true);
 23
 24      book(forward_kappa5, 5, 1, 1);
 25      book(forwardRMS_kappa5, "d06-x01-y01", true);
 26
 27      book(central_kappa5, 7, 1, 1);
 28      book(centralRMS_kappa5, "d08-x01-y01", true);
 29
 30      book(forward_kappa7, 9, 1, 1);
 31      book(forwardRMS_kappa7, "d10-x01-y01", true);
 32
 33      book(central_kappa7, 11, 1, 1);
 34      book(centralRMS_kappa7, "d12-x01-y01", true);
 35
 36    }
 37
 38
 39    /// Perform the per-event analysis
 40    void analyze(const Event& event) {
 41      Jets m_goodJets = applyProjection<JetAlg>(event, "Jets").jetsByPt(Cuts::pT > 25*GeV && Cuts::abseta < 2.1);
 42
 43      if (m_goodJets.size() < 2)        vetoEvent;
 44      if (m_goodJets[0].pT() < 50*GeV)  vetoEvent;
 45      if (m_goodJets[1].pT() < 50*GeV)  vetoEvent;
 46      if (fabs(1.0 - m_goodJets[0].pT()/m_goodJets[1].pT()) > 0.5)  vetoEvent;
 47
 48      bool check = m_goodJets[0].abseta() < m_goodJets[1].abseta();
 49      int pos_f = int(check);
 50      int pos_c = int(!check);
 51
 52      double kappa3_f   = CalculateJetCharge(m_goodJets[pos_f], 0.3, 0.5, 1.8);
 53      double kappa5_f   = CalculateJetCharge(m_goodJets[pos_f], 0.5, 0.5, 1.2);
 54      double kappa7_f   = CalculateJetCharge(m_goodJets[pos_f], 0.7, 0.5, 0.9);
 55      double pT_f = m_goodJets[pos_f].pT();
 56
 57      double kappa3_c = CalculateJetCharge(m_goodJets[pos_c], 0.3, 0.5, 1.8);
 58      double kappa5_c   = CalculateJetCharge(m_goodJets[pos_c], 0.5, 0.5, 1.2);
 59      double kappa7_c   = CalculateJetCharge(m_goodJets[pos_c], 0.7, 0.5, 0.9);
 60      double pT_c = m_goodJets[pos_c].pT();
 61
 62      forward_kappa3->fill(pT_f, kappa3_f);
 63      forward_kappa5->fill(pT_f, kappa5_f);
 64      forward_kappa7->fill(pT_f, kappa7_f);
 65
 66      central_kappa3->fill(pT_c, kappa3_c);
 67      central_kappa5->fill(pT_c, kappa5_c);
 68      central_kappa7->fill(pT_c, kappa7_c);
 69    }
 70
 71    double CalculateJetCharge(Jet& jet, double kappa=0.5, double pTcut=0.5, double Qmax=1.2) {
 72      double PTkap = pow(jet.momentum().pT(),kappa);
 73      double jetcharge = 0.;
 74      for (const Particle& p : jet.particles()) {
 75        if (p.pT() < pTcut)  continue;
 76        if (p.charge3()) jetcharge += (p.charge3()/3.)*pow(p.pT(),kappa)/PTkap;
 77      }
 78      //Overflow and underflow
 79      if (jetcharge > Qmax) jetcharge = Qmax*0.9999;
 80      if (jetcharge < -Qmax) jetcharge = -Qmax*0.9999;
 81      return jetcharge;
 82    }
 83
 84    /// Normalise histograms etc., after the run
 85    void finalize() {
 86
 87      if (numEvents() > 2) {
 88        for (unsigned int i = 0; i < forward_kappa3->numBins(); ++i) {
 89	  double stdv_fkappa3 = forward_kappa3->bin(i).effNumEntries() > 1? forward_kappa3->bin(i).stdDev() : 0.0;
 90	  //See Eq. 3 for the factor of two: https://web.eecs.umich.edu/~fessler/papers/files/tr/stderr.pdf
 91          double yerr_fkappa3  = safediv(sqrt(forward_kappa3->bin(i).sumW2()), 2.*forward_kappa3->bin(i).sumW());
 92	  forwardRMS_kappa3->point(i).setY(stdv_fkappa3, yerr_fkappa3);
 93	  
 94          double stdv_fkappa5 = forward_kappa5->bin(i).effNumEntries() > 1? forward_kappa5->bin(i).stdDev() : 0.0;
 95          double yerr_fkappa5  = safediv(sqrt(forward_kappa5->bin(i).sumW2()), 2.*forward_kappa5->bin(i).sumW());
 96          forwardRMS_kappa5->point(i).setY(stdv_fkappa5, yerr_fkappa5);
 97
 98          double stdv_fkappa7 = forward_kappa7->bin(i).effNumEntries() > 1? forward_kappa7->bin(i).stdDev() : 0.0;
 99          double yerr_fkappa7  = safediv(sqrt(forward_kappa7->bin(i).sumW2()), 2.*forward_kappa7->bin(i).sumW());
100          forwardRMS_kappa7->point(i).setY(stdv_fkappa7, yerr_fkappa7);
101
102          double stdv_ckappa3 = central_kappa3->bin(i).effNumEntries() > 1? central_kappa3->bin(i).stdDev() : 0.0;
103          double yerr_ckappa3  = safediv(sqrt(central_kappa3->bin(i).sumW2()), 2.*central_kappa3->bin(i).sumW());
104          centralRMS_kappa3->point(i).setY(stdv_ckappa3, yerr_ckappa3);
105
106          double stdv_ckappa5 = central_kappa5->bin(i).effNumEntries() > 1? central_kappa5->bin(i).stdDev() : 0.0;
107          double yerr_ckappa5  = safediv(sqrt(central_kappa5->bin(i).sumW2()), 2.*central_kappa5->bin(i).sumW());
108          centralRMS_kappa5->point(i).setY(stdv_ckappa5, yerr_ckappa5);
109
110          double stdv_ckappa7 = central_kappa7->bin(i).effNumEntries() > 1? central_kappa7->bin(i).stdDev() : 0.0;
111          double yerr_ckappa7  = safediv(sqrt(central_kappa7->bin(i).sumW2()), 2.*central_kappa7->bin(i).sumW());
112          centralRMS_kappa7->point(i).setY(stdv_ckappa7, yerr_ckappa7);
113
114        }
115      }
116
117    }
118
119
120  private:
121
122    Profile1DPtr forward_kappa3;
123    Profile1DPtr forward_kappa5;
124    Profile1DPtr forward_kappa7;
125
126    Profile1DPtr central_kappa3;
127    Profile1DPtr central_kappa5;
128    Profile1DPtr central_kappa7;
129
130    Scatter2DPtr forwardRMS_kappa3;
131    Scatter2DPtr forwardRMS_kappa5;
132    Scatter2DPtr forwardRMS_kappa7;
133
134    Scatter2DPtr centralRMS_kappa3;
135    Scatter2DPtr centralRMS_kappa5;
136    Scatter2DPtr centralRMS_kappa7;
137
138  };
139
140
141  RIVET_DECLARE_PLUGIN(ATLAS_2015_I1393758);
142
143}