MNE-CPP  0.1.9
A Framework for Electrophysiology
channelinfomodel.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "channelinfomodel.h"
41 #include "mneoperator.h"
42 
43 #include <fiff/fiff_info.h>
44 
45 //=============================================================================================================
46 // QT INCLUDES
47 //=============================================================================================================
48 
49 #include <QVector3D>
50 
51 //=============================================================================================================
52 // EIGEN INCLUDES
53 //=============================================================================================================
54 
55 //=============================================================================================================
56 // USED NAMESPACES
57 //=============================================================================================================
58 
59 using namespace DISPLIB;
60 using namespace Eigen;
61 using namespace FIFFLIB;
62 
63 //=============================================================================================================
64 // DEFINE MEMBER METHODS
65 //=============================================================================================================
66 
67 ChannelInfoModel::ChannelInfoModel(FiffInfo::SPtr& pFiffInfo, QObject *parent)
68 : QAbstractTableModel(parent)
69 , m_pFiffInfo(pFiffInfo)
70 {
71  setFiffInfo(m_pFiffInfo);
72 }
73 
74 //=============================================================================================================
75 
76 ChannelInfoModel::ChannelInfoModel(QObject *parent)
77 : QAbstractTableModel(parent)
78 , m_pFiffInfo(FiffInfo::SPtr(new FiffInfo))
79 {
80 }
81 
82 //=============================================================================================================
83 
84 int ChannelInfoModel::rowCount(const QModelIndex & /*parent*/) const
85 {
86  //Return number of stored evoked sets
87  if(!m_pFiffInfo->chs.size()==0)
88  return m_pFiffInfo->chs.size();
89  else
90  return 0;
91 }
92 
93 //=============================================================================================================
94 
95 int ChannelInfoModel::columnCount(const QModelIndex & /*parent*/) const
96 {
97  return 13;
98 }
99 
100 //=============================================================================================================
101 
102 QVariant ChannelInfoModel::headerData(int section, Qt::Orientation orientation, int role) const
103 {
104  if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
105  return QVariant();
106 
107  switch(role) {
108  case Qt::TextAlignmentRole:
109  return Qt::AlignHCenter + Qt::AlignVCenter;
110 
111  case Qt::DisplayRole: {
112  //Return the number and description/comment of the fiff evoked data in the set as vertical header
113  if(orientation == Qt::Vertical)
114  if(section<m_pFiffInfo->chs.size())
115  return QString("Ch %1").arg(section);
116 
117  //Return the horizontal header
118  if(orientation == Qt::Horizontal) {
119  switch(section) {
120  case 0:
121  return QString("%1").arg("Data number");
122  break;
123 
124  case 1:
125  return QString("%1").arg("Original name");
126  break;
127 
128  case 2:
129  return QString("%1").arg("Alias");
130  break;
131 
132  case 3:
133  return QString("%1").arg("Mapped layout name");
134  break;
135 
136  case 4:
137  return QString("%1").arg("Channel kind");
138  break;
139 
140  case 5:
141  return QString("%1").arg("MEG type");
142  break;
143 
144  case 6:
145  return QString("%1").arg("Unit");
146  break;
147 
148  case 7:
149  return QString("%1").arg("Position");
150  break;
151 
152  case 8:
153  return QString("%1").arg("Digitizer (cm)");
154  break;
155 
156  case 9:
157  return QString("%1").arg("Active filter");
158  break;
159 
160  case 10:
161  return QString("%1").arg("Coil Type");
162  break;
163 
164  case 11:
165  return QString("%1").arg("Bad channel");
166  break;
167 
168  case 12:
169  return QString("%1").arg("# of Compensators");
170  break;
171  }
172  }
173  }
174  }
175 
176  return QVariant();
177 }
178 
179 //=============================================================================================================
180 
181 QVariant ChannelInfoModel::data(const QModelIndex &index, int role) const
182 {
183  if(index.row() >= m_pFiffInfo->chs.size())
184  return QVariant();
185 
186  if (index.isValid()) {
187  //******** first column (channel number - corresponds to row in fiff data matrix) ********
188  if(index.column()==0) {
189  QVariant v;
190 
191  switch(role) {
192  case Qt::DisplayRole:
193  v.setValue(index.row());
194  return v;
195 
196  case ChannelInfoModelRoles::GetChNumber:
197  v.setValue(index.row());
198  return v;
199 
200  case Qt::TextAlignmentRole:
201  return Qt::AlignHCenter + Qt::AlignVCenter;
202  }
203  }//end column check
204 
205  //******** second column (original channel name) ********
206  if(index.column()==1) {
207  QVariant v;
208 
209  switch(role) {
210  case Qt::DisplayRole:
211  v.setValue(QString("%1").arg(m_pFiffInfo->chs.at(index.row()).ch_name));
212  return v;
213 
214  case ChannelInfoModelRoles::GetOrigChName:
215  v.setValue(QString("%1").arg(m_pFiffInfo->chs.at(index.row()).ch_name));
216  return v;
217 
218  case Qt::TextAlignmentRole:
219  return Qt::AlignHCenter + Qt::AlignVCenter;
220  }
221  }//end column check
222 
223  //******** third column (channel alias) ********
224  if(index.column()==2) {
225  QVariant v;
226 
227  switch(role) {
228  case Qt::DisplayRole:
229  if(index.row()<m_aliasNames.size())
230  v.setValue(QString("%1").arg(m_aliasNames.at(index.row())));
231  return v;
232 
233  case ChannelInfoModelRoles::GetChAlias:
234  if(index.row()<m_aliasNames.size())
235  v.setValue(QString("%1").arg(m_aliasNames.at(index.row())));
236  return v;
237 
238  case Qt::TextAlignmentRole:
239  return Qt::AlignHCenter + Qt::AlignVCenter;
240  }
241  }//end column check
242 
243  //******** fourth column (mapped layout channel name) ********
244  if(index.column()==3) {
245  QVariant v;
246 
247  switch(role) {
248  case Qt::DisplayRole:
249  if(index.row()<m_mappedLayoutChNames.size())
250  v.setValue(QString("%1").arg(m_mappedLayoutChNames.at(index.row())));
251  return v;
252 
253  case ChannelInfoModelRoles::GetMappedLayoutChName:
254  if(index.row()<m_mappedLayoutChNames.size())
255  v.setValue(QString("%1").arg(m_mappedLayoutChNames.at(index.row())));
256  return v;
257 
258  case Qt::TextAlignmentRole:
259  return Qt::AlignHCenter + Qt::AlignVCenter;
260  }
261  }//end column check
262 
263  //******** fifth column (channel kind - MEG, EEG, etc) ********
264  if(index.column()==4) {
265  QVariant v;
266 
267  switch(role) {
268  case Qt::DisplayRole:
269  v.setValue(QString("%1").arg(m_pFiffInfo->chs.at(index.row()).kind));
270  return v;
271 
272  case ChannelInfoModelRoles::GetChKind:
273  v.setValue(m_pFiffInfo->chs.at(index.row()).kind);
274  return v;
275 
276  case Qt::TextAlignmentRole:
277  return Qt::AlignHCenter + Qt::AlignVCenter;
278  }
279  }//end column check
280 
281  //******** sixth column (MEG type) ********
282  if(index.column()==5) {
283  QVariant v;
284 
285  v.setValue(QString("%1").arg("non_MEG"));
286 
287  if(m_pFiffInfo->chs.at(index.row()).kind == FIFFV_MEG_CH) {
288  qint32 unit = m_pFiffInfo->chs.at(index.row()).unit;
289  if(unit == FIFF_UNIT_T_M)
290  v.setValue(QString("MEG_grad"));
291  else if(unit == FIFF_UNIT_T)
292  v.setValue(QString("MEG_mag"));
293  }
294 
295  switch(role) {
296  case Qt::DisplayRole:
297  return v;
298 
299  case ChannelInfoModelRoles::GetMEGType:
300  return v;
301 
302  case Qt::TextAlignmentRole:
303  return Qt::AlignHCenter + Qt::AlignVCenter;
304  }
305  }//end column check
306 
307  //******** seventh column (channel unit) ********
308  if(index.column()==6) {
309  QVariant v;
310 
311  switch(role) {
312  case Qt::DisplayRole:
313  v.setValue(QString("%1").arg(m_pFiffInfo->chs.at(index.row()).unit));
314  return v;
315 
316  case ChannelInfoModelRoles::GetChUnit:
317  v.setValue(m_pFiffInfo->chs.at(index.row()).unit);
318  return v;
319 
320  case Qt::TextAlignmentRole:
321  return Qt::AlignHCenter + Qt::AlignVCenter;
322  }
323  }//end column check
324 
325  //******** eigth column (channel layout position) ********
326  if(index.column()==7) {
327  QVariant v;
328 
329  QPointF point = m_layoutMap[m_mappedLayoutChNames.at(index.row())];
330 
331  switch(role) {
332  case Qt::DisplayRole:
333  v.setValue(QString("(%1|%2)").arg(point.x()).arg(point.y()));
334  return v;
335 
336  case ChannelInfoModelRoles::GetChPosition:
337  v.setValue(point);
338  return v;
339 
340  case Qt::TextAlignmentRole:
341  return Qt::AlignHCenter + Qt::AlignVCenter;
342  }
343  }//end column check
344 
345  //******** ninth column (channel digitizer position) ********
346  if(index.column()==8) {
347  QVariant v;
348 
349  QVector3D point3D( m_pFiffInfo->chs.at(index.row()).chpos.r0[0] * 100, //convert to cm
350  m_pFiffInfo->chs.at(index.row()).chpos.r0[1] * 100,
351  m_pFiffInfo->chs.at(index.row()).chpos.r0[2] * 100 );
352 
353  switch(role) {
354  case Qt::DisplayRole:
355  v.setValue(QString("(%1|%2|%3)").arg(point3D.x()).arg(point3D.y()).arg(point3D.z()));
356  return v;
357 
358  case ChannelInfoModelRoles::GetChDigitizer:
359  v.setValue(point3D);
360  return v;
361 
362  case Qt::TextAlignmentRole:
363  return Qt::AlignHCenter + Qt::AlignVCenter;
364  }
365  }//end column check
366 
367  //******** tenth column (active channel filter type) ********
368  if(index.column()==9) {
369  QVariant v;
370 
371 // //Check if mne operator is a filter operator
372 // QSharedPointer<MNEOperator> operatorPtr = m_assignedOperators.value(index.row(), QSharedPointer<MNEOperator>(new MNEOperator()));
373 // QSharedPointer<FilterOperator> filterOperator;
374 
375  switch(role) {
376  case Qt::DisplayRole: {
377  return v;
378  }
379 // if(operatorPtr->m_OperatorType == MNEOperator::FILTER) {
380 // filterOperator = operatorPtr.staticCast<FilterOperator>();
381 // }
382 // else {
383 // v.setValue(QString("%1").arg("none"));
384 // return v;
385 // }
386 
387 // switch(filterOperator->m_Type) {
388 // case FilterOperator::LPF: {
389 // v.setValue(QString("%1 | %2").arg("LP").arg(filterOperator->m_dCenterFreq*m_pFiffInfo->sfreq/2));
390 // return v;
391 // }
392 
393 // case FilterOperator::HPF: {
394 // v.setValue(QString("%1 | %2").arg("HP").arg(filterOperator->m_dCenterFreq*m_pFiffInfo->sfreq/2));
395 // return v;
396 // }
397 
398 // case FilterOperator::BPF: {
399 // double fsample = m_pFiffInfo->sfreq;
400 // double low = (filterOperator->m_dCenterFreq*fsample/2) - (filterOperator->m_dBandwidth*fsample/4); // /4 because we also need to devide by 2 to get the nyquist freq
401 // double high = (filterOperator->m_dCenterFreq*fsample/2) + (filterOperator->m_dBandwidth*fsample/4);
402 // v.setValue(QString("%1 | %2 | %3").arg("BP").arg(low).arg(high));
403 // return v;
404 // }
405 
406 // case FilterOperator::NOTCH: {
407 // double fsample = m_pFiffInfo->sfreq;
408 // double low = (filterOperator->m_dCenterFreq*fsample/2) - (filterOperator->m_dBandwidth*fsample/4);
409 // double high = (filterOperator->m_dCenterFreq*fsample/2) + (filterOperator->m_dBandwidth*fsample/4);
410 // v.setValue(QString("%1 | %2 | %3").arg("NOTCH").arg(low).arg(high));
411 // return v;
412 // }
413 // }
414 // }
415 
416 // case ChannelInfoModelRoles::GetChActiveFilter: {
417 // if(operatorPtr->m_OperatorType == MNEOperator::FILTER) {
418 // filterOperator = operatorPtr.staticCast<FilterOperator>();
419 // }
420 // else {
421 // v.setValue(QString("%1").arg("none"));
422 // return v;
423 // }
424 
425 // v.setValue(operatorPtr);
426 // return v;
427 // }
428 
429  case Qt::TextAlignmentRole:
430  return Qt::AlignHCenter + Qt::AlignVCenter;
431  }
432  }
433 
434  //******** eleventh column (coil type) ********
435  if(index.column()==10) {
436  QVariant v;
437 
438  switch(role) {
439  case Qt::DisplayRole:
440  v.setValue(QString("%1").arg(m_pFiffInfo->chs.at(index.row()).chpos.coil_type));
441  return v;
442 
443  case ChannelInfoModelRoles::GetChCoilType:
444  v.setValue(m_pFiffInfo->chs.at(index.row()).chpos.coil_type);
445  return v;
446 
447  case Qt::TextAlignmentRole:
448  return Qt::AlignHCenter + Qt::AlignVCenter;
449  }
450  }//end column check
451 
452  //******** twelve column (channel bad) ********
453  if(index.column()==11) {
454  QVariant v;
455  bool isBad = false;
456  QString chName = m_pFiffInfo->chs.at(index.row()).ch_name;
457 
458  switch(role) {
459  case Qt::DisplayRole:
460  isBad = m_pFiffInfo->bads.contains(chName);
461  v.setValue(isBad);
462  return v;
463 
464  case ChannelInfoModelRoles::GetIsBad:
465  isBad = m_pFiffInfo->bads.contains(chName);
466  v.setValue(isBad);
467  return v;
468 
469  case Qt::TextAlignmentRole:
470  return Qt::AlignHCenter + Qt::AlignVCenter;
471  }
472  }//end column check
473 
474  //******** twelve column (compensators bad) ********
475  if(index.column()==12) {
476  QVariant v;
477 
478  switch(role) {
479  case Qt::DisplayRole:
480  v.setValue(m_pFiffInfo->comps.size());
481  return v;
482 
483  case Qt::TextAlignmentRole:
484  return Qt::AlignHCenter + Qt::AlignVCenter;
485  }
486  }//end column check
487  } // end index.valid() check
488 
489  return QVariant();
490 }
491 
492 //=============================================================================================================
493 
494 bool ChannelInfoModel::insertRows(int position, int span, const QModelIndex & parent)
495 {
496  Q_UNUSED(position);
497  Q_UNUSED(span);
498  Q_UNUSED(parent);
499 
500  return true;
501 }
502 
503 //=============================================================================================================
504 
505 bool ChannelInfoModel::removeRows(int position, int span, const QModelIndex & parent)
506 {
507  Q_UNUSED(position);
508  Q_UNUSED(span);
509  Q_UNUSED(parent);
510 
511  return true;
512 }
513 
514 //=============================================================================================================
515 
516 Qt::ItemFlags ChannelInfoModel::flags(const QModelIndex & index) const
517 {
518  Q_UNUSED(index);
519  return Qt::ItemIsEnabled | Qt::ItemIsSelectable /*| Qt::ItemIsEditable*/;
520 }
521 
522 //=============================================================================================================
523 
524 bool ChannelInfoModel::setData(const QModelIndex &index, const QVariant &value, int role)
525 {
526  Q_UNUSED(index);
527  Q_UNUSED(value);
528  Q_UNUSED(role);
529 
530  return true;
531 }
532 
533 //=============================================================================================================
534 
536 {
537  beginResetModel();
538 
539  m_pFiffInfo = pFiffInfo;
540  m_aliasNames = m_pFiffInfo->ch_names;
541  m_mappedLayoutChNames = m_pFiffInfo->ch_names;
542 
543  mapLayoutToChannels();
544 
545  endResetModel();
546 
547  emit dataChanged(createIndex(0,0), createIndex(rowCount(), columnCount()));
548 }
549 
550 //=============================================================================================================
551 
552 void ChannelInfoModel::assignedOperatorsChanged(const QMap<int,QSharedPointer<MNEOperator> > &assignedOperators)
553 {
554  beginResetModel();
555 
556  m_assignedOperators = assignedOperators;
557 
558  endResetModel();
559 
560  emit dataChanged(createIndex(0,0), createIndex(rowCount(), columnCount()));
561 }
562 
563 //=============================================================================================================
564 
565 void ChannelInfoModel::layoutChanged(const QMap<QString,QPointF> &layoutMap)
566 {
567  beginResetModel();
568 
569  m_layoutMap = layoutMap;
570  m_aliasNames = m_pFiffInfo->ch_names;
571  m_mappedLayoutChNames = m_pFiffInfo->ch_names;
572 
573  mapLayoutToChannels();
574 
575  endResetModel();
576 
577  emit dataChanged(createIndex(0,0), createIndex(rowCount(), columnCount()));
578 }
579 
580 //=============================================================================================================
581 
583 {
584 
585  return m_mappedLayoutChNames;
586 }
587 
588 //=============================================================================================================
589 
591 {
592  return m_pFiffInfo->ch_names.indexOf(chName);
593 }
594 
595 //=============================================================================================================
596 
598 {
599  return m_mappedLayoutChNames.indexOf(chName);
600 }
601 
602 //=============================================================================================================
603 
605 {
606  return m_pFiffInfo->bads;
607 }
608 
609 //=============================================================================================================
610 
612 {
613  //Map channels to layout
614  QList<FiffChInfo> channelList = m_pFiffInfo->chs;
615  for(int i = 0; i<channelList.size(); i++) {
616  //Get current channel information
617  FiffChInfo chInfo = channelList.at(i);
618  QString chName = chInfo.ch_name;
619  QRegExp regExpRemove;
620  bool flagOk = false;
621 
622  switch(chInfo.kind) {
623  case FIFFV_MEG_CH:
624  //Scan for MEG string and other characters
625  regExpRemove = QRegExp("(MEG|-|_|/|\| )");
626  chName.remove(regExpRemove);
627 
628  //After cleaning the string try to convert the residual to an int number
629  flagOk = false;
630  m_mappedLayoutChNames.replace(i, QString("%1 %2").arg("MEG").arg(chName));
631 
632  break;
633 
634  case FIFFV_EEG_CH: {
635  //Scan for EEG string and other characters
636  regExpRemove = QRegExp("(EEG|-|_|/|\| )");
637  chName.remove(regExpRemove);
638 
639  //After cleaning the string try to convert the residual to an int number
640  flagOk = false;
641  m_mappedLayoutChNames.replace(i, QString("%1 %2").arg("EEG").arg(chName));
642 
643  break;
644  }
645  }
646  } //end fiff chs
647 
648  emit channelsMappedToLayout(m_mappedLayoutChNames);
649 }
650 
651 //=============================================================================================================
652 
654 {
655  beginResetModel();
656 
657  m_pFiffInfo = FiffInfo::SPtr(new FiffInfo);
658  m_layoutMap.clear();
659  m_aliasNames.clear();
660  m_mappedLayoutChNames.clear();
661 
662  endResetModel();
663 
664  qDebug("ChannelInfoModel cleared.");
665 }
int getIndexFromMappedChName(QString chName)
QSharedPointer< FiffInfo > SPtr
Definition: fiff_info.h:87
The declaration for ChannelInfoModel..
void layoutChanged(const QMap< QString, QPointF > &layoutMap)
QSharedPointer< BidsViewModel > SPtr
FIFF measurement file information.
Definition: fiff_info.h:84
Declaration of the MNEOperator Class.
void setFiffInfo(QSharedPointer< FIFFLIB::FiffInfo > &pFiffInfo)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void assignedOperatorsChanged(const QMap< int, QSharedPointer< MNEOperator > > &assignedOperators)
FiffInfo class declaration.
int getIndexFromOrigChName(QString chName)
const QStringList & getMappedChannelsList()
Channel info descriptor.
Definition: fiff_ch_info.h:74