48 #include "mainwindow.h"
49 #include "ui_mainwindow.h"
56 #include <QTableWidgetItem>
57 #include <QFileDialog>
58 #include <QHeaderView>
59 #include <QMessageBox>
61 #include <QtConcurrent>
62 #include <qtconcurrentrun.h>
85 fiff_int_t _first_sample;
86 fiff_int_t _last_sample;
87 fiff_int_t _press_pos;
94 qreal _signal_maximum;
95 qreal _signal_negative_scale;
96 qreal _border_margin_height;
97 qint32 _x_axis_height;
99 QList<QColor> _colors;
100 QStringList _matlab_channels;
101 MatrixXd _signal_matrix;
102 MatrixXd _atom_sum_matrix;
103 MatrixXd _residuum_matrix;
106 QTimer *_counter_timer;
120 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new
Ui::
MainWindow)
124 this->setMinimumSize(1280, 640);
126 callGraphWindow->setMouseTracking(
true);
127 callGraphWindow->setMinimumHeight(140);
128 callGraphWindow->setMinimumWidth(500);
129 ui->l_Graph->addWidget(callGraphWindow);
131 connect(callGraphWindow, SIGNAL(read_new()),
this, SLOT(on_mouse_button_release()));
134 callAtomSumWindow->setMouseTracking(
true);
135 callAtomSumWindow->setMinimumHeight(140);
136 callAtomSumWindow->setMinimumWidth(500);
137 ui->l_atoms->addWidget(callAtomSumWindow);
140 callResidumWindow->setMouseTracking(
true);
141 callResidumWindow->setMinimumHeight(140);
142 callResidumWindow->setMinimumWidth(500);
143 ui->l_res->addWidget(callResidumWindow);
146 callXAxisWindow->setMaximumHeight(0);
147 callXAxisWindow->setToolTip(
"timeline");
148 ui->l_XAxis->addWidget(callXAxisWindow);
150 ui->progressBarCalc->setHidden(
true);
151 ui->progress_bar_save->setHidden(
true);
153 ui->splitter->setStretchFactor(1,4);
155 ui->lb_from->setHidden(
true);
156 ui->dsb_from->setHidden(
true);
157 ui->lb_to->setHidden(
true);
158 ui->dsb_to->setHidden(
true);
159 ui->lb_samples->setHidden(
true);
160 ui->sb_sample_count->setHidden(
true);
161 ui->cb_all_select->setHidden(
true);
162 ui->lb_timer->setHidden(
true);
165 ui->tbv_Results->setColumnCount(5);
166 ui->tbv_Results->setHorizontalHeaderLabels(QString(
"energy\n[%];scale\n[sec];trans\n[sec];modu\n[Hz];phase\n[rad]").split(
";"));
167 ui->tbv_Results->setColumnWidth(0,55);
168 ui->tbv_Results->setColumnWidth(1,45);
169 ui->tbv_Results->setColumnWidth(2,40);
170 ui->tbv_Results->setColumnWidth(3,40);
171 ui->tbv_Results->setColumnWidth(4,40);
174 is_calulating =
false;
177 _counter_timer =
new QTimer();
179 this->cb_model =
new QStandardItemModel;
180 connect(this->cb_model, SIGNAL(dataChanged (
const QModelIndex&,
const QModelIndex&)),
this, SLOT(cb_selection_changed(
const QModelIndex&,
const QModelIndex&)));
181 connect(ui->tbv_Results->model(), SIGNAL(dataChanged (
const QModelIndex&,
const QModelIndex&)),
this, SLOT(tbv_selection_changed(
const QModelIndex&,
const QModelIndex&)));
182 connect(_counter_timer, SIGNAL(timeout()),
this, SLOT(on_time_out()));
184 qRegisterMetaType<source_file_type>(
"source_file_type");
185 qRegisterMetaType<Eigen::MatrixXd>(
"MatrixXd");
186 qRegisterMetaType<Eigen::VectorXd>(
"VectorXd");
187 qRegisterMetaType<Eigen::RowVectorXi>(
"RowVectorXi");
188 qRegisterMetaType<adaptive_atom_list>(
"adaptive_atom_list");
189 qRegisterMetaType<fix_dict_atom_list>(
"fix_dict_atom_list");
190 qRegisterMetaType<FIFFLIB::fiff_int_t>(
"fiff_int_t");
191 qRegisterMetaType<select_map>(
"select_map");
193 QDir dir(QDir::homePath() +
"/" +
"Matching-Pursuit-Toolbox");
194 if(!dir.exists())dir.mkdir(
".");
195 fill_dict_combobox();
198 move(settings.value(
"pos", QPoint(200, 200)).toPoint());
199 resize(settings.value(
"size", QSize(1050, 700)).toSize());
200 this->restoreState(settings.value(
"window_state").toByteArray());
201 ui->splitter->restoreState(settings.value(
"splitter_sizes").toByteArray());
202 last_open_path = settings.value(
"last_open_path", QDir::homePath()+
"/" +
"Matching-Pursuit-Toolbox").toString();
203 last_save_path = settings.value(
"last_save_path", QDir::homePath()+
"/" +
"Matching-Pursuit-Toolbox").toString();
206 if(!settings.value(
"show_infos",
true).toBool())
208 ui->lb_info_content->setHidden(
true);
209 ui->lb_info->setHidden(
true);
210 ui->lb_figure_of_merit->setHidden(
true);
216 MainWindow::~MainWindow()
218 if(_editor_window != NULL)
219 delete _editor_window;
220 if(_enhanced_editor_window != NULL)
221 delete _enhanced_editor_window;
222 if(_setting_window != NULL)
223 delete _setting_window;
224 if(_formula_editor != NULL)
225 delete _formula_editor;
226 if(_treebased_dict_window != NULL)
227 delete _treebased_dict_window;
229 delete callAtomSumWindow;
230 delete callGraphWindow;
231 delete callResidumWindow;
232 delete callXAxisWindow;
234 delete this->cb_model;
240 SaveFifFile::SaveFifFile(){}
244 SaveFifFile::~SaveFifFile(){}
248 void MainWindow::closeEvent(QCloseEvent * event)
251 if(ui->progress_bar_save->isVisible())
253 if(QMessageBox::question(
this,
"warning",
"Saving fif-file is still in progress. Are you sure you want to quit?") == QMessageBox::Yes)
264 if(QMessageBox::question(
this,
"warning",
"Calculation is still in progress. Are you sure you want to quit?") == QMessageBox::Yes)
274 if(settings.value(
"show_warnings",
true).toBool() && !is_saved)
276 QString text =
"Warning, your changes have not been saved.\nTo close this window and discard your changes\nclick OK otherwise click Cancel and save the current changes.";
278 msg_box->setModal(
true);
279 qint32 result = msg_box->exec();
296 if(!this->isMaximized())
298 settings.setValue(
"pos", pos());
299 settings.setValue(
"size", size());
301 settings.setValue(
"splitter_sizes", ui->splitter->saveState());
302 settings.setValue(
"window_state", this->saveState());
303 settings.setValue(
"maximized", this->isMaximized());
304 settings.setValue(
"last_open_path", last_open_path);
305 settings.setValue(
"last_save_path", last_save_path);
311 void MainWindow::open_file()
313 QString temp_file_name = QFileDialog::getOpenFileName(
this,
"Please select signal file.", last_open_path,
"(*.fif *.txt)");
314 if(temp_file_name.isNull())
return;
316 QStringList string_list = temp_file_name.split(
'/');
318 for(qint32 i = 0; i < string_list.length() - 1; i++)
319 last_open_path += string_list.at(i) +
'/';
320 file_name = temp_file_name;
321 this->cb_model->clear();
322 this->cb_items.clear();
324 this->setWindowTitle(string_list.last().append(
" - Matching-Pursuit-Toolbox"));
326 ui->dsb_sample_rate->setEnabled(
true);
328 QFile file(file_name);
329 if (!file.open(QIODevice::ReadOnly))
331 QMessageBox::warning(
this, tr(
"Error"),
332 tr(
"error: unable to open signal file."));
333 this->setWindowTitle(
"Matching-Pursuit-Toolbox");
339 _colors.append(QColor(0, 0, 0));
340 _pick_evoked.
clear();
343 if(file_name.endsWith(
".fif", Qt::CaseInsensitive))
347 if(!read_fiff_ave(file_name))
348 if(!read_fiff_file(file_name))
350 this->setWindowTitle(
"Matching-Pursuit-Toolbox");
355 ui->dsb_sample_rate->setEnabled(
false);
361 if(!read_matlab_file(file_name))
363 this->setWindowTitle(
"Matching-Pursuit-Toolbox");
368 ui->dsb_sample_rate->setEnabled(
true);
372 original_signal_matrix = _signal_matrix;
373 fill_channel_combobox();
374 read_fiff_changed =
true;
378 last_sample_count = _to - _from + 1;
380 ui->dsb_from->setMaximum((_last_sample - 63) / _sample_rate);
381 ui->dsb_to->setMinimum((_first_sample + 63) / _sample_rate);
382 ui->lb_from->setToolTip(QString(
"minimum: %1 seconds").arg(_first_sample / _sample_rate));
383 ui->lb_to->setToolTip(QString(
"maximum: %1 seconds").arg(_last_sample / _sample_rate));
384 ui->dsb_from->setToolTip(QString(
"sample: %1").arg(_from));
385 ui->dsb_to->setToolTip(QString(
"sample: %1").arg(_to));
386 ui->sb_sample_count->setToolTip(QString(
"epoch: %1 sec").arg((_to - _from + 1) / _sample_rate));
387 ui->lb_samples->setToolTip(QString(
"min: 64 (%1 sec)\nmax: 4096 (%2 sec)").arg(64 / _sample_rate).arg(4096 / _sample_rate));
389 ui->dsb_from->setValue((_from / _sample_rate) + _offset_time);
390 ui->dsb_to->setValue(_to / _sample_rate + _offset_time);
391 _samplecount = _to - _from + 1;
392 ui->sb_sample_count->setValue(_to - _from + 1);
394 read_fiff_changed =
false;
396 ui->lb_from->setHidden(
false);
397 ui->dsb_from->setHidden(
false);
398 ui->lb_to->setHidden(
false);
399 ui->dsb_to->setHidden(
false);
400 ui->lb_samples->setHidden(
false);
401 ui->sb_sample_count->setHidden(
false);
402 ui->tbv_Results->setRowCount(0);
403 ui->lb_figure_of_merit->setHidden(
true);
404 callXAxisWindow->setMinimumHeight(22);
405 callXAxisWindow->setMaximumHeight(22);
408 _atom_sum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
409 _residuum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
411 ui->progressBarCalc->reset();
412 ui->progressBarCalc->setVisible(
false);
413 ui->lb_signal_energy->clear();
414 ui->lb_approx_energy->clear();
415 ui->lb_residual_energy->clear();
416 ui->lb_signal_energy_text->clear();
417 ui->lb_approx_energy_text->clear();
418 ui->lb_residual_energy_text->clear();
419 ui->lb_info_content->clear();
420 ui->cb_all_select->setHidden(
true);
421 ui->lb_timer->setHidden(
true);
422 ui->actionSpeicher->setEnabled(
false);
423 ui->actionSpeicher_unter->setEnabled(
false);
424 ui->actionExport->setEnabled(
false);
425 if(_signal_matrix.cols() == 0) ui->btt_Calc->setEnabled(
false);
426 else ui->btt_Calc->setEnabled(
true);
436 bool MainWindow::read_fiff_ave(QString file_name)
438 QFile t_fileEvoked(file_name);
440 fiff_int_t setno = 0;
441 QPair<QVariant, QVariant> baseline(QVariant(), 0);
442 FiffEvoked evoked(t_fileEvoked, setno, baseline);
447 QMap<QString, QVariant> chn_name_map;
448 for(qint32 m = 0; m < 4; m++)
449 chn_name_map.insert(QString(
"MEG;EEG;STI;EOG").split(
';').at(m),
true);
450 chn_name_map = settings.value(
"channel_names", chn_name_map).toMap();
452 QStringList pick_list;
454 QMap<QString, QVariant>::const_iterator i;
455 for (i = chn_name_map.constBegin(); i != chn_name_map.constEnd(); ++i)
456 if(i.value().toBool())
457 pick_list.append(i.key());
461 include <<
"STI 014";
462 bool want_meg = chn_name_map[
"MEG"].toBool();
463 bool want_eeg = chn_name_map[
"EEG"].toBool();
464 bool want_stim = chn_name_map[
"STI"].toBool();
467 QStringList filter_list;
468 for(qint32 i = 0; i < evoked.info.ch_names.length(); i++)
470 for(qint32 k = 0; k < pick_list.length(); k++)
471 if(evoked.info.ch_names.at(i).contains(pick_list.at(k)))
472 filter_list.append(evoked.info.ch_names.at(i));
476 picks = _pick_evoked.
info.
pick_types(want_meg, want_eeg, want_stim);
482 ui->dsb_sample_rate->setValue(_pick_evoked.
info.
sfreq);
486 _signal_matrix = MatrixXd::Zero(_pick_evoked.
data.cols(), _pick_evoked.
data.rows());
488 for(qint32 channels = 0; channels < _pick_evoked.
data.rows(); channels++)
489 _signal_matrix.col(channels) = _pick_evoked.
data.row(channels);
492 _offset_time = _pick_evoked.
times[0];
494 _first_sample = _pick_evoked.
first;
495 _to = _signal_matrix.rows() - 1;
496 _last_sample = _pick_evoked.
last;
498 reference_matrix = _signal_matrix;
506 void MainWindow::read_fiff_ave_new()
508 qint32 row_number = 0;
509 qint32 selected_chn = 0;
512 for(qint32 i = 0; i < reference_matrix.cols(); i++)
513 if(select_channel_map[i] ==
true)
516 _signal_matrix = MatrixXd::Zero(_to - _from, size);
519 for(qint32 channels = 0; channels < reference_matrix.cols(); channels++)
520 if(select_channel_map[channels] ==
true)
523 _colors.append(original_colors.at(channels));
524 for(qint32 i = _from; i < _to; i++)
526 _signal_matrix(row_number, selected_chn) = reference_matrix(i, channels);
533 original_signal_matrix = MatrixXd::Zero(_signal_matrix.rows(), reference_matrix.cols());
534 for(qint32 channels = 0; channels < reference_matrix.cols(); channels++)
537 for(qint32 i = _from; i < _to; i++ )
539 original_signal_matrix(row_number, channels) = reference_matrix(i, channels);
544 _atom_sum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
545 _residuum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
547 ui->tbv_Results->clearContents();
548 ui->tbv_Results->setRowCount(0);
549 ui->actionSpeicher->setEnabled(
false);
550 ui->actionSpeicher_unter->setEnabled(
false);
551 ui->lb_info_content->clear();
552 ui->cb_all_select->setHidden(
true);
553 ui->lb_timer->setHidden(
true);
554 ui->progressBarCalc->setHidden(
true);
555 ui->actionExport->setEnabled(
false);
556 ui->lb_figure_of_merit->setHidden(
true);
557 ui->lb_signal_energy->clear();
558 ui->lb_approx_energy->clear();
559 ui->lb_residual_energy->clear();
560 ui->lb_signal_energy_text->clear();
561 ui->lb_approx_energy_text->clear();
562 ui->lb_residual_energy_text->clear();
571 bool MainWindow::read_fiff_file(QString fileName)
574 QFile t_fileRaw(fileName);
579 QMap<QString, QVariant> chn_name_map;
580 for(qint32 m = 0; m < 4; m++)
581 chn_name_map.insert(QString(
"MEG;EEG;STI;EOG").split(
';').at(m),
true);
583 chn_name_map = settings.value(
"channel_names", chn_name_map).toMap();
586 for(qint32 k = 0; k < raw.info.ch_names.length(); k++)
588 bool found_no_new_name =
false;
589 next_name = raw.info.ch_names.at(k).split(
" ").first();
590 if(chn_name_map.contains(next_name))
592 found_no_new_name =
true;
595 if(!found_no_new_name)
596 chn_name_map.insert(next_name,
true);
599 settings.setValue(
"channel_names", chn_name_map);
603 include <<
"STI 014";
604 bool want_meg = chn_name_map[
"MEG"].toBool();
605 bool want_eeg = chn_name_map[
"EEG"].toBool();
606 bool want_stim = chn_name_map[
"STI"].toBool();
608 picks = raw.info.pick_types(want_meg, want_eeg, want_stim);
611 _first_sample = raw.first_samp;
612 _last_sample = raw.last_samp;
616 _from = _first_sample;
617 if(_from + 511 <= _last_sample) _to = _from + 511;
618 else _to = _last_sample;
621 ui->dsb_sample_rate->setValue(raw.info.sfreq);
622 _sample_rate = raw.info.sfreq;
624 pick_info = raw.info.pick_info(picks);
627 if (!raw.read_raw_segment(datas, times, _from, _to, picks))
629 QMessageBox::critical(
this,
"Error",
"error reading fif-file. Could not read raw segment.");
630 printf(
"Could not read raw segment.\n");
633 printf(
"Read %d samples.\n",(qint32)datas.cols());
636 _signal_matrix = MatrixXd::Zero(datas.cols(),datas.rows());
638 for(qint32 channels = 0; channels < datas.rows(); channels++)
639 _signal_matrix.col(channels) = datas.row(channels);
647 void MainWindow::read_fiff_file_new(QString file_name)
649 qint32 selected_chn = 0;
650 read_fiff_file(file_name);
651 original_signal_matrix = _signal_matrix;
654 for(qint32 i = 0; i < original_signal_matrix.cols(); i++)
655 if(select_channel_map[i] ==
true)
659 _signal_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
661 for(qint32 channels = 0; channels < original_signal_matrix.cols(); channels++)
662 if(select_channel_map[channels] ==
true)
664 _colors.append(original_colors.at(channels));
665 _signal_matrix.col(selected_chn) = original_signal_matrix.col(channels);
669 _atom_sum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
670 _residuum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
672 ui->tbv_Results->clearContents();
673 ui->tbv_Results->setRowCount(0);
674 ui->actionSpeicher->setEnabled(
false);
675 ui->actionSpeicher_unter->setEnabled(
false);
676 ui->lb_info_content->clear();
677 ui->cb_all_select->setHidden(
true);
678 ui->lb_timer->setHidden(
true);
679 ui->progressBarCalc->setHidden(
true);
680 ui->actionExport->setEnabled(
false);
681 ui->lb_figure_of_merit->setHidden(
true);
682 ui->lb_signal_energy->clear();
683 ui->lb_approx_energy->clear();
684 ui->lb_residual_energy->clear();
685 ui->lb_signal_energy_text->clear();
686 ui->lb_approx_energy_text->clear();
687 ui->lb_residual_energy_text->clear();
696 bool MainWindow::read_matlab_file(QString fileName)
698 QFile file(fileName);
699 file.open(QIODevice::ReadOnly);
701 QTextStream stream(&file);
704 _matlab_channels = stream.readAll().split(
'\n', QString::SkipEmptyParts);
706 for(qint32 k = 0; k < _matlab_channels.length(); k++)
708 qint32 row_number = 0;
709 QStringList signal_samples = _matlab_channels.at(k).split(
',', QString::SkipEmptyParts);
714 _last_sample = signal_samples.length() - 1;
715 _from = _first_sample;
717 if(_from + 511 <= _last_sample)
722 _signal_matrix = MatrixXd::Zero(_to - _from + 1, _matlab_channels.length());
725 for(qint32 i = _from; i <= _to; i++)
727 qreal value = signal_samples.at(i).toFloat(&isFloat);
730 _signal_matrix = MatrixXd::Zero(0, 0);
731 QMessageBox::critical(
this,
"error", QString(
"error reading matlab file. Could not read line %1 from file %2.").arg(i).arg(fileName));
733 ui->tbv_Results->clear();
734 ui->tbv_Results->clearContents();
735 ui->tbv_Results->setRowCount(0);
736 ui->tbv_Results->setColumnCount(0);
737 ui->btt_Calc->setDisabled(
true);
739 pal.setColor(QPalette::Text, Qt::black);
740 ui->progressBarCalc->setPalette(pal);
741 ui->progressBarCalc->setFormat(
"residual energy: 100% iterations: 0");
743 ui->lb_signal_energy->setHidden(
true);
744 ui->lb_signal_energy_text->setHidden(
true);
745 ui->lb_approx_energy->setHidden(
true);
746 ui->lb_approx_energy_text->setHidden(
true);
747 ui->lb_residual_energy->setHidden(
true);
748 ui->lb_residual_energy_text->setHidden(
true);
756 _signal_matrix(row_number, k) = value;
763 ui->dsb_sample_rate->setValue(_sample_rate);
772 void MainWindow::read_matlab_file_new()
775 qint32 selected_chn = 0;
777 _signal_matrix = MatrixXd::Zero(_to - _from + 1, _matlab_channels.length());
779 for(qint32 k = 0;k < _matlab_channels.length(); k++)
781 qint32 row_number = 0;
782 QStringList signal_samples = _matlab_channels.at(k).split(
',', QString::SkipEmptyParts);
784 for(qint32 i = _from; i <= _to; i++)
786 qreal value = signal_samples.at(i).toFloat(&isFloat);
788 _signal_matrix = MatrixXd::Zero(0, 0);
790 _signal_matrix(row_number, k) = value;
795 original_signal_matrix = _signal_matrix;
798 for(qint32 i = 0; i < original_signal_matrix.cols(); i++)
799 if(select_channel_map[i] ==
true)
803 _signal_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
805 for(qint32 channels = 0; channels < original_signal_matrix.cols(); channels++)
806 if(select_channel_map[channels] ==
true)
808 _colors.append(original_colors.at(channels));
809 _signal_matrix.col(selected_chn) = original_signal_matrix.col(channels);
814 _atom_sum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
815 _residuum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
817 ui->tbv_Results->clearContents();
818 ui->tbv_Results->setRowCount(0);
819 ui->actionSpeicher->setEnabled(
false);
820 ui->actionSpeicher_unter->setEnabled(
false);
821 ui->lb_info_content->clear();
822 ui->cb_all_select->setHidden(
true);
823 ui->lb_timer->setHidden(
true);
824 ui->progressBarCalc->setHidden(
true);
825 ui->actionExport->setEnabled(
false);
826 ui->lb_figure_of_merit->setHidden(
true);
827 ui->lb_signal_energy->clear();
828 ui->lb_approx_energy->clear();
829 ui->lb_residual_energy->clear();
830 ui->lb_signal_energy_text->clear();
831 ui->lb_approx_energy_text->clear();
832 ui->lb_residual_energy_text->clear();
842 QDir dir(QDir::homePath() +
"/" +
"Matching-Pursuit-Toolbox");
843 QStringList filterList;
844 filterList.append(
"*.dict");
845 QFileInfoList fileList = dir.entryInfoList(filterList);
847 ui->cb_Dicts->clear();
848 for(
int i = 0; i < fileList.length(); i++)
849 ui->cb_Dicts->addItem(QIcon(
":/images/icons/DictIcon.png"), fileList.at(i).baseName());
852 if(ui->cb_Dicts->itemText(0) ==
"" && ui->rb_OwnDictionary->isChecked())
853 ui->btt_Calc->setEnabled(
false);
854 else if(_has_file && ui->rb_OwnDictionary->isChecked())
855 ui->btt_Calc->setEnabled(
true);
861 void MainWindow::fill_channel_combobox()
864 this->cb_item =
new QStandardItem;
865 this->cb_item->setText(
"de/select all channels");
866 this->cb_item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
867 this->cb_item->setData(Qt::Checked, Qt::CheckStateRole);
868 this->cb_model->appendRow(this->cb_item);
869 this->cb_items.push_back(this->cb_item);
873 QStringList chn_names;
875 if(!pick_info.isEmpty())
876 chn_names = pick_info.ch_names;
878 for(qint32 i = 0; i < _signal_matrix.cols(); i++)
879 chn_names.append(QString::number(i));
885 for(qint32 channels = 1; channels <= _signal_matrix.cols(); channels++)
887 if(settings.value(
"pastell_colors",
false).toBool())
888 _colors.append(QColor::fromHsv(qrand() % 256, 255, 190));
890 _colors.append(QColor::fromRgb(qrand() / ((qreal)RAND_MAX + 300) * 255, qrand() / ((qreal)RAND_MAX + 300) * 255, qrand() / ((qreal)RAND_MAX + 300) * 255));
892 this->cb_item =
new QStandardItem;
893 this->cb_item->setText(chn_names.at(channels - 1));
894 this->cb_item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
895 this->cb_item->setData(Qt::Checked, Qt::CheckStateRole);
896 select_channel_map.insert(channels - 1,
true);
897 if(!pick_info.isEmpty())
899 for(qint32 k = 0; k < pick_info.bads.length(); k++)
900 if(pick_info.bads.at(k) == this->cb_item->text())
902 select_channel_map[channels - 1] =
false;
903 this->cb_item->setData(Qt::Unchecked, Qt::CheckStateRole);
904 this->cb_item->setBackground(QColor::fromRgb(0x0F0, 0x080, 0x080, 0x00FF));
908 this->cb_items.push_back(this->cb_item);
909 this->cb_model->insertRow(channels, this->cb_item);
912 original_colors = _colors;
915 for(qint32 i = 0; i < original_signal_matrix.cols(); i++)
916 if(select_channel_map[i] ==
true)
920 _signal_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
921 _atom_sum_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
922 _residuum_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
925 qint32 selected_chn = 0;
927 for(qint32 channels = 0; channels < original_signal_matrix.cols(); channels++)
928 if(select_channel_map[channels] ==
true)
930 _colors.append(original_colors.at(channels));
931 _signal_matrix.col(selected_chn) = original_signal_matrix.col(channels);
934 ui->cb_channels->setModel(this->cb_model);
939 void MainWindow::cb_selection_changed(
const QModelIndex& topLeft,
const QModelIndex& bottomRight)
941 Q_UNUSED(bottomRight);
943 QStandardItem* cb_item = this->cb_items[topLeft.row()];
944 if(topLeft.row() == 0)
946 if(cb_item->checkState() == Qt::Checked)
948 for(qint32 i = 1; i < ui->cb_channels->count(); i++)
949 if(this->cb_items[i]->checkState() == Qt::Unchecked)
950 this->cb_items[i]->setData(Qt::Checked, Qt::CheckStateRole);
954 for(qint32 i = 1; i < ui->cb_channels->count(); i++)
955 if(this->cb_items[i]->checkState() == Qt::Checked)
956 this->cb_items[i]->setData(Qt::Unchecked, Qt::CheckStateRole);
961 ui->tbv_Results->clearContents();
962 ui->tbv_Results->setRowCount(0);
963 ui->actionSpeicher->setEnabled(
false);
964 ui->actionSpeicher_unter->setEnabled(
false);
965 ui->actionExport->setEnabled(
false);
967 if(cb_item->checkState() == Qt::Unchecked)
968 select_channel_map[topLeft.row() - 1] =
false;
969 else if(cb_item->checkState() == Qt::Checked)
970 select_channel_map[topLeft.row() - 1] =
true;
973 for(qint32 i = 0; i < original_signal_matrix.cols(); i++)
974 if(select_channel_map[i] ==
true)
978 _signal_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
979 _atom_sum_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
980 _residuum_matrix = MatrixXd::Zero(original_signal_matrix.rows(), size);
983 qint32 selected_chn = 0;
984 for(qint32 channels = 0; channels < original_signal_matrix.cols(); channels++)
985 if(select_channel_map[channels] ==
true)
987 _colors.append(original_colors.at(channels));
988 _signal_matrix.col(selected_chn) = original_signal_matrix.col(channels);
992 if(_signal_matrix.cols() == 0) ui->btt_Calc->setEnabled(
false);
993 else ui->btt_Calc->setEnabled(
true);
1001 void GraphWindow::paintEvent(QPaintEvent* event)
1004 paint_signal(_signal_matrix, this->size());
1012 QPainter painter(
this);
1013 painter.setRenderHint(QPainter::Antialiasing,
true);
1014 painter.fillRect(0,0,windowSize.width(),windowSize.height(),QBrush(Qt::white));
1015 painter.drawRect(0,0, windowSize.width(), windowSize.height());
1017 if(signalMatrix.rows() > 0 && signalMatrix.cols() > 0)
1019 const qint32 maxStrLenght = 55;
1020 qint32 borderMarginWidth = 15;
1024 qreal scaleYText = 0.0;
1025 qint32 negScale = 0;
1027 _border_margin_height = 5 + windowSize.height() / 10;
1031 maxPos = signalMatrix.maxCoeff();
1032 maxNeg = signalMatrix.minCoeff();
1035 if(maxNeg <= 0) maxmax = maxPos - maxNeg;
1036 else maxmax = maxPos + maxNeg;
1040 _signal_maximum = maxmax;
1045 scaleYText = _signal_maximum / 10.0;
1047 if(_max_neg < 0) negScale = floor((_max_neg * 10 / _signal_maximum) + 0.5);
1048 if(_max_pos <= 0) negScale = -10;
1049 _signal_negative_scale = negScale;
1052 qreal scaleX = (windowSize.width() - maxStrLenght - borderMarginWidth) / qreal(signalMatrix.rows() - 1);
1053 qreal scaleY = (windowSize.height() - _border_margin_height) / _signal_maximum;
1056 qreal scaleXAchse = (windowSize.width() - maxStrLenght - borderMarginWidth) / 20.0;
1057 qreal scaleYAchse = (windowSize.height() - _border_margin_height) / 10.0;
1059 for(qint32 i = 0; i < 11; i++)
1063 _x_axis_height = i * scaleYAchse - windowSize.height() + _border_margin_height / 2;
1066 for(qint32 channel = 0; channel < signalMatrix.cols(); channel++)
1069 for(qint32 h = 0; h < signalMatrix.rows(); h++)
1070 poly.append(QPointF((h * scaleX) + maxStrLenght, -(signalMatrix(h, channel) * scaleY + _x_axis_height)));
1071 QPen pen(_colors.at(channel), 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1072 painter.setPen(pen);
1073 painter.drawPolyline(poly);
1077 for(qint32 j = 1; j < 21; j++)
1079 if(fmod(j, 4.0) == 0)
1081 QPen pen(Qt::darkGray, 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1082 painter.setPen(pen);
1083 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - windowSize.height()),
1084 j * scaleXAchse + maxStrLenght , -(_x_axis_height + windowSize.height()));
1086 QPen pen(Qt::black, 1, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1087 painter.setPen(pen);
1088 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - 2),
1089 j * scaleXAchse + maxStrLenght , -(_x_axis_height + 2));
1091 painter.drawLine(maxStrLenght - 40, -_x_axis_height, windowSize.width()-5, -_x_axis_height);
1093 painter.drawText(3, -(i * scaleYAchse - windowSize.height()) - _border_margin_height / 2 + 4, QString::number(negScale * scaleYText,
'g', 3));
1095 painter.drawLine(maxStrLenght - 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2),
1096 maxStrLenght + 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2));
1100 painter.drawLine(maxStrLenght, 2, maxStrLenght, windowSize.height() - 2);
1107 void AtomSumWindow::paintEvent(QPaintEvent* event)
1110 paint_atom_sum(_atom_sum_matrix, this->size(), _signal_maximum, _signal_negative_scale);
1118 QPainter painter(
this);
1119 painter.setRenderHint(QPainter::Antialiasing,
true);
1120 painter.fillRect(0,0,windowSize.width(),windowSize.height(),QBrush(Qt::white));
1121 painter.drawRect(0,0, windowSize.width(), windowSize.height());
1124 if(atom_matrix.rows() > 0 && atom_matrix.cols() > 0 && _signal_matrix.rows() > 0 && _signal_matrix.cols() > 0)
1126 const qint32 maxStrLenght = 55;
1127 qint32 borderMarginWidth = 15;
1130 qreal scaleYText = signalMaximum / 10.0;
1133 qreal scaleX = (windowSize.width() - maxStrLenght - borderMarginWidth) / qreal(atom_matrix.rows() - 1);
1134 qreal scaleY = (windowSize.height() - _border_margin_height) / signalMaximum;
1137 qreal scaleXAchse = (windowSize.width() - maxStrLenght - borderMarginWidth) / 20.0;
1138 qreal scaleYAchse = (windowSize.height() - _border_margin_height) / 10.0;
1140 for(qint32 i = 0; i < 11; i++)
1142 if(signalNegativeMaximum == 0)
1145 for(qint32 channel = 0; channel < atom_matrix.cols(); channel++)
1148 for(qint32 h = 0; h < atom_matrix.rows(); h++)
1149 poly.append(QPointF((h * scaleX) + maxStrLenght, -(atom_matrix(h, channel) * scaleY + _x_axis_height)));
1150 QPen pen(_colors.at(channel), 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1151 painter.setPen(pen);
1152 painter.drawPolyline(poly);
1155 for(qint32 j = 1; j < 21; j++)
1157 if(fmod(j, 4.0) == 0)
1159 QPen pen(Qt::darkGray, 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1160 painter.setPen(pen);
1161 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - windowSize.height()),
1162 j * scaleXAchse + maxStrLenght, -(_x_axis_height + windowSize.height()));
1164 QPen pen(Qt::black, 1, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1165 painter.setPen(pen);
1166 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - 2),
1167 j * scaleXAchse + maxStrLenght, -(_x_axis_height + 2));
1169 painter.drawLine(maxStrLenght - 40, -_x_axis_height, windowSize.width()-5, -_x_axis_height);
1172 painter.drawText(3, -(i * scaleYAchse - windowSize.height()) - _border_margin_height / 2 + 4, QString::number(signalNegativeMaximum * scaleYText,
'g', 3));
1173 painter.drawLine(maxStrLenght - 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2),
1174 maxStrLenght + 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2));
1176 signalNegativeMaximum++;
1178 painter.drawLine(maxStrLenght, 2, maxStrLenght, windowSize.height() - 2);
1185 void ResiduumWindow::paintEvent(QPaintEvent* event)
1188 paint_residuum(_residuum_matrix, this->size(), _signal_maximum, _signal_negative_scale);
1196 QPainter painter(
this);
1197 painter.setRenderHint(QPainter::Antialiasing,
true);
1198 painter.fillRect(0,0,windowSize.width(),windowSize.height(),QBrush(Qt::white));
1199 painter.drawRect(0,0, windowSize.width(), windowSize.height());
1201 if(residuum_matrix.rows() > 0 && residuum_matrix.cols() > 0 && _signal_matrix.rows() > 0 && _signal_matrix.cols() > 0)
1203 const qint32 maxStrLenght = 55;
1204 qint32 borderMarginWidth = 15;
1207 qreal scaleYText = signalMaximum / 10.0;
1210 qreal scaleX = (windowSize.width() - maxStrLenght - borderMarginWidth) / qreal(residuum_matrix.rows() - 1);
1211 qreal scaleY = (windowSize.height() - _border_margin_height) / signalMaximum;
1214 qreal scaleXAchse = (windowSize.width() - maxStrLenght - borderMarginWidth) / 20.0;
1215 qreal scaleYAchse = (windowSize.height() - _border_margin_height) / 10.0;
1217 for(qint32 i = 0; i < 11; i++)
1219 if(signalNegativeMaximum == 0)
1222 for(qint32 channel = 0; channel < residuum_matrix.cols(); channel++)
1225 for(qint32 h = 0; h < residuum_matrix.rows(); h++)
1226 poly.append(QPointF(h * scaleX + maxStrLenght, - (residuum_matrix(h, channel) * scaleY + _x_axis_height)));
1227 QPen pen(_colors.at(channel), 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1228 painter.setPen(pen);
1229 painter.drawPolyline(poly);
1232 for(qint32 j = 1; j < 21; j++)
1234 if(fmod(j, 4.0) == 0)
1236 QPen pen(Qt::darkGray, 0.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1237 painter.setPen(pen);
1238 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - windowSize.height()),
1239 j * scaleXAchse + maxStrLenght, -(_x_axis_height + windowSize.height()));
1241 QPen pen(Qt::black, 1, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
1242 painter.setPen(pen);
1243 painter.drawLine(j * scaleXAchse + maxStrLenght, -(_x_axis_height - 2),
1244 j * scaleXAchse + maxStrLenght, -(_x_axis_height + 2));
1246 painter.drawLine(maxStrLenght - 40, -_x_axis_height, windowSize.width()-5, -_x_axis_height);
1249 painter.drawText(3, -(i * scaleYAchse - windowSize.height()) - _border_margin_height/2 + 4, QString::number(signalNegativeMaximum * scaleYText,
'g', 3));
1250 painter.drawLine(maxStrLenght - 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2),
1251 maxStrLenght + 2, -((i * scaleYAchse)-(windowSize.height()) + _border_margin_height / 2));
1253 signalNegativeMaximum++;
1256 painter.drawLine(maxStrLenght, 2, maxStrLenght, windowSize.height() - 2);
1263 void XAxisWindow::paintEvent(QPaintEvent* event)
1266 paint_axis(_signal_matrix, this->size());
1273 QPainter painter(
this);
1274 painter.setRenderHint(QPainter::Antialiasing,
true);
1276 if(signalMatrix.rows() > 0 && signalMatrix.cols() > 0)
1278 const qint32 maxStrLenght = 55;
1279 qint32 borderMarginWidth = 15;
1280 qreal scaleXText = (signalMatrix.rows() - 1) / _sample_rate / 20.0;
1281 qreal scaleXAchse = (windowSize.width() - maxStrLenght - borderMarginWidth) / 20.0;
1283 for(qint32 j = 0; j < 21; j++)
1287 painter.drawText(j * scaleXAchse + 37, 20, QString::number(j * scaleXText + _from / _sample_rate + _offset_time,
'f', 2));
1288 painter.drawLine(j * scaleXAchse + maxStrLenght, 5 + 2,
1289 j * scaleXAchse + maxStrLenght, 5 - 2);
1293 painter.drawText(j * scaleXAchse + 45, 20, QString::number(j * scaleXText + _from / _sample_rate + _offset_time,
'f', 2));
1294 painter.drawLine(j * scaleXAchse + maxStrLenght, 5 + 2,
1295 j * scaleXAchse + maxStrLenght, 5 - 2);
1298 painter.drawText(5 , 20,
"[sec]");
1299 painter.drawLine(5, 5, windowSize.width()-5, 5);
1306 void MainWindow::on_btt_Calc_clicked()
1308 truncation_criterion criterion;
1310 if(ui->chb_Iterations->isChecked() && !ui->chb_ResEnergy->isChecked())
1311 criterion = Iterations;
1312 if(ui->chb_Iterations->isChecked() && ui->chb_ResEnergy->isChecked())
1314 if(ui->chb_ResEnergy->isChecked() && !ui->chb_Iterations->isChecked())
1315 criterion = SignalEnergy;
1317 if(ui->btt_Calc->text()==
"calculate")
1319 ui->progressBarCalc->setValue(0);
1320 ui->progressBarCalc->setHidden(
false);
1322 if(ui->chb_Iterations->checkState() == Qt::Unchecked && ui->chb_ResEnergy->checkState() == Qt::Unchecked)
1324 QMessageBox msgBox(QMessageBox::Warning,
"Error",
"No truncation criterion choosen.", QMessageBox::Ok,
this);
1329 if(((ui->dsb_energy->value() <= 1 && ui->dsb_energy->isEnabled()) && (ui->sb_Iterations->value() >= 500 && ui->sb_Iterations->isEnabled()))
1330 || (ui->dsb_energy->value() <= 1 && ui->dsb_energy->isEnabled() && !ui->sb_Iterations->isEnabled())
1331 || (ui->sb_Iterations->value() >= 500 && ui->sb_Iterations->isEnabled() && !ui->dsb_energy->isEnabled()) )
1334 if(settings.value(
"show_warnings",
true).toBool())
1337 msgBox->setModal(
true);
1343 ui->gb_trunc->setEnabled(
false);
1344 ui->btt_OpenSignal->setEnabled(
false);
1345 ui->btt_Calc->setText(
"cancel");
1346 ui->cb_channels->setEnabled(
false);
1347 ui->cb_all_select->setEnabled(
false);
1348 ui->dsb_from->setEnabled(
false);
1349 ui->dsb_to->setEnabled(
false);
1350 ui->sb_sample_count ->setEnabled(
false);
1351 ui->tbv_Results->clearContents();
1352 ui->tbv_Results->setRowCount(0);
1353 ui->cb_all_select->setHidden(
false);
1354 ui->lb_timer->setHidden(
false);
1355 ui->actionExport->setEnabled(
false);
1356 ui->lb_figure_of_merit->setHidden(
true);
1357 ui->lb_info_content->clear();
1359 _adaptive_atom_list.clear();
1360 _fix_dict_atom_list.clear();
1363 pal.setColor(QPalette::Text, Qt::black);
1364 ui->progressBarCalc->setPalette(pal);
1365 ui->progressBarCalc->setFormat(
"residual energy: 100% iterations: 0");
1367 ui->lb_signal_energy->setHidden(
true);
1368 ui->lb_signal_energy_text->setHidden(
true);
1369 ui->lb_approx_energy->setHidden(
true);
1370 ui->lb_approx_energy_text->setHidden(
true);
1371 ui->lb_residual_energy->setHidden(
true);
1372 ui->lb_residual_energy_text->setHidden(
true);
1377 has_warning =
false;
1379 _residuum_matrix = _signal_matrix;
1380 _atom_sum_matrix = MatrixXd::Zero(_signal_matrix.rows(), _signal_matrix.cols());
1381 callAtomSumWindow->update();
1382 callResidumWindow->update();
1384 recieved_result_counter = 0;
1385 counter_time.start();
1386 _counter_timer->setInterval(100);
1387 _counter_timer->start();
1389 if(ui->rb_OwnDictionary->isChecked())
1391 ui->tbv_Results->setColumnCount(2);
1392 ui->tbv_Results->setHorizontalHeaderLabels(QString(
"energy\n[%];atom").split(
";"));
1393 ui->tbv_Results->setColumnWidth(0,55);
1394 ui->tbv_Results->setColumnWidth(1,280);
1395 max_tbv_header_width = 0;
1396 calc_fix_mp(QString(QDir::homePath() +
"/" +
"Matching-Pursuit-Toolbox/%1.dict").arg(ui->cb_Dicts->currentText()), _signal_matrix, criterion);
1398 else if(ui->rb_adativMp->isChecked())
1400 QList<qint32> sizes = ui->splitter->sizes();
1401 sizes.insert(0, 240);
1402 ui->splitter->setSizes(sizes);
1403 max_tbv_header_width = 150;
1405 ui->tbv_Results->setColumnCount(5);
1406 ui->tbv_Results->setHorizontalHeaderLabels(QString(
"energy\n[%];scale\n[sec];trans\n[sec];modu\n[Hz];phase\n[rad]").split(
";"));
1407 ui->tbv_Results->setColumnWidth(0,55);
1408 ui->tbv_Results->setColumnWidth(1,45);
1409 ui->tbv_Results->setColumnWidth(2,40);
1410 ui->tbv_Results->setColumnWidth(3,40);
1411 ui->tbv_Results->setColumnWidth(4,50);
1413 calc_adaptiv_mp(_signal_matrix, criterion);
1415 is_calulating =
true;
1418 else if(ui->btt_Calc->text() ==
"cancel")
1420 emit mp_Thread->requestInterruption();
1421 ui->btt_Calc->setText(
"wait...");
1427 void MainWindow::on_time_out()
1429 QTime diff_time(0,0);
1430 diff_time = diff_time.addMSecs(counter_time.elapsed());
1431 ui->lb_timer->setText(diff_time.toString(
"hh:mm:ss.zzz"));
1432 _counter_timer->start();
1436 void MainWindow::recieve_result(qint32 current_iteration, qint32 max_iterations, qreal current_energy, qreal max_energy, MatrixXd residuum,
1437 adaptive_atom_list adaptive_atom_res_list, fix_dict_atom_list fix_dict_atom_res_list)
1439 tbv_is_loading =
true;
1442 qreal percent = ui->dsb_energy->value();
1443 residuum_energy = 100 * (max_energy - current_energy) / max_energy;
1444 signal_energy = max_energy;
1447 if(fix_dict_atom_res_list.isEmpty())
1449 GaborAtom temp_atom = adaptive_atom_res_list.last().last();
1450 QList<GaborAtom> temp_channel_list= adaptive_atom_res_list.last();
1451 qreal atom_energy = 0;
1453 for(qint32 i = 0; i < adaptive_atom_res_list.last().length(); i++)
1455 atom_energy += adaptive_atom_res_list.last().at(i).energy;
1459 qreal phase = temp_atom.phase;
1460 if(temp_atom.phase > 2*PI) phase -= 2*PI;
1462 QTableWidgetItem* atomEnergieItem =
new QTableWidgetItem(QString::number(100 * atom_energy / max_energy,
'f', 2));
1463 QTableWidgetItem* atomScaleItem =
new QTableWidgetItem(QString::number(temp_atom.scale / _sample_rate,
'g', 3));
1464 QTableWidgetItem* atomTranslationItem =
new QTableWidgetItem(QString::number(temp_atom.translation / qreal(_sample_rate) + _from / _sample_rate + _offset_time,
'g', 4));
1465 QTableWidgetItem* atomModulationItem =
new QTableWidgetItem(QString::number(temp_atom.modulation * _sample_rate / temp_atom.sample_count,
'g', 3));
1466 QTableWidgetItem* atomPhaseItem =
new QTableWidgetItem(QString::number(phase,
'g', 3));
1468 atomEnergieItem->setFlags(Qt::ItemIsUserCheckable);
1469 atomScaleItem->setFlags(Qt::NoItemFlags);
1470 atomTranslationItem->setFlags(Qt::NoItemFlags);
1471 atomModulationItem->setFlags(Qt::NoItemFlags);
1472 atomPhaseItem->setFlags(Qt::NoItemFlags);
1473 atomEnergieItem->setCheckState(Qt::Checked);
1475 atomEnergieItem->setTextAlignment(0x0082);
1476 atomScaleItem->setTextAlignment(0x0082);
1477 atomTranslationItem->setTextAlignment(0x0082);
1478 atomModulationItem->setTextAlignment(0x0082);
1479 atomPhaseItem->setTextAlignment(0x0082);
1482 _adaptive_atom_list.append(adaptive_atom_res_list.last());
1485 if(settings.value(
"sort_results",
true).toBool())
1487 qSort(adaptive_atom_res_list.begin(), adaptive_atom_res_list.end(), sort_energy_adaptive);
1488 qSort(_adaptive_atom_list.begin(), _adaptive_atom_list.end(), sort_energy_adaptive);
1493 while(index < _adaptive_atom_list.length())
1495 if(temp_atom.scale == _adaptive_atom_list.at(index).last().scale
1496 && temp_atom.modulation == _adaptive_atom_list.at(index).last().modulation
1497 && temp_atom.translation == _adaptive_atom_list.at(index).last().translation
1498 && temp_atom.energy == _adaptive_atom_list.at(index).last().energy)
1503 ui->tbv_Results->insertRow(index);
1504 ui->tbv_Results->setItem(index, 0, atomEnergieItem);
1505 ui->tbv_Results->setItem(index, 1, atomScaleItem);
1506 ui->tbv_Results->setItem(index, 2, atomTranslationItem);
1507 ui->tbv_Results->setItem(index, 3, atomModulationItem);
1508 ui->tbv_Results->setItem(index, 4, atomPhaseItem);
1511 for(qint32 i = 0; i < _signal_matrix.cols(); i++)
1513 if(settings.value(
"trial_separation",
false).toBool())
1515 VectorXd atom_vec = temp_channel_list.at(i).max_scalar_product * temp_atom.
create_real(temp_channel_list.at(i).sample_count,
1516 temp_channel_list.at(i).scale,
1517 temp_channel_list.at(i).translation,
1518 temp_channel_list.at(i).modulation,
1519 temp_channel_list.at(i).phase);
1520 _residuum_matrix.col(i) -= atom_vec;
1521 _atom_sum_matrix.col(i) += atom_vec;
1526 VectorXd atom_vec = temp_atom.max_scalar_list.at(i) * temp_atom.
create_real(temp_atom.sample_count, temp_atom.scale, temp_atom.translation, temp_atom.modulation, temp_atom.phase_list.at(i));
1527 _residuum_matrix.col(i) -= atom_vec;
1528 _atom_sum_matrix.col(i) += atom_vec;
1532 else if(adaptive_atom_res_list.isEmpty())
1534 FixDictAtom temp_atom = fix_dict_atom_res_list.last();
1535 fix_dict_atom_res_list.last().display_text = create_display_text(fix_dict_atom_res_list.last());
1536 temp_atom.display_text = create_display_text(fix_dict_atom_res_list.last());
1539 QFontMetrics fm(font);
1540 qint32 header_width = fm.width(fix_dict_atom_res_list.last().display_text) + 35;
1541 if(header_width > max_tbv_header_width)
1543 ui->tbv_Results->setColumnWidth(1, header_width);
1544 max_tbv_header_width = header_width;
1547 QTableWidgetItem* atom_energie_item =
new QTableWidgetItem(QString::number(100 * temp_atom.energy / max_energy,
'f', 2));
1548 QTableWidgetItem* atom_name_item =
new QTableWidgetItem(temp_atom.display_text);
1550 atom_energie_item->setFlags(Qt::ItemIsUserCheckable);
1551 atom_name_item->setFlags(Qt::NoItemFlags);
1552 atom_energie_item->setCheckState(Qt::Checked);
1554 atom_energie_item->setTextAlignment(0x0082);
1555 atom_name_item->setTextAlignment(0x0081);
1557 _fix_dict_atom_list.append(temp_atom);
1558 if(settings.value(
"sort_results",
true).toBool())
1560 qSort(fix_dict_atom_res_list.begin(),fix_dict_atom_res_list.end(), sort_energy_fix);
1561 qSort(_fix_dict_atom_list.begin(),_fix_dict_atom_list.end(), sort_energy_fix);
1565 while(index < fix_dict_atom_res_list.length())
1567 if(temp_atom.display_text == fix_dict_atom_res_list.at(index).display_text)
1571 ui->tbv_Results->insertRow(index);
1572 ui->tbv_Results->setItem(index, 0, atom_energie_item);
1573 ui->tbv_Results->setItem(index, 1, atom_name_item);
1577 for(qint32 i = 0; i < _signal_matrix.cols(); i++)
1579 _residuum_matrix.col(i) -= temp_atom.max_scalar_list.at(i) * temp_atom.atom_samples;
1580 _atom_sum_matrix.col(i) += temp_atom.max_scalar_list.at(i) * temp_atom.atom_samples;
1588 QString text = QString(
"residual energy: %0% iterations: %1").arg(QString::number(residuum_energy,
'f', 2)).arg(current_iteration);
1589 ui->progressBarCalc->setFormat(text);
1590 qint32 prgrsbar_adapt = 99;
1591 if(max_iterations > 1999 && current_iteration < 100)
1592 ui->progressBarCalc->setMaximum(100);
1593 if(ui->chb_ResEnergy->isChecked() && (current_iteration >= (prgrsbar_adapt)) && (max_energy - current_energy) > (0.01 * percent * max_energy))
1594 ui->progressBarCalc->setMaximum(current_iteration + 5);
1595 if(max_iterations < 1999) ui->progressBarCalc->setMaximum(max_iterations);
1596 ui->progressBarCalc->setValue(current_iteration);
1598 if(((current_iteration == max_iterations) || (max_energy - current_energy) < (0.01 * percent * max_energy))&&ui->chb_ResEnergy->isChecked())
1599 ui->progressBarCalc->setValue(ui->progressBarCalc->maximum());
1601 if(ui->progressBarCalc->value() > ui->progressBarCalc->maximum() / 2 && !is_white)
1603 pal.setColor(QPalette::Text, Qt::white);
1604 ui->progressBarCalc->setPalette(pal);
1609 if(max_iterations > 10 && percent < 1 && _signal_matrix.cols() > 40 && recieved_result_counter % 10 == 0)
1611 callAtomSumWindow->update();
1612 callResidumWindow->update();
1614 else if(max_iterations > 5 && percent < 5 && _signal_matrix.cols() > 20 && recieved_result_counter % 5 == 0)
1616 callAtomSumWindow->update();
1617 callResidumWindow->update();
1619 else if(_signal_matrix.cols() < 20)
1621 callAtomSumWindow->update();
1622 callResidumWindow->update();
1625 tbv_is_loading =
false;
1626 recieved_result_counter++;
1631 void MainWindow::recieve_warnings(qint32 warning_number)
1635 if(settings.value(
"show_infos",
true).toBool())
1637 ui->lb_info_content->setHidden(
false);
1638 ui->lb_info->setHidden(
false);
1641 if(warning_number == 1 && !has_warning)
1643 text =
"The dictionary does not have the appropriate atoms to approximate the signal more closely. Calculation terminated before reaching truncation criterion. ";
1644 ui->lb_info_content->setText(text);
1647 else if(warning_number == 2 && !has_warning)
1649 text =
"No matching sample count between atoms and signal. This may lead to discontinuities. ";
1650 ui->lb_info_content->setText(text);
1653 else if(has_warning && warning_number != 10)
1655 text =
"This dictionary does not fit the signals sample count (leads to discontinuities) and excludes atoms to reduce further residual energy. Calculation terminated before reaching truncation criterion. ";
1656 ui->lb_info_content->setText(text);
1658 if(warning_number == 10)
1660 text = ui->lb_info_content->text();
1661 text.append(
"Algorithm canceled by user interaction.");
1662 ui->lb_info_content->setText(text);
1664 if(warning_number == 11)
1666 text = QString(
"Simplex Iteration limit of %1 achieved, result may not be optimal. ").arg(settings.value(
"adaptive_iterations").toInt());
1667 ui->lb_info_content->setText(text);
1675 void MainWindow::tbv_selection_changed(
const QModelIndex& topLeft,
const QModelIndex& bottomRight)
1677 Q_UNUSED(bottomRight);
1678 bool all_selected =
true;
1679 bool all_deselected =
true;
1682 if(tbv_is_loading)
return;
1684 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
1685 if(ui->tbv_Results->item(i, 0)->checkState()) all_deselected =
false;
1686 else all_selected =
false;
1688 if(all_selected) ui->cb_all_select->setCheckState(Qt::Checked);
1689 else if(all_deselected) ui->cb_all_select->setCheckState(Qt::Unchecked);
1690 else ui->cb_all_select->setCheckState(Qt::PartiallyChecked);
1692 QTableWidgetItem* item = ui->tbv_Results->item(topLeft.row(), 0);
1693 if(topLeft.row() == ui->tbv_Results->rowCount() - 1)
1695 if(item->checkState())
1697 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1699 _atom_sum_matrix.col(channels) += real_residuum_matrix.col(channels);
1700 _residuum_matrix.col(channels) -= real_residuum_matrix.col(channels);
1702 composed_energy += residuum_energy;
1706 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1708 _atom_sum_matrix.col(channels) -= real_residuum_matrix.col(channels);
1709 _residuum_matrix.col(channels) += real_residuum_matrix.col(channels);
1711 composed_energy -= residuum_energy;
1716 if(ui->tbv_Results->columnCount() > 2)
1718 if(!settings.value(
"trial_separation",
false).toBool())
1720 GaborAtom atom = _adaptive_atom_list.at(topLeft.row()).last();
1722 select_atoms_map[topLeft.row()] = item->checkState();
1724 if(item->checkState())
1726 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1728 _atom_sum_matrix.col(channels) += atom.max_scalar_list.at(channels) * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase_list.at(channels));
1729 _residuum_matrix.col(channels) -= atom.max_scalar_list.at(channels) * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase_list.at(channels));
1731 composed_energy += 100 * atom.energy / signal_energy;
1735 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1737 _atom_sum_matrix.col(channels) -= atom.max_scalar_list.at(channels) * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase_list.at(channels));
1738 _residuum_matrix.col(channels) += atom.max_scalar_list.at(channels) * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase_list.at(channels));
1740 composed_energy -= 100 * atom.energy / signal_energy;
1745 if(item->checkState())
1747 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1749 GaborAtom atom = _adaptive_atom_list.at(topLeft.row()).at(channels);
1750 _atom_sum_matrix.col(channels) += atom.max_scalar_product * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase);
1751 _residuum_matrix.col(channels) -= atom.max_scalar_product * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase);
1752 composed_energy += 100 * atom.energy / signal_energy;
1757 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1759 GaborAtom atom = _adaptive_atom_list.at(topLeft.row()).at(channels);
1760 _atom_sum_matrix.col(channels) -= atom.max_scalar_product * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase);
1761 _residuum_matrix.col(channels) += atom.max_scalar_product * atom.
create_real(atom.sample_count, atom.scale, atom.translation, atom.modulation, atom.phase);
1762 composed_energy -= 100 * atom.energy / signal_energy;
1770 FixDictAtom atom = _fix_dict_atom_list.at(topLeft.row());
1772 select_atoms_map[topLeft.row()] = item->checkState();
1774 if(item->checkState())
1776 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1778 _atom_sum_matrix.col(channels) += atom.max_scalar_list.at(channels) * atom.atom_samples;
1779 _residuum_matrix.col(channels) -= atom.max_scalar_list.at(channels) * atom.atom_samples;
1780 composed_energy += 100 * atom.energy / signal_energy;
1785 for(qint32 channels = 0; channels < _signal_matrix.cols(); channels++)
1787 _atom_sum_matrix.col(channels) -= atom.max_scalar_list.at(channels) * atom.atom_samples;
1788 _residuum_matrix.col(channels) += atom.max_scalar_list.at(channels) * atom.atom_samples;
1789 composed_energy -= 100 * atom.energy / signal_energy;
1795 ui->lb_signal_energy_text->setText(
"absolute signal energy:");
1796 ui->lb_signal_energy->setText(QString::number(signal_energy,
'g', 2));
1797 ui->lb_approx_energy_text->setText(
"approximation energy:");
1798 ui->lb_approx_energy->setText(QString::number(abs(composed_energy),
'f', 2) +
"%");
1799 ui->lb_residual_energy_text->setText(
"remaining residual energy:");
1800 ui->lb_residual_energy->setText(QString::number(abs(100 - composed_energy),
'f', 2) +
"%");
1802 callAtomSumWindow->update();
1803 callResidumWindow->update();
1808 void MainWindow::calc_thread_finished()
1810 is_calulating =
false;
1811 tbv_is_loading =
true;
1813 if(_fix_dict_atom_list.isEmpty() && !_adaptive_atom_list.isEmpty())
1814 ui->actionExport->setEnabled(
true);
1816 ui->actionSpeicher->setEnabled(
true);
1817 ui->actionSpeicher_unter->setEnabled(
true);
1820 _counter_timer->stop();
1821 ui->gb_trunc->setEnabled(
true);
1822 ui->btt_OpenSignal->setEnabled(
true);
1823 ui->progressBarCalc->setValue(ui->progressBarCalc->maximum());
1825 pal.setColor(QPalette::Text, Qt::white);
1826 ui->progressBarCalc->setPalette(pal);
1829 ui->btt_Calc->setText(
"calculate");
1830 ui->cb_channels->setEnabled(
true);
1831 ui->cb_all_select->setEnabled(
true);
1832 ui->dsb_from->setEnabled(
true);
1833 ui->dsb_to->setEnabled(
true);
1834 ui->sb_sample_count ->setEnabled(
true);
1836 QList<qint32> sizes = ui->splitter->sizes();
1837 sizes.insert(0, max_tbv_header_width + 100);
1838 ui->splitter->setSizes(sizes);
1840 for(qint32 col = 0; col < ui->tbv_Results->columnCount(); col++)
1841 for(qint32 row = 0; row < ui->tbv_Results->rowCount(); row++)
1844 ui->tbv_Results->item(row, col)->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
1846 ui->tbv_Results->item(row, col)->setFlags(Qt::ItemIsEnabled);
1849 real_residuum_matrix = _residuum_matrix;
1851 for(qint32 i = 0; i < ui->tbv_Results->rowCount(); i++)
1852 select_atoms_map.insert(i,
true);
1854 ui->tbv_Results->setRowCount(ui->tbv_Results->rowCount() + 1);
1856 QTableWidgetItem* energy_item =
new QTableWidgetItem(QString::number(residuum_energy,
'f', 2));
1857 energy_item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
1858 energy_item->setCheckState(Qt::Unchecked);
1859 energy_item->setTextAlignment(0x0082);
1861 QTableWidgetItem* residuum_item =
new QTableWidgetItem(
"residue");
1862 residuum_item->setFlags(Qt::ItemIsEnabled);
1863 residuum_item->setTextAlignment(Qt::AlignCenter);
1865 ui->tbv_Results->setItem(ui->tbv_Results->rowCount() - 1, 0, energy_item);
1866 ui->tbv_Results->setItem(ui->tbv_Results->rowCount() - 1, 1, residuum_item);
1867 ui->tbv_Results->setSpan(ui->tbv_Results->rowCount() - 1, 1, 1, 4);
1870 composed_energy = 100 - residuum_energy;
1871 ui->lb_signal_energy_text->setText(
"absolute signal energy:");
1872 ui->lb_signal_energy->setText(QString::number(signal_energy,
'g', 2));
1873 ui->lb_approx_energy_text->setText(
"approximation energy:");
1874 ui->lb_approx_energy->setText(QString::number(abs(composed_energy),
'f', 2) +
"%");
1875 ui->lb_residual_energy_text->setText(
"remaining residual energy:");
1876 ui->lb_residual_energy->setText(QString::number(abs(100 - composed_energy),
'f', 2) +
"%");
1878 ui->lb_signal_energy->setHidden(
false);
1879 ui->lb_signal_energy_text->setHidden(
false);
1880 ui->lb_approx_energy->setHidden(
false);
1881 ui->lb_approx_energy_text->setHidden(
false);
1882 ui->lb_residual_energy->setHidden(
false);
1883 ui->lb_residual_energy_text->setHidden(
false);
1887 if(settings.value(
"show_infos",
true).toBool())
1889 qreal correlation = 0;
1890 qreal divisor_sig = 0;
1891 qreal divisor_app = 0;
1892 MatrixXd sig_no_mean = (_signal_matrix.array() - _signal_matrix.mean()).matrix();
1893 MatrixXd app_no_mean = (_atom_sum_matrix.array() - _atom_sum_matrix.mean()).matrix();
1894 for(qint32 channel = 0; channel < _atom_sum_matrix.cols(); channel++)
1896 correlation += sig_no_mean.col(channel).dot(app_no_mean.col(channel));
1897 divisor_sig += sig_no_mean.col(channel).dot(sig_no_mean.col(channel));
1898 divisor_app += app_no_mean.col(channel).dot(app_no_mean.col(channel));
1901 qreal divisor = sqrt(divisor_app * divisor_sig);
1902 correlation /= divisor;
1903 correlation *= 1000;
1904 qint32 corr = correlation;
1905 correlation = qreal(corr) / 1000;
1906 cout <<
"\ncorrelation: "<<correlation;
1907 ui->lb_figure_of_merit->setText(QString(
"FOM: %1").arg((QString::number(correlation,
'f', 3))));
1908 ui->lb_figure_of_merit->setHidden(
false);
1911 tbv_is_loading =
false;
1918 void MainWindow::calc_adaptiv_mp(MatrixXd signal, truncation_criterion criterion)
1921 qreal res_energy = ui->dsb_energy->value();
1924 mp_Thread =
new QThread;
1925 adaptive_Mp->moveToThread(mp_Thread);
1927 connect(
this, SIGNAL(send_input(MatrixXd, qint32, qreal,
bool, qint32, qint32, qreal, qreal, qreal, qreal,
bool)),
1928 adaptive_Mp, SLOT(recieve_input(MatrixXd, qint32, qreal,
bool, qint32, qint32, qreal, qreal, qreal, qreal,
bool)));
1929 connect(adaptive_Mp, SIGNAL(current_result(qint32, qint32, qreal, qreal, MatrixXd, adaptive_atom_list, fix_dict_atom_list)),
1930 this, SLOT(recieve_result(qint32, qint32, qreal, qreal, MatrixXd, adaptive_atom_list, fix_dict_atom_list)));
1931 connect(adaptive_Mp, SIGNAL(finished_calc()), mp_Thread, SLOT(quit()));
1932 connect(adaptive_Mp, SIGNAL(finished_calc()), adaptive_Mp, SLOT(deleteLater()));
1933 connect(mp_Thread, SIGNAL(finished()),
this, SLOT(calc_thread_finished()));
1934 connect(mp_Thread, SIGNAL(finished()), mp_Thread, SLOT(deleteLater()));
1936 connect(adaptive_Mp, SIGNAL(send_warning(qint32)),
this, SLOT(recieve_warnings(qint32)));
1939 bool fixphase = settings.value(
"fixPhase",
false).toBool();
1940 bool trial_separation = settings.value(
"trial_separation",
false).toBool();
1941 qint32 boost = settings.value(
"boost", 100).toInt();
1942 qint32 iterations = settings.value(
"adaptive_iterations", 1E3).toInt();
1943 qreal reflection = settings.value(
"adaptive_reflection", 1.00).toDouble();
1944 qreal expansion = settings.value(
"adaptive_expansion", 0.20).toDouble();
1945 qreal contraction = settings.value(
"adaptive_contraction", 0.5).toDouble();
1946 qreal fullcontraction = settings.value(
"adaptive_fullcontraction", 0.50).toDouble();
1950 emit send_input(signal, ui->sb_Iterations->value(), qreal(MININT32), fixphase, boost, iterations,
1951 reflection, expansion, contraction, fullcontraction, trial_separation);
1956 emit send_input(signal, MAXINT32, res_energy, fixphase, boost, iterations,
1957 reflection, expansion, contraction, fullcontraction, trial_separation);
1962 emit send_input(signal, ui->sb_Iterations->value(), res_energy, fixphase, boost, iterations,
1963 reflection, expansion, contraction, fullcontraction, trial_separation);
1971 void MainWindow::calc_fix_mp(QString path, MatrixXd signal, truncation_criterion criterion)
1974 qreal res_energy = ui->dsb_energy->value();
1977 mp_Thread =
new QThread;
1978 fixDict_Mp->moveToThread(mp_Thread);
1980 connect(
this, SIGNAL(send_input_fix_dict(MatrixXd, qint32, qreal, qint32, QString, qreal)),
1981 fixDict_Mp, SLOT(recieve_input(MatrixXd, qint32, qreal, qint32, QString, qreal)));
1982 connect(fixDict_Mp, SIGNAL(current_result(qint32, qint32, qreal, qreal, MatrixXd, adaptive_atom_list, fix_dict_atom_list)),
1983 this, SLOT(recieve_result(qint32, qint32, qreal, qreal, MatrixXd, adaptive_atom_list, fix_dict_atom_list)));
1984 connect(fixDict_Mp, SIGNAL(finished_calc()), mp_Thread, SLOT(quit()));
1985 connect(fixDict_Mp, SIGNAL(finished_calc()), fixDict_Mp, SLOT(deleteLater()));
1986 connect(mp_Thread, SIGNAL(finished()),
this, SLOT(calc_thread_finished()));
1987 connect(mp_Thread, SIGNAL(finished()), mp_Thread, SLOT(deleteLater()));
1989 connect(fixDict_Mp, SIGNAL(send_warning(qint32)),
this, SLOT(recieve_warnings(qint32)));
1992 qint32 boost = settings.value(
"boost_fixDict", 100).toInt();
1993 qreal delta_energy = settings.value(
"delta_energy", 0.0005).toDouble();
1998 emit send_input_fix_dict(signal, ui->sb_Iterations->value(), qreal(MININT32), boost, path, delta_energy);
2003 emit send_input_fix_dict(signal, MAXINT32, res_energy, boost, path, delta_energy);
2008 emit send_input_fix_dict(signal, ui->sb_Iterations->value(), res_energy, boost, path, delta_energy);
2016 QString MainWindow::create_display_text(
FixDictAtom global_best_matching)
2019 QString display_text;
2021 if(!settings.value(
"show_phys_params",
false).toBool())
2023 if(global_best_matching.type == GABORATOM)
2025 display_text = QString(
"Gaboratom: scale: %0, translation: %1, modulation: %2, phase: %3")
2026 .arg(QString::number(global_best_matching.gabor_atom.scale,
'f', 2))
2027 .arg(QString::number(global_best_matching.translation,
'f', 2))
2028 .arg(QString::number(global_best_matching.gabor_atom.modulation,
'f', 2))
2029 .arg(QString::number(global_best_matching.gabor_atom.phase,
'f', 2));
2031 else if(global_best_matching.type == CHIRPATOM)
2033 display_text = QString(
"Chripatom: scale: %0, translation: %1, modulation: %2, phase: %3, chirp: %4")
2034 .arg(QString::number(global_best_matching.chirp_atom.scale,
'f', 2))
2035 .arg(QString::number(global_best_matching.translation,
'f', 2))
2036 .arg(QString::number(global_best_matching.chirp_atom.modulation,
'f', 2))
2037 .arg(QString::number(global_best_matching.chirp_atom.phase,
'f', 2))
2038 .arg(QString::number(global_best_matching.chirp_atom.chirp,
'f', 2));
2040 else if(global_best_matching.type == FORMULAATOM)
2042 display_text = QString(
"%0: transl: %1 a: %2, b: %3 c: %4, d: %5, e: %6, f: %7, g: %8, h: %9")
2043 .arg(global_best_matching.atom_formula)
2044 .arg(QString::number(global_best_matching.translation,
'f', 2))
2045 .arg(QString::number(global_best_matching.formula_atom.a,
'f', 2))
2046 .arg(QString::number(global_best_matching.formula_atom.b,
'f', 2))
2047 .arg(QString::number(global_best_matching.formula_atom.c,
'f', 2))
2048 .arg(QString::number(global_best_matching.formula_atom.d,
'f', 2))
2049 .arg(QString::number(global_best_matching.formula_atom.e,
'f', 2))
2050 .arg(QString::number(global_best_matching.formula_atom.f,
'f', 2))
2051 .arg(QString::number(global_best_matching.formula_atom.g,
'f', 2))
2052 .arg(QString::number(global_best_matching.formula_atom.h,
'f', 2));
2057 if(global_best_matching.type == GABORATOM)
2059 qreal phase = global_best_matching.gabor_atom.phase;
2060 if(global_best_matching.gabor_atom.phase > 2*PI) phase -= 2*PI;
2062 display_text = QString(
"Gaboratom: scale: %0 sec, translation: %1 sec, modulation: %2 Hz, phase: %3 rad")
2063 .arg(QString::number(global_best_matching.gabor_atom.scale / _sample_rate,
'f', 2))
2064 .arg(QString::number((global_best_matching.translation + _from) / _sample_rate + _offset_time,
'f', 2))
2065 .arg(QString::number(global_best_matching.gabor_atom.modulation * _sample_rate / global_best_matching.sample_count,
'f', 2))
2066 .arg(QString::number(phase,
'f', 2));
2068 else if(global_best_matching.type == CHIRPATOM)
2070 qreal phase = global_best_matching.chirp_atom.phase;
2071 if(global_best_matching.chirp_atom.phase > 2*PI) phase -= 2*PI;
2073 display_text = QString(
"Chripatom: scale: %0 sec, translation: %1 sec, modulation: %2 Hz, phase: %3 rad, chirp: %4")
2074 .arg(QString::number(global_best_matching.chirp_atom.scale / _sample_rate,
'f', 2))
2075 .arg(QString::number((global_best_matching.translation + _from) / _sample_rate + _offset_time,
'f', 2))
2076 .arg(QString::number(global_best_matching.chirp_atom.modulation * _sample_rate / global_best_matching.sample_count,
'f', 2))
2077 .arg(QString::number(phase,
'f', 2))
2078 .arg(QString::number(global_best_matching.chirp_atom.chirp,
'f', 2));
2080 else if(global_best_matching.type == FORMULAATOM)
2082 display_text = QString(
"%0: transl: %1 a: %2, b: %3 c: %4, d: %5, e: %6, f: %7, g: %8, h: %9")
2083 .arg(global_best_matching.atom_formula)
2084 .arg(QString::number((global_best_matching.translation + _from) / _sample_rate + _offset_time,
'f', 2))
2085 .arg(QString::number(global_best_matching.formula_atom.a,
'f', 2))
2086 .arg(QString::number(global_best_matching.formula_atom.b,
'f', 2))
2087 .arg(QString::number(global_best_matching.formula_atom.c,
'f', 2))
2088 .arg(QString::number(global_best_matching.formula_atom.d,
'f', 2))
2089 .arg(QString::number(global_best_matching.formula_atom.e,
'f', 2))
2090 .arg(QString::number(global_best_matching.formula_atom.f,
'f', 2))
2091 .arg(QString::number(global_best_matching.formula_atom.g,
'f', 2))
2092 .arg(QString::number(global_best_matching.formula_atom.h,
'f', 2));
2096 return display_text;
2102 void MainWindow::on_actionW_rterbucheditor_triggered()
2104 if(_editor_window == NULL)
2107 connect(_editor_window, SIGNAL(dict_saved()),
this, SLOT(on_dicts_saved()));
2109 if(!_editor_window->isVisible()) _editor_window->show();
2112 _editor_window->setWindowState(Qt::WindowActive);
2113 _editor_window->raise();
2121 void MainWindow::on_actionErweiterter_W_rterbucheditor_triggered()
2123 if(_enhanced_editor_window == NULL)
2126 if(_editor_window == NULL) _editor_window =
new EditorWindow();
2127 connect(_enhanced_editor_window, SIGNAL(dict_saved()), _editor_window, SLOT(on_save_dicts()));
2129 if(!_enhanced_editor_window->isVisible()) _enhanced_editor_window->show();
2132 _enhanced_editor_window->setWindowState(Qt::WindowActive);
2133 _enhanced_editor_window->raise();
2141 void MainWindow::on_actionAtomformeleditor_triggered()
2143 if(_formula_editor == NULL)
2147 connect(_formula_editor, SIGNAL(formula_saved()), _enhanced_editor_window, SLOT(on_formula_saved()));
2149 if(!_formula_editor->isVisible()) _formula_editor->show();
2152 _formula_editor->setWindowState(Qt::WindowActive);
2153 _formula_editor->raise();
2160 void MainWindow::on_actionCreate_treebased_dictionary_triggered()
2163 _treebased_dict_window->show();
2169 void MainWindow::on_actionSettings_triggered()
2171 if(_setting_window == NULL) _setting_window =
new settingwindow();
2172 if(_setting_window != NULL) _setting_window->set_values();
2173 if(!_setting_window->isVisible()) _setting_window->show();
2176 _setting_window->setWindowState(Qt::WindowActive);
2177 _setting_window->raise();
2180 connect(_setting_window, SIGNAL(change_info_label()),
this, SLOT(activate_info_label()));
2186 void MainWindow::on_actionNeu_triggered()
2194 void MainWindow::on_btt_OpenSignal_clicked()
2202 void MainWindow::on_dsb_sample_rate_editingFinished()
2204 _sample_rate = ui->dsb_sample_rate->value();
2205 if(!read_fiff_changed)
2207 read_fiff_changed =
true;
2209 ui->dsb_from->setMaximum((_last_sample - 63) / _sample_rate);
2210 ui->dsb_to->setMinimum((_first_sample + 63) / _sample_rate);
2211 ui->lb_from->setToolTip(QString(
"minimum: %1 seconds").arg(_first_sample / _sample_rate));
2212 ui->lb_to->setToolTip(QString(
"maximum: %1 seconds").arg(_last_sample / _sample_rate));
2213 ui->sb_sample_count->setToolTip(QString(
"epoch: %1 sec").arg((_to - _from + 1) / _sample_rate));
2214 ui->lb_samples->setToolTip(QString(
"min: 64 (%1 sec)\nmax: 4096 (%2 sec)").arg(64 / _sample_rate).arg(4096 / _sample_rate));
2217 ui->dsb_from->setValue(_from / _sample_rate + _offset_time);
2218 ui->dsb_to->setValue(_to / _sample_rate + _offset_time);
2219 read_fiff_changed =
false;
2221 callXAxisWindow->update();
2226 void MainWindow::on_dsb_from_editingFinished()
2228 if(read_fiff_changed || _from == last_from)
return;
2229 if(ui->dsb_from->value() * _sample_rate < _first_sample)
2230 ui->dsb_from->setValue(_first_sample / _sample_rate + _offset_time);
2232 if(file_name.split(
'.').last() ==
"fif")
2235 read_fiff_ave_new();
2237 read_fiff_file_new(file_name);
2239 else read_matlab_file_new();
2245 void MainWindow::on_dsb_to_editingFinished()
2247 if(read_fiff_changed || _to == last_to)
return;
2248 if(ui->dsb_to->value() * _sample_rate > _last_sample)
2249 ui->dsb_to->setValue(_last_sample / _sample_rate);
2251 if(file_name.split(
'.').last() ==
"fif")
2254 read_fiff_ave_new();
2256 read_fiff_file_new(file_name);
2258 else read_matlab_file_new();
2264 void MainWindow::on_sb_sample_count_editingFinished()
2266 if(read_fiff_changed || ui->sb_sample_count->value() == last_sample_count)
return;
2268 if(file_name.split(
'.').last() ==
"fif")
2271 read_fiff_ave_new();
2273 read_fiff_file_new(file_name);
2275 else read_matlab_file_new();
2277 last_sample_count = ui->sb_sample_count->value();
2282 void MainWindow::on_dsb_from_valueChanged(
double arg1)
2284 if(read_fiff_changed)
return;
2286 read_fiff_changed =
true;
2287 _from = floor((arg1 - _offset_time) * _sample_rate);
2290 ui->dsb_from->setValue(_offset_time);
2293 _to = _from + ui->sb_sample_count->value() - 1;
2295 if(_to >= _last_sample - _offset_time * _sample_rate)
2297 _to = _last_sample - _offset_time * _sample_rate;
2298 _samplecount = _to - _from + 1;
2299 ui->sb_sample_count->setValue(_samplecount);
2302 ui->dsb_to->setValue(_to / _sample_rate + _offset_time);
2303 read_fiff_changed =
false;
2305 ui->dsb_from->setToolTip(QString(
"sample: %1").arg(_from));
2311 void MainWindow::on_dsb_to_valueChanged(
double arg1)
2313 if(read_fiff_changed)
return;
2315 read_fiff_changed =
true;
2316 _to = floor((arg1 - _offset_time) * _sample_rate);
2317 if(_to > _last_sample - _offset_time * _sample_rate)
2319 ui->dsb_to->setValue(_last_sample / _sample_rate);
2320 _to = _last_sample - _offset_time * _sample_rate;
2322 _from = _to - ui->sb_sample_count->value() + 1;
2324 if(_from + _offset_time * _sample_rate <= _first_sample)
2326 _from = _first_sample - _offset_time * _sample_rate;
2327 _samplecount = _to - _from + 1;
2328 ui->sb_sample_count->setValue(_samplecount);
2331 ui->dsb_from->setValue(_from / _sample_rate + _offset_time);
2332 read_fiff_changed =
false;
2334 ui->dsb_to->setToolTip(QString(
"sample: %1").arg(_to));
2339 void MainWindow::on_sb_sample_count_valueChanged(
int arg1)
2341 ui->sb_sample_count->setToolTip(QString(
"epoch: %1 sec").arg((arg1) / _sample_rate));
2343 if(read_fiff_changed)
return;
2345 read_fiff_changed =
true;
2346 _to = _from + arg1 - 1;
2348 if(_to > _last_sample - _offset_time * _sample_rate)
2350 _to = _last_sample - _offset_time * _sample_rate;
2351 _samplecount = _to - _from + 1;
2352 ui->sb_sample_count->setValue(_samplecount);
2354 _samplecount = arg1;
2355 ui->dsb_to->setValue(_to / _sample_rate + _offset_time);
2356 read_fiff_changed =
false;
2362 void MainWindow::on_cb_all_select_clicked()
2364 if(tbv_is_loading)
return;
2366 if( ui->cb_all_select->checkState() == Qt::Unchecked && !was_partialchecked)
2368 ui->cb_all_select->setCheckState(Qt::PartiallyChecked);
2369 was_partialchecked =
true;
2371 else if(ui->cb_all_select->checkState() == Qt::Checked && !was_partialchecked)
2373 ui->cb_all_select->setCheckState(Qt::Unchecked);
2374 was_partialchecked =
false;
2379 if(ui->cb_all_select->checkState() == Qt::Checked)
2380 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
2381 ui->tbv_Results->item(i, 0)->setCheckState(Qt::Checked);
2382 else if(ui->cb_all_select->checkState() == Qt::Unchecked)
2383 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
2384 ui->tbv_Results->item(i, 0)->setCheckState(Qt::Unchecked);
2387 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
2388 if(select_atoms_map[i] ==
true)
2389 ui->tbv_Results->item(i, 0)->setCheckState(Qt::Checked);
2391 ui->tbv_Results->item(i, 0)->setCheckState(Qt::Unchecked);
2394 bool all_selected =
true;
2395 bool all_deselected =
true;
2396 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
2397 if(ui->tbv_Results->item(i, 0)->checkState())
2398 all_deselected =
false;
2400 all_selected =
false;
2403 ui->cb_all_select->setCheckState(Qt::Checked);
2404 else if(all_deselected)
2406 ui->cb_all_select->setCheckState(Qt::Unchecked);
2407 was_partialchecked =
true;
2409 else ui->cb_all_select->setCheckState(Qt::PartiallyChecked);
2411 auto_change =
false;
2416 void MainWindow::on_dicts_saved()
2418 fill_dict_combobox();
2423 void MainWindow::on_actionSpeicher_triggered()
2425 QString save_name =
"";
2426 QStringList saveList = file_name.split(
'/').last().split(
'.').first().split(
'_');
2427 for(
int i = 0; i < saveList.length(); i++)
2429 if(i == saveList.length() - 1)
2430 save_name +=
"mp_" + saveList.at(i);
2432 save_name += saveList.at(i) +
"_";
2435 if(file_name.split(
'.').last() !=
"fif")
2437 if(save_path.isEmpty())
2439 save_path = QFileDialog::getSaveFileName(
this,
"Save file as...", last_save_path +
"/" + save_name,
"(*.txt)");
2440 if(save_path.isEmpty())
return;
2443 QMessageBox::information(
this, tr(
"information"),
2444 tr(
"No fif file for save. Only parameter.txt saved."));
2448 if(save_path.isEmpty())
2450 save_path = QFileDialog::getSaveFileName(
this,
"Save file as...", last_save_path +
"/" + save_name,
"(*.fif)");
2451 if(save_path.isEmpty())
return;
2454 QStringList string_list = save_path.split(
'/');
2455 last_save_path =
"";
2456 for(qint32 i = 0; i < string_list.length() - 1; i++)
2457 last_save_path += string_list.at(i) +
'/';
2464 void MainWindow::on_actionSpeicher_unter_triggered()
2466 QString save_name =
"";
2467 QStringList saveList = file_name.split(
'/').last().split(
'.').first().split(
'_');
2468 for(
int i = 0; i < saveList.length(); i++)
2470 if(i == saveList.length() - 1) save_name +=
"mp_" + saveList.at(i);
2471 else save_name += saveList.at(i) +
"_";
2474 if(file_name.split(
'.').last() !=
"fif")
2475 save_path = QFileDialog::getSaveFileName(
this,
"Save file as...", last_save_path +
"/" + save_name,
"(*.txt)");
2477 save_path = QFileDialog::getSaveFileName(
this,
"Save file as...", last_save_path +
"/" + save_name,
"(*.fif)");
2479 if(save_path.isEmpty())
return;
2482 QStringList string_list = save_path.split(
'/');
2483 last_save_path =
"";
2484 for(qint32 i = 0; i < string_list.length() - 1; i++)
2485 last_save_path += string_list.at(i) +
'/';
2497 QThread *save_thread =
new QThread();
2499 save_Fif->moveToThread(save_thread);
2501 connect(
this, SIGNAL(to_save(QString, QString, fiff_int_t, fiff_int_t, MatrixXd, MatrixXd, select_map, RowVectorXi, source_file_type )),
2502 save_Fif, SLOT(save_fif_file(QString, QString, fiff_int_t, fiff_int_t, MatrixXd, MatrixXd, select_map, RowVectorXi, source_file_type )));
2503 connect(save_Fif, SIGNAL(save_progress(qint32, qint32)),
this, SLOT(recieve_save_progress(qint32, qint32)));
2504 connect(
this, SIGNAL(kill_save_thread()), save_thread, SLOT(quit()));
2505 connect(
this, SIGNAL(kill_save_thread()), save_Fif, SLOT(deleteLater()));
2507 connect(save_thread, SIGNAL(finished()), save_thread, SLOT(deleteLater()));
2508 connect(save_Fif, SIGNAL(finished()), save_thread, SLOT(deleteLater()));
2511 ui->lb_timer->setHidden(
true);
2512 ui->cb_all_select->setHidden(
true);
2513 ui->progress_bar_save->setHidden(
false);
2514 ui->progress_bar_save->setFormat(
"save fif file: %p%");
2515 ui->progress_bar_save->setValue(0);
2516 ui->progress_bar_save->setMinimum(0);
2517 ui->progress_bar_save->setMaximum(_last_sample);
2519 pal.setColor(QPalette::Text, Qt::black);
2520 ui->progress_bar_save->setPalette(pal);
2522 is_save_white =
false;
2524 ui->actionSpeicher->setEnabled(
false);
2525 ui->actionSpeicher_unter->setEnabled(
false);
2527 emit to_save(file_name, save_path, _from, _to, _atom_sum_matrix, reference_matrix, select_channel_map, picks, file_type);
2528 save_thread->start();
2533 void MainWindow::recieve_save_progress(qint32 current_progress, qint32 finished)
2537 ui->progress_bar_save->setValue(current_progress);
2538 if(ui->progress_bar_save->value() > ui->progress_bar_save->maximum() / 2 && !is_save_white)
2540 pal.setColor(QPalette::Text, Qt::white);
2541 ui->progress_bar_save->setPalette(pal);
2542 is_save_white =
true;
2545 else if(finished == 2)
2547 QMessageBox::warning(
this,
"Error",
"error: no success on save.");
2548 ui->progress_bar_save->setHidden(
true);
2549 emit kill_save_thread();
2551 else if(finished == 4)
2552 QMessageBox::warning(
this,
"Error",
"error: unable to save -ave.fif files\nDecomposition data saved to:\n" + save_path +
".txt");
2556 ui->progress_bar_save->setHidden(
true);
2557 ui->actionSpeicher->setEnabled(
true);
2558 ui->actionSpeicher_unter->setEnabled(
true);
2560 emit kill_save_thread();
2565 void SaveFifFile::save_fif_file(QString source_path, QString save_path, fiff_int_t start_change, fiff_int_t end_change, MatrixXd changes, MatrixXd original_signal,
2566 select_map select_channel_map, RowVectorXi picks, source_file_type file_type)
2568 QFile t_fileIn(source_path);
2569 QFile t_fileOut(save_path);
2579 FiffStream::SPtr outfid = Fiff::start_writing_raw(t_fileOut, raw.info, cals, picks);
2582 fiff_int_t from = raw.first_samp;
2583 fiff_int_t to = raw.last_samp;
2584 float quantum_sec = 10.0f;
2585 fiff_int_t quantum = ceil(quantum_sec*raw.info.sfreq);
2589 bool first_buffer =
true;
2596 for(first = from; first < start_change; first += quantum)
2598 last = first + quantum - 1;
2599 if (last > start_change)
2601 last = start_change - 1;
2603 if (!raw.read_raw_segment(data ,times, first, last, picks))
2605 printf(
"error during read_raw_segment\n");
2606 emit save_progress(first, 2);
2609 printf(
"Writing...");
2613 outfid->write_int(FIFF_FIRST_SAMPLE, &first);
2614 first_buffer =
false;
2616 outfid->write_raw_buffer(data, cals);
2619 emit save_progress(first, 0);
2625 if (!raw.read_raw_segment(data, times, start_change ,end_change,picks))
2627 printf(
"error during read_raw_segment\n");
2628 emit save_progress(first, 2);
2633 for(qint32 channels = 0; channels < data.rows(); channels++)
2635 if(select_channel_map[channels])
2637 data.row(channels) = changes.col(index) ;
2641 printf(
"Writing new data...");
2644 if (start_change > 0)
2645 outfid->write_int(FIFF_FIRST_SAMPLE, &start_change);
2646 first_buffer =
false;
2648 outfid->write_raw_buffer(data, cals);
2655 for(first = end_change + 1; first < to; first += quantum)
2657 last = first + quantum - 1;
2662 if (!raw.read_raw_segment(data, times, first, last, picks))
2664 printf(
"error during read_raw_segment\n");
2665 emit save_progress(first, 2);
2668 printf(
"Writing...");
2669 outfid->write_raw_buffer(data, cals);
2672 emit save_progress(first,
false);
2675 emit save_progress(to,
true);
2677 outfid->finish_writing_raw();
2678 printf(
"Finished\n");
2684 std::cout <<
"thread\n";
2686 emit save_progress(0, 4);
2688 t_fileOut.setFileName(save_path.append(
".txt"));
2690 if (t_fileOut.open(QFile::WriteOnly | QFile::Truncate))
2692 QTextStream matlab_stream(&t_fileOut);
2693 qint32 channel_index = 0;
2694 for(qint32 channel = 0; channel < original_signal.cols(); channel++)
2696 qint32 sample_index = 0;
2697 if(select_channel_map[channel])
2699 for(qint32 sample = 0; sample < original_signal.rows(); sample++)
2700 if(sample >= start_change && sample < end_change)
2702 matlab_stream << QString::number(changes(sample_index, channel_index)) <<
",";
2705 else matlab_stream << QString::number(original_signal(sample, channel)) <<
",";
2706 matlab_stream<<
"\n";
2711 for(qint32 sample = 0; sample < original_signal.rows(); sample++)
2712 matlab_stream << QString::number(original_signal(sample, channel)) <<
",";
2713 matlab_stream<<
"\n";
2715 emit save_progress((channel + 1) * (original_signal.rows() /original_signal.cols()), 0);
2718 emit save_progress(original_signal.rows(),
true);
2726 if (t_fileOut.open(QFile::WriteOnly | QFile::Truncate))
2728 QTextStream matlab_stream(&t_fileOut);
2731 for(qint32 channel = 0; channel < _matlab_channels.length(); channel++)
2733 if(select_channel_map[channel])
2735 QStringList signal_samples = _matlab_channels.at(channel).split(
',', QString::SkipEmptyParts);
2736 for(qint32 sample = start_change; sample <= end_change; sample++)
2738 signal_samples.replace(sample, QString::number(changes(sample - start_change, index)));
2740 for(qint32 sample = 0; sample < signal_samples.length() - 1; sample++)
2741 matlab_stream << signal_samples.at(sample) <<
",";
2742 matlab_stream << signal_samples.last();
2743 matlab_stream <<
"\n";
2748 matlab_stream << _matlab_channels.at(channel);
2749 matlab_stream <<
"\n";
2751 emit save_progress((channel + 1) * (_matlab_channels.at(0).split(
',', QString::SkipEmptyParts).length() /_matlab_channels.length()), 0);
2754 emit save_progress(_matlab_channels.at(0).split(
',', QString::SkipEmptyParts).length(),
true);
2760 emit save_progress(0, 2);
2768 void MainWindow::save_parameters()
2770 QString save_parameter_path = save_path.split(
".").first() +
"_params.txt";
2771 QString original_file_name = file_name.split(
"/").last().split(
".").first();
2772 QFile xml_file(save_parameter_path);
2773 if(xml_file.open(QIODevice::WriteOnly))
2775 QXmlStreamWriter xmlWriter(&xml_file);
2776 xmlWriter.setAutoFormatting(
true);
2777 xmlWriter.writeStartDocument();
2778 xmlWriter.writeStartElement(
"MP_DECOMPOSITION");
2779 xmlWriter.writeAttribute(
"fiff_file_name", original_file_name);
2780 xmlWriter.writeAttribute(
"epoch_from", QString::number(ui->dsb_from->value()));
2781 xmlWriter.writeAttribute(
"epoch_to", QString::number(ui->dsb_to->value()));
2782 xmlWriter.writeAttribute(
"samples", QString::number(ui->sb_sample_count->value()));
2783 xmlWriter.writeAttribute(
"sample_rate", QString::number(ui->dsb_sample_rate->value()));
2785 for(qint32 i = 0; i < ui->tbv_Results->rowCount() - 1; i++)
2787 if(ui->tbv_Results->columnCount() == 2 && ui->tbv_Results->item(i, 1)->text() !=
"residuum")
2791 xmlWriter.writeStartElement(
"ATOM");
2792 xmlWriter.writeAttribute(
"formula", fix_atom.atom_formula);
2793 xmlWriter.writeAttribute(
"sample_count", QString::number(fix_atom.sample_count));
2794 xmlWriter.writeAttribute(
"%energy_from_signal", ui->tbv_Results->item(i, 0)->text());
2795 xmlWriter.writeAttribute(
"dict_source", fix_atom.dict_source);
2796 xmlWriter.writeStartElement(
"PARAMETER");
2798 if(fix_atom.type == GABORATOM)
2800 xmlWriter.writeAttribute(
"scale", QString::number(fix_atom.gabor_atom.scale));
2801 xmlWriter.writeAttribute(
"translation", QString::number(fix_atom.translation));
2802 xmlWriter.writeAttribute(
"modulation", QString::number(fix_atom.gabor_atom.modulation));
2803 xmlWriter.writeAttribute(
"phase", QString::number(fix_atom.gabor_atom.phase));
2805 else if(fix_atom.type == CHIRPATOM)
2807 xmlWriter.writeAttribute(
"scale", QString::number(fix_atom.chirp_atom.scale));
2808 xmlWriter.writeAttribute(
"translation", QString::number(fix_atom.translation));
2809 xmlWriter.writeAttribute(
"modulation", QString::number(fix_atom.chirp_atom.modulation));
2810 xmlWriter.writeAttribute(
"phase", QString::number(fix_atom.chirp_atom.phase));
2811 xmlWriter.writeAttribute(
"chirp", QString::number(fix_atom.chirp_atom.chirp));
2813 else if(fix_atom.type == FORMULAATOM)
2815 xmlWriter.writeAttribute(
"translation", QString::number(fix_atom.translation));
2816 xmlWriter.writeAttribute(
"a", QString::number(fix_atom.formula_atom.a));
2817 xmlWriter.writeAttribute(
"b", QString::number(fix_atom.formula_atom.b));
2818 xmlWriter.writeAttribute(
"c", QString::number(fix_atom.formula_atom.c));
2819 xmlWriter.writeAttribute(
"d", QString::number(fix_atom.formula_atom.d));
2820 xmlWriter.writeAttribute(
"e", QString::number(fix_atom.formula_atom.e));
2821 xmlWriter.writeAttribute(
"f", QString::number(fix_atom.formula_atom.f));
2822 xmlWriter.writeAttribute(
"g", QString::number(fix_atom.formula_atom.g));
2823 xmlWriter.writeAttribute(
"h", QString::number(fix_atom.formula_atom.h));
2825 xmlWriter.writeEndElement();
2826 xmlWriter.writeEndElement();
2830 GaborAtom gabor_atom = _adaptive_atom_list.at(i).last();
2831 xmlWriter.writeStartElement(
"ATOM");
2832 xmlWriter.writeAttribute(
"formula",
"GABORATOM");
2833 xmlWriter.writeAttribute(
"sample_count", QString::number(gabor_atom.sample_count));
2834 xmlWriter.writeAttribute(
"%energy_from_signal", ui->tbv_Results->item(i, 0)->text());
2836 xmlWriter.writeStartElement(
"MATHEMATICAL_PARAMETERS");
2837 xmlWriter.writeAttribute(
"scale", QString::number(gabor_atom.scale));
2838 xmlWriter.writeAttribute(
"translation", QString::number(gabor_atom.translation));
2839 xmlWriter.writeAttribute(
"modulation", QString::number(gabor_atom.modulation));
2840 xmlWriter.writeAttribute(
"phase", QString::number(gabor_atom.phase));
2841 xmlWriter.writeEndElement();
2843 xmlWriter.writeStartElement(
"PHYSICAL_PARAMETERS");
2844 xmlWriter.writeAttribute(
"scale", QString::number(gabor_atom.scale / _sample_rate,
'g', 3));
2845 xmlWriter.writeAttribute(
"translation", QString::number(gabor_atom.translation / qreal(_sample_rate) + _from / _sample_rate,
'g', 4));
2846 xmlWriter.writeAttribute(
"modulation", QString::number(gabor_atom.modulation * _sample_rate / gabor_atom.sample_count,
'g', 3));
2848 qreal phase = gabor_atom.phase;
2849 if(phase > 2*PI) phase -= 2*PI;
2850 xmlWriter.writeAttribute(
"phase", QString::number(phase,
'g', 3));
2851 xmlWriter.writeEndElement();
2852 xmlWriter.writeEndElement();
2855 xmlWriter.writeEndElement();
2856 xmlWriter.writeEndDocument();
2863 void MainWindow::on_actionExport_triggered()
2865 if(_adaptive_atom_list.length() == 0)
2867 QMessageBox::warning(
this, tr(
"Error"),
2868 tr(
"error: No adaptive MP results for save."));
2872 QString save_path = QFileDialog::getSaveFileName(
this,
"Export results as dict file...", QDir::homePath() +
"/" +
"Matching-Pursuit-Toolbox" +
"/" +
"resultdict",
"(*.dict)");
2873 if(save_path.isEmpty())
return;
2875 QStringList string_list = save_path.split(
'/');
2876 last_save_path =
"";
2877 for(qint32 i = 0; i < string_list.length() - 1; i++)
2878 last_save_path += string_list.at(i) +
'/';
2881 qint32 pdict_count = settings.value(
"pdict_count", 8).toInt();
2883 QFile xml_file(save_path);
2884 if(xml_file.open(QIODevice::WriteOnly))
2886 QXmlStreamWriter xmlWriter(&xml_file);
2887 xmlWriter.setAutoFormatting(
true);
2888 xmlWriter.writeStartDocument();
2890 xmlWriter.writeStartElement(
"COUNT");
2891 xmlWriter.writeAttribute(
"of_atoms", QString::number(_adaptive_atom_list.length() * _adaptive_atom_list.first().length()));
2893 qint16 built_count = 0;
2894 qint32 div = floor(_adaptive_atom_list.length() / (qreal)pdict_count);
2895 qint32 mod = _adaptive_atom_list.length() % pdict_count;
2898 for(qint32 j = 0; j < pdict_count; j++)
2900 xmlWriter.writeStartElement(
"built_Atoms");
2901 xmlWriter.writeAttribute(
"formula",
"Gaboratom");
2902 xmlWriter.writeAttribute(
"sample_count", QString::number(_adaptive_atom_list.first().first().sample_count));
2903 xmlWriter.writeAttribute(
"atom_count", QString::number(div * _adaptive_atom_list.first().length()));
2904 xmlWriter.writeAttribute(
"source_dict", save_path.split(
'/').last().split(
'.').first() +
"_" + QString::number(j));
2906 for(qint32 i = 0; i < div; i++)
2908 for(qint32 chn = 0; chn < _adaptive_atom_list.first().length(); chn++)
2910 GaborAtom gabor_atom = _adaptive_atom_list.at(i + j * div).at(chn);
2911 QStringList result_list = gabor_atom.
create_string_values(gabor_atom.sample_count, gabor_atom.scale, gabor_atom.sample_count / 2, gabor_atom.modulation, gabor_atom.phase);
2913 xmlWriter.writeStartElement(
"ATOM");
2914 xmlWriter.writeAttribute(
"ID", QString::number(i * _adaptive_atom_list.first().length() + chn));
2915 xmlWriter.writeAttribute(
"scale", QString::number(gabor_atom.scale));
2916 xmlWriter.writeAttribute(
"modu", QString::number(gabor_atom.modulation));
2917 xmlWriter.writeAttribute(
"phase", QString::number(gabor_atom.phase));
2919 xmlWriter.writeStartElement(
"samples");
2920 QString samples_to_xml;
2921 for (qint32 it = 0; it < result_list.length(); it++)
2923 samples_to_xml.append(result_list.at(it));
2924 samples_to_xml.append(
":");
2926 xmlWriter.writeAttribute(
"samples", samples_to_xml);
2927 xmlWriter.writeEndElement();
2929 xmlWriter.writeEndElement();
2933 xmlWriter.writeEndElement();
2939 xmlWriter.writeStartElement(
"built_Atoms");
2940 xmlWriter.writeAttribute(
"formula",
"Gaboratom");
2941 xmlWriter.writeAttribute(
"sample_count", QString::number(_adaptive_atom_list.first().first().sample_count));
2942 xmlWriter.writeAttribute(
"atom_count", QString::number(mod * _adaptive_atom_list.first().length()));
2943 xmlWriter.writeAttribute(
"source_dict", save_path.split(
'/').last().split(
'.').first() +
"_" + QString::number(built_count));
2945 for(qint32 i = 0; i < mod; i++)
2947 for(qint32 chn = 0; chn < _adaptive_atom_list.first().length(); chn++)
2949 GaborAtom gabor_atom = _adaptive_atom_list.at(i + pdict_count * div).at(chn);
2950 QStringList result_list = gabor_atom.
create_string_values(gabor_atom.sample_count, gabor_atom.scale, gabor_atom.sample_count / 2, gabor_atom.modulation, gabor_atom.phase);
2952 xmlWriter.writeStartElement(
"ATOM");
2953 xmlWriter.writeAttribute(
"ID", QString::number(i * _adaptive_atom_list.first().length() + chn));
2954 xmlWriter.writeAttribute(
"scale", QString::number(gabor_atom.scale));
2955 xmlWriter.writeAttribute(
"modu", QString::number(gabor_atom.modulation));
2956 xmlWriter.writeAttribute(
"phase", QString::number(gabor_atom.phase));
2958 xmlWriter.writeStartElement(
"samples");
2959 QString samples_to_xml;
2960 for (qint32 it = 0; it < result_list.length(); it++)
2962 samples_to_xml.append(result_list.at(it));
2963 samples_to_xml.append(
":");
2965 xmlWriter.writeAttribute(
"samples", samples_to_xml);
2966 xmlWriter.writeEndElement();
2968 xmlWriter.writeEndElement();
2971 xmlWriter.writeEndElement();
2973 xmlWriter.writeEndElement();
2974 xmlWriter.writeEndDocument();
2977 fill_dict_combobox();
2982 bool MainWindow::sort_energy_adaptive(
const QList<GaborAtom> atom_1,
const QList<GaborAtom> atom_2)
2987 for(qint32 i = 0; i < atom_1.length(); i++)
2989 energy_1 += atom_1.at(i).energy;
2990 energy_2 += atom_2.at(i).energy;
2992 return (energy_1 > energy_2);
2999 return (atom_1.energy > atom_2.energy);
3004 void MainWindow::on_cb_Dicts_currentIndexChanged(
const QString &arg1)
3007 ui->lb_info_content->clear();
3009 has_warning =
false;
3014 void MainWindow::on_rb_adativMp_clicked()
3016 ui->cb_Dicts->setEnabled(
false);
3017 ui->lb_info_content->clear();
3019 ui->btt_Calc->setEnabled(
true);
3021 has_warning =
false;
3026 void MainWindow::activate_info_label()
3029 if(!settings.value(
"show_infos",
true).toBool())
3031 ui->lb_info_content->setHidden(
true);
3032 ui->lb_info->setHidden(
true);
3036 ui->lb_info_content->setHidden(
false);
3037 ui->lb_info->setHidden(
false);
3043 void MainWindow::on_dsb_energy_valueChanged(
double arg1)
3046 ui->dsb_energy->setValue(99.9);
3051 void MainWindow::on_actionBeenden_triggered()
3058 void GraphWindow::mouseMoveEvent(QMouseEvent *event)
3060 if(_to - _from != 0)
3062 qint32 temp_pos_x = mapFromGlobal(QCursor::pos()).x() - 55;
3063 qint32 temp_pos_y = this->height() - mapFromGlobal(QCursor::pos()).y();
3065 qreal stretch_factor_x = (this->width() - 55 - 15) / qreal(_samplecount - 1);
3066 qreal stretch_factor_y = (this->height() - _border_margin_height) / _signal_maximum;
3068 qreal time = _from / _sample_rate + _offset_time + temp_pos_x / stretch_factor_x / _sample_rate;
3069 qreal amplitude = temp_pos_y / stretch_factor_y - (this->height() + _x_axis_height) / stretch_factor_y;
3071 if(mapFromGlobal(QCursor::pos()).x() >= 55 && mapFromGlobal(QCursor::pos()).x() <= (this->width() - 15))
3072 this->setToolTip(QString(
"time: %1 sec\namplitude: %2").arg(time).arg(QString::number(amplitude,
'g', 3)));
3073 else this->setToolTip(QString(
"amplitude: %1").arg(QString::number(amplitude,
'g', 3)));
3075 if(event->buttons() == Qt::LeftButton)
3076 setCursor(Qt::ClosedHandCursor);
3078 setCursor(Qt::CrossCursor);
3084 void AtomSumWindow::mouseMoveEvent(QMouseEvent *event)
3087 if(_to - _from != 0)
3089 qint32 temp_pos_x = mapFromGlobal(QCursor::pos()).x() - 55;
3090 qint32 temp_pos_y = this->height() - mapFromGlobal(QCursor::pos()).y();
3092 qreal stretch_factor_x = (this->width() - 55 - 15) / qreal(_samplecount - 1);
3093 qreal stretch_factor_y = (this->height() - _border_margin_height) / _signal_maximum;
3095 qreal time = _from / _sample_rate + _offset_time + temp_pos_x / stretch_factor_x / _sample_rate;
3096 qreal amplitude = temp_pos_y / stretch_factor_y - (this->height() + _x_axis_height) / stretch_factor_y;
3098 if(mapFromGlobal(QCursor::pos()).x() >= 55 && mapFromGlobal(QCursor::pos()).x() <= (this->width() - 15))
3099 this->setToolTip(QString(
"time: %1 sec\namplitude: %2").arg(time).arg(QString::number(amplitude,
'g', 3)));
3100 else this->setToolTip(QString(
"amplitude: %1").arg(QString::number(amplitude,
'g', 3)));
3102 setCursor(Qt::CrossCursor);
3108 void ResiduumWindow::mouseMoveEvent(QMouseEvent *event)
3111 if(_to - _from != 0)
3113 qint32 temp_pos_x = mapFromGlobal(QCursor::pos()).x() - 55;
3114 qint32 temp_pos_y = this->height() - mapFromGlobal(QCursor::pos()).y();
3116 qreal stretch_factor_x = (this->width() - 55 - 15) / qreal(_samplecount - 1);
3117 qreal stretch_factor_y = (this->height() - _border_margin_height) / _signal_maximum;
3119 qreal time = _from / _sample_rate + _offset_time + temp_pos_x / stretch_factor_x / _sample_rate;
3120 qreal amplitude = temp_pos_y / stretch_factor_y - (this->height() + _x_axis_height) / stretch_factor_y;
3122 if(mapFromGlobal(QCursor::pos()).x() >= 55 && mapFromGlobal(QCursor::pos()).x() <= (this->width() - 15))
3123 this->setToolTip(QString(
"time: %1 sec\namplitude: %2").arg(time).arg(QString::number(amplitude,
'g', 3)));
3124 else this->setToolTip(QString(
"amplitude: %1").arg(QString::number(amplitude,
'g', 3)));
3126 setCursor(Qt::CrossCursor);
3132 void GraphWindow::mousePressEvent(QMouseEvent *event)
3135 if(_to - _from != 0)
3137 _press_pos = mapFromGlobal(QCursor::pos()).x();
3138 setCursor(Qt::ClosedHandCursor);
3144 void GraphWindow::mouseReleaseEvent(QMouseEvent *event)
3148 if(_to - _from != 0)
3150 fiff_int_t release_pos = mapFromGlobal(QCursor::pos()).x();
3151 qreal stretch_factor = qreal(this->width() - 55 - 15) / (qreal)(_samplecount);
3152 qint32 old_from = _from;
3153 qint32 old_to = _to;
3154 _from += floor((_press_pos - release_pos) / stretch_factor);
3155 _to = _from + _samplecount - 1;
3156 if(_from < _first_sample - _offset_time * _sample_rate)
3158 _from = _first_sample - _offset_time * _sample_rate;
3159 _to = _from + _samplecount - 1;
3162 if(_to > _last_sample - _offset_time * _sample_rate)
3164 _to = _last_sample - _offset_time * _sample_rate;
3165 _from = _to - _samplecount + 1;
3168 setCursor(Qt::CrossCursor);
3171 if(abs(_press_pos - release_pos) < 5 || old_from == _from || old_to == _to)
3181 void GraphWindow::wheelEvent(QWheelEvent *event)
3184 if(_to - _from != 0)
3186 _samplecount -=
event->angleDelta().y() / 1.875 * _samplecount / 2048;
3188 if(_samplecount > 4096)
3189 _samplecount = 4096;
3191 if(_samplecount < 64)
3193 if(_samplecount == _to - _from + 1)
3196 qreal stretch_factor = qreal(this->width() - 55 - 15) / (qreal)(_to - _from);
3197 qint32 temp_pos = mapFromGlobal(QCursor::pos()).x() - 55;
3198 qint32 actual_sample = _from + floor((qreal)temp_pos / stretch_factor);
3199 qint32 delta_from = (qreal)_samplecount * ((qreal)temp_pos / (qreal)(this->width() - 70));
3201 _from = actual_sample - delta_from;
3203 _to = _from + _samplecount - 1;
3205 if(_from < _first_sample - _offset_time * _sample_rate)
3207 _from = _first_sample - _offset_time * _sample_rate;
3208 _samplecount = _to - _from + 1;
3211 if(_to > _last_sample - _offset_time * _sample_rate)
3213 _to = _last_sample - _offset_time * _sample_rate;
3214 _samplecount = _to - _from + 1;
3222 void MainWindow::on_mouse_button_release()
3224 if(QString::compare(ui->btt_Calc->text(),
"cancel", Qt::CaseInsensitive) == 0 || QString::compare(ui->btt_Calc->text(),
"wait...", Qt::CaseInsensitive) == 0)
3226 read_fiff_changed =
true;
3228 ui->dsb_from->setValue(_from / _sample_rate + _offset_time);
3229 ui->dsb_to->setValue(_to / _sample_rate + _offset_time);
3230 ui->sb_sample_count->setValue(_samplecount);
3232 read_fiff_changed =
false;
3234 if(file_name.split(
'.').last() ==
"fif")
3237 read_fiff_ave_new();
3239 read_fiff_file_new(file_name);
3242 read_matlab_file_new();
3245 void MainWindow::on_rb_OwnDictionary_clicked()
3247 ui->cb_Dicts->setEnabled(
true);
3248 if(ui->cb_Dicts->itemText(0) ==
"")
3249 ui->btt_Calc->setEnabled(
false);
3251 ui->btt_Calc->setEnabled(
true);
GaborAtom used in adaptive MP Algorithm.
void paint_axis(MatrixXd signalMatrix, QSize windowSize)
FiffInfo pick_info(const RowVectorXi &sel=defaultVectorXi) const
void paint_signal(MatrixXd signalMatrix, QSize windowSize)
FixDictAtom used in fix dict MP Algorithm.
VectorXd create_real(qint32 sample_count, qreal scale, quint32 translation, qreal modulation, qreal phase)
QSharedPointer< FiffStream > SPtr
FIFF raw measurement data.
The fixdictMP class provides functions several calculating functions to run the Matching Pursuit Algo...
void paint_residuum(MatrixXd residuum_matrix, QSize windowSize, qreal maxPos, qreal maxNeg)
void paint_atom_sum(MatrixXd atom_matrix, QSize windowSize, qreal signalMaximum, qreal signalNegativeMaximum)
QStringList create_string_values(qint32 sample_count, qreal scale, qint32 translation, qreal modulation, qreal phase)
RowVectorXi pick_types(const QString meg, bool eeg=false, bool stim=false, const QStringList &include=defaultQStringList, const QStringList &exclude=defaultQStringList) const
FiffEvoked pick_channels(const QStringList &include=defaultQStringList, const QStringList &exclude=defaultQStringList) const
The adaptiveMP class provides functions several calculating functions to run the Matching Pursuit Alg...
void fill_dict_combobox()
FIFF class declaration, which provides static wrapper functions to stay consistent with mne matlab to...