rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CLEO_1997_I443704

Exclusive semileptonic $B$ to $D$ decays.
Experiment: CLEO (CESR)
Inspire ID: 443704
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 79 (1997) 2208-2212
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B mesons, originally Upslion(4S) decay

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}