rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ARGUS_1987_I248680

$\gamma\gamma\to K^{*0}\bar{K}^{*0}$ between 1.6 and 3.5 GeV
Experiment: ARGUS (DORIS)
Inspire ID: 248680
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Eur.Phys.J.C 16 (2000) 435-444
Beams: 22 22
Beam energies: ANY
Run details:
  • gamma gamma to hadrons, K0S and pi0 mesons must be set stable

Measurement of the differential cross section for $\gamma\gamma\to K^{*0}\bar{K}^{*0}$ for $1.6 \text{GeV} < W < 3.5 \text{GeV}$. The cross section is measured as a function of the centre-of-mass energy of the photonic collision using the $K^+K^-\pi^+\pi^-$ final state.

Source code: ARGUS_1987_I248680.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 gamma gamma -> K*0K*0
 10  class ARGUS_1987_I248680 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1987_I248680);
 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      // book histos
 26      if (inRange(sqrtS()/GeV,1.6,3.5)) {
 27        for (unsigned int ix=0; ix<9; ++ix) {
 28          book(_nMeson[ix],"TMP/nMeson_"+toString(ix+1));
 29        }
 30      }
 31      else {
 32        throw Error("Invalid CMS energy for ARGUS_1987_I248680");
 33      }
 34    }
 35
 36    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 37      for (const Particle& child : p.children()) {
 38        if (child.children().empty()) {
 39          nRes[child.pid()]-=1;
 40          --ncount;
 41        }
 42        else {
 43          findChildren(child,nRes,ncount);
 44        }
 45      }
 46    }
 47
 48    /// Perform the per-event analysis
 49    void analyze(const Event& event) {
 50      const FinalState& fs = apply<FinalState>(event, "FS");
 51      // find the final-state particles
 52      map<long,int> nCount;
 53      int ntotal(0);
 54      for (const Particle& p : fs.particles()) {
 55        nCount[p.pid()] += 1;
 56        ++ntotal;
 57      }
 58      // find any K* mesons
 59      int ires=-1;
 60      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 61      Particles Kstar=ufs.particles(Cuts::abspid==313);
 62      for (unsigned int ix=0;ix<Kstar.size();++ix) {
 63       	if(Kstar[ix].children().empty()) continue;
 64       	map<long,int> nRes=nCount;
 65       	int ncount = ntotal;
 66       	findChildren(Kstar[ix],nRes,ncount);
 67        bool matched=false;
 68        // K*K*
 69        for (unsigned int iy=ix+1; iy<Kstar.size(); ++iy) {
 70          if (Kstar[iy].children().empty()) continue;
 71          if (Kstar[ix].pid()!=-Kstar[iy].pid()) continue;
 72          map<long,int> nRes2=nRes;
 73          int ncount2 = ncount;
 74          findChildren(Kstar[iy],nRes2,ncount2);
 75          if (ncount2 !=0 ) continue;
 76          matched = true;
 77          for (const auto& val : nRes2) {
 78            if (val.second!=0) {
 79              matched = false;
 80              break;
 81            }
 82          }
 83          if (matched) {
 84            break;
 85          }
 86        }
 87        if (matched) {
 88          _nMeson[1]->fill();
 89          ires=7;
 90          break;
 91        }
 92        int sign = Kstar[ix].pid()/Kstar[ix].abspid();
 93        // three body intermediate states
 94        if (ncount==2) {
 95          // K*0 K- pi+ +ccd
 96          matched=true;
 97          for (const auto& val : nRes) {
 98            if (val.first==sign*211 || val.first==-sign*321) {
 99              if (val.second!=1) {
100                matched = false;
101                break;
102              }
103            }
104            else {
105              if (val.second!=0) {
106                matched = false;
107                break;
108              }
109            }
110          }
111          if(matched) {
112            _nMeson[2]->fill();
113            ires=6;
114            break;
115          }
116        }
117      }
118      // look for phi modes
119      for (const Particle& p : ufs.particles(Cuts::pid==PID::PHI)) {
120       	if (p.children().empty()) continue;
121       	map<long,int> nRes=nCount;
122       	int ncount = ntotal;
123       	findChildren(p,nRes,ncount);
124        if (ncount==2) {
125          bool matched=true;
126          for (const auto& val : nRes) {
127            if (abs(val.first)==211) {
128              if (val.second!=1) {
129                matched = false;
130                break;
131              }
132            }
133            else {
134              if (val.second!=0) {
135                matched = false;
136                break;
137              }
138            }
139          }
140          if (matched) {
141            ires=8;
142            break;
143          }
144        }
145      }
146      // 4 meson modes
147      if (ntotal==4 &&
148         nCount[PID::KPLUS ]==1 && nCount[PID::KMINUS ]==1 &&
149         nCount[PID::PIPLUS]==1 && nCount[PID::PIMINUS]==1 ) {
150          _nMeson[0]->fill();
151          _nMeson[4]->fill();
152        if (ires<0) {
153          _nMeson[3]->fill();
154          _nMeson[5]->fill();
155        }
156        else _nMeson[ires]->fill();
157      }
158    }
159
160
161    /// Normalise histograms etc., after the run
162    void finalize() {
163      scale(_nMeson, crossSection()/nanobarn/sumOfWeights());
164      // loop over tables in paper
165      for (unsigned int ih=1; ih<5; ++ih) {
166       	for (unsigned int iy=1; iy<2; ++iy) {
167          unsigned int iloc=ih+iy-2;
168       	  assert(iloc<=8);
169       	  BinnedEstimatePtr<string> mult;
170       	  book(mult, ih, 1, iy);
171          for (auto& b : mult->bins()) {
172            if (isCompatibleWithSqrtS(std::stod(b.xEdge())/GeV)) {
173              b.setVal(_nMeson[iloc]->val());
174              b.setErr(_nMeson[iloc]->err());
175            }
176          }
177        }
178      }
179      for (unsigned int iy=1; iy<6; ++iy) {
180        unsigned int iloc=3+iy;
181        assert(iloc<=8);
182        Estimate1DPtr mult;
183        book(mult, 5, 1, iy);
184        for (auto& b : mult->bins()) {
185          if (inRange(sqrtS(), b.xMin(), b.xMax())) {
186            b.setVal(_nMeson[iloc]->val());
187            b.setErr(_nMeson[iloc]->err());
188          }
189        }
190      }
191    }
192
193    /// @}
194
195
196    /// @name Histograms
197    /// @{
198    CounterPtr _nMeson[9];
199    /// @}
200
201
202  };
203
204
205  RIVET_DECLARE_PLUGIN(ARGUS_1987_I248680);
206
207}