Rivet analyses referenceBELLE_2023_I2660525Cross sections for $e^+e^-\to b\bar{b} \to (D_s^+,D^0)X$ for $\sqrt{s}$ between 10.63 and 11.02 GeVExperiment: BELLE (KEKB) Inspire ID: 2660525 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
The cross sections for $e^+e^-\to b\bar{b} \to (D_s^+,D^0)X$ are measured for $\sqrt{s}$ between 10.63 and 11.02 GeV. The cross sections for $e^+e^-\to b\bar{b} \to B\bar{B}X$ and $e^+e^-\to b\bar{b} \to B_s^0\bar{B}_s^0X$ are then extracted. In addition the $D_s^+$, $D^0$ spectra in $\Upsilon(4,5S)$ decays are measured. There are two modes, one DECAY (the default), for the spectra in the decays and a second SIGMA for the cross sections. Source code: BELLE_2023_I2660525.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 D_s D0 production in e+e-
10 class BELLE_2023_I2660525 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2023_I2660525);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22
23 // Initialise and register projections
24 declare(UnstableParticles(), "UFS");
25 _mode=0;
26 if ( getOption("MODE") == "DECAY" ) _mode=0;
27 else if ( getOption("MODE") == "SIGMA" ) _mode=1;
28 // Upsilon decays
29 if (_mode==0) {
30 for (unsigned int ix=0;ix<2;++ix) {
31 book(_c[ix],"TMP/n_Ups_"+toString(ix+4));
32 book(_h_x [0][ix],3,1,ix+3);
33 book(_h_x [1][ix],3,1,ix+1);
34 for (unsigned int iy=0;iy<2;++iy) {
35 book(_h_br[ix][iy],1,1,2*ix+iy+1);
36 }
37 }
38 book(_h_fs,1,1,5);
39 }
40 else {
41 for (unsigned int ix=0;ix<4;++ix) {
42 book(_sigma[ix],2,1,1+ix);
43 }
44 for (const string& en : _sigma[0].binning().edges<0>()) {
45 double end = std::stod(en)*GeV;
46 if (isCompatibleWithSqrtS(end)) {
47 _ecms = en;
48 break;
49 }
50 }
51 if(_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
52 }
53 }
54
55 void findDecayProducts(const Particle& p, bool& hasBs, Particles& d0, Particles& ds) {
56 for (const Particle& child : p.children()) {
57 hasBs |= child.abspid()==531;
58 if (child.abspid()==431) {
59 ds.push_back(child);
60 }
61 else if (child.abspid()==421) {
62 d0.push_back(child);
63 }
64 else if (!child.children().empty()) {
65 findDecayProducts(child,hasBs,d0,ds);
66 }
67 }
68 }
69
70 /// Perform the per-event analysis
71 void analyze(const Event& event) {
72 // Upsilon(4,5S) decay
73 if (_mode==0) {
74 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
75 Particles upsilons = ufs.particles(Cuts::pid==300553 || Cuts::pid==400553 || Cuts::pid==9000553);
76 for (const Particle& ups : upsilons) {
77 unsigned int iups = ups.pid()==300553 ? 0 : 1;
78 _c[iups]->fill();
79 LorentzTransform cms_boost;
80 if (ups.p3().mod() > 1*MeV)
81 cms_boost = LorentzTransform::mkFrameTransformFromBeta(ups.mom().betaVec());
82 Particles ds,d0;
83 bool hasBs=false;
84 findDecayProducts(ups, hasBs, d0, ds);
85 if(iups==1&&hasBs) _h_fs->fill();
86 for (const Particle & p : ds) {
87 FourMomentum p2 = cms_boost.transform(p.mom());
88 double x = p2.p3().mod()/sqrt(0.25*ups.mass2()-p2.mass2());
89 _h_br[iups][0]->fill();
90 _h_x [iups][0]->fill(x );
91
92 }
93 for (const Particle & p : d0) {
94 FourMomentum p2 = cms_boost.transform(p.mom());
95 double x = p2.p3().mod()/sqrt(0.25*ups.mass2()-p2.mass2());
96 _h_br[iups][1]->fill();
97 _h_x [iups][1]->fill(x);
98 }
99 }
100 }
101 else {
102 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
103 Particles B = ufs.particles(Cuts::abspid==511 || Cuts::abspid==521);
104 Particles Bs = ufs.particles(Cuts::abspid==531);
105 // require B mesons
106 if(B.empty() && Bs.empty()) vetoEvent;
107 if(!B.empty()) _sigma[3]->fill(_ecms);
108 Particles Ds = ufs.particles(Cuts::abspid==431);
109 for (unsigned int ix=0;ix<Ds.size();++ix) {
110 _sigma[0]->fill(_ecms);
111 }
112 Particles D0 = ufs.particles(Cuts::abspid==421);
113 for (unsigned int ix=0;ix<D0.size();++ix) {
114 _sigma[1]->fill(_ecms);
115 }
116 if (!Bs.empty() && !Ds.empty()) {
117 for (const Particle& p : Bs) {
118 if (p.children().size()==1) continue;
119 Particles ds,d0;
120 bool hasBs=false;
121 findDecayProducts(p, hasBs, d0, ds);
122 for (unsigned int ix=0;ix<ds.size();++ix) _sigma[2]->fill(_ecms);
123 }
124 }
125 }
126 }
127
128 /// Normalise histograms etc., after the run
129 void finalize() {
130 if (_mode==0) {
131 for (unsigned int ix=0;ix<2;++ix) {
132 if (_c[ix]->numEntries()==0) continue;
133 scale(_h_x[ix], 1.0/ *_c[ix]);
134 // brs in % and at 4S /2 as br is for B decays
135 if (ix==0) scale(_h_br[ix], 50 / *_c[ix]);
136 else scale(_h_br[ix], 100./ *_c[ix]);
137 if(ix==1) scale(_h_fs,100./ *_c[1]);
138 }
139 }
140 else {
141 scale(_sigma, crossSection()/ sumOfWeights() /picobarn);
142 }
143 }
144 /// @}
145
146
147 /// @name Histograms
148 /// @{
149 unsigned int _mode;
150 Histo1DPtr _h_x[2][2];
151 CounterPtr _h_br[2][2],_h_fs,_c[2];
152 BinnedHistoPtr<string> _sigma[4];
153 string _ecms;
154 /// @}
155
156
157 };
158
159
160 RIVET_DECLARE_PLUGIN(BELLE_2023_I2660525);
161
162}
|