rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

SND_2020_I1809286

Cross section for $e^+e^-\to\pi^+\pi^-\pi^0$ between 1.15 and 2 GeV
Experiment: SND (VEPP-2000)
Inspire ID: 1809286
Status: VALIDATED
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: ANY
Run details:
  • e+ e- to hadrons

Cross section for $e^+e^-\to\pi^+\pi^-\pi^0$ between 1.15 and 2 GeV measured by SND. The $\omega\pi^0$, $\rho\pi$ and $\rho(1450)\pi$ subprocesses are also extracted.

Source code: SND_2020_I1809286.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 e+e- > pi+pi-pi0
 10  class SND_2020_I1809286 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(SND_2020_I1809286);
 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      declare(FinalState(), "FS");
 24      declare(UnstableParticles(), "UFS");
 25      for(unsigned int ix=0;ix<2;++ix) {
 26        book(_sigma_total[ix],1+ix,1,1);
 27        for (const string& en : _sigma_total[ix].binning().edges<0>()) {
 28          double end = std::stod(en)*GeV;
 29          if(isCompatibleWithSqrtS(end)) {
 30            _ecms[ix] = en;
 31            break;
 32          }
 33        }
 34      }
 35      for(unsigned int ix=0;ix<3;++ix)
 36        book(_sigma_res[ix], "/TMP/c_res_"+toString(ix),refData(3,1,1+ix));
 37      
 38      if(inRange(sqrtS()/GeV,1.42,1.48)) {
 39	book(_h_x,4,1,1);
 40	book(_h_m,4,1,3);
 41      }
 42      else if(inRange(sqrtS()/GeV,1.65,1.68)) {
 43	book(_h_x,4,1,2);
 44	book(_h_m,4,1,4);
 45      }
 46    }
 47
 48    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 49      for( const Particle &child : p.children()) {
 50	if(child.children().empty()) {
 51	  --nRes[child.pid()];
 52	  --ncount;
 53	}
 54	else
 55	  findChildren(child,nRes,ncount);
 56      }
 57    }
 58
 59    /// Perform the per-event analysis
 60    void analyze(const Event& event) {
 61
 62      const FinalState& fs = apply<FinalState>(event, "FS");
 63
 64      map<long,int> nCount;
 65      int ntotal(0);
 66      Particle pip,pim;
 67      for (const Particle& p : fs.particles()) {
 68	nCount[p.pid()] += 1;
 69	++ntotal;
 70	if(p.pid()     == 211) pip=p;
 71	else if(p.pid()==-211) pim=p;
 72      }
 73      if(ntotal!=3) vetoEvent;
 74      if(nCount[-211]==1&&nCount[211]==1&&nCount[111]==1) {
 75	_sigma_total[0]->fill(_ecms[0]);
 76	_sigma_total[1]->fill(_ecms[1]);
 77      }
 78      else
 79	vetoEvent;
 80      if(_h_x) {
 81	_h_x->fill(pip.momentum().p()/sqrtS());
 82	_h_x->fill(pim.momentum().p()/sqrtS());
 83	_h_m->fill((pip.momentum()+pim.momentum()).mass()/MeV);
 84      }
 85      const FinalState& ufs = apply<FinalState>(event, "UFS");
 86      for (const Particle& p : ufs.particles(Cuts::abspid==223 or
 87					     Cuts::abspid==113    or Cuts::abspid==213 or
 88					     Cuts::abspid==100113 or Cuts::abspid==100213)) {
 89	if(p.children().empty()) continue;
 90	map<long,int> nRes = nCount;
 91	int ncount = ntotal;
 92	findChildren(p,nRes,ncount);
 93	if(ncount!=1) continue;
 94	int idOther = 211;
 95	if(p.pid()==223 || p.pid()==113 || p.pid()==100113)
 96	  idOther = 111;
 97	else if(p.pid()==213 || p.pid()==100213)
 98	  idOther = -211;
 99	bool matched=true;
100	for(auto const & val : nRes) {
101	  if(val.first==idOther ) {
102	    if(val.second !=1) {
103	      matched = false;
104	      break;
105	    }
106	  }
107	  else if(val.second!=0) {
108	    matched = false;
109	    break;
110	  }
111	}
112	if(!matched) continue;
113	if(matched) {
114	  if(p.pid()==223)
115	    _sigma_res[2]->fill(sqrtS());
116	  else if(p.pid()==213 || p.pid()==113)
117	    _sigma_res[0]->fill(sqrtS());
118	  else
119	    _sigma_res[1]->fill(sqrtS());
120	  break;
121	}
122      }
123    }
124
125
126    /// Normalise histograms etc., after the run
127    void finalize() {
128      if (_h_x) {
129        normalize(_h_x,1.,false);
130        normalize(_h_m,1.,false);
131      }
132      double fact = crossSection()/nanobarn/sumOfWeights();
133      for(unsigned int ix=0;ix<2;++ix)
134        scale(_sigma_total[ix],fact);
135      for(unsigned int ix=0;ix<3;++ix) {
136        scale(_sigma_res[ix],fact);
137        Estimate1DPtr tmp;
138        book(tmp,3,1,1+ix);
139        barchart(_sigma_res[ix],tmp);
140      }
141    }
142
143    /// @}
144
145
146    /// @name Histograms
147    /// @{
148    BinnedHistoPtr<string> _sigma_total[2];
149    string _ecms[2];
150    Histo1DPtr _sigma_res[3];
151    Histo1DPtr _h_x,_h_m;
152    /// @}
153
154
155  };
156
157
158  RIVET_DECLARE_PLUGIN(SND_2020_I1809286);
159
160}