Rivet analyses referenceCLEO_1997_I443704Exclusive semileptonic $B$ to $D$ decays.Experiment: CLEO (CESR) Inspire ID: 443704 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of the differential partial width with respect to $w$ for $B$ to $D$ semi-leptonic decays. Source code: CLEO_1997_I443704.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief B -> D semileptonic
9 class CLEO_1997_I443704 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(CLEO_1997_I443704);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21 // projection
22 declare(UnstableParticles(Cuts::pid==511 || Cuts::pid==521), "UFS");
23 // histograms
24 book(_h,1,1,1);
25 book(_c,"TMP/nB");
26 }
27
28 // Check for explicit decay into pdgids
29 bool isSemileptonicDecay(const Particle& mother, vector<int> ids) {
30 // Trivial check to ignore any other decays but the one in question modulo photons
31 const Particles children = mother.children(Cuts::pid!=PID::PHOTON);
32 if (children.size()!=ids.size()) return false;
33 // Check for the explicit decay
34 return all(ids, [&](int i){return count(children, hasPID(i))==1;});
35 }
36
37 // Calculate the recoil w using mother and daugher meson
38 double recoilW(const Particle& B, int mesonID) {
39 // TODO why does that not work with const?
40 Particle D = select(B.children(), Cuts::pid==mesonID)[0];
41 FourMomentum q = B.mom() - D.mom();
42 return (B.mom()*B.mom() + D.mom()*D.mom() - q*q )/ (2. * sqrt(B.mom()*B.mom()) * sqrt(D.mom()*D.mom()) );
43 }
44
45 /// Perform the per-event analysis
46 void analyze(const Event& event) {
47 const double tau[2] = {1.519e-3,1.638e-3};
48 for(const Particle& p : apply<UnstableParticles>(event, "UFS").particles()) {
49 if (p.children().size()<=1) continue;
50 if (p.pid()==PID::BPLUS) {
51 _c->fill();
52 if (isSemileptonicDecay(p, {PID::D0BAR,PID::POSITRON,PID::NU_E})) _h->fill(recoilW(p, PID::D0BAR),1./tau[1]);
53 if (isSemileptonicDecay(p, {PID::D0BAR,PID::ANTIMUON,PID::NU_MU})) _h->fill(recoilW(p, PID::D0BAR),1./tau[1]);
54 }
55 else if (p.pid()==PID::B0) {
56 _c->fill();
57 if (isSemileptonicDecay(p, {PID::DMINUS,PID::POSITRON,PID::NU_E})) _h->fill(recoilW(p, PID::DMINUS),1./tau[0]);
58 if (isSemileptonicDecay(p, {PID::DMINUS,PID::ANTIMUON,PID::NU_MU})) _h->fill(recoilW(p, PID::DMINUS),1./tau[0]);
59 }
60 }
61 }
62
63
64 /// Normalise histograms etc., after the run
65 void finalize() {
66 scale(_h,0.5/ *_c);
67 }
68
69 /// @}
70
71
72 /// @name Histograms
73 /// @{
74 Histo1DPtr _h;
75 CounterPtr _c;
76 /// @}
77
78
79 };
80
81
82 RIVET_DECLARE_PLUGIN(CLEO_1997_I443704);
83
84}
|