Rivet analyses referenceBELLE_2013_I1239347Mass and angular distributions in the decay $B^0\to\psi(2S) K^+\pi^-$Experiment: BELLE (KEKB) Inspire ID: 1239347 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurment of mass and angular distributions in $B^0\to\psi(2s)K^++\pi^-$ decays. The data were read from the figures in the paper and may not be corrected. Source code: BELLE_2013_I1239347.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 B0 -> psi(2S) K+ pi-
10 class BELLE_2013_I1239347 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2013_I1239347);
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 declare(ufs, "UFS");
25 DecayedParticles B0(ufs);
26 B0.addStable(100443);
27 declare(B0, "B0");
28 // histograms
29 for(unsigned int ix=0;ix<8;++ix)
30 book(_h_mass[ix],1,1,1+ix);
31 book(_h_mass[8],2,1,1);
32 for(unsigned int ix=0;ix<2;++ix)
33 book(_h_angle[ix],3,1,1+ix);
34 }
35
36
37 /// Perform the per-event analysis
38 void analyze(const Event& event) {
39 static const map<PdgId,unsigned int> & mode = { { 321,1},{-211,1}, { 100443,1}};
40 static const map<PdgId,unsigned int> & modeCC = { {-321,1},{ 211,1}, { 100443,1}};
41 DecayedParticles B0 = apply<DecayedParticles>(event, "B0");
42 // loop over particles
43 for(unsigned int ix=0;ix<B0.decaying().size();++ix) {
44 int sign = 1;
45 if (B0.decaying()[ix].pid()>0 && B0.modeMatches(ix,3,mode)) {
46 sign=1;
47 }
48 else if (B0.decaying()[ix].pid()<0 && B0.modeMatches(ix,3,modeCC)) {
49 sign=-1;
50 }
51 else
52 continue;
53 const Particle & Kp = B0.decayProducts()[ix].at( 321*sign)[0];
54 const Particle & pim = B0.decayProducts()[ix].at(-211*sign)[0];
55 const Particle & psi = B0.decayProducts()[ix].at( 100443 )[0];
56 double mKpi = (Kp .momentum()+pim.momentum()).mass();
57 double m2Psipi= (psi.momentum()+pim.momentum()).mass2();
58 if(m2Psipi<19.) _h_mass[0]->fill(sqr(mKpi));
59 else if(m2Psipi>=19. && m2Psipi<20.5) _h_mass[1]->fill(sqr(mKpi));
60 else if(m2Psipi>=20.5) _h_mass[2]->fill(sqr(mKpi));
61
62 if(mKpi<0.796) {
63 _h_mass[3]->fill(m2Psipi);
64 _h_mass[8]->fill(m2Psipi);
65 }
66 else if(mKpi>=0.796&&mKpi<0.996)
67 _h_mass[4]->fill(m2Psipi);
68 else if(mKpi>=0.996&&mKpi<1.332) {
69 _h_mass[5]->fill(m2Psipi);
70 _h_mass[8]->fill(m2Psipi);
71 }
72 else if(mKpi>=1.332&&mKpi<1.532)
73 _h_mass[6]->fill(m2Psipi);
74 else if(mKpi>=1.532) {
75 _h_mass[7]->fill(m2Psipi);
76 _h_mass[8]->fill(m2Psipi);
77 }
78 // need leptonic psi' decay for angular dists
79 if(psi.children().size()!=2|| psi.children()[0].pid()!=-psi.children()[1].pid() ||
80 (psi.children()[0].abspid()!=11 &&
81 psi.children()[0].abspid()!=11)) vetoEvent;
82 Particle lm = psi.children()[0];
83 Particle lp = psi.children()[1];
84 if(lm.pid()<0) swap(lm,lp);
85 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(B0.decaying()[ix].momentum().betaVec());
86 FourMomentum pKstar = boost1.transform(Kp.momentum()+pim.momentum());
87 FourMomentum pPsi = boost1.transform(psi.momentum());
88 // trans vector in K* frame
89 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
90 FourMomentum pKp = boost2.transform(boost1.transform(Kp.momentum()));
91 Vector3 axis1 = pKstar.p3().unit();
92 double cTheta1 = axis1.dot(pKp.p3().unit());
93 Vector3 trans1 = pKp.p3() - cTheta1*pKp.p3().mod()*axis1;
94 // leptons in psi' frame
95 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pPsi.betaVec());
96 FourMomentum plm = boost3.transform(boost1.transform(lm.momentum()));
97 double cTheta2 = axis1.dot(plm.p3().unit());
98 Vector3 trans2 = plm.p3() - cTheta2*plm.p3().mod()*axis1;
99 _h_angle[0]->fill(cTheta2);
100 // angle between planes
101 double chi = atan2(trans1.cross(trans2).dot(axis1),trans1.dot(trans2));
102 _h_angle[1]->fill(chi);
103 }
104 }
105
106
107 /// Normalise histograms etc., after the run
108 void finalize() {
109 for(unsigned int ix=0;ix<9;++ix)
110 normalize(_h_mass[ix],1.,false);
111 normalize(_h_angle[0],1.,false);
112 normalize(_h_angle[1],1.,false);
113 }
114
115 /// @}
116
117
118 /// @name Histograms
119 /// @{
120 Histo1DPtr _h_mass[9],_h_angle[2];
121 /// @}
122
123
124 };
125
126
127 RIVET_DECLARE_PLUGIN(BELLE_2013_I1239347);
128
129}
|