Google Summer of Code 2021 Final Report
Modern Plotting Machinery for the Large Hadron Collider’s Monte Carlo Event Analysis Tool
Mentors: Andy Buckley, Christian Bierlich
The Rivet toolkit (Robust Independent Validation of Experiment and Theory) is a software package for performing data analysis on simulated particle collision events like those in the Large Hadron Collider (LHC). Rivet is a system for the preservation of particle-collider analysis logic, analysis reinterpretation via Monte Carlo (MC) simulations, and the validation and improvement of MC event generator codes. Rivet covers all aspects of collider physics and is the LHC’s principle tool for model testing using events simulated with MC methods, as there are over 1000 analysis routines registered on the Rivet platform.
Before my Google Summer of Code 2021 project, visualization of Rivet’s output was executed by a set of Python scripts which generated LaTeX PStricks graphics commands to draw the plots. This architecture could be slow and error-prone due to the LaTeX backend and its sensitivities to deployment platforms. My project was to design and implement a replacement for the visualization system using the Matplotlib plotting package while preserving high quality outputs. The goal of the project was to create an intuitive Python plotting package that incorporated a single coherent treatment of the existing classes within the Rivet toolkit.
Design and Implementation
An overview of the implemented plotting API is shown below, where the user supplies the input files (
data2.yoda, …) containing the histogram data (as YODA objects) to be plotted:
The plotting API is separated into four commands (which execute Python scripts):
Histogram plots from the YODA files
data2.yoda are created using the following command:
rivet-mkhtml data1.yoda data2.yoda
This will create plots in the standard Rivet style saved as jpg and pdf file types. Additionally, a web page is created to display the plots. An example of the created web page from the
rivet-mkhtml command is shown here, which plots three separate analyses.
rivet-mkhtml supports optional arguments, which include:
--outputdir: Set the directory for the web page output;
--style: Choose the plotting style;
--title: Title for web page;
--errs: Plot the histogram error bars.
rivet-mkdat command creates intermediate data files (using YAML syntax) that contains the histogram data (including the corresponding Rivet analysis) and the plot style settings. These files are then used by the
rivet-plot command for plotting the histograms. A data file example created with
rivet-mkdat is shown here.
rivet-plot command produces a Rivet-style histogram plot from the data in the intermediate data file (created with
rivet-mkdat). The initial plot is produced by calling the
yoda-plot command, which returns the created figure object, and the Rivet-style is then applied to this figure. An example Rivet-style histogram plot is shown below:
The following plot settings, specified in the data file, have been implemented in the plotting API:
- XLabel, YLabel
- XMajorTickMarks, YMajorTickMarks
- XMinorTickMarks, YMinorTickMarks
- XTwosidedTicks, YTwosidedTicks
- XCustomMajorTicks, YCustomMajorTicks
- XCustomMinorTicks, YCustomMinorTicks
- LogX, LogY
- XMin, YMin
- XMax, YMax
- LegendXPos, LegendYPos
More information about these plot settings is given in the documentation here.
As discussed in the previous section, the initial figure object from
rivet-plot is created by
yoda-plot, which produces a basic plot from the YODA file using the default Matplotlib settings. In future work, this command will be integrated with the
yoda Python package to allow users to create simple plots. An example Python snippet to create a histogram and ratio plot using the plotting API (assuming integration with the
yoda package) is shown below:
import yoda import numpy as np # Create three Histo1D objects rng = np.random.default_rng(seed=1) nevents = 10_000 hists = [yoda.Histo1D(10, -1, 5) for _ in range(3)] for hist in hists: for event in rng.normal(1.5, 1, size=(nevents, 2)): hist.fill(event, event) # Plot objects using "yoda" yoda.plot_hist(hists) yoda.plot_ratio(hists)
The above script creates the following two plots:
As well, these plotting methods support several arguments for modifying the created plots (e.g., show error bars, colors, line styles, show legend, etc.).
My commits throughout the project were made to the matplotlib-GSoC branch. I modified the previous version of the
rivet-mkhtl.py script, and created the following three Python modules:
Additionally, I wrote the Matplotlib style file
default.mplstyle for Rivet-style plots and collaborated with another student on the
The plotting API is not yet implemented into the released version of the Rivet or YODA packages, but will be included in future releases. The
rivet-mkhtml command can be further developed to support more options, such as the ability to create plots in black and white. As well, it might be necessary to include more plot settings in the
rivet-plot script to allow further configurability.
Depending on the future integration of the plotting API with the Rivet and YODA packages, it might be necessary to add further support for use with the command line (currently only
rivet-mkhtml supports calls from the command line).
Google Summer of Code 2021 has given me the wonderful opportunity to contribute to a meaningful project that will be used by researchers at CERN and around the world! I would like to thank my mentors Andy Buckley and Christian Bierlich for their guidance and unwavering support throughout the project. As well, I would like to thank my fellow GSoC student Simon Thor for his great work over the summer. This experience has really opened my eyes to open-source software and the communities that support them, and I am excited to continue contributing to open-source projects in the future!