22#include "ui_scalingview.h"
52const static float m_fScaleMAG = 1e-12f;
53const static float m_fScaleGRAD = 1e-15f;
54const static float m_fScaleEEG = 1e-5f;
55const static float m_fScaleEOG = 1e-6f;
56const static float m_fScaleECG = 1e-2f;
57const static float m_fScaleSTIM = 1e-3f;
58const static float m_fScaleMISC = 1e-3f;
59const static float m_fScaleEMG = 1e-3f;
60const static int MAG_TO_GRAD_LINK = 31337;
65 float fMaxScale(1e-9f);
67 switch (iChannelKind) {
70 fMaxScale = m_fScaleGRAD;
72 fMaxScale = m_fScaleMAG;
78 fMaxScale = m_fScaleMAG;
83 fMaxScale = m_fScaleEEG;
88 fMaxScale = m_fScaleECG;
92 fMaxScale = m_fScaleEMG;
96 fMaxScale = m_fScaleEOG;
101 fMaxScale = m_fScaleSTIM;
106 fMaxScale = m_fScaleMISC;
120 float fMaxScale = qMapChScaling.value(iChannelKind);
123 fMaxScale = qMapChScaling.value(iChannelUnit);
126 if (qIsNaN(fMaxScale) || fMaxScale == 0) {
139 const QStringList& lChannelsToShow)
141, m_lChannelTypesToShow(lChannelsToShow)
142, m_pUi(std::make_unique<Ui::ScalingViewWidget>())
143, m_bLinkMAGtoGRAD(false)
144, m_bIsShiftKeyPressed(false)
145, m_bManagingSpinBoxChange(false)
146, m_bManagingSliderChange(false)
147, m_bManagingLinkMagToGrad(false)
149 m_sSettingsPath = sSettingsPath;
150 m_pUi->setupUi(
this);
152 this->setWindowTitle(
"Scaling");
153 this->setMinimumWidth(230);
156 createScaleControls();
167 for (
auto& control : m_qMapScaleControls) {
174void ScalingView::keyReleaseEvent(QKeyEvent* event)
176 if (event->key() == Qt::Key_Shift) {
177 m_bIsShiftKeyPressed =
false;
179 QWidget::keyReleaseEvent(event);
184void ScalingView::keyPressEvent(QKeyEvent* event)
186 if (event->key() == Qt::Key_Shift) {
187 m_bIsShiftKeyPressed =
true;
189 QWidget::keyPressEvent(event);
196 return m_qMapChScaling;
203 m_qMapChScaling = qMapChScaling;
205 createScaleControls();
212 if (m_sSettingsPath.isEmpty()) {
216 QSettings settings(
"MNECPP");
219 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleMAG"), m_qMapChScaling[
FIFF_UNIT_T]);
223 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleGRAD"), m_qMapChScaling[
FIFF_UNIT_T_M]);
227 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleEEG"), m_qMapChScaling[
FIFFV_EEG_CH]);
231 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleEOG"), m_qMapChScaling[
FIFFV_EOG_CH]);
235 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleECG"), m_qMapChScaling[
FIFFV_ECG_CH]);
239 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleSTIM"), m_qMapChScaling[
FIFFV_STIM_CH]);
243 settings.setValue(m_sSettingsPath + QString(
"/ScalingView/scaleMISC"), m_qMapChScaling[
FIFFV_MISC_CH]);
251 if (m_sSettingsPath.isEmpty()) {
255 QSettings settings(
"MNECPP");
257 float val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleMAG"), m_fScaleMAG * 3).toFloat();
260 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleGRAD"), m_fScaleGRAD * 300 * 100 ).toFloat();
263 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleEEG"), m_fScaleEEG * 10).toFloat();
266 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleEOG"), m_fScaleEOG).toFloat();
269 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleECG"), m_fScaleECG).toFloat();
272 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleSTIM"), m_fScaleSTIM).toFloat();
275 val = settings.value(m_sSettingsPath + QString(
"/ScalingView/scaleMISC"), m_fScaleMISC).toFloat();
281void ScalingView::updateGuiMode(GuiMode mode)
293void ScalingView::updateProcessingMode(ProcessingMode mode)
305void ScalingView::processScalingChange()
313void ScalingView::updateMAGScale(
double dScale)
315 m_qMapChScaling.insert(
FIFF_UNIT_T, dScale * m_fScaleMAG);
317 processScalingChange();
322void ScalingView::linkMagToGrad()
324 if (m_bLinkMAGtoGRAD && !m_bManagingLinkMagToGrad) {
325 m_bManagingLinkMagToGrad =
true;
326 m_qMapScaleControls[
FIFF_UNIT_T_M]->setValue(m_qMapScaleControls[
FIFF_UNIT_T]->value() / (m_qMapScaleControls[MAG_TO_GRAD_LINK]->value() / 100.f));
327 m_bManagingLinkMagToGrad =
false;
333void ScalingView::linkGradToMag()
335 if (m_bLinkMAGtoGRAD && !m_bManagingLinkMagToGrad) {
336 m_bManagingLinkMagToGrad =
true;
337 m_qMapScaleControls[
FIFF_UNIT_T]->setValue(m_qMapScaleControls[
FIFF_UNIT_T_M]->value() * (m_qMapScaleControls[MAG_TO_GRAD_LINK]->value() / 100.0f));
338 m_bManagingLinkMagToGrad =
false;
344void ScalingView::updateGRADScale(
double dScale)
346 m_qMapChScaling.insert(
FIFF_UNIT_T_M, dScale * m_fScaleGRAD * 100.0);
348 processScalingChange();
353void ScalingView::updateEEGScale(
double dScale)
355 m_qMapChScaling.insert(
FIFFV_EEG_CH, dScale * m_fScaleEEG);
356 processScalingChange();
361void ScalingView::updateEOGScale(
double dScale)
363 m_qMapChScaling.insert(
FIFFV_EOG_CH, dScale * m_fScaleEOG);
364 processScalingChange();
369void ScalingView::updateEMGScale(
double dScale)
371 m_qMapChScaling.insert(
FIFFV_EMG_CH, dScale * m_fScaleEMG);
372 processScalingChange();
377void ScalingView::updateECGScale(
double dScale)
379 m_qMapChScaling.insert(
FIFFV_ECG_CH, dScale * m_fScaleECG);
380 processScalingChange();
385void ScalingView::updateMISCScale(
double dScale)
387 m_qMapChScaling.insert(
FIFFV_MISC_CH, dScale * m_fScaleMISC);
388 processScalingChange();
393void ScalingView::updateSTIMScale(
double scale)
396 processScalingChange();
401void ScalingView::updateMAGtoGRADlink(
double dScale)
410void ScalingView::drawScalingGUI()
421 for (
int c : controls) {
422 if (m_qMapScaleControls.contains(c)) {
423 m_pUi->verticalLayout->insertWidget(i++, m_qMapScaleControls[c].data());
426 createLinkMagGradCheckBox();
433 if (m_qMapScaleControls.contains(MAG_TO_GRAD_LINK)) {
434 m_bLinkMAGtoGRAD = (l == Qt::Checked);
436 m_bLinkMAGtoGRAD =
false;
438 if (m_bLinkMAGtoGRAD) {
439 m_qMapScaleControls[MAG_TO_GRAD_LINK]->setValue(100 * m_qMapScaleControls[
FIFF_UNIT_T]->value() / m_qMapScaleControls[
FIFF_UNIT_T_M]->value());
446void ScalingView::showLinkControl()
448 if (m_qMapScaleControls.contains(MAG_TO_GRAD_LINK)) {
449 m_qMapScaleControls[MAG_TO_GRAD_LINK]->setVisible(m_bLinkMAGtoGRAD);
455void ScalingView::createScaleControls()
458 if (m_qMapChScaling.contains(
FIFF_UNIT_T) && (m_lChannelTypesToShow.contains(
"mag") || m_lChannelTypesToShow.contains(
"all"))) {
459 QPointer<ScaleControl> pControlMAG = QPointer<ScaleControl>(
new ScaleControl(
"MAG [pT])"));
460 pControlMAG->setRange(0.2f, 20.0f);
461 pControlMAG->setMaxSensitivityPoint(1.5);
462 pControlMAG->setValue(m_qMapChScaling[
FIFF_UNIT_T] / m_fScaleMAG);
463 pControlMAG->setSensitivity(0.7f);
464 pControlMAG->invertSlider(
true);
466 m_qMapScaleControls.insert(
FIFF_UNIT_T, pControlMAG);
470 if (m_qMapChScaling.contains(
FIFF_UNIT_T_M) && (m_lChannelTypesToShow.contains(
"grad") || m_lChannelTypesToShow.contains(
"all"))) {
471 QPointer<ScaleControl> pControlGRAD = QPointer<ScaleControl>(
new ScaleControl(
"GRAD [fT/cm]"));
472 pControlGRAD->setRange(30.0f, 5000.0f);
473 pControlGRAD->setMaxSensitivityPoint(100.0f);
474 pControlGRAD->setValue(m_qMapChScaling[
FIFF_UNIT_T_M] / m_fScaleGRAD);
475 pControlGRAD->setSensitivity(0.7f);
476 pControlGRAD->invertSlider(
true);
483 QPointer<ScaleControl> pControlMAGtoGRADlink = QPointer<ScaleControl>(
new ScaleControl(
"MAG-GRAD link [cm]"));
484 pControlMAGtoGRADlink->setRange(0.10f, 8.0f);
485 pControlMAGtoGRADlink->setMaxSensitivityPoint(2.0f);
486 pControlMAGtoGRADlink->setValue(2.0f);
487 pControlMAGtoGRADlink->setSensitivity(0.7f);
489 pControlMAGtoGRADlink->setVisible(m_bLinkMAGtoGRAD);
490 m_qMapScaleControls.insert(MAG_TO_GRAD_LINK, pControlMAGtoGRADlink);
494 if (m_qMapChScaling.contains(
FIFFV_EEG_CH) && (m_lChannelTypesToShow.contains(
"eeg") || m_lChannelTypesToShow.contains(
"all"))) {
495 QPointer<ScaleControl> pControlEEG = QPointer<ScaleControl>(
new ScaleControl(
"EEG [uV]"));
496 pControlEEG->setRange(3.0f, 100.0f);
497 pControlEEG->setMaxSensitivityPoint(14.0f);
498 pControlEEG->setValue(m_qMapChScaling[
FIFFV_EEG_CH] / m_fScaleEEG);
499 pControlEEG->setSensitivity(0.4f);
500 pControlEEG->invertSlider(
true);
506 if (m_qMapChScaling.contains(
FIFFV_EOG_CH) && (m_lChannelTypesToShow.contains(
"eog") || m_lChannelTypesToShow.contains(
"all"))) {
507 QPointer<ScaleControl> pControlEOG = QPointer<ScaleControl>(
new ScaleControl(
"EOG [uV]"));
508 pControlEOG->setRange(3.0f, 100.0f);
509 pControlEOG->setMaxSensitivityPoint(14.0f);
510 pControlEOG->setValue(m_qMapChScaling[
FIFFV_EOG_CH] / m_fScaleEOG);
511 pControlEOG->setSensitivity(0.4f);
512 pControlEOG->invertSlider(
true);
518 if (m_qMapChScaling.contains(
FIFFV_ECG_CH) && (m_lChannelTypesToShow.contains(
"ecg") || m_lChannelTypesToShow.contains(
"all"))) {
519 QPointer<ScaleControl> pControlECG = QPointer<ScaleControl>(
new ScaleControl(
"ECG [uV]"));
520 pControlECG->setRange(3.0f, 100.0f);
521 pControlECG->setMaxSensitivityPoint(14.0f);
522 pControlECG->setValue(m_qMapChScaling[
FIFFV_ECG_CH] / m_fScaleECG);
523 pControlECG->setSensitivity(0.4f);
524 pControlECG->invertSlider(
true);
530 if (m_qMapChScaling.contains(
FIFFV_STIM_CH) && (m_lChannelTypesToShow.contains(
"stim") || m_lChannelTypesToShow.contains(
"all"))) {
531 QPointer<ScaleControl> pControlSTIM = QPointer<ScaleControl>(
new ScaleControl(
"STIM"));
532 pControlSTIM->setRange(1.0f, 99999.0f);
533 pControlSTIM->setMaxSensitivityPoint(5000.0f);
534 pControlSTIM->setValue(m_qMapChScaling[
FIFFV_STIM_CH] / m_fScaleSTIM);
535 pControlSTIM->setSensitivity(0.8f);
536 pControlSTIM->invertSlider(
true);
542 if (m_qMapChScaling.contains(
FIFFV_MISC_CH) && (m_lChannelTypesToShow.contains(
"misc") || m_lChannelTypesToShow.contains(
"all"))) {
543 QPointer<ScaleControl> pControlMISC = QPointer<ScaleControl>(
new ScaleControl(
"MISC"));
544 pControlMISC->setRange(3.0f, 100.0f);
545 pControlMISC->setMaxSensitivityPoint(14.0f);
546 pControlMISC->setValue(m_qMapChScaling[
FIFFV_MISC_CH] / m_fScaleMISC);
547 pControlMISC->setSensitivity(0.4f);
548 pControlMISC->invertSlider(
true);
562void ScalingView::createLinkMagGradCheckBox()
564 m_pCheckBox = QPointer<QCheckBox>(
new QCheckBox(
"Link MAGs -> GRADs"));
565 m_pCheckBox->setChecked(m_bLinkMAGtoGRAD);
567 m_pUi->verticalLayout->addWidget(m_pCheckBox);
Symbolic FIFF tag, block, value, unit and channel-type constants shared across FIFFLIB.
constexpr auto FIFF_UNIT_T_M
constexpr auto FIFFV_ECG_CH
constexpr auto FIFFV_MISC_CH
constexpr auto FIFFV_STIM_CH
constexpr auto FIFF_UNIT_T
constexpr auto FIFFV_EMG_CH
constexpr auto FIFFV_EOG_CH
constexpr auto FIFFV_REF_MEG_CH
Per-modality vertical-scale spinbox panel (one spin per channel type).
Composite slider + spinbox widget for picking a (possibly logarithmic) scale value.
2-D display widgets and visualisation helpers (charts, topography, colour maps).
float getScalingValue(const QMap< qint32, float > &qMapChScaling, int iChannelKind, int iChannelUnit)
float getDefaultScalingValue(int iChannelKind, int iChannelUnit)
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void valueChanged(double dScale)
void scalingChanged(const QMap< qint32, float > &scalingMap)
void saveSettings() override
void setMagGradLink(Qt::CheckState l)
void loadSettings() override
void clearView() override
ScalingView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget, const QStringList &lChannelsToShow=QStringList()<< "all")
void setScaleMap(const QMap< qint32, float > &qMapChScaling)
QMap< qint32, float > getScaleMap() const