rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2009_I801589

Mass and angular distributions in $B^0\to K^+\pi^- (J/\psi,\psi(2S))$ and $B^+\to K^0_S\pi^+(J/\psi,\psi(2S))$
Experiment: BABAR (PEP-II)
Inspire ID: 801589
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 79 (2009) 112001
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B+ and B0 mesons, originally Upsilon(4S) decays

Mass and angular distributions in $B^0\to K^+\pi^- (J/\psi,\psi(2S))$ and $B^+\to K^0_S\pi^+(J/\psi,\psi(2S))$. The corrected, background subtracted data was read from the figures in the paper.

Source code: BABAR_2009_I801589.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 -> J/psi / psi(2S) K pi
 10  class BABAR_2009_I801589 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2009_I801589);
 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						Cuts::abspid==521);
 25      declare(ufs, "UFS");
 26      DecayedParticles BB(ufs);
 27      BB.addStable(310);
 28      BB.addStable(443);
 29      BB.addStable(100443);
 30      declare(BB, "BB");
 31      // histos
 32      for(unsigned int ix=0;ix<2;++ix) {
 33	book(_h_Kpi2[ix],2,1,1+ix);
 34	book(_h_angle[ix],4,1,1+ix);
 35	book(_c[ix],"TMP/c_"+toString(ix));
 36	for(unsigned int iy=0;iy<2;++iy) {
 37	  book(_h_Kpi[ix][iy],1,1+ix,1+iy);
 38	}
 39        book(_b[ix],{0.,.795,.995,1.332,1.532,10.});
 40	for(unsigned int iy=0;iy<5;++iy)
 41	  book(_b[ix]->bin(iy+1),3,1+ix,1+iy);
 42	for(unsigned int iy=0;iy<3;++iy) {
 43	  book(_h_PsiPi[ix][iy],5,1+ix,1+iy);
 44	}
 45      }
 46    }
 47
 48
 49    /// Perform the per-event analysis
 50    void analyze(const Event& event) {
 51      static const map<PdgId,unsigned int> & mode1   = { { 321,1},{-211,1}, {    443,1}};
 52      static const map<PdgId,unsigned int> & mode1CC = { {-321,1},{ 211,1}, {    443,1}};
 53      static const map<PdgId,unsigned int> & mode2   = { { 321,1},{-211,1}, { 100443,1}};
 54      static const map<PdgId,unsigned int> & mode2CC = { {-321,1},{ 211,1}, { 100443,1}};
 55      static const map<PdgId,unsigned int> & mode3   = { { 310,1},{-211,1}, {    443,1}};
 56      static const map<PdgId,unsigned int> & mode3CC = { { 310,1},{ 211,1}, {    443,1}};
 57      static const map<PdgId,unsigned int> & mode4   = { { 310,1},{-211,1}, { 100443,1}};
 58      static const map<PdgId,unsigned int> & mode4CC = { { 310,1},{ 211,1}, { 100443,1}};
 59      DecayedParticles BB = apply<DecayedParticles>(event, "BB");
 60      // loop over particles
 61      for(unsigned int ix=0;ix<BB.decaying().size();++ix) {
 62      	int sign = 1,iK(0),iPsi(0);
 63	if (BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode1)) {
 64	  sign=1; iK = 321; iPsi=443;
 65	}
 66      	else if  (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode1CC)) {
 67       	  sign=-1; iK=-321; iPsi=443;
 68       	}
 69	else if (BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode2)) {
 70	  sign=1; iK = 321; iPsi=100443;
 71	}
 72      	else if  (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode2CC)) {
 73       	  sign=-1; iK=-321; iPsi=100443;
 74       	}
 75	else if (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode3)) {
 76	  sign=1; iK = 310; iPsi=443;
 77	}
 78      	else if  (BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode3CC)) {
 79       	  sign=-1; iK= 310; iPsi=443;
 80	}
 81	else if (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode4)) {
 82	  sign=1; iK = 310; iPsi=100443;
 83	}
 84      	else if  (BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode4CC)) {
 85       	  sign=-1; iK= 310; iPsi=100443;
 86       	}
 87      	else
 88      	  continue;
 89	_c[iPsi/100000]->fill();
 90       	const Particle & Kp  = BB.decayProducts()[ix].at( iK      )[0];
 91       	const Particle & pim = BB.decayProducts()[ix].at(-211*sign)[0];
 92       	const Particle & psi = BB.decayProducts()[ix].at( iPsi    )[0];
 93	FourMomentum pKpi = Kp.momentum()+pim.momentum(); 
 94       	double mKpi  = pKpi.mass();
 95	_h_Kpi[BB.decaying()[ix].abspid()%100/10-1][iPsi/100000]->fill(mKpi);
 96	_h_Kpi2[iPsi/100000]->fill(mKpi);
 97	double mPsiPi = (psi.momentum()+pim.momentum()).mass();
 98	_b[iPsi/100000]->fill(mKpi,mPsiPi);
 99	_h_PsiPi[iPsi/100000][0]->fill(mPsiPi);
100	// helicity angle
101	if(mKpi<0.795 || (mKpi>0.995&&mKpi<1.332) || mKpi>1.532) {
102	  _h_PsiPi[iPsi/100000][2]->fill(mPsiPi);
103	  LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix].momentum().betaVec());
104	  pKpi = boost1.transform(pKpi);
105	  Vector3 axis1 = pKpi.p3().unit();
106	  LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pKpi.betaVec());
107	  FourMomentum ppi = boost3.transform(boost1.transform(pim.momentum()));
108	  double cPi = ppi.p3().unit().dot(axis1);
109	  _h_angle[iPsi/100000]->fill(cPi);
110	}
111	else {
112	  _h_PsiPi[iPsi/100000][1]->fill(mPsiPi);
113	}
114      }
115    }
116
117
118    /// Normalise histograms etc., after the run
119    void finalize() {
120      for(unsigned int ix=0;ix<2;++ix) {
121	normalize(_h_Kpi2[ix],1.,false);
122	normalize(_h_angle[ix],1.,false);
123	for(unsigned int iy=0;iy<2;++iy) {
124	  normalize(_h_Kpi[ix][iy],1.,false);
125	}
126	for(unsigned int iy=0;iy<3;++iy) {
127	  scale(_h_PsiPi[ix][iy],1./ *_c[ix]);
128	}
129        scale(_b[ix], 1./ *_c[ix]);
130      }
131    }
132
133    /// @}
134
135
136    /// @name Histograms
137    /// @{
138    Histo1DPtr _h_Kpi[2][2],_h_Kpi2[2],_h_angle[2],_h_PsiPi[2][3];
139    Histo1DGroupPtr _b[2];
140    CounterPtr _c[2];
141    /// @}
142  };
143
144
145  RIVET_DECLARE_PLUGIN(BABAR_2009_I801589);
146
147}