Rivet analyses


title: CMS_2013_I1218372

Study of the underlying event at forward rapidity in proton--proton collisions at the LHC

Experiment: CMS (LHC)

Inspire ID: 1218372

Status: VALIDATED

Authors: - Samantha Dooling

References: - JHEP 1304 (2013) 072 - 10.1007/JHEP04(2013)072 - Expt page: CMS-FWD-11-003 - arXiv: 1302.2394

Beams: p+ p+

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

Run details: - Inelastic events (non-diffractive and diffractive) at $\sqrt{s}$ = 0.9, 2.76 and 7 TeV.

Ratio of the energy deposited in the pseudorapidity range $-6.6 < \eta < -5.2$ for events with a charged particle jet with $|\eta|<2$ with respect to the energy in inclusive events, as a function of charged particle jet transverse momentum for $\sqrt{s}=$0.9, 2.76 and 7 TeV.

Source code:CMS_2013_I1218372.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/Beam.hh"

include "Rivet/Projections/ChargedFinalState.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

/// Ratio of energy in -6.6 < eta < -5.2 for events with a charged-particle jet class CMS_2013_I1218372 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2013_I1218372);


void init() {

  // gives the range of eta and min pT for the final state from which I get the jets
  FastJets jetpro(ChargedFinalState(Cuts::abseta < 2.5 && Cuts::pT >= 0.3 * GeV), JetAlg::ANTIKT, 0.5);
  declare(jetpro, "Jets");

  // skip Neutrinos and Muons
  VetoedFinalState fsv(FinalState(Cuts::etaIn(-7.0, -4.0)));
  fsv.vetoNeutrinos();
  fsv.addVetoPairId(PID::MUON);
  declare(fsv, "fsv");

  // for the hadron level selection
  VetoedFinalState sfsv;
  sfsv.vetoNeutrinos();
  sfsv.addVetoPairId(PID::MUON);
  declare(sfsv, "sfsv");

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

    //counters
    book(_c[en + "pass"], "_pass" + en);
    book(_c[en + "incl"], "_incl" + en);

    // Temporary histograms to fill the energy flow for leading jet events.
    // Ratios are calculated in finalize().
    book(_e[en + "ratio"], id, 1, 1);
    book(_h[en + "num"], "TMP/eflow_jet" + en, refData(id, 1, 1));  // Leading jet energy flow in pt
    book(_h[en + "den"], "TMP/number_jet" + en, refData(id, 1, 1)); // Number of events in pt
  }
  raiseBeamErrorIf(_sqs.empty());
}


/// Perform the per-event analysis
void analyze(const Event& event) {

  // Skip if the event is empty
  const FinalState& fsv = apply<FinalState>(event, "fsv");
  if (fsv.empty()) vetoEvent;

  // ====================== Minimum Bias selection

  const FinalState& sfsv = apply<FinalState>(event, "sfsv");
  Particles parts = sfsv.particles(cmpMomByRap);
  if (parts.empty()) vetoEvent;

  // find dymax
  double dymax = 0;
  int gap_pos = -1;
  for (size_t i = 0; i < parts.size() - 1; ++i) {
    double dy = parts[i + 1].rap() - parts[i].rap();
    if (dy > dymax) {
      dymax = dy;
      gap_pos = i;
    }
  }

  // calculate mx2 and my2
  FourMomentum xmom;
  for (int i = 0; i <= gap_pos; ++i) {
    xmom += parts[i].mom();
  }
  double mx2 = xmom.mass2();
  if (mx2 < 0) vetoEvent;

  FourMomentum ymom;
  for (size_t i = gap_pos + 1; i < parts.size(); ++i) {
    ymom += parts[i].mom();
  }
  double my2 = ymom.mass2();
  if (my2 < 0) vetoEvent;

  // calculate xix and xiy and xidd
  double xix = mx2 / sqr(sqrtS());
  double xiy = my2 / sqr(sqrtS());
  double xidd = mx2 * my2 / sqr(sqrtS() * 0.938 * GeV);

  // combine the selection: xi cuts
  bool passedHadronCuts = false;
  if (_sqs == "900"s && (xix > 0.1 || xiy > 0.4 || xidd > 0.5)) passedHadronCuts = true;
  if (_sqs == "2760"s && (xix > 0.07 || xiy > 0.2 || xidd > 0.5)) passedHadronCuts = true;
  if (_sqs == "7000"s && (xix > 0.04 || xiy > 0.1 || xidd > 0.5)) passedHadronCuts = true;
  if (!passedHadronCuts) vetoEvent;

  //  ============================== MINIMUM BIAS EVENTS

  // loop over particles to calculate the energy
  _c[_sqs + "pass"]->fill();

  for (const Particle& p : fsv.particles()) {
    if (-5.2 > p.eta() && p.eta() > -6.6) _c[_sqs + "incl"]->fill(p.E() / GeV);
  }

  //  ============================== JET EVENTS

  const FastJets& jetpro = apply<FastJets>(event, "Jets");
  const Jets& jets = jetpro.jetsByPt(Cuts::pT > 1.0 * GeV);
  if (jets.size() < 1) vetoEvent;

  if (jets[0].abseta() < 2.0) {
    _h[_sqs + "den"]->fill(jets[0].pT() / GeV);

    // energy flow
    for (const Particle& p : fsv.particles()) {
      if (p.eta() > -6.6 && p.eta() < -5.2) { // ask for the CASTOR region
        _h[_sqs + "num"]->fill(jets[0].pT() / GeV, p.E() / GeV);
      }
    }
  }

} // analysis

void finalize() {
  for (double eVal : allowedEnergies()) {
    const string en = toString(round(eVal));
    if (_c[en + "incl"]->sumW()) scale(_h[en + "num"], *_c[en + "pass"] / *_c[en + "incl"]);
    divide(_h[en + "num"], _h[en + "den"], _e[en + "ratio"]);
  }
}

private:

// counters
map<string, CounterPtr> _c;
map<string, Histo1DPtr> _h;
map<string, Estimate1DPtr> _e;

string _sqs = "";

};

RIVET_DECLARE_PLUGIN(CMS_2013_I1218372);

} ```