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/FinalState.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/Beam.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);
}