Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7878657
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Subscribers
None
View Options
diff --git a/doc/sphinx/analyses.rst b/doc/sphinx/analyses.rst
index 7c1eba0..3a30ca7 100644
--- a/doc/sphinx/analyses.rst
+++ b/doc/sphinx/analyses.rst
@@ -1,139 +1,145 @@
Writing custom analyses
=======================
Both reversed HEJ and HEJ FOG can generate HepMC 3 files, so you can
always run a rivet analysis on these.
If you want to write your own native analysis, the easiest way is to
create a new .cc file, for example my_analysis.cc in the
analysis-plugins/src folder.
An analysis is a class that derives from the abstract :code:`Analysis`
base class provided by reversed HEJ. It has to implement two public
functions:
* The :code:`pass_cuts` member function return true if and only if the
given event passes the analysis cuts
* The :code:`fill` member function adds an event to the analysis, which
for example can be used to fill histograms. Reversed HEJ and HEJ FOG
will only give you events for which :code:`pass_cuts` has returned
true.
Furthermore, there has to be a global make_analysis function that takes
the analysis parameters in the form of a YAML :code:`Node` and returns
a :code:`std::unique_ptr` to the Analysis.
The following code creates the simplest conceivable analysis.::
#include <memory> // for std::unique_ptr
#include "RHEJ/Analysis.hh"
class MyAnalysis: public RHEJ::Analysis {
public:
MyAnalysis(YAML::Node const & /* config */) {}
void fill(RHEJ::Event const & /* event */) override{
};
bool pass_cuts(RHEJ::Event const & /* event */) override{
return true;
};
};
extern "C"
__attribute__((visibility("default")))
std::unique_ptr<RHEJ::Analysis> make_analysis(
YAML::Node const & config
){
return std::make_unique<MyAnalysis>(config);
}
Reversed HEJ and HEJ FOG load analyses dynamically at run time. Since
the loader cannot deal with the name mangling which is usually done by
compilers, we have to specify :code:`extern "C"`.
The standard compiler settings for analyses ensure that symbols (for
example your class name) are not visible in the compiled analysis. This
ensures that there can be no name clashes with the remaining
code. However, since reversed HEJ and HEJ FOG have to be able to call
:code:`make_analysis`, we use
:code:`__attribute__((visibility("default")))` to ensure its visibility.
-To build the analysis go to some build directory and run::
+To build the analysis go to some build directory and run
+
+.. code-block:: Bash
cmake some/directory/analysis-plugins
make my_analysis
This will create the analysis library libmy_analysis.so in the src
-subdirectory. You can then use it in reversed HEJ or HEJ FOG by adding::
+subdirectory. You can then use it in reversed HEJ or HEJ FOG by adding
+
+.. code-block:: YAML
analysis:
plugin: analysis/build/directory/src/libmy_analysis.so
to the .yml configuration file.
As a more interesting example, here is the code for an analysis that
sums up the total cross section and prints the result to both standard
-output and a file specified in the .yml config with::
+output and a file specified in the .yml config with
+
+.. code-block:: YAML
analysis:
plugin: analysis/build/directory/src/libmy_analysis.so
output: outfile
To access the configuration at run time, reversed HEJ uses the yaml-cpp
library; for more details see the `yaml-cpp tutorial
<https://github.com/jbeder/yaml-cpp/wiki/Tutorial>`_. The analysis code
itself is::
#include <memory>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include "RHEJ/Analysis.hh"
#include "RHEJ/Event.hh"
#include "yaml-cpp/yaml.h"
class MyAnalysis: public RHEJ::Analysis {
public:
MyAnalysis(YAML::Node const & config):
xsection_{0.}, xsection_error_{0.},
outfile_{config["output"].as<std::string>()}
{}
void fill(RHEJ::Event const & event) override{
const double wt = event.central().weight;
xsection_ += wt;
xsection_error_ += wt*wt;
};
bool pass_cuts(RHEJ::Event const & /* event */) override{
return true;
};
~MyAnalysis(){
std::cout << "cross section: " << xsection_ << " +- "
<< std::sqrt(xsection_error_) << "\n";
std::ofstream fout{outfile_};
fout << "cross section: " << xsection_ << " +- "
<< std::sqrt(xsection_error_) << "\n";
}
private:
double xsection_, xsection_error_;
std::string outfile_;
};
extern "C"
__attribute__((visibility("default")))
std::unique_ptr<RHEJ::Analysis> make_analysis(
YAML::Node const & config
){
return std::make_unique<MyAnalysis>(config);
}
diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py
index a9291b1..4d61cda 100644
--- a/doc/sphinx/conf.py
+++ b/doc/sphinx/conf.py
@@ -1,172 +1,171 @@
# -*- coding: utf-8 -*-
#
# reversed HEJ documentation build configuration file, created by
# sphinx-quickstart on Fri Sep 15 16:13:57 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.mathjax',
'sphinx.ext.githubpages']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'reversed HEJ'
copyright = u'2017, Jeppe Andersen, Tuomas Hapola, Andreas Maier, Jennifer Smillie'
author = u'Jeppe Andersen, Tuomas Hapola, Andreas Maier, Jennifer Smillie'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'0.0.1'
# The full version, including alpha/beta/rc tags.
release = u'0.0.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+highlight_language = 'C++'
+
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
html_sidebars = {
'**': [
'about.html',
'navigation.html',
'relations.html', # needs 'show_related': True theme option to display
'searchbox.html',
'donate.html',
]
}
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'reversedHEJdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'reversedHEJ.tex', u'reversed HEJ Documentation',
u'Jeppe Andersen, Tuomas Hapola, Andreas Maier, Jennifer Smillie', 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'reversedhej', u'reversed HEJ Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'reversedHEJ', u'reversed HEJ Documentation',
author, 'reversedHEJ', 'One line description of project.',
'Miscellaneous'),
]
-
-
-
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 6:34 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805617
Default Alt Text
(10 KB)
Attached To
rHEJ HEJ
Event Timeline
Log In to Comment