Rivet analyses
Monte Carlo validation observables for interaction vertices
Experiment: ()
Status: VALIDATED
Authors: - Ynyr Harris - Christian Gutschow
References: none listed
Beams: * *
Beam energies: ANY
Run details: none listed
Vertices can be filtered by HepMC status code using the STATUS option. Signal and MPI vertices are always plotted.
Source
code:MC_VERTICES.cc
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
namespace Rivet {
/// @brief Monte Carlo validation observables for interaction vertices
class MC_VERTICES : public Analysis {
public:
RIVET_DEFAULT_ANALYSIS_CTOR(MC_VERTICES);
void init() {
_status = getOption<int>("STATUS", -1);
declare(FinalState(), "fs");
// Book histograms
book(_h1["ip_mm"], "h_impact_parameter_wide", 50, -2.0, 2.0);
book(_h1["ip_fm"], "h_impact_parameter_narrow", 50, -2.0, 2.0);
book(_h2["hs"], "h_signal_vertex_xy", 50, -2.0, 2.0, 50, -2.0, 2.0);
book(_h2["mpi"], "h_mpi_vertex_xy", 50, -2.0, 2.0, 50, -2.0, 2.0);
const vector<double> logedges = logspace(50, 1e-2, 2.0);
book(_h2["hs_log"], "h_signal_vertex_xy_log", logedges, logedges);
book(_h2["mpi_log"], "h_mpi_vertex_xy_log", logedges, logedges);
if (_status >= 0) {
const string hname("h_status_"+toString(_status)+"_vertex_xy");
book(_h2["status"], hname, 50, -2.0, 2.0, 50, -2.0, 2.0);
book(_h2["status_log"], hname+"_vertex_xy_log", logedges, logedges);
}
}
void analyze(const Event &event) {
const HepMC3::GenEvent* genEvt = event.genEvent();
for (const Particle& p : apply<FinalState>(event, "fs").particles()) {
const double signedIP = p.impactParam(true);
_h1["ip_mm"]->fill(signedIP/millimetre);
_h1["ip_fm"]->fill(signedIP/fermi);
}
// If requested, filter by status and full corresponding subset
if (_status >= 0) {
for (ConstGenVertexPtr vtx : genEvt->vertices()) {
if (_status != vtx->status()) continue;
const HepMC3::FourVector pos = vtx->position();
const double x = pos.x();
const double y = pos.y();
MSG_DEBUG("New vertex with status " << vtx->status() << " at position x = " << x << " y = " << y);
_h2["status"]->fill(x/fermi, y/fermi);
_h2["status_log"]->fill(std::abs(x)/fermi, std::abs(y)/fermi);
}
}
// Access signal-process and MPI vertices
auto spv_idx = genEvt->attribute<HepMC3::IntAttribute>("signal_process_vertex");
auto mpi_idx = genEvt->attribute<HepMC3::IntAttribute>("mpi");
if (spv_idx) {
auto spv = genEvt->vertices().at(-spv_idx->value()-1);
const HepMC3::FourVector pos = spv->position();
const double x = pos.x();
const double y = pos.y();
_h2["hs"]->fill(x/fermi, y/fermi);
_h2["hs_log"]->fill(std::abs(x)/fermi, std::abs(y)/fermi);
}
if (mpi_idx) {
auto mpi = genEvt->vertices().at(-mpi_idx->value()-1);
const HepMC3::FourVector pos = mpi->position();
const double x = pos.x();
const double y = pos.y();
_h2["mpi"]->fill(x/fermi, y/fermi);
_h2["mpi_log"]->fill(std::abs(x)/fermi, std::abs(y)/fermi);
}
}
void finalize() {
normalize(_h1);
normalize(_h2);
}
private:
map<string,Histo2DPtr> _h2;
map<string,Histo1DPtr> _h1;
int _status;
};
RIVET_DECLARE_PLUGIN(MC_VERTICES);
}