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(
" %"));
159 m_pUi->m_qLineEdit_moveResult->setText(QString::number(dMovement*1000,
'f',2) + QString(
" mm"));
160 m_pUi->m_qLineEdit_rotResult->setText(QString::number(dRotation,
'f',2) + QString(
" °"));
162 if(dMovement*1000 >
m_pUi->m_doubleSpinBox_moveThreshold->value() || dRotation >
m_pUi->m_doubleSpinBox_rotThreshold->value()) {
163 m_pUi->m_label_movementFeedback->setText(
"Big");
164 m_pUi->m_label_movementFeedback->setStyleSheet(
"QLabel { background-color : red;}");
166 m_pUi->m_label_movementFeedback->setText(
"Small");
167 m_pUi->m_label_movementFeedback->setStyleSheet(
"QLabel { background-color : green;}");
175 return m_pUi->m_checkBox_useSSP->isChecked();
182 return m_pUi->m_checkBox_useComp->isChecked();
189 return m_pUi->m_doubleSpinBox_maxHPIContinousDist->value();
196 return m_pUi->m_doubleSpinBox_moveThreshold->value();
203 return m_pUi->m_doubleSpinBox_rotThreshold->value();
210 return m_pUi->m_checkBox_continousHPI->isChecked();
217 return m_pUi->m_spinBox_samplesToFit->value();
228 QSettings settings(
"MNECPP");
230 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/coilFreqs"),
233 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/useSSP"),
234 QVariant::fromValue(
m_pUi->m_checkBox_useSSP->isChecked()));
236 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/useCOMP"),
237 QVariant::fromValue(
m_pUi->m_checkBox_useComp->isChecked()));
239 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/continousHPI"),\
240 QVariant::fromValue(
m_pUi->m_checkBox_continousHPI->isChecked()));
242 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/maxError"),
243 QVariant::fromValue(
m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()));
245 settings.setValue(
m_sSettingsPath + QString(
"/HpiSettingsView/fittingWindowSize"),
246 QVariant::fromValue(
m_pUi->m_spinBox_samplesToFit->value()));
257 QSettings settings(
"MNECPP");
258 QVariant defaultData;
264 m_pUi->m_checkBox_useSSP->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/useSSP"),
false).toBool());
265 m_pUi->m_checkBox_useComp->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/useCOMP"),
false).toBool());
266 m_pUi->m_checkBox_continousHPI->setChecked(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/continousHPI"),
false).toBool());
267 m_pUi->m_doubleSpinBox_maxHPIContinousDist->setValue(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/maxError"), 10.0).toDouble());
268 m_pUi->m_spinBox_samplesToFit->setValue(settings.value(
m_sSettingsPath + QString(
"/HpiSettingsView/fittingWindowSize"), 300).toInt());
300 QString fileName_HPI = QFileDialog::getOpenFileName(
this,
301 tr(
"Open digitizer file"),
303 tr(
"Fiff file (*.fif)"));
305 if(!fileName_HPI.isEmpty()) {
306 m_pUi->m_lineEdit_filePath->setText(fileName_HPI);
310 if (!fileName_HPI.isEmpty()) {
311 fileName_HPI = fileName_HPI.trimmed();
312 QFileInfo checkFile(fileName_HPI);
314 if (checkFile.exists() && checkFile.isFile()) {
316 m_pUi->m_checkBox_continousHPI->setChecked(
false);
320 msgBox.setText(
"File could not be loaded!");
336 if(QTableWidgetItem *pItem =
m_pUi->m_tableWidget_Frequencies->item(row, col)) {
337 if(pItem->text() ==
"none") {
351 if(
m_pUi->m_tableWidget_Frequencies->rowCount() + 1 >
m_pUi->m_label_numberLoadedCoils->text().toInt()) {
353 msgBox.setText(
"Cannot add more HPI coils. Not enough digitzed HPI coils loaded.");
359 m_pUi->m_tableWidget_Frequencies->insertRow(
m_pUi->m_tableWidget_Frequencies->rowCount());
360 QTableWidgetItem* pTableItemA =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
361 pTableItemA->setFlags(Qt::ItemIsEnabled);
362 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount()-1,
368 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount()-1,
370 new QTableWidgetItem(QString::number(
m_vCoilFreqs.at(
m_pUi->m_tableWidget_Frequencies->rowCount()-1))));
372 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount()-1,
374 new QTableWidgetItem(
"none"));
379 m_pUi->m_tableWidget_results->insertRow(
m_pUi->m_tableWidget_results->rowCount());
380 QTableWidgetItem* pTableItemB =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
381 pTableItemB->setFlags(Qt::ItemIsEnabled);
382 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
387 QTableWidgetItem* pTableItemC =
new QTableWidgetItem(
"0mm");
388 pTableItemC->setFlags(Qt::ItemIsEnabled);
389 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
394 QTableWidgetItem* pTableItemD =
new QTableWidgetItem(
"00.00");
395 pTableItemD->setFlags(Qt::ItemIsEnabled);
396 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
407 int row =
m_pUi->m_tableWidget_Frequencies->currentRow();
411 m_pUi->m_tableWidget_Frequencies->removeRow(row);
413 for (
int i = 0; i <
m_pUi->m_tableWidget_Frequencies->rowCount(); ++i) {
414 m_pUi->m_tableWidget_Frequencies->item(i, 0)->setText(QString::number(i+1));
417 m_pUi->m_tableWidget_results->removeRow(row);
419 for (
int i = 0; i <
m_pUi->m_tableWidget_results->rowCount(); ++i) {
420 m_pUi->m_tableWidget_results->item(i, 0)->setText(QString::number(i+1));
433 QFile t_fileDig(fileName);
455 qint16 numFiducials = 0;
457 qint16 numAdditional = 0;
459 for(
int i = 0; i < digSet.
size(); ++i) {
460 switch(digSet[i].kind) {
480 m_pUi->m_label_numberLoadedCoils->setNum(numHPI);
481 m_pUi->m_label_numberLoadedFiducials->setNum(numFiducials);
482 m_pUi->m_label_numberLoadedEEG->setNum(numEEG);
483 m_pUi->m_label_numberLoadedAdditional->setNum(numAdditional);
509 m_pUi->m_tableWidget_Frequencies->insertRow(
m_pUi->m_tableWidget_Frequencies->rowCount());
510 QTableWidgetItem* pTableItemA =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
511 pTableItemA->setFlags(Qt::ItemIsEnabled);
512 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount()-1,
517 m_pUi->m_tableWidget_Frequencies->setItem(
m_pUi->m_tableWidget_Frequencies->rowCount()-1,
519 new QTableWidgetItem(QString::number(iCoilFreq)));
527 m_pUi->m_tableWidget_results->insertRow(
m_pUi->m_tableWidget_results->rowCount());
528 QTableWidgetItem* pTableItemB =
new QTableWidgetItem(QString::number(
m_pUi->m_tableWidget_Frequencies->rowCount()));
529 pTableItemB->setFlags(Qt::ItemIsEnabled);
530 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
535 QTableWidgetItem* pTableItemC =
new QTableWidgetItem(
"0mm");
536 pTableItemC->setFlags(Qt::ItemIsEnabled);
537 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
542 QTableWidgetItem* pTableItemD =
new QTableWidgetItem(
"00.00%");
543 pTableItemD->setFlags(Qt::ItemIsEnabled);
544 m_pUi->m_tableWidget_results->setItem(
m_pUi->m_tableWidget_results->rowCount()-1,
553 m_pUi->m_tableWidget_Frequencies->clear();
554 m_pUi->m_tableWidget_Frequencies->setRowCount(0);
555 m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(0,
new QTableWidgetItem(
"#Coil"));
556 m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(1,
new QTableWidgetItem(
"Frequency (Hz)"));
558 m_pUi->m_tableWidget_results->clear();
559 m_pUi->m_tableWidget_results->setRowCount(0);
560 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(0,
new QTableWidgetItem(
"#Coil"));
561 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(1,
new QTableWidgetItem(
"Error"));
562 m_pUi->m_tableWidget_results->setHorizontalHeaderItem(2,
new QTableWidgetItem(
"GoF"));
577 QFile inFile(sFilePath);
578 if (inFile.open(QIODevice::ReadOnly)){
579 QByteArray inArray = inFile.readAll();
589 QJsonArray presetData =
m_CoilPresets.object()[QString::number(iNumCoils)].toArray();
598 m_pUi->comboBox_coilPreset->clear();
599 m_pUi->comboBox_coilPreset->addItem(
"Load preset");
601 for(
const auto& entry : presetData){
602 QString name = entry.toObject()[
"name"].toString();
605 for (
const auto& coil : entry.toObject()[
"coils"].toArray()){
606 data.append(coil.toInt());
609 m_pUi->comboBox_coilPreset->addItem(name, QVariant::fromValue(data));
617 if (iCoilPresetIndex < (
m_pUi->comboBox_coilPreset->count())){
618 auto coilFreqData =
m_pUi->comboBox_coilPreset->itemData(iCoilPresetIndex);
619 if (!coilFreqData.isNull() && coilFreqData.canConvert<QVector<int>>()){
Continuous HPI head-position-indicator configuration panel.
Container for the FIFF_DIG_POINT records of a measurement (a parsed FIFFB_ISOTRAK block).
#define FIFFV_POINT_EXTRA
#define FIFFV_POINT_CARDINAL
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()