Rivet analyses referenceBELLE_2002_I590700Mass and angular distributions in $B\to D^{(*)}K^-K^{0(*)}$ decaysExperiment: BELLE (KEKB) Inspire ID: 590700 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
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}
|