rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2008_I792439

Mass and angular distributions in $B^0\to\phi K\pi$
Experiment: BABAR (PEP-II)
Inspire ID: 792439
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 78 (2008) 092008
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B0, originally Upsilon(4S) decay

Measurment of mass and angular distributions in $B^0\to\phi K\pi$ decays. The corrected data were read from the figures in the paper.

Source code: BABAR_2008_I792439.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/DecayedParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief B -> phi K pi
 10  class BABAR_2008_I792439 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2008_I792439);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // Initialise and register projections
 23      UnstableParticles ufs = UnstableParticles(Cuts::abspid==511);
 24      declare(ufs, "UFS");
 25      DecayedParticles B0(ufs);
 26      B0.addStable(333);
 27      B0.addStable(310);
 28      B0.addStable(111);
 29      declare(B0, "B0");
 30      // histos
 31      for(unsigned int ix=0;ix<2;++ix) {
 32	book(_p[ix][0],1,2,2+ix);
 33	book(_p[ix][1],"TMP/norm_"+toString(ix));
 34	for(unsigned int iy=0;iy<2;++iy) {
 35	  book(_h_mass[ix][iy],2,1+ix,1+iy);
 36	  book(_h_angle[ix][iy],3+ix,1,1+iy);
 37	}
 38      }
 39    }
 40
 41
 42    /// Perform the per-event analysis
 43    void analyze(const Event& event) {
 44      static const map<PdgId,unsigned int> & mode1   = { { 321,1},{-211,1}, { 333,1}};
 45      static const map<PdgId,unsigned int> & mode1CC = { {-321,1},{ 211,1}, { 333,1}};
 46      static const map<PdgId,unsigned int> & mode2   = { { 310,1},{ 111,1}, { 333,1}};
 47      DecayedParticles B0 = apply<DecayedParticles>(event, "B0");
 48      // loop over particles
 49      for(unsigned int ix=0;ix<B0.decaying().size();++ix) {
 50      	int sign = 1,imode=-1;
 51      	if (B0.modeMatches(ix,3,mode1)) {
 52	  imode = 0;
 53      	  sign  = 1;
 54	}
 55	else if(B0.modeMatches(ix,3,mode1CC)) {
 56	  imode = 0;
 57      	  sign  =-1;
 58	}
 59	else if(B0.modeMatches(ix,3,mode2)) {
 60	  imode = 1;
 61      	  sign  = 1;
 62	}
 63      	else
 64      	  continue;
 65	// particles
 66      	const Particle & KK  = B0.decayProducts()[ix].at(imode==0 ?  321*sign : 310)[0];
 67      	const Particle & pi  = B0.decayProducts()[ix].at(imode==0 ? -211*sign : 111)[0];
 68	const Particle & phi = B0.decayProducts()[ix].at( 333     )[0];
 69	// children of the phi
 70	if(phi.children().size()!=2) continue;
 71	if(phi.children()[0].abspid()!=321) continue;
 72	if(phi.children()[0].pid()!=-phi.children()[1].pid()) continue;
 73	double mKpi = (KK.momentum()+pi.momentum()).mass();
 74	_h_mass[imode][0]->fill(mKpi);
 75	_h_mass[imode][1]->fill(phi.mass());
 76	Particle Kp1 = phi.children()[0];
 77	Particle Km1 = phi.children()[1];
 78	// B0 frame
 79	LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(B0.decaying()[ix].momentum().betaVec());
 80	FourMomentum pKstar = boost1.transform(KK.momentum()+pi.momentum());
 81	FourMomentum pPhi   = boost1.transform(phi.momentum());
 82	// K pi helicity angle
 83	LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
 84	FourMomentum pKp = boost2.transform(boost1.transform(KK.momentum()));
 85	Vector3 axis1 = pKstar.p3().unit();
 86	double cTheta1 = axis1.dot(pKp.p3().unit());
 87	// phi helicity angle
 88	LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pPhi.betaVec());
 89	FourMomentum pKp1 = boost3.transform(boost1.transform(Kp1.momentum()));
 90	Vector3 axis2 = pPhi.p3().unit();
 91	double cTheta2 = axis2.dot(pKp1.p3().unit());
 92	if(mKpi>.75 && mKpi<1.05) {
 93	  _h_angle[0][0]->fill(cTheta1);
 94	  _h_angle[0][1]->fill(cTheta2);
 95	  _p[0][0]->fill(-0.5*(1-5.*sqr(cTheta2)));
 96	  _p[0][1]->fill();
 97	}
 98	else if(mKpi>1.13 && mKpi<1.53) {
 99	  _h_angle[1][0]->fill(cTheta1);
100	  _h_angle[1][1]->fill(cTheta2);
101	  _p[1][0]->fill(-0.5*(1-5.*sqr(cTheta2)));
102	  _p[1][1]->fill();
103	}
104      }
105    }
106
107
108    /// Normalise histograms etc., after the run
109    void finalize() {
110      // histos
111      for(unsigned int ix=0;ix<2;++ix) {
112        scale(_p[ix][0], 1./ *_p[ix][1]);
113	for(unsigned int iy=0;iy<2;++iy) {
114	  normalize(_h_mass[ix][iy] ,1.,false);
115	  normalize(_h_angle[ix][iy],1.,false);
116	}
117      }
118    }
119
120    /// @}
121
122
123    /// @name Histograms
124    /// @{
125    Histo1DPtr _h_mass[2][2],_h_angle[2][2];
126    CounterPtr _p[2][2];
127    /// @}
128
129  };
130
131
132  RIVET_DECLARE_PLUGIN(BABAR_2008_I792439);
133
134}