Rivet analyses

Measurement of prompt hadron production ratios in pp collisions at $\sqrt{s} = 0.9$ and 7 TeV

Experiment: LHCb (LHC)

Inspire ID: 1119400

Status: VALIDATED

Authors: - Andrea Contu - Alex Grecu

References: - arXiv: 1206.5160

Beams: p+ p+

Beam energies: (450.0, 450.0); (3500.0, 3500.0)GeV

Run details: - Minimum bias events at $\sqrt{s} = 0.9$ and 7 TeV.

WARNING — particle map is incomplete for determination of promptness, assume unknown particles to have a life time of 0 — Measurement of the production ratios of prompt charged particles (protons, pions and kaons). Promptness is defined as originating from the primary interaction, either directly, or through the subsequent decay of a resonance.

Source code:LHCB_2012_I1119400.cc

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

namespace Rivet {


  class LHCB_2012_I1119400 : public Analysis {
  public:

    /// @name Constructors etc.
    /// @{

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(LHCB_2012_I1119400);

    /// @}

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

    /// Book histograms and initialise projections before the run
    void init() {

      fillMap(_partLftMap);

      // define ratios if second pdgid in pair is -1, it means that is a antiparticle/particle ratio
      _ratiotype["pbarp"] = make_pair(2212, -1);
      _ratiotype["kminuskplus"] = make_pair(321, -1);
      _ratiotype["piminuspiplus"] = make_pair(211, -1);
      _ratiotype["ppi"] = make_pair(2212, 211);
      _ratiotype["kpi"] = make_pair(321, 211);
      _ratiotype["pk"] = make_pair(2212, 321);

      std::map<string, int> _hepdataid;
      _hepdataid["pbarp"] = 1;
      _hepdataid["kminuskplus"] = 3;
      _hepdataid["piminuspiplus"] = 5;
      _hepdataid["ppi"] = 7;
      _hepdataid["kpi"] = 9;
      _hepdataid["pk"] = 11;

      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal));
        if (isCompatibleWithSqrtS(eVal)) _sqs = en;

        int is7TeV(en == "7000"s);
        for (const auto& it : _ratiotype) {
          book(_h_ratio_lowpt[en + it.first], _hepdataid[it.first] + is7TeV, 1, 1);
          book(_h_ratio_midpt[en + it.first], _hepdataid[it.first] + is7TeV, 1, 2);
          book(_h_ratio_highpt[en + it.first], _hepdataid[it.first] + is7TeV, 1, 3);
          const string suff = it.first + toString(is7TeV);
          book(_h_num_lowpt[en + it.first], "TMP/num_l_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 1));
          book(_h_num_midpt[en + it.first], "TMP/num_m_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 2));
          book(_h_num_highpt[en + it.first], "TMP/num_h_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 3));
          book(_h_den_lowpt[en + it.first], "TMP/den_l_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 1));
          book(_h_den_midpt[en + it.first], "TMP/den_m_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 2));
          book(_h_den_highpt[en + it.first], "TMP/den_h_" + suff,
               refData(_hepdataid[it.first] + is7TeV, 1, 3));
        }
      }
      raiseBeamErrorIf(_sqs.empty());
      declare(ChargedFinalState(Cuts::etaIn(2.5, 4.5) && Cuts::pT >= 0 * GeV), "CFS");
    }


    // Perform the per-event analysis
    void analyze(const Event& event) {
      const ChargedFinalState& cfs = apply<ChargedFinalState>(event, "CFS");

      for (const Particle& p : cfs.particles()) {
        int id = p.pid();
        // continue if particle not a proton, a kaon or a pion
        if (!((abs(id) == 211) || (abs(id) == 321) || (abs(id) == 2212))) {
          continue;
        }

        // cut in momentum
        const FourMomentum& qmom = p.momentum();
        if (qmom.p3().mod() < 5.0) continue;

        // Lifetime cut: ctau sum of all particle ancestors < 10^-9 m according to the paper (see eq. 5)
        const double MAX_CTAU = 1.0e-9; // [m]
        double ancestor_lftsum = getMotherLifeTimeSum(p);
        if ((ancestor_lftsum < 0.0) || (ancestor_lftsum > MAX_CTAU)) continue;

        double eta = qmom.eta();
        double pT = qmom.pT();

        for (const auto& it : _ratiotype) {
          // check what type of ratio is
          if ((it.second.second) == -1) {
            // check ptbin
            if (pT < 0.8) {
              // filling histos for numerator and denominator
              if (id == -abs(it.second.first)) _h_num_lowpt[_sqs + it.first]->fill(eta);
              if (id == abs(it.second.first)) _h_den_lowpt[_sqs + it.first]->fill(eta);
            }
            else if (pT < 1.2) {
              // filling histos for numerator and denominator
              if (id == -abs(it.second.first)) _h_num_midpt[_sqs + it.first]->fill(eta);
              if (id == abs(it.second.first)) _h_den_midpt[_sqs + it.first]->fill(eta);
            }
            else {
              // filling histos for numerator and denominator
              if (id == -abs(it.second.first)) _h_num_highpt[_sqs + it.first]->fill(eta);
              if (id == abs(it.second.first)) _h_den_highpt[_sqs + it.first]->fill(eta);
            }
          }
          else {
            // check what type of ratio is
            if (pT < 0.8) {
              // filling histos for numerator and denominator
              if (abs(id) == abs(it.second.first)) _h_num_lowpt[_sqs + it.first]->fill(eta);
              if (abs(id) == abs(it.second.second)) _h_den_lowpt[_sqs + it.first]->fill(eta);
            }
            else if (pT < 1.2) {
              // filling histos for numerator and denominator
              if (abs(id) == abs(it.second.first)) _h_num_midpt[_sqs + it.first]->fill(eta);
              if (abs(id) == abs(it.second.second)) _h_den_midpt[_sqs + it.first]->fill(eta);
            }
            else {
              // filling histos for numerator and denominator
              if (abs(id) == abs(it.second.first)) _h_num_highpt[_sqs + it.first]->fill(eta);
              if (abs(id) == abs(it.second.second)) _h_den_highpt[_sqs + it.first]->fill(eta);
            }
          }
        }
      }
    }


    // Generate the ratio histograms
    void finalize() {
      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal));
        for (const auto& it : _ratiotype) {
          divide(_h_num_lowpt[en + it.first], _h_den_lowpt[en + it.first], _h_ratio_lowpt[en + it.first]);
          divide(_h_num_midpt[en + it.first], _h_den_midpt[en + it.first], _h_ratio_midpt[en + it.first]);
          divide(_h_num_highpt[en + it.first], _h_den_highpt[en + it.first], _h_ratio_highpt[en + it.first]);
        }
      }
    }

    /// @}


  private:


    // Get particle lifetime from hardcoded data
    double getLifeTime(int pid) {
      pid = abs(pid);
      double lft = -1.0;
      map<int, double>::iterator pPartLft = _partLftMap.find(pid);
      // search stable particle list
      if (pPartLft == _partLftMap.end()) {
        if (pid <= 100) return 0.0;
        for (size_t i = 0; i < sizeof(_stablePDGIds) / sizeof(unsigned int); i++) {
          if (pid == _stablePDGIds[i]) {
            lft = 0.0;
            break;
          }
        }
      }
      else {
        lft = (*pPartLft).second;
      }
      if (lft < 0.0 && PID::isHadron(pid)) {
        MSG_WARNING("Lifetime map imcomplete --- " << pid << "... assume zero lifetime");
        lft = 0.0;
      }
      return lft;
    }

    // Data members like post-cuts event weight counters go here
    double getMotherLifeTimeSum(const Particle& p) {
      if (p.genParticle() == nullptr) return -1.;
      double lftSum = 0.;
      double plft = 0.;
      ConstGenParticlePtr part = p.genParticle();
      ConstGenVertexPtr ivtx = part->production_vertex();
      while (ivtx) {

        vector<ConstGenParticlePtr> part_in = HepMCUtils::particles(ivtx, Relatives::PARENTS);

        if (part_in.size() < 1) {
          lftSum = -1.;
          break;
        };
        part = part_in.at(0);
        if (!(part)) {
          lftSum = -1.;
          break;
        };
        ivtx = part->production_vertex();
        if ((part->pdg_id() == 2212) || !(ivtx)) break; // reached beam
        plft = getLifeTime(part->pdg_id());
        if (plft < 0.) {
          lftSum = -1.;
          break;
        };
        lftSum += plft;
      };
      return (lftSum * c_light);
    }

    /// @name Private variables

    // Map between PDG id and particle lifetimes in seconds
    map<int, double> _partLftMap;

    // Set of PDG Ids for stable particles (PDG Id <= 100 are considered stable)
    static const int _stablePDGIds[205];

    // Define histograms
    // ratio
    map<string, Estimate1DPtr> _h_ratio_lowpt;
    map<string, Estimate1DPtr> _h_ratio_midpt;
    map<string, Estimate1DPtr> _h_ratio_highpt;
    // numerator
    map<string, Histo1DPtr> _h_num_lowpt;
    map<string, Histo1DPtr> _h_num_midpt;
    map<string, Histo1DPtr> _h_num_highpt;
    // denominator
    map<string, Histo1DPtr> _h_den_lowpt;
    map<string, Histo1DPtr> _h_den_midpt;
    map<string, Histo1DPtr> _h_den_highpt;

    // Map of ratios and IDs of numerator and denominator
    map<string, pair<int, int>> _ratiotype;

    string _sqs = "";

    // Fill the PDG Id to Lifetime[seconds] map
    // Data was extracted from LHCb Particle Table through LHCb::ParticlePropertySvc
    bool fillMap(map<int, double>& m) {
      m[6] = 4.707703E-25;
      m[11] = 1.E+16;
      m[12] = 1.E+16;
      m[13] = 2.197019E-06;
      m[14] = 1.E+16;
      m[15] = 2.906E-13;
      m[16] = 1.E+16;
      m[22] = 1.E+16;
      m[23] = 2.637914E-25;
      m[24] = 3.075758E-25;
      m[25] = 9.4E-26;
      m[35] = 9.4E-26;
      m[36] = 9.4E-26;
      m[37] = 9.4E-26;
      m[84] = 3.335641E-13;
      m[85] = 1.290893E-12;
      m[111] = 8.4E-17;
      m[113] = 4.405704E-24;
      m[115] = 6.151516E-24;
      m[117] = 4.088275E-24;
      m[119] = 2.102914E-24;
      m[130] = 5.116E-08;
      m[150] = 1.525E-12;
      m[211] = 2.6033E-08;
      m[213] = 4.405704E-24;
      m[215] = 6.151516E-24;
      m[217] = 4.088275E-24;
      m[219] = 2.102914E-24;
      m[221] = 5.063171E-19;
      m[223] = 7.752794E-23;
      m[225] = 3.555982E-24;
      m[227] = 3.91793E-24;
      m[229] = 2.777267E-24;
      m[310] = 8.953E-11;
      m[313] = 1.308573E-23;
      m[315] = 6.038644E-24;
      m[317] = 4.139699E-24;
      m[319] = 3.324304E-24;
      m[321] = 1.238E-08;
      m[323] = 1.295693E-23;
      m[325] = 6.682357E-24;
      m[327] = 4.139699E-24;
      m[329] = 3.324304E-24;
      m[331] = 3.210791E-21;
      m[333] = 1.545099E-22;
      m[335] = 9.016605E-24;
      m[337] = 7.565657E-24;
      m[350] = 1.407125E-12;
      m[411] = 1.04E-12;
      m[413] = 6.856377E-21;
      m[415] = 1.778952E-23;
      m[421] = 4.101E-13;
      m[423] = 1.000003E-19;
      m[425] = 1.530726E-23;
      m[431] = 5.E-13;
      m[433] = 1.000003E-19;
      m[435] = 3.291061E-23;
      m[441] = 2.465214E-23;
      m[443] = 7.062363E-21;
      m[445] = 3.242425E-22;
      m[510] = 1.525E-12;
      m[511] = 1.525E-12;
      m[513] = 1.000019E-19;
      m[515] = 1.31E-23;
      m[521] = 1.638E-12;
      m[523] = 1.000019E-19;
      m[525] = 1.31E-23;
      m[530] = 1.536875E-12;
      m[531] = 1.472E-12;
      m[533] = 1.E-19;
      m[535] = 1.31E-23;
      m[541] = 4.5E-13;
      m[553] = 1.218911E-20;
      m[1112] = 4.539394E-24;
      m[1114] = 5.578069E-24;
      m[1116] = 1.994582E-24;
      m[1118] = 2.269697E-24;
      m[1212] = 4.539394E-24;
      m[1214] = 5.723584E-24;
      m[1216] = 1.994582E-24;
      m[1218] = 1.316424E-24;
      m[2112] = 8.857E+02;
      m[2114] = 5.578069E-24;
      m[2116] = 4.388081E-24;
      m[2118] = 2.269697E-24;
      m[2122] = 4.539394E-24;
      m[2124] = 5.723584E-24;
      m[2126] = 1.994582E-24;
      m[2128] = 1.316424E-24;
      m[2212] = 1.E+16;
      m[2214] = 5.578069E-24;
      m[2216] = 4.388081E-24;
      m[2218] = 2.269697E-24;
      m[2222] = 4.539394E-24;
      m[2224] = 5.578069E-24;
      m[2226] = 1.994582E-24;
      m[2228] = 2.269697E-24;
      m[3112] = 1.479E-10;
      m[3114] = 1.670589E-23;
      m[3116] = 5.485102E-24;
      m[3118] = 3.656734E-24;
      m[3122] = 2.631E-10;
      m[102134] = 4.219309E-23;
      m[3126] = 8.227653E-24;
      m[3128] = 3.291061E-24;
      m[3212] = 7.4E-20;
      m[3214] = 1.828367E-23;
      m[3216] = 5.485102E-24;
      m[3218] = 3.656734E-24;
      m[3222] = 8.018E-11;
      m[3224] = 1.838582E-23;
      m[3226] = 5.485102E-24;
      m[3228] = 3.656734E-24;
      m[3312] = 1.639E-10;
      m[3314] = 6.648608E-23;
      m[3322] = 2.9E-10;
      m[3324] = 7.233101E-23;
      m[3334] = 8.21E-11;
      m[4112] = 2.991874E-22;
      m[4114] = 4.088274E-23;
      m[4122] = 2.E-13;
      m[4132] = 1.12E-13;
      m[4212] = 3.999999E-22;
      m[4214] = 3.291061E-22;
      m[4222] = 2.951624E-22;
      m[4224] = 4.417531E-23;
      m[4232] = 4.42E-13;
      m[4332] = 6.9E-14;
      m[4412] = 3.335641E-13;
      m[4422] = 3.335641E-13;
      m[4432] = 3.335641E-13;
      m[5112] = 1.E-19;
      m[5122] = 1.38E-12;
      m[5132] = 1.42E-12;
      m[5142] = 1.290893E-12;
      m[5212] = 1.E-19;
      m[5222] = 1.E-19;
      m[5232] = 1.42E-12;
      m[5242] = 1.290893E-12;
      m[5312] = 1.E-19;
      m[5322] = 1.E-19;
      m[5332] = 1.55E-12;
      m[5342] = 1.290893E-12;
      m[5442] = 1.290893E-12;
      m[5512] = 1.290893E-12;
      m[5522] = 1.290893E-12;
      m[5532] = 1.290893E-12;
      m[5542] = 1.290893E-12;
      m[10111] = 2.48382E-24;
      m[10113] = 4.635297E-24;
      m[10115] = 2.54136E-24;
      m[10211] = 2.48382E-24;
      m[10213] = 4.635297E-24;
      m[10215] = 2.54136E-24;
      m[10223] = 1.828367E-24;
      m[10225] = 3.636531E-24;
      m[10311] = 2.437823E-24;
      m[10313] = 7.313469E-24;
      m[10315] = 3.538775E-24;
      m[10321] = 2.437823E-24;
      m[10323] = 7.313469E-24;
      m[10325] = 3.538775E-24;
      m[10331] = 4.804469E-24;
      m[10411] = 4.38E-24;
      m[10413] = 3.29E-23;
      m[10421] = 4.38E-24;
      m[10423] = 3.22653E-23;
      m[10431] = 6.5821E-22;
      m[10433] = 6.5821E-22;
      m[10441] = 6.453061E-23;
      m[10511] = 4.39E-24;
      m[10513] = 1.65E-23;
      m[10521] = 4.39E-24;
      m[10523] = 1.65E-23;
      m[10531] = 4.39E-24;
      m[10533] = 1.65E-23;
      m[11114] = 2.194041E-24;
      m[11116] = 1.828367E-24;
      m[11212] = 1.880606E-24;
      m[11216] = 1.828367E-24;
      m[12112] = 2.194041E-24;
      m[12114] = 2.194041E-24;
      m[12116] = 5.063171E-24;
      m[12126] = 1.828367E-24;
      m[12212] = 2.194041E-24;
      m[12214] = 2.194041E-24;
      m[12216] = 5.063171E-24;
      m[12224] = 2.194041E-24;
      m[12226] = 1.828367E-24;
      m[13112] = 6.582122E-24;
      m[13114] = 1.09702E-23;
      m[13116] = 5.485102E-24;
      m[13122] = 1.316424E-23;
      m[13124] = 1.09702E-23;
      m[13126] = 6.928549E-24;
      m[13212] = 6.582122E-24;
      m[13214] = 1.09702E-23;
      m[13216] = 5.485102E-24;
      m[13222] = 6.582122E-24;
      m[13224] = 1.09702E-23;
      m[13226] = 5.485102E-24;
      m[13314] = 2.742551E-23;
      m[13324] = 2.742551E-23;
      m[102142] = 1.828367E-22;
      m[20022] = 1.E+16;
      m[20113] = 1.567172E-24;
      m[20213] = 1.567172E-24;
      m[20223] = 2.708692E-23;
      m[20313] = 3.782829E-24;
      m[20315] = 2.384827E-24;
      m[20323] = 3.782829E-24;
      m[20325] = 2.384827E-24;
      m[20333] = 1.198929E-23;
      m[20413] = 2.63E-24;
      m[20423] = 2.63E-24;
      m[20433] = 6.5821E-22;
      m[20443] = 7.395643E-22;
      m[20513] = 2.63E-24;
      m[20523] = 2.63E-24;
      m[20533] = 2.63E-24;
      m[21112] = 2.632849E-24;
      m[21114] = 3.291061E-24;
      m[21212] = 2.632849E-24;
      m[21214] = 6.582122E-24;
      m[22112] = 4.388081E-24;
      m[22114] = 3.291061E-24;
      m[22122] = 2.632849E-24;
      m[22124] = 6.582122E-24;
      m[22212] = 4.388081E-24;
      m[22214] = 3.291061E-24;
      m[22222] = 2.632849E-24;
      m[22224] = 3.291061E-24;
      m[23112] = 7.313469E-24;
      m[23114] = 2.991874E-24;
      m[23122] = 4.388081E-24;
      m[23124] = 6.582122E-24;
      m[23126] = 3.291061E-24;
      m[23212] = 7.313469E-24;
      m[23214] = 2.991874E-24;
      m[23222] = 7.313469E-24;
      m[23224] = 2.991874E-24;
      m[30113] = 2.632849E-24;
      m[30213] = 2.632849E-24;
      m[30221] = 1.880606E-24;
      m[30223] = 2.089563E-24;
      m[30313] = 2.056913E-24;
      m[30323] = 2.056913E-24;
      m[30443] = 2.419898E-23;
      m[31114] = 1.880606E-24;
      m[31214] = 3.291061E-24;
      m[32112] = 3.989164E-24;
      m[32114] = 1.880606E-24;
      m[32124] = 3.291061E-24;
      m[32212] = 3.989164E-24;
      m[32214] = 1.880606E-24;
      m[32224] = 1.880606E-24;
      m[33122] = 1.880606E-23;
      m[42112] = 6.582122E-24;
      m[42212] = 6.582122E-24;
      m[43122] = 2.194041E-24;
      m[53122] = 4.388081E-24;
      m[100111] = 1.645531E-24;
      m[100113] = 1.64553E-24;
      m[100211] = 1.645531E-24;
      m[100213] = 1.64553E-24;
      m[100221] = 1.196749E-23;
      m[100223] = 3.061452E-24;
      m[100313] = 2.837122E-24;
      m[100323] = 2.837122E-24;
      m[100331] = 4.459432E-25;
      m[100333] = 4.388081E-24;
      m[100441] = 4.701516E-23;
      m[100443] = 2.076379E-21;
      m[100553] = 2.056913E-20;
      m[200553] = 3.242425E-20;
      m[300553] = 3.210791E-23;
      m[9000111] = 8.776163E-24;
      m[9000211] = 8.776163E-24;
      m[9000443] = 8.227652E-24;
      m[9000553] = 5.983747E-24;
      m[9010111] = 3.164482E-24;
      m[9010211] = 3.164482E-24;
      m[9010221] = 9.403031E-24;
      m[9010443] = 8.438618E-24;
      m[9010553] = 8.3318E-24;
      m[9020443] = 1.061633E-23;
      m[9030221] = 6.038644E-24;
      m[9042413] = 2.07634E-21;
      m[9050225] = 1.394517E-24;
      m[9060225] = 3.291061E-24;
      m[9080225] = 4.388081E-24;
      m[9090225] = 2.056913E-24;
      m[9910445] = 2.07634E-21;
      m[9920443] = 2.07634E-21;
      return true;
    }
  };


  const int LHCB_2012_I1119400::_stablePDGIds[205] = {
      311,     543,     545,     551,     555,     557,     1103,    2101,    2103,    2203,    3101,
      3103,    3201,    3203,    3303,    4101,    4103,    102144,  4201,    4203,    4301,    4303,
      4312,    4314,    4322,    4324,    4334,    4403,    4414,    4424,    4434,    4444,    5101,
      5103,    5114,    5201,    5203,    5214,    5224,    5301,    5303,    5314,    5324,    5334,
      5401,    5403,    5412,    5414,    5422,    5424,    5432,    5434,    5444,    5503,    5514,
      5524,    5534,    5544,    5554,    10022,   10333,   10335,   10443,   10541,   10543,   10551,
      10553,   10555,   11112,   12118,   12122,   12218,   12222,   13316,   13326,   20543,   20553,
      20555,   23314,   23324,   30343,   30353,   30363,   30553,   33314,   33324,   41214,   42124,
      52114,   52214,   100311,  100315,  100321,  100325,  100411,  100413,  100421,  100423,  100551,
      100555,  100557,  110551,  110553,  110555,  120553,  120555,  130553,  200551,  200555,  210551,
      210553,  220553,  1000001, 1000002, 1000003, 1000004, 1000005, 1000006, 1000011, 1000012, 1000013,
      1000014, 1000015, 1000016, 1000021, 1000022, 1000023, 1000024, 1000025, 1000035, 1000037, 1000039,
      2000001, 2000002, 2000003, 2000004, 2000005, 2000006, 2000011, 2000012, 2000013, 2000014, 2000015,
      2000016, 3000111, 3000113, 3000211, 3000213, 3000221, 3000223, 3000331, 3100021, 3100111, 3100113,
      3200111, 3200113, 3300113, 3400113, 4000001, 4000002, 4000011, 4000012, 5000039, 9000221, 9900012,
      9900014, 9900016, 9900023, 9900024, 9900041, 9900042};


  RIVET_DECLARE_PLUGIN(LHCB_2012_I1119400);

}