v2.0.0
Loading...
Searching...
No Matches
fine_calibration.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "fine_calibration.h"
18
19//=============================================================================================================
20// QT INCLUDES
21//=============================================================================================================
22
23#include <QFile>
24#include <QTextStream>
25#include <QDebug>
26#include <QRegularExpression>
27
28//=============================================================================================================
29// USED NAMESPACES
30//=============================================================================================================
31
32using namespace UTILSLIB;
33using namespace Eigen;
34
35//=============================================================================================================
36// DEFINE MEMBER METHODS
37//=============================================================================================================
38
40{
42
43 QFile file(sPath);
44 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
45 qWarning() << "[FineCalibration::read] Cannot open file:" << sPath;
46 return cal;
47 }
48
49 QTextStream in(&file);
50 while (!in.atEnd()) {
51 QString line = in.readLine().trimmed();
52 if (line.isEmpty() || line.startsWith('#')) {
53 continue;
54 }
55
56 QStringList parts = line.split(QRegularExpression("\\s+"), Qt::SkipEmptyParts);
57 if (parts.size() < 5) {
58 qWarning() << "[FineCalibration::read] Skipping malformed line:" << line;
59 continue;
60 }
61
62 FineCalEntry entry;
63 bool ok = false;
64 entry.chNumber = parts[0].toInt(&ok);
65 if (!ok) continue;
66
67 entry.dGain = parts[1].toDouble(&ok);
68 if (!ok) continue;
69
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;
73 entry.imbalance = Vector3d(ix, iy, iz);
74
75 cal.addEntry(entry);
76 }
77
78 file.close();
79 return cal;
80}
81
82//=============================================================================================================
83
84bool FineCalibration::write(const QString& sPath) const
85{
86 QFile file(sPath);
87 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
88 qWarning() << "[FineCalibration::write] Cannot open file for writing:" << sPath;
89 return false;
90 }
91
92 QTextStream out(&file);
93 out << "# Fine calibration file\n";
94 out << "# channel_number gain imbalance_x imbalance_y imbalance_z\n";
95
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";
102 }
103
104 file.close();
105 return true;
106}
107
108//=============================================================================================================
109
110bool FineCalibration::findEntry(int chNumber, FineCalEntry& entry) const
111{
112 for (const auto& e : m_entries) {
113 if (e.chNumber == chNumber) {
114 entry = e;
115 return true;
116 }
117 }
118 return false;
119}
120
121//=============================================================================================================
122
124{
125 VectorXd gains(m_entries.size());
126 for (int i = 0; i < m_entries.size(); ++i) {
127 gains(i) = m_entries[i].dGain;
128 }
129 return gains;
130}
131
132//=============================================================================================================
133
135{
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();
139 }
140 return imb;
141}
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.
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).