Belle II Software development
ECLDigitCalibratorModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <ecl/modules/eclDigitCalibration/ECLDigitCalibratorModule.h>
11
12/* ECL headers. */
13#include <ecl/dataobjects/ECLCalDigit.h>
14#include <ecl/dataobjects/ECLDigit.h>
15#include <ecl/dataobjects/ECLDsp.h>
16#include <ecl/dataobjects/ECLPureCsIInfo.h>
17#include <ecl/dbobjects/ECLCrystalCalib.h>
18#include <ecl/digitization/EclConfiguration.h>
19#include <ecl/geometry/ECLGeometryPar.h>
20#include <ecl/utility/utilityFunctions.h>
21
22/* Basf2 headers. */
23#include <framework/core/Environment.h>
24#include <framework/gearbox/Unit.h>
25#include <framework/geometry/B2Vector3.h>
26#include <framework/logging/Logger.h>
27#include <framework/utilities/FileSystem.h>
28#include <mdst/dataobjects/EventLevelClusteringInfo.h>
29
30/* ROOT headers. */
31#include <TFile.h>
32#include <TH1F.h>
33
34/* C++ headers. */
35#include <unordered_map>
36
37using namespace std;
38using namespace Belle2;
39using namespace ECL;
40
41//-----------------------------------------------------------------
42// Register the Modules
43//-----------------------------------------------------------------
44REG_MODULE(ECLDigitCalibrator);
45REG_MODULE(ECLDigitCalibratorPureCsI);
46
47//-----------------------------------------------------------------
48// Implementation
49//-----------------------------------------------------------------
50
51// constructor
53 m_calibrationCrystalEnergy("ECLCrystalEnergy"),
54 m_calibrationCrystalElectronicsTime("ECLCrystalElectronicsTime"),
55 m_calibrationCrystalTimeOffset("ECLCrystalTimeOffset"),
56 m_calibrationCrateTimeOffset("ECLCrateTimeOffset"),
57 m_calibrationCrystalFlightTime("ECLCrystalFlightTime"),
60{
61 // Set module properties
62 setDescription("Applies digit energy, time and time-resolution calibration to each ECL digit. Counts number of out-of-time background digits to determine the event-by-event background level.");
63 addParam("backgroundEnergyCut", m_backgroundEnergyCut, "Energy cut used to count background digits", 7.0 * Belle2::Unit::MeV);
64 addParam("backgroundTimingCut", m_backgroundTimingCut, "Timing cut used to count background digits", 110.0 * Belle2::Unit::ns);
65 addParam("fileBackgroundName", m_fileBackgroundName, "Background filename.",
66 FileSystem::findFile("/data/ecl/background_norm.root"));
67 addParam("simulatePure", m_simulatePure, "Flag to simulate pure CsI option", false);
68
69 // Parallel processing certification
71
72 m_averageBG = 0;
73 m_pol2Max = 0.0;
75}
76
77// destructor
81
82// initialize calibration
100
101// callback calibration
103 std::vector<float>& constantsUnc)
104{
105 constants = cal->getCalibVector();
106 constantsUnc = cal->getCalibUncVector();
107}
108
109// initialize
111{
112 // mdst dataobjects
113 // This object is registered by few packages. Let's be agnostic about the
114 // execution order of the modules: the first package run registers the module
118
119 // Register Digits, CalDigits and their relation in datastore
120 m_eclDigits.isRequired(eclDigitArrayName());
121 m_eclCalDigits.registerInDataStore(eclCalDigitArrayName());
122 m_eclCalDigits.registerRelationTo(m_eclDigits);
123
124 // initialize calibration
126
127 // initialize time resolution (not yet from the database)
128 // read the Background correction factors (for full background)
129 m_fileBackground = new TFile(m_fileBackgroundName.c_str(), "READ");
130 if (!m_fileBackground)
131 B2FATAL("Could not find file: " << m_fileBackgroundName);
132 m_th1fBackground = dynamic_cast<TH1F*>(m_fileBackground->Get("background"));
133 if (!m_th1fBackground)
134 B2FATAL("Could not find m_th1fBackground");
135
136 // average BG value from m_th1fBackground
137 m_averageBG = m_th1fBackground->Integral() / m_th1fBackground->GetEntries();
138
139 // get maximum position ("x") of 2-order pol background for t99
140 if (fabs(c_pol2Var3) > 1e-12) {
142 } else {
143 m_pol2Max = 0.;
144 }
145
147}
148
149// begin run
151{
152 // Check if any of the calibration constants have changed
153 if (m_calibrationCrystalElectronics.hasChanged()) {
156 } else
157 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronics for current run!");
158 }
159
160 if (m_calibrationCrystalEnergy.hasChanged()) {
163 } else
164 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalEnergy for current run!");
165 }
166
167 if (m_calibrationCrystalElectronicsTime.hasChanged()) {
171 } else
172 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronicsTime for current run!");
173 }
174
175 if (m_calibrationCrystalTimeOffset.hasChanged()) {
178 } else
179 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalTimeOffset for current run!");
180 }
181
182 if (m_calibrationCrateTimeOffset.hasChanged()) {
185 } else
186 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrateTimeOffset for current run!");
187 }
188
189 if (m_calibrationCrystalFlightTime.hasChanged()) {
192 } else
193 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalFlightTime for current run!");
194 }
195}
196
197// event
199{
200
201 // Loop over the input array
202 for (auto& aECLDigit : m_eclDigits) {
203
204 bool is_pure_csi = 0;
205
206 // append an ECLCalDigit to the storearray
207 const auto aECLCalDigit = m_eclCalDigits.appendNew();
208
209 // get the cell id from the ECLDigit as identifier
210 const int cellid = aECLDigit.getCellId();
211
212 // check that the cell id is valid
213 if (cellid < 1 or cellid > c_nCrystals) {
214 B2FATAL("ECLDigitCalibrationModule::event():" << cellid << " out of range!");
215 }
216
217 // perform the digit energy calibration: E = A * Ce * Cs
218 const int amplitude = aECLDigit.getAmp();
219 double calibratedEnergy = 0;
220
221 if (m_simulatePure) {
222 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName()) != nullptr) {
223 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName())->getPureCsI())
224 is_pure_csi = 1;
225 }
226 }
227
228 if (is_pure_csi) {
229 calibratedEnergy = amplitude * m_pureCsIEnergyCalib;
230 } else {
231 calibratedEnergy = amplitude * v_calibrationCrystalElectronics[cellid - 1] * v_calibrationCrystalEnergy[cellid - 1];
232 }
233 if (calibratedEnergy < 0.0)
234 calibratedEnergy = 0.0;
235
236 // perform the digit timing calibration: t = c * (tfit - Te - Ts)
237 const int time = aECLDigit.getTimeFit();
238 const int quality = aECLDigit.getQuality();
239 double calibratedTime = c_timeForFitFailed;
240 if (quality == 1) {
241 aECLCalDigit->addStatus(ECLCalDigit::c_IsFailedFit); // this is used to flag failed fits
242 } else {
243 // only calibrate digit time if we have a good waveform fit
244 if (is_pure_csi) {
245 calibratedTime = m_pureCsITimeCalib * m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
248 } else {
249 calibratedTime = m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
251 v_calibrationCrateTimeOffset[cellid - 1]) -
253 }
254
255 // For data, apply a correction to the time as a function of the signal amplitude. Correction determined from a fit.
256 // No correction for MC
257 B2DEBUG(35, "cellid = " << cellid << ", m_isMC = " << m_isMC);
258
259 if (!m_isMC) {
260 double energyTimeShift = ECLTimeUtil->energyDependentTimeOffsetElectronic(amplitude * v_calibrationCrystalElectronics[cellid - 1]) *
262 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", corrected amplitude = " << amplitude*
263 v_calibrationCrystalElectronics[cellid - 1] << ", time before t(E) shift = " << calibratedTime << ", t(E) shift = " <<
264 energyTimeShift << " ns");
265 calibratedTime -= energyTimeShift;
266 }
267 }
268
269 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", calibrated energy = " << calibratedEnergy);
270 B2DEBUG(35, "cellid = " << cellid << ", time = " << time << ", calibratedTime = " << calibratedTime);
271
272 // Calibrating offline fit results
273 ECLDsp* aECLDsp = ECLDsp::getByCellID(cellid);
274 aECLCalDigit->setTwoComponentChi2(-1);
275 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, -1);
276 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton, -1);
277 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, -1);
278 aECLCalDigit->setTwoComponentTotalEnergy(-1);
279 aECLCalDigit->setTwoComponentHadronEnergy(-1);
280 aECLCalDigit->setTwoComponentDiodeEnergy(-1);
281 // copy online fit quality from ECLDigit
282 const int online_quality = aECLDigit.getQuality();
283 if (online_quality == 1) {
284 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality1);
285 } else if (online_quality == 2) {
286 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality2);
287 } else if (online_quality == 3) {
288 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality3);
289 } else if (online_quality == 0) {
290 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality0);
291 }
292
293 if (aECLDsp) {
294 // require ECLDigit to have offline waveform
295 if (aECLDsp->getTwoComponentChi2() > 0) {
296 // require offline waveform to have offline fit result
297
298 const double calibratedTwoComponentTotalEnergy = aECLDsp->getTwoComponentTotalAmp() * v_calibrationCrystalElectronics[cellid - 1] *
299 v_calibrationCrystalEnergy[cellid - 1];
300 const double calibratedTwoComponentHadronEnergy = aECLDsp->getTwoComponentHadronAmp() * v_calibrationCrystalElectronics[cellid -
301 1] *
302 v_calibrationCrystalEnergy[cellid - 1];
303 const double calibratedTwoComponentDiodeEnergy = aECLDsp->getTwoComponentDiodeAmp() * v_calibrationCrystalElectronics[cellid - 1] *
304 v_calibrationCrystalEnergy[cellid - 1];
305 const double twoComponentChi2 = aECLDsp->getTwoComponentChi2();
306 const ECLDsp::TwoComponentFitType twoComponentFitType = aECLDsp->getTwoComponentFitType();
307
308 aECLCalDigit->setTwoComponentTotalEnergy(calibratedTwoComponentTotalEnergy);
309 aECLCalDigit->setTwoComponentHadronEnergy(calibratedTwoComponentHadronEnergy);
310 aECLCalDigit->setTwoComponentDiodeEnergy(calibratedTwoComponentDiodeEnergy);
311 aECLCalDigit->setTwoComponentChi2(twoComponentChi2);
312 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonHadron));
313 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton,
315 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing));
316 aECLCalDigit->setTwoComponentFitType(twoComponentFitType);
317 }
318 }
319
320 // fill the ECLCalDigit with the cell id, the calibrated information and calibration status
321 aECLCalDigit->setCellId(cellid);
322
323 aECLCalDigit->setEnergy(calibratedEnergy);
324 aECLCalDigit->addStatus(ECLCalDigit::c_IsEnergyCalibrated);
325
326 aECLCalDigit->setTime(calibratedTime);
327 aECLCalDigit->addStatus(ECLCalDigit::c_IsTimeCalibrated);
328
329 // set a relation to the ECLDigit
330 aECLCalDigit->addRelationTo(&aECLDigit);
331 }
332
333 // determine background level
334 const int bgCount = determineBackgroundECL();
335
336 // set the t99 (time resolution)
337 for (auto& aECLCalDigit : m_eclCalDigits) {
338
339 // perform the time resolution calibration
340 const double t99 = getT99(aECLCalDigit.getCellId(),
341 aECLCalDigit.getEnergy(),
342 aECLCalDigit.hasStatus(ECLCalDigit::c_IsFailedFit),
343 bgCount); // calibrated time resolution
344 aECLCalDigit.setTimeResolution(t99);
345
346 if (t99 == c_timeResolutionForFitFailed) {
347 aECLCalDigit.addStatus(ECLCalDigit::c_IsFailedTimeResolution);
348 }
349
350 aECLCalDigit.addStatus(ECLCalDigit::c_IsTimeResolutionCalibrated);
351 }
352}
353
354// end run
358
359// terminate
363
364// Time resolution calibration
365double ECLDigitCalibratorModule::getT99(const int cellid, const double energy, const bool fitfailed, const int bgcount) const
366{
367
368 // if this digit is calibrated to the trigger time, we set the resolution to 'very bad' (to be discussed)
369 if (fitfailed)
371
372 // Get the background level [MeV / mus]
373 const double bglevel = TMath::Min((double)bgcount / (double)c_nominalBG * m_th1fBackground->GetBinContent(cellid) / m_averageBG,
374 m_pol2Max); // c_nominalBG = 183 for actual version of digitizer, m_averageBG is about 2 MeV/ mus
375
376 // Get p1 as function of background level
377 const double p1 = c_pol2Var1 + c_pol2Var2 * bglevel + c_pol2Var3 * bglevel * bglevel;
378
379 // inverse energy in 1/MeV
380 double einv = 0.;
381 if (energy > 1e-12)
382 einv = 1. / (energy / Belle2::Unit::MeV);
383
384 // calculate t99 using the inverse energy and p1 (p0 is zero)
385 double t99 = p1 * einv;
386
387 // for high energies we fix t99 to 3.5ns
388 if (t99 < c_minT99)
389 t99 = c_minT99;
390
391 B2DEBUG(35, "ECLDigitCalibratorModule::getCalibratedTimeResolution: dose = " << m_th1fBackground->GetBinContent(
392 cellid)
393 << ", bglevel = " << bglevel << ", cellid = " << cellid << ", t99 = " << t99 << ", energy = " << energy / Belle2::Unit::MeV);
394
395 return t99;
396}
397
398// Determine background level by event by counting out-of-time digits above threshold.
400{
401 // EventLevelClustering counters
402 using regionCounter = std::unordered_map<ECL::DetectorRegion, uint>;
403
404 regionCounter outOfTimeCount{{ECL::DetectorRegion::FWD, 0},
405 {ECL::DetectorRegion::BRL, 0},
406 {ECL::DetectorRegion::BWD, 0}};
407
409
410 // Loop over the input array
411 for (auto& aECLCalDigit : m_eclCalDigits) {
412 if (abs(aECLCalDigit.getTime()) >= m_backgroundTimingCut) {
413 if (aECLCalDigit.getEnergy() >= m_backgroundEnergyCut) {
414 // Get digit theta
415 const B2Vector3D position = geom->GetCrystalPos(aECLCalDigit.getCellId() - 1);
416 const double theta = position.Theta();
417
418 // Get detector region
419 const auto detectorRegion = ECL::getDetectorRegion(theta);
420
421 // Count out of time digits per region
422 ++outOfTimeCount.at(detectorRegion);
423 }
424 }
425 }
426
427 // Save EventLevelClusteringInfo
430 }
431
432 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeFWD(outOfTimeCount.at(ECL::DetectorRegion::FWD));
433 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBarrel(outOfTimeCount.at(ECL::DetectorRegion::BRL));
434 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBWD(outOfTimeCount.at(ECL::DetectorRegion::BWD));
435
436 B2DEBUG(35, "ECLDigitCalibratorModule::determineBackgroundECL found " << outOfTimeCount.at(ECL::DetectorRegion::FWD) << ", " <<
437 outOfTimeCount.at(ECL::DetectorRegion::BRL) << ", " << outOfTimeCount.at(ECL::DetectorRegion::BWD) <<
438 " out of time digits in FWD, BRL, BWD");
439
440 return m_eventLevelClusteringInfo->getNECLCalDigitsOutOfTime();
441}
DataType Theta() const
The polar angle.
Definition B2Vector3.h:153
Class for accessing objects in the database.
Definition DBObjPtr.h:21
double m_pureCsITimeCalib
conversion factor from eclPureCsIDigitizer to ns.
const double c_pol2Var2
2-order fit for p1.
virtual const char * eventLevelClusteringInfoName() const
Name of the EventLevelClusteringInfo.
virtual const char * eclPureCsIInfoArrayName() const
Name of the ECL pure CsI Information.
DBObjPtr< ECLCrystalCalib > m_calibrationCrateTimeOffset
single crate time calibration offset (per crystal)
double m_pureCsITimeOffset
ad-hoc offset correction for pureCsI timing/
TH1F * m_th1fBackground
Background histogram.
DBObjPtr< ECLCrystalCalib > m_calibrationCrystalElectronics
single crystal electronics calibration
const double c_minT99
The minimum t99.
virtual void initialize() override
Initialize variables.
std::vector< float > v_calibrationCrystalElectronicsUnc
single crystal electronics calibration as vector uncertainty
std::string m_fileBackgroundName
Background filename.
std::vector< float > v_calibrationCrateTimeOffsetUnc
single crate time calibration offset as vector uncertainty (per crystal)
std::vector< float > v_calibrationCrystalElectronicsTimeUnc
single crystal time calibration offset electronics as vector uncertainty
virtual void event() override
event per event.
DBObjPtr< ECLCrystalCalib > m_calibrationCrystalEnergy
single crystal energy calibration
bool m_isMC
Flag to keep track if we run on MC or not.
virtual void endRun() override
end run.
double getT99(const int cellid, const double energy, const bool fitfailed, const int bgcount) const
t99%.
virtual void terminate() override
terminate.
const double c_pol2Var1
2-order fit for p1 Var1 + Var2*bg + Var3*bg^2.
StoreArray< ECLDigit > m_eclDigits
storearray ECLDigit
const double c_timeResolutionForFitFailed
Time resolution for failed fits".
std::vector< float > v_calibrationCrystalElectronicsTime
single crystal time calibration offset electronics as vector
std::vector< float > v_calibrationCrystalFlightTime
single crystal time calibration TOF as vector
void callbackCalibration(DBObjPtr< ECLCrystalCalib > &cal, std::vector< float > &constants, std::vector< float > &constantsUnc)
reads calibration constants
std::unique_ptr< Belle2::ECL::ECLTimingUtilities > ECLTimeUtil
ECL timing tools.
void initializeCalibration()
reads calibration constants, performs checks, put them into a vector
std::vector< float > v_calibrationCrystalEnergy
single crystal energy calibration as vector
std::vector< float > v_calibrationCrystalEnergyUnc
single crystal energy calibration as vector uncertainty
virtual void beginRun() override
begin run.
const double c_pol2Var3
2-order fit for p1.
std::vector< float > v_calibrationCrateTimeOffset
single crate time calibration offset as vector (per crystal)
const double c_timeForFitFailed
Time for failed fits".
int determineBackgroundECL()
count out of time digits to determine baclground levels
double m_timeInverseSlope
Time calibration inverse slope "a".
DBObjPtr< ECLCrystalCalib > m_calibrationCrystalTimeOffset
single crystal time calibration offset
double m_backgroundTimingCut
Timing window for background level counting.
std::vector< float > v_calibrationCrystalElectronics
single crystal electronics calibration as vector
DBObjPtr< ECLCrystalCalib > m_calibrationCrystalElectronicsTime
single crystal time calibration offset electronics
double m_pureCsIEnergyCalib
conversion factor from ADC counts to GeV.
const int c_nCrystals
Number of ECL crystals.
std::vector< float > v_calibrationCrystalTimeOffset
single crystal time calibration offset as vector
virtual const char * eclDigitArrayName() const
Name of the ECLDigit.
DBObjPtr< ECLCrystalCalib > m_calibrationCrystalFlightTime
single crystal time calibration TOF
double m_averageBG
Average dose per crystal calculated from m_th1dBackground.
double m_pol2Max
Maximum of p1 2-order fit to limit values.
std::vector< float > v_calibrationCrystalFlightTimeUnc
single crystal time calibration TOF as vector uncertainty
virtual const char * eclCalDigitArrayName() const
Name of the ECLCalDigit.
double m_backgroundEnergyCut
Energy cut for background level counting.
StoreObjPtr< EventLevelClusteringInfo > m_eventLevelClusteringInfo
event level clustering info
StoreArray< ECLCalDigit > m_eclCalDigits
storearray ECLCalDigit
const int c_nominalBG
Number of out of time digits at BGx1.0.
std::vector< float > v_calibrationCrystalTimeOffsetUnc
single crystal time calibration offset as vector uncertainty
bool m_simulatePure
Flag to set pure CsI simulation option.
Class to store ECL ShaperDSP waveform ADC data.
Definition ECLDsp.h:25
double getTwoComponentHadronAmp() const
get two comp hadron amp
Definition ECLDsp.h:136
double getTwoComponentSavedChi2(TwoComponentFitType FitTypeIn) const
get two comp chi2 for a fit type see enum TwoComponentFitType in ECLDsp.h for description of fit type...
Definition ECLDsp.h:152
TwoComponentFitType
Offline two component fit type.
Definition ECLDsp.h:29
@ photonHadronBackgroundPhoton
photon + hadron template + pile-up photon fit
Definition ECLDsp.h:32
@ photonDiodeCrossing
photon + diode template fit
Definition ECLDsp.h:33
@ photonHadron
photon + hadron template fit
Definition ECLDsp.h:31
double getTwoComponentTotalAmp() const
get two comp total amp
Definition ECLDsp.h:131
double getTwoComponentChi2() const
get two comp chi2
Definition ECLDsp.h:146
TwoComponentFitType getTwoComponentFitType() const
get two comp fit type
Definition ECLDsp.h:171
static ECLDsp * getByCellID(int cid)
Find ECLDsp by Cell ID using linear search.
Definition ECLDsp.cc:14
double getTwoComponentDiodeAmp() const
get two comp diode amp
Definition ECLDsp.h:141
Class to store ECL crystal type relation to ECLDigit for the simulation pure CsI upgrade option fille...
The Class for ECL Geometry Parameters.
static ECLGeometryPar * Instance()
Static method to get a reference to the ECLGeometryPar instance.
static double getRF()
See m_rf.
bool isMC() const
Do we have generated, not real data?
static Environment & Instance()
Static method to get a reference to the Environment instance.
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
static const double MeV
[megaelectronvolt]
Definition Unit.h:114
static const double ns
Standard of [time].
Definition Unit.h:48
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
B2Vector3< double > B2Vector3D
typedef for common usage with double
Definition B2Vector3.h:516
Abstract base class for different kinds of events.
STL namespace.