Rivet analyses
Helicity angles and Polarization in B0 → Ds*+D*−
Experiment: BABAR (PEP-II)
Inspire ID: 613283
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Phys.Rev.D 67 (2003) 092003
Beams: * *
Beam energies: ANY
Run details: - Any proces producing B0 mesons, originally Upsilon(4S) decays
Measurement of the helicity angles and polarization in B0 → Ds*+D*−. The polarization was given in the paper and the background subtracted data for the helicity angles was extracted from figure 2 in the paper.
Source
code:BABAR_2003_I613283.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/DecayedParticles.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief B0 -> Ds* D*
class BABAR_2003_I613283 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2003_I613283);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
UnstableParticles ufs = UnstableParticles(Cuts::abspid == 511);
declare(ufs, "UFS");
DecayedParticles B0(ufs);
B0.addStable(413);
B0.addStable(-413);
B0.addStable(433);
B0.addStable(-433);
declare(B0, "B0");
// histos
for (unsigned int ix = 0; ix < 2; ++ix) book(_h[ix], 2, 1 + ix, 1);
for (unsigned int ix = 0; ix < 2; ++ix) book(_p[ix], "TMP/p_" + toString(ix + 1));
}
/// Perform the per-event analysis
void analyze(const Event& event) {
static const map<PdgId, unsigned int>& mode = {{433, 1}, {-413, 1}};
static const map<PdgId, unsigned int>& modeCC = {{-433, 1}, {413, 1}};
DecayedParticles B0 = apply<DecayedParticles>(event, "B0");
// loop over particles
for (unsigned int ix = 0; ix < B0.decaying().size(); ++ix) {
int sign = 1;
if (B0.decaying()[ix].pid() > 0 && B0.modeMatches(ix, 2, mode))
sign = 1.;
else if (B0.decaying()[ix].pid() < 0 && B0.modeMatches(ix, 2, modeCC))
sign = -1.;
else
continue;
// find D* decay products
const Particle& Dstar = B0.decayProducts()[ix].at(-sign * 413)[0];
if (Dstar.children().size() != 2) continue;
Particle pim;
if (Dstar.children()[0].pid() == -sign * 211 && Dstar.children()[1].pid() == -sign * 421) {
pim = Dstar.children()[0];
}
else if (Dstar.children()[1].pid() == -sign * 211 && Dstar.children()[0].pid() == -sign * 421) {
pim = Dstar.children()[1];
}
else
continue;
// find Ds* decay products
const Particle& DSstar = B0.decayProducts()[ix].at(sign * 433)[0];
Particle gamma;
if (DSstar.children()[0].pid() == 22 && DSstar.children()[1].pid() == sign * 431) {
gamma = DSstar.children()[0];
}
else if (DSstar.children()[1].pid() == 22 && DSstar.children()[0].pid() == sign * 431) {
gamma = DSstar.children()[1];
}
else
continue;
// boost to B rest frame
LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(
B0.decaying()[ix].momentum().betaVec());
FourMomentum pDSstar = boost.transform(DSstar.momentum());
FourMomentum pDstar = boost.transform(Dstar.momentum());
FourMomentum pGamma = boost.transform(gamma.momentum());
FourMomentum pPim = boost.transform(pim.momentum());
const LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pDstar.betaVec());
pPim = boost2.transform(pPim);
double cPi = pPim.p3().unit().dot(pDSstar.p3().unit());
const LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pDSstar.betaVec());
pGamma = boost3.transform(pGamma);
double cGamma = pGamma.p3().unit().dot(pDstar.p3().unit());
_p[0]->fill(-100. * (1. - 5. * sqr(cPi)) / 2.);
_p[1]->fill();
_h[0]->fill(cPi);
_h[1]->fill(cGamma);
}
}
/// Normalise histograms etc., after the run
void finalize() {
for (unsigned int ix = 0; ix < 2; ++ix) normalize(_h[ix], 1., false);
Estimate0DPtr tmp;
book(tmp, 1, 1, 1);
divide(*_p[0], *_p[1], tmp);
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h[2];
CounterPtr _p[2];
/// @}
};
RIVET_DECLARE_PLUGIN(BABAR_2003_I613283);
}