Rivet analyses referenceBESIII_2017_I1519425Differential decay rates for D+→{ˉK0,π0}e+νe from BESExperiment: BESIII (BEPC II) Inspire ID: 1519425 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Differential decay rates for semileptonic D+→ˉK0,π0e+νe decays Source code: BESIII_2017_I1519425.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief Differential decay rates for $D^+\to \{\bar{K}^0,\pi^0\} e^+\nu_e$ from BES
9 class BESIII_2017_I1519425 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2017_I1519425);
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
25 // Book histograms
26 book(_h_q2_K , 1, 1, 1);
27 book(_h_q2_pi, 2, 1, 1);
28
29 }
30
31 // Calculate the Q2 using mother and daugher meson
32 double q2(const Particle& B, int mesonID) {
33 FourMomentum q = B.mom() - select(B.children(), Cuts::pid==mesonID)[0];
34 return q*q;
35 }
36
37 // Check for explicit decay into pdgids
38 bool isSemileptonicDecay(const Particle& mother, vector<int> ids) {
39 // Trivial check to ignore any other decays but the one in question modulo photons
40 const Particles children = mother.children(Cuts::pid!=PID::PHOTON);
41 if (children.size()!=ids.size()) return false;
42 // Check for the explicit decay
43 return all(ids, [&](int i){return count(children, hasPID(i))==1;});
44 }
45
46 /// Perform the per-event analysis
47 void analyze(const Event& event) {
48
49 // Loop over D+/- mesons
50 for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==PID::DPLUS)) {
51 if (isSemileptonicDecay(p, {PID::PI0, PID::POSITRON, PID::NU_E}) ||
52 isSemileptonicDecay(p, {PID::PI0, PID::ELECTRON, PID::NU_EBAR})) {
53 _h_q2_pi->fill(q2(p, PID::PI0));
54 }
55 else if(isSemileptonicDecay(p, {-311, PID::POSITRON, PID::NU_E})) {
56 _h_q2_K ->fill(q2(p, -311));
57 }
58 else if(isSemileptonicDecay(p, { 311, PID::ELECTRON, PID::NU_EBAR})) {
59 _h_q2_K ->fill(q2(p, 311));
60 }
61 else if(isSemileptonicDecay(p, {PID::K0S, PID::POSITRON, PID::NU_E}) ||
62 isSemileptonicDecay(p, {PID::K0S, PID::ELECTRON, PID::NU_EBAR})) {
63 _h_q2_K ->fill(q2(p, PID::K0S));
64 }
65 else if(isSemileptonicDecay(p, {PID::K0L, PID::POSITRON, PID::NU_E}) ||
66 isSemileptonicDecay(p, {PID::K0L, PID::ELECTRON, PID::NU_EBAR})) {
67 _h_q2_K ->fill(q2(p, PID::K0L));
68 }
69 }
70
71 }
72
73
74 /// Normalise histograms etc., after the run
75 void finalize() {
76 // normalize to unity
77 normalize(_h_q2_K );
78 normalize(_h_q2_pi);
79
80 }
81
82 /// @}
83
84
85 /// @name Histograms
86 /// @{
87 Histo1DPtr _h_q2_K,_h_q2_pi;
88 /// @}
89
90
91 };
92
93
94 RIVET_DECLARE_PLUGIN(BESIII_2017_I1519425);
95
96
97}
|