MNE-CPP  0.1.9
A Framework for Electrophysiology
hpisettingsview.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "hpisettingsview.h"
41 
42 #include "ui_hpisettingsview.h"
43 
45 #include <fiff/fiff_dig_point.h>
46 #include <iostream>
47 
48 //=============================================================================================================
49 // QT INCLUDES
50 //=============================================================================================================
51 
52 #include <QFileInfo>
53 #include <QFileDialog>
54 #include <QMessageBox>
55 #include <QSettings>
56 #include <QJsonObject>
57 #include <QJsonArray>
58 
59 //=============================================================================================================
60 // EIGEN INCLUDES
61 //=============================================================================================================
62 
63 //=============================================================================================================
64 // USED NAMESPACES
65 //=============================================================================================================
66 
67 using namespace DISPLIB;
68 using namespace FIFFLIB;
69 
70 //=============================================================================================================
71 // DEFINE MEMBER METHODS
72 //=============================================================================================================
73 
74 HpiSettingsView::HpiSettingsView(const QString& sSettingsPath,
75  QWidget *parent,
76  Qt::WindowFlags f)
77 : AbstractView(parent, f)
78 , m_pUi(new Ui::HpiSettingsViewWidget)
79 {
80  m_sSettingsPath = sSettingsPath;
81  m_pUi->setupUi(this);
82 
83  connect(m_pUi->m_pushButton_loadDigitizers, &QPushButton::released,
85  connect(m_pUi->m_pushButton_doFreqOrder, &QPushButton::clicked,
87  connect(m_pUi->m_pushButton_doSingleFit, &QPushButton::clicked,
89  connect(m_pUi->m_tableWidget_Frequencies, &QTableWidget::cellChanged,
91  connect(m_pUi->m_pushButton_addCoil, &QPushButton::clicked,
93  connect(m_pUi->m_pushButton_removeCoil, &QPushButton::clicked,
95  connect(m_pUi->m_checkBox_useSSP, &QCheckBox::clicked,
97  connect(m_pUi->m_checkBox_useComp, &QCheckBox::clicked,
99  connect(m_pUi->m_checkBox_continousHPI, &QCheckBox::clicked,
101  connect(m_pUi->m_spinBox_samplesToFit, QOverload<int>::of(&QSpinBox::valueChanged),
103  connect(m_pUi->m_doubleSpinBox_maxHPIContinousDist, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
105  connect(m_pUi->m_doubleSpinBox_moveThreshold, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
107  connect(m_pUi->m_doubleSpinBox_rotThreshold, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
109  connect(m_pUi->comboBox_coilPreset, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
111 
112  //Init coil freqs
113  m_vCoilFreqs << 293 << 307 << 314 << 321;
114  qRegisterMetaTypeStreamOperators<QVector<int> >("QVector<int>");
115 
116  loadSettings();
117 }
118 
119 //=============================================================================================================
120 
121 HpiSettingsView::~HpiSettingsView()
122 {
123  saveSettings();
124 
125  delete m_pUi;
126 }
127 
128 //=============================================================================================================
129 
130 void HpiSettingsView::setErrorLabels(const QVector<double>& vError,
131  const double dMeanErrorDist)
132 {
133  //Update eror labels and change from m to mm
134  QString sGof("0mm");
135 
136  for(int i = 0; i < vError.size(); ++i) {
137  if(i < m_pUi->m_tableWidget_results->rowCount()) {
138  sGof = QString::number(vError[i]*1000,'f',2)+QString(" mm");
139  m_pUi->m_tableWidget_results->item(i, 1)->setText(sGof);
140  }
141  }
142 
143  m_pUi->m_label_averagedFitError->setText(QString::number(dMeanErrorDist*1000,'f',2)+QString(" mm"));
144 
145  //Update good/bad fit label
146  if(dMeanErrorDist*1000 > m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()) {
147  m_pUi->m_label_fitFeedback->setText("Last fit: Bad");
148  m_pUi->m_label_fitFeedback->setStyleSheet("QLabel { background-color : red;}");
149  } else {
150  m_pUi->m_label_fitFeedback->setText("Last fit: Good");
151  m_pUi->m_label_fitFeedback->setStyleSheet("QLabel { background-color : green;}");
152  }
153 }
154 
155 //=============================================================================================================
156 
157 void HpiSettingsView::setGoFLabels(const Eigen::VectorXd & vGoF,
158  const double dMeanGof)
159 {
160  //Update gof labels and change to %
161  QString sGof("00.00");
162 
163  for(int i = 0; i < vGoF.size(); ++i) {
164  if(i < m_pUi->m_tableWidget_results->rowCount()) {
165  sGof = QString::number(vGoF[i]*100,'f',2)+QString(" %");
166  m_pUi->m_tableWidget_results->item(i, 2)->setText(sGof);
167  }
168  }
169 
170  m_pUi->m_average_gof_set->setText(QString::number(dMeanGof*100,'f',2)+QString(" %"));
171 
172 }
173 
174 //=========================================================================================================
175 
177  double dRotation)
178 {
179  m_pUi->m_qLineEdit_moveResult->setText(QString::number(dMovement*1000,'f',2) + QString(" mm"));
180  m_pUi->m_qLineEdit_rotResult->setText(QString::number(dRotation,'f',2) + QString(" °"));
181 
182  if(dMovement*1000 > m_pUi->m_doubleSpinBox_moveThreshold->value() || dRotation > m_pUi->m_doubleSpinBox_rotThreshold->value()) {
183  m_pUi->m_label_movementFeedback->setText("Big");
184  m_pUi->m_label_movementFeedback->setStyleSheet("QLabel { background-color : red;}");
185  } else {
186  m_pUi->m_label_movementFeedback->setText("Small");
187  m_pUi->m_label_movementFeedback->setStyleSheet("QLabel { background-color : green;}");
188  }
189 }
190 
191 //=============================================================================================================
192 
194 {
195  return m_pUi->m_checkBox_useSSP->isChecked();
196 }
197 
198 //=============================================================================================================
199 
201 {
202  return m_pUi->m_checkBox_useComp->isChecked();
203 }
204 
205 //=============================================================================================================
206 
208 {
209  return m_pUi->m_doubleSpinBox_maxHPIContinousDist->value();
210 }
211 
212 //=============================================================================================================
213 
215 {
216  return m_pUi->m_doubleSpinBox_moveThreshold->value();
217 }
218 
219 //=============================================================================================================
220 
222 {
223  return m_pUi->m_doubleSpinBox_rotThreshold->value();
224 }
225 
226 //=============================================================================================================
227 
229 {
230  return m_pUi->m_checkBox_continousHPI->isChecked();
231 }
232 
233 
234 //=============================================================================================================
235 
237 {
238  return m_pUi->m_spinBox_samplesToFit->value();
239 }
240 
241 //=============================================================================================================
242 
244 {
245  if(m_sSettingsPath.isEmpty()) {
246  return;
247  }
248 
249  QSettings settings("MNECPP");
250 
251  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/coilFreqs"),
252  QVariant::fromValue(m_vCoilFreqs));
253 
254  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/useSSP"),
255  QVariant::fromValue(m_pUi->m_checkBox_useSSP->isChecked()));
256 
257  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/useCOMP"),
258  QVariant::fromValue(m_pUi->m_checkBox_useComp->isChecked()));
259 
260  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/continousHPI"),\
261  QVariant::fromValue(m_pUi->m_checkBox_continousHPI->isChecked()));
262 
263  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/maxError"),
264  QVariant::fromValue(m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()));
265 
266  settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"),
267  QVariant::fromValue(m_pUi->m_spinBox_samplesToFit->value()));
268 }
269 
270 //=============================================================================================================
271 
273 {
274  if(m_sSettingsPath.isEmpty()) {
275  return;
276  }
277 
278  QSettings settings("MNECPP");
279  QVariant defaultData;
280 
281  defaultData.setValue(m_vCoilFreqs);
282  m_vCoilFreqs = settings.value(m_sSettingsPath + QString("/HpiSettingsView/coilFreqs"), defaultData).value<QVector<int> >();
284 
285  m_pUi->m_checkBox_useSSP->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/useSSP"), false).toBool());
286  m_pUi->m_checkBox_useComp->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/useCOMP"), false).toBool());
287  m_pUi->m_checkBox_continousHPI->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/continousHPI"), false).toBool());
288  m_pUi->m_doubleSpinBox_maxHPIContinousDist->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/maxError"), 10.0).toDouble());
289  m_pUi->m_spinBox_samplesToFit->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), 300).toInt());
290 }
291 
292 //=============================================================================================================
293 
295 {
296  switch(mode) {
297  case GuiMode::Clinical:
298  break;
299  default: // default is research mode
300  break;
301  }
302 }
303 
304 //=============================================================================================================
305 
306 void HpiSettingsView::updateProcessingMode(ProcessingMode mode)
307 {
308  switch(mode) {
309  case ProcessingMode::Offline:
310  break;
311  default: // default is realtime mode
312  break;
313  }
314 }
315 
316 //=============================================================================================================
317 
319 {
320  //Get file location
321  QString fileName_HPI = QFileDialog::getOpenFileName(this,
322  tr("Open digitizer file"),
323  "",
324  tr("Fiff file (*.fif)"));
325 
326  if(!fileName_HPI.isEmpty()) {
327  m_pUi->m_lineEdit_filePath->setText(fileName_HPI);
328  }
329 
330  //Load Polhemus file
331  if (!fileName_HPI.isEmpty()) {
332  fileName_HPI = fileName_HPI.trimmed();
333  QFileInfo checkFile(fileName_HPI);
334 
335  if (checkFile.exists() && checkFile.isFile()) {
336  // Stop cont HPI first
337  m_pUi->m_checkBox_continousHPI->setChecked(false);
338  emit digitizersChanged(readDigitizersFromFile(fileName_HPI), fileName_HPI);
339  } else {
340  QMessageBox msgBox;
341  msgBox.setText("File could not be loaded!");
342  msgBox.exec();
343  return;
344  }
345  }
346 }
347 
348 //=============================================================================================================
349 
351  int col)
352 {
353  if(col != 1 || row >= m_vCoilFreqs.size()) {
354  return;
355  }
356 
357  if(QTableWidgetItem *pItem = m_pUi->m_tableWidget_Frequencies->item(row, col)) {
358  if(pItem->text() == "none") {
359  m_vCoilFreqs[row] = -1;
360  } else {
361  m_vCoilFreqs[row] = pItem->text().toInt();
362  }
363 
365  }
366 }
367 
368 //=============================================================================================================
369 
371 {
372  if(m_pUi->m_tableWidget_Frequencies->rowCount() + 1 > m_pUi->m_label_numberLoadedCoils->text().toInt()) {
373  QMessageBox msgBox;
374  msgBox.setText("Cannot add more HPI coils. Not enough digitzed HPI coils loaded.");
375  msgBox.exec();
376  return;
377  }
378 
379  // Add column 0 in freq table widget
380  m_pUi->m_tableWidget_Frequencies->insertRow(m_pUi->m_tableWidget_Frequencies->rowCount());
381  QTableWidgetItem* pTableItemA = new QTableWidgetItem(QString::number(m_pUi->m_tableWidget_Frequencies->rowCount()));
382  pTableItemA->setFlags(Qt::ItemIsEnabled);
383  m_pUi->m_tableWidget_Frequencies->setItem(m_pUi->m_tableWidget_Frequencies->rowCount()-1,
384  0,
385  pTableItemA);
386 
387  // Add column 1 in freq table widget
388  if(m_vCoilFreqs.size() >= m_pUi->m_tableWidget_Frequencies->rowCount()) {
389  m_pUi->m_tableWidget_Frequencies->setItem(m_pUi->m_tableWidget_Frequencies->rowCount()-1,
390  1,
391  new QTableWidgetItem(QString::number(m_vCoilFreqs.at(m_pUi->m_tableWidget_Frequencies->rowCount()-1))));
392  } else {
393  m_pUi->m_tableWidget_Frequencies->setItem(m_pUi->m_tableWidget_Frequencies->rowCount()-1,
394  1,
395  new QTableWidgetItem("none"));
396  m_vCoilFreqs.append(-1);
397  }
398 
399  // Add column 0 in error table widget (coil number)
400  m_pUi->m_tableWidget_results->insertRow(m_pUi->m_tableWidget_results->rowCount());
401  QTableWidgetItem* pTableItemB = new QTableWidgetItem(QString::number(m_pUi->m_tableWidget_Frequencies->rowCount()));
402  pTableItemB->setFlags(Qt::ItemIsEnabled);
403  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
404  0,
405  pTableItemB);
406 
407  // Add column 1 in error table widget (error)
408  QTableWidgetItem* pTableItemC = new QTableWidgetItem("0mm");
409  pTableItemC->setFlags(Qt::ItemIsEnabled);
410  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
411  1,
412  pTableItemC);
413 
414  // Add column 2 in error table widget (gof)
415  QTableWidgetItem* pTableItemD = new QTableWidgetItem("00.00");
416  pTableItemD->setFlags(Qt::ItemIsEnabled);
417  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
418  2,
419  pTableItemD);
420 
422 }
423 
424 //=============================================================================================================
425 
427 {
428  int row = m_pUi->m_tableWidget_Frequencies->currentRow();
429 
430  if(row >= 0 && row < m_vCoilFreqs.size()) {
431  m_vCoilFreqs.remove(row);
432  m_pUi->m_tableWidget_Frequencies->removeRow(row);
433 
434  for (int i = 0; i < m_pUi->m_tableWidget_Frequencies->rowCount(); ++i) {
435  m_pUi->m_tableWidget_Frequencies->item(i, 0)->setText(QString::number(i+1));
436  }
437 
438  m_pUi->m_tableWidget_results->removeRow(row);
439 
440  for (int i = 0; i < m_pUi->m_tableWidget_results->rowCount(); ++i) {
441  m_pUi->m_tableWidget_results->item(i, 0)->setText(QString::number(i+1));
442  }
443 
445  }
446 }
447 
448 //=============================================================================================================
449 
450 QList<FiffDigPoint> HpiSettingsView::readDigitizersFromFile(const QString& fileName)
451 {
452  clearCoilGUI();
453 
454  QFile t_fileDig(fileName);
455  FiffDigPointSet t_digSet(t_fileDig);
456  updateDigitizerInfoGUI(t_digSet);
457 
458  return t_digSet.getList();
459 }
460 
461 //=============================================================================================================
462 
463 void HpiSettingsView::newDigitizerList(QList<FIFFLIB::FiffDigPoint> pointList)
464 {
465  clearCoilGUI();
466 
467  FiffDigPointSet t_digSet(pointList);
468  updateDigitizerInfoGUI(t_digSet);
469 }
470 
471 //=============================================================================================================
472 
474 {
475  qint16 numHPI = 0;
476  qint16 numFiducials = 0;
477  qint16 numEEG = 0;
478  qint16 numAdditional = 0;
479 
480  for(int i = 0; i < digSet.size(); ++i) {
481  switch(digSet[i].kind) {
482  case FIFFV_POINT_HPI:
483  if(m_vCoilFreqs.size() <= numHPI) {
484  m_vCoilFreqs.append(-1);
485  }
486  numHPI++;
487  break;
488  case FIFFV_POINT_CARDINAL:
489  numFiducials++;
490  break;
491  case FIFFV_POINT_EEG:
492  numEEG++;
493  break;
494  case FIFFV_POINT_EXTRA:
495  numAdditional++;
496  break;
497  }
498  }
499 
500  //Set loaded number of digitizers
501  m_pUi->m_label_numberLoadedCoils->setNum(numHPI);
502  m_pUi->m_label_numberLoadedFiducials->setNum(numFiducials);
503  m_pUi->m_label_numberLoadedEEG->setNum(numEEG);
504  m_pUi->m_label_numberLoadedAdditional->setNum(numAdditional);
505 
506  m_vCoilFreqs.resize(numHPI);
507  populateCoilGUI();
508  setupCoilPresets(numHPI);
509 
510  // Make sure that the stored coil freqs always match the number of loaded ones
511  m_vCoilFreqs.resize(numHPI);
513 }
514 
515 //=============================================================================================================
516 
518 {
519  for(int iCoilFreq : m_vCoilFreqs){
520  addCoilFreqToGUI(iCoilFreq);
522  }
523 }
524 
525 //=============================================================================================================
526 
528 {
529  // Add column 0 in freq table widget
530  m_pUi->m_tableWidget_Frequencies->insertRow(m_pUi->m_tableWidget_Frequencies->rowCount());
531  QTableWidgetItem* pTableItemA = new QTableWidgetItem(QString::number(m_pUi->m_tableWidget_Frequencies->rowCount()));
532  pTableItemA->setFlags(Qt::ItemIsEnabled);
533  m_pUi->m_tableWidget_Frequencies->setItem(m_pUi->m_tableWidget_Frequencies->rowCount()-1,
534  0,
535  pTableItemA);
536 
537  // Add column 1 in freq table widget
538  m_pUi->m_tableWidget_Frequencies->setItem(m_pUi->m_tableWidget_Frequencies->rowCount()-1,
539  1,
540  new QTableWidgetItem(QString::number(iCoilFreq)));
541 }
542 
543 //=============================================================================================================
544 
546 {
547  // Add column 0 in error table widget
548  m_pUi->m_tableWidget_results->insertRow(m_pUi->m_tableWidget_results->rowCount());
549  QTableWidgetItem* pTableItemB = new QTableWidgetItem(QString::number(m_pUi->m_tableWidget_Frequencies->rowCount()));
550  pTableItemB->setFlags(Qt::ItemIsEnabled);
551  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
552  0,
553  pTableItemB);
554 
555  // Add column 1 in error table widget
556  QTableWidgetItem* pTableItemC = new QTableWidgetItem("0mm");
557  pTableItemC->setFlags(Qt::ItemIsEnabled);
558  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
559  1,
560  pTableItemC);
561 
562  // Add column 2 in error table widget
563  QTableWidgetItem* pTableItemD = new QTableWidgetItem("00.00%");
564  pTableItemD->setFlags(Qt::ItemIsEnabled);
565  m_pUi->m_tableWidget_results->setItem(m_pUi->m_tableWidget_results->rowCount()-1,
566  2,
567  pTableItemD);
568 }
569 
570 //=============================================================================================================
571 
573 {
574  m_pUi->m_tableWidget_Frequencies->clear();
575  m_pUi->m_tableWidget_Frequencies->setRowCount(0);
576  m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(0, new QTableWidgetItem("#Coil"));
577  m_pUi->m_tableWidget_Frequencies->setHorizontalHeaderItem(1, new QTableWidgetItem("Frequency (Hz)"));
578 
579  m_pUi->m_tableWidget_results->clear();
580  m_pUi->m_tableWidget_results->setRowCount(0);
581  m_pUi->m_tableWidget_results->setHorizontalHeaderItem(0, new QTableWidgetItem("#Coil"));
582  m_pUi->m_tableWidget_results->setHorizontalHeaderItem(1, new QTableWidgetItem("Error"));
583  m_pUi->m_tableWidget_results->setHorizontalHeaderItem(2, new QTableWidgetItem("GoF"));
584 
585 }
586 
587 //=============================================================================================================
588 
590 {
591 
592 }
593 
594 //==============================================void populateCoilGUI(int iNumCoils);===============================================================
595 
596 void HpiSettingsView::loadCoilPresets(const QString &sFilePath)
597 {
598  QFile inFile(sFilePath);
599  if (inFile.open(QIODevice::ReadOnly)){
600  QByteArray inArray = inFile.readAll();
601  m_CoilPresets = QJsonDocument::fromJson(inArray);
602  }
603 }
604 
605 //=============================================================================================================
606 
608 {
609  if(!m_CoilPresets.isNull()){
610  QJsonArray presetData = m_CoilPresets.object()[QString::number(iNumCoils)].toArray();
611  populatePresetGUI(presetData);
612  }
613 }
614 
615 //=============================================================================================================
616 
617 void HpiSettingsView::populatePresetGUI(const QJsonArray& presetData)
618 {
619  m_pUi->comboBox_coilPreset->clear();
620  m_pUi->comboBox_coilPreset->addItem("Load preset");
621 
622  for(const auto& entry : presetData){
623  QString name = entry.toObject()["name"].toString();
624  QVector<int> data;
625 
626  for (const auto& coil : entry.toObject()["coils"].toArray()){
627  data.append(coil.toInt());
628  }
629 
630  m_pUi->comboBox_coilPreset->addItem(name, QVariant::fromValue(data));
631  }
632 }
633 
634 //=============================================================================================================
635 
636 void HpiSettingsView::selectCoilPreset(int iCoilPresetIndex)
637 {
638  if (iCoilPresetIndex < (m_pUi->comboBox_coilPreset->count())){
639  auto coilFreqData = m_pUi->comboBox_coilPreset->itemData(iCoilPresetIndex);
640  if (!coilFreqData.isNull() && coilFreqData.canConvert<QVector<int>>()){
641  m_vCoilFreqs = coilFreqData.value<QVector<int>>();
642  clearCoilGUI();
643  populateCoilGUI();
644 
646  }
647  }
648 }
void loadCoilPresets(const QString &sFilePath)
void updateProcessingMode(ProcessingMode mode)
void setErrorLabels(const QVector< double > &vError, const double dMeanErrorDist)
void allowedRotationChanged(double dAllowedRotation)
QList< FiffDigPoint > getList()
void addCoilFreqToGUI(int iCoilFreq)
void sspStatusChanged(bool bChecked)
void populatePresetGUI(const QJsonArray &presetData)
void fittingWindowSizeChanged(int iFitsPerSecond)
Definition: applytoview.h:58
void addCoilErrorToGUI()
addCoilErrorToGUI
void setMovementResults(double dMovement, double dRotation)
Ui::HpiSettingsViewWidget * m_pUi
Holds a set of digitizer points.
void updateGuiMode(GuiMode mode)
HpiSettingsView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
FiffDigPointSet class declaration.
void allowedMovementChanged(double dAllowedMovement)
void onFrequencyCellChanged(int row, int col)
void allowedMeanErrorDistChanged(double dAllowedMeanErrorDist)
QList< FIFFLIB::FiffDigPoint > readDigitizersFromFile(const QString &fileName)
void compStatusChanged(bool bChecked)
void newDigitizerList(QList< FIFFLIB::FiffDigPoint > pointList)
void selectCoilPreset(int iCoilPresetIndex)
FiffDigPoint class declaration.
void contHpiStatusChanged(bool bChecked)
void digitizersChanged(const QList< FIFFLIB::FiffDigPoint > &lDigitzers, const QString &sFilePath)
The AbstractView class provides the base calss for all Disp viewers.
Definition: abstractview.h:75
void coilFrequenciesChanged(const QVector< int > &vCoilFreqs)
void setGoFLabels(const Eigen::VectorXd &vGoF, const double dMeanGof)
void updateDigitizerInfoGUI(const FIFFLIB::FiffDigPointSet &digSet)
HpiSettingsView class declaration.
void setupCoilPresets(int iNumCoils)