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
52ECLDigitCalibratorModule::ECLDigitCalibratorModule() : m_calibrationCrystalElectronics("ECLCrystalElectronics"),
53 m_calibrationCrystalEnergy("ECLCrystalEnergy"),
54 m_calibrationCrystalElectronicsTime("ECLCrystalElectronicsTime"),
55 m_calibrationCrystalTimeOffset("ECLCrystalTimeOffset"),
56 m_calibrationCrateTimeOffset("ECLCrateTimeOffset"),
57 m_calibrationCrystalFlightTime("ECLCrystalFlightTime"),
58 m_eclDigits(eclDigitArrayName()),
59 m_eclCalDigits(eclCalDigitArrayName())
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
79{
80}
81
82// initialize calibration
84{
85
86 // 1/(4fRF) = 0.4913 ns/clock tick, where fRF is the accelerator RF frequency. Same for all crystals:
87 m_timeInverseSlope = 1.0 / (4.0 * EclConfiguration::getRF()) * 1e3;
88 m_pureCsIEnergyCalib = 0.00005; // conversion factor from ADC counts to GeV
89 m_pureCsITimeCalib = 0.1; // conversion factor from eclPureCsIDigitizer to ns
90 m_pureCsITimeOffset = 0.31; // ad-hoc offset correction for pureCsI timing
91
99}
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}
146
147// begin run
149{
150 // Check if any of the calibration constants have changed
151 if (m_calibrationCrystalElectronics.hasChanged()) {
154 } else
155 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronics for current run!");
156 }
157
158 if (m_calibrationCrystalEnergy.hasChanged()) {
161 } else
162 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalEnergy for current run!");
163 }
164
165 if (m_calibrationCrystalElectronicsTime.hasChanged()) {
169 } else
170 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronicsTime for current run!");
171 }
172
173 if (m_calibrationCrystalTimeOffset.hasChanged()) {
176 } else
177 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalTimeOffset for current run!");
178 }
179
180 if (m_calibrationCrateTimeOffset.hasChanged()) {
183 } else
184 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrateTimeOffset for current run!");
185 }
186
187 if (m_calibrationCrystalFlightTime.hasChanged()) {
190 } else
191 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalFlightTime for current run!");
192 }
193}
194
195// event
197{
198
199 // Loop over the input array
200 for (auto& aECLDigit : m_eclDigits) {
201
202 bool is_pure_csi = 0;
203
204 // append an ECLCalDigit to the storearray
205 const auto aECLCalDigit = m_eclCalDigits.appendNew();
206
207 // get the cell id from the ECLDigit as identifier
208 const int cellid = aECLDigit.getCellId();
209
210 // check that the cell id is valid
211 if (cellid < 1 or cellid > c_nCrystals) {
212 B2FATAL("ECLDigitCalibrationModule::event():" << cellid << " out of range!");
213 }
214
215 // perform the digit energy calibration: E = A * Ce * Cs
216 const int amplitude = aECLDigit.getAmp();
217 double calibratedEnergy = 0;
218
219 if (m_simulatePure) {
220 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName()) != nullptr) {
221 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName())->getPureCsI())
222 is_pure_csi = 1;
223 }
224 }
225
226 if (is_pure_csi) {
227 calibratedEnergy = amplitude * m_pureCsIEnergyCalib;
228 } else {
229 calibratedEnergy = amplitude * v_calibrationCrystalElectronics[cellid - 1] * v_calibrationCrystalEnergy[cellid - 1];
230 }
231 if (calibratedEnergy < 0.0)
232 calibratedEnergy = 0.0;
233
234 // perform the digit timing calibration: t = c * (tfit - Te - Ts)
235 const int time = aECLDigit.getTimeFit();
236 const int quality = aECLDigit.getQuality();
237 double calibratedTime = c_timeForFitFailed;
238 if (quality == 1) {
239 aECLCalDigit->addStatus(ECLCalDigit::c_IsFailedFit); // this is used to flag failed fits
240 } else {
241 // only calibrate digit time if we have a good waveform fit
242 if (is_pure_csi) {
243 calibratedTime = m_pureCsITimeCalib * m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
246 } else {
247 calibratedTime = m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
249 v_calibrationCrateTimeOffset[cellid - 1]) -
251 }
252
253 // For data, apply a correction to the time as a function of the signal amplitude. Correction determined from a fit.
254 // No correction for MC
255 bool m_IsMCFlag = Environment::Instance().isMC();
256 B2DEBUG(35, "cellid = " << cellid << ", m_IsMCFlag = " << m_IsMCFlag);
257
258 if (!m_IsMCFlag) {
259 double energyTimeShift = ECLTimeUtil->energyDependentTimeOffsetElectronic(amplitude * v_calibrationCrystalElectronics[cellid - 1]) *
261 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", corrected amplitude = " << amplitude*
262 v_calibrationCrystalElectronics[cellid - 1] << ", time before t(E) shift = " << calibratedTime << ", t(E) shift = " <<
263 energyTimeShift << " ns");
264 calibratedTime -= energyTimeShift;
265 }
266 }
267
268 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", calibrated energy = " << calibratedEnergy);
269 B2DEBUG(35, "cellid = " << cellid << ", time = " << time << ", calibratedTime = " << calibratedTime);
270
271 // Calibrating offline fit results
272 ECLDsp* aECLDsp = ECLDsp::getByCellID(cellid);
273 aECLCalDigit->setTwoComponentChi2(-1);
274 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, -1);
275 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton, -1);
276 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, -1);
277 aECLCalDigit->setTwoComponentTotalEnergy(-1);
278 aECLCalDigit->setTwoComponentHadronEnergy(-1);
279 aECLCalDigit->setTwoComponentDiodeEnergy(-1);
280 // copy online fit quality from ECLDigit
281 const int online_quality = aECLDigit.getQuality();
282 if (online_quality == 1) {
283 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality1);
284 } else if (online_quality == 2) {
285 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality2);
286 } else if (online_quality == 3) {
287 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality3);
288 } else if (online_quality == 0) {
289 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality0);
290 }
291
292 if (aECLDsp) {
293 // require ECLDigit to have offline waveform
294 if (aECLDsp->getTwoComponentChi2() > 0) {
295 // require offline waveform to have offline fit result
296
297 const double calibratedTwoComponentTotalEnergy = aECLDsp->getTwoComponentTotalAmp() * v_calibrationCrystalElectronics[cellid - 1] *
298 v_calibrationCrystalEnergy[cellid - 1];
299 const double calibratedTwoComponentHadronEnergy = aECLDsp->getTwoComponentHadronAmp() * v_calibrationCrystalElectronics[cellid -
300 1] *
301 v_calibrationCrystalEnergy[cellid - 1];
302 const double calibratedTwoComponentDiodeEnergy = aECLDsp->getTwoComponentDiodeAmp() * v_calibrationCrystalElectronics[cellid - 1] *
303 v_calibrationCrystalEnergy[cellid - 1];
304 const double twoComponentChi2 = aECLDsp->getTwoComponentChi2();
305 const ECLDsp::TwoComponentFitType twoComponentFitType = aECLDsp->getTwoComponentFitType();
306
307 aECLCalDigit->setTwoComponentTotalEnergy(calibratedTwoComponentTotalEnergy);
308 aECLCalDigit->setTwoComponentHadronEnergy(calibratedTwoComponentHadronEnergy);
309 aECLCalDigit->setTwoComponentDiodeEnergy(calibratedTwoComponentDiodeEnergy);
310 aECLCalDigit->setTwoComponentChi2(twoComponentChi2);
311 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonHadron));
312 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton,
314 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing));
315 aECLCalDigit->setTwoComponentFitType(twoComponentFitType);
316 }
317 }
318
319 // fill the ECLCalDigit with the cell id, the calibrated information and calibration status
320 aECLCalDigit->setCellId(cellid);
321
322 aECLCalDigit->setEnergy(calibratedEnergy);
323 aECLCalDigit->addStatus(ECLCalDigit::c_IsEnergyCalibrated);
324
325 aECLCalDigit->setTime(calibratedTime);
326 aECLCalDigit->addStatus(ECLCalDigit::c_IsTimeCalibrated);
327
328 // set a relation to the ECLDigit
329 aECLCalDigit->addRelationTo(&aECLDigit);
330 }
331
332 // determine background level
333 const int bgCount = determineBackgroundECL();
334
335 // set the t99 (time resolution)
336 for (auto& aECLCalDigit : m_eclCalDigits) {
337
338 // perform the time resolution calibration
339 const double t99 = getT99(aECLCalDigit.getCellId(),
340 aECLCalDigit.getEnergy(),
341 aECLCalDigit.hasStatus(ECLCalDigit::c_IsFailedFit),
342 bgCount); // calibrated time resolution
343 aECLCalDigit.setTimeResolution(t99);
344
345 if (t99 == c_timeResolutionForFitFailed) {
346 aECLCalDigit.addStatus(ECLCalDigit::c_IsFailedTimeResolution);
347 }
348
349 aECLCalDigit.addStatus(ECLCalDigit::c_IsTimeResolutionCalibrated);
350 }
351}
352
353// end run
355{
356}
357
358// terminate
360{
361}
362
363// Time resolution calibration
364double ECLDigitCalibratorModule::getT99(const int cellid, const double energy, const bool fitfailed, const int bgcount) const
365{
366
367 // if this digit is calibrated to the trigger time, we set the resolution to 'very bad' (to be discussed)
368 if (fitfailed)
370
371 // Get the background level [MeV / mus]
372 const double bglevel = TMath::Min((double)bgcount / (double)c_nominalBG * m_th1fBackground->GetBinContent(cellid) / m_averageBG,
373 m_pol2Max); // c_nominalBG = 183 for actual version of digitizer, m_averageBG is about 2 MeV/ mus
374
375 // Get p1 as function of background level
376 const double p1 = c_pol2Var1 + c_pol2Var2 * bglevel + c_pol2Var3 * bglevel * bglevel;
377
378 // inverse energy in 1/MeV
379 double einv = 0.;
380 if (energy > 1e-12)
381 einv = 1. / (energy / Belle2::Unit::MeV);
382
383 // calculate t99 using the inverse energy and p1 (p0 is zero)
384 double t99 = p1 * einv;
385
386 // for high energies we fix t99 to 3.5ns
387 if (t99 < c_minT99)
388 t99 = c_minT99;
389
390 B2DEBUG(35, "ECLDigitCalibratorModule::getCalibratedTimeResolution: dose = " << m_th1fBackground->GetBinContent(
391 cellid)
392 << ", bglevel = " << bglevel << ", cellid = " << cellid << ", t99 = " << t99 << ", energy = " << energy / Belle2::Unit::MeV);
393
394 return t99;
395}
396
397// Determine background level by event by counting out-of-time digits above threshold.
399{
400 // EventLevelClustering counters
401 using regionCounter = std::unordered_map<ECL::DetectorRegion, uint>;
402
403 regionCounter outOfTimeCount{{ECL::DetectorRegion::FWD, 0},
404 {ECL::DetectorRegion::BRL, 0},
405 {ECL::DetectorRegion::BWD, 0}};
406
408
409 // Loop over the input array
410 for (auto& aECLCalDigit : m_eclCalDigits) {
411 if (abs(aECLCalDigit.getTime()) >= m_backgroundTimingCut) {
412 if (aECLCalDigit.getEnergy() >= m_backgroundEnergyCut) {
413 // Get digit theta
414 const B2Vector3D position = geom->GetCrystalPos(aECLCalDigit.getCellId() - 1);
415 const double theta = position.Theta();
416
417 // Get detector region
418 const auto detectorRegion = ECL::getDetectorRegion(theta);
419
420 // Count out of time digits per region
421 ++outOfTimeCount.at(detectorRegion);
422 }
423 }
424 }
425
426 // Save EventLevelClusteringInfo
429 }
430
431 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeFWD(outOfTimeCount.at(ECL::DetectorRegion::FWD));
432 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBarrel(outOfTimeCount.at(ECL::DetectorRegion::BRL));
433 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBWD(outOfTimeCount.at(ECL::DetectorRegion::BWD));
434
435 B2DEBUG(35, "ECLDigitCalibratorModule::determineBackgroundECL found " << outOfTimeCount.at(ECL::DetectorRegion::FWD) << ", " <<
436 outOfTimeCount.at(ECL::DetectorRegion::BRL) << ", " << outOfTimeCount.at(ECL::DetectorRegion::BWD) <<
437 " out of time digits in FWD, BRL, BWD");
438
439 return m_eventLevelClusteringInfo->getNECLCalDigitsOutOfTime();
440}
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
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?
Definition: Environment.cc:54
static Environment & Instance()
Static method to get a reference to the Environment instance.
Definition: Environment.cc:28
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...
Definition: FileSystem.cc:151
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
Abstract base class for different kinds of events.
STL namespace.