rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ND_1991_I321108

Cross sections for $e^+e^-\to$ exclusive hadronic states between 0.5 and 1.4 GeV.
Experiment: ND (VEPP-2M)
Inspire ID: 321108
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • PRep 202,99
Beams: e+ e-
Beam energies: ANY
Run details:
  • e+ e- to hadrons

Measurement of the cross section for $e^+e^-\to \pi^+\pi^-$, $K^+K^-$, $K^0_SK^0_L$, $\pi^+\pi^-\pi^0$, $2\pi^+2\pi^-$, $\pi^+\pi^-2\pi^0$, $\omega\pi^0$, $\eta\pi^+\pi^-$ and $2\pi^+2\pi^-\pi^0$ by ND for energies between 0.5 and 1.4 GeV.

Source code: ND_1991_I321108.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 ND measurement of exclusive hadronic final states
 10  class ND_1991_I321108 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(ND_1991_I321108);
 15
 16
 17    /// @name Analysis methods
 18    //@{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22
 23      // Initialise and register projections
 24      declare(FinalState(), "FS");
 25      declare(UnstableParticles(), "UFS");
 26
 27      book(_nOmegaPi, "TMP/OmegaPi");
 28      book(_n2Pi, "TMP/2Pi");
 29      book(_n3Pi, "TMP/3Pi");
 30      book(_n4PiC, "TMP/4PiC");
 31      book(_n4PiN, "TMP/4PiN");
 32      book(_nEtaPiPi, "TMP/EtaPiPi");
 33      book(_nKC, "TMP/KC");
 34      book(_nKN, "TMP/KN");
 35      book(_n5Pi, "TMP/5Pi");
 36    }
 37
 38
 39    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 40      for (const Particle &child : p.children()) {
 41	if(child.children().empty()) {
 42	  --nRes[child.pid()];
 43	  --ncount;
 44	}
 45	else
 46	  findChildren(child,nRes,ncount);
 47      }
 48    }
 49
 50    /// Perform the per-event analysis
 51    void analyze(const Event& event) {
 52
 53      const FinalState& fs = apply<FinalState>(event, "FS");
 54
 55      map<long,int> nCount;
 56      int ntotal(0);
 57      for (const Particle& p : fs.particles()) {
 58	nCount[p.pid()] += 1;
 59	++ntotal;
 60      }
 61      if(ntotal==2) {
 62	if(nCount[211]==1&&nCount[-211]==1)
 63	  _n2Pi->fill();
 64	if(nCount[321]==1&&nCount[-321]==1)
 65	  _nKC->fill();
 66	if(nCount[310]==1&&nCount[130]==1)
 67	  _nKN->fill();
 68      }
 69      else if(ntotal==3) {
 70	if(nCount[211]==1&&nCount[-211]==1&&nCount[111]==1)
 71	  _n3Pi->fill();
 72      }
 73      else if(ntotal==4) {
 74	if(nCount[211]==2&&nCount[-211]==2)
 75	  _n4PiC->fill();
 76	else if(nCount[211]==1&&nCount[-211]==1&&nCount[111]==2)
 77	  _n4PiN->fill();
 78      }
 79      else if(ntotal==5) {
 80	if(nCount[211]==2&&nCount[-211]==2&&nCount[111]==1)
 81	  _n5Pi->fill();
 82      }
 83      
 84      const FinalState& ufs = apply<FinalState>(event, "UFS");
 85      for (const Particle& p : ufs.particles()) {
 86	if(p.children().empty()) continue;
 87	// find the eta
 88	if(p.pid()==221) {
 89	  map<long,int> nRes = nCount;
 90	  int ncount = ntotal;
 91	  findChildren(p,nRes,ncount);
 92	  // eta pi+pi-
 93	  if(ncount!=2) continue;
 94	  bool matched = true;
 95	  for(auto const & val : nRes) {
 96	    if(abs(val.first)==211) {
 97	      if(val.second !=1) {
 98		matched = false;
 99		break;
100	      }
101	    }
102	    else if(val.second!=0) {
103	      matched = false;
104	      break;
105	    }
106	  }
107	  if(matched)
108	    _nEtaPiPi->fill();
109	}
110	else if(p.pid()==223) {
111	  map<long,int> nRes = nCount;
112	  int ncount = ntotal;
113	  findChildren(p,nRes,ncount);
114	  // eta pi+pi-
115	  if(ncount!=1) continue;
116	  bool matched = true;
117	  for(auto const & val : nRes) {
118	    if(abs(val.first)==111) {
119	      if(val.second !=1) {
120		matched = false;
121		break;
122	      }
123	    }
124	    else if(val.second!=0) {
125	      matched = false;
126	      break;
127	    }
128	  }
129	  if(matched)
130	    _nOmegaPi->fill();
131	}
132      }
133    }
134
135
136    /// Normalise histograms etc., after the run
137    void finalize() {
138      for(unsigned int ix=1;ix<15;++ix) {
139	unsigned int ymax=2;
140       	double sigma(0.),error(0.);
141       	if(ix<=4) {
142       	  sigma = _nOmegaPi->val();
143       	  error = _nOmegaPi->err();
144       	}
145	else if(ix==5) {
146	  sigma = _n3Pi->val();
147	  error = _n3Pi->err();
148	}
149	else if(ix==6) {
150	  sigma = _nEtaPiPi->val();
151	  error = _nEtaPiPi->err();
152	}
153	else if(ix==7) {
154	  sigma = _n4PiC->val();
155	  error = _n4PiC->err();
156	}
157	else if(ix==8) {
158	  sigma = _n4PiN->val();
159	  error = _n4PiN->err();
160	}
161	else if(ix==9) {
162	  continue;
163	}
164	else if(ix==10) {
165	  ymax=5;
166	}
167	else if(ix==11) {
168	  sigma = _n2Pi->val();
169	  error = _n2Pi->err();
170	}
171	else if(ix==12) {
172	  sigma = _nKC->val();
173	  error = _nKC->err();
174	}
175	else if(ix==13) {
176	  sigma = _nKN->val();
177	  error = _nKN->err();
178	}
179	else if(ix==14) {
180	  sigma = _n5Pi->val();
181	  error = _n5Pi->err();
182	}
183      	sigma *= crossSection()/ sumOfWeights() /nanobarn;
184      	error *= crossSection()/ sumOfWeights() /nanobarn;
185	for(unsigned int iy=1;iy<ymax;++iy) {
186	  if(ix==10) {
187	    if(iy==1) {
188	      sigma = _n4PiC->val();
189	      error = _n4PiC->err();
190	    }
191	    else if(iy==2) {
192	      sigma = _n4PiN->val();
193	      error = _n4PiN->err();
194	    }
195	    else if(iy==3) {
196	      sigma = _nOmegaPi->val();
197	      error = _nOmegaPi->err();
198	    }
199	    else {
200	      sigma = _n3Pi->val();
201	      error = _n3Pi->err();
202	    }
203	    sigma *= crossSection()/ sumOfWeights() /nanobarn;
204	    error *= crossSection()/ sumOfWeights() /nanobarn;
205	  }
206	  Scatter2D temphisto(refData(ix, 1, iy));
207	  Scatter2DPtr mult;
208	  book(mult, ix, 1, iy);
209	  for (size_t b = 0; b < temphisto.numPoints(); b++) {
210	    const double x  = temphisto.point(b).x();
211	    pair<double,double> ex = temphisto.point(b).xErrs();
212	    pair<double,double> ex2 = ex;
213	    if(ex2.first ==0.) ex2. first=0.0001;
214	    if(ex2.second==0.) ex2.second=0.0001;
215	    if (inRange(sqrtS()/GeV, x-ex2.first, x+ex2.second)) {
216	      mult->addPoint(x, sigma, ex, make_pair(error,error));
217	    }
218	    else {
219	      mult->addPoint(x, 0., ex, make_pair(0.,.0));
220	    }
221	  }
222	}
223      }
224    }
225
226    //@}
227
228
229    /// @name Histograms
230    //@{
231    CounterPtr _nOmegaPi,_n2Pi,_n3Pi,_n4PiC,_n4PiN,_nEtaPiPi,_nKC,_nKN,_n5Pi;
232    //@}
233
234
235  };
236
237
238  // The hook for the plugin system
239  RIVET_DECLARE_PLUGIN(ND_1991_I321108);
240
241
242}