Rivet analyses

Measurement of inclusive charmonium production

Experiment: BaBar (PEP-II)

Inspire ID: 593379

Status: VALIDATED

Authors: - Peter Richardson

References: - Phys.Rev. D67 032002, 2003 - hep-ex/0207097

Beams: e+ e-

Beam energies: (3.5, 8.0)GeV

Run details: - Production of charmonium at the Υ(4S) resonance.

Measurement of J/ψ, ψ, χc1 and χc2 production using a data sample corresponding to an integrated luminosity of 20.3~fb−1 collected with the BABAR detector at the SLAC PEP-II electron-positron storage ring operating at a centre-of-mass energy near 10.58~GeV.

Source code:BABAR_2003_I593379.cc

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

namespace Rivet {


  /// @brief Babar charmonium spectra
  /// @author Peter Richardson
  class BABAR_2003_I593379 : public Analysis {
  public:

    BABAR_2003_I593379()
        : Analysis("BABAR_2003_I593379") { }


    void analyze(const Event& e) {
      // Find the charmonia
      Particles upsilons;
      // First in unstable final state
      const UnstableParticles& ufs = apply<UnstableParticles>(e, "UFS");
      for (const Particle& p : ufs.particles())
        if (p.pid() == 300553) upsilons.push_back(p);
      // Then in whole event if fails
      if (upsilons.empty()) {
        for (ConstGenParticlePtr p : HepMCUtils::particles(e.genEvent())) {
          if (p->pdg_id() != 300553) continue;
          ConstGenVertexPtr pv = p->production_vertex();
          bool passed = true;
          if (pv) {
            for (ConstGenParticlePtr pp : HepMCUtils::particles(pv, Relatives::PARENTS)) {
              if (p->pdg_id() == pp->pdg_id()) {
                passed = false;
                break;
              }
            }
          }
          if (passed) upsilons.push_back(Particle(p));
        }
      }

      // Find upsilons
      for (const Particle& p : upsilons) {
        _weightSum->fill();
        // Find the charmonium resonances
        /// @todo Use Rivet::Particles
        vector<ConstGenParticlePtr> allJpsi, primaryJpsi, Psiprime, all_chi_c1, all_chi_c2, primary_chi_c1,
            primary_chi_c2;
        findDecayProducts(p.genParticle(), allJpsi, primaryJpsi, Psiprime, all_chi_c1, all_chi_c2,
                          primary_chi_c1, primary_chi_c2);
        const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(p.mom().betaVec());
        for (size_t i = 0; i < allJpsi.size(); i++) {
          const double pcm = cms_boost.transform(FourMomentum(allJpsi[i]->momentum())).p();
          _hist_all_Jpsi->fill(pcm);
        }
        _mult_JPsi->fill(double(allJpsi.size()));
        for (size_t i = 0; i < primaryJpsi.size(); i++) {
          const double pcm = cms_boost.transform(FourMomentum(primaryJpsi[i]->momentum())).p();
          _hist_primary_Jpsi->fill(pcm);
        }
        _mult_JPsi_direct->fill(double(primaryJpsi.size()));
        for (size_t i = 0; i < Psiprime.size(); i++) {
          const double pcm = cms_boost.transform(FourMomentum(Psiprime[i]->momentum())).p();
          _hist_Psi_prime->fill(pcm);
        }
        _mult_Psi2S->fill(double(Psiprime.size()));
        for (size_t i = 0; i < all_chi_c1.size(); i++) {
          const double pcm = cms_boost.transform(FourMomentum(all_chi_c1[i]->momentum())).p();
          _hist_chi_c1->fill(pcm);
        }
        _mult_chi_c1->fill(double(all_chi_c1.size()));
        _mult_chi_c1_direct->fill(double(primary_chi_c1.size()));
        for (size_t i = 0; i < all_chi_c2.size(); i++) {
          const double pcm = cms_boost.transform(FourMomentum(all_chi_c2[i]->momentum())).p();
          _hist_chi_c2->fill(pcm);
        }
        _mult_chi_c2->fill(double(all_chi_c2.size()));
        _mult_chi_c2_direct->fill(double(primary_chi_c2.size()));
      }
    } // analyze


    void finalize() {
      scale(_hist_all_Jpsi, 0.5 * 0.1 / *_weightSum);
      scale(_hist_chi_c1, 0.5 * 0.1 / *_weightSum);
      scale(_hist_chi_c2, 0.5 * 0.1 / *_weightSum);
      scale(_hist_Psi_prime, 0.5 * 0.1 / *_weightSum);
      scale(_hist_primary_Jpsi, 0.5 * 0.1 / *_weightSum);
      scale(_mult_JPsi, 0.5 * 100. / *_weightSum);
      scale(_mult_JPsi_direct, 0.5 * 100. / *_weightSum);
      scale(_mult_chi_c1, 0.5 * 100. / *_weightSum);
      scale(_mult_chi_c1_direct, 0.5 * 100. / *_weightSum);
      scale(_mult_chi_c2, 0.5 * 100. / *_weightSum);
      scale(_mult_chi_c2_direct, 0.5 * 100. / *_weightSum);
      scale(_mult_Psi2S, 0.5 * 100. / *_weightSum);
    } // finalize


    void init() {
      declare(UnstableParticles(), "UFS");

      book(_mult_JPsi, 1, 1, 1);
      book(_mult_JPsi_direct, 1, 1, 2);
      book(_mult_chi_c1, 1, 1, 3);
      book(_mult_chi_c1_direct, 1, 1, 4);
      book(_mult_chi_c2, 1, 1, 5);
      book(_mult_chi_c2_direct, 1, 1, 6);
      book(_mult_Psi2S, 1, 1, 7);
      book(_hist_all_Jpsi, 2, 1, 1);
      book(_hist_chi_c1, 3, 1, 1);
      book(_hist_chi_c2, 3, 1, 2);
      book(_hist_Psi_prime, 4, 1, 1);
      book(_hist_primary_Jpsi, 5, 1, 1);

      book(_weightSum, "TMP/weightSum");
    } // init

  private:

    /// @{
    // count of weights
    CounterPtr _weightSum;
    /// Histograms
    Histo1DPtr _hist_all_Jpsi;
    Histo1DPtr _hist_chi_c1;
    Histo1DPtr _hist_chi_c2;
    Histo1DPtr _hist_Psi_prime;
    Histo1DPtr _hist_primary_Jpsi;

    CounterPtr _mult_JPsi;
    CounterPtr _mult_JPsi_direct;
    CounterPtr _mult_chi_c1;
    CounterPtr _mult_chi_c1_direct;
    CounterPtr _mult_chi_c2;
    CounterPtr _mult_chi_c2_direct;
    CounterPtr _mult_Psi2S;
    /// @}

    void findDecayProducts(ConstGenParticlePtr p,
                           vector<ConstGenParticlePtr>& allJpsi,
                           vector<ConstGenParticlePtr>& primaryJpsi,
                           vector<ConstGenParticlePtr>& Psiprime,
                           vector<ConstGenParticlePtr>& all_chi_c1,
                           vector<ConstGenParticlePtr>& all_chi_c2,
                           vector<ConstGenParticlePtr>& primary_chi_c1,
                           vector<ConstGenParticlePtr>& primary_chi_c2) {
      ConstGenVertexPtr dv = p->end_vertex();
      bool isOnium = false;
      /// @todo Use better looping
      for (ConstGenParticlePtr pp : HepMCUtils::particles(dv, Relatives::PARENTS)) {
        int id = pp->pdg_id();
        id = id % 1000;
        id -= id % 10;
        id /= 10;
        if (id == 44) isOnium = true;
      }
      /// @todo Use better looping
      for (ConstGenParticlePtr pp : HepMCUtils::particles(dv, Relatives::CHILDREN)) {
        int id = pp->pdg_id();
        if (id == 100443) {
          Psiprime.push_back(pp);
        }
        else if (id == 20443) {
          all_chi_c1.push_back(pp);
          if (!isOnium) primary_chi_c1.push_back(pp);
        }
        else if (id == 445) {
          all_chi_c2.push_back(pp);
          if (!isOnium) primary_chi_c2.push_back(pp);
        }
        else if (id == 443) {
          allJpsi.push_back(pp);
          if (!isOnium) primaryJpsi.push_back(pp);
        }
        if (pp->end_vertex()) {
          findDecayProducts(pp, allJpsi, primaryJpsi, Psiprime, all_chi_c1, all_chi_c2, primary_chi_c1,
                            primary_chi_c2);
        }
      }
    }
  };


  RIVET_DECLARE_PLUGIN(BABAR_2003_I593379);

}