rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2002_I590700

Mass and angular distributions in $B\to D^{(*)}K^-K^{0(*)}$ decays
Experiment: BELLE (KEKB)
Inspire ID: 590700
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Lett.B 542 (2002) 171-182
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B mesons, originally Upsilon(4S) decays

Measurement of mass and angular distributions in $B\to D^{(*)}K^-K^{0(*)}$ decays. The corrected, background subtracted data was read from the figures in the paper.

Source code: BELLE_2002_I590700.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 -> D(*) K K(*)
 10  class BELLE_2002_I590700 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2002_I590700);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      UnstableParticles ufs = UnstableParticles(Cuts::abspid==511 or Cuts::abspid==521);
 23      declare(ufs, "UFS");
 24      DecayedParticles BB(ufs);
 25      BB.addStable( 411);
 26      BB.addStable(-411);
 27      BB.addStable( 421);
 28      BB.addStable(-421);
 29      BB.addStable( 413);
 30      BB.addStable(-413);
 31      BB.addStable( 423);
 32      BB.addStable(-423);
 33      BB.addStable( 310);
 34      BB.addStable( 313);
 35      BB.addStable(-313);
 36      declare(BB, "BB");
 37      for (unsigned int ix=0; ix<2; ++ix) {
 38        book(_h_mass[ix],1+2*ix,1,1);
 39        for (unsigned int iy=0;iy<2;++iy) {
 40          book(_h_angle[ix][iy],2,1+iy,1+ix);
 41        }
 42      }
 43      book(_h_angle[2][0],3,2,1);
 44    }
 45
 46    bool isK(int pid) const {
 47      return pid==130 || pid==310 || pid==311 || pid==321;
 48    }
 49
 50    bool isPi(int pid) const {
 51      return pid==211 || pid==111;
 52    }
 53
 54    /// Perform the per-event analysis
 55    void analyze(const Event& event) {
 56      static const double mDs = 1.96835;
 57      static const map<PdgId,unsigned int> modes  [5] = { { {-421,1}, { 321,1}, {-313,1} },
 58                                                          { {-411,1}, { 321,1}, {-313,1} },
 59                                                          { {-423,1}, { 321,1}, {-313,1} },
 60                                                          { {-413,1}, { 321,1}, {-313,1} },
 61                                                          { {-421,1}, { 321,1}, { 310,1} }};
 62      static const map<PdgId,unsigned int> modesCC[5] = { { { 421,1}, {-321,1}, { 313,1} },
 63                                                          { { 411,1}, {-321,1}, { 313,1} },
 64                                                          { { 423,1}, {-321,1}, { 313,1} },
 65                                                          { { 413,1}, {-321,1}, { 313,1} },
 66                                                          { { 421,1}, {-321,1}, { 310,1} }};
 67      DecayedParticles BB = apply<DecayedParticles>(event, "BB");
 68      for (unsigned int ix=0; ix<BB.decaying().size(); ++ix) {
 69        int imode=-1;
 70        for (unsigned int iy=0; iy<5; ++iy) {
 71          if (BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,modes[iy])) {
 72            imode=iy;
 73            break;
 74          }
 75          else if (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,modesCC[iy])) {
 76            imode=iy;
 77            break;;
 78          }
 79        }
 80        if (imode<0) continue;
 81        int sign = BB.decaying()[ix].pid()/BB.decaying()[ix].abspid();
 82        LorentzTransform boostB = LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix].mom().betaVec());
 83        if (imode<4) {
 84          const Particle& Km = BB.decayProducts()[ix].at( sign*321)[0];
 85          const Particle& K0 = BB.decayProducts()[ix].at(-sign*313)[0];
 86          FourMomentum pKK = boostB.transform(Km.mom()+K0.mom());
 87          const double mKK=pKK.mass();
 88          if (abs(mKK-mDs)<0.02) continue;
 89          _h_mass[0]->fill(mKK);
 90          LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pKK.betaVec());
 91          FourMomentum pK0 = boost2.transform(boostB.transform(K0.mom()));
 92          _h_angle[imode/2][0]->fill(pK0.p3().unit().dot(pKK.p3().unit()));
 93          // find Kstar decay products
 94          Particle KK;
 95          if (isK (K0.children()[0].abspid()) &&
 96              isPi(K0.children()[1].abspid())) {
 97            KK = K0.children()[0];
 98          }
 99          else if (isK(K0.children()[1].abspid()) &&
100                  isPi(K0.children()[0].abspid())) {
101            KK = K0.children()[1];
102          }
103          else {
104            continue;
105          }
106          LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pK0.betaVec());
107          FourMomentum pK = boost3.transform(boost2.transform(boostB.transform(KK.mom())));
108          _h_angle[imode/2][1]->fill(pKK.p3().unit().dot(pK0.p3().unit()));
109        }
110        else {
111          const Particle& Km = BB.decayProducts()[ix].at( sign*321)[0];
112          const Particle& K0 = BB.decayProducts()[ix].at(      310)[0];
113          FourMomentum pKK = boostB.transform(Km.mom()+K0.mom());
114          const double mKK=pKK.mass();
115          if (abs(mKK-mDs)<0.02) continue;
116          _h_mass[1]->fill(mKK);
117          LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pKK.betaVec());
118          FourMomentum pK0 = boost2.transform(boostB.transform(K0.mom()));
119          _h_angle[2][0]->fill(pK0.p3().unit().dot(pKK.p3().unit()));
120        }
121      }
122    }
123
124
125    /// Normalise histograms etc., after the run
126    void finalize() {
127      for (unsigned int ix=0; ix<2; ++ix) {
128        normalize(_h_mass[ix], 1.0, false);
129        for (unsigned int iy=0; iy<2; ++iy) {
130          normalize(_h_angle[ix][iy], 1.0, false);
131        }
132      }
133      normalize(_h_angle[2][0],1.,false);
134    }
135
136    /// @}
137
138
139    /// @name Histograms
140    /// @{
141    Histo1DPtr _h_mass[2],_h_angle[3][2];
142    /// @}
143
144
145  };
146
147
148  RIVET_DECLARE_PLUGIN(BELLE_2002_I590700);
149
150}