rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ALEPH_2016_I1492968

Dimuon invariant mass in OS and SS channel.
Experiment: ALEPH (LEP)
Inspire ID: 1492968
Status: UNVALIDATED
Authors:
  • Arno Heister
No references 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
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/IdentifiedFinalState.hh"
  6#include "Rivet/Projections/MissingMomentum.hh"
  7
  8namespace Rivet {
  9
 10  // TODO this calculation needs checked!
 11  double impact(const FourMomentum& a, const FourMomentum& b) {
 12    const Vector3 a3 = a.vector3();
 13    const Vector3 b3 = b.vector3();
 14
 15    double impact = 0;
 16    if (b3.polarRadius() !=0) {
 17      impact = (a3).cross((a3-b3)).polarRadius() / (b3).polarRadius();
 18    }
 19    return impact;
 20  } 
 21  
 22  /// @brief Add a short analysis description here
 23  class ALEPH_2016_I1492968 : public Analysis {
 24  public:
 25
 26    /// Constructor
 27    RIVET_DEFAULT_ANALYSIS_CTOR(ALEPH_2016_I1492968);
 28
 29
 30    /// @name Analysis methods
 31    //@{
 32
 33    /// Book histograms and initialise projections before the run
 34    void init() {
 35
 36      // Initialise and register projections
 37      const FinalState fs;
 38      declare(fs, "FS");
 39
 40      FastJets jets(fs, FastJets::GENKTEE, 0.5, JetAlg::Muons::NONE, JetAlg::Invisibles::ALL);
 41      //FastJets jets(fs, FastJets::ANTIKT, 0.5, JetAlg::Muons::NONE, JetAlg::Invisibles::ALL);
 42      declare(jets, "Jets");
 43
 44      IdentifiedFinalState mu_id(fs);
 45      mu_id.acceptIdPair(PID::MUON);
 46      declare(mu_id, "MUONS");
 47  
 48      declare(MissingMomentum(fs), "MissingMomenta");      
 49      // Book histograms
 50      //_h_costheta = bookHisto1D(2, 1, 1);
 51      book(_h_m_OS, 3, 1, 1);
 52      book(_h_m_SS, 5, 1, 1);
 53
 54    }
 55
 56
 57    /// Perform the per-event analysis
 58    void analyze(const Event& event) {
 59
 60      // B-jets
 61      const Jets jets = apply<JetAlg>(event, "Jets").jetsByPt(Cuts::pT > 5*GeV); // tODO jet eta?
 62      const Jets bjets = filter_select(jets,  [](const Jet& j) { return j.bTagged(); });
 63      if (bjets.size()<2) vetoEvent;
 64
 65      // Muons
 66      const Particles all_muons = applyProjection<IdentifiedFinalState>(event, "MUONS").particles(Cuts::pT>2.5/GeV, cmpMomByE);
 67      const Particles b_muons = filter_select(all_muons, [](const Particle& m) {return cos(m.theta()) < 0.7; });
 68      if (b_muons.size()<2) vetoEvent;
 69
 70      // Missing energy cut
 71      const MissingMomentum& met = applyProjection<MissingMomentum>(event, "MissingMomenta");
 72      double Pmiss = met.missingMomentum().p();
 73      if (Pmiss/GeV>18) vetoEvent;
 74    
 75      // Impact paarameter considerations
 76      double b_muon_0_impactdistance = min(impact(b_muons[0].origin(), bjets[0].momentum()),impact(b_muons[0].origin(), bjets[1].momentum()));
 77      double b_muon_1_impactdistance = min(impact(b_muons[1].origin(), bjets[0].momentum()),impact(b_muons[1].origin(), bjets[1].momentum()));
 78
 79      // Impact parameter cut
 80      if ((b_muon_0_impactdistance > 0.1) || (b_muon_1_impactdistance > 0.1)) vetoEvent;
 81      
 82      FourMomentum dimuon = b_muons[0].momentum() + b_muons[1].momentum();
 83      
 84      // Same sign
 85      if (b_muons[0].charge()*b_muons[1].charge()>0) {
 86        _h_m_SS->fill( dimuon.mass()/GeV);
 87      }
 88      // Opposite sign
 89      else {
 90        _h_m_OS->fill( dimuon.mass()/GeV);
 91        //
 92        //FourMomentum muonminus;
 93        //if (b_muons[0].charge() < 0)  muonminus = b_muons[0].momentum();
 94        //else muonminus = b_muons[1].momentum();
 95        
 96        //const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(-dimuon.betaVec());
 97        //FourMomentum boostedmuon = cms_boost.transform(muonminus);
 98
 99        //double cosmuonboosted = boostedmuon.vector3().dot(cms_boost.betaVec())
100          /// (boostedmuon.vector3().mod()*cms_boost.betaVec().mod());
101
102        //_h_costheta->fill( cosmuonboosted);
103      }
104    }
105
106
107    /// Normalise histograms etc., after the run
108    void finalize() {
109
110      //normalize(_h_costheta);
111
112      // Normalize to data according to Arno.
113      normalize(_h_m_OS, 1387);
114      normalize(_h_m_SS, 1047);
115
116    }
117
118    //@}
119
120
121    /// @name Histograms
122    //@{
123    //Histo1DPtr _h_costheta;
124    Histo1DPtr _h_m_OS;
125    Histo1DPtr _h_m_SS;
126    //@}
127
128
129  };
130
131
132  // The hook for the plugin system
133  RIVET_DECLARE_PLUGIN(ALEPH_2016_I1492968);
134
135
136}