Rivet analyses referenceCLEOII_2004_I647287Hadronic mass moments in $B\to X_c\ell\nu$ decaysExperiment: CLEOII () Inspire ID: 647287 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of hadronic mass moments in $B\to X_c\ell\nu$ decays. The data were taken from the tables in the paper. Source code: CLEOII_2004_I647287.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief B -> c l nu moments
9 class CLEOII_2004_I647287 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOII_2004_I647287);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21 // projections
22 declare(UnstableParticles(Cuts::abspid==511 || Cuts::abspid==521),"UFS");
23 // spin weighted average D and D* mass
24 _mD2 = sqr(0.125*(1.86966+1.86484)+0.375*(2.00685+2.01026));
25 // histograms
26 for (unsigned int ix=0; ix<2; ++ix) {
27 for (unsigned int iy=0; iy<4; ++iy) {
28 if (iy%2==1) {
29 book(_p[ix][iy],
30 "TMP/p_"+toString(ix)+"_"+toString(iy),
31 refData<YODA::BinnedEstimate<string>>(1,1+iy,1+ix));
32 }
33 else {
34 book(_p[ix][iy],1,+1+iy,1+ix);
35 }
36 }
37 }
38 book(_p_dist,2,1,1);
39 }
40
41 void findDecayProducts(const Particle& parent, Particles& em, Particles& ep,
42 Particles& nue, Particles& nueBar, bool & charm) {
43 for (const Particle& p : parent.children()) {
44 if (PID::isCharmHadron(p.pid())) {
45 charm=true;
46 }
47 else if (p.pid() == PID::EMINUS || p.pid()==PID::MUON) {
48 em.push_back(p);
49 }
50 else if (p.pid() == PID::EPLUS || p.pid()==PID::ANTIMUON) {
51 ep.push_back(p);
52 }
53 else if (p.pid() == PID::NU_E || p.pid()==PID::NU_MU) {
54 nue.push_back(p);
55 }
56 else if (p.pid() == PID::NU_EBAR || p.pid()==PID::NU_MUBAR) {
57 nueBar.push_back(p);
58 }
59 else if (PID::isBottomHadron(p.pid())) {
60 findDecayProducts(p,em,ep,nue,nueBar,charm);
61 }
62 else if (!PID::isHadron(p.pid())) {
63 findDecayProducts(p,em,ep,nue,nueBar,charm);
64 }
65 }
66 }
67
68 /// Perform the per-event analysis
69 void analyze(const Event& event) {
70 if(_edges.empty()) _edges=_p_dist->xEdges();
71 const double Ecut[2]={1.,1.5};
72 // find and loop over Upslion(4S)
73 for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles()) {
74 if (p.children().empty() ||
75 (p.children().size()==1 && p.children()[1].abspid()==p.abspid())) {
76 continue;
77 }
78 // find decay products
79 bool charm = false;
80 Particles em,ep,nue,nueBar;
81 findDecayProducts(p,em,ep,nue,nueBar,charm);
82 if (!charm) continue;
83 FourMomentum pl,pnu;
84 if (em.size()==1 && nueBar.size()==1 && em[0].pid()+1==-nueBar[0].pid()) {
85 pl = em[0].mom();
86 pnu = nueBar[0].mom();
87 }
88 else if (ep.size()==1 && nue.size()==1 && nue[0].pid()==-ep[0].pid()+1) {
89 pl = ep[0].mom();
90 pnu = nue[0].mom();
91 }
92 else {
93 continue;
94 }
95 // boost to rest frame
96 LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(p.mom().betaVec());
97 double q2 = (pl+pnu).mass2();
98 FourMomentum pX = boost.transform(p.mom()-pl-pnu);
99 pl = boost.transform(pl);
100 double mX2 = pX.mass2();
101 for (unsigned int ix=0;ix<2;++ix) {
102 if (pl.E()>Ecut[ix]) {
103 _p[ix][0]->fill(_edges[5*ix],mX2-_mD2);
104 _p[ix][1]->fill(_edges[5*ix],sqr(mX2));
105 _p[ix][2]->fill(_edges[5*ix],q2);
106 _p[ix][3]->fill(_edges[5*ix],sqr(q2));
107 }
108 }
109 for(unsigned int ix=0;ix<6;++ix) {
110 if (1.+0.1*ix < pl.E()) _p_dist->fill(_edges[ix],mX2-_mD2);
111 }
112 }
113 }
114
115
116 /// Normalise histograms etc., after the run
117 void finalize() {
118 for (unsigned int ix=0; ix<2; ++ix) {
119 // compute <(mx2-<mx2>)^2> = <mx4>-<mx2>^2
120 BinnedEstimatePtr<string> tmp;
121 book(tmp,1,2,1+ix);
122 for (const auto& b0 : _p[ix][0]->bins()) {
123 const auto& b1 = _p[ix][1]->bin(b0.index());
124 const double val = b1.yMean()-sqr(b0.yMean()+_mD2);
125 const double err = val*sqrt(sqr(b1.relErrW())+4.*sqr(b0.yStdErr()/(b0.yMean()+_mD2)));
126 tmp->bin(b0.index()).set(val, err);
127 }
128 // compute <(q2-<q2>)^2> = <q4>-<q2>^2
129 book(tmp,1,4,1+ix);
130 for (const auto& b2 : _p[ix][2]->bins()) {
131 const auto& b3 = _p[ix][3]->bin(b2.index());
132 const double val = b3.yMean()-sqr(b2.yMean());
133 const double err = val*sqrt(sqr(b3.relErrW())+4.*sqr(b3.relErrW()));
134 tmp->bin(b2.index()).set(val, err);
135 }
136 }
137 }
138
139 /// @}
140
141
142 /// @name Histograms
143 /// @{
144 BinnedProfilePtr<string> _p[2][4], _p_dist;
145 vector<string> _edges;
146 double _mD2;
147 /// @}
148
149
150 };
151
152
153 RIVET_DECLARE_PLUGIN(CLEOII_2004_I647287);
154
155}
|