rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2018_I1700745

Cross section for $e^+e^-\to\pi^+\pi^-3\pi^0$ and $\pi^+\pi^-2\pi^0\eta$ between threshold and 4.35 GeV
Experiment: BABAR (PEP-II)
Inspire ID: 1700745
Status: VALIDATED
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: ANY
Run details:
  • e+e- to hadrons

Measurement of the cross section for $e^+e^-\to\pi^+\pi^-3\pi^0$ and $\pi^+\pi^-2\pi^0\eta$ between threshold and 4.35 GeV. The cross sections for the $\pi^+\pi^-\eta$, $\omega\pi^0\pi^0$ and $\omega\pi^0\eta$ resonant contributions are also measured

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