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