Rivet analyses

Measurements of charged particle multiplicities, R and event shapes between 12 and 43 GeV.

Experiment: TASSO (PETRA)

Inspire ID: 195333

Status: VALIDATED

Authors: - Peter Richardson

References: - Z.Phys. C22 (1984) 307-340, 1984

Beams: e- e+

Beam energies: (6.0, 6.0); (7.0, 7.0); (11.0, 11.0); (12.5, 12.5); (13.8, 13.8); (15.1, 15.1); (15.2, 15.2); (15.6, 15.6); (16.6, 16.6); (17.0, 17.0); (17.2, 17.2); (17.4, 17.4); (18.1, 18.1); (20.8, 20.8); (21.5, 21.5)GeV

Run details: - e+ e- to hadrons and e+ e- to mu+ mu- (for normalization).

Measurement of R, charged particle multiplicites and event shapes in e+e collisions for energies between 12 and 43 GeV. The average charged particle multiplicity, thrust and sphericity are measured for a range of energies. The distributions are available for 12, 22 and 34 GeV. The individual hadronic and muonic cross sections are also outputted to the yoda file so that ratio R can be recalculated if runs are combined.

Source code:TASSO_1984_I195333.cc

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

namespace Rivet {


  /// @brief Charged-particle multiplicities, R, and event shapes between 12 and 43 GeV
  class TASSO_1984_I195333 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(TASSO_1984_I195333);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // Initialise and register projections
      const FinalState fs;
      declare(fs, "FS");
      declare(Sphericity(fs), "Sphericity");
      declare(Thrust(fs), "Thrust");

      // Counters for R
      book(_h_hadrons, "_sigma_hadrons", refData<YODA::BinnedEstimate<string>>(1,1,1));
      book(_h_muons,   "_sigma_muons"  , refData<YODA::BinnedEstimate<string>>(1,1,1));
      for (const string& en : _h_hadrons.binning().edges<0>()) {
        const size_t idx = en.find("-");
        if (idx!=std::string::npos) {
          const double emin = std::stod(en.substr(0,idx));
          const double emax = std::stod(en.substr(idx+1,string::npos));
          if (inRange(sqrtS()/GeV, emin, emax)) {
            _sqs[0] = en; break;
          }
        }
        else {
          const double eval = std::stod(en)*GeV;
          if (isCompatibleWithSqrtS(eval)) {
            _sqs[0] = en; break;
          }
        }
      }
      size_t ih = 1;
      for (double eVal : {14*GeV, 22*GeV, 34*GeV}) {
        const string en = toString(round(eVal));
        if (isCompatibleWithSqrtS(eVal)) _sqs[2] = en;
        book(_c[en], "_sumW_"+en);
        book(_d[en+"mult"], 3, 1, ih);
        book(_h[en+"p"],    5, 1, ih);
        book(_h[en+"xp"],   6, 1, ih);
        book(_h[en+"pl"],   7, 1, ih);
        book(_h[en+"pt"],   8, 1, ih);
        book(_h[en+"pt2"],  9, 1, ih);
        book(_h[en+"xl"],  10, 1, ih);
        book(_h[en+"xT"],  11, 1, ih);
        book(_h[en+"S"],   12, 1, ih);
        book(_h[en+"T"],   13, 1, ih);
        book(_h[en+"y"],   14, 1, ih);
        ++ih;
      }
      // average event shapes
      book(_p["charged"], 4, 1, 1);
      book(_p["total"], "TMP/ntotal",refData<YODA::BinnedEstimate<string>>(4,1,2));
      book(_p["sphericity"], 4, 1,  4);
      book(_p["thrust"],     4, 1,  5);
      book(_p["p_total"],    4, 1,  6);
      book(_p["p_l"],        4, 1,  7);
      book(_p["pt"],         4, 1,  8);
      book(_p["pt2"],        4, 1,  9);
      book(_p["pt2_in"],     4, 1, 10);
      book(_p["pt2_out"],    4, 1, 11);
      for (const string& en : _p["charged"].binning().edges<0>()) {
        const size_t idx = en.find("-");
        if (idx != string::npos) {
          const double emin = stod(en.substr(0,idx));
          const double emax = stod(en.substr(idx+1,string::npos));
          if (inRange(sqrtS()/GeV, emin, emax)) {
            _sqs[1] = en; break;
          }
        }
        else {
          const double eval = stod(en)*GeV;
          if (isCompatibleWithSqrtS(eval)) {
            _sqs[1] = en; break;
          }
        }
      }
      raiseBeamErrorIf(_sqs[0].empty() && _sqs[1].empty());
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const FinalState& fs = apply<FinalState>(event, "FS");

      map<long,int> nCount;
      double ntotal(0);
      unsigned int nCharged(0);
      for (const Particle& p : fs.particles()) {
        nCount[p.pid()] += 1;
        if ((p.pid()!=PID::PHOTON && p.abspid()!=PID::ELECTRON) ||
            p.parents().empty() || p.parents()[0].pid()!=PID::PI0) {
          ntotal += 1.;
        }
        else if (p.pid()==PID::PHOTON) {
          ntotal += 0.5 ;
        }
        else {
          ntotal += 0.25;
          nCharged -=1;
        }
        if (PID::isCharged(p.pid())) {
          ++nCharged;
        }
      }
      // mu+mu- + photons
      if (nCount[-13]==1 && nCount[13]==1 && int(fs.particles().size())==2+nCount[22]) {
        _h_muons->fill(_sqs[0]); vetoEvent;
      }
      // everything else
      _h_hadrons->fill(_sqs[0]);
      _p["charged"]->fill(_sqs[1], nCharged);
      _p["total"]->fill(_sqs[1], ntotal);
      // thrust
      const Thrust& thrust = apply<Thrust>(event, "Thrust");
      _p["thrust"]->fill(_sqs[1],thrust.thrust());
      // sphericity
      const Sphericity& sphericity = apply<Sphericity>(event, "Sphericity");
      _p["sphericity"]->fill(_sqs[1],sphericity.sphericity());
      // global distributions
      if (!_sqs[2].empty()) {
        _c[_sqs[2]]->fill();
        _d[_sqs[2]+"mult"]->fill(nCharged);
        _h[_sqs[2]+"S"]->fill(sphericity.sphericity());
        _h[_sqs[2]+"T"]->fill(thrust.thrust());
      }
      // single particle distributions
      for (const Particle& p : fs.particles()) {
        if (!PID::isCharged(p.pid())) continue;
        const Vector3 mom3 = p.p3();
        double pp = mom3.mod();
        const double mom = dot(sphericity.sphericityAxis(), mom3);
        const double pTin = dot(mom3, sphericity.sphericityMajorAxis());
        const double pTout = dot(mom3, sphericity.sphericityMinorAxis());
        double pT2 = sqr(pTin) + sqr(pTout);
        double pT = sqrt(pT2);
        _p["p_total"]->fill(_sqs[1],pp);
        _p["p_l"]->fill(_sqs[1],fabs(mom));
        _p["pt2_in"]->fill(_sqs[1],sqr(pTin));
        _p["pt2_out"]->fill(_sqs[1],sqr(pTout));
        _p["pt2"]->fill(_sqs[1],pT2);
        _p["pt"]->fill(_sqs[1],pT);
        if (!_sqs[2].empty()) {
          const double rap = 0.5 * log((p.E() + mom) / (p.E() - mom));
          _h[_sqs[2]+"p"]->fill(pp);
          _h[_sqs[2]+"xp"]->fill(2.*pp/sqrtS());
          _h[_sqs[2]+"pl"]->fill(fabs(mom));
          _h[_sqs[2]+"xl"]->fill(2.*fabs(mom)/sqrtS());
          _h[_sqs[2]+"pt2"]->fill(pT2);
          _h[_sqs[2]+"pt"]->fill(pT);
          _h[_sqs[2]+"xT"]->fill(2.*pT/sqrtS());
          _h[_sqs[2]+"y"]->fill(fabs(rap));
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      BinnedEstimatePtr<string> mult;
      book(mult, 1, 1, 1);
      divide(_h_hadrons, _h_muons, mult);
      // charged particle multiplicity distribution
      normalize(_d);
      // charged fraction
      book(mult, 4, 1, 2);
      divide(_p["charged"], _p["total"], mult);
      book(mult, 4, 1, 3);
      const auto& b = _p["charged"]->binAt(_sqs[1]);
      mult->binAt(_sqs[1]).set(b.stdDev(2),b.stdErr(2));
      // scale the distributions
      scale(_c, crossSectionPerEvent());
      scale(_h, crossSectionPerEvent());
      for (auto& item : _h) {
        const double w = _c[item.first.substr(0,2)]->sumW();
        if (!isZero(w))  scale(item.second, 1.0/w);
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    map<string,CounterPtr> _c;
    map<string,Histo1DPtr> _h;
    map<string,BinnedHistoPtr<int>> _d;
    map<string,BinnedProfilePtr<string>> _p;
    BinnedHistoPtr<string> _h_hadrons, _h_muons;
    string _sqs[3];
    /// @}

  };

  RIVET_DECLARE_PLUGIN(TASSO_1984_I195333);

}