Rivet analyses

b-jets search for supersymmetry with 0-leptons

Experiment: ATLAS (LHC)

Inspire ID: 1204184

Status: OBSOLETE

Authors: - Angela Chen

References: - ATLAS_2011_CONF_2011_098

Beams: p+ p+

Beam energies: (3500.0, 3500.0)GeV

Run details: - BSM signal events at 7000 GeV.

Search for supersymmmetric particles by ATLAS at 7 TeV in events with b-jets, large missing energy, and no leptons. Event counts in four signal regions (1 b-jet, meff > 500,GeV; 1 b-jet, meff > 700,GeV; 2 b-jets, meff > 500,GeV; 2 b-jets, meff > 700,GeV) are implemented as one-bin histograms. Histograms for missing transverse energy, effective mass, and pT of the leading jet are implemented for the 1 b-tag and 2 b-tag signal regions.

Source code:ATLAS_2011_CONF_2011_098.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/IdentifiedFinalState.hh"
#include "Rivet/Projections/VisibleFinalState.hh"
#include "Rivet/Tools/Random.hh"

namespace Rivet {


  class ATLAS_2011_CONF_2011_098 : public Analysis {
  public:

    /// Constructor
    ATLAS_2011_CONF_2011_098()
        : Analysis("ATLAS_2011_CONF_2011_098"),
          //debug variables
          threeJA(0),
          threeJB(0),
          threeJC(0),
          threeJD(0),
          bj(0),
          jets(0),
          zerolept(0),
          eTmisscut(0) { }


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

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

      // projection to find the electrons
      IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 20 * GeV);
      elecs.acceptIdPair(PID::ELECTRON);
      declare(elecs, "elecs");


      // projection to find the muons
      IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10 * GeV);
      muons.acceptIdPair(PID::MUON);
      declare(muons, "muons");

      /// Jet finder
      declare(FastJets(FinalState(), JetAlg::ANTIKT, 0.4), "AntiKtJets04");


      // all tracks (to do deltaR with leptons)
      declare(ChargedFinalState(Cuts::abseta < 3.0), "cfs");

      // for pTmiss
      declare(VisibleFinalState(Cuts::abseta < 4.9), "vfs");


      /// Book histograms
      book(_count_threeJA, "count_threeJA", 1, 0., 1.);
      book(_count_threeJB, "count_threeJB", 1, 0., 1.);
      book(_count_threeJC, "count_threeJC", 1, 0., 1.);
      book(_count_threeJD, "count_threeJD", 1, 0., 1.);
      book(_hist_meff_1bjet, "meff_1bjet", 32, 0., 1600.);
      book(_hist_eTmiss_1bjet, "eTmiss_1bjet", 6, 0., 600.);
      book(_hist_pTj_1bjet, "pTjet_1bjet", 20, 0., 800.);
      book(_hist_meff_2bjet, "meff_2bjet", 32, 0., 1600.);
      book(_hist_eTmiss_2bjet, "eTmiss_2bjet", 6, 0., 600.);
      book(_hist_pTj_2bjet, "pTjet_2bjet", 20, 0., 800.);
    }


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


      // Temp: calorimeter module failure with 10% acceptance loss;
      // region unknown ==> randomly choose 10% of events to be vetoed

      if (rand01() < 0.1) vetoEvent;

      Jets tmp_cand_jets = apply<FastJets>(event, "AntiKtJets04")
                               .jetsByPt(Cuts::pT > 20 * GeV && Cuts::abseta < 2.8);

      Particles cand_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
      Particles cand_mu = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
      Particles chg_tracks = apply<ChargedFinalState>(event, "cfs").particles();

      //cerr << "cand_e.size(): " << cand_e.size() << "   cand_mu.size(): " << cand_mu.size() << '\n';


      Jets cand_jets;
      for (const Jet& jet : tmp_cand_jets) {
        if (fabs(jet.eta()) >= 2.8)
          cand_jets.push_back(jet);
        else {
          bool away_from_e = true;
          for (const Particle& e : cand_e) {
            if (deltaR(e.momentum(), jet.momentum()) <= 0.2) {
              away_from_e = false;
              break;
            }
          }
          if (away_from_e) cand_jets.push_back(jet);
        }
      }

      Particles cand_lept;

      bool isolated_e;
      for (const Particle& e : cand_e) {
        isolated_e = true;
        for (const Jet& jet : cand_jets) {
          if (deltaR(e.momentum(), jet.momentum()) < 0.4) isolated_e = false;
        }
        if (isolated_e == true) cand_lept.push_back(e);
      }


      bool isolated_mu;
      for (const Particle& mu : cand_mu) {
        isolated_mu = true;
        for (const Jet& jet : cand_jets) {
          if (deltaR(mu.momentum(), jet.momentum()) < 0.4) isolated_mu = false;
        }
        if (isolated_mu == true) cand_lept.push_back(mu);
      }


      // pTmiss
      Particles vfs_particles = apply<VisibleFinalState>(event, "vfs").particles();
      FourMomentum pTmiss;
      for (const Particle& p : vfs_particles) {
        pTmiss -= p.momentum();
      }
      double eTmiss = pTmiss.pT();


      // bjets
      Jets bjets, recon_jets;
      for (const Jet& j : cand_jets) {
        if (fabs(j.eta()) <= 2.8) {
          recon_jets.push_back(j);
          if (fabs(j.eta()) <= 2.5 && j.perp() > 50. && j.bTagged() && rand01() < 0.5) bjets.push_back(j);
        }
      }

      if (bjets.empty()) {
        MSG_DEBUG("No b-jet axes in acceptance");
        vetoEvent;
      }

      ++bj;


      // Jets event selection
      if (recon_jets.size() < 3) vetoEvent;
      if (recon_jets[0].pT() <= 130 * GeV) vetoEvent;
      if (recon_jets[1].pT() <= 50 * GeV || recon_jets[2].pT() <= 50 * GeV) vetoEvent;
      ++jets;

      // eTmiss cut
      if (eTmiss <= 130 * GeV) vetoEvent;

      ++eTmisscut;

      // 0-lepton requirement
      if (!cand_lept.empty()) vetoEvent;
      ++zerolept;

      // m_eff cut
      double m_eff = eTmiss + recon_jets[0].pT() + recon_jets[1].pT() + recon_jets[2].pT();

      if (eTmiss / m_eff <= 0.25) vetoEvent;


      // min_dPhi
      double min_dPhi = 999.999;
      for (int i = 0; i < 3; ++i) {
        double dPhi = deltaPhi(pTmiss.phi(), recon_jets[i].phi());
        min_dPhi = min(min_dPhi, dPhi);
      }

      if (min_dPhi <= 0.4) vetoEvent;


      // ==================== FILL ====================


      // 1 bjet
      if (bjets.size() >= 1) {

        _hist_meff_1bjet->fill(m_eff);
        _hist_eTmiss_1bjet->fill(eTmiss);
        _hist_pTj_1bjet->fill(recon_jets[0].pT());

        // 3JA region
        if (m_eff > 200 * GeV) {
          ++threeJA;
          _count_threeJA->fill(0.5);
        }

        // 3JB region
        if (m_eff > 700 * GeV) {
          ++threeJB;
          _count_threeJB->fill(0.5);
        }
      }

      // 2 bjets
      if (bjets.size() >= 2) {

        _hist_meff_2bjet->fill(m_eff);
        _hist_eTmiss_2bjet->fill(eTmiss);
        _hist_pTj_2bjet->fill(recon_jets[0].pT());

        // 3JC region
        if (m_eff > 500 * GeV) {
          ++threeJC;
          _count_threeJC->fill(0.5);
        }

        // 3JD region
        if (m_eff > 700 * GeV) {
          ++threeJD;
          _count_threeJD->fill(0.5);
        }
      }
    }

    /// @}


    void finalize() {
      scale(_hist_meff_1bjet, 50. * 830. * crossSection() / picobarn / sumOfWeights());
      scale(_hist_eTmiss_1bjet, 100. * 830. * crossSection() / picobarn / sumOfWeights());
      scale(_hist_pTj_1bjet, 40. * 830. * crossSection() / picobarn / sumOfWeights());
      scale(_hist_meff_2bjet, 50. * 830. * crossSection() / picobarn / sumOfWeights());
      scale(_hist_eTmiss_2bjet, 100. * 830. * crossSection() / picobarn / sumOfWeights());
      scale(_hist_pTj_2bjet, 40. * 830. * crossSection() / picobarn / sumOfWeights());

      // cerr<< '\n'<<'\n'
      // << "Saw "
      // << bj << " events aft bjets cut, "
      // << jets << " events aft jet cuts, "
      // << eTmisscut << " events aft eTmiss cut, "
      // << zerolept << " events after 0-lept cut. "
      // << '\n'
      // << threeJA << " 3JA events, "
      // << threeJB << " 3JB events, "
      // << threeJC << " 3JC events, "
      // << threeJD << " 3JD events. "
      // << '\n'
      // ;
    }


  private:

    /// @name Histograms
    /// @{
    Histo1DPtr _count_threeJA;
    Histo1DPtr _count_threeJB;
    Histo1DPtr _count_threeJC;
    Histo1DPtr _count_threeJD;
    Histo1DPtr _hist_meff_1bjet;
    Histo1DPtr _hist_eTmiss_1bjet;
    Histo1DPtr _hist_pTj_1bjet;
    Histo1DPtr _hist_meff_2bjet;
    Histo1DPtr _hist_eTmiss_2bjet;
    Histo1DPtr _hist_pTj_2bjet;

    /// @}


    // debug variables
    int threeJA;
    int threeJB;
    int threeJC;
    int threeJD;
    int bj;
    int jets;
    int zerolept;
    int eTmisscut;
  };


  RIVET_DECLARE_PLUGIN(ATLAS_2011_CONF_2011_098);

}