rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CRYSTAL_BALL_1991_I297905

$\pi^0$ and $\eta$ spectra for $e^+e^-$ collisions in the continuum and at $\Upsilon(1S)$
Experiment: CRYSTAL_BALL (DORIS)
Inspire ID: 297905
Status: UNVALIDATED
Authors:
  • Peter Richardson
References:
  • Z.Phys.C 49 (1991) 225-234
Beams: e- e+
Beam energies: (4.7, 4.7) GeV
Run details:
  • $e^+ e^-$ analysis near the $\Upsilon$ resonances

Measurement of the inclusive production of the $\pi^0$ and $\eta$ mesons in $e^+e^-$ annihilation in the Upsilon region. Data are taken on the $\Upsilon(1S)$ and in the nearby continuum.

Source code: CRYSTAL_BALL_1991_I297905.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief pi0 and eta at Upsilon 1 and continuum
  9  class CRYSTAL_BALL_1991_I297905 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(CRYSTAL_BALL_1991_I297905);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      // Initialise and register projections
 22      declare(UnstableParticles(), "UFS");
 23      // Book histograms
 24      book(_h_cont_pi[0] ,3, 1, 1);
 25      book(_h_cont_pi[1] ,3, 1, 2);
 26      book(_h_ups1_pi    ,4, 1, 1);
 27      book(_h_cont_eta[0],5, 1, 1);
 28      book(_h_cont_eta[1],5, 1, 2);
 29      book(_h_ups1_eta ,6, 1, 1);
 30      // counters
 31      book(_n_Pi[0] , 1, 1, 1);
 32      book(_n_Pi[1] , 1, 1, 2);
 33      book(_n_Eta[0], 2, 1, 1);
 34      book(_n_Eta[1], 2, 1, 2);
 35      book(_weightSum_cont,"/TMP/weightSum_cont");
 36      book(_weightSum_Ups1,"/TMP/weightSum_Ups1");
 37    }
 38
 39    /// Recursively walk the decay tree to find decay products of @a p
 40    void findDecayProducts(Particle mother, Particles& unstable) {
 41      for (const Particle & p: mother.children()) {
 42        const int id = p.pid();
 43        if (id == 111 or id == 221) {
 44          unstable.push_back(p);
 45        }
 46        if (!p.children().empty()) {
 47          findDecayProducts(p, unstable);
 48        }
 49      }
 50    }
 51
 52    /// Perform the per-event analysis
 53    void analyze(const Event& event) {
 54      // Find the Upsilons among the unstables
 55      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 56      Particles upsilons = ufs.particles(Cuts::pid==553);
 57      // Continuum
 58      if (upsilons.empty()) {
 59        MSG_DEBUG("No Upsilons found => continuum event");
 60        _weightSum_cont->fill();
 61        for (const Particle& p : ufs.particles(Cuts::pid==111 or Cuts::pid==221)) {
 62          const int id = p.pid();
 63          const double xp = 2.*p.E()/sqrtS();
 64          const double beta = p.p3().mod() / p.E();
 65          if (id==111) {
 66            _n_Pi[0]->fill(sqrtS()/GeV);
 67            for (unsigned int ix=0; ix<2; ++ix) {
 68              _h_cont_pi[ix]->fill(xp,1./beta);
 69            }
 70          }
 71          else {
 72            _n_Eta[0]->fill(Ecm);
 73            for (unsigned int ix=0; ix<2; ++ix) {
 74              _h_cont_eta[ix]->fill(xp,1./beta);
 75            }
 76          }
 77        }
 78      }
 79      // Upsilon(s) found
 80      else {
 81        MSG_DEBUG("Upsilons found => resonance event");
 82        for (const Particle& ups : upsilons) {
 83          _weightSum_Ups1->fill();
 84          Particles unstable;
 85          // Find the decay products we want
 86          findDecayProducts(ups, unstable);
 87          LorentzTransform cms_boost;
 88          if (ups.p3().mod() > 1*MeV)
 89            cms_boost = LorentzTransform::mkFrameTransformFromBeta(ups.momentum().betaVec());
 90            const double mass = ups.mass();
 91            // loop over decay products
 92            for (const Particle& p : unstable) {
 93              const int id = p.pid();
 94              const FourMomentum p2 = cms_boost.transform(p.momentum());
 95              const double xp = 2.*p2.E()/mass;
 96              const double beta = p2.p3().mod()/p2.E();
 97              if (id==111) {
 98                _n_Pi[1]->fill(sqrtS()/GeV);
 99                _h_ups1_pi->fill(xp,1./beta);
100              }
101              else if (id==221) {
102                _n_Eta[1]->fill(Ecm);
103                _h_ups1_eta->fill(xp,1./beta);
104            }
105          }
106        }
107      }
108    }
109
110
111    /// Normalise histograms etc., after the run
112    void finalize() {
113      // Scale histos
114      if (_weightSum_cont->val() > 0.) {
115        scale(_h_cont_pi[0] , 1./ *_weightSum_cont);
116        scale(_h_cont_pi[1] , sqr(sqrtS())*crossSection()/microbarn/sumOfWeights());
117        scale(_h_cont_eta[0], 1./ *_weightSum_cont);
118        scale(_h_cont_eta[1], sqr(sqrtS())*crossSection()/microbarn/sumOfWeights());
119      	scale(_n_Pi[0],  1./ *_weightSum_cont);
120      	scale(_n_Eta[0], 1./ *_weightSum_cont);
121      }
122      if (_weightSum_Ups1->val() > 0.) {
123        scale(_h_ups1_pi, 1./ *_weightSum_Ups1);
124        scale(_h_ups1_eta, 1./ *_weightSum_Ups1);
125      	scale(_n_Pi[1],  1./ *_weightSum_Ups1);
126      	scale(_n_Eta[1], 1./ *_weightSum_Ups1);
127      }
128    }
129
130    /// @}
131
132
133    /// @name Histograms
134    /// @{
135    Histo1DPtr _h_cont_pi[2] , _h_ups1_pi;
136    Histo1DPtr _h_cont_eta[2], _h_ups1_eta;
137    BinnedHistoPtr<string> _n_Eta[2];
138    CounterPtr _n_Pi[2];
139    CounterPtr _weightSum_cont,_weightSum_Ups1;
140    const string Ecm = "9.8";
141    /// @}
142
143  };
144
145
146  RIVET_DECLARE_PLUGIN(CRYSTAL_BALL_1991_I297905);
147
148}