Rivet analyses

Bulk properties of identified hadrons in the Au Au medium from the RHIC beam-energy scan

Experiment: STAR (RHIC)

Inspire ID: 1510593

Status: UNVALIDATED

Authors: - Johannes Jahan - Gabriela Pokropska - Maria Stefaniak

References: - Phys.Rev. C96 (2017) no.4, 044904 - DOI: 10.1103/PhysRevC.96.044904 - arXiv: 1701.07065

Beams: 1000791970 1000791970

Beam energies: (758.5, 758.5); (1132.8, 1132.8); (1930.6, 1930.6); (2659.5, 2659.5); (3841.5, 3841.5)GeV

Run details: - Minimum bias AuAu events at various collision energies.

Results of measurements of bulk properties of the matter in Au+Au collisions at energies of the Beam Energy Scan program, using pions, kaons and protons identified : $\frac{dN}{dy}$ spectra, pT spectra and particles ratios are shown.

Source code:STAR_2017_I1510593.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ImpactParameterProjection.hh"
#include "Rivet/Projections/SingleValueProjection.hh"
#include "Rivet/Tools/Percentile.hh"
#include "Rivet/Analyses/RHICCommon.hh"
#include "Rivet/Projections/HepMCHeavyIon.hh"

namespace Rivet {


  /// pT distributions, ratios and production yields of hadrons in STAR
  class STAR_2017_I1510593 : public Analysis {
  public:

    RIVET_DEFAULT_ANALYSIS_CTOR(STAR_2017_I1510593);

    /// Book histograms and initialise projections before the run
    void init() {
      // Initialise and register projections
      declareCentrality(STAR_BES_Centrality(), "STAR_BES_CALIB", "CMULT", "CMULT");

      // The observed particles.
      declare(ChargedFinalState(Cuts::abseta < 0.5 && Cuts::absrap < 0.1 && Cuts::pT > 0.2), "CFS");

      // Access the HepMC heavy ion info
      declare(HepMCHeavyIon(), "HepMC");


      /// Booking npart histograms
      size_t ih = 0;
      for (double eval : allowedEnergies()) {
        double enuc = eval / 197.;
        const string en = toString(round(enuc));
        if (isCompatibleWithSqrtS(eval)) {
          _sqs = en;
          _sqsEdge = enuc;
          // Energy bins for Fig. 25
          if (ih==0) _sqs25 = "0";
          else if (ih==4) _sqs25 = "1";
        }

        for (size_t ic=0; ic < centAxis.numBins()+1; ++ic) {
          const string cent = toString(round(centAxis.max(ic)));
          dualbook(en+"dpT_Pi"+cent,         2+ih*6, 1, ic+1);
          dualbook(en+"dpT_Piplus"+cent,     3+ih*6, 1, ic+1);
          dualbook(en+"dpT_Kaon"+cent,       4+ih*6, 1, ic+1);
          dualbook(en+"dpT_Kaonplus"+cent,   5+ih*6, 1, ic+1);
          dualbook(en+"dpT_AntiProton"+cent, 6+ih*6, 1, ic+1);
          dualbook(en+"dpT_Proton"+cent,     7+ih*6, 1, ic+1);
        }

        tribook(en+"npart_PiMinus",    32+ih, 1, 1);
        tribook(en+"npart_PiPlus",     32+ih, 1, 2);
        tribook(en+"npart_KaMinus",    32+ih, 1, 3);
        tribook(en+"npart_KaPlus",     32+ih, 1, 4);
        tribook(en+"npart_AntiProton", 32+ih, 1, 5);
        tribook(en+"npart_Proton",     32+ih, 1, 6);

        book(_p[en+"npart_Piratio"],  42+ih, 1, 1);
        book(_p[en+"npart_Karatio"],  42+ih, 1, 2);
        book(_p[en+"npart_Pratio"],   42+ih, 1, 3);
        book(_p[en+"npart_KaPi"],     47+ih, 1, 1);
        book(_p[en+"npart_AntiPPi"],  47+ih, 1, 2);
        book(_p[en+"npart_KaPiplus"], 47+ih, 1, 3);
        book(_p[en+"npart_PPiplus"],  47+ih, 1, 4);

        ++ih;
      }
      raiseBeamErrorIf(_sqs.empty());

      book(_h["npart_PiMinus"],    52, 1, 1);
      book(_h["npart_PiPlus"],     52, 1, 2);
      book(_h["npart_KaMinus"],    52, 1, 3);
      book(_h["npart_KaPlus"],     52, 1, 4);
      book(_h["npart_AntiProton"], 52, 1, 5);
      book(_h["npart_Proton"],     52, 1, 6);

      book(_p["mt_PiPlus"],     53, 1, 1);
      book(_p["mt_PiMinus"],    53, 1, 2);
      book(_p["mt_KaPlus"],     53, 1, 3);
      book(_p["mt_KaMinus"],    53, 1, 4);
      book(_p["mt_Proton"],     53, 1, 5);
      book(_p["mt_AntiProton"], 53, 1, 6);

      book(_p["Piratio"],   54, 1, 1);
      book(_p["Karatio"],   54, 1, 2);
      book(_p["Pratio"],    54, 1, 3);
      book(_p["KaPiplus"],  55, 1, 1);
      book(_p["KaPiminus"], 55, 1, 2);

      book(_p["yields0"], 56, 1, 1);
      book(_p["yields1"], 56, 1, 2);
      book(_p["ratios0"], 57, 1, 1);
      book(_p["ratios1"], 57, 1, 2);
    }

    void dualbook(const string& tag, unsigned int d, unsigned int x, unsigned int y) {
      book(_c[tag], "TMP/"+mkAxisCode(d, x, y));
      book(_h[tag], d, x, y);
    }

    void tribook(const string& tag, unsigned int d, unsigned int x, unsigned int y) {
      book(_c[tag], "TMP/"+mkAxisCode(d, x, y));
      book(_h[tag], d, x, y);
      book(_p[tag], d+5, x, y);
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const ChargedFinalState& cfs = apply<ChargedFinalState>(event, "CFS");
      // Require at least two charged particles for the analysis to
      // make sense. No further triggers are described in the paper.
      const Particles& particles = cfs.particles();
      if (particles.size() < 2) return;

      /// Determine the centrality
      const CentralityProjection& cent = apply<CentralityProjection>(event, "CMULT");

      /// Determine the centrality bin
      const double c = int(centAxis.index(cent()));
      const string centbin = toString(round(centAxis.max(c)));

      /// Determine the impact parameter
      const HepMCHeavyIon & hi = apply<HepMCHeavyIon>(event, "HepMC");
      const double Npart = hi.Npart_targ();

      // The following vector contains the counters for all particles used in
      // Fig. 25. In the right order : pi+, pi-, K+, K-, p, Antip, Lambda,
      // AntiLambda, Xi, AntiXi
      map<int,double> nparts, nparts25;

      /// Loop over all charged particles of the CFS
      for (const Particle& p : cfs.particles()) {
        double pT = p.pT()/GeV;
        double mass = p.mass()/GeV;
        double mTm = sqrt(pT * pT + mass * mass) - mass;
        if (p.absrap() < 0.1) {
          const PdgId id = p.pid();
          switch (id) {
            case 211:
              if (c < 80) {
                _h[_sqs+"dpT_Piplus"+centbin]->fill(pT, 1. / pT);
                _h[_sqs+"npart_PiPlus"]->fill(Npart, 1. / (0.2 * 0.5 * Npart));
                _p[_sqs+"npart_PiPlus"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::PIPLUS];
                _h["npart_PiPlus"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_PiPlus"]->fill(_sqsEdge, mTm);
              }
              ++nparts[PID::PIPLUS];
              break;
            case -211:
              if (c < 80) {
                _h[_sqs+"dpT_Pi"+centbin]->fill(pT, 1.0 / pT);
                _h[_sqs+"npart_PiMinus"]->fill(Npart, 1.0 / (0.2 * 0.5 * Npart));
                _p[_sqs+"npart_PiMinus"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::PIMINUS];
                _h["npart_PiMinus"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_PiMinus"]->fill(_sqsEdge, mTm);
              }
              ++nparts[PID::PIMINUS];
              break;
            case 321:
              if (c < 80) {
                _h[_sqs+"dpT_Kaonplus"+centbin]->fill(pT, 1.0 / pT);
                _h[_sqs+"npart_KaPlus"]->fill(Npart, 1.0 /(0.2 * 0.5 * Npart));
                _p[_sqs+"npart_KaPlus"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::KPLUS];
                _h["npart_KaPlus"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_KaPlus"]->fill(_sqsEdge, mTm);
              }
              ++nparts[PID::KPLUS];
              break;
            case -321:
              if (c < 80) {
                _h[_sqs+"dpT_Kaon"+centbin]->fill(pT, 1.0 / pT);
                _h[_sqs+"npart_KaMinus"]->fill(Npart, 1.0 / (0.2 * 0.5 * Npart));
                _p[_sqs+"npart_KaMinus"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::KMINUS];
                _h["npart_KaMinus"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_KaMinus"]->fill(_sqsEdge, mTm);
              }
              ++nparts[PID::KMINUS];
              break;
            case 2212:
              if (c < 80) {
                _h[_sqs+"dpT_Proton"+centbin]->fill(pT, 1.0 / pT);
                _h[_sqs+"npart_Proton"]->fill(Npart, 1.0 /(0.2 * 0.5 * Npart));
                _p[_sqs+"npart_Proton"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::PROTON];
                _h["npart_Proton"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_Proton"]->fill(_sqsEdge, mTm);
              }
              ++nparts25[PID::PROTON];
              break;
            case -2212:
              if (c < 80) {
                _h[_sqs+"dpT_AntiProton"+centbin]->fill(pT, 1.0 / pT);
                _h[_sqs+"npart_AntiProton"]->fill(Npart, 1.0 / (0.2 * 0.5 * Npart));
                _p[_sqs+"npart_AntiProton"]->fill(Npart, pT, 5);
              }
              if (c < 5) {
                ++nparts25[PID::ANTIPROTON];
                _h["npart_AntiProton"]->fill(_sqsEdge, 1.0 / (0.2 * 0.5 * Npart));
                _p["mt_AntiProton"]->fill(_sqsEdge, mTm);
              }
              ++nparts[PID::ANTIPROTON];
              break;
            case 3122:
              if (c < 5) ++nparts25[PID::LAMBDA];
              break;
            case -3122:
              if (c < 5) ++nparts25[-PID::LAMBDA];
              break;
            case 3312:
              if (c < 5) ++nparts25[PID::XIPLUS];
              break;
            case -3312:
              if (c < 5) ++nparts25[PID::XIMINUS];
              break;
          }
        }
      }

      /// Particle Ratios
      if (!isZero(nparts[PID::PIPLUS])) {
        _p[_sqs+"npart_Piratio"]->fill(Npart, nparts[PID::PIMINUS] / nparts[PID::PIPLUS], 5);
        _p[_sqs+"npart_KaPiplus"]->fill(Npart, nparts[PID::KPLUS] / nparts[PID::PIPLUS], 5);
        _p[_sqs+"npart_PPiplus"]->fill(Npart, nparts[PID::PROTON] / nparts[PID::PIPLUS], 5);
      }

      if (!isZero(nparts[PID::PIMINUS])) {
        _p[_sqs+"npart_KaPi"]->fill(Npart, nparts[PID::KMINUS] / nparts[PID::PIMINUS], 5);
        _p[_sqs+"npart_AntiPPi"]->fill(Npart, nparts[PID::ANTIPROTON] / nparts[PID::PIMINUS], 5);
      }

      if (!isZero(nparts[PID::KPLUS])) {
        _p[_sqs+"npart_Karatio"]->fill(Npart, nparts[PID::KMINUS] / nparts[PID::KPLUS], 5);
      }

      if (!isZero(nparts[PID::PROTON])) {
        _p[_sqs+"npart_Pratio"]->fill(Npart, nparts[PID::ANTIPROTON] / nparts[PID::PROTON], 5);
      }

      /// Particle Yields
      if (!_sqs25.empty()) {
        if (!isZero(nparts25[PID::PIPLUS])) {
          _p["yields"+_sqs25]->fill(1., nparts25[PID::PIMINUS], 5);
          _p["ratios"+_sqs25]->fill(1., nparts25[PID::PIMINUS] / nparts25[PID::PIPLUS], 5);
        }
        if (!isZero(nparts25[PID::KPLUS])) {
          _p["yields"+_sqs25]->fill(3., nparts25[PID::KPLUS], 5);
          _p["ratios"+_sqs25]->fill(2., nparts25[PID::KMINUS] / nparts25[PID::KPLUS], 5);
        }
        if (!isZero(nparts25[PID::KMINUS])) {
          _p["yields"+_sqs25]->fill(4., nparts25[PID::KMINUS], 5);
        }
        if (!isZero(nparts25[PID::PROTON])) {
          _p["yields"+_sqs25]->fill(5., nparts25[PID::PROTON], 5);
          _p["ratios"+_sqs25]->fill(3., nparts25[PID::ANTIPROTON] / nparts25[PID::PROTON], 5);
        }
        if (!isZero(nparts25[PID::ANTIPROTON])) {
          _p["yields"+_sqs25]->fill(6., nparts25[PID::ANTIPROTON], 5);
        }
        if (!isZero(nparts25[PID::LAMBDA])) {
          _p["yields"+_sqs25]->fill(7., nparts25[PID::LAMBDA], 5);
          _p["ratios"+_sqs25]->fill(4., nparts25[-PID::LAMBDA] / nparts25[PID::LAMBDA], 5);
        }
        if (!isZero(nparts25[-PID::LAMBDA])) {
          _p["yields"+_sqs25]->fill(8., nparts25[-PID::LAMBDA], 5);
        }
        if (!isZero(PID::XIPLUS)) {
          _p["yields"+_sqs25]->fill(9., nparts25[PID::XIPLUS], 5);
          _p["ratios"+_sqs25]->fill(5., nparts25[PID::XIMINUS] / nparts25[PID::XIPLUS], 5);
        }
        if (!isZero(PID::XIMINUS)) {
          _p["yields"+_sqs25]->fill(10., nparts25[PID::XIMINUS], 5);
        }
        if (!isZero(nparts25[PID::PIMINUS])) {
          _p["yields"+_sqs25]->fill(2., nparts25[PID::KMINUS], 5);
          _p["ratios"+_sqs25]->fill(6., nparts25[PID::KMINUS] / nparts25[PID::PIMINUS], 5);
          _p["yields"+_sqs25]->fill(7., nparts25[PID::ANTIPROTON], 5);
          _p["ratios"+_sqs25]->fill(7., nparts25[PID::ANTIPROTON] / nparts25[PID::PIMINUS], 5);
          _p["ratios"+_sqs25]->fill(8., nparts25[PID::LAMBDA] / nparts25[PID::PIMINUS], 5);
          _p["ratios"+_sqs25]->fill(9., nparts25[PID::XIMINUS] / nparts25[PID::PIMINUS], 5);
        }
      }

      if (!isZero(nparts[PID::PIPLUS])) {
        _p["Piratio"]->fill(_sqsEdge, nparts[PID::PIMINUS] / nparts[PID::PIPLUS], 5);
        _p["KaPiplus"]->fill(_sqsEdge, nparts[PID::KPLUS] / nparts[PID::PIPLUS], 5);
      }

      if (!isZero(nparts[PID::PIMINUS])) {
        _p["KaPiminus"]->fill(_sqsEdge,nparts[PID::KMINUS] / nparts[PID::PIMINUS], 5);
      }
      if (!isZero(nparts[PID::KPLUS])) {
        _p["Karatio"]->fill(_sqsEdge,nparts[PID::KMINUS] / nparts[PID::KPLUS], 5);
      }
      if (!isZero(nparts[PID::PROTON])) {
        _p["Pratio"]->fill(_sqsEdge,nparts[PID::ANTIPROTON] / nparts[PID::PROTON], 5);
      }

      /// Sum the weight of the event
      if (c < 80) {
        _c[_sqs+"dpT_Pi"+centbin]->fill();
        _c[_sqs+"dpT_Piplus"+centbin]->fill();
        _c[_sqs+"dpT_Kaon"+centbin]->fill();
        _c[_sqs+"dpT_Kaonplus"+centbin]->fill();
        _c[_sqs+"dpT_Proton"+centbin]->fill();
        _c[_sqs+"dpT_AntiProton"+centbin]->fill();
        _c[_sqs+"npart_PiPlus"]->fill();
        _c[_sqs+"npart_PiMinus"]->fill();
        _c[_sqs+"npart_KaPlus"]->fill();
        _c[_sqs+"npart_KaMinus"]->fill();
        _c[_sqs+"npart_Proton"]->fill();
        _c[_sqs+"npart_AntiProton"]->fill();
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      /// Normalisation
      for (const auto& item : _c) {
        if (!item.second->sumW())  continue;
        scale(_h[item.first], 1.0/(TWOPI*0.2*item.second->sumW()));
      }
    }


  private:

    /// @name Histograms
    /// @{
    map<string,Profile1DPtr> _p;
    map<string,Histo1DPtr> _h;
    map<string,CounterPtr> _c;
    /// @}

    /// @name Variables
    /// @{
    string _sqs = "", _sqs25 = "";
    double _sqsEdge;
    /// @}

    /// @name Bin edges
    /// @{
    YODA::Axis<double> centAxis{5., 10., 20., 30., 40., 50., 60., 70., 80.};
    /// @}

  };


  RIVET_DECLARE_PLUGIN(STAR_2017_I1510593);
}