rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2012_I1111233

Differential Branching ratio and asymmetries in $B\to K^{(*)}\ell^+\ell^-$
Experiment: BABAR (PEP-II)
Inspire ID: 1111233
Status: VALIDATED NOHEPDATA SINGLEWEIGHT
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 86 (2012) 032012
Beams: * *
Beam energies: ANY
Run details:
  • Any proces producing B0 and B+, originally Upsilon(4S) decays

Measurement of the differential Branching ratio and asymmetries in $B\to K^{(*)}\ell^+\ell^-$. As well as the differential branching ratio as a function of $q^2$ the ratio of $e^+e^-$ and $\mu^+\mu^-$ and isospin and CP asymmetries are measured.

Source code: BABAR_2012_I1111233.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 -> K(*) l+ l-
 10  class BABAR_2012_I1111233 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2012_I1111233);
 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 or
 24						Cuts::abspid==521);
 25      declare(ufs, "UFS");
 26      DecayedParticles BB(ufs);
 27      BB.addStable(   443);
 28      BB.addStable(100443);
 29      BB.addStable( 310);
 30      BB.addStable( 313);
 31      BB.addStable( 323);
 32      BB.addStable(-313);
 33      BB.addStable(-323);
 34      declare(BB, "BB");
 35      // histograms
 36      for(unsigned int ix=0;ix<2;++ix) {
 37	for(unsigned int iy=0;iy<2;++iy) {
 38	  book(_h_br[ix][iy],1,1+ix,1+iy);
 39	  book(_p_CP[ix][iy],2,1+ix,1+iy);
 40	  for(unsigned int il=0;il<2;++il) {
 41	    book(_h_br_l[il][ix][iy],"TMP/h_br_l_"+toString(il)+"_"+toString(ix)+"_"+toString(iy),
 42		 refData(3,1+ix,1+iy));
 43	    book(_h_br_I[il][ix][iy],"TMP/h_br_I_"+toString(il)+"_"+toString(ix)+"_"+toString(iy),
 44		 refData(4,1+ix,1+iy));
 45	  }
 46	}
 47      }
 48      for(unsigned int ix=0;ix<3;++ix)
 49	book(_c[ix],"TMP/c_"+toString(ix+1));
 50    }
 51
 52
 53    /// Perform the per-event analysis
 54    void analyze(const Event& event) {
 55      // kaon modes
 56      static const map<PdgId,unsigned int> & mode1   = { { 321,1},{ 13,1}, {-13,1}};
 57      static const map<PdgId,unsigned int> & mode1CC = { {-321,1},{ 13,1}, {-13,1}};
 58      static const map<PdgId,unsigned int> & mode2   = { { 310,1},{ 13,1}, {-13,1}};
 59      static const map<PdgId,unsigned int> & mode3   = { { 321,1},{ 11,1}, {-11,1}};
 60      static const map<PdgId,unsigned int> & mode3CC = { {-321,1},{ 11,1}, {-11,1}};
 61      static const map<PdgId,unsigned int> & mode4   = { { 310,1},{ 11,1}, {-11,1}};
 62      // K* modes
 63      static const map<PdgId,unsigned int> & mode5   = { { 323,1},{ 13,1}, {-13,1}};
 64      static const map<PdgId,unsigned int> & mode5CC = { {-323,1},{ 13,1}, {-13,1}};
 65      static const map<PdgId,unsigned int> & mode6   = { { 313,1},{ 13,1}, {-13,1}};
 66      static const map<PdgId,unsigned int> & mode6CC = { {-313,1},{ 13,1}, {-13,1}};
 67      static const map<PdgId,unsigned int> & mode7   = { { 323,1},{ 11,1}, {-11,1}};
 68      static const map<PdgId,unsigned int> & mode7CC = { {-323,1},{ 11,1}, {-11,1}};
 69      static const map<PdgId,unsigned int> & mode8   = { { 313,1},{ 11,1}, {-11,1}};
 70      static const map<PdgId,unsigned int> & mode8CC = { {-313,1},{ 11,1}, {-11,1}};
 71      DecayedParticles BB = apply<DecayedParticles>(event, "BB");
 72      // loop over particles
 73      for(unsigned int ix=0;ix<BB.decaying().size();++ix) {
 74	_c[0]->fill();
 75	if(BB.decaying()[ix].abspid()==521) _c[1]->fill();
 76	else                                _c[2]->fill();
 77	int imode=0;
 78	if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode1)) ||
 79	    (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode1CC)))      imode=0;
 80	else if (BB.modeMatches(ix,3,mode2))                                  imode=1;
 81	else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode3)) ||
 82		 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode3CC))) imode=2;
 83	else if (BB.modeMatches(ix,3,mode4))                                  imode=3;
 84      	else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode5)) ||
 85		 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode5CC))) imode=4;
 86	else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode6)) ||
 87		 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode6CC))) imode=5;
 88      	else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode7)) ||
 89		 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode7CC))) imode=6;
 90      	else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode8)) ||
 91		 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode8CC))) imode=7;
 92      	else continue;
 93	int il = imode<2 || imode==4 || imode==5 ? 13 : 11;
 94	const Particle & lp = BB.decayProducts()[ix].at(-il)[0];
 95	const Particle & lm = BB.decayProducts()[ix].at( il)[0];
 96	double qq = (lp.momentum()+lm.momentum()).mass2();
 97	double ACP = BB.decaying()[ix].pid()>0 ? -1. : 1.;
 98	if(imode<4) {
 99	  double wgt = (imode==1||imode==3) ? 2 : 1;
100	  for(unsigned int iy=0;iy<2;++iy) {
101	    _h_br[iy][0]->fill(qq,wgt);
102	    _p_CP[iy][0]->fill(qq,ACP,wgt);
103	    if(il==13) _h_br_l[0][iy][0]->fill(qq,wgt);
104	    else       _h_br_l[1][iy][0]->fill(qq,wgt);
105	    if(BB.decaying()[ix].abspid()==521)
106	      _h_br_I[0][iy][0]->fill(qq,wgt);
107	    else
108	      _h_br_I[1][iy][0]->fill(qq,wgt);
109	  }
110	}
111	else {
112	  for(unsigned int iy=0;iy<2;++iy) {
113	    _h_br[iy][1]->fill(qq);
114	    _p_CP[iy][1]->fill(qq,ACP);
115	    if(BB.decaying()[ix].abspid()==521)
116	      _h_br_I[0][iy][1]->fill(qq);
117	    else
118	      _h_br_I[1][iy][1]->fill(qq);
119	    if(il==13) _h_br_l[0][iy][1]->fill(qq);
120	    else       _h_br_l[1][iy][1]->fill(qq);
121	  }
122	}
123      }
124    }
125
126
127    /// Normalise histograms etc., after the run
128    void finalize() {
129      // ratio of lifetimes
130      double rLife = 1./1.078;
131      for(unsigned int ix=0;ix<2;++ix) {
132      	for(unsigned int iy=0;iy<2;++iy) {
133	  scale(_h_br[ix][iy],1e7/ *_c[0]);
134	  for(unsigned int il=0;il<2;++il) {
135	    scale(_h_br_l[il][ix][iy],1e7/ *_c[0]);
136	    scale(_h_br_I[il][ix][iy],1e7/ *_c[il+1]);
137	    if (il==0) scale(_h_br_I[il][ix][iy],rLife);
138	  }
139	  // RK plots
140	  Estimate1DPtr RK;
141	  book(RK,3,1+ix,1+iy);
142	  divide(_h_br_l[0][ix][iy],_h_br_l[1][ix][iy],RK);
143	  book(RK,4,1+ix,1+iy);
144	  asymm(_h_br_I[1][ix][iy],_h_br_I[0][ix][iy],RK);
145	}
146      }
147    }
148
149    /// @}
150
151
152    /// @name Histograms
153    /// @{
154    Histo1DPtr _h_br[2][2],_h_br_l[2][2][2],_h_br_I[2][2][2];
155    Profile1DPtr _p_CP[2][2];
156    CounterPtr _c[3];
157    /// @}
158
159
160  };
161
162
163  RIVET_DECLARE_PLUGIN(BABAR_2012_I1111233);
164
165}