Design Overview

17 Nov 2003

The Analyzer makes extensive use of object-oriented techniques, in particular of inheritance and polymorphism. All classes that operate on physics data inherit from a common base class, THaAnalysisObject. Deriving from this base class are three main groups of classes:

  • Individual detectors belong to a Detector class hierarchy (base class THaDetectorBase).
  • Spectrometers (and similar major installations) are abstracted in an Apparatus class hierarchy (base class THaApparatus). Generally, Apparatuses are collections of detectors that are analyzed in a particular way.
  • Higher-level physics analysis, such as kinematics calculations, vertex determination, and energy loss corrections, is done in Physics Modules (base class THaPhysicsModule). (Such calculations can also be done in an analysis script, but Physics Modules offer better performance and the ability to define new global variables easily.)

All three types of objects, Apparatuses, Detectors, and Physics Modules, are kept in lists that are processed during replay. In setting up the replay, it is up to the user which objects to place in the lists.

The behavior of existing analysis modules can be modified or extended easily by using class inheritance. In such a case, the only code that needs to be written is the implementation of the new feature. For example, the standard Cherenkov detector class currently only calculates the total sum of ADC amplitudes. For a new type of Cherenkov counter, or to do a more sophisticated analysis of the standard Cherenkov detectors, one might want to calculate separate ADC sums for certain groups of PMTs. To do so, one would write a new class inheriting from the standard Cherenkov class, which could contain as little as one function, performing the additional calculations, and the corresponding data members. New types of detectors and even entire spectrometers, as well as new types of physics calculations, can be added similarly easily, again using class inheritance. No change to and no rebuilding of the core program is necessary to support such new modules.

Updated by Ole Hansen over 6 years ago · 2 revisions