rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2019_I1712742

Semileptonic $D_s^+\to \eta e^+\nu_e$ and $\eta^\prime e^+\nu_e$ decays
Experiment: BESIII (BEPC)
Inspire ID: 1712742
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 122 (2019) 12, 121801
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing D_s mesons

Differential decay rates for semileptonic $D_s^+\to \eta e^+\nu_e$ and $\eta^\prime e^+\nu_e$ decays

Source code: BESIII_2019_I1712742.cc
 1// -*- C++ -*-
 2#include "Rivet/Analysis.hh"
 3#include "Rivet/Projections/UnstableParticles.hh"
 4
 5namespace Rivet {
 6
 7
 8  /// @brief D_s -> eta, eta' semi-leptonic
 9  class BESIII_2019_I1712742 : public Analysis {
10  public:
11
12    /// Constructor
13    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2019_I1712742);
14
15
16    /// @name Analysis methods
17    /// @{
18
19    /// Book histograms and initialise projections before the run
20    void init() {
21
22      // Initialise and register projections
23      declare(UnstableParticles(), "UFS");
24      // histograms
25      for(unsigned int ix=0;ix<2;++ix)
26	for(unsigned int iy=0;iy<2;++iy)
27	  book(_h[ix][iy],ix+1,1,iy+1);
28      // counter for normalization
29      book(_nDs, "TMP/nDs");
30    }
31
32    // Calculate the Q2 using mother and daugher meson
33    double q2(const Particle& B, int mesonID) {
34      FourMomentum q = B.mom() - select(B.children(), Cuts::pid==mesonID)[0];
35      return q*q;
36    }
37    
38    // Check for explicit decay into pdgids
39    bool isSemileptonicDecay(const Particle& mother, vector<int> ids) {
40      // Trivial check to ignore any other decays but the one in question modulo photons
41      const Particles children = mother.children(Cuts::pid!=PID::PHOTON);
42      if (children.size()!=ids.size()) return false;
43      // Check for the explicit decay
44      return all(ids, [&](int i){return count(children, hasPID(i))==1;});
45    }
46
47    /// Perform the per-event analysis
48    void analyze(const Event& event) {
49      // Loop over Ds mesons
50      for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::pid==431)) {
51	_nDs->fill();
52        if (isSemileptonicDecay(p, {PID::ETA, PID::POSITRON, PID::NU_E})) {
53          _h[0][0]->fill(q2(p, PID::ETA));
54          _h[0][1]->fill(q2(p, PID::ETA));
55        }
56	else if(isSemileptonicDecay(p, {PID::ETAPRIME, PID::POSITRON, PID::NU_E})) {
57          _h[1][0] ->fill(q2(p, PID::ETAPRIME));
58          _h[1][1] ->fill(q2(p, PID::ETAPRIME));
59        }
60      }
61    }
62
63
64    /// Normalise histograms etc., after the run
65    void finalize() {
66      // D_s lifetime pdg2018 (ns)
67      double tau = 504e-6;
68      for(unsigned int ix=0;ix<2;++ix)
69	for(unsigned int iy=0;iy<2;++iy)
70	  scale(_h[ix][iy],1./tau/ *_nDs);
71    }
72
73    /// @}
74
75
76    /// @name Histograms
77    /// @{
78    CounterPtr _nDs;
79    Histo1DPtr _h[2][2];
80    /// @}
81
82
83  };
84
85
86  RIVET_DECLARE_PLUGIN(BESIII_2019_I1712742);
87
88}