rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2022_I2120528

Cross section for $e^+e^-\to K^+K^-3\pi^0$, $K^0_SK^\pm\pi^\mp2\pi^0$ and $K^0_SK^\pm\pi^\mp\pi^+\pi^-$ between threshold and 4.5 GeV
Experiment: BABAR (PEP-II)
Inspire ID: 2120528
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: ANY
Run details:
  • e+e- to hadrons, KS0 and pi0 should be set stable

Cross sections for $e^+e^-\to K^+K^-3\pi^0$, $K^0_SK^\pm\pi^\mp2\pi^0$ and $K^0_SK^\pm\pi^\mp\pi^+\pi^-$ between threshold and 4.5 GeV using radiative events. The cross sections for a number of resonant contributions are also measured.

Source code: BABAR_2022_I2120528.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- -> KK 3pi
 10  class BABAR_2022_I2120528 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2022_I2120528);
 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<10; ++ix) {
 26        book(_sigma[ix], "TMP/n" + toString(ix+1), refData(1+ix,1,1));
 27      }
 28    }
 29
 30    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 31      for (const Particle &child : p.children()) {
 32        if(child.children().empty()) {
 33          nRes[child.pid()]-=1;
 34          --ncount;
 35        }
 36        else {
 37          findChildren(child,nRes,ncount);
 38        }
 39      }
 40    }
 41
 42    /// Perform the per-event analysis
 43    void analyze(const Event& event) {
 44      const FinalState& fs = apply<FinalState>(event, "FS");
 45      map<long,int> nCount;
 46      int ntotal(0);
 47      for (const Particle& p : fs.particles()) {
 48        nCount[p.pid()] += 1;
 49        ++ntotal;
 50      }
 51      // stable particles
 52      if (ntotal==5) {
 53        // K+K- 3pi0
 54        if(nCount[-321]==1 && nCount[321]==1 && nCount[111]==3) _sigma[0]->fill(sqrtS());
 55        // KS0 Kpi 2pi0
 56        else if (nCount[111]==2 &&nCount[310]==1 &&
 57               ((nCount[ 321]==1 && nCount[-211]==1) ||
 58                (nCount[-321]==1 && nCount[ 211]==1))) _sigma[1]->fill(sqrtS());
 59        // KS0 Kpi pi+pi-
 60        else if (nCount[310]==1 &&
 61               ((nCount[ 321]==1 && nCount[-211]==2 && nCount[ 211]==1) ||
 62                (nCount[-321]==1 && nCount[ 211]==2 && nCount[-211]==1))) _sigma[2]->fill(sqrtS());
 63      }
 64      // now the resonant states
 65      // first K+K- eta and phi eta
 66      const FinalState& ufs = apply<FinalState>(event, "UFS");
 67      for (const Particle& p : ufs.particles(Cuts::pid==PID::ETA)) {
 68        if (p.children().empty()) continue;
 69        map<long,int> nRes=nCount;
 70        int ncount = ntotal;
 71        findChildren(p,nRes,ncount);
 72        bool matched1  = false;
 73        if (ncount==2) {
 74          matched1  = true;
 75          for (const auto& val : nRes) {
 76            if (abs(val.first)==PID::KPLUS) {
 77              if (val.second!=1) {
 78                matched1 = false;
 79                break;
 80              }
 81            }
 82            else if (val.second!=0) {
 83              matched1 = false;
 84              break;
 85            }
 86          }
 87          if (matched1) {
 88            _sigma[3]->fill(sqrtS());
 89          }
 90        }
 91        bool matched2=false;
 92        for (const Particle& p2 : ufs.particles(Cuts::pid==PID::PHI)) {
 93          if (p2.children().empty()) continue;
 94          map<long,int> nRes2 = nRes;
 95          int ncount2 = ncount;
 96          findChildren(p2,nRes2,ncount2);
 97          if (ncount2!=0) continue;
 98          matched2=true;
 99          for (const auto& val : nRes2) {
100            if (val.second!=0) {
101              matched2 = false;
102              break;
103            }
104          }
105          if (matched2) {
106            _sigma[4]->fill(sqrtS());
107            break;
108          }
109        }
110        if (matched1 || matched2) break;
111      }
112      // states with a K*
113      Particles Kstar = ufs.particles(Cuts::abspid==313 or Cuts::abspid==323);
114      for (unsigned int ix=0; ix<Kstar.size(); ++ix) {
115        if (Kstar[ix].children().empty()) continue;
116        map<long,int> nRes=nCount;
117        int ncount = ntotal;
118        findChildren(Kstar[ix],nRes,ncount);
119        bool matched1=false;
120        if (ncount==3) {
121          int idother=310;
122          if (Kstar[ix].abspid()==323) idother= -321*(Kstar[ix].pid()/Kstar[ix].abspid());
123          for (const auto& val : nRes) {
124            if (val.first==idother) {
125              if (val.second!=1) {
126                matched1 = false;
127                break;
128              }
129            }
130            else if (val.first==PID::PI0) {
131              if(val.second!=2) {
132                matched1 = false;
133                break;
134              }
135            }
136            else if(val.second!=0) {
137              matched1 = false;
138              break;
139            }
140          }
141          if (matched1) {
142            if (Kstar[ix].abspid()==321) _sigma[7]->fill(sqrtS());
143            else                         _sigma[6]->fill(sqrtS());
144          }
145          // K*+ K*-
146          bool matched2=false;
147          for (unsigned int iy=0;iy<ix+1;++iy) {
148            if (Kstar[iy].children().empty() ||
149                Kstar[iy].abspid()==313 ||
150                Kstar[iy].pid()!=-Kstar[ix].pid()) {
151              continue;
152            }
153            map<long,int> nRes2 = nRes;
154            int ncount2 = ncount;
155            findChildren(Kstar[iy],nRes2,ncount2);
156            if (ncount2!=1) continue;
157              matched2=true;
158              for (const auto& val : nRes2) {
159                if (val.first==PID::PI0) {
160                  if (val.second!=1) {
161                    matched2 = false;
162                    break;
163                  }
164                }
165                if (val.second!=0) {
166                  matched2 = false;
167                  break;
168                }
169              }
170              if (matched2) {
171                _sigma[5]->fill(sqrtS());
172                break;
173              }
174            }
175          }
176        }
177        // finally f_1
178        for (const Particle& p : ufs.particles(Cuts::abspid==PID::RHOPLUS)) {
179          if (p.children().empty()) continue;
180          map<long,int> nRes=nCount;
181          int ncount = ntotal;
182          findChildren(p,nRes,ncount);
183          bool matched1  = false;
184          if (ncount==3) {
185            int idother = -(p.pid()/p.abspid())*321;
186            matched1  = true;
187          for(const auto& val : nRes) {
188            if (val.first==PID::PI0 || val.first==idother || val.first==PID::K0S) {
189              if (val.second!=1) {
190                matched1 = false;
191                break;
192              }
193            }
194            else if (val.second!=0) {
195              matched1 = false;
196              break;
197            }
198          }
199          if (matched1) {
200            _sigma[8]->fill(sqrtS());
201          }
202        }
203        if (matched1) break;
204      }
205      // finally f_1
206      for (const Particle& p : ufs.particles(Cuts::pid==20223)) {
207        if (p.children().empty()) continue;
208        map<long,int> nRes=nCount;
209        int ncount = ntotal;
210        findChildren(p,nRes,ncount);
211        bool matched1  = false;
212        if (ncount==2) {
213          matched1  = true;
214          for (const auto& val : nRes) {
215            if (abs(val.first)==PID::PIPLUS) {
216              if (val.second!=1) {
217                matched1 = false;
218                break;
219              }
220            }
221            else if (val.second!=0) {
222              matched1 = false;
223              break;
224            }
225          }
226          if (matched1) {
227            _sigma[9]->fill(sqrtS());
228          }
229        }
230        if (matched1) break;
231      }
232    }
233
234
235    /// Normalise histograms etc., after the run
236    void finalize() {
237      const double fact = crossSection()/ sumOfWeights() /nanobarn;
238      for(unsigned int ix=0;ix<10;++ix) {
239        scale(_sigma[ix],fact);
240        Estimate1DPtr tmp;
241        book(tmp,1+ix,1,1);
242        barchart(_sigma[ix],tmp);
243      }
244    }
245
246    /// @}
247
248
249    /// @name Histograms
250    /// @{
251    Histo1DPtr _sigma[10];
252    /// @}
253
254
255  };
256
257
258  RIVET_DECLARE_PLUGIN(BABAR_2022_I2120528);
259
260}