Rivet analyses


title: ATLAS_2025_I2905252

High-mass di-tau at 13 TeV

Experiment: ATLAS (LHC)

Inspire ID: 2905252

Status: VALIDATED

Authors: - Jon Butterworth - Christian Gutschow - Tony Yue - Peng Wang

References: none listed

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - pp interactions at 13 TeV producing tau pairs. Dominantly Drell-Yan, with some ttbar. Particles with ctau>10mm are stable.

The production cross-section of high-mass $\tau$-lepton pairs is measured as a function of the dilepton visible invariant mass, using 140 fb$^{-1}$ of $\sqrt{s}=13$ TeV proton-proton collision data recorded with the ATLAS detector at the Large Hadron Collider. The measurement agrees with the predictions of the Standard Model. A fit to the invariant mass distribution is performed as a function of $b$-jet multiplicity, to constrain the non-resonant production of new particles described by an effective field theory or in models containing leptoquarks or $Z^\prime$ bosons that couple preferentially to third-generation fermions. The constraints on new particles improve on previous results, and the constraints on effective operators include those affecting the anomalous magnetic moment of the $\tau$-lepton.

Source code:ATLAS_2025_I2905252.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/TauFinder.hh"

include "Rivet/Tools/Utils.hh"

namespace Rivet {

/// @brief High-mass Drell-Yan prototype at 13 TeV class ATLAS_2025_I2905252 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2025_I2905252);
//@}


/// @name Analysis methods
//@{

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

  // Basic final-state projection for hadronic taus
  declare(TauFinder(TauDecay::HADRONIC, Cuts::abseta < 4.9), "hadtaus");

  book(_e, "mll");
  book(_h, "_mll", _e.binning().edges<0>());
}

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

  // visible.
  const vector<Particle> hadtaus = apply<TauFinder>(event, "hadtaus").taus();

  FourMomentum ditau;
  vector<double> taus;
  for (const Particle& tau : hadtaus) {
    FourMomentum l;
    for (const Particle& p : tau.children()) {
      if (p.isNeutrino()) continue;
      ditau += p.mom();
      l += p.mom();
    }
    if ((l.abseta() > 1.37) && (l.abseta() < 1.52 || l.abseta() > 2.47)) continue;
    if (l.pT() < 20 * GeV) continue;
    taus.push_back(l.pT());
  }
  if (taus.size() != 2) vetoEvent;

  std::sort(taus.begin(), taus.end(), std::greater<double>());
  if (taus[0] < 90 * GeV) vetoEvent;
  if (taus[1] < 60 * GeV) vetoEvent;

  const double mll = ditau.mass();
  if (mll <= 100 * GeV) vetoEvent;

  //histogram filling
  _h->fill(mll / GeV);
}

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

  scale(_h, crossSectionPerEvent() / femtobarn);
  *_e = _h->mkEstimate(_e->path(), "stats", true, 1.0);
}

//@}

/// @name Histograms
//@{
Histo1DPtr _h;
Estimate1DPtr _e;
//@}

};

RIVET_DECLARE_PLUGIN(ATLAS_2025_I2905252);

} ```