How to write an apparatus class for the C++ analyzer¶
14 June 2003
An apparatus is a collection of detectors that work together and should be analyzed as a group. For this reason, the standard analyzer does not analyze detectors individually, but only as part of an apparatus.
Creating a completely new apparatus¶
Writing a class for a completely new apparatus, i.e. one that does not resemble an existing one at all, like a new type of spectrometer, may vary in complexity from relatively simple to quite complicated. From a programming point of view, your new apparatus class should inherit from
THaApparatusif you want to create a generic apparatus such as a collection of beamline or target instrumentation; or
THaSpectrometerif you want to create a new spectrometer that is capable of particle tracking and, possibly, PID.
In the first case (generic apparatus), you must write a
Reconstruct() method. This can be a dummy if you only want to decode the detectors. This function is expected to do any processing that combines results from different detectors within the apparatus, for instance using tracks found by wire chambers to locate clusters in a shower counter. Since
THaApparatus::Reconstruct() is a pure virtual function, you will not be able to instantiate any objects of your class unless this method is implemented.
You can create the detector objects associated with the apparatus in the constructor or add them later via
In the second case (spectrometer), you can take advantage of the infrastructure already implemented by the
THaSpectrometer base class. In particular,
THaSpectrometer provides a fairly generic
Reconstruct() method (see Standard Algorithm). At the minimum, your spectrometer apparatus class must
- provide a
TrackCalc()is called by
THaSpectrometer::Reconstruct()to compute particle track properties such as momentum and beta right after the
FineProcess()stage of the analysis. This can be a dummy function if no such calculations are necessary;
- provide a
FindVertices()is called by
THaSpectrometer::Reconstruct()at the end of processing to reconstruct tracks to the target. Again, this can be a dummy function if no such reconstruction is necessary.
You may create the detector objects of your spectrometer in its constructor, but this is only recommended if the detector configuration is not expected to change. Spectrometers with variable detector configurations should instead be configured using
AddDetector calls from the analysis steering script.
As with generic apparatuses,
THaSpectrometer::FindVertices() are pure virtual functions, and so you will not be able to instantiate any objects of your class unless these methods are implemented.
Additionally, you can override any of the other virtual functions of
THaSpectrometer. Some obvious candidates are
Reconstruct(), e.g. to implement a different order of processing and computations;
CalcPID(), to modify the way PID is handled.
Modifying an existing apparatus¶
If you simply want to modify an existing apparatus, for example to change an algorithm or the default detector configuration, the best approach is to write a new class that inherits from the existing apparatus class.
Note that if you simply want to add a detector to an existing apparatus, you can do so using the
AddDetector() method (see adding and removing detectors).
Updated by Ole Hansen about 5 years ago · 2 revisions