rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

LENA_1981_I164397

Charged particle multiplicities and thrust in $\Upsilon(1S,2S)$ decays and nearby continuum
Experiment: LENA (DORIS)
Inspire ID: 164397
Status: VALIDATED
Authors:
  • Peter Richardson
No references listed
Beams: * *
Beam energies: ANY
Run details:
  • e+e- to hadrons for continuum, or any process producing Upsilon 1S and 2S decays Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Measurement of the charged particle multiplicities and a thrust-like variable in $\Upsilon(1S,2S)$ decays and nearby continuum. As LENA had no magnetic field the momenta of the charged particles were not measured and therefore a thrust-like variable $T^\prime$ was constructed using only the directions of the charged particles. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: LENA_1981_I164397.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/ChargedFinalState.hh"
  5#include "Rivet/Projections/Thrust.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief Thrust like variable at Upsilon(1S,2S)
 11  class LENA_1981_I164397 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(LENA_1981_I164397);
 16
 17
 18    /// @name Analysis methods
 19    /// @{
 20
 21    /// Book histograms and initialise projections before the run
 22    void init() {
 23      declare(UnstableParticles(), "UFS");
 24      declare(ChargedFinalState(), "FS");
 25      book(_mult,3,1,1);
 26      _ecms = "OTHER";
 27      if (inRange(sqrtS(),7.35,7.49)) {
 28        _ecms = "7.35 - 7.49"s;
 29      }
 30      else if (inRange(sqrtS(),8.629,9.142)) {
 31        _ecms = "8.629 - 9.142"s;
 32      }
 33      else if (inRange(sqrtS(),9.15,9.41)) {
 34        _ecms = "9.15 - 9.41"s;
 35      }
 36      else if(isCompatibleWithSqrtS(9.5149*GeV,1e-2)) {
 37        _ecms = "9.5149";
 38        book(_hist_T_cont ,4, 1, 1);
 39      }
 40      else if(isCompatibleWithSqrtS(9.9903*GeV,1e-2)) {
 41        _ecms = "9.9903";
 42        book(_hist_T_cont ,4, 1, 2);
 43      }
 44      book(_hist_T_Ups1 ,4, 1, 3);
 45      book(_hist_T_Ups2 ,4, 1, 4);
 46      book(_weightSum_cont, "TMP/weightSum_cont");
 47      book(_weightSum_Ups1, "TMP/weightSum_Ups1");
 48      book(_weightSum_Ups2, "TMP/weightSum_Ups2");
 49    }
 50
 51
 52    /// Recursively walk the decay tree to find the charged decay products of @a p
 53    void findDecayProducts(Particle mother, Particles& charged) {
 54      for(const Particle & p: mother.children()) {
 55        const int id = p.pid();
 56	if(!p.children().empty())
 57	  findDecayProducts(p, charged);
 58	else if(PID::isCharged(id))
 59	  charged.push_back(p);
 60      }
 61    }
 62
 63    // defn of thrust in paper used just the direction
 64    double thrustPrime(const LorentzTransform & boost, const Particles & particles) {
 65      vector<Vector3> vecs;
 66      for(const Particle & p : particles) {
 67	vecs.push_back(boost.transform(p.momentum()).p3().unit());
 68      }
 69      Thrust thrust;
 70      thrust.calc(vecs);
 71      return thrust.thrust();
 72    }
 73
 74    /// Perform the per-event analysis
 75    void analyze(const Event& event) {
 76      // Find the Upsilons among the unstables
 77      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 78      Particles upsilons = ufs.particles(Cuts::pid==553 or Cuts::pid==100553);
 79      if (upsilons.empty()) {
 80        MSG_DEBUG("No Upsilons found => continuum event");
 81        _weightSum_cont->fill();
 82	Particles cfs = apply<ChargedFinalState>(event, "FS").particles();
 83	_mult->fill(_ecms,cfs.size());
 84	if(_hist_T_cont) {
 85          LorentzTransform boost;
 86	  _hist_T_cont->fill(thrustPrime(boost,cfs));
 87	}
 88      }
 89      // Upsilon(s) found
 90      else {
 91        for (const Particle& ups : upsilons) {
 92          const int parentId = ups.pid();
 93          Particles charged;
 94	  // boost to rest frame (if required)
 95          LorentzTransform boost;
 96          if (ups.p3().mod() > 1*MeV)
 97            boost = LorentzTransform::mkFrameTransformFromBeta(ups.momentum().betaVec());
 98          // Find the decay products we want
 99          findDecayProducts(ups, charged);
100	  if(parentId==553) {
101	    _weightSum_Ups1->fill();
102	    _mult->fill("9.4624"s,charged.size());
103	    _hist_T_Ups1->fill(thrustPrime(boost,charged));
104	  }
105	  else {
106	    _weightSum_Ups2->fill();
107	    _mult->fill("10.0148"s,charged.size());
108	    _hist_T_Ups2->fill(thrustPrime(boost,charged));
109	  }
110	}
111      }
112
113    }
114
115
116    /// Normalise histograms etc., after the run
117    void finalize() {
118      // charged particle multiplicity
119      if ( _weightSum_cont->val()>0. && _hist_T_cont )
120        scale(_hist_T_cont,1./ *_weightSum_cont );
121      if(_weightSum_Ups1->val()>0. )
122         scale(_hist_T_Ups1,1./ *_weightSum_Ups1 );
123      if(_weightSum_Ups2->val()>0. )
124        scale(_hist_T_Ups2,1./ *_weightSum_Ups2 );
125    }
126
127    /// @}
128
129
130    /// @name Histograms
131    /// @{
132    BinnedProfilePtr<string> _mult;
133    CounterPtr _weightSum_cont, _weightSum_Ups1, _weightSum_Ups2;
134    Histo1DPtr _hist_T_cont,_hist_T_Ups1,_hist_T_Ups2;
135    string _ecms;
136    /// @}
137
138
139  };
140
141
142  RIVET_DECLARE_PLUGIN(LENA_1981_I164397);
143
144}