Rivet analyses

Cross sections for e+e exclusive hadronic states between 0.5 and 1.4 GeV.

Experiment: ND (VEPP-2M)

Inspire ID: 321108

Status: VALIDATED

Authors: - Peter Richardson

References: - PRep 202,99

Beams: e+ e-

Beam energies: (0.3, 0.3); (0.3, 0.3); (0.3, 0.3); (0.3, 0.3); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.4, 0.4); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.5, 0.5); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.8, 0.8); (0.8, 0.8)GeV

Run details: - e+ e- to hadrons

Measurement of the cross section for e+e → π+π, K+K, KS0KL0, π+ππ0, 2π+2π, π+π2π0, ωπ0, ηπ+π and 2π+2ππ0 by ND for energies between 0.5 and 1.4 GeV.

Source code:ND_1991_I321108.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  /// @brief ND measurement of exclusive hadronic final states
  class ND_1991_I321108 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ND_1991_I321108);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {

      // Initialise and register projections
      declare(FinalState(), "FS");
      declare(UnstableParticles(), "UFS");
      // book hists
      vector<string> energies(
          {"0.661", "0.671", "0.681", "0.691", "0.701", "0.711", "0.725", "0.735", "0.745", "0.755", "0.765",
           "0.805", "0.81",  "0.815", "0.825", "0.83",  "0.831", "0.841", "0.85",  "0.851", "0.861", "0.87",
           "0.871", "0.881", "0.89",  "0.891", "0.901", "0.91",  "0.911", "0.921", "0.93",  "0.943", "0.95",
           "0.955", "0.956", "0.963", "0.97",  "0.973", "0.98",  "0.983", "0.99",  "0.993", "1.0",   "1.003",
           "1.005", "1.02",  "1.036", "1.04",  "1.05",  "1.059", "1.06",  "1.07",  "1.075", "1.08",  "1.09",
           "1.099", "1.1",   "1.11",  "1.12",  "1.13",  "1.139", "1.14",  "1.15",  "1.16",  "1.17",  "1.179",
           "1.18",  "1.19",  "1.2",   "1.21",  "1.219", "1.22",  "1.23",  "1.24",  "1.25",  "1.259", "1.26",
           "1.27",  "1.28",  "1.29",  "1.299", "1.3",   "1.31",  "1.32",  "1.325", "1.33",  "1.339", "1.34",
           "1.35",  "1.36",  "1.37",  "1.375", "1.379", "1.38",  "1.39",  "1.395", "1.4",   "1.5",   "1.6"});
      for (const string& en : energies) {
        if (isCompatibleWithSqrtS(stod(en) * GeV)) {
          _sqs = en;
          break;
        }
      }
      raiseBeamErrorIf(_sqs.empty());
      book(_h["nOmegaPi0"], 1, 1, 1);
      book(_h["nOmegaPi1"], 2, 1, 1);
      book(_h["nOmegaPi2"], 3, 1, 1);
      book(_h["nOmegaPi3"], 4, 1, 1);
      book(_h["nOmegaPi4"], 10, 1, 3);
      book(_h["n2Pi"], 11, 1, 1);
      book(_h["n3Pi0"], 5, 1, 1);
      book(_h["n3Pi1"], 10, 1, 4);
      book(_h["n4PiC0"], 7, 1, 1);
      book(_h["n4PiC1"], 10, 1, 1);
      book(_h["n4PiN0"], 8, 1, 1);
      book(_h["n4PiN1"], 10, 1, 2);
      book(_h["nEtaPiPi"], 6, 1, 1);
      book(_h["nKC"], 12, 1, 1);
      book(_h["nKN"], 13, 1, 1);
      book(_h["n5Pi"], 14, 1, 1);
    }


    void findChildren(const Particle& p, map<long, int>& nRes, int& ncount) const {
      for (const Particle& child : p.children()) {
        if (child.children().empty()) {
          --nRes[child.pid()];
          --ncount;
        }
        else
          findChildren(child, nRes, ncount);
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {

      const FinalState& fs = apply<FinalState>(event, "FS");

      map<long, int> nCount;
      int ntotal(0);
      for (const Particle& p : fs.particles()) {
        nCount[p.pid()] += 1;
        ++ntotal;
      }
      if (ntotal == 2) {
        if (nCount[211] == 1 && nCount[-211] == 1) _h["n2Pi"]->fill(_sqs);
        if (nCount[321] == 1 && nCount[-321] == 1) _h["nKC"]->fill(_sqs);
        if (nCount[310] == 1 && nCount[130] == 1) _h["nKN"]->fill(_sqs);
      }
      else if (ntotal == 3) {
        if (nCount[211] == 1 && nCount[-211] == 1 && nCount[111] == 1) {
          _h["n3Pi0"]->fill(_sqs);
          _h["n3Pi1"]->fill(_sqs);
        }
      }
      else if (ntotal == 4) {
        if (nCount[211] == 2 && nCount[-211] == 2) {
          _h["n4PiC0"]->fill(_sqs);
          _h["n4PiC1"]->fill(_sqs);
        }
        else if (nCount[211] == 1 && nCount[-211] == 1 && nCount[111] == 2) {
          _h["n4PiN0"]->fill(_sqs);
          _h["n4PiN1"]->fill(_sqs);
        }
      }
      else if (ntotal == 5) {
        if (nCount[211] == 2 && nCount[-211] == 2 && nCount[111] == 1) _h["n5Pi"]->fill(_sqs);
      }

      const FinalState& ufs = apply<FinalState>(event, "UFS");
      for (const Particle& p : ufs.particles()) {
        if (p.children().empty()) continue;
        // find the eta
        if (p.pid() == 221) {
          map<long, int> nRes = nCount;
          int ncount = ntotal;
          findChildren(p, nRes, ncount);
          // eta pi+pi-
          if (ncount != 2) continue;
          bool matched = true;
          for (const auto& val : nRes) {
            if (abs(val.first) == 211) {
              if (val.second != 1) {
                matched = false;
                break;
              }
            }
            else if (val.second != 0) {
              matched = false;
              break;
            }
          }
          if (matched) _h["nEtaPiPi"]->fill(_sqs);
        }
        else if (p.pid() == 223) {
          map<long, int> nRes = nCount;
          int ncount = ntotal;
          findChildren(p, nRes, ncount);
          // eta pi+pi-
          if (ncount != 1) continue;
          bool matched = true;
          for (const auto& val : nRes) {
            if (abs(val.first) == 111) {
              if (val.second != 1) {
                matched = false;
                break;
              }
            }
            else if (val.second != 0) {
              matched = false;
              break;
            }
          }
          if (matched) {
            _h["nOmegaPi0"]->fill(_sqs);
            _h["nOmegaPi1"]->fill(_sqs);
            _h["nOmegaPi2"]->fill(_sqs);
            _h["nOmegaPi3"]->fill(_sqs);
            _h["nOmegaPi4"]->fill(_sqs);
          }
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h, crossSection() / sumOfWeights() / nanobarn);
    }

    /// @}


    /// @name Histograms
    /// @{
    map<string, BinnedHistoPtr<string>> _h;
    string _sqs = "";
    /// @}
  };


  RIVET_DECLARE_PLUGIN(ND_1991_I321108);
}