Rivet analyses

Charged particle correlations in UA5 p NSD events at $\sqrt{s} = 200$, 546 and 900~GeV

Experiment: UA5 (CERN SPS)

Inspire ID: 263399

Status: VALIDATED

Authors: - Holger Schulz

References: - Z.Phys.C37:191-213,1988

Beams: p- p+

Beam energies: (100.0, 100.0); (273.0, 273.0); (450.0, 450.0)GeV

Run details: - ppbar events. Non-single diffractive events need to be switched on. The trigger implementation is the same as in UA5_1989_S1926373. Important: Only the correlation strengths with symmetric eta bins should be used for tuning.

Data on two-particle pseudorapidity and multiplicity correlations of charged particles for non single-diffractive $p\\bar{p}$ collisions at c.m. energies of 200, 546 and 900~GeV. Pseudorapidity correlations are interpreted in terms of a cluster model, which has been motivated by this and other experiments, require on average about two charged particles per cluster. The decay width of the clusters in pseudorapidity is approximately independent of multiplicity and of c.m. energy. The investigations of correlations in terms of pseudorapidity gaps confirm the picture of cluster production. The strength of forward–backward multiplicity correlations increases linearly with ins and depends strongly on position and size of the pseudorapidity gap separating the forward and backward interval. All our correlation studies can be understood in terms of a cluster model in which clusters contain on average about two charged particles, i.e. are of similar magnitude to earlier estimates from the ISR.

Source code:UA5_1988_I263399.cc

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

namespace Rivet {


  /// @brief UA5 charged particle correlations at 200, 546 and 900 GeV
  class UA5_1988_I263399 : public Analysis {
  public:

    RIVET_DEFAULT_ANALYSIS_CTOR(UA5_1988_I263399);

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

    void init() {
      // Projections
      declare(TriggerUA5(), "Trigger");

      // Symmetric eta interval
      declare(ChargedFinalState((Cuts::etaIn(-0.5, 0.5))), "CFS05");

      // Asymmetric intervals first
      // Forward eta intervals
      declare(ChargedFinalState((Cuts::etaIn(0.0, 1.0))), "CFS10F");
      declare(ChargedFinalState((Cuts::etaIn(0.5, 1.5))), "CFS15F");
      declare(ChargedFinalState((Cuts::etaIn(1.0, 2.0))), "CFS20F");
      declare(ChargedFinalState((Cuts::etaIn(1.5, 2.5))), "CFS25F");
      declare(ChargedFinalState((Cuts::etaIn(2.0, 3.0))), "CFS30F");
      declare(ChargedFinalState((Cuts::etaIn(2.5, 3.5))), "CFS35F");
      declare(ChargedFinalState((Cuts::etaIn(3.0, 4.0))), "CFS40F");

      // Backward eta intervals
      declare(ChargedFinalState((Cuts::etaIn(-1.0,  0.0))), "CFS10B");
      declare(ChargedFinalState((Cuts::etaIn(-1.5, -0.5))), "CFS15B");
      declare(ChargedFinalState((Cuts::etaIn(-2.0, -1.0))), "CFS20B");
      declare(ChargedFinalState((Cuts::etaIn(-2.5, -1.5))), "CFS25B");
      declare(ChargedFinalState((Cuts::etaIn(-3.0, -2.0))), "CFS30B");
      declare(ChargedFinalState((Cuts::etaIn(-3.5, -2.5))), "CFS35B");
      declare(ChargedFinalState((Cuts::etaIn(-4.0, -3.0))), "CFS40B");

      size_t offset = 0;
      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal));
        if (isCompatibleWithSqrtS(eVal))  _sqs = en;
        book(_h[en+"correl"], 2, 1, ++offset);
        book(_h[en+"asym"], 3, 1, offset);
        book(_c[en], "_sumW"+en);
      }
      raiseBeamErrorIf(_sqs.empty());
    }


    void analyze(const Event& event) {
      // Trigger
      const bool trigger = apply<TriggerUA5>(event, "Trigger").nsdDecision();
      if (!trigger) vetoEvent;
      _c[_sqs]->fill();

      // Count forward/backward particles
      n_10f.push_back(apply<ChargedFinalState>(event, "CFS10F").size());
      n_15f.push_back(apply<ChargedFinalState>(event, "CFS15F").size());
      n_20f.push_back(apply<ChargedFinalState>(event, "CFS20F").size());
      n_25f.push_back(apply<ChargedFinalState>(event, "CFS25F").size());
      n_30f.push_back(apply<ChargedFinalState>(event, "CFS30F").size());
      n_35f.push_back(apply<ChargedFinalState>(event, "CFS35F").size());
      n_40f.push_back(apply<ChargedFinalState>(event, "CFS40F").size());
      //
      n_10b.push_back(apply<ChargedFinalState>(event, "CFS10B").size());
      n_15b.push_back(apply<ChargedFinalState>(event, "CFS15B").size());
      n_20b.push_back(apply<ChargedFinalState>(event, "CFS20B").size());
      n_25b.push_back(apply<ChargedFinalState>(event, "CFS25B").size());
      n_30b.push_back(apply<ChargedFinalState>(event, "CFS30B").size());
      n_35b.push_back(apply<ChargedFinalState>(event, "CFS35B").size());
      n_40b.push_back(apply<ChargedFinalState>(event, "CFS40B").size());
      //
      n_05 .push_back(apply<ChargedFinalState>(event, "CFS05").size());
    }


    void finalize() {
      //
      // Using the vetor<int> from analyze is not reentrant safe!
      //

      // The correlation strength is defined in formulas
      // 4.1 and 4.2

      // Fill histos, gap width histo comes first
      //      * Set the errors as Delta b / sqrt(sumWPassed) with
      //      Delta b being the absolute uncertainty of b according to
      //      Gaussian error-propagation (linear limit) and assuming
      //      Poissonian uncertainties for the number of particles in
      //      the eta-intervals
      //

      // Fill the DPS
      pair<double,double> corr;
      for (const auto& item  : _c) {
        if (isZero(item.second->effNumEntries()))  continue;
        corr = correlation_helper(n_10f, n_10b, item.second);
        _h[item.first+"correl"]->bin(1).set(corr.first, corr.second);
        corr = correlation_helper(n_15f, n_15b, item.second);
        _h[item.first+"correl"]->bin(2).set(corr.first, corr.second);
        corr = correlation_helper(n_20f, n_20b, item.second);
        _h[item.first+"correl"]->bin(3).set(corr.first, corr.second);
        corr = correlation_helper(n_25f, n_25b, item.second);
        _h[item.first+"correl"]->bin(4).set(corr.first, corr.second);
        corr = correlation_helper(n_30f, n_30b, item.second);
        _h[item.first+"correl"]->bin(5).set(corr.first, corr.second);
        corr = correlation_helper(n_35f, n_35b, item.second);
        _h[item.first+"correl"]->bin(6).set(corr.first, corr.second);
        corr = correlation_helper(n_40f, n_40b, item.second);
        _h[item.first+"correl"]->bin(7).set(corr.first, corr.second);

        // Fill gap-center histo (Fig 15)
        //
        // The first bin contains the c_str strengths of
        // the gap size histo that has ane eta gap of two
        //
        // Fill in correlation strength for assymetric intervals,
        // see Tab. 5
        // Fill the DPS
        corr = correlation_helper(n_20f, n_20b, item.second);
        _h[item.first+"asym"]->bin(1).set(corr.first, corr.second);
        corr = correlation_helper(n_25f, n_15b, item.second);
        _h[item.first+"asym"]->bin(2).set(corr.first, corr.second);
        corr = correlation_helper(n_30f, n_10b, item.second);
        _h[item.first+"asym"]->bin(3).set(corr.first, corr.second);
        corr = correlation_helper(n_35f, n_05 , item.second);
        _h[item.first+"asym"]->bin(4).set(corr.first, corr.second);
        corr = correlation_helper(n_40f, n_10f, item.second);
        _h[item.first+"asym"]->bin(5).set(corr.first, corr.second);
      }

    }

    /// @}


  private:

    /// Helper function to fill correlation points into scatter plot
    pair<double,double> correlation_helper(const vector<int>& nf, const vector<int>& nb, CounterPtr sumWPassed) {
      if (nf.empty() || nb.empty()) {
        return make_pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
      }
      return make_pair(correlation(nf, nb),  correlation_err(nf, nb)/sqrt(sumWPassed->effNumEntries()));
    }

    /// Counter
    map<string,CounterPtr> _c;
    string _sqs = "";


    /// @name Vectors for storing the number of particles in the different eta intervals per event.
    /// @todo A better way is needed to make this re-entrant
    /// @{
    vector<int> n_10f, n_15f, n_20f, n_25f, n_30f, n_35f, n_40f;
    vector<int> n_10b, n_15b, n_20b, n_25b, n_30b, n_35b, n_40b;
    vector<int> n_05;
    /// @}


    /// @name Histograms
    /// @{
    map<string,Estimate1DPtr> _h;
    /// @}

  };


  RIVET_DECLARE_ALIASED_PLUGIN(UA5_1988_I263399, UA5_1988_S1867512);
}

Aliases: - UA5_1988_S1867512