rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2022_I2102455

Mass distributions in $D^+$ and $D^0$ decays to pions
Experiment: BESIII ()
Inspire ID: 2102455
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: * *
Beam energies: ANY
    No run details listed

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}