Rivet analyses referenceBABAR_2012_I1125973Semi-leptonic $B$ to $\pi$, $\omega$ and $\eta$ decaysExperiment: BABAR (PEP-II) Inspire ID: 1125973 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Implementation of Lorentz invariant $q^2$ distributions ("form factor") for semileptonic $B^0$ and $B^+$ decays. Includes $\pi$, $\omega$ and $\eta$ decays. Source code: BABAR_2012_I1125973.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief B -> pi, eta and omega decays
9 class BABAR_2012_I1125973 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2012_I1125973);
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(Cuts::pid==PID::BPLUS || Cuts::pid==PID::B0), "UFS");
24
25 // histograms
26 for(unsigned int ix=0;ix<2;++ix) {
27 book(_h_B0_pi[ix], 1, 1, ix+1);
28 book(_h_Bp_pi[ix], 2, 1, ix+1);
29 book(_nB[ix],"TMP/nB_"+toString(ix+1));
30 }
31 book(_h_omega,3,1,1);
32 book(_h_eta ,4,1,1);
33 }
34
35 // Calculate the Q2 using mother and daughter charged lepton
36 double q2(const Particle& B, int mesonID) {
37 FourMomentum q = B.mom() - select(B.children(), Cuts::pid==mesonID)[0];
38 return q*q;
39 }
40
41 // Check for explicit decay into pdgids
42 bool isSemileptonicDecay(const Particle& mother, vector<int> ids) {
43 // Trivial check to ignore any other decays but the one in question modulo photons
44 const Particles children = mother.children(Cuts::pid!=PID::PHOTON);
45 if (children.size()!=ids.size()) return false;
46 // Check for the explicit decay
47 return all(ids, [&](int i){return count(children, hasPID(i))==1;});
48 }
49
50 /// Perform the per-event analysis
51 void analyze(const Event& event) {
52 // Get B+ Mesons
53 for(const Particle& p : apply<UnstableParticles>(event, "UFS").particles()) {
54 if( p.pid()==PID::B0) {
55 _nB[0]->fill();
56 if (isSemileptonicDecay(p, {PID::PIMINUS, PID::POSITRON, PID::NU_E}) ||
57 isSemileptonicDecay(p, {PID::PIMINUS, PID::ANTIMUON, PID::NU_MU})) {
58 double Q2 = q2(p,PID::PIMINUS);
59 _h_B0_pi[0]->fill(Q2);
60 _h_B0_pi[1]->fill(Q2);
61 }
62 }
63 else {
64 _nB[1]->fill();
65 if (isSemileptonicDecay(p, {PID::PI0, PID::POSITRON, PID::NU_E}) ||
66 isSemileptonicDecay(p, {PID::PI0, PID::ANTIMUON, PID::NU_MU})) {
67 double Q2 = q2(p,PID::PI0);
68 _h_Bp_pi[0]->fill(Q2);
69 _h_Bp_pi[1]->fill(Q2);
70 }
71 else if (isSemileptonicDecay(p, {PID::OMEGA, PID::POSITRON, PID::NU_E}) ||
72 isSemileptonicDecay(p, {PID::OMEGA, PID::ANTIMUON, PID::NU_MU})) {
73 _h_omega->fill(q2(p,PID::OMEGA));
74 }
75 else if (isSemileptonicDecay(p, {PID::ETA, PID::POSITRON, PID::NU_E}) ||
76 isSemileptonicDecay(p, {PID::ETA, PID::ANTIMUON, PID::NU_MU})) {
77 _h_eta->fill(q2(p,PID::ETA));
78 }
79 }
80 }
81 }
82
83
84 /// Normalise histograms etc., after the run
85 void finalize() {
86 // BR in units of 10^{-7}
87 for(unsigned int ix=0;ix<2;++ix) {
88 scale(_h_B0_pi[ix], 1e7/ *_nB[0]);
89 scale(_h_Bp_pi[ix], 1e7/ *_nB[1]);
90 }
91 scale(_h_omega,1e7/ *_nB[1]);
92 scale(_h_eta ,1e7/ *_nB[1]);
93 }
94
95 /// @}
96
97
98 /// @name Histograms
99 /// @{
100 CounterPtr _nB[2];
101 Histo1DPtr _h_B0_pi[2],_h_Bp_pi[2],_h_omega,_h_eta;
102 /// @}
103
104
105 };
106
107
108 RIVET_DECLARE_PLUGIN(BABAR_2012_I1125973);
109
110}
|