Rivet analyses referenceBESIII_2022_I2102455Mass distributions in $D^+$ and $D^0$ decays to pionsExperiment: BESIII () Inspire ID: 2102455 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY
Measurement of the mass distributions in $D^+$ and $D^0$ decays to pions by the BESIII collaboration. The data were read from the plots in the paper and therefore for some points the error bars are the size of the point. It is also not clear that any resolution effects have been unfolded. Source code: BESIII_2022_I2102455.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 D0/D+ to pions
10 class BESIII_2022_I2102455 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2022_I2102455);
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::abspid==411 or Cuts::abspid==421);
24 declare(ufs, "UFS");
25 DecayedParticles DD(ufs);
26 DD.addStable(PID::PI0);
27 DD.addStable(PID::K0S);
28 declare(DD, "DD");
29 // histograms
30 vector<unsigned int> nHist = {3,7,9,14,2,2,5,4,11};
31 for(unsigned int ix=0;ix<9;++ix) {
32 _h.push_back(vector<Histo1DPtr>());
33 for(unsigned int iy=0;iy<nHist[ix];++iy) {
34 Histo1DPtr tmp;
35 book(tmp,ix+1,1,iy+1);
36 _h[ix].push_back(tmp);
37 }
38 }
39 }
40
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 // define the decay mode
45 static const map<PdgId,unsigned int> & mode1 = { { 211,1}, { -211,1}, { 111,1} };
46 static const map<PdgId,unsigned int> & mode2 = { { 211,1}, { -211,1}, { 111,2} };
47 static const map<PdgId,unsigned int> & mode3 = { { 211,2}, { -211,2}, { 111,1} };
48 static const map<PdgId,unsigned int> & mode4 = { { 211,2}, { -211,2}, { 111,2} };
49 static const map<PdgId,unsigned int> & mode5 = { { 211,2}, { -211,1}};
50 static const map<PdgId,unsigned int> & mode5CC = { { 211,1}, { -211,2}};
51 static const map<PdgId,unsigned int> & mode6 = { { 211,1}, { 111,2}};
52 static const map<PdgId,unsigned int> & mode6CC = { {-211,1}, { 111,2}};
53 static const map<PdgId,unsigned int> & mode7 = { { 211,2}, { -211,1}, { 111,1} };
54 static const map<PdgId,unsigned int> & mode7CC = { { 211,1}, { -211,2}, { 111,1} };
55 static const map<PdgId,unsigned int> & mode8 = { { 211,3}, { -211,2}};
56 static const map<PdgId,unsigned int> & mode8CC = { { 211,2}, { -211,3}};
57 static const map<PdgId,unsigned int> & mode9 = { { 211,3}, { -211,2}, { 111,1} };
58 static const map<PdgId,unsigned int> & mode9CC = { { 211,2}, { -211,3}, { 111,1} };
59 DecayedParticles DD = apply<DecayedParticles>(event, "DD");
60 // loop over particles
61 for(unsigned int ix=0;ix<DD.decaying().size();++ix) {
62 int sign = DD.decaying()[ix].pid()/DD.decaying()[ix].abspid();
63 // D0 -> pi+ pi- pi0
64 if ( DD.modeMatches(ix,3,mode1)) {
65 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
66 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
67 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
68 // KS0 veto
69 double mpm = (pip[0].momentum()+pim[0].momentum()).mass();
70 if(mpm>.468 && mpm<.528) continue;
71 _h[0][0]->fill((pip[0].momentum()+pi0[0].momentum()).mass());
72 _h[0][1]->fill((pim[0].momentum()+pi0[0].momentum()).mass());
73 _h[0][2]->fill(mpm);
74 }
75 // D0 -> pi+ pi- 2pi0
76 else if ( DD.modeMatches(ix,4,mode2)) {
77 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
78 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
79 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
80 // KS0 veto
81 FourMomentum ppm = pip[0].momentum()+pim[0].momentum();
82 double mpm = ppm.mass();
83 if(mpm>.468 && mpm<.528) continue;
84 FourMomentum p00 = pi0[0].momentum()+pi0[1].momentum();
85 double m00 = p00.mass();
86 if(m00>.428 && m00<.548) continue;
87 _h[1][0]->fill((pip[0].momentum()+pi0[0].momentum()).mass());
88 _h[1][0]->fill((pip[0].momentum()+pi0[1].momentum()).mass());
89 _h[1][1]->fill((pim[0].momentum()+pi0[0].momentum()).mass());
90 _h[1][1]->fill((pim[0].momentum()+pi0[1].momentum()).mass());
91 _h[1][2]->fill(mpm);
92 _h[1][3]->fill((pi0[0].momentum()+pi0[1].momentum()).mass());
93 _h[1][4]->fill((p00+pip[0].momentum()).mass());
94 _h[1][5]->fill((p00+pim[0].momentum()).mass());
95 _h[1][6]->fill((ppm+pi0[0].momentum()).mass());
96 _h[1][6]->fill((ppm+pi0[1].momentum()).mass());
97 }
98 // D0 -> 2pi+ 2pi- pi0
99 else if ( DD.modeMatches(ix,5,mode3)) {
100 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
101 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
102 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
103 // pi+ pi- masses and KS0 veto
104 double mpm[4];
105 bool veto=false;
106 for(unsigned int ix=0;ix<2;++ix) {
107 for(unsigned int iy=0;iy<2;++iy) {
108 mpm[2*ix+iy] = (pip[ix].momentum()+pim[iy].momentum()).mass();
109 if(mpm[2*ix+iy]>.468 && mpm[2*ix+iy]<.528) veto=true;
110 }
111 }
112 if(veto) continue;
113 // fill the histograms
114 FourMomentum ppp = pip[0].momentum()+pip[1].momentum();
115 FourMomentum pmm = pim[0].momentum()+pim[1].momentum();
116 for(unsigned int ix=0;ix<2;++ix) {
117 _h[2][0]->fill((pip[ix].momentum()+pi0[0].momentum()).mass());
118 _h[2][1]->fill((pim[ix].momentum()+pi0[0].momentum()).mass());
119 _h[2][3]->fill((ppp+pim[ix].momentum()).mass());
120 _h[2][4]->fill((pmm+pip[ix].momentum()).mass());
121 _h[2][6]->fill((ppp+pim[ix].momentum()+pi0[0].momentum()).mass());
122 _h[2][7]->fill((pmm+pip[ix].momentum()+pi0[0].momentum()).mass());
123 for(unsigned int iy=0;iy<2;++iy) {
124 _h[2][2]->fill(mpm[2*ix+iy]);
125 _h[2][5]->fill((pip[ix].momentum()+pim[iy].momentum()+pi0[0].momentum()).mass());
126 }
127 }
128 _h[2][8]->fill((ppp+pmm).mass());
129 }
130 // D0 -> 2pi+ 2pi- pi0
131 else if ( DD.modeMatches(ix,6,mode4)) {
132 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
133 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
134 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
135 // pi+ pi- masses and KS0 veto
136 double mpm[4];
137 bool veto=false;
138 for(unsigned int ix=0;ix<2;++ix) {
139 for(unsigned int iy=0;iy<2;++iy) {
140 mpm[2*ix+iy] = (pip[ix].momentum()+pim[iy].momentum()).mass();
141 if(mpm[2*ix+iy]>.468 && mpm[2*ix+iy]<.528) veto=true;
142 }
143 }
144 if(veto) continue;
145 FourMomentum p00 = pi0[0].momentum()+pi0[1].momentum();
146 double m00 = p00.mass();
147 if(m00>.428 && m00<.548) continue;
148 // fill the histograms
149 _h[3][3]->fill(m00);
150 FourMomentum ppp = pip[0].momentum()+pip[1].momentum();
151 FourMomentum pmm = pim[0].momentum()+pim[1].momentum();
152 for(unsigned int ix=0;ix<2;++ix) {
153 for(unsigned int i0=0;i0<2;++i0) {
154 _h[3][ 0]->fill((pip[ix].momentum()+pi0[i0].momentum()).mass());
155 _h[3][ 1]->fill((pim[ix].momentum()+pi0[i0].momentum()).mass());
156 _h[3][ 7]->fill((ppp+pim[ix].momentum()+pi0[i0].momentum()).mass());
157 _h[3][ 8]->fill((pmm+pip[ix].momentum()+pi0[i0].momentum()).mass());
158 _h[3][11]->fill((ppp+pim[ix].momentum()+p00).mass());
159 _h[3][12]->fill((pmm+pip[ix].momentum()+p00).mass());
160 _h[3][13]->fill((pmm+pi0[ix].momentum()+ppp).mass());
161 for(unsigned int iy=0;iy<2;++iy)
162 _h[3][6]->fill((pip[ix].momentum()+pim[iy].momentum()+pi0[i0].momentum()).mass());
163 }
164 _h[3][4]->fill((ppp+pim[ix].momentum()).mass());
165 _h[3][5]->fill((pmm+pip[ix].momentum()).mass());
166 for(unsigned int iy=0;iy<2;++iy) {
167 _h[3][ 2]->fill(mpm[2*ix+iy]);
168 _h[3][10]->fill((pip[ix].momentum()+pim[iy].momentum()+p00).mass());
169 }
170 }
171 _h[3][9]->fill((ppp+pmm).mass());
172 }
173 // D+ -> 2pi+ pi-
174 else if ( DD.modeMatches(ix,3,mode5 ) ||
175 DD.modeMatches(ix,3,mode5CC)) {
176 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
177 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
178 // pi+ pi- masses and KS0 veto
179 double mpm[2];
180 bool veto=false;
181 for(unsigned int ix=0;ix<2;++ix) {
182 mpm[ix] = (pip[ix].momentum()+pim[0].momentum()).mass();
183 if(mpm[ix]>.468 && mpm[ix]<.528) veto=true;
184 }
185 if(veto) continue;
186 _h[4][0]->fill((pip[0].momentum()+pip[1].momentum()).mass());
187 for(unsigned int ix=0;ix<2;++ix) {
188 _h[4][1]->fill(mpm[ix]);
189 }
190 }
191 // D+ -> pi+ 2pi0
192 else if ( DD.modeMatches(ix,3,mode6 ) ||
193 DD.modeMatches(ix,3,mode6CC)) {
194 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
195 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
196 FourMomentum p00 = pi0[0].momentum()+pi0[1].momentum();
197 double m00 = p00.mass();
198 if(m00>.428 && m00<.548) continue;
199 // fill the histograms
200 _h[5][1]->fill(m00);
201 for(unsigned int ix=0;ix<2;++ix) {
202 _h[5][0]->fill((pip[0].momentum()+pi0[ix].momentum()).mass());
203 }
204 }
205 // D+ -> 2pi+ pi- pi0
206 else if ( DD.modeMatches(ix,4,mode7 ) ||
207 DD.modeMatches(ix,4,mode7CC)) {
208 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
209 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
210 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
211 // pi+ pi- masses and KS0 veto
212 double mpm[2];
213 bool veto=false;
214 for(unsigned int ix=0;ix<2;++ix) {
215 mpm[ix] = (pip[ix].momentum()+pim[0].momentum()).mass();
216 if(mpm[ix]>.468 && mpm[ix]<.528) veto=true;
217 }
218 if(veto) continue;
219 _h[6][1]->fill((pim[0].momentum()+pi0[0].momentum()).mass());
220 _h[6][3]->fill((pim[0].momentum()+pip[0].momentum()+pip[1].momentum()).mass());
221 for(unsigned int ix=0;ix<2;++ix) {
222 _h[6][0]->fill((pip[ix].momentum()+pi0[0].momentum()).mass());
223 _h[6][2]->fill(mpm[ix]);
224 _h[6][4]->fill((pip[ix].momentum()+pim[0].momentum()+pi0[0].momentum()).mass());
225 }
226 }
227 // D+ -> 3pi+ 2pi-
228 else if ( DD.modeMatches(ix,5,mode8 ) ||
229 DD.modeMatches(ix,5,mode8CC)) {
230 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
231 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
232 // pi+ pi- masses and KS0 veto
233 double mpm[3][2];
234 bool veto=false;
235 for(unsigned int ix=0;ix<3;++ix) {
236 for(unsigned int iy=0;iy<2;++iy) {
237 mpm[ix][iy] = (pip[ix].momentum()+pim[iy].momentum()).mass();
238 if(mpm[ix][iy]>.468 && mpm[ix][iy]<.528) veto=true;
239 }
240 }
241 if(veto) continue;
242 FourMomentum pppp = pip[0].momentum()+pip[1].momentum()+pip[2].momentum();
243 FourMomentum pmm = pim[0].momentum()+pim[1].momentum();
244 for(unsigned int ix=0;ix<3;++ix) {
245 _h[7][2]->fill((pmm+pip[ix].momentum()).mass());
246 for(unsigned int iy=0;iy<2;++iy) {
247 _h[7][0]->fill(mpm[ix][iy]);
248 _h[7][1]->fill((pppp-pip[ix].momentum()+pim[iy].momentum()).mass());
249 }
250 }
251 for(unsigned int iy=0;iy<2;++iy)
252 _h[7][3]->fill((pppp+pim[iy].momentum()).mass());
253 }
254 // D+ -> 3pi+ 2pi- pi0
255 else if ( DD.modeMatches(ix,6,mode9 ) ||
256 DD.modeMatches(ix,6,mode9CC)) {
257 const Particles & pip = DD.decayProducts()[ix].at( sign*211);
258 const Particles & pim = DD.decayProducts()[ix].at(-sign*211);
259 const Particles & pi0 = DD.decayProducts()[ix].at( 111);
260 // pi+ pi- masses and KS0 veto
261 double mpm[3][2];
262 bool veto=false;
263 for(unsigned int ix=0;ix<3;++ix) {
264 for(unsigned int iy=0;iy<2;++iy) {
265 mpm[ix][iy] = (pip[ix].momentum()+pim[iy].momentum()).mass();
266 if(mpm[ix][iy]>.468 && mpm[ix][iy]<.528) veto=true;
267 }
268 }
269 if(veto) continue;
270 FourMomentum pppp = pip[0].momentum()+pip[1].momentum()+pip[2].momentum();
271 FourMomentum pmm = pim[0].momentum()+pim[1].momentum();
272 FourMomentum pcharged = pppp+pmm;
273 _h[8][9]->fill(pcharged.mass());
274 for(unsigned int ix=0;ix<3;++ix) {
275 _h[8][0]->fill((pip[ix].momentum()+pi0[0].momentum()).mass());
276 FourMomentum pmmp = (pmm+pip[ix].momentum());
277 _h[8][ 4]->fill(pmmp.mass());
278 _h[8][ 7]->fill((pmmp+pi0[0].momentum()).mass());
279 _h[8][ 8]->fill((pcharged-pip[ix].momentum()).mass());
280 _h[8][10]->fill((pcharged-pip[ix].momentum()+pi0[0].momentum()).mass());
281 for(unsigned int iy=0;iy<2;++iy) {
282 _h[8][2]->fill(mpm[ix][iy]);
283 FourMomentum pppm = (pppp-pip[ix].momentum()+pim[iy].momentum());
284 _h[8][3]->fill(pppm.mass());
285 _h[8][6]->fill((pppm+pi0[0].momentum()).mass());
286 _h[8][5]->fill((pip[ix].momentum()+pim[iy].momentum()+pi0[0].momentum()).mass());
287 }
288 }
289 for(unsigned int iy=0;iy<2;++iy) {
290 _h[8][1]->fill((pim[iy].momentum()+pi0[0].momentum()).mass());
291 }
292 }
293 }
294 }
295
296
297 /// Normalise histograms etc., after the run
298 void finalize() {
299 for(unsigned int ix=0;ix<_h.size();++ix) {
300 for(unsigned int iy=0;iy<_h[ix].size();++iy) {
301 normalize(_h[ix][iy]);
302 }
303 }
304 }
305
306 /// @}
307
308
309 /// @name Histograms
310 /// @{
311 vector<vector<Histo1DPtr> > _h;
312 /// @}
313
314
315 };
316
317
318 RIVET_DECLARE_PLUGIN(BESIII_2022_I2102455);
319
320}
|