Rivet analyses

Event shapes in Υ(1S) decay and nearby continuum

Experiment: ARGUS (DORIS)

Inspire ID: 227324

Status: VALIDATED

Authors: - Peter Richardson

References: - Z.Phys. C31 (1986) 181

Beams: e+ e-

Beam energies: (4.7, 4.7); (5.0, 5.0)GeV

Run details: - e+e- to hadrons for continuum and any process for Upsilon decay

Measurement of the thrust and sphericty by the ARGUS experiment in e+e- collision at the Υ(1S) resonance and in the nearby continuum.

Source code:ARGUS_1986_I227324.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/Thrust.hh"
#include "Rivet/Projections/Sphericity.hh"

namespace Rivet {


  /// @brief Event shapes at Upsilon(1S)
  class ARGUS_1986_I227324 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1986_I227324);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // projections
      declare(UnstableParticles(), "UFS");
      declare(ChargedFinalState(), "CFS");
      const FinalState fs;
      declare(Thrust(fs)    ,"Thrust");
      declare(Sphericity(fs),"Sphericity");
      // histograms
      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal/MeV));
        if (isCompatibleWithSqrtS(eVal, 1e-3))  _sqs = en;
        bool isCont(en=="9980"s);
        book(_h[en+"S"], 1, 1, 1+isCont);
        book(_h[en+"T"], 2, 1, 1+isCont);
      }
      raiseBeamErrorIf(_sqs.empty());
    }

    /// Recursively walk the decay tree to find the stable decay products of @a p
    void findDecayProducts(const Particle& mother, Particles& charged, Particles& neutral) const {
      for(const Particle& p : mother.children()) {
        if (!p.children().empty()) {
          findDecayProducts(p, charged, neutral);
        }
        else {
          if (isCharged(p))  charged.push_back(p);
          else               neutral.push_back(p);
        }
      }
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      // Find the Upsilons among the unstables
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
      Particles upsilons = ufs.particles(Cuts::pid==553 or Cuts::pid==100553);
      if (upsilons.empty() && _sqs == "9980"s) {
        Particles charged = apply<ChargedFinalState>(event, "CFS").particles();
        // at least 6 charged particles
        if (charged.size()<6) vetoEvent;
        // cut on high momentum particles
        size_t nHigh(0);
        for (const Particle & p : charged) {
          if (p.mom().p3().mod()>2.5) ++nHigh;
        }
        if (nHigh>1) vetoEvent;
        MSG_DEBUG("No Upsilons found => continuum event");
        Thrust thrust = apply<Thrust>(event, "Thrust");
        _h[_sqs+"T"]->fill(thrust.thrust());
        Sphericity sphericity = apply<Sphericity>(event, "Sphericity");
        _h[_sqs+"S"]->fill(sphericity.sphericity());
      }
      else {
        for (const Particle& ups : upsilons) {
          LorentzTransform boost;
          if (ups.p3().mod() > 1*MeV) {
            boost = LorentzTransform::mkFrameTransformFromBeta(ups.mom().betaVec());
          }
          // Find the decay products we want
          Particles charged,neutral;
          // 6 charged particles
          findDecayProducts(ups, charged, neutral);
          if (charged.size()<6) continue;
          // at most 1 |p|>2.5
          vector<FourMomentum> mom;
          mom.reserve(neutral.size()+charged.size());
          unsigned int nHigh(0);
          for (const Particle& p : charged) {
            mom.push_back(boost.transform(p.mom()));
            if(mom.back().p3().mod()>2.5) ++nHigh;
          }
          if (nHigh>1) continue;
          for (const Particle & p : neutral) {
            mom.push_back(boost.transform(p.mom()));
          }
          Thrust thrust;
          thrust.calc(mom);
          _h[_sqs+"T"]->fill(thrust.thrust());
          Sphericity sphericity;
          sphericity.calc(mom);
          _h[_sqs+"S"]->fill(sphericity.sphericity());
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      normalize(_h);
    }

    /// @}


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


  };


  RIVET_DECLARE_PLUGIN(ARGUS_1986_I227324);

}