Rivet analyses referenceBELLE_2008_I759262Cross section for $e^+e^-\to J/\psi X(3940), X(4160)$ at $\sqrt{s}=10.6\,$GeVExperiment: BELLE (KEKB) Inspire ID: 759262 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (5.3, 5.3) GeV Run details:
Cross section for $e^+e^-\to J/\psi X(3940)/X(4160)$ at $\sqrt{s}=10.6\,$GeV. The $X(3940)$ is measured using $D^*\bar{D}$ modes while the $X(4160)$ mode is measured using $D^*\bar{D}^*$ modes. The status of the $X(3940)$ is not clear, we take the PDG code to be 9010441, which can be changed using the PID3940 option. For the $X(4160)$ spin, partiy, $2^-$ is favoured and therefore we use 9010445, which can be changed using the PID4160 option. Source code: BELLE_2008_I759262.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- > J/psi X(3940) or X(4160)
10 class BELLE_2008_I759262 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2008_I759262);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // set the PDG code
23 _pid[0] = getOption<int>("PID3940", 9010441);
24 _pid[1] = getOption<int>("PID4160", 9010445);
25 // projections
26 declare("FS",FinalState());
27 declare("UFS",UnstableParticles(Cuts::pid==443 ||
28 Cuts::pid==_pid[0] ||
29 Cuts::pid==_pid[1]));
30 // histograms
31 for (unsigned int ix=0; ix<2; ++ix) {
32 book(_h[ix], 1, 1, 1+ix);
33 }
34 }
35
36 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount,
37 unsigned int & nCharged) {
38 for (const Particle &child : p.children()) {
39 if (child.children().empty()) {
40 --nRes[child.pid()];
41 --ncount;
42 if (PID::isCharged(p.pid())) ++nCharged;
43 }
44 else {
45 findChildren(child,nRes,ncount,nCharged);
46 }
47 }
48 }
49
50 /// Perform the per-event analysis
51 void analyze(const Event& event) {
52 // final state particles
53 const FinalState& fs = apply<FinalState>(event, "FS");
54 map<long,int> nCount;
55 int ntotal(0);
56 for (const Particle& p : fs.particles()) {
57 nCount[p.pid()] += 1;
58 ++ntotal;
59 }
60 // loop over J/psi
61 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
62 bool matched=false;
63 for (const Particle& p : ufs.particles(Cuts::pid==443)) {
64 if (p.children().empty()) continue;
65 map<long,int> nRes = nCount;
66 int ncount = ntotal;
67 unsigned int nCharged=0;
68 findChildren(p,nRes,ncount,nCharged);
69 // X(3940)/X(4160)
70 for (const Particle& p2 : ufs.particles(Cuts::pid!=443)) {
71 map<long,int> nResB = nRes;
72 int ncountB = ncount;
73 unsigned int nChargedB=0;
74 findChildren(p2,nResB,ncountB,nChargedB);
75 if (ncountB!=0) continue;
76 matched = true;
77 for (const auto& val : nResB) {
78 if (val.second!=0) {
79 matched = false;
80 break;
81 }
82 }
83 if (matched) {
84 if (p2.children().size()!=2) break;
85 if (p2.children()[0].pid()*p2.children()[1].pid()>0) break;
86 if (p2.pid()==_pid[0]) {
87 if ((p2.children()[0].abspid()==413 && p2.children()[1].abspid()==411) ||
88 (p2.children()[1].abspid()==413 && p2.children()[0].abspid()==411) ||
89 (p2.children()[0].abspid()==423 && p2.children()[1].abspid()==421) ||
90 (p2.children()[1].abspid()==423 && p2.children()[0].abspid()==421))
91 _h[0]->fill("10.6"s);
92 }
93 else {
94 if (p2.children()[0].pid()==-p2.children()[1].pid() &&
95 (p2.children()[0].abspid()==413 || p2.children()[0].abspid()==423))
96 _h[1]->fill("10.6"s);
97 }
98 break;
99 }
100 }
101 if (matched) break;
102 }
103 }
104
105
106 /// Normalise histograms etc., after the run
107 void finalize() {
108 scale(_h, crossSection()/ sumOfWeights() /femtobarn);
109 }
110
111 /// @}
112
113
114 /// @name Histograms
115 /// @{
116 int _pid[2];
117 BinnedHistoPtr<string> _h[2];
118 /// @}
119
120
121 };
122
123
124 RIVET_DECLARE_PLUGIN(BELLE_2008_I759262);
125
126}
|