Files
Jungfraujoch/jungfrau/JFModuleGainCalibration.cpp
Filip Leonarski 1757d42182 Initial commit
Signed-off-by: Filip Leonarski <filip.leonarski@psi.ch>
2023-04-06 11:17:59 +02:00

86 lines
2.6 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"
void JFModuleGainCalibration::SetPointers() {
gain_g0 = gain.data();
gain_g1 = gain.data() + RAW_MODULE_SIZE;
gain_g2 = gain.data() + 2 * RAW_MODULE_SIZE;
}
JFModuleGainCalibration::JFModuleGainCalibration() : gain(RAW_MODULE_SIZE * 3) {
SetPointers();
for (int i = 0; i < RAW_MODULE_SIZE; i++) {
gain_g0[i] = DEFAULT_G0_FACTOR;
gain_g1[i] = DEFAULT_G1_FACTOR;
gain_g2[i] = DEFAULT_G2_FACTOR;
}
}
JFModuleGainCalibration::JFModuleGainCalibration(const std::string &filename) : gain(RAW_MODULE_SIZE * 3) {
SetPointers();
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;
SetPointers();
}
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_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_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_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_g0);
}
double JFModuleGainCalibration::GetG1Mean() const {
return GetMean(gain_g1);
}
double JFModuleGainCalibration::GetG2Mean() const {
return GetMean(gain_g2);
}