MNE-CPP  beta 1.0
covariance.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //*************************************************************************************************************
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "covariance.h"
43 #include "FormFiles/covariancesettingswidget.h"
44 
45 
46 //*************************************************************************************************************
47 //=============================================================================================================
48 // QT INCLUDES
49 //=============================================================================================================
50 
51 #include <QtCore/QtPlugin>
52 #include <QDebug>
53 
54 
55 //*************************************************************************************************************
56 //=============================================================================================================
57 // USED NAMESPACES
58 //=============================================================================================================
59 
60 using namespace CovariancePlugin;
61 using namespace MNEX;
62 using namespace XMEASLIB;
63 
64 
65 //*************************************************************************************************************
66 //=============================================================================================================
67 // DEFINE MEMBER METHODS
68 //=============================================================================================================
69 
71 : m_bIsRunning(false)
72 , m_bProcessData(false)
73 , m_pCovarianceInput(NULL)
74 , m_pCovarianceOutput(NULL)
75 , m_pCovarianceBuffer(CircularMatrixBuffer<double>::SPtr())
76 , m_iEstimationSamples(5000)
77 {
78  m_pActionShowAdjustment = new QAction(QIcon(":/images/covadjustments.png"), tr("Covariance Adjustments"),this);
79 // m_pActionSetupProject->setShortcut(tr("F12"));
80  m_pActionShowAdjustment->setStatusTip(tr("Covariance Adjustments"));
81  connect(m_pActionShowAdjustment, &QAction::triggered, this, &Covariance::showCovarianceWidget);
82  addPluginAction(m_pActionShowAdjustment);
83 // m_pActionShowAdjustment->setVisible(false);
84 }
85 
86 
87 //*************************************************************************************************************
88 
90 {
91  if(this->isRunning())
92  stop();
93 }
94 
95 
96 //*************************************************************************************************************
97 
98 QSharedPointer<IPlugin> Covariance::clone() const
99 {
100  QSharedPointer<Covariance> pCovarianceClone(new Covariance);
101  return pCovarianceClone;
102 }
103 
104 
105 //*************************************************************************************************************
106 //=============================================================================================================
107 // Creating required display instances and set configurations
108 //=============================================================================================================
109 
111 {
112  //
113  // Load Settings
114  //
115  QSettings settings;
116  m_iEstimationSamples = settings.value(QString("Plugin/%1/estimationSamples").arg(this->getName()), 5000).toInt();
117 
118  // Input
119  m_pCovarianceInput = PluginInputData<NewRealTimeMultiSampleArray>::create(this, "CovarianceIn", "Covariance input data");
120  connect(m_pCovarianceInput.data(), &PluginInputConnector::notify, this, &Covariance::update, Qt::DirectConnection);
121  m_inputConnectors.append(m_pCovarianceInput);
122 
123  // Output
124  m_pCovarianceOutput = PluginOutputData<RealTimeCov>::create(this, "CovarianceOut", "Covariance output data");
125  m_outputConnectors.append(m_pCovarianceOutput);
126 
127  //Delete Buffer - will be initailzed with first incoming data
128  if(!m_pCovarianceBuffer.isNull())
129  m_pCovarianceBuffer = CircularMatrixBuffer<double>::SPtr();
130 }
131 
132 
133 //*************************************************************************************************************
134 
136 {
137  //
138  // Store Settings
139  //
140  QSettings settings;
141  settings.setValue(QString("Plugin/%1/estimationSamples").arg(this->getName()), m_iEstimationSamples);
142 }
143 
144 
145 //*************************************************************************************************************
146 
148 {
149  //Check if the thread is already or still running. This can happen if the start button is pressed immediately after the stop button was pressed. In this case the stopping process is not finished yet but the start process is initiated.
150  if(this->isRunning())
151  QThread::wait();
152 
153  m_bIsRunning = true;
154 
155  // Start threads
156  QThread::start();
157 
158  return true;
159 }
160 
161 
162 //*************************************************************************************************************
163 
165 {
166  //Wait until this thread is stopped
167  m_bIsRunning = false;
168 
169  //In case the semaphore blocks the thread -> Release the QSemaphore and let it exit from the pop function (acquire statement)
170  m_pCovarianceBuffer->releaseFromPop();
171 
172  m_pCovarianceBuffer->clear();
173 
174  return true;
175 }
176 
177 
178 //*************************************************************************************************************
179 
181 {
182  return _IAlgorithm;
183 }
184 
185 
186 //*************************************************************************************************************
187 
188 QString Covariance::getName() const
189 {
190  return "Covariance";
191 }
192 
193 
194 //*************************************************************************************************************
195 
196 void Covariance::showCovarianceWidget()
197 {
198  m_pCovarianceWidget = CovarianceSettingsWidget::SPtr(new CovarianceSettingsWidget(this));
199  m_pCovarianceWidget->show();
200 }
201 
202 
203 //*************************************************************************************************************
204 
206 {
207  CovarianceSetupWidget* setupWidget = new CovarianceSetupWidget(this);//widget is later distroyed by CentralWidget - so it has to be created everytime new
208  return setupWidget;
209 }
210 
211 
212 //*************************************************************************************************************
213 
214 void Covariance::update(XMEASLIB::NewMeasurement::SPtr pMeasurement)
215 {
216  QSharedPointer<NewRealTimeMultiSampleArray> pRTMSA = pMeasurement.dynamicCast<NewRealTimeMultiSampleArray>();
217 
218  if(pRTMSA)
219  {
220  //Check if buffer initialized
221  if(!m_pCovarianceBuffer)
222  m_pCovarianceBuffer = CircularMatrixBuffer<double>::SPtr(new CircularMatrixBuffer<double>(64, pRTMSA->getNumChannels(), pRTMSA->getMultiSampleArray()[0].cols()));
223 
224  //Fiff information
225  if(!m_pFiffInfo)
226  {
227  m_pFiffInfo = pRTMSA->info();
228  emit fiffInfoAvailable();
229  }
230 
231 
232  if(m_bProcessData)
233  {
234  MatrixXd t_mat;
235 
236  for(qint32 i = 0; i < pRTMSA->getMultiArraySize(); ++i)
237  {
238  t_mat = pRTMSA->getMultiSampleArray()[i];
239  m_pCovarianceBuffer->push(&t_mat);
240  }
241  }
242  }
243 }
244 
245 
246 //*************************************************************************************************************
247 
248 void Covariance::appendCovariance(FiffCov::SPtr p_pCovariance)
249 {
250  mutex.lock();
251  m_qVecCovData.push_back(p_pCovariance);
252  mutex.unlock();
253 }
254 
255 
256 //*************************************************************************************************************
257 
258 void Covariance::changeSamples(qint32 samples)
259 {
260  m_iEstimationSamples = samples;
261  if(m_pRtCov)
262  m_pRtCov->setSamples(m_iEstimationSamples);
263 }
264 
265 
266 //*************************************************************************************************************
267 
269 {
270  //
271  // Read Fiff Info
272  //
273  while(!m_pFiffInfo)
274  msleep(10);// Wait for fiff Info
275 
276 // m_pActionShowAdjustment->setVisible(true);
277 
278  //
279  // Init Real-Time Covariance estimator
280  //
281  m_pRtCov = RtCov::SPtr(new RtCov(m_iEstimationSamples, m_pFiffInfo));
282  connect(m_pRtCov.data(), &RtCov::covCalculated, this, &Covariance::appendCovariance);
283 
284  //
285  // Start the rt helpers
286  //
287  m_pRtCov->start();
288 
289  //
290  // start processing data
291  //
292  m_bProcessData = true;
293 
294  while (m_bIsRunning)
295  {
296  if(m_bProcessData)
297  {
298  /* Dispatch the inputs */
299  MatrixXd t_mat = m_pCovarianceBuffer->pop();
300 
301  //Add to covariance estimation
302  m_pRtCov->append(t_mat);
303 
304  if(m_qVecCovData.size() > 0)
305  {
306  mutex.lock();
307  m_pCovarianceOutput->data()->setValue(*m_qVecCovData[0]);
308 
309  m_qVecCovData.pop_front();
310  mutex.unlock();
311  }
312  }
313  }
314 
315 // m_pActionShowAdjustment->setVisible(false);
316 
317  m_pRtCov->stop();
318 }
319 
Contains the declaration of the CovarianceSetupWidget class.
QSharedPointer< IAlgorithm > SPtr
Definition: IAlgorithm.h:74
OutputConnectorList m_outputConnectors
Definition: IPlugin.h:222
QSharedPointer< FiffCov > SPtr
Definition: fiff_cov.h:97
Contains the declaration of the Covariance class.
Real-time covariance estimation.
Definition: rtcov.h:107
virtual IPlugin::PluginType getType() const
Definition: covariance.cpp:180
The CovarianceSetupWidget class provides the CovarianceToolbox configuration window.
QSharedPointer< CircularMatrixBuffer > SPtr
void addPluginAction(QAction *pAction)
Definition: IPlugin.h:249
The circular matrix buffer.
void covCalculated(FIFFLIB::FiffCov::SPtr p_pCov)
void push(const Matrix< _Tp, Dynamic, Dynamic > *pMatrix)
QSharedPointer< CovarianceSettingsWidget > SPtr
Definition: arrow.h:75
The Covariance class provides a Covariance algorithm structure.
Definition: covariance.h:107
Matrix< _Tp, Dynamic, Dynamic > pop()
virtual QString getName() const
Definition: covariance.cpp:188
QSharedPointer< NewMeasurement > SPtr
virtual QWidget * setupWidget()
Definition: covariance.cpp:205
virtual QSharedPointer< IPlugin > clone() const
Definition: covariance.cpp:98
static QSharedPointer< PluginOutputData< T > > create(IPlugin *parent, const QString &name, const QString &descr)
QSharedPointer< RtCov > SPtr
Definition: rtcov.h:111
InputConnectorList m_inputConnectors
Definition: IPlugin.h:221
static QSharedPointer< PluginInputData< T > > create(IPlugin *parent, const QString &name, const QString &descr)
The RealTimeMultiSampleArrayNew class is the base class of every RealTimeMultiSampleArrayNew Measurem...