Rivet analyses referenceCLEOC_2008_I769777$q^2$ spectra in semi-leptonic $D$ decaysExperiment: CLEOC (CESR) Inspire ID: 769777 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the $q^2$ spectra for semi-leptonic $D$ meson decays by CLEOC. Source code: CLEOC_2008_I769777.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief D -> pi,K semi-leptonic q^2
9 class CLEOC_2008_I769777 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOC_2008_I769777);
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 book(_h_q2_D0_pi,1,1,1);
26 book(_h_q2_Dp_pi,1,1,2);
27 book(_h_q2_D0_K ,1,1,3);
28 book(_h_q2_Dp_K ,1,1,4);
29 book(_nD0,"TMP/nD0");
30 book(_nDp,"TMP/nDp");
31 }
32
33 // Calculate the Q2 using mother and daugher meson
34 double q2(const Particle& B, int mesonID) {
35 FourMomentum q = B.mom() - select(B.children(), Cuts::abspid==abs(mesonID))[0];
36 return q*q;
37 }
38
39 // Check for explicit decay into pdgids
40 bool isSemileptonicDecay(const Particle& mother, vector<int> ids) {
41 // Trivial check to ignore any other decays but the one in question modulo photons
42 const Particles children = mother.children(Cuts::pid!=PID::PHOTON);
43 if (children.size()!=ids.size()) return false;
44 // Check for the explicit decay
45 return all(ids, [&](int i){return count(children, hasPID(i))==1;});
46 }
47
48 /// Perform the per-event analysis
49 void analyze(const Event& event) {
50 // Loop over D mesons
51 for(const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==PID::D0 or
52 Cuts::abspid==PID::DPLUS )) {
53 if (p.abspid()==PID::D0) {
54 _nD0->fill();
55 if(isSemileptonicDecay(p, {PID::PIMINUS, PID::POSITRON, PID::NU_E}) ||
56 isSemileptonicDecay(p, {PID::PIPLUS , PID::ELECTRON, PID::NU_EBAR}) )
57 _h_q2_D0_pi->fill(q2(p, PID::PIMINUS));
58 else if(isSemileptonicDecay(p, {PID::KMINUS, PID::POSITRON, PID::NU_E}) ||
59 isSemileptonicDecay(p, {PID::KPLUS , PID::ELECTRON, PID::NU_EBAR}))
60 _h_q2_D0_K ->fill(q2(p, PID::KMINUS));
61 }
62 else if(p.abspid()==PID::DPLUS) {
63 _nDp->fill();
64 if(isSemileptonicDecay(p, {PID::PI0, PID::POSITRON, PID::NU_E}) ||
65 isSemileptonicDecay(p, {PID::PI0, PID::ELECTRON, PID::NU_EBAR}))
66 _h_q2_Dp_pi->fill(q2(p, PID::PI0));
67 else if(isSemileptonicDecay(p, {-311, PID::POSITRON, PID::NU_E}))
68 _h_q2_Dp_K ->fill(q2(p, -311));
69 else if(isSemileptonicDecay(p, { 311, PID::ELECTRON, PID::NU_EBAR}))
70 _h_q2_Dp_K ->fill(q2(p, 311));
71 else if(isSemileptonicDecay(p, {PID::K0S, PID::POSITRON, PID::NU_E}) ||
72 isSemileptonicDecay(p, {PID::K0S, PID::ELECTRON, PID::NU_EBAR}))
73 _h_q2_Dp_K ->fill(q2(p, PID::K0S));
74 else if(isSemileptonicDecay(p, {PID::K0L, PID::POSITRON, PID::NU_E}) ||
75 isSemileptonicDecay(p, {PID::K0L, PID::ELECTRON, PID::NU_EBAR}))
76 _h_q2_Dp_K ->fill(q2(p, PID::K0L));
77 }
78 }
79 }
80
81
82 /// Normalise histograms etc., after the run
83 void finalize() {
84 scale(_h_q2_D0_pi,100./ *_nD0);
85 scale(_h_q2_D0_K ,100./ *_nD0);
86 scale(_h_q2_Dp_pi,100./ *_nDp);
87 scale(_h_q2_Dp_K ,100./ *_nDp);
88 }
89
90 /// @}
91
92
93 /// @name Histograms
94 /// @{
95 Histo1DPtr _h_q2_D0_pi, _h_q2_D0_K, _h_q2_Dp_pi, _h_q2_Dp_K;
96 CounterPtr _nD0,_nDp;
97 /// @}
98
99
100 };
101
102
103 RIVET_DECLARE_PLUGIN(CLEOC_2008_I769777);
104
105}
|