// Copyright (2019-2023) Paul Scherrer Institute #include "JFModuleGainCalibration.h" #include #include "../common/to_fixed.h" #include "../common/JFJochException.h" JFModuleGainCalibration::JFModuleGainCalibration() : gain(RAW_MODULE_SIZE * 3) { for (int i = 0; i < RAW_MODULE_SIZE; i++) { gain[i + offset_g0] = DEFAULT_G0_FACTOR; gain[i + offset_g1] = DEFAULT_G1_FACTOR; gain[i + offset_g2] = DEFAULT_G2_FACTOR; } } JFModuleGainCalibration::JFModuleGainCalibration(const std::string &filename) : gain(RAW_MODULE_SIZE * 3) { std::ifstream file(filename.c_str(), std::fstream::binary); if (!file.is_open()) throw JFJochException(JFJochExceptionCategory::GainFileOpenError, "Gain file cannot be opened"); try { file.read((char *) gain.data(), gain.size() * sizeof(double)); } catch (...) { throw JFJochException(JFJochExceptionCategory::GainFileOpenError, "Gain file cannot be read"); } } JFModuleGainCalibration::JFModuleGainCalibration(const std::vector &vec) { if (vec.size() != 3 * RAW_MODULE_SIZE) { throw JFJochException(JFJochExceptionCategory::GainFileOpenError, "Wrong size of input vector for gain calibration"); } gain = vec; } const std::vector &JFModuleGainCalibration::GetGainCalibration() const { return gain; } void JFModuleGainCalibration::ExportG0(uint16_t *output) const { for (int i = 0; i < RAW_MODULE_SIZE; i++) output[i] = to_fixed(GAIN_G0_MULTIPLIER / gain[offset_g0 + i], 14); } void JFModuleGainCalibration::ExportG1(uint16_t *output) const { for (int i = 0; i < RAW_MODULE_SIZE; i++) output[i] = to_fixed(GAIN_G1_MULTIPLIER / gain[offset_g1 + i], 12); } void JFModuleGainCalibration::ExportG2(uint16_t *output) const { for (int i = 0; i < RAW_MODULE_SIZE; i++) output[i] = to_fixed(GAIN_G2_MULTIPLIER / gain[offset_g2 + i], 10); } double JFModuleGainCalibration::GetMean(const double *ptr) { double ret = 0; for (int i = 0; i < RAW_MODULE_SIZE; i++) ret += ptr[i]; return ret / static_cast(RAW_MODULE_SIZE); } double JFModuleGainCalibration::GetG0Mean() const { return GetMean(gain.data() + offset_g0); } double JFModuleGainCalibration::GetG1Mean() const { return GetMean(gain.data() + offset_g1); } double JFModuleGainCalibration::GetG2Mean() const { return GetMean(gain.data() + offset_g2); }