rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2023_I2663256

Semivisible jets t-channel search
Experiment: ATLAS (ATLAS)
Inspire ID: 2663256
Status: VALIDATED
Authors:
  • Deepak Kar
References: Beams: p+ p+
Beam energies: (6500.0, 6500.0) GeV
Run details:
  • BSM Search

Semi-visible jets, with a significant contribution to the missing transverse momentum of the event, can arise in strongly interacting dark sectors. This results in an event topology where one of the jets can be aligned with the direction of the missing transverse momentum. A search for semi-visible jets produced via a t-channel mediator exchange is presented. The analysis uses pp collisions with an integrated luminosity of 139 fb$^{−1}$ and a centre-of-mass energy of 13 TeV, collected with the ATLAS detector during Run 2 of the LHC. No excess over Standard Model predictions is observed. Assuming a coupling strength of unity between the mediator, a Standard Model quark and a dark quark, mediator masses up to 2.7 TeV can be excluded at the 95\% confidence level. Upper limits on the coupling strength are also derived.

Source code: ATLAS_2023_I2663256.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/SmearedJets.hh"
  6#include "Rivet/Projections/VetoedFinalState.hh"
  7#include "Rivet/Projections/ChargedLeptons.hh"
  8
  9namespace Rivet {
 10
 11
 12  /// @brief Semivisible jets t-channel search
 13  class ATLAS_2023_I2663256 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2023_I2663256);
 18
 19
 20  private:
 21
 22    /// @name Analysis methods
 23    /// @{
 24
 25    /// Initialise and register projections
 26    void init() {
 27
 28      //Leptons
 29      ChargedLeptons lfs(FinalState(Cuts::abseta < 2.5 && Cuts::pT > 7*GeV));
 30      declare(lfs, "LFS");
 31
 32      FinalState fs(Cuts::abseta < 4.5);
 33      VetoedFinalState vfs(fs);
 34      vfs.vetoNeutrinos();
 35      vfs.addVetoPairId(PID::MUON);
 36
 37      FastJets j04(vfs, JetAlg::ANTIKT, 0.4);
 38      declare(j04, "Jets");
 39
 40      SmearedJets sj04(j04, JET_SMEAR_ATLAS_RUN2, [](const Jet& j){
 41        return j.bTagged() ? 0.7*(1 - exp(-j.pT()/(10*GeV))) : 0.01;
 42      });
 43      declare(sj04, "SJets");
 44
 45      // Book histograms
 46
 47      book(_h["ninebin"], 1, 1, 8);
 48      book(_h["ht"],      2, 1, 8);
 49      book(_h["met"],     3, 1, 8);
 50      book(_h["ptbal"],   4, 1, 8);
 51      book(_h["difphi"],  5, 1, 8);
 52
 53    }
 54
 55
 56
 57    // Perform the per-event analysis
 58    void analyze(const Event& event) {
 59
 60      const ChargedLeptons& lfs = apply<ChargedLeptons>(event, "LFS");
 61      if (lfs.chargedLeptons().size() > 0) vetoEvent;
 62
 63      const Jets j04 = apply<JetFinder>(event, "Jets").jetsByPt(Cuts::abseta < 2.8 && Cuts::pT > 30*GeV);
 64      const Jets sj04 = apply<JetFinder>(event, "SJets").jetsByPt(Cuts::pT > 30*GeV);
 65      if(sj04.size() < 2) vetoEvent;
 66      const Jets sj04b = select(sj04, [&](const Jet& j) { return j.bTagged(); });
 67      if(sj04b.size() > 1) vetoEvent;
 68      if( sj04[0].pT() < 250) vetoEvent;
 69
 70      FourMomentum pTmiss;
 71      for (const Jet& j : sj04) {
 72        pTmiss -= j.momentum();
 73      }
 74
 75
 76      double met = pTmiss.perp();
 77      if(met < 600) vetoEvent;
 78
 79
 80      double sumpt = 0;
 81      double minphi = 99;
 82      double maxphi = -99;
 83
 84      Jet svj;
 85      Jet antisvj;
 86
 87
 88      for (const Jet& jet : sj04) {
 89        sumpt += jet.pT();
 90        if (deltaPhi(jet, pTmiss) < minphi) {
 91          minphi = deltaPhi(jet, pTmiss);
 92          svj=jet;
 93        }
 94
 95        if (deltaPhi(jet, pTmiss) > maxphi) {
 96          maxphi = deltaPhi(jet, pTmiss);
 97          antisvj=jet;
 98        }
 99      }
100
101
102      if (sumpt < 600) vetoEvent;
103      if (minphi > 2) vetoEvent;
104      double difphi = deltaPhi(svj, antisvj);
105      double delta_jets = (svj.momentum() + antisvj.momentum()).pT();
106      double total_pt = svj.momentum().pT() + antisvj.momentum().pT();
107      double delta_jets_n = delta_jets/ total_pt;
108
109      _h["met"]->fill(met);
110      _h["ht"]->fill(sumpt);
111      _h["difphi"]->fill(difphi);
112      _h["ptbal"]->fill(delta_jets_n);
113
114      int i=0;
115      int j=0;
116      if(inRange(delta_jets_n, 0.0, 0.6)) i=0;
117      if(inRange(delta_jets_n, 0.6, 0.9)) i=1;
118      if(inRange(delta_jets_n, 0.9, 1.0)) i=2;
119      if(inRange(difphi, 0.0, 2.0)) j=0;
120      if(inRange(difphi, 2.0, 2.7)) j=1;
121      if(inRange(difphi, 2.7, 3.2)) j=2;
122      int binindex = 3*i + j + 1;
123      _h["ninebin"]->fill(binindex);
124    }
125
126
127    /// Normalise histograms etc., after the run
128    void finalize() {
129
130      for (auto& hist : _h) {
131        for (size_t i=0; i < hist.second->numBins(); ++i) {
132          double bW = hist.second->bin(i).xWidth();
133          hist.second->bin(i).scaleW(bW);
134        }
135      }
136
137      double norm = 139*crossSection()/femtobarn/sumOfWeights();
138      scale(_h, norm);
139    }
140
141    /// @}
142
143
144  private:
145
146    /// Histograms
147    map<string, Histo1DPtr> _h;
148
149  };
150
151
152  RIVET_DECLARE_PLUGIN(ATLAS_2023_I2663256);
153
154}