rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2012_I1123656

Helicity angles in $B^0\to D^{*+}D^{*-}$
Experiment: BELLE (KEKB)
Inspire ID: 1123656
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 86 (2012) 071103
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B0, original Upsilon(4S) decay

Helicity angle distributions in $B^0\to D^{*+}D^{*-}$ decays

Source code: BELLE_2012_I1123656.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief B0 -> D*+ D*-
  9  class BELLE_2012_I1123656 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2012_I1123656);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      // Initialise and register projections
 22      UnstableParticles ufs = UnstableParticles(Cuts::abspid==511);
 23      declare(ufs, "UFS");
 24      // histograms
 25      for(unsigned int ix=0;ix<2;++ix)
 26	book(_h[ix],1,1,1+ix);
 27    }
 28
 29
 30    /// Perform the per-event analysis
 31    void analyze(const Event& event) {
 32      Particles B0 = apply<UnstableParticles>(event, "UFS").particles();
 33      for(const Particle & p : B0) {
 34	if(p.children().size()!=2) continue;
 35	if(p.children()[0].pid()!=-p.children()[1].pid()) continue;
 36	if(p.children()[0].abspid()!=413) continue;
 37	Particle Dp = p.children()[0];
 38	Particle Dm = p.children()[1];
 39	if     (p.pid()>0 && Dp.pid()<0) swap(Dp,Dm);
 40	else if(p.pid()<0 && Dp.pid()>0) swap(Dp,Dm);
 41	// find children of the D mesons
 42	Particle pip,pim;
 43	if(Dp.children().size()!=2) continue;
 44	if(Dp.children()[0].abspid()==PID::PIPLUS &&
 45	   Dp.children()[1].abspid()==PID::D0)
 46	  pip = Dp.children()[0];
 47	else if (Dp.children()[1].abspid()==PID::PIPLUS &&
 48		 Dp.children()[0].abspid()==PID::D0)
 49	  pip = Dp.children()[1];
 50	else
 51	  continue;
 52	if(Dm.children().size()!=2) continue;
 53	if(Dm.children()[0].abspid()==PID::PIPLUS &&
 54	   Dm.children()[1].abspid()==PID::D0) {
 55	  pim = Dm.children()[0];
 56	}
 57	else if (Dm.children()[1].abspid()==PID::PIPLUS &&
 58		 Dm.children()[0].abspid()==PID::D0) {
 59	  pim = Dm.children()[1];
 60	}
 61	else
 62	  continue;
 63	// boost to rest frame
 64	LorentzTransform boostB  = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
 65	FourMomentum pDstarPlus  = boostB.transform(Dp.momentum());
 66	FourMomentum pDstarMinus = boostB.transform(Dm.momentum());
 67	LorentzTransform boostDp = LorentzTransform::mkFrameTransformFromBeta(pDstarPlus .betaVec());
 68	FourMomentum ppip = boostDp.transform(boostB.transform(pip.momentum()));
 69	LorentzTransform boostDm = LorentzTransform::mkFrameTransformFromBeta(pDstarMinus.betaVec());
 70	FourMomentum ppim = boostDm.transform(boostB.transform(pim.momentum()));
 71	Vector3 axisX = pDstarPlus.p3().unit();
 72	// ctheta1
 73	_h[1]->fill(axisX.dot(ppim.p3().unit()));
 74	// y and z axis
 75	ppim = boostDp.transform(boostB.transform(pim.momentum()));
 76	Vector3 axisZ = axisX.cross(ppim.p3()).unit();
 77	// cThetaTr
 78	_h[0]->fill(axisZ.dot(ppip.p3().unit()));
 79      }
 80    }
 81
 82
 83    /// Normalise histograms etc., after the run
 84    void finalize() {
 85      for(unsigned int ix=0;ix<2;++ix)
 86	normalize(_h[ix],1.,false);
 87    }
 88
 89    /// @}
 90
 91
 92    /// @name Histograms
 93    /// @{
 94    Histo1DPtr _h[2];
 95    /// @}
 96
 97
 98  };
 99
100
101  RIVET_DECLARE_PLUGIN(BELLE_2012_I1123656);
102
103}