24#include "ui_hpisettingsview.h"
59,
m_pUi(new Ui::HpiSettingsViewWidget)
64 connect(
m_pUi->m_pushButton_loadDigitizers, &QPushButton::released,
66 connect(
m_pUi->m_pushButton_doFreqOrder, &QPushButton::clicked,
68 connect(
m_pUi->m_pushButton_doSingleFit, &QPushButton::clicked,
70 connect(
m_pUi->m_tableWidget_Frequencies, &QTableWidget::cellChanged,
72 connect(
m_pUi->m_pushButton_addCoil, &QPushButton::clicked,
74 connect(
m_pUi->m_pushButton_removeCoil, &QPushButton::clicked,
76 connect(
m_pUi->m_checkBox_useSSP, &QCheckBox::clicked,
78 connect(
m_pUi->m_checkBox_useComp, &QCheckBox::clicked,
80 connect(
m_pUi->m_checkBox_continousHPI, &QCheckBox::clicked,
82 connect(
m_pUi->m_spinBox_samplesToFit, QOverload<int>::of(&QSpinBox::valueChanged),
84 connect(
m_pUi->m_doubleSpinBox_maxHPIContinousDist,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
86 connect(
m_pUi->m_doubleSpinBox_moveThreshold,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
88 connect(
m_pUi->m_doubleSpinBox_rotThreshold,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
90 connect(
m_pUi->comboBox_coilPreset,
static_cast<void (QComboBox::*)(
int)
>(&QComboBox::currentIndexChanged),
111 const double dMeanErrorDist)
116 for (
int i = 0; i < vError.size(); ++i) {
117 if (i < m_pUi->m_tableWidget_results->rowCount()) {
118 sGof = QString::number(vError[i] * 1000,
'f', 2) + QString(
" mm");
119 m_pUi->m_tableWidget_results->item(i, 1)->setText(sGof);
123 m_pUi->m_label_averagedFitError->setText(QString::number(dMeanErrorDist * 1000,
'f', 2) + QString(
" mm"));
126 if (dMeanErrorDist * 1000 >
m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()) {
127 m_pUi->m_label_fitFeedback->setText(
"Last fit: Bad");
128 m_pUi->m_label_fitFeedback->setStyleSheet(
"QLabel { background-color : red;}");
130 m_pUi->m_label_fitFeedback->setText(
"Last fit: Good");
131 m_pUi->m_label_fitFeedback->setStyleSheet(
"QLabel { background-color : green;}");
138 const double dMeanGof)
141 QString sGof(
"00.00");
143 for (
int i = 0; i < vGoF.size(); ++i) {
144 if (i < m_pUi->m_tableWidget_results->rowCount()) {
145 sGof = QString::number(vGoF[i] * 100,
'f', 2) + QString(
" %");
146 m_pUi->m_tableWidget_results->item(i, 2)->setText(sGof);
150 m_pUi->m_average_gof_set->setText(QString::number(dMeanGof * 100,
'f', 2) + QString(
" %"));
158 m_pUi->m_qLineEdit_moveResult->setText(QString::number(dMovement * 1000,
'f', 2) + QString(
" mm"));
159 m_pUi->m_qLineEdit_rotResult->setText(QString::number(dRotation,
'f', 2) + QString(
" °"));
161 if (dMovement * 1000 >
m_pUi->m_doubleSpinBox_moveThreshold->value() || dRotation >
m_pUi->m_doubleSpinBox_rotThreshold->value()) {
162 m_pUi->m_label_movementFeedback->setText(
"Big");
163 m_pUi->m_label_movementFeedback->setStyleSheet(
"QLabel { background-color : red;}");
165 m_pUi->m_label_movementFeedback->setText(
"Small");
166 m_pUi->m_label_movementFeedback->setStyleSheet(
"QLabel { background-color : green;}");
174 return m_pUi->m_checkBox_useSSP->isChecked();
181 return m_pUi->m_checkBox_useComp->isChecked();
188 return m_pUi->m_doubleSpinBox_maxHPIContinousDist->value();
195 return m_pUi->m_doubleSpinBox_moveThreshold->value();
202 return m_pUi->m_doubleSpinBox_rotThreshold->value();
209 return m_pUi->m_checkBox_continousHPI->isChecked();
216 return m_pUi->m_spinBox_samplesToFit->value();
227 QSettings settings(
"MNECPP");
229 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/coilFreqs"),
232 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/useSSP"),
233 QVariant::fromValue(
m_pUi->m_checkBox_useSSP->isChecked()));
235 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/useCOMP"),
236 QVariant::fromValue(
m_pUi->m_checkBox_useComp->isChecked()));
238 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/continousHPI"),
239 QVariant::fromValue(
m_pUi->m_checkBox_continousHPI->isChecked()));
241 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/maxError"),
242 QVariant::fromValue(
m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()));
244 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/fittingWindowSize"),
245 QVariant::fromValue(
m_pUi->m_spinBox_samplesToFit->value()));
256 QSettings settings(
"MNECPP");
257 QVariant defaultData;
263 m_pUi->m_checkBox_useSSP->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/useSSP"),
false).toBool());
264 m_pUi->m_checkBox_useComp->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/useCOMP"),
false).toBool());
265 m_pUi->m_checkBox_continousHPI->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/continousHPI"),
false).toBool());
266 m_pUi->m_doubleSpinBox_maxHPIContinousDist->setValue(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/maxError"), 10.0).toDouble());
267 m_pUi->m_spinBox_samplesToFit->setValue(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/fittingWindowSize"), 300).toInt());
299 QString fileName_HPI = QFileDialog::getOpenFileName(
this,
300 tr(
"Open digitizer file"),
302 tr(
"Fiff file (*.fif)"));
304 if (!fileName_HPI.isEmpty()) {
305 m_pUi->m_lineEdit_filePath->setText(fileName_HPI);
309 if (!fileName_HPI.isEmpty()) {
310 fileName_HPI = fileName_HPI.trimmed();
311 QFileInfo checkFile(fileName_HPI);
313 if (checkFile.exists() && checkFile.isFile()) {
315 m_pUi->m_checkBox_continousHPI->setChecked(
false);
319 msgBox.setText(
"File could not be loaded!");
335 if (QTableWidgetItem* pItem =
m_pUi->m_tableWidget_Frequencies->item(row, col)) {
336 if (pItem->text() ==
"none") {
350 if (
m_pUi->m_tableWidget_Frequencies->rowCount() + 1 >
m_pUi->m_label_numberLoadedCoils->text().toInt()) {
352 msgBox.setText(
"Cannot add more HPI coils. Not enough digitzed HPI coils loaded.");
358 m_pUi->m_tableWidget_Frequencies->insertRow(
m_pUi->m_tableWidget_Frequencies->rowCount());
359 QTableWidgetItem* pTableItemA =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
360 pTableItemA->setFlags(Qt::ItemIsEnabled);
361 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1,
367 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1,
369 new QTableWidgetItem(QString::number(
m_vCoilFreqs.at(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1))));
371 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1,
373 new QTableWidgetItem(
"none"));
378 m_pUi->m_tableWidget_results->insertRow(
m_pUi->m_tableWidget_results->rowCount());
379 QTableWidgetItem* pTableItemB =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
380 pTableItemB->setFlags(Qt::ItemIsEnabled);
381 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
386 QTableWidgetItem* pTableItemC =
new QTableWidgetItem(
"0mm");
387 pTableItemC->setFlags(Qt::ItemIsEnabled);
388 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
393 QTableWidgetItem* pTableItemD =
new QTableWidgetItem(
"00.00");
394 pTableItemD->setFlags(Qt::ItemIsEnabled);
395 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
406 int row =
m_pUi->m_tableWidget_Frequencies->currentRow();
410 m_pUi->m_tableWidget_Frequencies->removeRow(row);
412 for (
int i = 0; i <
m_pUi->m_tableWidget_Frequencies->rowCount(); ++i) {
413 m_pUi->m_tableWidget_Frequencies->item(i, 0)->setText(QString::number(i + 1));
416 m_pUi->m_tableWidget_results->removeRow(row);
418 for (
int i = 0; i <
m_pUi->m_tableWidget_results->rowCount(); ++i) {
419 m_pUi->m_tableWidget_results->item(i, 0)->setText(QString::number(i + 1));
432 QFile t_fileDig(fileName);
454 qint16 numFiducials = 0;
456 qint16 numAdditional = 0;
458 for (
int i = 0; i < digSet.
size(); ++i) {
459 switch (digSet[i].kind) {
479 m_pUi->m_label_numberLoadedCoils->setNum(numHPI);
480 m_pUi->m_label_numberLoadedFiducials->setNum(numFiducials);
481 m_pUi->m_label_numberLoadedEEG->setNum(numEEG);
482 m_pUi->m_label_numberLoadedAdditional->setNum(numAdditional);
508 m_pUi->m_tableWidget_Frequencies->insertRow(
m_pUi->m_tableWidget_Frequencies->rowCount());
509 QTableWidgetItem* pTableItemA =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
510 pTableItemA->setFlags(Qt::ItemIsEnabled);
511 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1,
516 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount() - 1,
518 new QTableWidgetItem(QString::number(iCoilFreq)));
526 m_pUi->m_tableWidget_results->insertRow(
m_pUi->m_tableWidget_results->rowCount());
527 QTableWidgetItem* pTableItemB =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
528 pTableItemB->setFlags(Qt::ItemIsEnabled);
529 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
534 QTableWidgetItem* pTableItemC =
new QTableWidgetItem(
"0mm");
535 pTableItemC->setFlags(Qt::ItemIsEnabled);
536 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
541 QTableWidgetItem* pTableItemD =
new QTableWidgetItem(
"00.00%");
542 pTableItemD->setFlags(Qt::ItemIsEnabled);
543 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount() - 1,
552 m_pUi->m_tableWidget_Frequencies->clear();
553 m_pUi->m_tableWidget_Frequencies->setRowCount(0);
554 m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(0,
new QTableWidgetItem(
"#Coil"));
555 m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(1,
new QTableWidgetItem(
"Frequency (Hz)"));
557 m_pUi->m_tableWidget_results->clear();
558 m_pUi->m_tableWidget_results->setRowCount(0);
559 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(0,
new QTableWidgetItem(
"#Coil"));
560 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(1,
new QTableWidgetItem(
"Error"));
561 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(2,
new QTableWidgetItem(
"GoF"));
574 QFile inFile(sFilePath);
575 if (inFile.open(QIODevice::ReadOnly)) {
576 QByteArray inArray = inFile.readAll();
586 QJsonArray presetData =
m_CoilPresets.object()[QString::number(iNumCoils)].toArray();
595 m_pUi->comboBox_coilPreset->clear();
596 m_pUi->comboBox_coilPreset->addItem(
"Load preset");
598 for (
const auto& entry : presetData) {
599 QString name = entry.toObject()[
"name"].toString();
600 QVector<int> vecCoils;
602 for (
const auto& coil : entry.toObject()[
"coils"].toArray()) {
603 vecCoils.append(coil.toInt());
606 m_pUi->comboBox_coilPreset->addItem(name, QVariant::fromValue(vecCoils));
614 if (iCoilPresetIndex < (
m_pUi->comboBox_coilPreset->count())) {
615 auto coilFreqData =
m_pUi->comboBox_coilPreset->itemData(iCoilPresetIndex);
616 if (!coilFreqData.isNull() && coilFreqData.canConvert<QVector<int>>()) {
#define FIFFV_POINT_EXTRA
#define FIFFV_POINT_CARDINAL
Container for the FIFF_DIG_POINT records of a measurement (a parsed FIFFB_ISOTRAK block).
Continuous HPI head-position-indicator configuration panel.
FIFF file I/O, in-memory data structures and high-level readers/writers.
2-D display widgets and visualisation helpers (charts, topography, colour maps).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
QVector< int > m_vCoilFreqs
void allowedRotationChanged(double dAllowedRotation)
void updateProcessingMode(ProcessingMode mode)
void sspStatusChanged(bool bChecked)
void updateDigitizerInfoGUI(const FIFFLIB::FiffDigPointSet &digSet)
bool getCompStatusChanged()
void fittingWindowSizeChanged(int iFitsPerSecond)
QJsonDocument m_CoilPresets
void setMovementResults(double dMovement, double dRotation)
void loadCoilPresets(const QString &sFilePath)
void coilFrequenciesChanged(const QVector< int > &vCoilFreqs)
bool continuousHPIChecked()
double getAllowedRotationChanged()
void newDigitizerList(QList< FIFFLIB::FiffDigPoint > pointList)
void addCoilFreqToGUI(int iCoilFreq)
void updateGuiMode(GuiMode mode)
void populatePresetGUI(const QJsonArray &presetData)
double getAllowedMovementChanged()
void setGoFLabels(const Eigen::VectorXd &vGoF, const double dMeanGof)
void compStatusChanged(bool bChecked)
bool getSspStatusChanged()
void setupCoilPresets(int iNumCoils)
void onFrequencyCellChanged(int row, int col)
void setErrorLabels(const QVector< double > &vError, const double dMeanErrorDist)
void addCoilErrorToGUI()
addCoilErrorToGUI
HpiSettingsView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void allowedMovementChanged(double dAllowedMovement)
void allowedMeanErrorDistChanged(double dAllowedMeanErrorDist)
void selectCoilPreset(int iCoilPresetIndex)
int getFittingWindowSize()
Ui::HpiSettingsViewWidget * m_pUi
QList< FIFFLIB::FiffDigPoint > readDigitizersFromFile(const QString &fileName)
double getAllowedMeanErrorDistChanged()
void digitizersChanged(const QList< FIFFLIB::FiffDigPoint > &lDigitzers, const QString &sFilePath)
void contHpiStatusChanged(bool bChecked)
Collection of FiffDigPoint records as parsed from a FIFFB_ISOTRAK block.
QList< FiffDigPoint > getList()