rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ARGUS_1990_I295621

$pp$ and $\Lambda\Lambda$ production at the $\Upsilon(1,2S)$ and nearby continuum
Experiment: ARGUS (DORIS)
Inspire ID: 295621
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Z.Phys.C 49 (1991) 349-354
Beams: e+ e-
Beam energies: (4.7, 4.7); (5.0, 5.0); (5.0, 5.0) GeV
Run details:
  • $e^+ e^-$ analysis in the 10 GeV CMS energy range

Measurement of the production of $pp$ and $\Lambda\Lambda$ in $\Upsilon(1,2S)$ decays and the nearby $e^+e^-$ continuum.

Source code: ARGUS_1990_I295621.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 baryon correlations
 10  class ARGUS_1990_I295621 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1990_I295621);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      declare(FinalState(Cuts::pid==2212), "FS");
 23      declare(UnstableParticles(), "UFS");
 24      // histos
 25      for (unsigned int ix=0;ix<2;++ix) {
 26        book(_c[ix],"TMP/c_"+toString(ix+1));
 27        book(_h_angle[ix], 9, 1, 1+ix);
 28      }
 29      for (unsigned int ix=0; ix<3; ++ix) {
 30        book(_n_cont[ix], 1+ix, 1, 1);
 31        book(_n_Ups [ix], 4+ix, 1, 1);
 32      }
 33    }
 34
 35    /// Recursively walk the decay tree to find decay products of @a p
 36    void findDecayProducts(const Particle& mother, Particles& protons, Particles& lam) {
 37      for (const Particle& p: mother.children()) {
 38        const int id = abs(p.pid());
 39        if (id == 2212) {
 40          protons.push_back(p);
 41        }
 42        else if (id == 3122) {
 43          lam.push_back(p);
 44        }
 45        if (!p.children().empty()) {
 46          findDecayProducts(p, protons, lam);
 47        }
 48      }
 49    }
 50
 51    void fillHistos(unsigned int imode, Particles& protons, Particles& lam, LorentzTransform& cms_boost) {
 52      Particles protons2;
 53      for (const Particle& p : protons) {
 54        const double modp = cms_boost.transform(p).p3().mod();
 55        if (modp<0.4 || modp>1.2) continue;
 56        if (imode==0) _n_cont[0]->fill("< 9.46"s);
 57        else          _n_Ups [0]->fill("9.460 + 10.023"s);
 58        protons2.push_back(p);
 59      }
 60      for (unsigned int ix=0; ix<protons2.size(); ++ix) {
 61        Vector3 axis1 = cms_boost(protons2[ix].mom()).p3().unit();
 62        if (protons2[ix].parents()[0].abspid()==3122) continue;
 63        for (unsigned int iy=ix+1;iy<protons2.size();++iy) {
 64          if (protons2[ix].pid()*protons2[iy].pid()<0) continue;
 65          if (protons2[iy].parents()[0].abspid()==3122) continue;
 66          Vector3 axis2 = cms_boost(protons2[iy].mom()).p3().unit();
 67          double cTheta = axis1.dot(axis2);
 68          if (imode==0) _n_cont[1]->fill("< 9.46"s);
 69          else         _n_Ups [1]->fill("9.460 + 10.023"s);
 70          _h_angle[imode]->fill(cTheta);
 71        }
 72      }
 73      for (unsigned int ix=0; ix<lam.size(); ++ix) {
 74        for (unsigned int iy=ix+1; iy<lam.size(); ++iy) {
 75          if (lam[ix].pid()*lam[iy].pid()<0) continue;
 76          if (imode==0) _n_cont[2]->fill("< 9.46"s);
 77          else          _n_Ups [2]->fill("9.460 + 10.023"s);
 78        }
 79      }
 80    }
 81
 82    /// Perform the per-event analysis
 83    void analyze(const Event& event) {
 84      // Find the upsilons
 85      // First in unstable final state
 86      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 87      Particles upsilons = ufs.particles(Cuts::pid==553 || Cuts::pid==100553);
 88      // continuum
 89      if (upsilons.empty()) {
 90        _c[0]->fill();
 91        Particles protons = apply<FinalState>(event,"FS").particles();
 92        Particles lam = ufs.particles(Cuts::abspid==3122);
 93        LorentzTransform cms_boost;
 94        fillHistos(0,protons,lam,cms_boost);
 95      }
 96      // found an upsilon
 97      else {
 98        for (const Particle& ups : upsilons) {
 99          _c[1]->fill();
100          Particles protons,lam;
101          findDecayProducts(ups, protons, lam);
102          LorentzTransform cms_boost;
103          if (ups.p3().mod() > 0.001) {
104            cms_boost = LorentzTransform::mkFrameTransformFromBeta(ups.mom().betaVec());
105          }
106          fillHistos(1,protons,lam,cms_boost);
107        }
108      }
109    }
110
111
112    /// Normalise histograms etc., after the run
113    void finalize() {
114      scale(_n_cont, 1.0/ *_c[0]);
115      scale(_n_Ups,  1.0/ *_c[1]);
116      scale(_h_angle[0], 1e4/ *_c[0]);
117      scale(_h_angle[1], 1e3/ *_c[1]);
118      BinnedEstimatePtr<string> tmp;
119      for (unsigned int ix=0;ix<2;++ix) {
120        book(tmp, 7+ix, 1, 1);
121        double val = _n_Ups[ix]->bin(1).sumW()/_n_cont[ix]->bin(1).sumW();
122        double err = val*sqrt( sqr(_n_Ups [ix]->bin(1).errW()/ _n_Ups[ix]->bin(1).sumW()) +
123                               sqr(_n_cont[ix]->bin(1).errW()/_n_cont[ix]->bin(1).sumW()));
124        tmp->bin(1).set(val,err);
125      }
126    }
127
128    /// @}
129
130
131    /// @name Histograms
132    /// @{
133    BinnedHistoPtr<string> _n_cont[3],_n_Ups[3];
134    Histo1DPtr _h_angle[2];
135    CounterPtr _c[2];
136
137    /// @}
138
139
140  };
141
142
143  RIVET_DECLARE_PLUGIN(ARGUS_1990_I295621);
144
145}