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        Estimate1DPtr  mult;
183        book(mult, ix, 1, 1);
184        for (auto& b : mult->bins()) {
185          if (inRange(sqrtS()/GeV, b.xMin(), b.xMax())) {
186            b.set(sigma, error);
187          }
188        }
189      }
190    }
191    /// @}
192
193
194    /// @name Histograms
195    /// @{
196    CounterPtr _num5Pi,_num2PiEta,_numOmegaPiPi,
197      _num4PiEta,_numOmegaPiEta;
198    /// @}
199
200  };
201
202
203  RIVET_DECLARE_PLUGIN(BABAR_2018_I1700745);
204
205
206}