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);
}