MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
frequencyspectrummodel.cpp
Go to the documentation of this file.
1//=============================================================================================================
36//=============================================================================================================
37// INCLUDES
38//=============================================================================================================
39
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
56using namespace DISPLIB;
57using namespace FIFFLIB;
58using 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
78int 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
88int FrequencySpectrumModel::columnCount(const QModelIndex & /*parent*/) const
89{
90 return 2;
91}
92
93//=============================================================================================================
94
95QVariant 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
155QVariant 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
194}
195
196//=============================================================================================================
197
199{
200 m_iScaleType = ScaleType;
201}
202
203//=============================================================================================================
204
205void FrequencySpectrumModel::addData(const MatrixXd &data)
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
245void 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
282void 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
300void 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}
Declaration of the FrequencySpectrumModel Class.
FiffInfo class declaration.
int k
Definition fiff_tag.cpp:324
void newSelection(QList< qint32 > selection)
void setBoundaries(float fLowerFrqBound, float fUpperFrqBound)
void selectRows(const QList< qint32 > &selection)
void addData(const Eigen::MatrixXd &data)
void toggleFreeze(const QModelIndex &index)
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
void setInfo(QSharedPointer< FIFFLIB::FiffInfo > &info)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
QSharedPointer< FiffInfo > SPtr
Definition fiff_info.h:87