rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2013_I1225274

Measurements of the $\Upsilon(1S)$, $\Upsilon(2S)$, and $\Upsilon(3S)$ differential cross sections in pp collisions at $\sqrt{s}=7$ TeV
Experiment: CMS (LHC)
Inspire ID: 1225274
Status: VALIDATED
Authors:
  • Peter Richardson
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • Upsilon production at LHC energies

Measurement of the transverse momentum distribtions for $\Upsilon(1S)$, $\Upsilon(2S)$, and $\Upsilon(3S)$ production in six rapidity intervals. The production ratios are also measured. There is a more recent 7 TeV CMS measurement but this one extends to zero transverse momentum and has more rapidity intervals.

Source code: CMS_2013_I1225274.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief Upsilon(1,2,3S) at 7 TeV
  9  class CMS_2013_I1225274 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2013_I1225274);
 14
 15    /// @name Analysis methods
 16    ///@{
 17
 18    /// Book histograms and initialise projections before the run
 19    void init() {
 20      // projection
 21      declare(UnstableParticles(), "UFS");
 22      // histograms
 23      for (unsigned int ix=0; ix<3; ++ix) {
 24        if (ix<2)  book(_h_total[ix],1,1,1+ix);
 25        for (unsigned int iy=0; iy<2; ++iy) {
 26          book(_h_pT_y[ix][iy], {0.,0.4,0.8,1.2,1.6,2.0,2.4});
 27          for(unsigned int iz=0; iz<6; ++iz) {
 28            book(_h_pT_y[ix][iy]->bin(iz+1), 5+3*iz+ix, 1, iy+1);
 29          }
 30          book(_h_pT[ix][iy], 2 +ix, 1, iy+1);
 31          book(_h_y [ix][iy], 23+ix, 1, iy+1);
 32          book(_h_r [ix][iy], "TMP/h_r_"+toString(ix)+"_"+toString(iy), refData(26,1,iy+1));
 33        }
 34        book(_h_pT_acc[ix], 29+ix, 1, 1);
 35      }
 36    }
 37
 38    void findChildren(const Particle& p, Particles& mum, Particles& mup, unsigned int& nstable) {
 39      for (const Particle & child : p.children()) {
 40        if (child.pid()==PID::MUON) {
 41          mum.push_back(child);
 42          ++nstable;
 43        }
 44        else if (child.pid()==PID::ANTIMUON) {
 45          mup.push_back(child);
 46          ++nstable;
 47        }
 48        else if (child.pid()==PID::PHOTON) {
 49          continue;
 50        }
 51        else if (child.children().empty()) {
 52          ++nstable;
 53        }
 54        else {
 55          findChildren(child,mum,mup,nstable);
 56        }
 57      }
 58    }
 59
 60    // from eqn 1 of paper
 61    bool acceptMuon(const Particle & p) const {
 62      const double abseta = p.abseta();
 63      const double xp = p.perp();
 64      if (abseta<0.8)      return xp>3.75;
 65      else if (abseta<1.6) return xp>3.5;
 66      else if (abseta<2.4) return xp>3.0;
 67      else return false;
 68    }
 69
 70    /// Perform the per-event analysis
 71    void analyze(const Event& event) {
 72      if (_edges.empty()) _edges = _h_total[0]->xEdges();
 73      // Final state of unstable particles to get particle spectra
 74      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 75
 76      for (const Particle& p : ufs.particles(Cuts::pid==553 || Cuts::pid==100553 || Cuts::pid==200553)) {
 77        const double absrap = p.absrap();
 78        // rapidity cut
 79        if (absrap>2.4) continue;
 80        double xp = p.perp();
 81        unsigned int iloc=0;
 82        if      (p.pid()==   553) iloc=0;
 83        else if (p.pid()==100553) iloc=1;
 84        else if (p.pid()==200553) iloc=2;
 85        // acceptance corrected only hist
 86        if (absrap<1.2) {
 87          _h_pT_acc[iloc]->fill(xp);
 88        }
 89        // check if children muons and within acceptance
 90        unsigned int imin=1;
 91        // find the children
 92        Particles mum,mup;
 93        unsigned int nstable(0);
 94        findChildren(p,mum,mup,nstable);
 95        if (mup.size()==1 && mup.size()==1 && nstable==2) {
 96          if (acceptMuon(mup[0]) && acceptMuon(mum[0])) imin=0;
 97        }
 98        // fill the histos
 99        for (unsigned int ix=imin;ix<2;++ix) {
100          _h_pT_y[iloc][ix] ->fill(absrap,xp);
101          _h_pT  [iloc][ix]->fill(xp);
102          _h_r   [iloc][ix]->fill(xp);
103          if (xp<50.) _h_y[iloc][ix]->fill(absrap);
104          if (ix==0) {
105            _h_total[ix]->fill(_edges[iloc]);
106          }
107          else {
108            _h_total[ix]->fill(_edges[iloc], _br[iloc]);
109          }
110        }
111      }
112    }
113
114
115    /// Normalise histograms etc., after the run
116    void finalize() {
117      double factor = crossSection() / nanobarn/ sumOfWeights();
118      for (unsigned int ix=0; ix<2; ++ix) {
119        // total cross sections, just the factor
120        scale(_h_total[ix], factor);
121        for (unsigned int iy=0; iy<3; ++iy) {
122          double factor2 = factor;
123          if (ix==1) factor2*=_br[iy];
124          // pT integrated over y, just the factor
125          scale(_h_pT[iy][ix], factor2);
126          scale(_h_r[iy][ix], factor2);
127          if (ix==1) scale(_h_pT_acc[iy],factor2);
128          // not integrated over y, alsso undo y +/- folding
129          scale(_h_y[iy][ix], 0.5*factor2);
130          scale(_h_pT_y[iy][ix], 0.5*factor2);
131          divByGroupWidth(_h_pT_y[iy][ix]);
132        }
133        // ratios
134        Estimate1DPtr tmp;
135        // ups 3/ ups1
136        book(tmp, 26, 1, ix+1);
137        divide(_h_r[2][ix], _h_r[0][ix], tmp);
138        // ups 2/ ups1
139        book(tmp, 27, 1, ix+1);
140        divide(_h_r[1][ix], _h_r[0][ix], tmp);
141        // ups 3/ ups2
142        book(tmp, 28, 1, ix+1);
143        divide(_h_r[2][ix], _h_r[1][ix], tmp);
144      }
145    }
146
147    ///@}
148
149
150    /// @name Histograms
151    ///@{
152    Histo1DGroupPtr _h_pT_y[3][2];
153    BinnedHistoPtr<string> _h_total[2];
154    Histo1DPtr _h_pT[3][2],_h_pT_acc[3],_h_y[3][2],_h_r[3][2];
155    vector<double> _br{0.0248,0.0193,0.0218};
156    vector<string> _edges;
157    ///@}
158
159
160  };
161
162
163  RIVET_DECLARE_PLUGIN(CMS_2013_I1225274);
164
165}