Rivet analyses referenceBELLE_2009_I803343Mass and angular distributions in $B\to\Lambda^0\bar\Lambda^0 K^{(*)}$Experiment: BELLE (KEKB) Inspire ID: 803343 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of mass and angular distributions in $B^0\to\Lambda^0\bar\Lambda^0 K^0$, $B^+\to\Lambda^0\bar\Lambda^0 K^+$ and $B^0\to\Lambda^0\bar\Lambda^0 K^{*0}$. The data for the mass spectra was read from the tables in the paper and are fully corrected, while those for the angular distributions in the threshold region were read from the figures and may not be corrected. Source code: BELLE_2009_I803343.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 -> Lambda Lambdabar K(*)0
10 class BELLE_2009_I803343 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2009_I803343);
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::pid==511 ||
24 Cuts::pid==521);
25 declare(ufs, "UFS");
26 DecayedParticles BB(ufs);
27 BB.addStable( 3122);
28 BB.addStable(-3122);
29 BB.addStable( 310);
30 BB.addStable( 313);
31 BB.addStable(-313);
32 declare(BB, "BB");
33 // histograms
34 for(unsigned int ix=0;ix<3;++ix) {
35 book(_h_mass[ix],1,1,1+ix);
36 book(_h_angle[ix],2+ix,1,1);
37 }
38 book(_c[0],"TMP/nB0");
39 book(_c[1],"TMP/nBP");
40 }
41
42
43 /// Perform the per-event analysis
44 void analyze(const Event& event) {
45 static const map<PdgId,unsigned int> & mode1 = { { 3122,1},{-3122,1}, { 310,1}};
46 static const map<PdgId,unsigned int> & mode2 = { { 3122,1},{-3122,1}, { 321,1}};
47 static const map<PdgId,unsigned int> & mode2CC = { { 3122,1},{-3122,1}, {-321,1}};
48 static const map<PdgId,unsigned int> & mode3 = { { 3122,1},{-3122,1}, { 313,1}};
49 static const map<PdgId,unsigned int> & mode3CC = { { 3122,1},{-3122,1}, {-313,1}};
50 DecayedParticles BB = apply<DecayedParticles>(event, "BB");
51 // loop over particles
52 for(unsigned int ix=0;ix<BB.decaying().size();++ix) {
53 if(BB.decaying()[ix].abspid()==511) _c[0]->fill();
54 else _c[1]->fill();
55 unsigned int imode=0;
56 if (BB.modeMatches(ix,3,mode1))
57 imode=0;
58 else if((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode2)) ||
59 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode2CC)))
60 imode=1;
61 else if((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode3)) ||
62 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode3CC)))
63 imode=2;
64 else
65 continue;
66 int sign = BB.decaying()[ix].pid()>0 ? 1 : -1;
67 const Particle & Lam = BB.decayProducts()[ix].at( sign*3122)[0];
68 const Particle & LamBar = BB.decayProducts()[ix].at(-sign*3122)[0];
69 FourMomentum pLL = Lam.momentum()+LamBar.momentum();
70 double mass = pLL.mass();
71 _h_mass[imode]->fill(mass);
72 // rest just in threshold region
73 if(mass>2.85) continue;
74 // boost to B rest frame
75 LorentzTransform boost =
76 LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix]. momentum().betaVec());
77 // B+ K+
78 if(imode==1) {
79 pLL = boost.transform(pLL);
80 LorentzTransform boost2 =
81 LorentzTransform::mkFrameTransformFromBeta(pLL.betaVec());
82
83 FourMomentum pLam = boost2.transform(boost.transform(Lam.momentum()));
84 FourMomentum pLamB = boost2.transform(boost.transform(LamBar.momentum()));
85 const Particle & Kp = BB.decayProducts()[ix].at( sign*321)[0];
86 FourMomentum pK = boost2.transform(boost.transform(Kp.momentum()));
87 double cLam = pK.p3().unit().dot(pLamB.p3().unit());
88 _h_angle[1]->fill(cLam);
89 if(Lam.children().size()==2) {
90 Particle proton;
91 if(Lam.children()[0].pid()== sign*2212 &&
92 Lam.children()[1].pid()==-sign*211 ) {
93 proton = Lam.children()[0];
94 }
95 else if(Lam.children()[1].pid()== sign*2212 &&
96 Lam.children()[0].pid()==-sign*211 ){
97 proton = Lam.children()[1];
98 }
99 if(proton.pid()==sign*2212) {
100 LorentzTransform boostL = LorentzTransform::mkFrameTransformFromBeta(pLam.betaVec());
101 FourMomentum pp = boostL.transform(boost2.transform(boost.transform(proton.momentum())));
102 double cTheta = pp.p3().unit().dot(pLam.p3().unit());
103 _h_angle[0]->fill(cTheta);
104 }
105 }
106 }
107 // B0 -> K*0
108 else if(imode==2) {
109 const Particle & Kstar = BB.decayProducts()[ix].at( sign*313)[0];
110 Particle KK;
111 if(Kstar.children()[0].abspid()==321 &&
112 Kstar.children()[1].abspid()==211)
113 KK = Kstar.children()[0];
114 else if(Kstar.children()[1].abspid()==321 &&
115 Kstar.children()[0].abspid()==211)
116 KK = Kstar.children()[1];
117 else continue;
118 FourMomentum pKstar = boost.transform(Kstar.momentum());
119 FourMomentum pK = boost.transform(KK .momentum());
120 const LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
121 pK = boost3.transform(pK);
122 FourMomentum pB = boost3.transform(boost.transform(BB.decaying()[ix].momentum()));
123 double cosK = -pB.p3().unit().dot(pK.p3().unit());
124 _h_angle[2]->fill(cosK);
125 }
126 }
127 }
128
129
130 /// Normalise histograms etc., after the run
131 void finalize() {
132 for(unsigned int ix=0;ix<3;++ix) {
133 if(ix%2==0) scale(_h_mass[ix],1e6/ *_c[0]);
134 else scale(_h_mass[ix],1e6/ *_c[1]);
135 normalize(_h_angle[ix]);
136 }
137 }
138
139 /// @}
140
141 /// @name Histograms
142 /// @{
143 Histo1DPtr _h_mass[3],_h_angle[3];
144 CounterPtr _c[2];
145 /// @}
146
147
148 };
149
150
151 RIVET_DECLARE_PLUGIN(BELLE_2009_I803343);
152
153}
|