Rivet analyses
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 < η < −5.2 for events with a charged particle jet with |η| < 2 with respect to the energy in inclusive events, as a function of charged particle jet transverse momentum for $=$0.9, 2.76 and 7 TeV.
Source
code:CMS_2013_I1218372.cc
// -*- 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);
}