Rivet analyses

1-lepton and 2-lepton search for first or second generation leptoquarks

Experiment: ATLAS (LHC)

Inspire ID: 897002

Status: OBSOLETE

Authors: - Angela Chen

References: - Expt page: ATLAS-EXOT-2010-08 - arXiv: 1104.4481

Beams: p+ p+

Beam energies: (3500.0, 3500.0)GeV

Run details: - BSM signal events at 7000 GeV.

Single and dilepton search for first and second generation scalar leptoquarks by ATLAS at 7 TeV. Event counts in four signal regions (single lepton and dilepton for first and second generation) are implemented as one-bin histograms. Histograms for event transverse energy are implemented for dilepton signal regions and histograms for leptoquark mass are implemented for single lepton signal regions. Histograms for observables in six control regions are implemented.

Source code:ATLAS_2011_I897002.cc

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

namespace Rivet {


  /// 1-lepton and 2-lepton search for first or second generation leptoquarks
  class ATLAS_2011_I897002 : public Analysis {
  public:

    /// Constructor
    ATLAS_2011_I897002()
      : Analysis("ATLAS_2011_I897002"),
        // DEBUG
        count(0), vetoe(0), Njetscut(0), //dilept(0),
        candmumujj(0), candeejj(0), //onelept(0),
        eTmisscut(0), candmvjj(0), candevjj(0),
        mumujj(0), eejj(0),
        mTonelept(0), MLQonelept(0), MtLQonelept(0), Stvonelept(0),
        mTev(0), MLQev(0), MtLQev(0), Stvev(0),
        muvjj(0), evjj(0), emuvjj(0),
        cande(0), candmu(0),
        tmpe(0), tmpmu(0),
        mumuZCR(0), eeZCR(0),
        munuW2CR(0), munuttCR(0),
        enuW2CR(0), enuttCR(0)
    {    }


    /// Book histograms and initialize 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");

      // veto region electrons
      Cut vetocut = Cuts::absetaIn(1.35, 1.52);
      IdentifiedFinalState veto_elecs(vetocut && Cuts::pT > 10*GeV);
      veto_elecs.acceptIdPair(PID::ELECTRON);
      declare(veto_elecs, "veto_elecs");

      /// @todo Clean up DEBUG
      // projection to find all leptons
      IdentifiedFinalState all_mu_e;
      all_mu_e.acceptIdPair(PID::MUON);
      all_mu_e.acceptIdPair(PID::ELECTRON);
      declare(all_mu_e, "all_mu_e"); //debug

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

      // Jet finder
      VetoedFinalState vfs;
      vfs.addVetoPairDetail(PID::MUON, 20*GeV, 7000*GeV);
      vfs.addVetoPairDetail(PID::ELECTRON, 20*GeV, 7000*GeV);
      declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");

      // all tracks (to do deltaR with leptons)
      declare(ChargedFinalState(Cuts::abseta < 3 && Cuts::pT > 0.5*GeV), "cfs");

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

      /// Book histograms
      book(_count_mumujj ,"count_2muons_dijet", 1, 0., 1.);
      book(_count_eejj   ,"count_2elecs_dijet", 1, 0., 1.);
      book(_count_muvjj  ,"count_muon_neutrino_dijet", 1, 0., 1.);
      book(_count_evjj   ,"count_elec_neutrino_dijet", 1, 0., 1.);

      book(_hist_St_mumu ,"hist_mumujj_St", 10, 450., 1650.);
      book(_hist_St_ee   ,"hist_eejj_St", 10, 450., 1650.);
      book(_hist_MLQ_muv ,"hist_munujj_MLQ", 9, 150., 600.);
      book(_hist_MLQ_ev  ,"hist_enujj_MLQ", 9, 150., 600.);

      book(_hist_St_mumu_ZCR   ,"CR_Zjets_St_mumu", 40, 0., 800.);
      book(_hist_St_ee_ZCR     ,"CR_Zjets_Stee", 40, 0., 800.);
      book(_hist_MLQ_munu_W2CR ,"CR_W2jets_MLQ_munu", 20, 0., 400.);
      book(_hist_MLQ_enu_W2CR  ,"CR_W2jets_MLQ_enu", 20, 0., 400.);
      book(_hist_MLQ_munu_ttCR ,"CR_tt_MLQ_munu", 35, 0., 700.);
      book(_hist_MLQ_enu_ttCR  ,"CR_tt_MLQ_enu", 35, 0., 700.);

    }



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


      ///DEBUG
      count +=1; //cerr<< "Event " << count << '\n';
      // debug

      Particles veto_e = apply<IdentifiedFinalState>(event, "veto_elecs").particles();
      if ( ! veto_e.empty() ) {
        MSG_DEBUG("electrons in veto region");
        vetoEvent;
      }
      ++vetoe;

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

      Particles candtemp_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
      Particles candtemp_mu = apply<IdentifiedFinalState>(event,"muons").particlesByPt();
      Particles cand_mu;
      Particles cand_e;
      Particles vfs_particles = apply<VisibleFinalState>(event, "vfs").particles();


      // pTcone around muon track
      for ( const Particle & mu : candtemp_mu ) {
        ++tmpmu;
        double pTinCone = -mu.pT();
        for ( const Particle & track : vfs_particles ) {
          if ( deltaR(mu.momentum(),track.momentum()) < 0.2 )
            pTinCone += track.pT();
        }
        if ( pTinCone/mu.pT() < 0.25 )
          ++candmu;
        cand_mu.push_back(mu);
      }

      // pTcone around electron
      for ( const Particle & e : candtemp_e ) {
        ++tmpe;
        double pTinCone = -e.pT();
        for ( const Particle & track : vfs_particles ) {
          if ( deltaR(e.momentum(),track.momentum()) < 0.2 )
            pTinCone += track.pT();
        }
        if ( pTinCone/e.pT() < 0.2 )
          ++cande;
        cand_e.push_back(e);
      }

      if ( cand_e.empty() && cand_mu.empty() ) {
        //cerr<<" ->Event vetoed. No candidate lept"<<'\n';
        vetoEvent;
      }


      //DEBUG
      // else{
      // for (const Particle & mu,  cand_mu) {
      //   cerr << "cand mu: " << "Id " << mu.pid() << "      eta " << mu.eta() << "      pT " << mu.pT() << '\n';
      // }
      // for (const Particle & lepton,  cand_e) {
      //   cerr << "cand e: " << "Id " << lepton.pid() << "      eta " << lepton.eta() << "      pT " << lepton.pT() << '\n';
      // }} // debug



      // pTmiss
      FourMomentum pTmiss;
      for ( const Particle & p : vfs_particles ) {
        pTmiss -= p.momentum();
      }
      double eTmiss = pTmiss.pT();


      // discard jets that overlap with leptons
      Jets recon_jets;
      for ( const Jet& jet : cand_jets ) {
        bool away_from_lept = true;
        for ( const Particle & e : cand_e ) {
          if ( deltaR(e.momentum(),jet.momentum()) <= 0.5 ) {
            away_from_lept = false;
            break;
          }
        }
        for ( const Particle & mu : cand_mu ) {
          if ( deltaR(mu.momentum(),jet.momentum()) <= 0.5 ) {
            away_from_lept = false;
            break;
          }
        }
        if ( away_from_lept )
          recon_jets.push_back( jet );
      }



      //DEBUG
      // cerr << " Num of recon jets: " << recon_jets.size() << '\n';
      // cerr << " Num of cand e: " << cand_e.size() << '\n';
      // cerr << " Num of cand mu: " << cand_mu.size() << '\n';
      //debug



      // ================ OBSERVABLES ================


      // At least 2 hard jets
      if ( recon_jets.size() < 2 ) {
        //cerr << " ->Event vetoed. Not enough hard jets." << '\n';
        vetoEvent;
      }
      ++Njetscut;


      // Initialize variables for observables
      double M_ll=0., M_LQ=0., St_ll=0., Mt_LQ=0., St_v=0., mT=0.;
      FourMomentum p_l, p_l1, p_l2, p_j[2];
      p_j[0] = recon_jets[0].momentum();
      p_j[1] = recon_jets[1].momentum();

      Particles dilept_pair;
      bool single_lept = false;

      if ( cand_mu.size() == 2 && cand_e.empty() ) {
        ++candmumujj;
        for ( const Particle& mu : cand_mu )
          dilept_pair.push_back(mu);
      }
      else if ( cand_e.size() == 2 && cand_mu.empty() ) {
        ++candeejj;
        for ( const Particle& e : cand_e )
          dilept_pair.push_back(e);
      }
      else if ( cand_mu.size() == 1 && cand_e.empty() ) {
        ++candmvjj;
        p_l = cand_mu[0].momentum();
        single_lept = true;
      }
      else if ( cand_e.size() == 1 && cand_mu.empty() ) {
        ++candevjj;
        p_l = cand_e[0].momentum();
        single_lept = true;
      }

      // Dilepton channel observables
      if ( ! dilept_pair.empty() ) {

        double E_l1, E_l2, E_j1, E_j2;
        double tmpM_LQ1[2], tmpM_LQ2[2], M_LQDiff1, M_LQDiff2;

        p_l1 = dilept_pair[0].momentum();
        p_l2 = dilept_pair[1].momentum();
        E_l1 = p_l1.E();
        E_l2 = p_l2.E();

        E_j1 = p_j[0].E();
        E_j2 = p_j[1].E();

        // Calculate possible leptoquark mass M_LQ and reconstruct average M_LQ

        tmpM_LQ1[0] = E_l1 + E_j1;
        tmpM_LQ1[1] = E_l2 + E_j2;
        M_LQDiff1 = abs( tmpM_LQ1[0] - tmpM_LQ1[1] );

        tmpM_LQ2[0] = E_l1 + E_j2;
        tmpM_LQ2[1] = E_l2 + E_j1;
        M_LQDiff2 = abs( tmpM_LQ2[0] - tmpM_LQ2[1] );

        if ( M_LQDiff1 > M_LQDiff2 )
          M_LQ = ( tmpM_LQ2[0] + tmpM_LQ2[1] ) / 2;
        else
          M_LQ = ( tmpM_LQ1[0] + tmpM_LQ1[1] ) / 2;

        // Calculate event transverse energy St
        St_ll = p_l1.pT() + p_l2.pT() + p_j[0].pT() + p_j[1].pT();

        // Dilept pair invariant mass M_ll
        M_ll = E_l1 + E_l2;

      }

      // 1-lepton channel observables
      else if ( single_lept ) {

        double tmpM_LQ[2], tmpMt_LQ[2], dPhi_j[2], M_LQDiff1, M_LQDiff2;

        // List of possible M_LQ, Mt_LQ pairings

        for ( int i = 0; i < 2; ++i ) {
          tmpM_LQ[i] = p_l.E() + p_j[i].E();
          dPhi_j[1-i] = deltaPhi( p_j[1-i].phi(), pTmiss.phi() );
          tmpMt_LQ[i] = sqrt( 2 * p_j[1-i].pT() * eTmiss * (1 - cos( dPhi_j[1-i] )) );
        }

        // Choose pairing that gives smallest absolute difference

        M_LQDiff1 = abs( tmpM_LQ[0] - tmpMt_LQ[0] );
        M_LQDiff2 = abs( tmpM_LQ[1] - tmpMt_LQ[1] );

        if ( M_LQDiff1 > M_LQDiff2 ) {
          M_LQ = tmpM_LQ[1];
          Mt_LQ = tmpMt_LQ[1];
        }
        else {
          M_LQ = tmpM_LQ[0];
          Mt_LQ = tmpMt_LQ[0];
        }

        // Event transverse energy
        St_v = p_l.pT() + eTmiss + p_j[0].pT() + p_j[1].pT();

        // Transverse mass mT
        double dPhi_l = deltaPhi( p_l.phi(), pTmiss.phi());
        mT = sqrt( 2 * p_l.pT() * eTmiss * (1 - cos(dPhi_l)) );

      }


      // ============== CONTROL REGIONS ===============

      // mumujj, Z control region
      if ( cand_mu.size() == 2 ) {
        if ( M_ll >= 81*GeV && M_ll <= 101*GeV ) {
          ++mumuZCR;
          _hist_St_mumu_ZCR->fill(St_ll);
        }
      }
      // eejj, Z control region
      else if ( cand_e.size() == 2 ) {
        if ( M_ll >= 81*GeV && M_ll <= 101*GeV ) {
          ++eeZCR;
          _hist_St_ee_ZCR->fill(St_ll);

        }
      }

      if ( cand_mu.size() == 1 ) {
        // munujj, W+2jets control region
        if ( recon_jets.size() == 2 &&
             mT >= 40*GeV && mT <= 150*GeV ) {
          ++munuW2CR;
          _hist_MLQ_munu_W2CR->fill(M_LQ);
        }
        // munujj, tt control region
        if ( recon_jets.size() >= 4 &&
             recon_jets[0].pT() > 50*GeV && recon_jets[1].pT() > 40*GeV && recon_jets[2].pT() > 30*GeV ) {
          ++munuttCR;
          _hist_MLQ_munu_ttCR->fill(M_LQ);
        }
      }
      if ( cand_e.size() == 1 ) {
        // enujj, W+2jets control region
        if ( recon_jets.size() == 2 &&
             mT >= 40*GeV && mT <= 150*GeV ) {
          ++enuW2CR;
          _hist_MLQ_enu_W2CR->fill(M_LQ);
        }
        // enujj, tt control region
        if ( recon_jets.size() >= 4 &&
             recon_jets[0].pT() > 50*GeV && recon_jets[1].pT() > 40*GeV && recon_jets[2].pT() > 30*GeV ) {
          ++enuttCR;
          _hist_MLQ_enu_ttCR->fill(M_LQ);
        }
      }




      // ========= PRESELECTION =======================



      // Single lepton channel cuts
      if ( single_lept ) {

        if ( eTmiss <= 25*GeV ) {
          //cerr << " ->Event vetoed. eTmiss=" << eTmiss << '\n';
          vetoEvent;
        }
        ++eTmisscut;

        if ( mT <= 40*GeV )
          vetoEvent;

        //++mTcut;

        // enujj channel
        if ( cand_e.size() == 1 && cand_mu.empty() ) {

          // Triangle cut
          double dPhi_jet1 = deltaPhi( recon_jets[0].phi(), pTmiss.phi() );
          double dPhi_jet2 = deltaPhi( recon_jets[1].phi(), pTmiss.phi() );

          if ( dPhi_jet1 <= 1.5 * (1 - eTmiss/45) ||
               dPhi_jet2 <= 1.5 * (1 - eTmiss/45) ) {
            ++emuvjj;
            vetoEvent;
          }
        }
      }

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


      // mumujj channel
      if ( cand_mu.size() == 2 ) {
        if ( M_ll <= 120*GeV ||
             M_LQ <= 150*GeV ||
             p_l1.pT() <= 30*GeV || p_l2.pT() <= 30*GeV ||
             p_j[0].pT() <= 30*GeV || p_j[1].pT() <= 30*GeV ||
             St_ll <= 450*GeV ) {
          //cerr<<" ->Dilept event vetoed. Table 4 cuts." << '\n';
          vetoEvent;
        }
        else {


          ++mumujj;
          // cerr<< " ->MUMUJJ event selected." << '\n';
          _hist_St_mumu->fill(St_ll);
          _count_mumujj->fill(0.5);

        }
      }
      // eejj channel
      else if ( cand_e.size() == 2 ) {
        if ( M_ll <= 120*GeV ||
             M_LQ <= 150*GeV ||
             p_l1.pT() <= 30*GeV || p_l2.pT() <= 30*GeV ||
             p_j[0].pT() <= 30*GeV || p_j[1].pT() <= 30*GeV ||
             St_ll <= 450*GeV ) {
          //cerr<<" ->Dilept event vetoed. Table 4 cuts." << '\n';
          vetoEvent;
        }
        else {

          ++eejj;
          //cerr<< " ->EEJJ event selected." << '\n';
          _hist_St_ee->fill(St_ll);
          _count_eejj->fill(0.5);

        }
      }


      // muvjj channel
      else if ( cand_mu.size() == 1 ) {



        if (M_LQ<=150*GeV) {
          //cerr<<" ->muvjj event vetoed. Not enough M_LQ: " << M_LQ<< '\n';
          vetoEvent;
        }
        ++MLQonelept;
        if (Mt_LQ<=150*GeV) {
          //cerr<<" ->muvjj event vetoed. Not enough Mt_LQ: " << Mt_LQ<< '\n';
          vetoEvent;
        }
        ++MtLQonelept;
        if (St_v<=400*GeV) {
          //cerr<<" ->muvjj event vetoed. Not enough St_v: " << St_v<< '\n';
          vetoEvent;
        }
        ++Stvonelept;
        if (mT<=160*GeV) {
          //cerr<<" ->muvjj event vetoed. Not enough mT: " << mT<<'\n';
          vetoEvent;
        }
        ++mTonelept;
        //else {
        ++muvjj;
        //cerr<< " ->MUVJJ event selected." << '\n';
        _hist_MLQ_muv->fill(M_LQ);
        _count_muvjj->fill(0.5);

        //}
      }

      // evjj channel
      else if ( cand_e.size() == 1 ) {

        if (M_LQ<=180*GeV) {
          //cerr<<" ->evjj event vetoed. Not enough M_LQ: " << M_LQ<< '\n';
          vetoEvent;
        }
        ++MLQev;
        if (Mt_LQ<=180*GeV) {
          //cerr<<" ->evjj event vetoed. Not enough Mt_LQ: " << Mt_LQ<< '\n';
          vetoEvent;
        }
        ++MtLQev;
        if (St_v<=410*GeV) {
          //cerr<<" ->evjj event vetoed. Not enough St_v: " << St_v<< '\n';
          vetoEvent;
        }
        ++Stvev;
        if (mT<=200*GeV) {
          //cerr<<" ->evjj event vetoed. Not enough mT: " << mT<<'\n';
          vetoEvent;
        }
        ++mTev;
        //else {
        ++evjj;
        //cerr<< " ->EVJJ event selected." << '\n';
        _hist_MLQ_ev->fill(M_LQ);
        _count_evjj->fill(0.5);



        //      if ( mT <= 200*GeV ||
        //              M_LQ <= 180*GeV ||
        //              Mt_LQ <= 180*GeV ||
        //              St_v <= 410*GeV ) {
        // cerr<<" ->evjj event vetoed. Doesn't pass table 4 cuts." << '\n';
        //        vetoEvent;
        //      }
        //      else {
        // ++evjj;
        // cerr<< " ->EVJJ event selected." << '\n';
        // _hist_MLQ_ev->fill(M_LQ);
        //          _count_evjj->fill(0.5);

        //      }


      }


    }


    void finalize() {
      // cerr << '\n' << "Of " << count << " events, saw "
      // << vetoe << " (after veto region cut), "
      // << Njetscut << " (after 2jet req). "
      // << '\n'
      // << "For " << dilept << " dilept events: "
      // << candmumujj << " cand mumujj events, "
      // << candeejj << " cand eejj events."
      // << '\n'
      // << "For " << onelept << " onelept events: "
      // << candmvjj << " preselected mvjj events, "
      // << candevjj << " preselected evjj events; "
      // << eTmisscut << " (eTmiss req); "
      // << emuvjj << " leftover; "
      // << MLQonelept << " (muvjj M_LQ cut), "
      // << MtLQonelept << " (muvjj Mt_LQ cut), "
      // << Stvonelept << " (muvjj St_v cut), "
      // << mTonelept << " (muvjj mT cut); "
      // << MLQev << " (evjj M_LQ cut), "
      // << MtLQev << " (evjj Mt_LQ cut), "
      // << Stvev << " (evjj St_v cut), "
      // << mTev << " (evjj mT cut). "
      // << '\n'<<'\n'
      // ;
      // cerr << "CR - " << "mumu Z: " << mumuZCR << " ee Z: " << eeZCR << "
      // munu W+2jets: " << munuW2CR << " munu tt: " << munuttCR << " enu
      // W+2jets: " << enuW2CR << " enu tt: " << enuttCR << '\n';
      // cerr << "mumujj: " << mumujj << " eejj: " << eejj << " muvjj: " <<
      // muvjj << " evjj: " << evjj << '\n';

      scale( _hist_St_ee, 120. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_St_mumu, 120. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_muv, 50. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_ev, 50. * 35. * crossSection()/picobarn/sumOfWeights() );

      scale( _hist_St_mumu_ZCR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_St_ee_ZCR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_munu_W2CR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_enu_W2CR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_munu_ttCR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );
      scale( _hist_MLQ_enu_ttCR, 20. * 35. * crossSection()/picobarn/sumOfWeights() );

      // scale( _hist_eTmiss_mu, binwidth*luminosity* crossSection()/picobarn/sumOfWeights() );

    }


  private:

    /// @name Histograms
    /// @{
    Histo1DPtr _count_mumujj;
    Histo1DPtr _count_eejj;
    Histo1DPtr _count_muvjj;
    Histo1DPtr _count_evjj;

    Histo1DPtr _hist_St_mumu;
    Histo1DPtr _hist_St_ee;
    Histo1DPtr _hist_MLQ_muv;
    Histo1DPtr _hist_MLQ_ev;

    Histo1DPtr _hist_St_mumu_ZCR;
    Histo1DPtr _hist_St_ee_ZCR;
    Histo1DPtr _hist_MLQ_munu_W2CR;
    Histo1DPtr _hist_MLQ_enu_W2CR;
    Histo1DPtr _hist_MLQ_munu_ttCR;
    Histo1DPtr _hist_MLQ_enu_ttCR;
    /// @}


    // DEBUG VARIABLES
    int count, vetoe, Njetscut;
    int candmumujj, candeejj, eTmisscut, candmvjj, candevjj, mumujj, eejj;
    int mTonelept, MLQonelept, MtLQonelept, Stvonelept;
    int mTev, MLQev, MtLQev, Stvev;
    int muvjj, evjj, emuvjj, cande, candmu, tmpe, tmpmu;
    int mumuZCR, eeZCR, munuW2CR, munuttCR, enuW2CR, enuttCR;

  };


  RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2011_I897002, ATLAS_2011_S9041966);

}

Aliases: - ATLAS_2011_S9041966