Rivet analyses

γγ → π0π0 for centre-of-mass energies between 0.25 and 1.95 GeV

Experiment: CRYSTAL_BALL (DORIS)

Inspire ID: 294492

Status: UNVALIDATED

Authors: - Peter Richardson

References: - Phys.Rev.D 41 (1990) 3324, 1990

Beams: 22 22

Beam energies: ANY

Run details: - gamma gamma to hadrons, pi0 must be set stable

Measurement of the differential cross section for γγ → π0π0 for 0.25GeV < W < 1.95GeV. Both the cross section as a function of the centre-of-mass energy of the photonic collision, and the differential cross section with respect to the pion scattering angle are measured.

Source code:CRYSTAL_BALL_1990_I294492.cc

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

namespace Rivet {


  /// @brief gamma gamma -> pi0pi0
  class CRYSTAL_BALL_1990_I294492 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CRYSTAL_BALL_1990_I294492);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // Initialise and register projections
      declare(FinalState(), "FS");
      // histos
      const double eval = sqrtS()/GeV;
      raiseBeamErrorIf(!inRange(eval, 0.25, 1.95));

      size_t ih=0;
      for (double emax : {0.5, 0.7, 0.9, 1.1, 1.3, 1.7}) {
        string label = toString(1000*emax);
        book(_h[label], 2, 1, ++ih);
        if (_sqs.empty() && eval < emax) _sqs = label;
      }

      if (inRange(eval, 1.1, 1.5, RangeBoundary::CLOSED, RangeBoundary::CLOSED)) {
        _sqs15 = "1500"s;
      }
      book(_h["1500"], 2, 1, 7);
      _edges = _h["1500"].binning().edges<0>();

      book(_h["npipi"], 1, 1, 1);
      for (const string& en : _h["npipi"].binning().edges<0>()) {
        if (isCompatibleWithSqrtS(stod(en))) {
          _edge = en; break;
        }
      }
      _axis = YODA::Axis<double>({0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8});
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      Particles part = apply<FinalState>(event,"FS").particles();
      if (part.size()!=2) vetoEvent;
      for (const Particle& p : part) {
        if (p.pid()!=PID::PI0) vetoEvent;
      }
      const double cTheta = abs(part[0].mom().z()/part[0].mom().p3().mod());
      if (cTheta<=0.8)     _h["npipi"]->fill(_edge);
      if (!_sqs.empty())   _h[_sqs]->fill(disc(cTheta));
      if (!_sqs15.empty()) _h["1500"]->fill(disc(cTheta));
    }


    string disc(const double value) const {
      size_t idx = _axis.index(value);
      if (0 < idx && idx <= _edges.size())  return _edges[idx-1];
      return "OTHER"s;
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h, crossSection()/nanobarn/sumOfWeights());
      for (auto& item : _h) {
        if (item.first == "npipi"s)  continue;
        for (auto& b : item.second->bins()) {
          const size_t idx = b.index();
          b.scaleW(1./_axis.width(idx));
        }
      }
    }

    /// @}


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


  };


  RIVET_DECLARE_PLUGIN(CRYSTAL_BALL_1990_I294492);

}