Rivet analyses referenceBELLE_2015_I1283743Mass distributions in $\Upsilon(5S)\to\pi^+\pi^-\Upsilon(1,2,3S)$Experiment: BELLE (KEKB) Inspire ID: 1283743 Status: VALIDATED Authors:
Beam energies: (5.4, 5.4) GeV Run details:
Measurement of the cross section for $\Upsilon(5S)\to\pi^+\pi^-\Upsilon(1,2,3S)$ in $e^=e^-$ collisions. In addition to the cross sections in the HEPDATa entry the mass distributions are implemented using values read from the plots in the paper. Currently only the mass distributions are implemented, although the data for the angular distributions is available in the YODA file. Source code: BELLE_2015_I1283743.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/Beam.hh"
5
6namespace Rivet {
7
8
9 /// @brief Upsilon(5S) -> pi+pi- Upsilon(1,2,3S)
10 class BELLE_2015_I1283743 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2015_I1283743);
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(Beam(), "Beams");
25 // histograms
26 for (unsigned int ix=0; ix<3; ++ix) {
27 book(_h_sigma[ix],ix+1,1,2);
28 }
29 for (unsigned int ix=0;ix<12;++ix) {
30 // book(_h_angle_ups2[ix],14,1,1+ix);
31 if (ix>=8) continue;
32 book(_h_mass_ups2 [ix],12,1,1+ix);
33 // book(_h_angle_ups3[ix],15,1,1+ix);
34 if (ix>=6) continue;
35 book(_h_mass_all [ix],10,1,1+ix);
36 book(_h_mass_ups1[ix],11,1,1+ix);
37 book(_h_mass_ups3[ix],13,1,1+ix);
38 }
39 }
40
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 // get the axis, direction of incoming electron
45 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
46 Vector3 axis1;
47 if (beams.first.pid()>0) {
48 axis1 = beams.second.mom().p3().unit();
49 }
50 else {
51 axis1 = beams.first .mom().p3().unit();
52 }
53 // find upsilon pi+ pi-
54 Particles fs = apply<FinalState>(event, "FS").particles();
55 Particles UPS, other;
56 for(const Particle & p : fs) {
57 Particle parent=p;
58 Particle ups=p;
59 while (!parent.parents().empty()) {
60 parent=parent.parents()[0];
61 if (parent.pid()==553 ||
62 parent.pid()==100553||
63 parent.pid()==200553) ups=parent;
64 }
65 if (ups.pid()%1000!=553) {
66 other += p;
67 continue;
68 }
69 bool found=false;
70 for (const auto& p : UPS) {
71 // psi already in list
72 if (fuzzyEquals(p.mom(), ups.mom())) {
73 found=true;
74 break;
75 }
76 }
77 if (!found) UPS += ups;
78 }
79 // upsilon + 2 other particles
80 if (UPS.size()!=1 || other.size()!=2) vetoEvent;
81 // other particles pi+ pi-
82 if (!(other[0].pid()==-other[1].pid() && other[0].abspid()==PID::PIPLUS)) vetoEvent;
83 // cross secrtion
84 int iups = UPS[0].pid()/100000;
85 _h_sigma[iups]->fill(string("10.865"));
86 // fill the mass plots
87 double mpipi = (other[0].mom()+other[1].mom()).mass();
88 double mUpspi[2] = {(other[0].mom()+UPS[0].mom()).mass(),
89 (other[1].mom()+UPS[0].mom()).mass()};
90 if (mUpspi[0]<mUpspi[1]) {
91 swap(other[0],other[1]);
92 swap(mUpspi[0],mUpspi[1]);
93 }
94 double mpipi2=sqr(mpipi);
95 double mMax2=sqr(mUpspi[0]);
96 _h_mass_all[iups+3]->fill(mpipi);
97 if (iups==0) {
98 if (mpipi2>0.2) _h_mass_all [0]->fill(mUpspi[0]);
99 if (mpipi2>0.2&&mpipi2<1) _h_mass_ups1[0]->fill(mUpspi[0]);
100 else if (mpipi2>1 && mpipi2<1.5) _h_mass_ups1[1]->fill(mUpspi[0]);
101 else if (mpipi2>1.5) _h_mass_ups1[2]->fill(mUpspi[0]);
102 if (mMax2<105) _h_mass_ups1[3]->fill(mpipi);
103 else if (mMax2>105&&mMax2<110) _h_mass_ups1[4]->fill(mpipi);
104 else if (mMax2>110) _h_mass_ups1[5]->fill(mpipi);
105 }
106 else if (iups==1) {
107 if (mpipi2>0.14) _h_mass_all [1]->fill(mUpspi[0]);
108 if (mpipi2>0.14&&mpipi2<0.3) _h_mass_ups2[0]->fill(mUpspi[0]);
109 else if (mpipi2>0.3&&mpipi2<0.5) _h_mass_ups2[1]->fill(mUpspi[0]);
110 else if (mpipi2>0.5&&mpipi2<0.6) _h_mass_ups2[2]->fill(mUpspi[0]);
111 else if (mpipi2>0.6) _h_mass_ups2[3]->fill(mUpspi[0]);
112 if (mMax2<110) _h_mass_ups2[4]->fill(mpipi);
113 else if (mMax2>110&&mMax2<112) _h_mass_ups2[5]->fill(mpipi);
114 else if (mMax2>112&&mMax2<114) _h_mass_ups2[6]->fill(mpipi);
115 else if (mMax2>114) _h_mass_ups2[7]->fill(mpipi);
116 }
117 else if (iups==2) {
118 if (mpipi2>0.1) _h_mass_all [2]->fill(mUpspi[0]);
119 if (mpipi2>0.1&&mpipi2<0.15) _h_mass_ups3[0]->fill(mUpspi[0]);
120 else if (mpipi2>0.15&& mpipi2<.2) _h_mass_ups3[1]->fill(mUpspi[0]);
121 else if (mpipi2>0.2) _h_mass_ups3[2]->fill(mUpspi[0]);
122 if (mMax2<113) _h_mass_ups3[3]->fill(mpipi);
123 else if (mMax2>113&&mMax2<114) _h_mass_ups3[4]->fill(mpipi);
124 else if (mMax2>114) _h_mass_ups3[5]->fill(mpipi);
125 }
126 // // only angular stuff for 2s and 3s
127 // if(iups==0) return;
128 // double cPi = axis1.dot(other[1].mom().p3().unit());
129 // int iRegion=-1;
130 // if (mUpspi[0]>10.605 && mUpspi[1]<10.635)
131 // iRegion=0;
132 // else if(mUpspi[0]>10.645 && mUpspi[1]<10.675)
133 // iRegion=1;
134 // else if(mUpspi[0]<10.57) {
135 // iRegion=2;
136 // if(iups==2) return;
137 // }
138 // else
139 // return;
140 // if(iups==1) {
141 // _h_angle_ups2[4*iRegion]->fill(cPi);
142 // }
143 // else if(iups==2) {
144 // _h_angle_ups3[4*iRegion]->fill(cPi);
145 // }
146 }
147
148
149 /// Normalise histograms etc., after the run
150 void finalize() {
151 scale(_h_sigma, crossSection()/ sumOfWeights() /picobarn);
152 //normalize(_h_angle_ups2, 1.0, false);
153 normalize(_h_mass_ups2, 1.0, false);
154 //normalize(_h_angle_ups3, 1.0, false);
155 normalize(_h_mass_all, 1.0, false);
156 normalize(_h_mass_ups1, 1.0, false);
157 normalize(_h_mass_ups3, 1.0, false);
158 }
159
160 /// @}
161
162 /// @name Histograms
163 /// @{
164 BinnedHistoPtr<string> _h_sigma[3];
165 Histo1DPtr _h_mass_all[6],_h_mass_ups1[6],
166 _h_mass_ups2[8],_h_mass_ups3[6];
167 // Histo1DPtr _h_angle_ups2[12],_h_angle_ups3[8];
168 /// @}
169
170
171 };
172
173
174 RIVET_DECLARE_PLUGIN(BELLE_2015_I1283743);
175
176}
|