MNE-CPP  0.1.9
A Framework for Electrophysiology
frequencyspectrummodel.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "frequencyspectrummodel.h"
41 
42 #include <fiff/fiff_info.h>
43 
44 //=============================================================================================================
45 // QT INCLUDES
46 //=============================================================================================================
47 
48 //=============================================================================================================
49 // EIGEN INCLUDES
50 //=============================================================================================================
51 
52 //=============================================================================================================
53 // USED NAMESPACES
54 //=============================================================================================================
55 
56 using namespace DISPLIB;
57 using namespace FIFFLIB;
58 using namespace Eigen;
59 
60 //=============================================================================================================
61 // DEFINE MEMBER METHODS
62 //=============================================================================================================
63 
65 : QAbstractTableModel(parent)
66 , m_fSps(1024.0f)
67 , m_iT(10)
68 , m_bIsFreezed(false)
69 , m_bInitialized(false)
70 , m_iLowerFrqIdx(0)
71 , m_iUpperFrqIdx(0)
72 , m_iScaleType(0)
73 {
74 }
75 
76 //=============================================================================================================
77 
78 int FrequencySpectrumModel::rowCount(const QModelIndex & /*parent*/) const
79 {
80  if(!m_qMapIdxRowSelection.empty())
81  return m_qMapIdxRowSelection.size();
82  else
83  return 0;
84 }
85 
86 //=============================================================================================================
87 
88 int FrequencySpectrumModel::columnCount(const QModelIndex & /*parent*/) const
89 {
90  return 2;
91 }
92 
93 //=============================================================================================================
94 
95 QVariant FrequencySpectrumModel::data(const QModelIndex &index, int role) const
96 {
97  if(role != Qt::DisplayRole && role != Qt::BackgroundRole)
98  return QVariant();
99 
100  if (index.isValid()) {
101  qint32 r = m_qMapIdxRowSelection[index.row()];
102 
103  //******** first column (chname) ********
104  if(index.column() == 0 && role == Qt::DisplayRole)
105  if(m_pFiffInfo)
106  return QVariant(m_pFiffInfo->chs[r].ch_name);
107 
108  //******** second column (data plot) ********
109  if(index.column()==1) {
110  QVariant v;
111 
112  switch(role) {
113  case Qt::DisplayRole: {
114  //pack all adjacent (after reload) RowVectorPairs into a QList
115  RowVectorXd vec;
116 
117  if(m_bIsFreezed)
118  {
119  // data freeze
120  vec = m_dataCurrentFreeze.row(r);
121  v.setValue(vec);
122  }
123  else
124  {
125  // data
126  vec = m_dataCurrent.row(r);
127  v.setValue(vec);
128  }
129  return v;
130  break;
131  }
132  case Qt::BackgroundRole: {
133 // if(m_fiffInfo.bads.contains(m_chInfolist[row].ch_name)) {
134 // QBrush brush;
135 // brush.setStyle(Qt::SolidPattern);
136 // // qDebug() << m_chInfolist[row].ch_name << "is marked as bad, index:" << row;
137 // brush.setColor(Qt::red);
138 // return QVariant(brush);
139 // }
140 // else
141  return QVariant();
142 
143  break;
144  }
145  } // end role switch
146  } // end column check
147 
148  } // end index.valid() check
149 
150  return QVariant();
151 }
152 
153 //=============================================================================================================
154 
155 QVariant FrequencySpectrumModel::headerData(int section, Qt::Orientation orientation, int role) const
156 {
157  if(role != Qt::DisplayRole && role != Qt::TextAlignmentRole)
158  return QVariant();
159 
160  if(orientation == Qt::Horizontal) {
161  switch(section) {
162  case 0: //chname column
163  return QVariant();
164  case 1: //data plot column
165  switch(role) {
166  case Qt::DisplayRole:
167  return QVariant("data plot");
168  case Qt::TextAlignmentRole:
169  return QVariant(Qt::AlignLeft);
170  }
171  return QVariant("data plot");
172  }
173  }
174  else if(orientation == Qt::Vertical) {
175  QModelIndex chname = createIndex(section,0);
176  switch(role) {
177  case Qt::DisplayRole:
178  return QVariant(data(chname).toString());
179  }
180  }
181 
182  return QVariant();
183 }
184 
185 //=============================================================================================================
186 
188 {
189  beginResetModel();
190  m_pFiffInfo = info;
191  endResetModel();
192 
193  resetSelection();
194 }
195 
196 //=============================================================================================================
197 
199 {
200  m_iScaleType = ScaleType;
201 }
202 
203 //=============================================================================================================
204 
206 {
207  m_dataCurrent = data;
208 
209  if(m_vecFreqScale.size() != m_dataCurrent.cols() && m_pFiffInfo)
210  {
211  double freqRes = (m_pFiffInfo->sfreq/2) / m_dataCurrent.cols();
212  double k = 1.0;
213  m_vecFreqScale.resize(1,m_dataCurrent.cols());
214 
215  double currFreq = 0;
216  for(qint32 i = 0; i < m_dataCurrent.cols(); ++i)
217  {
218  if (m_iScaleType) //log
219  m_vecFreqScale[i] = log10(currFreq+k);
220  else // normal
221  m_vecFreqScale[i] = currFreq;
222 
223  currFreq += freqRes;
224  }
225 
226  double max = m_vecFreqScale.maxCoeff();
227  m_vecFreqScale /= max;
228 
229  m_vecFreqScaleBound = m_vecFreqScale;
230  m_iLowerFrqIdx = 0;
231  m_iUpperFrqIdx = m_vecFreqScale.size()-1;
232 
233  m_bInitialized = true;
234  }
235 
236  //Update data content
237  QModelIndex topLeft = this->index(0,1);
238  QModelIndex bottomRight = this->index(m_dataCurrent.rows()-1,1);
239  QVector<int> roles; roles << Qt::DisplayRole;
240  emit dataChanged(topLeft, bottomRight, roles);
241 }
242 
243 //=============================================================================================================
244 
245 void FrequencySpectrumModel::selectRows(const QList<qint32> &selection)
246 {
247  beginResetModel();
248 
249  m_qMapIdxRowSelection.clear();
250 
251  qint32 count = 0;
252  for(qint32 i = 0; i < selection.size(); ++i)
253  {
254  if(selection[i] < m_pFiffInfo->chs.size())
255  {
256  m_qMapIdxRowSelection.insert(count,selection[i]);
257  ++count;
258  }
259  }
260 
261  emit newSelection(selection);
262 
263  endResetModel();
264 }
265 
266 //=============================================================================================================
267 
269 {
270  beginResetModel();
271 
272  m_qMapIdxRowSelection.clear();
273 
274  for(qint32 i = 0; i < m_pFiffInfo->chs.size(); ++i)
275  m_qMapIdxRowSelection.insert(i,i);
276 
277  endResetModel();
278 }
279 
280 //=============================================================================================================
281 
282 void FrequencySpectrumModel::toggleFreeze(const QModelIndex & index)
283 {
284  Q_UNUSED(index);
285 
286  m_bIsFreezed = !m_bIsFreezed;
287 
288  if(m_bIsFreezed)
289  m_dataCurrentFreeze = m_dataCurrent;
290 
291  //Update data content
292  QModelIndex topLeft = this->index(0,1);
293  QModelIndex bottomRight = this->index(m_dataCurrent.rows()-1,1);
294  QVector<int> roles; roles << Qt::DisplayRole;
295  emit dataChanged(topLeft, bottomRight, roles);
296 }
297 
298 //=============================================================================================================
299 
300 void FrequencySpectrumModel::setBoundaries(float fLowerFrqBound, float fUpperFrqBound)
301 {
302  if(!m_bInitialized) {
303  return;
304  }
305 
306  beginResetModel();
307 
308  double nf = m_pFiffInfo->sfreq/2;
309 
310  m_iLowerFrqIdx = 0;
311  m_iUpperFrqIdx = m_vecFreqScale.size()-1;
312 
313  //find boundaries
314  for(qint32 i = 0; i < m_vecFreqScale.size(); ++i) {
315  float val = m_vecFreqScale[i]*nf;
316  if(val < fLowerFrqBound) {
317  m_iLowerFrqIdx = i;
318  }
319 
320  if( val > fUpperFrqBound) {
321  m_iUpperFrqIdx = i;
322  break;
323  }
324  }
325 
326  // scale it new
327  m_vecFreqScaleBound = m_vecFreqScale;
328  for(qint32 i = 0; i < m_vecFreqScaleBound.size(); ++i) {
329  m_vecFreqScaleBound[i] = (m_vecFreqScaleBound[i] - m_vecFreqScale[m_iLowerFrqIdx]) / (m_vecFreqScale[m_iUpperFrqIdx] - m_vecFreqScale[m_iLowerFrqIdx]);
330  }
331 
332  endResetModel();
333 }
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void selectRows(const QList< qint32 > &selection)
void setInfo(QSharedPointer< FIFFLIB::FiffInfo > &info)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
void setBoundaries(float fLowerFrqBound, float fUpperFrqBound)
FiffInfo class declaration.
void newSelection(QList< qint32 > selection)
void toggleFreeze(const QModelIndex &index)
void addData(const Eigen::MatrixXd &data)
QSharedPointer< FiffInfo > SPtr
Definition: fiff_info.h:87
Declaration of the FrequencySpectrumModel Class.