Rivet analyses referenceATLAS_2023_I2663256Semivisible jets t-channel searchExperiment: ATLAS (ATLAS) Inspire ID: 2663256 Status: VALIDATED Authors:
Beam energies: (6500.0, 6500.0) GeV Run details:
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}
|