rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2012_CONF_2012_153

4 or more lepton plus missing transverse energy SUSY search
Experiment: ATLAS (LHC)
Status: PRELIMINARY
Authors:
  • Peter Richardson
References: Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • BSM signal events at 8000 GeV.

Search for SUSY using events with 4 or more leptons in association with missing transverse energy in proton-proton collisions at a centre-of-mass energy of 8 TeV. The data sample has a total integrated luminosity of 13.0 fb$^{-1}$. There is no reference data and in addition to the control plots from the paper the number of events in the two signal regions, correctly normalized to an integrated luminosity 13.0 fb$^{-1}$, are calculated.

Source code: ATLAS_2012_CONF_2012_153.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/ChargedFinalState.hh"
  5#include "Rivet/Projections/VisibleFinalState.hh"
  6#include "Rivet/Projections/VetoedFinalState.hh"
  7#include "Rivet/Projections/IdentifiedFinalState.hh"
  8#include "Rivet/Projections/FastJets.hh"
  9#include "Rivet/Tools/RivetMT2.hh"
 10
 11namespace Rivet {
 12
 13
 14  class ATLAS_2012_CONF_2012_153 : public Analysis {
 15  public:
 16
 17    /// @name Constructors etc.
 18    /// @{
 19
 20    /// Constructor
 21    ATLAS_2012_CONF_2012_153()
 22      : Analysis("ATLAS_2012_CONF_2012_153")
 23    {    }
 24
 25    /// @}
 26
 27
 28
 29  public:
 30
 31    /// @name Analysis methods
 32    /// @{
 33
 34    /// Book histograms and initialise projections before the run
 35    void init() {
 36
 37      // projection to find the electrons
 38      IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 10*GeV);
 39      elecs.acceptIdPair(PID::ELECTRON);
 40      declare(elecs, "elecs");
 41
 42
 43      // projection to find the muons
 44      IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
 45      muons.acceptIdPair(PID::MUON);
 46      declare(muons, "muons");
 47
 48      // for pTmiss
 49      declare(VisibleFinalState(Cuts::abseta < 4.9), "vfs");
 50
 51      VetoedFinalState vfs;
 52      vfs.addVetoPairId(PID::MUON);
 53
 54      /// Jet finder
 55      declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");
 56
 57      // all tracks (to do deltaR with leptons)
 58      declare(ChargedFinalState(Cuts::abseta < 3.0), "cfs");
 59
 60      vector<double> edges_meff;
 61      edges_meff.push_back(   0);
 62      edges_meff.push_back( 150);
 63      edges_meff.push_back( 300);
 64      edges_meff.push_back( 500);
 65      edges_meff.push_back(1000);
 66      edges_meff.push_back(1500);
 67
 68      vector<double> edges_eT;
 69      edges_eT.push_back(0);
 70      edges_eT.push_back(50);
 71      edges_eT.push_back(150);
 72      edges_eT.push_back(300);
 73      edges_eT.push_back(500);
 74
 75      // Book histograms
 76      book(_hist_electrons ,"hist_electrons_before", 11, -0.5,10.5);
 77      book(_hist_muons     ,"hist_muons_before"    , 11, -0.5,10.5);
 78      book(_hist_leptons   ,"hist_leptons_before"  , 11, -0.5,10.5);
 79      book(_hist_4leptons  ,"hist_4leptons", 1, 0.,1.);
 80      book(_hist_veto      ,"hist_veto", 1, 0., 1.);
 81      book(_hist_etmiss    ,"hist_etmiss",edges_eT);
 82      book(_hist_meff      ,"hist_m_eff",edges_meff);
 83      book(_count_SR1      ,"count_SR1", 1, 0., 1.);
 84      book(_count_SR2      ,"count_SR2", 1, 0., 1.);
 85
 86    }
 87
 88
 89    /// Perform the per-event analysis
 90    void analyze(const Event& event) {
 91      // get the jet candidates
 92      Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.5);
 93
 94      // candidate muons
 95      Particles cand_mu = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
 96
 97      // candidate electrons
 98      // Discard if two electrons are within R=0.1
 99      Particles temp = apply<IdentifiedFinalState>(event, "elecs").particles(cmpMomByE);
100      vector<bool> vetoed(temp.size(),false);
101      Particles cand_e;
102      for (size_t ix = 0; ix < temp.size(); ++ix) {
103        if (vetoed[ix]) continue;
104        for (size_t iy = ix+1; iy < temp.size(); ++iy) {
105          if ( deltaR(temp[ix], temp[iy]) < 0.1 ) vetoed[iy] = true;
106        }
107        if (!vetoed[ix]) cand_e.push_back(temp[ix]);
108      }
109
110      // Sort by transverse momentum
111      sortByPt(cand_e);
112
113      // resolve jet/lepton ambiguity
114      Jets recon_jets;
115      for ( const Jet& jet : cand_jets ) {
116        bool away_from_e = true;
117        for ( const Particle& e : cand_e ) {
118          if (deltaR(e, jet) <= 0.2) {
119            away_from_e = false;
120            break;
121          }
122        }
123        if (away_from_e) recon_jets.push_back( jet );
124      }
125
126      // only keep electrons more than R=0.4 from jets
127      Particles cand2_e;
128      for (const Particle& e : cand_e) {
129        // at least 0.4 from any jets
130        bool away = true;
131        for ( const Jet& jet : recon_jets ) {
132          if ( deltaR(e, jet) < 0.4 ) {
133            away = false;
134            break;
135          }
136        }
137        // if isolated keep it
138        if ( away )
139          cand2_e.push_back( e );
140      }
141
142      // only keep muons more than R=0.4 from jets
143      Particles cand2_mu;
144      for(const Particle & mu : cand_mu ) {
145        bool away = true;
146        // at least 0.4 from any jets
147        for ( const Jet& jet : recon_jets ) {
148          if ( deltaR(mu, jet) < 0.4 ) {
149            away = false;
150            break;
151          }
152        }
153        if (away) cand2_mu.push_back( mu );
154      }
155
156      // electron and muon more than 0.1 apart
157      Particles cand3_e;
158      for ( const Particle & e : cand2_e ) {
159        bool away = true;
160        for( const Particle & mu : cand2_mu ) {
161          if( deltaR(e, mu) < 0.1) {
162            away = false;
163            break;
164          }
165        }
166        if (away) cand3_e.push_back(e);
167      }
168      Particles cand3_mu;
169      for( const Particle & mu : cand2_mu ) {
170        bool away = true;
171        for ( const Particle & e : cand2_e ) {
172          if( deltaR(e, mu) < 0.1) {
173            away = false;
174            break;
175          }
176        }
177        if (away) cand3_mu.push_back(mu);
178      }
179
180      // pTmiss
181      Particles vfs_particles =
182        apply<VisibleFinalState>(event, "vfs").particles();
183      FourMomentum pTmiss;
184      for ( const Particle & p : vfs_particles ) {
185        pTmiss -= p.momentum();
186      }
187      double eTmiss = pTmiss.pT();
188
189      // apply electron isolation
190      Particles chg_tracks =
191        apply<ChargedFinalState>(event, "cfs").particles();
192      Particles cand4_e;
193      for (const Particle& e : cand3_e) {
194        // charge isolation
195        double pTinCone = -e.pT();
196        for (const Particle& track : chg_tracks) {
197          if (track.pT() > 0.4*GeV && deltaR(e, track) <= 0.3 )
198            pTinCone += track.pT();
199        }
200        if (pTinCone/e.pT() > 0.16) continue;
201        // all particles isolation
202        pTinCone = -e.pT();
203        for (const Particle& p : vfs_particles) {
204          if (p.abspid() != PID::MUON && deltaR(e, p) <= 0.3 )
205            pTinCone += p.pT();
206        }
207        if (pTinCone/e.pT() < 0.18) cand4_e.push_back(e);
208      }
209
210      // apply muon isolation
211      Particles cand4_mu;
212      for ( const Particle & mu : cand3_mu ) {
213        double pTinCone = -mu.perp();
214        for ( const Particle & track : chg_tracks ) {
215          if (track.pT() > 1*GeV && deltaR(mu, track) <= 0.3)
216            pTinCone += track.pT();
217        }
218        if (pTinCone/mu.pT() < 0.12) cand4_mu.push_back(mu);
219      }
220
221      // same SOSF pairs m>12.
222      Particles recon_e;
223      for(const Particle& e : cand4_e) {
224        bool veto = false;
225        for(const Particle& e2 : cand4_e) {
226          if (e.pid()*e2.pid() < 0 && (e.momentum()+e2.momentum()).mass() < 12*GeV) {
227            veto = true;
228            break;
229          }
230        }
231        if (!veto) recon_e.push_back(e);
232      }
233      Particles recon_mu;
234      for(const Particle& mu : cand4_mu) {
235        bool veto = false;
236        for(const Particle& mu2 : cand4_mu) {
237          if (mu.pid()*mu2.pid() < 0 && (mu.momentum()+mu2.momentum()).mass() < 12*GeV) {
238            veto = true;
239            break;
240          }
241        }
242        if (!veto) recon_mu.push_back(mu);
243      }
244
245      // now only use recon_jets, recon_mu, recon_e
246      _hist_electrons->fill(recon_e.size());
247      _hist_muons->fill(recon_mu.size());
248      _hist_leptons->fill(recon_mu.size() + recon_e.size());
249      if (recon_mu.size() + recon_e.size() > 3) {
250        _hist_4leptons->fill(0.5);
251      }
252
253      // reject events with less than 4 electrons and muons
254      if (recon_mu.size() + recon_e.size() < 4) {
255        MSG_DEBUG("To few charged leptons left after selection");
256        vetoEvent;
257      }
258
259
260      // or two lepton trigger
261      bool passDouble =
262        (recon_mu.size()>=2 && ( (recon_mu[1].pT()>14*GeV) ||
263                                 (recon_mu[0].pT()>18*GeV && recon_mu[1].perp() > 10*GeV) )) ||
264        (recon_e.size() >=2 && ( (recon_e [1].pT()>14*GeV) ||
265                                 (recon_e [0].pT()>25*GeV && recon_e [1].perp() > 10*GeV) )) ||
266        (!recon_e.empty() && !recon_mu.empty() &&
267         ( (recon_e[0].pT() > 14*GeV && recon_mu[0].pT() > 10*GeV)||
268           (recon_e[0].pT() > 10*GeV && recon_mu[0].pT() > 18*GeV) ));
269
270      // must pass a trigger
271      if (!passDouble ) {
272        MSG_DEBUG("Hardest lepton fails trigger");
273        _hist_veto->fill(0.5);
274        vetoEvent;
275      }
276
277      // calculate meff
278      double meff = eTmiss;
279      for ( const Particle & e  : recon_e  ) meff += e.perp();
280      for ( const Particle & mu : recon_mu ) meff += mu.perp();
281      for ( const Jet & jet : recon_jets ) {
282        const double pT = jet.pT();
283        if (pT > 40*GeV) meff += pT;
284      }
285
286      // 2/3 leptons --> find 1 SFOS pair in range and veto event
287      // 4+  leptons --> find 2 SFOS pairs and in range veto event
288      for (size_t ix = 0; ix < recon_e.size(); ++ix) {
289        for (size_t iy = ix+1; iy < recon_e.size(); ++iy) {
290          if (recon_e[ix].pid()*recon_e[iy].pid() > 0) continue;
291          const FourMomentum ppair = recon_e[ix].momentum() + recon_e[iy].momentum();
292          if (inRange(ppair.mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
293
294          // check triplets with electron
295          for (size_t iz = 0; iz < recon_e.size(); ++iz) {
296            if (iz == ix || iz == iy) continue;
297            if (inRange((ppair+recon_e[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
298          }
299
300          // check triplets with muon
301          for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
302            if (inRange((ppair+recon_mu[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
303          }
304
305          // check quadruplets with electrons
306          for (size_t iz = 0; iz < recon_e.size(); ++iz) {
307            for (size_t iw = iz+1; iw < recon_e.size(); ++iw) {
308              if (iz==ix || iz==iy || iw==ix || iw==iy) continue;
309              if (recon_e[iz].pid()*recon_e[iw].pid() > 0) continue;
310              if (inRange((ppair+recon_e[iz].momentum()+recon_e[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
311            }
312          }
313          // check quadruplets with muons
314          for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
315            for (size_t iw = iz+1; iw < recon_mu.size(); ++iw) {
316              if (recon_mu[iz].pid()*recon_mu[iw].pid() > 0) continue;
317              if (inRange((ppair+recon_mu[iz].momentum()+recon_mu[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
318            }
319          }
320        }
321      }
322
323      // Muon pairs
324      for (size_t ix = 0; ix < recon_mu.size(); ++ix) {
325        for (size_t iy = ix+1; iy < recon_mu.size(); ++iy) {
326          if (recon_mu[ix].pid()*recon_mu[iy].pid()>0) continue;
327          const FourMomentum ppair = recon_mu[ix].momentum()+recon_mu[iy].momentum();
328          if (inRange(ppair.mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
329
330          // check triplets with muon
331          for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
332            if (iz==ix || iz==iy) continue;
333            if (inRange((ppair+recon_mu[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
334          }
335
336          // check triplets with electron
337          for (size_t iz = 0; iz < recon_e.size(); ++iz) {
338            if (inRange((ppair+recon_e[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
339          }
340
341          // check muon quadruplets
342          for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
343            for (size_t iw = iz+1; iy < recon_mu.size(); ++iy) {
344              if (iz==ix || iz==iy || iw==ix || iw==iy) continue;
345              if (recon_mu[iz].pid()*recon_mu[iw].pid() > 0) continue;
346              if (inRange((ppair+recon_mu[iz].momentum()+recon_mu[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
347            }
348          }
349        }
350      }
351
352      // Make the control plots
353      _hist_etmiss->fill(eTmiss);
354      _hist_meff  ->fill(meff  );
355      // Finally the counts
356      if (eTmiss > 50*GeV) _count_SR1->fill(0.5);
357      if (meff  >0*GeV) _count_SR2->fill(0.5);
358
359    }
360
361    /// @}
362
363    void finalize() {
364      double norm = crossSection()/femtobarn*13./sumOfWeights();
365      scale(_hist_etmiss,norm*20.);
366      scale(_hist_meff  ,norm*20.);
367      scale(_count_SR1,norm);
368      scale(_count_SR2,norm);
369    }
370
371
372  private:
373
374    /// @name Histograms
375    /// @{
376    Histo1DPtr _hist_electrons;
377    Histo1DPtr _hist_muons;
378    Histo1DPtr _hist_leptons;
379    Histo1DPtr _hist_4leptons;
380    Histo1DPtr _hist_veto;
381    Histo1DPtr _hist_etmiss;
382    Histo1DPtr _hist_meff;
383    Histo1DPtr _count_SR1;
384    Histo1DPtr _count_SR2;
385    /// @}
386
387  };
388
389  RIVET_DECLARE_PLUGIN(ATLAS_2012_CONF_2012_153);
390
391}