Rivet analyses

Dimuon invariant mass in OS and SS channel.

Experiment: ALEPH (LEP)

Inspire ID: 1492968

Status: UNVALIDATED

Authors: - Arno Heister

References: none listed

Beams: e+ e-

Beam energies: (45.6, 45.6)GeV

Run details: - Z to bbar events, 1M events when running Z to bbar inclusively.

Measurement of the dimuon invariant mass (OS and SS) and related quantities in Z to bbar events with ALEPH archived data.

Source code:ALEPH_2016_I1492968.cc

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

namespace Rivet {

  // TODO this calculation needs checked!
  double impact(const FourMomentum& a, const FourMomentum& b) {
    const Vector3 a3 = a.vector3();
    const Vector3 b3 = b.vector3();

    double impact = 0;
    if (b3.polarRadius() !=0) {
      impact = (a3).cross((a3-b3)).polarRadius() / (b3).polarRadius();
    }
    return impact;
  }

  /// @brief Add a short analysis description here
  class ALEPH_2016_I1492968 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ALEPH_2016_I1492968);


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

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

      // Initialise and register projections
      const FinalState fs;
      declare(fs, "FS");

      FastJets jets(fs, JetAlg::GENKTEE, 0.5, JetMuons::NONE, JetInvisibles::ALL);
      //FastJets jets(fs, JetAlg::ANTIKT, 0.5, JetMuons::NONE, JetInvisibles::ALL);
      declare(jets, "Jets");

      IdentifiedFinalState mu_id(fs);
      mu_id.acceptIdPair(PID::MUON);
      declare(mu_id, "MUONS");

      declare(MissingMomentum(fs), "MissingMomenta");
      // Book histograms
      //_h_costheta = bookHisto1D(2, 1, 1);
      book(_h_m_OS, 3, 1, 1);
      book(_h_m_SS, 5, 1, 1);

    }


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

      // B-jets
      const Jets jets = apply<JetFinder>(event, "Jets").jetsByPt(Cuts::pT > 5*GeV); // tODO jet eta?
      const Jets bjets = select(jets,  [](const Jet& j) { return j.bTagged(); });
      if (bjets.size()<2) vetoEvent;

      // Muons
      const Particles all_muons = apply<IdentifiedFinalState>(event, "MUONS").particles(Cuts::pT>2.5/GeV, cmpMomByE);
      const Particles b_muons = select(all_muons, [](const Particle& m) {return cos(m.theta()) < 0.7; });
      if (b_muons.size()<2) vetoEvent;

      // Missing energy cut
      const MissingMomentum& met = apply<MissingMomentum>(event, "MissingMomenta");
      double Pmiss = met.missingMomentum().p();
      if (Pmiss/GeV>18) vetoEvent;

      // Impact paarameter considerations
      double b_muon_0_impactdistance = min(impact(b_muons[0].origin(), bjets[0].momentum()),impact(b_muons[0].origin(), bjets[1].momentum()));
      double b_muon_1_impactdistance = min(impact(b_muons[1].origin(), bjets[0].momentum()),impact(b_muons[1].origin(), bjets[1].momentum()));

      // Impact parameter cut
      if ((b_muon_0_impactdistance > 0.1) || (b_muon_1_impactdistance > 0.1)) vetoEvent;

      FourMomentum dimuon = b_muons[0].momentum() + b_muons[1].momentum();

      // Same sign
      if (b_muons[0].charge()*b_muons[1].charge()>0) {
        _h_m_SS->fill( dimuon.mass()/GeV);
      }
      // Opposite sign
      else {
        _h_m_OS->fill( dimuon.mass()/GeV);
        //
        //FourMomentum muonminus;
        //if (b_muons[0].charge() < 0)  muonminus = b_muons[0].momentum();
        //else muonminus = b_muons[1].momentum();

        //const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(-dimuon.betaVec());
        //FourMomentum boostedmuon = cms_boost.transform(muonminus);

        //double cosmuonboosted = boostedmuon.vector3().dot(cms_boost.betaVec())
          /// (boostedmuon.vector3().mod()*cms_boost.betaVec().mod());

        //_h_costheta->fill( cosmuonboosted);
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {

      //normalize(_h_costheta);

      // Normalize to data according to Arno.
      normalize(_h_m_OS, 1387);
      normalize(_h_m_SS, 1047);

    }

    /// @}


    /// @name Histograms
    /// @{
    //Histo1DPtr _h_costheta;
    Histo1DPtr _h_m_OS;
    Histo1DPtr _h_m_SS;
    /// @}


  };


  RIVET_DECLARE_PLUGIN(ALEPH_2016_I1492968);


}