Rivet analyses referenceBELLE_2006_I735859Helicity angle in $B\to\omega K$ and $B^+\to\omega\pi^+$Experiment: BELLE (KEKB) Inspire ID: 735859 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of the helicty angle in $B\to\omega K$ and $B^+\to\omega\pi^+$ decays. The data were read from Figure2 in the paper and are background subtracted. The mass distributions are not implemented due to resolution effects. Source code: BELLE_2006_I735859.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 -> omega pi/K
10 class BELLE_2006_I735859 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2006_I735859);
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 || Cuts::abspid==521);
24 declare(ufs, "UFS");
25 DecayedParticles BB(ufs);
26 BB.addStable(310);
27 BB.addStable(223);
28 declare(BB, "BB");
29 // histos
30 for (unsigned int ix=0; ix<3; ++ix) {
31 book(_h[ix], 1, 1, 1+ix);
32 }
33 }
34
35 void findChildren(const Particle& p, Particles& pim, Particles& pip,
36 Particles& pi0, unsigned int &ncount) {
37 for (const Particle &child : p.children()) {
38 if (child.pid()==PID::PIPLUS) {
39 pip.push_back(child);
40 ncount+=1;
41 }
42 else if (child.pid()==PID::PIMINUS) {
43 pim.push_back(child);
44 ncount+=1;
45 }
46 else if (child.pid()==PID::PI0) {
47 pi0.push_back(child);
48 ncount+=1;
49 }
50 else if (child.children().empty()) {
51 ncount+=1;
52 }
53 else {
54 findChildren(child,pim,pip,pi0,ncount);
55 }
56 }
57 }
58
59 /// Perform the per-event analysis
60 void analyze(const Event& event) {
61 DecayedParticles BB = apply<DecayedParticles>(event, "BB");
62 // loop over particles
63 for (unsigned int ix=0; ix<BB.decaying().size(); ++ix) {
64 unsigned int imode=0;
65 if (BB.modeMatches(ix,2,mode1) || BB.modeMatches(ix,2,mode1CC)) {
66 imode=0;
67 }
68 else if (BB.modeMatches(ix,2,mode2) || BB.modeMatches(ix,2,mode2CC)) {
69 imode=1;
70 }
71 else if (BB.modeMatches(ix,2,mode3) || BB.modeMatches(ix,2,mode3CC)) {
72 imode=2;
73 }
74 else {
75 continue;
76 }
77 const Particle& omega = BB.decayProducts()[ix].at(223)[0];
78 // children of the omega
79 unsigned int ncount=0;
80 Particles pip,pim,pi0;
81 findChildren(omega,pim,pip,pi0,ncount);
82 if (ncount!=3 || !(pim.size()==1 && pip.size()==1 && pi0.size()==1)) continue;
83 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix].mom().betaVec());
84 FourMomentum pomega = boost1.transform(omega.mom());
85 FourMomentum pPip = boost1.transform(pip[0].mom());
86 FourMomentum pPim = boost1.transform(pim[0].mom());
87 // boost to omega frame
88 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pomega.betaVec());
89 pPip = boost3.transform(pPip);
90 pPim = boost3.transform(pPim);
91 Vector3 axisOmega = pPip.p3().cross(pPim.p3()).unit();
92 // helicity angle
93 _h[imode]->fill(abs(pomega.p3().unit().dot(axisOmega)));
94 }
95 }
96
97
98 /// Normalise histograms etc., after the run
99 void finalize() {
100 normalize(_h, 1.0, false);
101 }
102
103 /// @}
104
105
106 /// @name Histograms
107 /// @{
108 Histo1DPtr _h[3];
109 const map<PdgId,unsigned int> mode1 = { { 223,1}, { 321,1}};
110 const map<PdgId,unsigned int> mode1CC = { { 223,1}, {-321,1}};
111 const map<PdgId,unsigned int> mode2 = { { 223,1}, { 211,1}};
112 const map<PdgId,unsigned int> mode2CC = { { 223,1}, {-211,1}};
113 const map<PdgId,unsigned int> mode3 = { { 223,1}, { 130,1}};
114 const map<PdgId,unsigned int> mode3CC = { { 223,1}, { 310,1}};
115 /// @}
116
117
118 };
119
120
121 RIVET_DECLARE_PLUGIN(BELLE_2006_I735859);
122
123}
|