Rivet analyses

Experiment: ATLAS (ATLAS)

Inspire ID: 2663256

Status: VALIDATED

Authors: - Deepak Kar

References: - arXiv: 2305.18037 - accepted in PLB - Expt page: ATLAS-EXOT-2022-37

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

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/SmearedJets.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/Projections/ChargedLeptons.hh"
#include "Rivet/Projections/VisibleFinalState.hh"

namespace Rivet {


  /// @brief Semivisible jets t-channel search
  class ATLAS_2023_I2663256 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2023_I2663256);


  private:

    /// @name Analysis methods
    /// @{

    /// Initialise and register projections
    void init() {

      //Leptons
      ChargedLeptons lfs(FinalState(Cuts::abseta < 2.5 && Cuts::pT > 7*GeV));
      declare(lfs, "LFS");

      FinalState fs(Cuts::abseta < 4.5);
      VetoedFinalState vetofs(fs);
      //vetofs.vetoNeutrinos();
      vetofs.addVetoPairId(PID::MUON);
      VisibleFinalState vfs(vetofs);

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

      SmearedJets sj04(j04, JET_SMEAR_ATLAS_RUN2, [](const Jet& j){
        return j.bTagged() ? 0.7*(1 - exp(-j.pT()/(10*GeV))) : 0.01;
      });
      declare(sj04, "SJets");

      // Book histograms

      book(_h["ninebin"], 1, 1, 8);
      book(_h["ht"],      2, 1, 8);
      book(_h["met"],     3, 1, 8);
      book(_h["ptbal"],   4, 1, 8);
      book(_h["difphi"],  5, 1, 8);

    }



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

      const ChargedLeptons& lfs = apply<ChargedLeptons>(event, "LFS");
      if (lfs.chargedLeptons().size() > 0) vetoEvent;

      const Jets j04 = apply<JetFinder>(event, "Jets").jetsByPt(Cuts::abseta < 2.8 && Cuts::pT > 30*GeV);
      const Jets sj04 = apply<JetFinder>(event, "SJets").jetsByPt(Cuts::pT > 30*GeV);
      if(sj04.size() < 2) vetoEvent;
      const Jets sj04b = select(sj04, [&](const Jet& j) { return j.bTagged(); });
      if(sj04b.size() > 1) vetoEvent;
      if( sj04[0].pT() < 250) vetoEvent;

      FourMomentum pTmiss;
      for (const Jet& j : sj04) {
        pTmiss -= j.momentum();
      }


      double met = pTmiss.perp();
      if(met < 600) vetoEvent;


      double sumpt = 0;
      double minphi = 99;
      double maxphi = -99;

      Jet svj;
      Jet antisvj;


      for (const Jet& jet : sj04) {
        sumpt += jet.pT();
        if (deltaPhi(jet, pTmiss) < minphi) {
          minphi = deltaPhi(jet, pTmiss);
          svj=jet;
        }

        if (deltaPhi(jet, pTmiss) > maxphi) {
          maxphi = deltaPhi(jet, pTmiss);
          antisvj=jet;
        }
      }


      if (sumpt < 600) vetoEvent;
      if (minphi > 2) vetoEvent;
      double difphi = deltaPhi(svj, antisvj);
      double delta_jets = (svj.momentum() + antisvj.momentum()).pT();
      double total_pt = svj.momentum().pT() + antisvj.momentum().pT();
      double delta_jets_n = delta_jets/ total_pt;

      _h["met"]->fill(met);
      _h["ht"]->fill(sumpt);
      _h["difphi"]->fill(difphi);
      _h["ptbal"]->fill(delta_jets_n);

      int i=0;
      int j=0;
      if(inRange(delta_jets_n, 0.0, 0.6)) i=0;
      if(inRange(delta_jets_n, 0.6, 0.9)) i=1;
      if(inRange(delta_jets_n, 0.9, 1.0)) i=2;
      if(inRange(difphi, 0.0, 2.0)) j=0;
      if(inRange(difphi, 2.0, 2.7)) j=1;
      if(inRange(difphi, 2.7, 3.2)) j=2;
      int binindex = 3*i + j + 1;
      _h["ninebin"]->fill(binindex);
    }


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

      for (auto& hist : _h) {
        for (size_t i=0; i < hist.second->numBins(); ++i) {
          double bW = hist.second->bin(i).xWidth();
          hist.second->bin(i).scaleW(bW);
        }
      }

      double norm = 139*crossSection()/femtobarn/sumOfWeights();
      scale(_h, norm);
    }

    /// @}


  private:

    /// Histograms
    map<string, Histo1DPtr> _h;

  };


  RIVET_DECLARE_PLUGIN(ATLAS_2023_I2663256);

}