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 // t-t0 = p1 + pow( (p3/(amplitude+p2)), p4 ) + p5*exp(-amplitude/p6) ("Energy dependence equation")
70 addParam("energyDependenceTimeOffsetFitParam_p1", m_energyDependenceTimeOffsetFitParam_p1,
71 "Fit parameter (p1) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
72 addParam("energyDependenceTimeOffsetFitParam_p2", m_energyDependenceTimeOffsetFitParam_p2,
73 "Fit parameter (p2) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
74 addParam("energyDependenceTimeOffsetFitParam_p3", m_energyDependenceTimeOffsetFitParam_p3,
75 "Fit parameter (p3) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
76 addParam("energyDependenceTimeOffsetFitParam_p4", m_energyDependenceTimeOffsetFitParam_p4,
77 "Fit parameter (p4) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
78 addParam("energyDependenceTimeOffsetFitParam_p5", m_energyDependenceTimeOffsetFitParam_p5,
79 "Fit parameter (p5) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
80 addParam("energyDependenceTimeOffsetFitParam_p6", m_energyDependenceTimeOffsetFitParam_p6,
81 "Fit parameter (p6) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
82
83 // Parallel processing certification
85
86 m_averageBG = 0;
87 m_pol2Max = 0.0;
89}
90
91// destructor
93{
94}
95
96// initialize calibration
98{
99
100 // 1/(4fRF) = 0.4913 ns/clock tick, where fRF is the accelerator RF frequency. Same for all crystals:
101 m_timeInverseSlope = 1.0 / (4.0 * EclConfiguration::getRF()) * 1e3;
102 m_pureCsIEnergyCalib = 0.00005; // conversion factor from ADC counts to GeV
103 m_pureCsITimeCalib = 0.1; // conversion factor from eclPureCsIDigitizer to ns
104 m_pureCsITimeOffset = 0.31; // ad-hoc offset correction for pureCsI timing
105
113}
114
115// callback calibration
117 std::vector<float>& constantsUnc)
118{
119 constants = cal->getCalibVector();
120 constantsUnc = cal->getCalibUncVector();
121}
122
123// initialize
125{
126 // mdst dataobjects
127 // This object is registered by few packages. Let's be agnostic about the
128 // execution order of the modules: the first package run registers the module
132
133 // Register Digits, CalDigits and their relation in datastore
134 m_eclDigits.isRequired(eclDigitArrayName());
135 m_eclCalDigits.registerInDataStore(eclCalDigitArrayName());
136 m_eclCalDigits.registerRelationTo(m_eclDigits);
137
138 // initialize calibration
140
141 // initialize time resolution (not yet from the database)
142 // read the Background correction factors (for full background)
143 m_fileBackground = new TFile(m_fileBackgroundName.c_str(), "READ");
144 if (!m_fileBackground)
145 B2FATAL("Could not find file: " << m_fileBackgroundName);
146 m_th1fBackground = dynamic_cast<TH1F*>(m_fileBackground->Get("background"));
147 if (!m_th1fBackground)
148 B2FATAL("Could not find m_th1fBackground");
149
150 // average BG value from m_th1fBackground
151 m_averageBG = m_th1fBackground->Integral() / m_th1fBackground->GetEntries();
152
153 // get maximum position ("x") of 2-order pol background for t99
154 if (fabs(c_pol2Var3) > 1e-12) {
156 } else {
157 m_pol2Max = 0.;
158 }
159
166 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p1 = " << m_energyDependenceTimeOffsetFitParam_p1);
167 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p2 = " << m_energyDependenceTimeOffsetFitParam_p2);
168 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p3 = " << m_energyDependenceTimeOffsetFitParam_p3);
169 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p4 = " << m_energyDependenceTimeOffsetFitParam_p4);
170 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p5 = " << m_energyDependenceTimeOffsetFitParam_p5);
171 B2DEBUG(80, "m_energyDependenceTimeOffsetFitParam_p6 = " << m_energyDependenceTimeOffsetFitParam_p6);
172
179 }
180}
181
182// begin run
184{
185 // Check if any of the calibration constants have changed
186 if (m_calibrationCrystalElectronics.hasChanged()) {
189 } else
190 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronics for current run!");
191 }
192
193 if (m_calibrationCrystalEnergy.hasChanged()) {
196 } else
197 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalEnergy for current run!");
198 }
199
200 if (m_calibrationCrystalElectronicsTime.hasChanged()) {
204 } else
205 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronicsTime for current run!");
206 }
207
208 if (m_calibrationCrystalTimeOffset.hasChanged()) {
211 } else
212 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalTimeOffset for current run!");
213 }
214
215 if (m_calibrationCrateTimeOffset.hasChanged()) {
218 } else
219 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrateTimeOffset for current run!");
220 }
221
222 if (m_calibrationCrystalFlightTime.hasChanged()) {
225 } else
226 B2ERROR("ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalFlightTime for current run!");
227 }
228}
229
230// event
232{
233
234 // Loop over the input array
235 for (auto& aECLDigit : m_eclDigits) {
236
237 bool is_pure_csi = 0;
238
239 // append an ECLCalDigit to the storearray
240 const auto aECLCalDigit = m_eclCalDigits.appendNew();
241
242 // get the cell id from the ECLDigit as identifier
243 const int cellid = aECLDigit.getCellId();
244
245 // check that the cell id is valid
246 if (cellid < 1 or cellid > c_nCrystals) {
247 B2FATAL("ECLDigitCalibrationModule::event():" << cellid << " out of range!");
248 }
249
250 // perform the digit energy calibration: E = A * Ce * Cs
251 const int amplitude = aECLDigit.getAmp();
252 double calibratedEnergy = 0;
253
254 if (m_simulatePure) {
255 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName()) != nullptr) {
256 if (aECLDigit.getRelated<ECLPureCsIInfo>(eclPureCsIInfoArrayName())->getPureCsI())
257 is_pure_csi = 1;
258 }
259 }
260
261 if (is_pure_csi) {
262 calibratedEnergy = amplitude * m_pureCsIEnergyCalib;
263 } else {
264 calibratedEnergy = amplitude * v_calibrationCrystalElectronics[cellid - 1] * v_calibrationCrystalEnergy[cellid - 1];
265 }
266 if (calibratedEnergy < 0.0)
267 calibratedEnergy = 0.0;
268
269 // perform the digit timing calibration: t = c * (tfit - Te - Ts)
270 const int time = aECLDigit.getTimeFit();
271 const int quality = aECLDigit.getQuality();
272 double calibratedTime = c_timeForFitFailed;
273 if (quality == 1) {
274 aECLCalDigit->addStatus(ECLCalDigit::c_IsFailedFit); // this is used to flag failed fits
275 } else {
276 // only calibrate digit time if we have a good waveform fit
277 if (is_pure_csi) {
278 calibratedTime = m_pureCsITimeCalib * m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
281 } else {
282 calibratedTime = m_timeInverseSlope * (time - v_calibrationCrystalElectronicsTime[cellid - 1] -
284 v_calibrationCrateTimeOffset[cellid - 1]) -
286 }
287
288 // For data, apply a correction to the time as a function of the signal amplitude. Correction determined from a fit.
289 // No correction for MC
290 bool m_IsMCFlag = Environment::Instance().isMC();
291 B2DEBUG(35, "cellid = " << cellid << ", m_IsMCFlag = " << m_IsMCFlag);
292
293 if (!m_IsMCFlag) {
294 double energyTimeShift = ECLTimeUtil->energyDependentTimeOffsetElectronic(amplitude * v_calibrationCrystalElectronics[cellid - 1]) *
296 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", corrected amplitude = " << amplitude*
297 v_calibrationCrystalElectronics[cellid - 1] << ", time before t(E) shift = " << calibratedTime << ", t(E) shift = " <<
298 energyTimeShift << " ns");
299 calibratedTime -= energyTimeShift;
300 }
301 }
302
303 B2DEBUG(35, "cellid = " << cellid << ", amplitude = " << amplitude << ", calibrated energy = " << calibratedEnergy);
304 B2DEBUG(35, "cellid = " << cellid << ", time = " << time << ", calibratedTime = " << calibratedTime);
305
306 // Calibrating offline fit results
307 ECLDsp* aECLDsp = ECLDsp::getByCellID(cellid);
308 aECLCalDigit->setTwoComponentChi2(-1);
309 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, -1);
310 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton, -1);
311 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, -1);
312 aECLCalDigit->setTwoComponentTotalEnergy(-1);
313 aECLCalDigit->setTwoComponentHadronEnergy(-1);
314 aECLCalDigit->setTwoComponentDiodeEnergy(-1);
315 // copy online fit quality from ECLDigit
316 const int online_quality = aECLDigit.getQuality();
317 if (online_quality == 1) {
318 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality1);
319 } else if (online_quality == 2) {
320 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality2);
321 } else if (online_quality == 3) {
322 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality3);
323 } else if (online_quality == 0) {
324 aECLCalDigit->addStatus(ECLCalDigit::c_OnlineFitQuality0);
325 }
326
327 if (aECLDsp) {
328 // require ECLDigit to have offline waveform
329 if (aECLDsp->getTwoComponentChi2() > 0) {
330 // require offline waveform to have offline fit result
331
332 const double calibratedTwoComponentTotalEnergy = aECLDsp->getTwoComponentTotalAmp() * v_calibrationCrystalElectronics[cellid - 1] *
333 v_calibrationCrystalEnergy[cellid - 1];
334 const double calibratedTwoComponentHadronEnergy = aECLDsp->getTwoComponentHadronAmp() * v_calibrationCrystalElectronics[cellid -
335 1] *
336 v_calibrationCrystalEnergy[cellid - 1];
337 const double calibratedTwoComponentDiodeEnergy = aECLDsp->getTwoComponentDiodeAmp() * v_calibrationCrystalElectronics[cellid - 1] *
338 v_calibrationCrystalEnergy[cellid - 1];
339 const double twoComponentChi2 = aECLDsp->getTwoComponentChi2();
340 const ECLDsp::TwoComponentFitType twoComponentFitType = aECLDsp->getTwoComponentFitType();
341
342 aECLCalDigit->setTwoComponentTotalEnergy(calibratedTwoComponentTotalEnergy);
343 aECLCalDigit->setTwoComponentHadronEnergy(calibratedTwoComponentHadronEnergy);
344 aECLCalDigit->setTwoComponentDiodeEnergy(calibratedTwoComponentDiodeEnergy);
345 aECLCalDigit->setTwoComponentChi2(twoComponentChi2);
346 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadron, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonHadron));
347 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonHadronBackgroundPhoton,
349 aECLCalDigit->setTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing, aECLDsp->getTwoComponentSavedChi2(ECLDsp::photonDiodeCrossing));
350 aECLCalDigit->setTwoComponentFitType(twoComponentFitType);
351 }
352 }
353
354 // fill the ECLCalDigit with the cell id, the calibrated information and calibration status
355 aECLCalDigit->setCellId(cellid);
356
357 aECLCalDigit->setEnergy(calibratedEnergy);
358 aECLCalDigit->addStatus(ECLCalDigit::c_IsEnergyCalibrated);
359
360 aECLCalDigit->setTime(calibratedTime);
361 aECLCalDigit->addStatus(ECLCalDigit::c_IsTimeCalibrated);
362
363 // set a relation to the ECLDigit
364 aECLCalDigit->addRelationTo(&aECLDigit);
365 }
366
367 // determine background level
368 const int bgCount = determineBackgroundECL();
369
370 // set the t99 (time resolution)
371 for (auto& aECLCalDigit : m_eclCalDigits) {
372
373 // perform the time resolution calibration
374 const double t99 = getT99(aECLCalDigit.getCellId(),
375 aECLCalDigit.getEnergy(),
376 aECLCalDigit.hasStatus(ECLCalDigit::c_IsFailedFit),
377 bgCount); // calibrated time resolution
378 aECLCalDigit.setTimeResolution(t99);
379
380 if (t99 == c_timeResolutionForFitFailed) {
381 aECLCalDigit.addStatus(ECLCalDigit::c_IsFailedTimeResolution);
382 }
383
384 aECLCalDigit.addStatus(ECLCalDigit::c_IsTimeResolutionCalibrated);
385 }
386}
387
388// end run
390{
391}
392
393// terminate
395{
396}
397
398// Time resolution calibration
399double ECLDigitCalibratorModule::getT99(const int cellid, const double energy, const bool fitfailed, const int bgcount) const
400{
401
402 // if this digit is calibrated to the trigger time, we set the resolution to 'very bad' (to be discussed)
403 if (fitfailed)
405
406 // Get the background level [MeV / mus]
407 const double bglevel = TMath::Min((double)bgcount / (double)c_nominalBG * m_th1fBackground->GetBinContent(cellid) / m_averageBG,
408 m_pol2Max); // c_nominalBG = 183 for actual version of digitizer, m_averageBG is about 2 MeV/ mus
409
410 // Get p1 as function of background level
411 const double p1 = c_pol2Var1 + c_pol2Var2 * bglevel + c_pol2Var3 * bglevel * bglevel;
412
413 // inverse energy in 1/MeV
414 double einv = 0.;
415 if (energy > 1e-12)
416 einv = 1. / (energy / Belle2::Unit::MeV);
417
418 // calculate t99 using the inverse energy and p1 (p0 is zero)
419 double t99 = p1 * einv;
420
421 // for high energies we fix t99 to 3.5ns
422 if (t99 < c_minT99)
423 t99 = c_minT99;
424
425 B2DEBUG(35, "ECLDigitCalibratorModule::getCalibratedTimeResolution: dose = " << m_th1fBackground->GetBinContent(
426 cellid)
427 << ", bglevel = " << bglevel << ", cellid = " << cellid << ", t99 = " << t99 << ", energy = " << energy / Belle2::Unit::MeV);
428
429 return t99;
430}
431
432// Determine background level by event by counting out-of-time digits above threshold.
434{
435 // EventLevelClustering counters
436 using regionCounter = std::unordered_map<ECL::DetectorRegion, uint>;
437
438 regionCounter outOfTimeCount{{ECL::DetectorRegion::FWD, 0},
439 {ECL::DetectorRegion::BRL, 0},
440 {ECL::DetectorRegion::BWD, 0}};
441
443
444 // Loop over the input array
445 for (auto& aECLCalDigit : m_eclCalDigits) {
446 if (abs(aECLCalDigit.getTime()) >= m_backgroundTimingCut) {
447 if (aECLCalDigit.getEnergy() >= m_backgroundEnergyCut) {
448 // Get digit theta
449 const B2Vector3D position = geom->GetCrystalPos(aECLCalDigit.getCellId() - 1);
450 const double theta = position.Theta();
451
452 // Get detector region
453 const auto detectorRegion = ECL::getDetectorRegion(theta);
454
455 // Count out of time digits per region
456 ++outOfTimeCount.at(detectorRegion);
457 }
458 }
459 }
460
461 // Save EventLevelClusteringInfo
464 }
465
466 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeFWD(outOfTimeCount.at(ECL::DetectorRegion::FWD));
467 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBarrel(outOfTimeCount.at(ECL::DetectorRegion::BRL));
468 m_eventLevelClusteringInfo->setNECLCalDigitsOutOfTimeBWD(outOfTimeCount.at(ECL::DetectorRegion::BWD));
469
470 B2DEBUG(35, "ECLDigitCalibratorModule::determineBackgroundECL found " << outOfTimeCount.at(ECL::DetectorRegion::FWD) << ", " <<
471 outOfTimeCount.at(ECL::DetectorRegion::BRL) << ", " << outOfTimeCount.at(ECL::DetectorRegion::BWD) <<
472 " out of time digits in FWD, BRL, BWD");
473
474 return m_eventLevelClusteringInfo->getNECLCalDigitsOutOfTime();
475}
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.
double m_energyDependenceTimeOffsetFitParam_p5
p5 in "energy dependence equation"
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
double m_energyDependenceTimeOffsetFitParam_p2
p2 in "energy dependence equation"
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)
double m_energyDependenceTimeOffsetFitParam_p3
p3 in "energy dependence equation"
double m_energyDependenceTimeOffsetFitParam_p6
p6 in "energy dependence equation"
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.
double m_energyDependenceTimeOffsetFitParam_p4
p4 in "energy dependence equation"
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.
double m_energyDependenceTimeOffsetFitParam_p1
p1 in "energy dependence equation"
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:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.
STL namespace.