59 RawModel::RawModel(QObject *parent)
60 : QAbstractTableModel(parent)
61 , m_bFileloaded(false)
62 , m_bStartReached(false)
63 , m_bEndReached(false)
65 , m_bProcessing(false)
68 , m_filterChType(
"All")
70 m_iWindowSize = MODEL_WINDOW_SIZE;
71 m_reloadPos = MODEL_RELOAD_POS;
72 m_maxWindows = MODEL_MAX_WINDOWS;
73 m_iFilterTaps = MODEL_NUM_FILTER_TAPS;
76 m_fiffInfo.sfreq = 1024;
82 connect(&m_reloadFutureWatcher,&QFutureWatcher<QPair<MatrixXd,MatrixXd> >::finished,[
this](){
83 insertReloadedData(m_reloadFutureWatcher.future().result());
88 if(!m_assignedOperators.empty())
89 updateOperatorsConcurrently();
95 connect(&m_operatorFutureWatcher,&QFutureWatcher<void>::finished,[
this](){
96 insertProcessedDataAll();
106 RawModel::RawModel(QFile &qFile, QObject *parent)
107 : QAbstractTableModel(parent)
108 , m_bFileloaded(false)
109 , m_bStartReached(false)
110 , m_bEndReached(false)
111 , m_bReloading(false)
112 , m_bProcessing(false)
115 , m_filterChType(
"All")
117 m_iWindowSize = MODEL_WINDOW_SIZE;
118 m_reloadPos = MODEL_RELOAD_POS;
119 m_maxWindows = MODEL_MAX_WINDOWS;
120 m_iFilterTaps = MODEL_NUM_FILTER_TAPS;
123 loadFiffData(&qFile);
129 connect(&m_reloadFutureWatcher,&QFutureWatcher<QPair<MatrixXd,MatrixXd> >::finished,[
this](){
130 insertReloadedData(m_reloadFutureWatcher.future().result());
134 if(!m_assignedOperators.empty())
135 updateOperatorsConcurrently();
141 connect(&m_operatorFutureWatcher,&QFutureWatcher<void>::finished,[
this](){
142 insertProcessedDataAll();
162 int RawModel::columnCount(
const QModelIndex & )
const
170 QVariant RawModel::data(
const QModelIndex &index,
int role)
const
172 if(role != Qt::DisplayRole && role != Qt::BackgroundRole && role != RawModelRoles::GetChannelMean)
175 if (index.isValid()) {
177 if(index.column()==0 && role == Qt::DisplayRole)
181 if(index.column()==1) {
185 case Qt::DisplayRole: {
187 QPair<const double*,qint32> rowVectorPair;
190 QList<RowVectorPair> listRowVectorPair;
192 for(qint16 i=0; i < m_data.size(); ++i) {
194 if(!m_assignedOperators.contains(index.row()) || (m_bProcessing && m_bReloadBefore && i==0) || (m_bProcessing && !m_bReloadBefore && i==m_data.size()-1)) {
195 rowVectorPair.first = m_data[i]->dataRaw().data() + index.row()*m_data[i]->dataRaw().cols();
196 rowVectorPair.second = m_data[i]->dataRaw().cols();
199 rowVectorPair.first = m_data[i]->dataProc().data() + index.row()*m_data[i]->dataProc().cols();
200 rowVectorPair.second = m_data[i]->dataProc().cols();
203 listRowVectorPair.append(rowVectorPair);
206 v.setValue(listRowVectorPair);
211 case Qt::BackgroundRole: {
214 brush.setStyle(Qt::SolidPattern);
216 brush.setColor(Qt::darkRed);
217 return QVariant(brush);
228 if(index.column()==2) {
230 case RawModelRoles::GetChannelMean: {
234 if(!m_assignedOperators.contains(index.row()) || (m_bProcessing && m_bReloadBefore) || (m_bProcessing && !m_bReloadBefore)) {
237 for(
int i = 0; i<m_data.size(); i++)
238 sum += m_data[i]->dataRawMean(index.row());
240 v.setValue(sum/m_data.size());
245 for(
int i = 0; i<m_data.size(); i++)
246 sum += m_data[i]->dataProcMean(index.row());
248 v.setValue(sum/m_data.size());
264 QVariant RawModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
266 if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
269 if(orientation == Qt::Horizontal) {
275 case Qt::DisplayRole:
276 return QVariant(
"data plot");
277 case Qt::TextAlignmentRole:
278 return QVariant(Qt::AlignLeft);
282 else if(orientation == Qt::Vertical) {
283 QModelIndex chname = createIndex(section,0);
285 case Qt::DisplayRole:
286 return QVariant(data(chname).toString());
296 void RawModel::genStdFilterOps()
303 double nyquist_freq = sfreq/2;
305 int fftLength = m_iWindowSize;
306 int exp = ceil(MNEMath::log2(fftLength));
307 fftLength = pow(2, exp+1);
308 m_iCurrentFFTLength = fftLength;
310 FilterOperator::DesignMethod dMethod = FilterOperator::Cosine;
313 double cutoffFreqHz = 50;
314 QString name = QString(
"HPF_%1").arg(cutoffFreqHz);
315 m_Operators.insert(name,QSharedPointer<MNEOperator>(
new FilterOperator(name,FilterOperator::HPF,m_iFilterTaps,cutoffFreqHz/nyquist_freq,5/nyquist_freq,1/nyquist_freq,sfreq,fftLength,dMethod)));
319 name = QString(
"LPF_%1").arg(cutoffFreqHz);
320 m_Operators.insert(name,QSharedPointer<MNEOperator>(
new FilterOperator(name,FilterOperator::LPF,m_iFilterTaps,cutoffFreqHz/nyquist_freq,5/nyquist_freq,1/nyquist_freq,sfreq,fftLength,dMethod)));
322 name = QString(
"LPF_%1").arg(cutoffFreqHz);
323 m_Operators.insert(name,QSharedPointer<MNEOperator>(
new FilterOperator(name,FilterOperator::LPF,m_iFilterTaps,cutoffFreqHz/nyquist_freq,5/nyquist_freq,1/nyquist_freq,sfreq,fftLength,dMethod)));
326 double from_freqHz = 30;
327 double to_freqHz = 40;
328 double trans_width = 5;
329 double bw = to_freqHz-from_freqHz;
330 double center = from_freqHz+bw/2;
332 name = QString(
"BPF_%1-%2").arg(from_freqHz).arg(to_freqHz);
333 m_Operators.insert(name,QSharedPointer<MNEOperator>(
new FilterOperator(name,FilterOperator::BPF,80,(
double)center/nyquist_freq,(
double)bw/nyquist_freq,(
double)trans_width/nyquist_freq,sfreq,fftLength,dMethod)));
338 if(!
m_Operators.contains(QString(
"User defined (See 'Adjust/Filter')"))) {
339 name = QString(
"User defined (See 'Adjust/Filter')");
340 m_Operators.insert(name,QSharedPointer<MNEOperator>(
new FilterOperator(name,FilterOperator::LPF,m_iFilterTaps,cutoffFreqHz/nyquist_freq,5/nyquist_freq,1/nyquist_freq,sfreq,(m_iWindowSize+m_iFilterTaps),dMethod)));
356 qDebug() <<
"RawModel: Standard FilterOperators generated and loaded.";
367 MatrixXd t_data,t_times;
368 QSharedPointer<DataPackage> newDataPackage;
372 m_iAbsFiffCursor =
m_pfiffIO->m_qlistRaw[0]->first_samp;
373 m_bStartReached =
true;
375 int start = m_iAbsFiffCursor;
376 int end = start + m_iWindowSize - 1;
378 if(!
m_pfiffIO->m_qlistRaw[0]->read_raw_segment(t_data, t_times, start, end))
381 newDataPackage = QSharedPointer<DataPackage>(
new DataPackage(t_data, (MatrixXdR)t_times));
386 qDebug(
"RawModel: ERROR! Data set does not contain any fiff data!");
393 m_data.append(newDataPackage);
414 SparseMatrix<double> mult;
423 float quantum_sec = 10.0f;
430 bool first_buffer =
true;
432 fiff_int_t first, last;
436 emit writeProgressRangeChanged(from, to);
438 for(first = from; first < to; first+=quantum) {
439 last = first+quantum-1;
443 if (!
m_pfiffIO->m_qlistRaw[0]->read_raw_segment(data,times,mult,first,last,sel)) {
444 qDebug(
"error during read_raw_segment\n");
448 qDebug(
"Writing...");
451 outfid->write_int(FIFF_FIRST_SAMPLE,&first);
452 first_buffer =
false;
454 outfid->write_raw_buffer(data,mult);
457 emit writeProgressChanged(first);
460 outfid->finish_writing_raw();
469 void RawModel::loadFiffInfos()
472 for(qint32 i=0; i <
m_pfiffIO->m_qlistRaw[0]->info.nchan; ++i)
482 void RawModel::clearModel()
493 m_assignedOperators.clear();
496 m_iAbsFiffCursor = 0;
497 m_iCurAbsScrollPos = 0;
498 m_bStartReached =
false;
499 m_bEndReached =
false;
501 qDebug(
"RawModel cleared.");
507 void RawModel::resetPosition(qint32 position)
514 m_bStartReached =
false;
515 m_bEndReached =
false;
516 m_bReloading =
false;
517 m_bProcessing =
false;
521 qint32 mult = floor(distance / m_iWindowSize);
523 m_iAbsFiffCursor =
firstSample() + mult*m_iWindowSize;
525 MatrixXd t_data,t_times;
527 int start = m_iAbsFiffCursor;
528 int end = start + m_iWindowSize - 1;
531 if(!
m_pfiffIO->m_qlistRaw[0]->read_raw_segment(t_data, t_times, start, end))
532 qDebug() <<
"RawModel: Error resetting position of Fiff file!";
536 QSharedPointer<DataPackage> newDataPackage;
537 newDataPackage = QSharedPointer<DataPackage>(
new DataPackage((MatrixXdR)t_data, (MatrixXdR)t_times));
540 m_data.append(newDataPackage);
542 if(!m_assignedOperators.empty())
550 qDebug() <<
"RawModel: Model Position RESET, samples from " << m_iAbsFiffCursor <<
"to" << m_iAbsFiffCursor+m_iWindowSize-1 <<
"reloaded. actual loaded t_data cols: " << t_data.cols();
552 emit dataChanged(createIndex(0,1),createIndex(
m_chInfolist.size(),1));
558 void RawModel::reloadFiffData(
bool before)
560 m_bReloadBefore = before;
563 fiff_int_t start,end;
565 m_iAbsFiffCursor -= m_iWindowSize;
566 start = m_iAbsFiffCursor;
567 end = start + m_iWindowSize - 1;
571 m_bStartReached =
true;
572 qDebug() <<
"RawModel: Start of fiff file reached.";
581 end = start + m_iWindowSize - 1;
589 m_bEndReached =
true;
592 qDebug() <<
"RawModel: End of fiff file reached.";
599 QFuture<QPair<MatrixXd,MatrixXd> > future = QtConcurrent::run(
this,&RawModel::readSegment,start,end);
605 m_reloadFutureWatcher.setFuture(future);
611 QPair<MatrixXd,MatrixXd> RawModel::readSegment(fiff_int_t from, fiff_int_t to)
613 QPair<MatrixXd,MatrixXd> datatime;
616 if(!
m_pfiffIO->m_qlistRaw[0]->read_raw_segment(datatime.first, datatime.second, from, to)) {
617 printf(
"RawModel: Error when reading raw data!");
631 qDebug() <<
"RawModel: absolute Fiff Scroll Cursor" << m_iCurAbsScrollPos <<
"(m_iAbsFiffCursor" << m_iAbsFiffCursor <<
", sizeOfPreloadedData" <<
sizeOfPreloadedData() <<
", firstSample()" <<
firstSample() <<
")";
634 if(m_iCurAbsScrollPos > (m_iAbsFiffCursor+
sizeOfPreloadedData()+m_iWindowSize) || m_iCurAbsScrollPos < m_iAbsFiffCursor) {
635 qDebug() <<
"RawModel: Reset position requested, m_iAbsFiffCursor:" << m_iAbsFiffCursor <<
"m_iCurAbsScrollPos:" << m_iCurAbsScrollPos;
636 resetPosition(m_iCurAbsScrollPos);
642 if(!m_bReloading && (m_iCurAbsScrollPos-m_iAbsFiffCursor < m_reloadPos) && !m_bStartReached) {
643 qDebug() <<
"RawModel: Reload requested at FRONT of loaded fiff data, m_iAbsFiffCursor:" << m_iAbsFiffCursor <<
"m_iCurAbsScrollPos:" << m_iCurAbsScrollPos;
647 else if(!m_bReloading && m_iCurAbsScrollPos > m_iAbsFiffCursor+
sizeOfPreloadedData()-m_reloadPos && !m_bEndReached) {
648 qDebug() <<
"RawModel: Reload requested at END of loaded fiff data, m_iAbsFiffCursor:" << m_iAbsFiffCursor <<
"m_iCurAbsScrollPos:" << m_iCurAbsScrollPos;
658 for(
int i=0; i < chlist.size(); ++i) {
659 if(chlist[i].column() == 1) {
663 qDebug() <<
"RawModel:" <<
m_chInfolist[chlist[i].row()].ch_name <<
"marked as bad.";
669 qDebug() <<
"RawModel:" <<
m_chInfolist[chlist[i].row()].ch_name <<
"marked as good.";
673 emit dataChanged(chlist[i],chlist[i]);
683 m_filterChType = chType;
689 if(chType ==
"All") {
692 if(!m_assignedOperators.values(i).contains(operatorPtr))
693 m_assignedOperators.insertMulti(i,operatorPtr);
699 if(!m_assignedOperators.values(i).contains(operatorPtr))
700 m_assignedOperators.insertMulti(i,operatorPtr);
704 m_bProcessing =
true;
706 for(
int i=0; i<m_data.size(); i++)
707 updateOperatorsConcurrently(i);
711 m_bProcessing =
false;
715 qDebug() <<
"RawModel: using FilterType" << operatorPtr->m_sName;
726 if(chlist.at(i).column()==1)
728 if(!m_assignedOperators.values(i).contains(operatorPtr))
729 m_assignedOperators.insertMulti(i,operatorPtr);
733 for(qint32 i=0; i < chlist.size(); ++i) {
734 if(chlist.at(i).column()==1) {
735 QString chName = data(index(i,0)).toString();
736 if(!chName.contains(
"STI") && !chName.contains(
"MISC") && !chName.contains(
"TRG"))
737 if(!m_assignedOperators.values(chlist.at(i).row()).contains(operatorPtr))
738 m_assignedOperators.insertMulti(chlist.at(i).row(),operatorPtr);
742 m_bProcessing =
true;
744 for(
int i=0; i<m_data.size(); i++)
745 updateOperatorsConcurrently(i);
749 m_bProcessing =
false;
753 qDebug() <<
"RawModel: using FilterType" << operatorPtr->m_sName;
761 QSharedPointer<FilterOperator> filter;
765 QList<QSharedPointer<MNEOperator> > ops = m_assignedOperators.values(chdata.first);
766 for(qint32 i=0; i < ops.size(); ++i) {
767 switch(ops[i]->m_OperatorType) {
768 case MNEOperator::FILTER: {
773 case MNEOperator::PCA: {
786 for(qint32 i=0; i < m_assignedOperators.values(chan.row()).size(); ++i) {
787 for(qint32 j=0; j < m_assignedOperators.values(chan.row()).size(); ++j) {
788 if(!m_assignedOperators.values(chan.row()).contains(m_assignedOperators.values(chan.row())[j]))
789 m_assignedOperators.insertMulti(chan.row(), m_assignedOperators.values(chan.row())[j]);
793 m_bProcessing =
true;
795 for(
int i=0; i<m_data.size(); i++)
796 updateOperatorsConcurrently(i);
800 m_bProcessing =
false;
812 chlist.append(createIndex(i,1));
814 for(qint32 i=0; i < chlist.size(); ++i) {
815 for(qint32 j=0; j < m_assignedOperators.values(chlist[i].row()).size(); ++j) {
816 if(!m_assignedOperators.values(chlist[i].row()).contains(m_assignedOperators.values(chlist[i].row())[j]))
817 m_assignedOperators.insertMulti(chlist[i].row(), m_assignedOperators.values(chlist[i].row())[j]);
821 m_bProcessing =
true;
823 for(
int i=0; i<m_data.size(); i++)
824 updateOperatorsConcurrently(i);
828 m_bProcessing =
false;
846 for(qint32 i=0; i < chlist.size(); ++i) {
847 if(m_assignedOperators.contains(chlist[i].row()) && m_assignedOperators.values(chlist[i].row()).contains(filterPtr)) {
848 QMutableMapIterator<int,QSharedPointer<MNEOperator> > it(m_assignedOperators);
849 while(it.hasNext()) {
851 if(it.key()==chlist[i].row() && it.value()==filterPtr) {
853 qDebug() <<
"RawModel: Filter operator removed of type" << filterPtr->m_sName <<
"for channel" << chlist[i].row();
861 qDebug() <<
"RawModel: No filter of type" << filterPtr->m_sName <<
"applied to channel" << chlist[i].row();
874 for(qint32 i=0; i < chlist.size(); ++i) {
875 m_assignedOperators.remove(chlist[i].row());
876 qDebug() <<
"RawModel: All filter operator removed of type for channel" << chlist[i].row();
893 m_assignedOperators.remove(i);
904 m_assignedOperators.clear();
912 void RawModel::insertReloadedData(QPair<MatrixXd,MatrixXd> dataTimesPair)
914 QSharedPointer<DataPackage> newDataPackage = QSharedPointer<DataPackage>(
new DataPackage((MatrixXdR)dataTimesPair.first, (MatrixXdR)dataTimesPair.second));
917 if(m_bReloadBefore) {
918 m_data.prepend(newDataPackage);
921 if(m_data.size() > m_maxWindows) {
926 m_data.append(newDataPackage);
929 if(m_data.size() > m_maxWindows) {
930 m_data.removeFirst();
931 m_iAbsFiffCursor += m_iWindowSize;
935 m_bReloading =
false;
937 emit dataChanged(createIndex(0,1),createIndex(
m_chInfolist.size()-1,1));
940 qDebug() <<
"RawModel: Fiff data Reloaded from " << dataTimesPair.second.coeff(0) <<
"secs to" << dataTimesPair.second.coeff(dataTimesPair.second.cols()-1) <<
"secs";
946 void RawModel::updateOperatorsConcurrently()
948 m_bProcessing =
true;
950 QList<int> listFilteredChs = m_assignedOperators.keys();
951 m_listTmpChData.clear();
954 for(qint32 i=0; i < listFilteredChs.size(); ++i) {
956 m_listTmpChData.append(QPair<int,RowVectorXd>(listFilteredChs[i],m_data.first()->dataRawOrig().row(listFilteredChs[i])));
958 m_listTmpChData.append(QPair<int,RowVectorXd>(listFilteredChs[i],m_data.last()->dataRawOrig().row(listFilteredChs[i])));
961 qDebug() <<
"RawModel: Starting of concurrent PROCESSING operation of" << listFilteredChs.size() <<
"items";
975 QFuture<void > future = QtConcurrent::map(m_listTmpChData,[
this](QPair<int,RowVectorXd>& chdata) {
979 m_operatorFutureWatcher.setFuture(future);
984 qDebug() <<
"RawModel: finished concurrent PROCESSING operation of" << listFilteredChs.size() <<
"items";
992 void RawModel::updateOperatorsConcurrently(
int windowIndex)
994 if(windowIndex >= m_data.size() || windowIndex < 0)
997 QList<int> listFilteredChs = m_assignedOperators.keys();
998 m_listTmpChData.clear();
1001 for(qint32 i=0; i < listFilteredChs.size(); ++i) {
1003 m_listTmpChData.append(QPair<int,RowVectorXd>(listFilteredChs[i],m_data[windowIndex]->dataRawOrig().row(listFilteredChs[i])));
1005 m_listTmpChData.append(QPair<int,RowVectorXd>(listFilteredChs[i],m_data[windowIndex]->dataRawOrig().row(listFilteredChs[i])));
1008 qDebug() <<
"RawModel: Starting of concurrent PROCESSING operation of" << listFilteredChs.size() <<
"items in m_data block"<<windowIndex;
1022 QFuture<void > future = QtConcurrent::map(m_listTmpChData,[
this](QPair<int,RowVectorXd>& chdata) {
1027 future.waitForFinished();
1029 qDebug() <<
"RawModel: finished concurrent PROCESSING operation of" << listFilteredChs.size() <<
"items";
1031 insertProcessedDataAll(windowIndex);
1037 void RawModel::insertProcessedDataRow(
int rowIndex)
1039 QList<int> listFilteredChs = m_assignedOperators.keys();
1041 int dataLength = m_iWindowSize;
1043 dataLength = m_data.first()->dataRaw().cols();
1045 dataLength = m_data.last()->dataRaw().cols();
1047 int cutFront = m_iCurrentFFTLength/4;
1048 int cutBack = m_iCurrentFFTLength/4 + (m_listTmpChData[0].second.cols()-m_iCurrentFFTLength/2-dataLength);
1051 m_data.first()->setOrigProcData(m_listTmpChData[rowIndex].second, m_listTmpChData[rowIndex].first, cutFront, cutBack);
1053 m_data.last()->setOrigProcData(m_listTmpChData[rowIndex].second, m_listTmpChData[rowIndex].first, cutFront, cutBack);
1055 performOverlapAdd();
1057 emit dataChanged(createIndex(listFilteredChs[rowIndex],1),createIndex(listFilteredChs[rowIndex],1));
1059 if(rowIndex == listFilteredChs.last())
1060 m_bProcessing =
false;
1066 void RawModel::insertProcessedDataAll(
int windowIndex)
1068 if(windowIndex >= m_data.size() || windowIndex < 0 || m_assignedOperators.empty())
1071 QList<int> listFilteredChs = m_assignedOperators.keys();
1073 int dataLength = m_data[windowIndex]->dataRaw().cols();;
1075 int cutFront = m_iCurrentFFTLength/4;
1076 int cutBack = m_iCurrentFFTLength/4 + (m_listTmpChData[0].second.cols()-m_iCurrentFFTLength/2-dataLength);
1079 for(
int i=0; i < listFilteredChs.size(); ++i)
1080 m_data[windowIndex]->setOrigProcData(m_listTmpChData[i].second, listFilteredChs[i], cutFront, cutBack);
1082 emit dataChanged(createIndex(0,1),createIndex(
m_chInfolist.size(),1));
1084 qDebug() <<
"RawModel: Finished inserting" << listFilteredChs.size() <<
"channels in window "<<windowIndex;
1090 void RawModel::insertProcessedDataAll()
1092 QList<int> listFilteredChs = m_assignedOperators.keys();
1094 int dataLength = m_iWindowSize;
1096 dataLength = m_data.first()->dataRaw().cols();
1098 dataLength = m_data.last()->dataRaw().cols();
1100 int cutFront = m_iCurrentFFTLength/4;
1101 int cutBack = m_iCurrentFFTLength/4 + (m_listTmpChData[0].second.cols()-m_iCurrentFFTLength/2-dataLength);
1104 for(
int i=0; i < listFilteredChs.size(); ++i) {
1106 m_data.first()->setOrigProcData(m_listTmpChData[i].second, listFilteredChs[i], cutFront, cutBack);
1108 m_data.last()->setOrigProcData(m_listTmpChData[i].second, listFilteredChs[i], cutFront, cutBack);
1111 performOverlapAdd();
1113 emit dataChanged(createIndex(0,1),createIndex(
m_chInfolist.size(),1));
1115 qDebug() <<
"RawModel: Finished inserting" << listFilteredChs.size() <<
"channels.";
1116 m_bProcessing =
false;
1122 void RawModel::performOverlapAdd()
1124 if(m_data.empty() || m_data.size()<2)
1127 QList<int> listFilteredChs = m_assignedOperators.keys();
1130 int numberWin = m_data.size();
1131 int cols = m_data[0]->dataProcOrig().cols();
1132 int filterLength = m_iCurrentFFTLength/2;
1136 for(
int i = 0; i<numberWin; i++) {
1137 for(
int j = 0; j<listFilteredChs.size(); j++) {
1138 RowVectorXd front = RowVectorXd::Zero(cols);
1139 RowVectorXd back = RowVectorXd::Zero(cols);
1143 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[i]->dataRaw().cols();
1144 back.segment(cols-filterLength-zeroFFT, filterLength) =
1145 m_data[i+1]->dataProcOrig().row(listFilteredChs[j]).segment(0, filterLength);
1149 if(i > 0 && i < numberWin-1) {
1150 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[i-1]->dataRaw().cols();
1151 front.segment(0, filterLength) =
1152 m_data[i-1]->dataProcOrig().row(listFilteredChs[j]).segment(cols-filterLength-zeroFFT, filterLength);
1154 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[i]->dataRaw().cols();
1155 back.segment(cols-filterLength-zeroFFT, filterLength) =
1156 m_data[i+1]->dataProcOrig().row(listFilteredChs[j]).segment(0, filterLength);
1160 if(i == numberWin-1) {
1161 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[i-1]->dataRaw().cols();
1162 front.segment(0, filterLength) =
1163 m_data[i-1]->dataProcOrig().row(listFilteredChs[j]).segment(cols-filterLength-zeroFFT, filterLength);
1167 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[i]->dataRaw().cols();
1168 m_data[i]->setMappedProcData(m_data[i]->dataProcOrig().row(listFilteredChs[j])+front+back,
1171 filterLength/2+zeroFFT);
1216 void RawModel::performOverlapAdd(
int windowIndex)
1218 if(windowIndex<0 || windowIndex>m_data.size()-1 || m_data.size()<2)
1221 QList<int> listFilteredChs = m_assignedOperators.keys();
1224 int numberWin = m_data.size();
1225 int cols = m_data[windowIndex]->dataProcOrig().cols();
1226 int filterLength = m_iCurrentFFTLength/2;
1229 for(
int j = 0; j<listFilteredChs.size(); j++) {
1230 RowVectorXd front = RowVectorXd::Zero(cols);
1231 RowVectorXd back = RowVectorXd::Zero(cols);
1234 if(windowIndex==0) {
1235 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[windowIndex]->dataRaw().cols();
1236 back.segment(cols-filterLength-zeroFFT, filterLength) =
1237 m_data[windowIndex+1]->dataProcOrig().row(listFilteredChs[j]).segment(0, filterLength);
1241 if(windowIndex > 0 && windowIndex < numberWin-1) {
1242 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[windowIndex-1]->dataRaw().cols();
1243 front.segment(0, filterLength) =
1244 m_data[windowIndex-1]->dataProcOrig().row(listFilteredChs[j]).segment(cols-filterLength-zeroFFT, filterLength);
1246 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[windowIndex]->dataRaw().cols();
1247 back.segment(cols-filterLength-zeroFFT, filterLength) =
1248 m_data[windowIndex+1]->dataProcOrig().row(listFilteredChs[j]).segment(0, filterLength);
1252 if(windowIndex == numberWin-1) {
1253 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[windowIndex-1]->dataRaw().cols();
1254 front.segment(0, filterLength) =
1255 m_data[windowIndex-1]->dataProcOrig().row(listFilteredChs[j]).segment(cols-filterLength-zeroFFT, filterLength);
1259 zeroFFT = m_iCurrentFFTLength - filterLength - m_data[windowIndex]->dataRaw().cols();
1260 m_data[windowIndex]->setMappedProcData(m_data[windowIndex]->dataProcOrig().row(listFilteredChs[j])+front+back,
1263 filterLength/2+zeroFFT);
QSharedPointer< FiffIO > m_pfiffIO
void fileLoaded(const FiffInfo &)
FIFF measurement file information.
The DataPackage class provides central place to hold all program relevant data.
QList< FiffChInfo > m_chInfolist
void updateScrollPos(int value)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void applyOperatorsConcurrently(QPair< int, RowVectorXd > &chdata) const
RowVectorXd applyFFTFilter(const RowVectorXd &data) const
void applyOperator(QModelIndexList chlist, const QSharedPointer< MNEOperator > &operatorPtr, const QString &chType)
void markChBad(QModelIndexList chlist, bool status)
QSharedPointer< FiffStream > SPtr
QMap< QString, QSharedPointer< MNEOperator > > m_Operators
This class represents the model of the model/view framework of mne_browse_raw_qt application. It is derived from QAbstractTableModel so the virtual functions rowCount(),columnCount() and data() needed to be reimplemented. The delegate requests the data for any individual table cell by invoking data(QModelIndex index, int role) and a certain role. DisplayRole is the standard role for requesting the plain data. Other roles such as BackgroundRole are requested to fill a cell with a certain background color with respect to the individual index. For further information see [1].
bool writeFiffData(QIODevice *p_IODevice)
void assignedOperatorsChanged(const QMap< int, QSharedPointer< MNEOperator > > &)
qint32 firstSample() const
bool loadFiffData(QFile *qFile)
qint32 sizeOfPreloadedData() const
qint32 lastSample() const