Rivet analyses
Measurement of D*− polarization in the decay B0 → D*−τ+ντ
Experiment: BELLE (KEKB)
Inspire ID: 1724068
Status: VALIDATED
Authors: - Peter Richardson
References: - arXiv: 1903.03102
Beams: * *
Beam energies: ANY
Run details: - Any process producing B0 mesons, original e+e- at the Upsilon(4S)
Measurement of D*− polarization in the decay B0 → D*−τ+ντ by the BELLE collaboration
Source
code:BELLE_2019_I1724068.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief D* polarization in B0 -> D* tau nu_tau
class BELLE_2019_I1724068 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2019_I1724068);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(UnstableParticles(), "UFS");
// Book histograms
book(_h_cTheta, 1, 1, 1);
}
void findChildren(const Particle& p,
unsigned int& nprod,
Particles& Dstar,
Particles& tau,
Particles& nu) {
for (const Particle& child : p.children()) {
if (child.pid() == -413) {
++nprod;
Dstar.push_back(child);
}
else if (child.pid() == -15) {
++nprod;
tau.push_back(child);
}
else if (child.pid() == 16) {
++nprod;
nu.push_back(child);
}
else if (child.pid() == 22)
continue;
else if (child.children().empty() || child.pid() == 111 || child.pid() == 221 || child.pid() == 331) {
++nprod;
}
else {
findChildren(child, nprod, Dstar, tau, nu);
}
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// Loop over B0 mesons
for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::pid == PID::B0)) {
// find the B decay
unsigned int nprod = 0;
Particles Dstar, tau, nu;
findChildren(p, nprod, Dstar, tau, nu);
if (nprod != 3 || Dstar.size() != 1 || tau.size() != 1 || nu.size() != 1) continue;
// and the D* decay
if (Dstar[0].children().size() != 2) continue;
Particle D0;
if (Dstar[0].children()[0].pid() == -421 && Dstar[0].children()[1].pid() == -211) {
D0 = Dstar[0].children()[0];
}
else if (Dstar[0].children()[1].pid() == -421 && Dstar[0].children()[0].pid() == -211) {
D0 = Dstar[0].children()[1];
}
else
continue;
// compute the helicity angle
// boost to B0 rest frame
LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
FourMomentum pDstar = boost1.transform(Dstar[0].momentum());
FourMomentum pD = boost1.transform(D0.momentum());
LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pDstar.betaVec());
pD = boost2.transform(pD);
double cTheta = pD.p3().unit().dot(pDstar.p3().unit());
if (cTheta <= 0.) _h_cTheta->fill(cTheta);
}
}
pair<double, double> calcF(Histo1DPtr hist) {
if (hist->numEntries() == 0.) return make_pair(0., 0.);
double sum1(0.), sum2(0.);
for (const auto& bin : hist->bins()) {
double Oi = bin.sumW();
if (Oi == 0.) continue;
double ai = 0.5 * (bin.xMin() * (sqr(bin.xMin()) - 3.) - bin.xMax() * (sqr(bin.xMax()) - 3.));
double bi = 1.5 * (bin.xMin() * (1. - sqr(bin.xMin())) - bin.xMax() * (1. - sqr(bin.xMax())));
double Ei = bin.errW();
sum1 += sqr(bi / Ei);
sum2 += bi / sqr(Ei) * (Oi - ai);
}
return make_pair(sum2 / sum1, sqrt(1. / sum1));
}
/// Normalise histograms etc., after the run
void finalize() {
normalize(_h_cTheta);
Estimate1DPtr _h_F;
book(_h_F, 2, 1, 1);
pair<double, double> F = calcF(_h_cTheta);
_h_F->bin(1).set(F.first, F.second);
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h_cTheta;
/// @}
};
RIVET_DECLARE_PLUGIN(BELLE_2019_I1724068);
}