26#include <QRegularExpression>
44 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
45 qWarning() <<
"[FineCalibration::read] Cannot open file:" << sPath;
49 QTextStream in(&file);
51 QString line = in.readLine().trimmed();
52 if (line.isEmpty() || line.startsWith(
'#')) {
56 QStringList parts = line.split(QRegularExpression(
"\\s+"), Qt::SkipEmptyParts);
57 if (parts.size() < 5) {
58 qWarning() <<
"[FineCalibration::read] Skipping malformed line:" << line;
64 entry.
chNumber = parts[0].toInt(&ok);
67 entry.
dGain = parts[1].toDouble(&ok);
70 double ix = parts[2].toDouble(&ok);
if (!ok)
continue;
71 double iy = parts[3].toDouble(&ok);
if (!ok)
continue;
72 double iz = parts[4].toDouble(&ok);
if (!ok)
continue;
87 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
88 qWarning() <<
"[FineCalibration::write] Cannot open file for writing:" << sPath;
92 QTextStream out(&file);
93 out <<
"# Fine calibration file\n";
94 out <<
"# channel_number gain imbalance_x imbalance_y imbalance_z\n";
96 for (
const auto& entry : m_entries) {
97 out << entry.chNumber <<
" "
98 << QString::number(entry.dGain,
'f', 6) <<
" "
99 << QString::number(entry.imbalance.x(),
'e', 6) <<
" "
100 << QString::number(entry.imbalance.y(),
'e', 6) <<
" "
101 << QString::number(entry.imbalance.z(),
'e', 6) <<
"\n";
112 for (
const auto& e : m_entries) {
113 if (e.chNumber == chNumber) {
125 VectorXd gains(m_entries.size());
126 for (
int i = 0; i < m_entries.size(); ++i) {
127 gains(i) = m_entries[i].dGain;
136 MatrixXd imb(m_entries.size(), 3);
137 for (
int i = 0; i < m_entries.size(); ++i) {
138 imb.row(i) = m_entries[i].imbalance.transpose();
Fine calibration data for SSS.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Per-sensor fine calibration entry.
Eigen::Vector3d imbalance
bool findEntry(int chNumber, FineCalEntry &entry) const
Find entry by channel number.
Eigen::MatrixXd imbalanceMatrix() const
Build imbalance matrix.
bool write(const QString &sPath) const
Write fine calibration to a .dat file.
FineCalibration()=default
Eigen::VectorXd gainVector() const
Build gain correction diagonal matrix for MEG channels.
void addEntry(const FineCalEntry &entry)
Add an entry.
static FineCalibration read(const QString &sPath)
Read a fine calibration file (.dat format).