Files
Jungfraujoch/jungfrau/JFModuleGainCalibration.cpp

75 lines
2.5 KiB
C++

// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#include "JFModuleGainCalibration.h"
#include <fstream>
#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<double> &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<double> &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<double>(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);
}