reconstruction using art Producers

This section is intended to prepare the user on how to run the data reconstruction steps.

Calorimeter reconstruction chain

Please refer to the computing review talk for a top-level overview of the calorimeter reconstruction chain:


The pulsefitter takes CaloIslandArtRecord and produces CaloFitResultArtRecord. Islands are groups of contiguous ADC samples from the waveform digitizers, triggered by ADC samples going over a threshold that is configurable in the DAQ. Regardless of which digitizer channel triggered the island, islands are always recorded from all calorimeter channels whenever any channel goes over threshold. The baseline algorithm for pulsefitting is template fitting, described in the link at the top of this section.

responsible module: gm2calo/pulsefinder/

example configuration

islandFitter : {
  module_type: IslandTemplateFit
  fitterInstanceLabel: fitter
  unpackerModuleLabel: islandChopper
  unpackerInstanceLabel: chopper
  negativePolarity: true
  peakCutoff: 1625
  residualCutoff: 25
  artificialDeadTime: 3  
  scaleCutoff: 30
  ratioCutoff: 0.01
  wiggleRoom: 2

parameters of interest:
  • negativePolarity: Whether pulse polarity is negative. Will be true for all real pulses, and defaults to true. Could be otherwise in simulation depending on configuration, and could be false for some bench tests.
  • peakCutoff: A threshold determining when to attempt a fit. For example, if peakCutoff is 1600 and negativePolarity is true, a fit will only be attempted on islands with some sample less than 1600.
  • residualCutoff: The fitter will attempt to fit pileup pulses wherever the residuals go over this value. The points in the fit are weighted by 1, so this is in units of ADC samples.
  • artificialDeadTime: The fitter will not attempt to fit any pulses closer together then this value, in units of clock ticks.
  • scaleCutoff: Any fits with a fitted pulse area less than this value will be rejected.
  • ratioCutoff: Any pileup fits that have fit a pulse with an energy ratio to the largest pulse of less than this value will be rejected by the fitter.
  • wiggleRoom: This is a parameter used by the fitter to decide whether to reject fit results and try again. Best not to change this without a good reason.

Energy Calibration

The energy calibration takes CaloFitResultArtRecord and produces CaloCrystalHitArtRecord. The energy calibration transforms the fit result pulse areas into meaningful units, like MeV or photo electrons.

responsible module: gm2calo/energycalibration/

example configuration

energyCalibrator: {
 module_type: EnergyCalibrator
 correctorInstanceLabel: calibrator
 fitterInstanceLabel: fitter
 fitterModuleLabel: islandFitter
 readConstants: false
 calibrationConstant: 0.239620

parameters of interest:
  • readConstants: Whether to read calibration constants from a fhicl file / database, or to use a hard coded value for all crystals. The latter is typically used for simulation reconstruction runs.
  • calibrationConstant: If readConstants is false, use this value as the calibration constant.

The calibration constant for simulation reconstruction is determined using test beam calorimeter simulations, where a clean 3.1 GeV pulse is reconstructed and the constant set so that the energy peak sits at 3.1 GeV. This constant is linked to the configuration of the waveform builder, where the goal is for the full ADC range of the digitizer to equal the amplitude of a pulse from two 3.1 GeV positrons impacting simultaneously.


The clustering stage takes CaloCrystalHitArtRecord and produces CaloClusterArtRecord. The current algorithm accomplishes this by partitioning crystal hits in time, and then grouping them spatially. Ultimately, the energies of all crystal hits that are grouped together become summarized by a single energy, time, and position, which is recorded in a ClusterArtRecord. Ideally, a cluster represents a reconstructed decay positron.

responsible module: gm2calo/clustering/

See for a description of the algorithm currently in use.
See for a description of the logarithmic weighting technique currently in use for position reconstruction.

example configuration

hitCluster : {
  module_type: HitCluster
  clusterInstanceLabel: cluster
  correctorModuleLabel: gainCorrector
  correctorInstanceLabel: corrector
  ratioCutoff: 0.12
  distanceCutoff: 4
  minEnergy: 1500
  timeCutoffLow: 1.0
  timeCutoffHigh: 4.0
  w0: 4.0

parameters of interest:
  • ratioCutoff, distanceCutoff: Parameters of the spatial separation algorithm, as described in the link above.
  • minEnergy: Spatial separation is not run on groups of hits where the sum of all hit energies is below this value.
  • timeCutoffLow: All crystal hit times are sorted. If a crystal hit time is closer to the next crystal hit than the previous hit and it is greater than this value, it is grouped with the next hit rather than the last. Units of clock ticks.
  • timeCutoffHigh: Crystal hits will never be grouped with other hits that are farther apart in time than this value.
  • w0: Parameter of the logarithmic weighting position reconstruction algorithm, as described in the link above.