Rivet analyses referenceBELLE_2014_I1309588Cross section for $e^+e^-\to\pi^+\pi^-\pi^0\chi_{b(1,2)}$ for $\sqrt{s}=10.867$ GeVExperiment: BELLE (KEKB) Inspire ID: 1309588 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (5.4, 5.4) GeV Run details:
Measurement ofr the ross section for $e^+e^-\to\pi^+\pi^-\pi^0\chi_{b(1,2)}$ for $\sqrt{s}=10.867$ GeV. The $\omega$ and non-$\omega$ contributions are also measured. Source code: BELLE_2014_I1309588.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/UnstableParticles.hh"
5
6namespace Rivet {
7
8
9 /// @brief e+ e- > pi+ pi- pi0 chi_b
10 class BELLE_2014_I1309588 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2014_I1309588);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // projections
23 declare(FinalState(), "FS");
24 declare(UnstableParticles(), "UFS");
25 for (unsigned int ix=0; ix<3; ++ix) {
26 for (unsigned int iy=0;iy<2;++iy) {
27 book(_h[ix][iy],1+ix,1,1+iy);
28 }
29 }
30 }
31
32 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
33 for (const Particle &child : p.children()) {
34 if (child.children().empty()) {
35 --nRes[child.pid()];
36 --ncount;
37 }
38 else {
39 findChildren(child,nRes,ncount);
40 }
41 }
42 }
43
44
45 /// Perform the per-event analysis
46 void analyze(const Event& event) {
47 const FinalState& fs = apply<FinalState>(event, "FS");
48 map<long,int> nCount;
49 int ntotal(0);
50 for (const Particle& p: fs.particles()) {
51 nCount[p.pid()] += 1;
52 ++ntotal;
53 }
54 const FinalState& ufs = apply<FinalState>(event, "UFS");
55 // loop over any chi mesons
56 for (const Particle & chi : ufs.particles(Cuts::pid==20553 || Cuts::pid==555)) {
57 if (chi.children().empty()) continue;
58 map<long,int> nRes = nCount;
59 int ncount = ntotal;
60 findChildren(chi,nRes,ncount);
61 // first check for 3 pi chi_b
62 bool matched3Pi = false;
63 if (ncount==3) {
64 matched3Pi = true;
65 for (const auto& val : nRes) {
66 if (abs(val.first)==PID::PIPLUS || val.first==PID::PI0) {
67 if (val.second!=1) {
68 matched3Pi = false;
69 break;
70 }
71 }
72 else if (val.second!=0) {
73 matched3Pi = false;
74 break;
75 }
76 }
77 }
78 // then for omega chi_b
79 bool matchedOmega = false;
80 for(const Particle & omega : ufs.particles(Cuts::pid==223)) {
81 Particle parent = omega;
82 while (!parent.parents().empty()) {
83 parent = parent.parents()[0];
84 if (parent.pid()==555 || parent.pid()==20553) break;
85 }
86 if ((parent.pid()==555 || parent.pid()==20553) &&
87 fuzzyEquals(parent.momentum(),chi.momentum())) continue;
88 map<long,int> nRes2 = nRes;
89 int ncount2 = ncount;
90 findChildren(omega,nRes2,ncount2);
91 matchedOmega = true;
92 for(const auto& val : nRes2) {
93 if (val.second!=0) {
94 matchedOmega = false;
95 break;
96 }
97 }
98 if (matchedOmega) break;
99 }
100 if (!matched3Pi && !matchedOmega) continue;
101 unsigned int iloc= chi.pid()==20553 ? 0 : 1;
102 if (matched3Pi) {
103 _h[0][iloc]->fill("10.867"s);
104 }
105 if (matchedOmega) {
106 _h[1][iloc]->fill("10.867"s);
107 }
108 if (matched3Pi && !matchedOmega) {
109 _h[2][iloc]->fill("10.867"s);
110 }
111 break;
112 }
113 }
114
115 /// Normalise histograms etc., after the run
116 void finalize() {
117 for (unsigned int ix=0; ix<3; ++ix) {
118 scale(_h[ix], crossSection()/ sumOfWeights() /picobarn);
119 }
120 }
121
122 /// @}
123
124
125 /// @name Histograms
126 /// @{
127 BinnedHistoPtr<string> _h[3][2];
128 /// @}
129
130
131 };
132
133
134 RIVET_DECLARE_PLUGIN(BELLE_2014_I1309588);
135
136}
|