Rivet analyses

Photon, π0 and η spectra in e+e collisions at 14, 22.5 and 34.4 GeV

Experiment: JADE (Petra)

Inspire ID: 213948

Status: VALIDATED

Authors: - Peter Richardson

References: - Z.Phys.C 28 (1985) 343

Beams: e+ e-

Beam energies: (7.0, 7.0); (11.2, 11.2); (17.2, 17.2)GeV

Run details: - e+ e- to hadrons.

Measurement of the Photon, π0 and η spectra in e+e collisions at14, 22.5 and 34.4 GeV by the JADE experiment at Petra. N.B. The binning was not provided in the HepData entry and had to be deduced from the average values in the bins.

Source code:JADE_1985_I213948.cc

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

namespace Rivet {


  /// @brief  gamma, pi0 and eta spectra at 14, 22.5 and 34.4 GeV
  class JADE_1985_I213948 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(JADE_1985_I213948);


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

    /// Book histograms and initialise projections before the run
    void init() {
      declare(Beam(), "Beams");
      declare(FinalState(), "FS");
      declare(UnstableParticles(), "UFS");
      // book histos
      size_t ih = 2;
      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal/MeV));
        if (isCompatibleWithSqrtS(eVal, 1e-3))  _sqs = en;
        book(_h[en+"gamma"], ih+1, 1, 1);
        book(_h[en+"pi0"],   ih+4, 1, 1);
        if (en == "34500"s) {
          book(_h[en+"eta"], 7, 1, 1);
          _axes[en+"gamma"] = vector<double>{0.00, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10,
                                             0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20,
                                             0.22, 0.24, 0.26, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40,
                                             0.45, 0.50, 0.55, 0.60, 0.70, 0.80, 0.90}; // d01
          _axes[en+"pi0"] = vector<double>{0.011, 0.023, 0.035, 0.0465, 0.058, 0.0695, 0.081,
                                           0.093, 0.1045, 0.119, 0.1395, 0.1625, 0.1915, 0.2265}; // d04
          _axes[en+"eta"] = vector<double>{0.040, 0.056, 0.088, 0.274}; // d07
        }
        else if (en == "22500"s) {
          _axes[en+"gamma"] = vector<double>{0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10,
                                             0.12, 0.14, 0.16, 0.18, 0.20, 0.25, 0.40, 0.60, 1.00}; // d02
          _axes[en+"pi0"] = vector<double>{0.018, 0.036, 0.054, 0.072, 0.108, 0.144, 0.216, 0.360}; // d05
        }
        else {
          _axes[en+"gamma"] = vector<double>{0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10,
                                             0.12, 0.14, 0.16, 0.18, 0.20, 0.25, 0.40, 0.60, 1.00}; //d03
          _axes[en+"pi0"] = vector<double>{0.030, 0.058, 0.086, 0.114, 0.170, 0.226, 0.338, 0.562}; // d06
        }
        --ih;
      }
      raiseBeamErrorIf(_sqs.empty());
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      if (_edges.empty()) {
        _edges["gamma"] = _h[_sqs+"gamma"]->xEdges();
        _edges["pi0"] = _h[_sqs+"pi0"]->xEdges();
        if (_sqs == "34500"s)  _edges["eta"] = _h[_sqs+"eta"]->xEdges();
      }
      // Get beams and average beam momentum
      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
      const double meanBeamMom = 0.5*(beams.first.p3().mod()+beams.second.p3().mod());
      // gamma
      const FinalState& fs = apply<FinalState>(event, "FS");
      for (const Particle& p : fs.particles(Cuts::pid==22)) {
        const double xE = p.E()/meanBeamMom;
        _h[_sqs+"gamma"]->fill(map2string(xE, "gamma"));
      }
      // pi0, eta
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
      for (const Particle& p : ufs.particles(Cuts::pid==111 || Cuts::pid==221)) {
        double xE = p.E()/meanBeamMom;
        if (p.pid()==111) {
          _h[_sqs+"pi0"]->fill(map2string(xE, "pi0"));
        }
        else if (_sqs == "34500"s) {
          _h[_sqs+"eta"]->fill(map2string(xE, "eta"));
        }
      }
    }

    string map2string(const double val, const string& obs) const {
      const size_t idx = _axes.at(_sqs+obs).index(val);
      if (idx && idx <= _axes.at(_sqs+obs).numBins())  return _edges.at(obs)[idx-1];
      return "OTHER"s;
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      for (auto& item : _h) {
        const double en = stod(item.first.substr(0,5));
        scale(item.second, crossSection()*sqr(en*MeV)/microbarn/sumOfWeights());
        for(auto& b: item.second->bins()) {
          b.scaleW(1./_axes[item.first].width(b.index()));
        }
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    map<string, BinnedHistoPtr<string>> _h;
    map<string,YODA::Axis<double>> _axes;
    map<string,vector<string>> _edges;
    string _sqs = "";
    /// @}


  };


  RIVET_DECLARE_PLUGIN(JADE_1985_I213948);
}