rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2015_I1283743

Mass distributions in $\Upsilon(5S)\to\pi^+\pi^-\Upsilon(1,2,3S)$
Experiment: BELLE (KEKB)
Inspire ID: 1283743
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 91 (2015) 7, 072003
Beams: e+ e-
Beam energies: (5.4, 5.4) GeV
Run details:
  • e+ e- to hadrons, pi0 set stable

Measurement of the cross section for $\Upsilon(5S)\to\pi^+\pi^-\Upsilon(1,2,3S)$ in $e^=e^-$ collisions. In addition to the cross sections in the HEPDATa entry the mass distributions are implemented using values read from the plots in the paper. Currently only the mass distributions are implemented, although the data for the angular distributions is available in the YODA file.

Source code: BELLE_2015_I1283743.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/Beam.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief Upsilon(5S) -> pi+pi- Upsilon(1,2,3S)
 10  class BELLE_2015_I1283743 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2015_I1283743);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // projections
 23      declare(FinalState(), "FS");
 24      declare(Beam(), "Beams");
 25      // histograms
 26      for (unsigned int ix=0; ix<3; ++ix) {
 27        book(_h_sigma[ix],ix+1,1,2);
 28      }
 29      for (unsigned int ix=0;ix<12;++ix) {
 30        // book(_h_angle_ups2[ix],14,1,1+ix);
 31        if (ix>=8) continue;
 32        book(_h_mass_ups2 [ix],12,1,1+ix);
 33        // book(_h_angle_ups3[ix],15,1,1+ix);
 34        if (ix>=6) continue;
 35        book(_h_mass_all [ix],10,1,1+ix);
 36        book(_h_mass_ups1[ix],11,1,1+ix);
 37        book(_h_mass_ups3[ix],13,1,1+ix);
 38      }
 39    }
 40
 41
 42    /// Perform the per-event analysis
 43    void analyze(const Event& event) {
 44      // get the axis, direction of incoming electron
 45      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
 46      Vector3 axis1;
 47      if (beams.first.pid()>0) {
 48        axis1 = beams.second.mom().p3().unit();
 49      }
 50      else {
 51        axis1 = beams.first .mom().p3().unit();
 52      }
 53      // find upsilon pi+ pi-
 54      Particles fs = apply<FinalState>(event, "FS").particles();
 55      Particles UPS, other;
 56      for(const Particle & p : fs) {
 57       	Particle parent=p;
 58        Particle ups=p;
 59       	while (!parent.parents().empty()) {
 60      	  parent=parent.parents()[0];
 61      	  if (parent.pid()==553 ||
 62              parent.pid()==100553||
 63              parent.pid()==200553) ups=parent;
 64      	}
 65       	if (ups.pid()%1000!=553) {
 66      	  other += p;
 67      	  continue;
 68      	}
 69      	bool found=false;
 70      	for (const auto& p : UPS) {
 71      	  // psi already in list
 72      	  if (fuzzyEquals(p.mom(), ups.mom())) {
 73      	    found=true;
 74      	    break;
 75      	  }
 76      	}
 77      	if (!found) UPS += ups;
 78      }
 79      // upsilon + 2 other particles
 80      if (UPS.size()!=1 || other.size()!=2) vetoEvent;
 81      // other particles pi+ pi-
 82      if (!(other[0].pid()==-other[1].pid() && other[0].abspid()==PID::PIPLUS)) vetoEvent;
 83      // cross secrtion
 84      int iups = UPS[0].pid()/100000;
 85      _h_sigma[iups]->fill(string("10.865"));
 86      // fill the mass plots
 87      double mpipi = (other[0].mom()+other[1].mom()).mass();
 88      double mUpspi[2] = {(other[0].mom()+UPS[0].mom()).mass(),
 89                          (other[1].mom()+UPS[0].mom()).mass()};
 90      if (mUpspi[0]<mUpspi[1]) {
 91        swap(other[0],other[1]);
 92        swap(mUpspi[0],mUpspi[1]);
 93      }
 94      double mpipi2=sqr(mpipi);
 95      double mMax2=sqr(mUpspi[0]);
 96      _h_mass_all[iups+3]->fill(mpipi);
 97      if (iups==0) {
 98        if (mpipi2>0.2)                  _h_mass_all [0]->fill(mUpspi[0]);
 99        if (mpipi2>0.2&&mpipi2<1)        _h_mass_ups1[0]->fill(mUpspi[0]);
100        else if (mpipi2>1 && mpipi2<1.5) _h_mass_ups1[1]->fill(mUpspi[0]);
101        else if (mpipi2>1.5)             _h_mass_ups1[2]->fill(mUpspi[0]);
102        if (mMax2<105)                   _h_mass_ups1[3]->fill(mpipi);
103        else if (mMax2>105&&mMax2<110)   _h_mass_ups1[4]->fill(mpipi);
104        else if (mMax2>110)              _h_mass_ups1[5]->fill(mpipi);
105      }
106      else if (iups==1) {
107        if (mpipi2>0.14)                 _h_mass_all [1]->fill(mUpspi[0]);
108        if (mpipi2>0.14&&mpipi2<0.3)     _h_mass_ups2[0]->fill(mUpspi[0]);
109        else if (mpipi2>0.3&&mpipi2<0.5) _h_mass_ups2[1]->fill(mUpspi[0]);
110        else if (mpipi2>0.5&&mpipi2<0.6) _h_mass_ups2[2]->fill(mUpspi[0]);
111        else if (mpipi2>0.6)             _h_mass_ups2[3]->fill(mUpspi[0]);
112        if (mMax2<110)                   _h_mass_ups2[4]->fill(mpipi);
113        else if (mMax2>110&&mMax2<112)   _h_mass_ups2[5]->fill(mpipi);
114        else if (mMax2>112&&mMax2<114)   _h_mass_ups2[6]->fill(mpipi);
115        else if (mMax2>114)              _h_mass_ups2[7]->fill(mpipi);
116      }
117      else if (iups==2) {
118        if (mpipi2>0.1)                   _h_mass_all [2]->fill(mUpspi[0]);
119        if (mpipi2>0.1&&mpipi2<0.15)      _h_mass_ups3[0]->fill(mUpspi[0]);
120        else if (mpipi2>0.15&& mpipi2<.2) _h_mass_ups3[1]->fill(mUpspi[0]);
121        else if (mpipi2>0.2)              _h_mass_ups3[2]->fill(mUpspi[0]);
122        if (mMax2<113)                    _h_mass_ups3[3]->fill(mpipi);
123        else if (mMax2>113&&mMax2<114)    _h_mass_ups3[4]->fill(mpipi);
124        else if (mMax2>114)               _h_mass_ups3[5]->fill(mpipi);
125      }
126      // // only angular stuff for 2s and 3s
127      // if(iups==0) return;
128      // double cPi = axis1.dot(other[1].mom().p3().unit());
129      // int iRegion=-1;
130      // if (mUpspi[0]>10.605 && mUpspi[1]<10.635)
131      // 	iRegion=0;
132      // else if(mUpspi[0]>10.645 && mUpspi[1]<10.675)
133      // 	iRegion=1;
134      // else if(mUpspi[0]<10.57) {
135      // 	iRegion=2;
136      // 	if(iups==2) return;
137      // }
138      // else
139      // 	return;
140      // if(iups==1) {
141      // 	_h_angle_ups2[4*iRegion]->fill(cPi);
142      // }
143      // else if(iups==2) {
144      // 	_h_angle_ups3[4*iRegion]->fill(cPi);
145      // }
146    }
147
148
149    /// Normalise histograms etc., after the run
150    void finalize() {
151      scale(_h_sigma, crossSection()/ sumOfWeights() /picobarn);
152      //normalize(_h_angle_ups2, 1.0, false);
153      normalize(_h_mass_ups2, 1.0, false);
154      //normalize(_h_angle_ups3, 1.0, false);
155      normalize(_h_mass_all, 1.0, false);
156      normalize(_h_mass_ups1, 1.0, false);
157      normalize(_h_mass_ups3, 1.0, false);
158    }
159
160    /// @}
161
162    /// @name Histograms
163    /// @{
164    BinnedHistoPtr<string> _h_sigma[3];
165    Histo1DPtr _h_mass_all[6],_h_mass_ups1[6],
166      _h_mass_ups2[8],_h_mass_ups3[6];
167    // Histo1DPtr _h_angle_ups2[12],_h_angle_ups3[8];
168    /// @}
169
170
171  };
172
173
174  RIVET_DECLARE_PLUGIN(BELLE_2015_I1283743);
175
176}