Rivet analyses referenceBELLE_2019_I1724068Measurement of $D^{*-}$ polarization in the decay $B^0\to D^{*-}\tau^+\nu_\tau$Experiment: BELLE (KEKB) Inspire ID: 1724068 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of $D^{*-}$ polarization in the decay $B^0\to D^{*-}\tau^+\nu_\tau$ by the BELLE collaboration Source code: BELLE_2019_I1724068.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief D* polarization in B0 -> D* tau nu_tau
9 class BELLE_2019_I1724068 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2019_I1724068);
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
25 // Book histograms
26 book(_h_cTheta,1,1,1);
27 }
28
29 void findChildren(const Particle & p, unsigned int & nprod,
30 Particles & Dstar, Particles & tau, Particles & nu) {
31 for(const Particle & child : p.children()) {
32 if(child.pid()==-413) {
33 ++nprod;
34 Dstar.push_back(child);
35 }
36 else if(child.pid()==-15) {
37 ++nprod;
38 tau.push_back(child);
39 }
40 else if(child.pid()==16) {
41 ++nprod;
42 nu.push_back(child);
43 }
44 else if(child.pid()==22)
45 continue;
46 else if(child.children().empty() ||
47 child.pid()==111 || child.pid()==221 || child.pid()==331) {
48 ++nprod;
49 }
50 else {
51 findChildren(child,nprod,Dstar,tau,nu);
52 }
53 }
54 }
55
56 /// Perform the per-event analysis
57 void analyze(const Event& event) {
58 // Loop over B0 mesons
59 for(const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::pid==PID::B0)) {
60 // find the B decay
61 unsigned int nprod = 0;
62 Particles Dstar,tau,nu;
63 findChildren(p,nprod,Dstar,tau,nu);
64 if(nprod!=3 || Dstar.size()!=1 || tau.size() !=1 || nu.size()!=1)
65 continue;
66 // and the D* decay
67 if(Dstar[0].children().size()!=2) continue;
68 Particle D0;
69 if(Dstar[0].children()[0].pid()==-421 &&
70 Dstar[0].children()[1].pid()==-211) {
71 D0 = Dstar[0].children()[0];
72 }
73 else if(Dstar[0].children()[1].pid()==-421 &&
74 Dstar[0].children()[0].pid()==-211) {
75 D0 = Dstar[0].children()[1];
76 }
77 else
78 continue;
79 // compute the helicity angle
80 // boost to B0 rest frame
81 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
82 FourMomentum pDstar = boost1.transform(Dstar[0].momentum());
83 FourMomentum pD = boost1.transform(D0 .momentum());
84 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pDstar.betaVec());
85 pD = boost2.transform(pD);
86 double cTheta = pD.p3().unit().dot(pDstar.p3().unit());
87 if(cTheta<=0.) _h_cTheta->fill(cTheta);
88 }
89 }
90
91 pair<double,double> calcF(Histo1DPtr hist) {
92 if(hist->numEntries()==0.) return make_pair(0.,0.);
93 double sum1(0.),sum2(0.);
94 for (const auto& bin : hist->bins() ) {
95 double Oi = bin.sumW();
96 if(Oi==0.) continue;
97 double ai = 0.5*(bin.xMin()*(sqr(bin.xMin())-3.)-bin.xMax()*(sqr(bin.xMax())-3.));
98 double bi = 1.5*(bin.xMin()*(1.-sqr(bin.xMin()))-bin.xMax()*(1.-sqr(bin.xMax())));
99 double Ei = bin.errW();
100 sum1 += sqr(bi/Ei);
101 sum2 += bi/sqr(Ei)*(Oi-ai);
102 }
103 return make_pair(sum2/sum1,sqrt(1./sum1));
104 }
105
106 /// Normalise histograms etc., after the run
107 void finalize() {
108 normalize(_h_cTheta);
109 Estimate1DPtr _h_F;
110 book(_h_F,2,1,1);
111 pair<double,double> F = calcF(_h_cTheta);
112 _h_F->bin(1).set(F.first, F.second);
113
114 }
115
116 /// @}
117
118
119 /// @name Histograms
120 /// @{
121 Histo1DPtr _h_cTheta;
122 /// @}
123
124
125 };
126
127
128 RIVET_DECLARE_PLUGIN(BELLE_2019_I1724068);
129
130}
|