Release v2.0

About one year after our first stable release in December 2019, we are proud and happy to announce that just before Christmas, on December 22nd, Corryvreckan version 2.0 was officially released. It goes along with a publication about the software, which has been submitted to JINST and is available on arXiv:

In addition, a new Zenodo entry can be used as a further official reference to the software:

The source code can be found in the repository. In addition, the new version is available as

A lot of work has been done in the past year and we have seen many great contributions from a growing community. Thank you very much to all of you. With a total of 4432 commits since version 1.0.3, many improvements, new features, as well as smaller and larger bug fixes have made it into the new release. Th most important updates and changes are:


  • New track model General Broken Lines to support kinked tracks at low momentum beams such as DESY including the correct material budget
  • New track model Multiplet consisting of two straight-line tracks (one upstream and one downstream) with a kink at the scatterer (active or passive DUT)

New Modules:

  • AnalysisSensorEdge: New analysis module to investigate the effciency drop at the sensor edge in detail
  • EventDefinitionM26: New module to make full use of the pivot pixel information of the Mimosa26 sensors for a more precise event definition
  • JSONWriter: New module to write objects to a JSON array
  • TrackingMultiplet: New tracking modules that allows to fit multiplets or GBL tracks with a kink at the DUT position
  • AnalysisMaterialBudget: New modules to analyse the material budget of a scatterer (active or passive DUT) and create a Material Budget Image (MBI) using multiplet tracks

Updated Modules:

  • EventLoaderMuPixTelescope: Now also supports data taken together with the EUDET-type telescopes and the AIDA-2020
  • EtaCalculation: Updated and fixed code, which was not tested in-depth before
  • EventLoaderEUDAQ2: catch and handle invalid data exceptions thrown by EUDAQ2


  • Improved spatial cut: now use ellipse rather than rectangle


  • Seed pixel of a cluster is now by default the pixel with the largest charge, but can be configured to be the earliest pixel
  • Correct calculation of cluster width for split clusters

Coordinate Transformation:

  • Fix inconsistency between global and local positions and in-pixel plots.
  • Fix ZYX orientation and add missing ZXZ orientation

Code Optimization:

  • Improved performance of Tracking4D by factor x2 through code optimization
  • Relative and absolute cuts can now be used more easily via a central tools/cuts.h
  • Move from Raw Pointers to Shared Pointers, which avoids checking for nullptr, avoids de-referencing, and removes memory leaks
  • Rework persistent clipboard storage to avoid copying track objects
  • New CMake macro to allow exclusion of auxiliary detector module instatiations, e.g. for MaskCreator, which only makes sense for pixel data

Other Improvements:

  • Shift of all integer histograms by -1/2 such than integer is in bin center
  • EventLoaders: End run if a second T0 (time reset) is detected
  • EUDAQ2 integration: allow selection of log level for EUDAQ2 messages

Continuous Integration:

  • Restructured testing stage of CI pipeline into categories: align, io, sim, tracking
  • New tests for telescope and DUT alignment
  • Added Codespell to CI to make code more robust and prevent commont typos


  • New section on code formatting and style guide