Page MenuHomeHEPForge

No OneTemporary

diff --git a/include/RHEJ/HepMCInterface.hh b/include/RHEJ/HepMCInterface.hh
index 6b49471..d5c1c6d 100644
--- a/include/RHEJ/HepMCInterface.hh
+++ b/include/RHEJ/HepMCInterface.hh
@@ -1,47 +1,48 @@
/** \file
* \brief Header file for the HepMCInterface
*/
#pragma once
#include <cstddef>
#include "LHEF/LHEF.h"
namespace HepMC{
class GenEvent;
class GenCrossSection;
class GenRunInfo;
}
namespace RHEJ{
class Event;
//! This class converts the Events into HepMC::GenEvents
/**
* \details The output is depended on the HepMC version rHEJ is compiled with,
* both HepMC 2 and HepMC 3 are supported. If reversed HEJ is compiled
* without HepMC calling this interface will throw an error.
*
* This interface will also keep track of the cross section of all the events that
* being fed into it.
*/
class HepMCInterface{
public:
HepMCInterface();
/**
* \brief main function to convert an event into HepMC::GenEvent
*
* \param event Event to convert
- * \param weight_index optional input to choose a specific weight
+ * \param weight_index optional selection of specific weight
+ * (negative value gives central weight)
*/
- HepMC::GenEvent operator()(Event const & event, size_t weight_index = 0);
+ HepMC::GenEvent operator()(Event const & event, ssize_t weight_index = -1);
private:
size_t event_count_;
double tot_weight_;
double tot_weight2_;
void add_weight(double wt);
HepMC::GenCrossSection cross_section() const;
};
}
diff --git a/src/HepMCInterface.cc b/src/HepMCInterface.cc
index 7160ef3..8727221 100644
--- a/src/HepMCInterface.cc
+++ b/src/HepMCInterface.cc
@@ -1,144 +1,148 @@
#include "RHEJ/HepMCInterface.hh"
#include <cassert>
#ifdef RHEJ_BUILD_WITH_HepMC_VERSION
#include "RHEJ/Event.hh"
#include "HepMC/GenEvent.h"
#include "HepMC/GenVertex.h"
#include "HepMC/GenParticle.h"
#include "HepMC/GenCrossSection.h"
#include "LHEF/LHEF.h"
namespace RHEJ{
namespace {
HepMC::FourVector to_FourVector(Particle const & sp){
return {sp.px(), sp.py(), sp.pz(), sp.E()};
}
constexpr int status_in = -1;
constexpr int status_decayed = 3;
constexpr int status_out = 1;
template<class HepMCClass, typename... Args>
auto make_ptr(Args&&... args){
#if RHEJ_BUILD_WITH_HepMC_VERSION >= 3
return HepMC::make_shared<HepMCClass>(std::forward<Args>(args)...);
#else
return new HepMCClass(std::forward<Args>(args)...);
#endif
}
} // namespace anonymous
HepMCInterface::HepMCInterface():
event_count_(0.), tot_weight_(0.), tot_weight2_(0.)
{}
void HepMCInterface::add_weight(double const wt){
++event_count_;
tot_weight_ += wt;
tot_weight2_ += wt * wt;
}
HepMC::GenCrossSection HepMCInterface::cross_section() const {
HepMC::GenCrossSection xs;
#if RHEJ_BUILD_WITH_HepMC_VERSION >= 3
xs.set_cross_section(tot_weight_, sqrt(tot_weight2_), event_count_);
/// @TODO add number of attempted events
#else // HepMC 2
xs.set_cross_section(tot_weight_, sqrt(tot_weight2_));
#endif
return xs;
}
- HepMC::GenEvent HepMCInterface::operator()(Event const & event, size_t const weight_index){
+ HepMC::GenEvent HepMCInterface::operator()(Event const & event,
+ ssize_t const weight_index){
HepMC::GenEvent out_ev{HepMC::Units::GEV, HepMC::Units::MM};
auto vx = make_ptr<HepMC::GenVertex>();
for(auto const & in: event.incoming()){
vx->add_particle_in(
make_ptr<HepMC::GenParticle>(
to_FourVector(in), static_cast<int>(in.type), status_in
)
);
}
- for(int i=0; i< (int) event.outgoing().size(); ++i){
+ for(size_t i=0; i < event.outgoing().size(); ++i){
auto const & out = event.outgoing()[i];
auto particle = make_ptr<HepMC::GenParticle>(
to_FourVector(out), static_cast<int>(out.type), status_out
);
const int status = event.decays().count(i)?status_decayed:status_out;
particle->set_status(status);
if( status == status_decayed){
auto vx_decay = make_ptr<HepMC::GenVertex>();
vx_decay->add_particle_in(particle);
for( auto const & out: event.decays().at(i)){
vx_decay->add_particle_out(
make_ptr<HepMC::GenParticle>(
to_FourVector(out), static_cast<int>(out.type), status_out
)
);
}
out_ev.add_vertex(vx_decay);
}
vx->add_particle_out(particle);
}
out_ev.add_vertex(vx);
// weights
- EventParameters central_parameters;
- if(event.variations().size() == 0){
- central_parameters = event.central();
- }
- else{
- central_parameters = event.variations(weight_index);
- }
- out_ev.weights().push_back(central_parameters.weight);
+ EventParameters event_param;
+ if(weight_index < 0)
+ event_param = event.central();
+ else if ( (size_t) weight_index < event.variations().size())
+ event_param = event.variations(weight_index);
+ else
+ throw std::invalid_argument{
+ "HepMCInterface tried to access a weight outside of the variation range."
+ };
+
+ out_ev.weights().push_back(event_param.weight);
for(auto const & var: event.variations()){
out_ev.weights().push_back(var.weight);
}
/// @TODO add name list for weights
// cross section
- add_weight(central_parameters.weight);
+ add_weight(event_param.weight);
#if RHEJ_BUILD_WITH_HepMC_VERSION >= 3
out_ev.set_cross_section(
HepMC::make_shared<HepMC::GenCrossSection>(cross_section()) );
#else // HepMC 2
out_ev.set_cross_section( cross_section() );
out_ev.set_signal_process_id(event.type()+1); // "+1": conistent with lhe
- out_ev.set_event_scale(central_parameters.mur);
+ out_ev.set_event_scale(event_param.mur);
#endif
out_ev.set_event_number(event_count_);
/// @TODO add alphaQCD (need function) and alphaQED
/// @TODO output pdf (currently not avaiable from event alone)
return out_ev;
}
}
#else // no HepMC => empty class
namespace HepMC {
class GenEvent {};
class GenCrossSection {};
}
namespace RHEJ{
HepMCInterface::HepMCInterface(){
throw std::invalid_argument(
"Failed to create HepMCInterface: "
"Reversed HEJ was built without HepMC support"
);
}
HepMC::GenEvent HepMCInterface::operator()(Event const &, size_t)
{return HepMC::GenEvent();}
void HepMCInterface::add_weight(double) {}
HepMC::GenCrossSection HepMCInterface::cross_section() const
{return HepMC::GenCrossSection();}
}
#endif
diff --git a/src/RivetAnalysis.cc b/src/RivetAnalysis.cc
index c995def..82ec78e 100644
--- a/src/RivetAnalysis.cc
+++ b/src/RivetAnalysis.cc
@@ -1,109 +1,109 @@
#include "RHEJ/RivetAnalysis.hh"
#ifdef RHEJ_BUILD_WITH_RIVET
#include <ostream>
#include "RHEJ/Event.hh"
#include "yaml-cpp/yaml.h"
#include "Rivet/AnalysisHandler.hh"
#endif
namespace RHEJ{
std::unique_ptr<Analysis> RivetAnalysis::create(YAML::Node const & config){
return std::unique_ptr<Analysis>{new RivetAnalysis{config}};
}
}
#ifdef RHEJ_BUILD_WITH_RIVET
namespace RHEJ {
RivetAnalysis::RivetAnalysis(YAML::Node const & config):
output_name_{config["output"].as<std::string>()},
first_event_(true)
{
// read in analyses
const auto & name_node = config["rivet"];
switch(name_node.Type()){
case YAML::NodeType::Scalar:
analyses_names_.push_back(name_node.as<std::string>());
break;
case YAML::NodeType::Sequence:
for(YAML::const_iterator it = name_node.begin(); it != name_node.end(); ++it){
analyses_names_.push_back(it->as<std::string>());
}
break;
default:
throw std::invalid_argument{
"No Analysis was provided to rivet. "
"Either give an analysis or deactivate rivet."
};
}
}
void RivetAnalysis::init(Event const & event){
- if(event.variations().empty()){
- rivet_runs_.push_back(
- {std::make_unique<Rivet::AnalysisHandler>(), "", HepMCInterface()}
- );
- rivet_runs_.back().handler->addAnalyses(analyses_names_);
- }
- else{
+ rivet_runs_.push_back(
+ {std::make_unique<Rivet::AnalysisHandler>(), "", HepMCInterface()}
+ );
+ rivet_runs_.back().handler->addAnalyses(analyses_names_);
+ if( !event.variations().empty() ){
const auto & central = event.central();
for(size_t i = 0; i < event.variations().size(); ++i){
const auto & vari = event.variations(i);
std::ostringstream name;
// calculate name ratio of the scales and use them for the output file name
name << ".Scale" << i << "_MuR" << vari.mur/central.mur
<< "_MuF" << vari.muf/central.muf;
+ /// @TODO replace this by proper weight name
rivet_runs_.push_back(
{std::make_unique<Rivet::AnalysisHandler>(), name.str(), HepMCInterface()}
);
rivet_runs_.back().handler->addAnalyses(analyses_names_);
}
}
}
void RivetAnalysis::fill(Event const & event, Event const &){
if(first_event_){
first_event_=false;
init(event);
}
- for(auto & run: rivet_runs_){
- run.handler->analyze(run.hepmc(event));
+ for(size_t i = 0; i < rivet_runs_.size(); ++i){
+ auto & run = rivet_runs_[i];
+ run.handler->analyze(run.hepmc(event, i-1)); // -1: first = central
}
}
void RivetAnalysis::finalise(){
for(auto const & run: rivet_runs_){
run.handler->finalize();
run.handler->writeData(output_name_+run.name+std::string(".yoda"));
}
}
} // namespace RHEJ
#else // no rivet => create empty analysis
namespace Rivet {
class AnalysisHandler {};
}
namespace RHEJ {
RivetAnalysis::RivetAnalysis(YAML::Node const &)
{
throw std::invalid_argument(
"Failed to create RivetAnalysis: "
"Reversed HEJ was built without rivet support"
);
}
void RivetAnalysis::init(Event const &){}
void RivetAnalysis::fill(Event const &, Event const &){}
void RivetAnalysis::finalise(){}
} // namespace RHEJ
#endif

File Metadata

Mime Type
text/x-diff
Expires
Mon, Jan 20, 9:15 PM (23 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4242448
Default Alt Text
(10 KB)

Event Timeline