MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
artifactsettingsview.cpp
Go to the documentation of this file.
1//=============================================================================================================
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
40
41#include <fiff/fiff_ch_info.h>
42
43//=============================================================================================================
44// QT INCLUDES
45//=============================================================================================================
46
47#include <QSettings>
48#include <QLabel>
49#include <QGridLayout>
50#include <QCheckBox>
51#include <QDoubleSpinBox>
52#include <QSpinBox>
53#include <QDebug>
54
55//=============================================================================================================
56// EIGEN INCLUDES
57//=============================================================================================================
58
59//=============================================================================================================
60// USED NAMESPACES
61//=============================================================================================================
62
63using namespace DISPLIB;
64using namespace FIFFLIB;
65
66//=============================================================================================================
67// DEFINE MEMBER METHODS
68//=============================================================================================================
69
70ArtifactSettingsView::ArtifactSettingsView(const QString& sSettingsPath,
71 const QList<FiffChInfo>& fiffChInfoList,
72 QWidget *parent)
73: AbstractView(parent)
74, m_fiffChInfoList(fiffChInfoList)
75{
76 m_sSettingsPath = sSettingsPath;
77 qRegisterMetaType<QMap<QString,double> >("QMap<QString,double>");
78
79 this->setWindowTitle("Artifact Rejection Settings");
80 this->setMinimumWidth(330);
81 this->setMaximumWidth(330);
82
83 loadSettings();
84 redrawGUI();
85}
86
87//=============================================================================================================
88
94
95//=============================================================================================================
96
97void ArtifactSettingsView::setChInfo(const QList<FIFFLIB::FiffChInfo>& fiffChInfoList)
98{
99 m_fiffChInfoList = fiffChInfoList;
100
101 redrawGUI();
102 onChangeArtifactThreshold();
103}
104
105//=============================================================================================================
106
107QMap<QString,double> ArtifactSettingsView::getThresholdMap()
108{
109 return m_mapThresholds;
110}
111
112//=============================================================================================================
113
114void ArtifactSettingsView::setThresholdMap(const QMap<QString,double>& mapThresholds)
115{
116 m_mapThresholds = mapThresholds;
117
118 redrawGUI();
119 onChangeArtifactThreshold();
120}
121
122//=============================================================================================================
123
124bool ArtifactSettingsView::getDoArtifactThresholdRejection()
125{
126 if (m_pArtifactRejectionCheckBox) {
127 return m_pArtifactRejectionCheckBox->isChecked();
128 }
129
130 return false;
131}
132
133//=============================================================================================================
134
136{
137 if(m_sSettingsPath.isEmpty()) {
138 return;
139 }
140
141 // Save Settings
142 QSettings settings("MNECPP");
143
144 settings.setValue(m_sSettingsPath + QString("/ArtifactSettingsView/doArtifactThresholdReduction"), m_bDoArtifactThresholdReduction);
145
146 settings.beginGroup(m_sSettingsPath + QString("/ArtifactSettingsView/artifactThresholdsFirst"));
147 QMap<QString, double>::const_iterator itrFirst = m_mapThresholdsFirst.constBegin();
148 while (itrFirst != m_mapThresholdsFirst.constEnd()) {
149 settings.setValue(itrFirst.key(), itrFirst.value());
150 ++itrFirst;
151 }
152 settings.endGroup();
153
154 settings.beginGroup(m_sSettingsPath + QString("/ArtifactSettingsView/artifactThresholdsSecond"));
155 QMap<QString, int>::const_iterator itrSecond = m_mapThresholdsSecond.constBegin();
156 while (itrSecond != m_mapThresholdsSecond.constEnd()) {
157 settings.setValue(itrSecond.key(), itrSecond.value());
158 ++itrSecond;
159 }
160 settings.endGroup();
161}
162
163//=============================================================================================================
164
166{
167 if(m_sSettingsPath.isEmpty()) {
168 return;
169 }
170
171 // Load Settings
172 QSettings settings("MNECPP");
173
174 m_bDoArtifactThresholdReduction = settings.value(m_sSettingsPath + QString("/ArtifactSettingsView/doArtifactThresholdReduction"), false).toBool();
175
176 if(m_bDoArtifactThresholdReduction) {
177 m_mapThresholds["Active"] = 1.0;
178 } else {
179 m_mapThresholds["Active"] = 0.0;
180 }
181
182 m_mapThresholdsFirst["grad"] = 1.0;
183 m_mapThresholdsFirst["mag"] = 1.0;
184 m_mapThresholdsFirst["eeg"] = 1.0;
185 m_mapThresholdsFirst["ecg"] = 1.0;
186 m_mapThresholdsFirst["emg"] = 1.0;
187 m_mapThresholdsFirst["eog"] = 1.0;
188
189 m_mapThresholdsSecond["grad"] = -1;
190 m_mapThresholdsSecond["mag"] = -1;
191 m_mapThresholdsSecond["eeg"] = -1;
192 m_mapThresholdsSecond["ecg"] = -1;
193 m_mapThresholdsSecond["emg"] = -1;
194 m_mapThresholdsSecond["eog"] = -1;
195
196 settings.beginGroup(m_sSettingsPath + QString("/ArtifactSettingsView/artifactThresholdsFirst"));
197 QStringList keys = settings.childKeys();
198 foreach (QString key, keys) {
199 m_mapThresholdsFirst.insert(key, settings.value(key, 1.0).toDouble());
200 }
201 settings.endGroup();
202
203 settings.beginGroup(m_sSettingsPath + QString("/ArtifactSettingsView/artifactThresholdsSecond"));
204 keys = settings.childKeys();
205 foreach (QString key, keys) {
206 m_mapThresholdsSecond.insert(key, settings.value(key, -1).toInt());
207 }
208 settings.endGroup();
209}
210
211//=============================================================================================================
212
214{
215 switch(mode) {
216 case GuiMode::Clinical:
217 break;
218 default: // default is research mode
219 break;
220 }
221}
222
223//=============================================================================================================
224
226{
227 switch(mode) {
228 case ProcessingMode::Offline:
229 break;
230 default: // default is realtime mode
231 break;
232 }
233}
234
235//=============================================================================================================
236
238{
239 if(QLayout* layout = this->layout()) {
240 delete layout;
241 }
242
243 QGridLayout* pGroupBoxArtifactRejection = new QGridLayout();
244 this->setLayout(pGroupBoxArtifactRejection);
245
246 //Artifact rejection
247 if(!m_fiffChInfoList.isEmpty()) {
248 QStringList channelTypes;
249 int kind, unit;
250
251 for(int i = 0; i < m_fiffChInfoList.size(); ++i) {
252 kind = m_fiffChInfoList.at(i).kind;
253 unit = m_fiffChInfoList.at(i).unit;
254
255 if(kind == FIFFV_MEG_CH && unit == FIFF_UNIT_T_M && !channelTypes.contains("grad")) {
256 channelTypes << "grad";
257 }
258 if(kind == FIFFV_MEG_CH && unit == FIFF_UNIT_T && !channelTypes.contains("mag")) {
259 channelTypes << "mag";
260 }
261 if(kind == FIFFV_EEG_CH && !channelTypes.contains("eeg", Qt::CaseInsensitive)) {
262 channelTypes << "eeg";
263 }
264 if(kind == FIFFV_EOG_CH && !channelTypes.contains("eog", Qt::CaseInsensitive)) {
265 channelTypes << "eog";
266 }
267 if(kind == FIFFV_EMG_CH && !channelTypes.contains("emg", Qt::CaseInsensitive)) {
268 channelTypes << "emg";
269 }
270 if(kind == FIFFV_ECG_CH && !channelTypes.contains("ecg", Qt::CaseInsensitive)) {
271 channelTypes << "ecg";
272 }
273 }
274
275 if(!channelTypes.isEmpty()) {
276 m_pArtifactRejectionCheckBox = new QCheckBox("Activate artifact rejection");
277 pGroupBoxArtifactRejection->addWidget(m_pArtifactRejectionCheckBox,0,0,1,2);
278 m_pArtifactRejectionCheckBox->setChecked(m_bDoArtifactThresholdReduction);
279 connect(m_pArtifactRejectionCheckBox.data(), &QCheckBox::clicked,
280 this, &ArtifactSettingsView::onChangeArtifactThreshold);
281
282 for(int i = 0; i < channelTypes.size(); ++i) {
283 QLabel* pLabel = new QLabel(channelTypes.at(i));
284 pGroupBoxArtifactRejection->addWidget(pLabel,i+1,0);
285
286 QDoubleSpinBox* pDoubleSpinBox = new QDoubleSpinBox();
287 pDoubleSpinBox->setPrefix("+/-");
288 pDoubleSpinBox->setMinimum(0.0);
289 pDoubleSpinBox->setMaximum(100000.0);
290 pDoubleSpinBox->setValue(m_mapThresholdsFirst[channelTypes.at(i)]);
291 pGroupBoxArtifactRejection->addWidget(pDoubleSpinBox,i+1,1);
292 connect(pDoubleSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
293 this, &ArtifactSettingsView::onChangeArtifactThreshold);
294 m_mapChThresholdsDoubleSpinBoxes[channelTypes.at(i)] = pDoubleSpinBox;
295
296 QSpinBox* pSpinBox = new QSpinBox();
297 pSpinBox->setPrefix("e");
298 pSpinBox->setMaximum(0);
299 pSpinBox->setMinimum(-10000);
300 pSpinBox->setValue(m_mapThresholdsSecond[channelTypes.at(i)]);
301 pGroupBoxArtifactRejection->addWidget(pSpinBox,i+1,2);
302 connect(pSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
303 this, &ArtifactSettingsView::onChangeArtifactThreshold);
304 m_mapChThresholdsSpinBoxes[channelTypes.at(i)] = pSpinBox;
305 }
306 }
307 }
308}
309
310//=============================================================================================================
311
312void ArtifactSettingsView::onChangeArtifactThreshold()
313{
314 m_mapThresholds.clear();
315 m_mapThresholdsFirst.clear();
316 m_mapThresholdsSecond.clear();
317
318 if(m_pArtifactRejectionCheckBox) {
319 if(m_pArtifactRejectionCheckBox->isChecked()) {
320 m_mapThresholds["Active"] = 1.0;
321 m_bDoArtifactThresholdReduction = true;
322 } else {
323 m_mapThresholds["Active"] = 0.0;
324 m_bDoArtifactThresholdReduction = false;
325 }
326 }
327
328 QMapIterator<QString, QDoubleSpinBox*> i(m_mapChThresholdsDoubleSpinBoxes);
329
330 while (i.hasNext()) {
331 i.next();
332 if(i.value()) {
333 m_mapThresholdsFirst[i.key()] = i.value()->value();
334 m_mapThresholdsSecond[i.key()] = m_mapChThresholdsSpinBoxes[i.key()]->value();
335
336 if(i.key().contains("grad", Qt::CaseInsensitive)) {
337 m_mapThresholds["grad"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
338 }
339 if(i.key().contains("mag", Qt::CaseInsensitive)) {
340 m_mapThresholds["mag"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
341 }
342 if(i.key().contains("eeg", Qt::CaseInsensitive)) {
343 m_mapThresholds["eeg"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
344 }
345 if(i.key().contains("ecg", Qt::CaseInsensitive)) {
346 m_mapThresholds["ecg"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
347 }
348 if(i.key().contains("eog", Qt::CaseInsensitive)) {
349 m_mapThresholds["eog"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
350 }
351 if(i.key().contains("emg", Qt::CaseInsensitive)) {
352 m_mapThresholds["emg"] = i.value()->value() * pow(10, m_mapChThresholdsSpinBoxes[i.key()]->value());
353 }
354 }
355 }
356
357 emit changeArtifactThreshold(m_mapThresholds);
358
359 saveSettings();
360}
361
362//=============================================================================================================
363
Declaration of the ArtifactSettingsView class.
FiffChInfo class declaration.
The AbstractView class provides the base calss for all Disp viewers.
void updateProcessingMode(ProcessingMode mode)