10#include <ecl/modules/eclDigitCalibration/ECLDigitCalibratorModule.h>
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>
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>
35#include <unordered_map>
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())
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.");
71 "Fit parameter (p1) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
73 "Fit parameter (p2) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
75 "Fit parameter (p3) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
77 "Fit parameter (p4) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
79 "Fit parameter (p5) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
81 "Fit parameter (p6) for applying correction to the time offset as a function of the energy (amplitude)", -999.0);
117 std::vector<float>& constantsUnc)
119 constants = cal->getCalibVector();
120 constantsUnc = cal->getCalibUncVector();
148 B2FATAL(
"Could not find m_th1fBackground");
190 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronics for current run!");
197 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalEnergy for current run!");
205 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalElectronicsTime for current run!");
212 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalTimeOffset for current run!");
219 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrateTimeOffset for current run!");
226 B2ERROR(
"ECLDigitCalibratorModule::beginRun - Couldn't find m_calibrationCrystalFlightTime for current run!");
237 bool is_pure_csi = 0;
243 const int cellid = aECLDigit.getCellId();
247 B2FATAL(
"ECLDigitCalibrationModule::event():" << cellid <<
" out of range!");
251 const int amplitude = aECLDigit.getAmp();
252 double calibratedEnergy = 0;
266 if (calibratedEnergy < 0.0)
267 calibratedEnergy = 0.0;
270 const int time = aECLDigit.getTimeFit();
271 const int quality = aECLDigit.getQuality();
274 aECLCalDigit->addStatus(ECLCalDigit::c_IsFailedFit);
291 B2DEBUG(35,
"cellid = " << cellid <<
", m_IsMCFlag = " << m_IsMCFlag);
296 B2DEBUG(35,
"cellid = " << cellid <<
", amplitude = " << amplitude <<
", corrected amplitude = " << amplitude*
298 energyTimeShift <<
" ns");
299 calibratedTime -= energyTimeShift;
303 B2DEBUG(35,
"cellid = " << cellid <<
", amplitude = " << amplitude <<
", calibrated energy = " << calibratedEnergy);
304 B2DEBUG(35,
"cellid = " << cellid <<
", time = " << time <<
", calibratedTime = " << calibratedTime);
308 aECLCalDigit->setTwoComponentChi2(-1);
312 aECLCalDigit->setTwoComponentTotalEnergy(-1);
313 aECLCalDigit->setTwoComponentHadronEnergy(-1);
314 aECLCalDigit->setTwoComponentDiodeEnergy(-1);
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);
342 aECLCalDigit->setTwoComponentTotalEnergy(calibratedTwoComponentTotalEnergy);
343 aECLCalDigit->setTwoComponentHadronEnergy(calibratedTwoComponentHadronEnergy);
344 aECLCalDigit->setTwoComponentDiodeEnergy(calibratedTwoComponentDiodeEnergy);
345 aECLCalDigit->setTwoComponentChi2(twoComponentChi2);
350 aECLCalDigit->setTwoComponentFitType(twoComponentFitType);
355 aECLCalDigit->setCellId(cellid);
357 aECLCalDigit->setEnergy(calibratedEnergy);
358 aECLCalDigit->addStatus(ECLCalDigit::c_IsEnergyCalibrated);
360 aECLCalDigit->setTime(calibratedTime);
361 aECLCalDigit->addStatus(ECLCalDigit::c_IsTimeCalibrated);
364 aECLCalDigit->addRelationTo(&aECLDigit);
374 const double t99 =
getT99(aECLCalDigit.getCellId(),
375 aECLCalDigit.getEnergy(),
376 aECLCalDigit.hasStatus(ECLCalDigit::c_IsFailedFit),
378 aECLCalDigit.setTimeResolution(t99);
381 aECLCalDigit.addStatus(ECLCalDigit::c_IsFailedTimeResolution);
384 aECLCalDigit.addStatus(ECLCalDigit::c_IsTimeResolutionCalibrated);
419 double t99 = p1 * einv;
425 B2DEBUG(35,
"ECLDigitCalibratorModule::getCalibratedTimeResolution: dose = " <<
m_th1fBackground->GetBinContent(
427 <<
", bglevel = " << bglevel <<
", cellid = " << cellid <<
", t99 = " << t99 <<
", energy = " << energy /
Belle2::Unit::MeV);
436 using regionCounter = std::unordered_map<ECL::DetectorRegion, uint>;
438 regionCounter outOfTimeCount{{ECL::DetectorRegion::FWD, 0},
439 {ECL::DetectorRegion::BRL, 0},
440 {ECL::DetectorRegion::BWD, 0}};
449 const B2Vector3D position = geom->GetCrystalPos(aECLCalDigit.getCellId() - 1);
450 const double theta = position.
Theta();
453 const auto detectorRegion = ECL::getDetectorRegion(theta);
456 ++outOfTimeCount.at(detectorRegion);
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");
DataType Theta() const
The polar angle.
Class for accessing objects in the database.
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.
~ECLDigitCalibratorModule()
Destructor.
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.
ECLDigitCalibratorModule()
Constructor.
double m_backgroundEnergyCut
Energy cut for background level counting.
StoreObjPtr< EventLevelClusteringInfo > m_eventLevelClusteringInfo
event level clustering info
StoreArray< ECLCalDigit > m_eclCalDigits
storearray ECLCalDigit
TFile * m_fileBackground
Background file.
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.
double getTwoComponentHadronAmp() const
get two comp hadron amp
double getTwoComponentSavedChi2(TwoComponentFitType FitTypeIn) const
get two comp chi2 for a fit type see enum TwoComponentFitType in ECLDsp.h for description of fit type...
TwoComponentFitType
Offline two component fit type.
@ photonHadronBackgroundPhoton
photon + hadron template + pile-up photon fit
@ photonDiodeCrossing
photon + diode template fit
@ photonHadron
photon + hadron template fit
double getTwoComponentTotalAmp() const
get two comp total amp
double getTwoComponentChi2() const
get two comp chi2
TwoComponentFitType getTwoComponentFitType() const
get two comp fit type
static ECLDsp * getByCellID(int cid)
Find ECLDsp by Cell ID using linear search.
double getTwoComponentDiodeAmp() const
get two comp diode amp
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.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
static const double MeV
[megaelectronvolt]
static const double ns
Standard of [time].
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.