Rivet analyses

b-jets search for supersymmetry with 0- and 1-leptons

Experiment: ATLAS (LHC)

Inspire ID: 1095236

Status: UNVALIDATED

Authors: - Peter Richardson

References: - Expt page: ATLAS-SUSY-2011-27 - arXiv: 1203.6193

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 zero or one leptons. Event counts in six zero lepton and two one lepton signal regions are implemented as one-bin histograms. Histograms for missing transverse energy, and effective mass are also implemented for some signal regions.

Source code:ATLAS_2012_I1095236.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/VetoedFinalState.hh"
#include "Rivet/Projections/VisibleFinalState.hh"
#include "Rivet/Tools/Random.hh"

namespace Rivet {


  /// @author Peter Richardson
  class ATLAS_2012_I1095236 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2012_I1095236);


    /// @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
      VetoedFinalState vfs;
      vfs.addVetoPairId(PID::MUON);
      declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");

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

      // Used for pTmiss
      declare(VisibleFinalState((Cuts::etaIn(-4.9, 4.9))), "vfs");

      // Book histograms
      book(_count_SR0_A1, "count_SR0_A1", 1, 0., 1.);
      book(_count_SR0_B1, "count_SR0_B1", 1, 0., 1.);
      book(_count_SR0_C1, "count_SR0_C1", 1, 0., 1.);
      book(_count_SR0_A2, "count_SR0_A2", 1, 0., 1.);
      book(_count_SR0_B2, "count_SR0_B2", 1, 0., 1.);
      book(_count_SR0_C2, "count_SR0_C2", 1, 0., 1.);
      book(_count_SR1_D, "count_SR1_D", 1, 0., 1.);
      book(_count_SR1_E, "count_SR1_E", 1, 0., 1.);

      book(_hist_meff_SR0_A1, "hist_m_eff_SR0_A1", 14, 400., 1800.);
      book(_hist_meff_SR0_A2, "hist_m_eff_SR0_A2", 14, 400., 1800.);
      book(_hist_meff_SR1_D_e, "hist_meff_SR1_D_e", 16, 600., 2200.);
      book(_hist_meff_SR1_D_mu, "hist_meff_SR1_D_mu", 16, 600., 2200.);

      book(_hist_met_SR0_A1, "hist_met_SR0_A1", 14, 0., 700.);
      book(_hist_met_SR0_A2, "hist_met_SR0_A2", 14, 0., 700.);
      book(_hist_met_SR0_D_e, "hist_met_SR1_D_e", 15, 0., 600.);
      book(_hist_met_SR0_D_mu, "hist_met_SR1_D_mu", 15, 0., 600.);
    }


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

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

      const Particles cand_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();

      const Particles cand_mu = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
      // Resolve jet-lepton overlap for jets with |eta| < 2.8
      Jets recon_jets;
      for (const Jet& jet : cand_jets) {
        if (fabs(jet.eta()) >= 2.8) continue;
        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) recon_jets.push_back(jet);
      }

      // get the loose leptons used to define the 0 lepton channel
      Particles loose_e, loose_mu;
      for (const Particle& e : cand_e) {
        bool away = true;
        for (const Jet& jet : recon_jets) {
          if (deltaR(e.momentum(), jet.momentum()) < 0.4) {
            away = false;
            break;
          }
        }
        if (away) loose_e.push_back(e);
      }
      for (const Particle& mu : cand_mu) {
        bool away = true;
        for (const Jet& jet : recon_jets) {
          if (deltaR(mu.momentum(), jet.momentum()) < 0.4) {
            away = false;
            break;
          }
        }
        if (away) loose_mu.push_back(mu);
      }
      // tight leptons for the 1-lepton channel
      Particles tight_mu;
      Particles chg_tracks = apply<ChargedFinalState>(event, "cfs").particles();
      for (const Particle& mu : loose_mu) {
        if (mu.perp() < 20.) continue;
        double pTinCone = -mu.pT();
        for (const Particle& track : chg_tracks) {
          if (deltaR(mu.momentum(), track.momentum()) <= 0.2) pTinCone += track.pT();
        }
        if (pTinCone < 1.8 * GeV) tight_mu.push_back(mu);
      }
      Particles tight_e;
      for (const Particle& e : loose_e) {
        if (e.perp() < 25.) continue;
        double pTinCone = -e.perp();
        for (const Particle& track : chg_tracks) {
          if (deltaR(e.momentum(), track.momentum()) <= 0.2) pTinCone += track.pT();
        }
        if (pTinCone / e.perp() < 0.1) {
          tight_e.push_back(e);
        }
      }

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

      // get the number of b-tagged jets
      unsigned int ntagged = 0;
      for (const Jet& jet : recon_jets) {
        if (jet.perp() > 50. && abs(jet.eta()) < 2.5 && jet.bTagged() && rand01() <= 0.60) ++ntagged;
      }

      // ATLAS calo problem
      if (rand01() <= 0.42) {
        for (const Jet& jet : recon_jets) {
          double eta = jet.rapidity();
          double phi = jet.azimuthalAngle(MINUSPI_PLUSPI);
          if (jet.perp() > 50 && eta > -0.1 && eta < 1.5 && phi > -0.9 && phi < -0.5) vetoEvent;
        }
      }

      // at least 1 b tag
      if (ntagged == 0) vetoEvent;

      // minumum Et miss
      if (eTmiss < 80.) vetoEvent;

      // at least 3 jets pT > 50
      if (recon_jets.size() < 3 || recon_jets[2].perp() < 50.) vetoEvent;

      // m_eff
      double m_eff = eTmiss;
      for (unsigned int ix = 0; ix < 3; ++ix) m_eff += recon_jets[ix].perp();

      // delta Phi
      double min_dPhi = 999.999;
      double pTmiss_phi = pTmiss.phi();
      for (unsigned int ix = 0; ix < 3; ++ix) {
        min_dPhi = min(min_dPhi, deltaPhi(pTmiss_phi, recon_jets[ix].phi()));
      }

      // 0-lepton channels
      if (loose_e.empty() && loose_mu.empty() && recon_jets[0].perp() > 130. && eTmiss > 130.
          && eTmiss / m_eff > 0.25 && min_dPhi > 0.4) {
        // jet charge cut
        bool jetCharge = true;
        for (unsigned int ix = 0; ix < 3; ++ix) {
          if (fabs(recon_jets[ix].eta()) > 2.) continue;
          double trackpT = 0;
          for (const Particle& p : recon_jets[ix].particles()) {
            if (PID::charge3(p.pid()) == 0) continue;
            trackpT += p.perp();
          }
          if (trackpT / recon_jets[ix].perp() < 0.05) jetCharge = false;
        }
        if (jetCharge) {
          // SR0-A region
          if (m_eff > 500.) {
            _count_SR0_A1->fill(0.5);
            _hist_meff_SR0_A1->fill(m_eff);
            _hist_met_SR0_A1->fill(eTmiss);
            if (ntagged >= 2) {
              _count_SR0_A2->fill(0.5);
              _hist_meff_SR0_A2->fill(m_eff);
              _hist_met_SR0_A2->fill(eTmiss);
            }
          }
          // SR0-B
          if (m_eff > 700.) {
            _count_SR0_B1->fill(0.5);
            if (ntagged >= 2) _count_SR0_B2->fill(0.5);
          }
          // SR0-C
          if (m_eff > 900.) {
            _count_SR0_C1->fill(0.5);
            if (ntagged >= 2) _count_SR0_C2->fill(0.5);
          }
        }
      }

      // 1-lepton channels
      if (tight_e.size() + tight_mu.size() == 1 && recon_jets.size() >= 4 && recon_jets[3].perp() > 50.
          && recon_jets[0].perp() > 60.) {
        Particle lepton = tight_e.empty() ? tight_mu[0] : tight_e[0];
        m_eff += lepton.perp() + recon_jets[3].perp();
        // transverse mass cut
        double mT = 2. * (lepton.perp() * eTmiss - lepton.px() * pTmiss.px() - lepton.py() * pTmiss.py());
        mT = sqrt(mT);
        if (mT > 100. && m_eff > 700.) {
          // D region
          _count_SR1_D->fill(0.5);
          if (lepton.abspid() == PID::ELECTRON) {
            _hist_meff_SR1_D_e->fill(m_eff);
            _hist_met_SR0_D_e->fill(eTmiss);
          }
          else {
            _hist_meff_SR1_D_mu->fill(m_eff);
            _hist_met_SR0_D_mu->fill(eTmiss);
          }
          // E region
          if (eTmiss > 200.) {
            _count_SR1_E->fill(0.5);
          }
        }
      }
    }


    void finalize() {

      double norm = crossSection() / femtobarn * 2.05 / sumOfWeights();
      // these are number of events at 2.05fb^-1 per 100 GeV
      scale(_hist_meff_SR0_A1, 100. * norm);
      scale(_hist_meff_SR0_A2, 100. * norm);
      scale(_hist_meff_SR1_D_e, 100. * norm);
      scale(_hist_meff_SR1_D_mu, 100. * norm);
      // these are number of events at 2.05fb^-1 per 50 GeV
      scale(_hist_met_SR0_A1, 50. * norm);
      scale(_hist_met_SR0_A2, 40. * norm);
      // these are number of events at 2.05fb^-1 per 40 GeV
      scale(_hist_met_SR0_D_e, 40. * norm);
      scale(_hist_met_SR0_D_mu, 40. * norm);
      // these are number of events at 2.05fb^-1
      scale(_count_SR0_A1, norm);
      scale(_count_SR0_B1, norm);
      scale(_count_SR0_C1, norm);
      scale(_count_SR0_A2, norm);
      scale(_count_SR0_B2, norm);
      scale(_count_SR0_C2, norm);
      scale(_count_SR1_D, norm);
      scale(_count_SR1_E, norm);
    }

    /// @}


  private:

    Histo1DPtr _count_SR0_A1;
    Histo1DPtr _count_SR0_B1;
    Histo1DPtr _count_SR0_C1;
    Histo1DPtr _count_SR0_A2;
    Histo1DPtr _count_SR0_B2;
    Histo1DPtr _count_SR0_C2;
    Histo1DPtr _count_SR1_D;
    Histo1DPtr _count_SR1_E;

    Histo1DPtr _hist_meff_SR0_A1;
    Histo1DPtr _hist_meff_SR0_A2;
    Histo1DPtr _hist_meff_SR1_D_e;
    Histo1DPtr _hist_meff_SR1_D_mu;
    Histo1DPtr _hist_met_SR0_A1;
    Histo1DPtr _hist_met_SR0_A2;
    Histo1DPtr _hist_met_SR0_D_e;
    Histo1DPtr _hist_met_SR0_D_mu;
  };


  RIVET_DECLARE_PLUGIN(ATLAS_2012_I1095236);

}