MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
rtdataclient.cpp
Go to the documentation of this file.
1//=============================================================================================================
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "rtdataclient.h"
42#include <fiff/fiff_file.h>
43
44//=============================================================================================================
45// USED NAMESPACES
46//=============================================================================================================
47
48using namespace COMMUNICATIONLIB;
49using namespace FIFFLIB;
50using namespace Eigen;
51
52//=============================================================================================================
53// DEFINE MEMBER METHODS
54//=============================================================================================================
55
57: QTcpSocket(parent)
58, m_clientID(-1)
59{
61}
62
63//=============================================================================================================
64
66{
67 QTcpSocket::disconnectFromHost();
68 m_clientID = -1;
69}
70
71//=============================================================================================================
72
74{
75 if(m_clientID == -1)
76 {
77// sendFiffCommand(1);//MNE_RT.MNE_RT_GET_CLIENT_ID)
78
79 FiffStream t_fiffStream(this);
80
81 QString t_sCommand("");
82 t_fiffStream.write_rt_command(1, t_sCommand);
83
84 this->waitForReadyRead(100);
85 // ID is send as answer
86 FiffTag::SPtr t_pTag;
87 t_fiffStream.read_tag(t_pTag);
88 if (t_pTag->kind == FIFF_MNE_RT_CLIENT_ID)
89 m_clientID = *t_pTag->toInt();
90 }
91 return m_clientID;
92}
93
94//=============================================================================================================
95
97{
98 FiffInfo::SPtr p_pFiffInfo(new FiffInfo());
99 bool t_bReadMeasBlockStart = false;
100 bool t_bReadMeasBlockEnd = false;
101 QString col_names, row_names;
102
103 FiffStream t_fiffStream(this);
104 //
105 // Find the start
106 //
107 FiffTag::SPtr t_pTag;
108 while(!t_bReadMeasBlockStart)
109 {
110 t_fiffStream.read_rt_tag(t_pTag);
111 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MEAS_INFO)
112 {
113 printf("FIFF_BLOCK_START FIFFB_MEAS_INFO\n");
114 t_bReadMeasBlockStart = true;
115 }
116 }
117
118 //
119 // Parse until the endblock
120 //
121
122 bool dev_head_t_read = false;
123 bool ctf_head_t_read = false;
124
125 while(!t_bReadMeasBlockEnd)
126 {
127 t_fiffStream.read_rt_tag(t_pTag);
128 //
129 // megacq parameters
130 //
131 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_DACQ_PARS)
132 {
133 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_DACQ_PARS)
134 {
135 t_fiffStream.read_rt_tag(t_pTag);
136 if(t_pTag->kind == FIFF_DACQ_PARS)
137 p_pFiffInfo->acq_pars = t_pTag->toString();
138 else if(t_pTag->kind == FIFF_DACQ_STIM)
139 p_pFiffInfo->acq_stim = t_pTag->toString();
140 }
141 }
142 //
143 // Coordinate transformations if the HPI result block was not there
144 //
145 if (t_pTag->kind == FIFF_COORD_TRANS)
146 {
147 if (!dev_head_t_read)
148 {
149 p_pFiffInfo->dev_head_t = t_pTag->toCoordTrans();
150 dev_head_t_read = true;
151 }
152 else if (!ctf_head_t_read)
153 {
154 p_pFiffInfo->ctf_head_t = t_pTag->toCoordTrans();
155 ctf_head_t_read = true;
156 }
157 }
158 //
159 // Polhemus data
160 //
161 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_ISOTRAK)
162 {
163 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_ISOTRAK)
164 {
165 t_fiffStream.read_rt_tag(t_pTag);
166
167 if(t_pTag->kind == FIFF_DIG_POINT)
168 p_pFiffInfo->dig.append(t_pTag->toDigPoint());
169 }
170 }
171 //
172 // Projectors
173 //
174 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_PROJ)
175 {
176 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_PROJ)
177 {
178 t_fiffStream.read_rt_tag(t_pTag);
179 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_PROJ_ITEM)
180 {
181 FiffProj proj;
182 qint32 countProj = p_pFiffInfo->projs.size();
183 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_PROJ_ITEM)
184 {
185 t_fiffStream.read_rt_tag(t_pTag);
186 switch (t_pTag->kind)
187 {
188 case FIFF_NAME: // First proj -> Proj is created
189 proj = FiffProj();
190 p_pFiffInfo->projs.append(proj);
191 p_pFiffInfo->projs[countProj].desc = t_pTag->toString();
192 break;
193 case FIFF_PROJ_ITEM_KIND:
194 p_pFiffInfo->projs[countProj].kind = *(t_pTag->toInt());
195 break;
196 case FIFF_NCHAN: // First data -> FiffNamedMatrix is created
197 p_pFiffInfo->projs[countProj].data->ncol = *(t_pTag->toInt());
198 break;
199 case FIFF_PROJ_ITEM_NVEC:
200 p_pFiffInfo->projs[countProj].data->nrow = *(t_pTag->toInt());
201 break;
203 p_pFiffInfo->projs[countProj].active = *(t_pTag->toInt());
204 break;
205 case FIFF_PROJ_ITEM_CH_NAME_LIST:
206 p_pFiffInfo->projs[countProj].data->col_names = FiffStream::split_name_list(t_pTag->toString());
207 break;
208 case FIFF_PROJ_ITEM_VECTORS:
209 //ToDo: Test; Float Matrix
210 p_pFiffInfo->projs[countProj].data->data = t_pTag->toFloatMatrix().transpose().cast<double>();
211 break;
212 }
213 }
214 }
215 }
216 }
217 // Check consisty
218 for(qint32 i = 0; i < p_pFiffInfo->projs.size(); ++i)
219 {
220 if(p_pFiffInfo->projs[i].data->data.rows() != p_pFiffInfo->projs[i].data->nrow)
221 p_pFiffInfo->projs[i].data->data.transposeInPlace();
222 }
223
224 //
225 // CTF compensation info
226 //
227 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_CTF_COMP)
228 {
229 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_CTF_COMP)
230 {
231 t_fiffStream.read_rt_tag(t_pTag);
232 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_CTF_COMP_DATA)
233 {
234 FiffCtfComp comp;
235 qint32 countComp = p_pFiffInfo->comps.size();
236 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_CTF_COMP_DATA)
237 {
238 t_fiffStream.read_rt_tag(t_pTag);
239 switch (t_pTag->kind)
240 {
241 case FIFF_MNE_CTF_COMP_KIND: //First comp -> create comp
242 comp = FiffCtfComp();
243 p_pFiffInfo->comps.append(comp);
244 p_pFiffInfo->comps[countComp].ctfkind = *(t_pTag->toInt());
245
246 if (p_pFiffInfo->comps[countComp].ctfkind == 1194410578) //hex2dec('47314252')
247 p_pFiffInfo->comps[countComp].kind = 1;
248 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194476114) //hex2dec('47324252')
249 p_pFiffInfo->comps[countComp].kind = 2;
250 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194541650) //hex2dec('47334252')
251 p_pFiffInfo->comps[countComp].kind = 3;
252 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194479433)
253 p_pFiffInfo->comps[countComp].kind = 4;
254 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194544969)
255 p_pFiffInfo->comps[countComp].kind = 5;
256 else
257 p_pFiffInfo->comps[countComp].kind = p_pFiffInfo->comps[countComp].ctfkind;
258 break;
260 p_pFiffInfo->comps[countComp].save_calibrated = *(t_pTag->toInt());
261 break;
262 case FIFF_MNE_NROW:
263 p_pFiffInfo->comps[countComp].data->nrow = *(t_pTag->toInt());
264 break;
265 case FIFF_MNE_NCOL:
266 p_pFiffInfo->comps[countComp].data->ncol = *(t_pTag->toInt());
267 break;
268 case FIFF_MNE_ROW_NAMES:
269 row_names = t_pTag->toString();
270 if (!row_names.isEmpty())
271 p_pFiffInfo->comps[countComp].data->row_names = FiffStream::split_name_list(row_names);
272 break;
273 case FIFF_MNE_COL_NAMES:
274 col_names = t_pTag->toString();
275 if (!col_names.isEmpty())
276 p_pFiffInfo->comps[countComp].data->col_names = FiffStream::split_name_list(col_names);
277 break;
279 //ToDo: Test; Float Matrix
280 p_pFiffInfo->comps[countComp].data->data = t_pTag->toFloatMatrix().transpose().cast<double>();
281 break;
282 }
283 }
284 }
285 }
286 }
287 //
288 // Bad channels
289 //
290 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_BAD_CHANNELS)
291 {
292 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_BAD_CHANNELS)
293 {
294 t_fiffStream.read_rt_tag(t_pTag);
295 if(t_pTag->kind == FIFF_MNE_CH_NAME_LIST)
296 p_pFiffInfo->bads = FiffStream::split_name_list(t_pTag->data());
297 }
298 }
299 //
300 // General
301 //
302 switch(t_pTag->kind)
303 {
304 case FIFF_SFREQ:
305 p_pFiffInfo->sfreq = *(t_pTag->toFloat());
306 break;
307 case FIFF_LINE_FREQ:
308 p_pFiffInfo->linefreq = *(t_pTag->toFloat());
309 break;
310 case FIFF_HIGHPASS:
311 p_pFiffInfo->highpass = *(t_pTag->toFloat());
312 break;
313 case FIFF_LOWPASS:
314 p_pFiffInfo->lowpass = *(t_pTag->toFloat());
315 break;
316 case FIFF_NCHAN:
317 p_pFiffInfo->nchan = *(t_pTag->toInt());
318 break;
319 case FIFF_MEAS_DATE:
320 p_pFiffInfo->meas_date[0] = t_pTag->toInt()[0];
321 p_pFiffInfo->meas_date[1] = t_pTag->toInt()[1];
322 break;
323 case FIFF_PROJ_ID:
324 p_pFiffInfo->proj_id = *t_pTag->toInt();
325 break;
326 case FIFF_PROJ_NAME:
327 p_pFiffInfo->proj_name = t_pTag->toString();
328 break;
330 p_pFiffInfo->xplotter_layout = t_pTag->toString();
331 break;
333 p_pFiffInfo->experimenter = t_pTag->toString();
334 break;
335 case FIFF_DESCRIPTION:
336 p_pFiffInfo->description = t_pTag->toString();
337 break;
339 p_pFiffInfo->gantry_angle = *t_pTag->toInt();
340 break;
341 case FIFF_UTC_OFFSET:
342 p_pFiffInfo->utc_offset = t_pTag->toString();
343 break;
344 }
345
346 if (t_pTag->kind == FIFF_CH_INFO)
347 p_pFiffInfo->chs.append(t_pTag->toChInfo());
348
349 // END MEAS
350 if(t_pTag->kind == FIFF_BLOCK_END && *t_pTag->toInt() == FIFFB_MEAS_INFO)
351 {
352 printf("FIFF_BLOCK_END FIFFB_MEAS_INFO\n");
353 t_bReadMeasBlockEnd = true;
354 }
355 }
356
357 //
358 // Add the channel information and make a list of channel names
359 // for convenience
360 //
361 for (qint32 c = 0; c < p_pFiffInfo->nchan; ++c)
362 p_pFiffInfo->ch_names << p_pFiffInfo->chs[c].ch_name;
363
364 return p_pFiffInfo;
365}
366
367//=============================================================================================================
368
370{
372 FiffInfo::SPtr p_pFiffInfo(new FiffInfo());
373
374 bool t_bReadMeasBlockStart = false;
375 bool t_bReadMeasBlockEnd = false;
376 QString col_names, row_names;
377
378 FiffStream t_fiffStream(this);
379 //
380 // Find the start
381 //
382 FiffTag::SPtr t_pTag;
383 while(!t_bReadMeasBlockStart)
384 {
385 t_fiffStream.read_rt_tag(t_pTag);
386 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MEAS_INFO)
387 {
388 printf("FIFF_BLOCK_START FIFFB_MEAS_INFO\n");
389 t_bReadMeasBlockStart = true;
390 }
391 }
392
393 //
394 // Parse until the endblock
395 //
396
397 bool dev_head_t_read = false;
398 bool ctf_head_t_read = false;
399
400 while(!t_bReadMeasBlockEnd)
401 {
402 t_fiffStream.read_rt_tag(t_pTag);
403 //
404 // megacq parameters
405 //
406 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_DACQ_PARS)
407 {
408 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_DACQ_PARS)
409 {
410 t_fiffStream.read_rt_tag(t_pTag);
411 if(t_pTag->kind == FIFF_DACQ_PARS)
412 p_pFiffInfo->acq_pars = t_pTag->toString();
413 else if(t_pTag->kind == FIFF_DACQ_STIM)
414 p_pFiffInfo->acq_stim = t_pTag->toString();
415 }
416 }
417 //
418 // Coordinate transformations if the HPI result block was not there
419 //
420 if (t_pTag->kind == FIFF_COORD_TRANS)
421 {
422 if (!dev_head_t_read)
423 {
424 p_pFiffInfo->dev_head_t = t_pTag->toCoordTrans();
425 dev_head_t_read = true;
426 }
427 else if (!ctf_head_t_read)
428 {
429 p_pFiffInfo->ctf_head_t = t_pTag->toCoordTrans();
430 ctf_head_t_read = true;
431 }
432 }
433 //
434 // Polhemus data
435 //
436 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_ISOTRAK)
437 {
438 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_ISOTRAK)
439 {
440 t_fiffStream.read_rt_tag(t_pTag);
441
442 if(t_pTag->kind == FIFF_DIG_POINT){
443 p_pFiffInfo->dig.append(t_pTag->toDigPoint());
444 p_pDigData->points.append(t_pTag->toDigPoint());
445 }
446 if(t_pTag->kind == FIFF_MNE_COORD_FRAME){
447 p_pDigData->coord_frame = *t_pTag->toInt();
448 }
449 }
450 }
451 //
452 // Projectors
453 //
454 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_PROJ)
455 {
456 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_PROJ)
457 {
458 t_fiffStream.read_rt_tag(t_pTag);
459 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_PROJ_ITEM)
460 {
461 FiffProj proj;
462 qint32 countProj = p_pFiffInfo->projs.size();
463 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_PROJ_ITEM)
464 {
465 t_fiffStream.read_rt_tag(t_pTag);
466 switch (t_pTag->kind)
467 {
468 case FIFF_NAME: // First proj -> Proj is created
469 proj = FiffProj();
470 p_pFiffInfo->projs.append(proj);
471 p_pFiffInfo->projs[countProj].desc = t_pTag->toString();
472 break;
473 case FIFF_PROJ_ITEM_KIND:
474 p_pFiffInfo->projs[countProj].kind = *(t_pTag->toInt());
475 break;
476 case FIFF_NCHAN: // First data -> FiffNamedMatrix is created
477 p_pFiffInfo->projs[countProj].data->ncol = *(t_pTag->toInt());
478 break;
479 case FIFF_PROJ_ITEM_NVEC:
480 p_pFiffInfo->projs[countProj].data->nrow = *(t_pTag->toInt());
481 break;
483 p_pFiffInfo->projs[countProj].active = *(t_pTag->toInt());
484 break;
485 case FIFF_PROJ_ITEM_CH_NAME_LIST:
486 p_pFiffInfo->projs[countProj].data->col_names = FiffStream::split_name_list(t_pTag->toString());
487 break;
488 case FIFF_PROJ_ITEM_VECTORS:
489 //ToDo: Test; Float Matrix
490 p_pFiffInfo->projs[countProj].data->data = t_pTag->toFloatMatrix().transpose().cast<double>();
491 break;
492 }
493 }
494 }
495 }
496 }
497 // Check consisty
498 for(qint32 i = 0; i < p_pFiffInfo->projs.size(); ++i)
499 {
500 if(p_pFiffInfo->projs[i].data->data.rows() != p_pFiffInfo->projs[i].data->nrow)
501 p_pFiffInfo->projs[i].data->data.transposeInPlace();
502 }
503
504 //
505 // CTF compensation info
506 //
507 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_CTF_COMP)
508 {
509 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_CTF_COMP)
510 {
511 t_fiffStream.read_rt_tag(t_pTag);
512 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_CTF_COMP_DATA)
513 {
514 FiffCtfComp comp;
515 qint32 countComp = p_pFiffInfo->comps.size();
516 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_CTF_COMP_DATA)
517 {
518 t_fiffStream.read_rt_tag(t_pTag);
519 switch (t_pTag->kind)
520 {
521 case FIFF_MNE_CTF_COMP_KIND: //First comp -> create comp
522 comp = FiffCtfComp();
523 p_pFiffInfo->comps.append(comp);
524 p_pFiffInfo->comps[countComp].ctfkind = *(t_pTag->toInt());
525
526 if (p_pFiffInfo->comps[countComp].ctfkind == 1194410578) //hex2dec('47314252')
527 p_pFiffInfo->comps[countComp].kind = 1;
528 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194476114) //hex2dec('47324252')
529 p_pFiffInfo->comps[countComp].kind = 2;
530 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194541650) //hex2dec('47334252')
531 p_pFiffInfo->comps[countComp].kind = 3;
532 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194479433)
533 p_pFiffInfo->comps[countComp].kind = 4;
534 else if (p_pFiffInfo->comps[countComp].ctfkind == 1194544969)
535 p_pFiffInfo->comps[countComp].kind = 5;
536 else
537 p_pFiffInfo->comps[countComp].kind = p_pFiffInfo->comps[countComp].ctfkind;
538 break;
540 p_pFiffInfo->comps[countComp].save_calibrated = *(t_pTag->toInt());
541 break;
542 case FIFF_MNE_NROW:
543 p_pFiffInfo->comps[countComp].data->nrow = *(t_pTag->toInt());
544 break;
545 case FIFF_MNE_NCOL:
546 p_pFiffInfo->comps[countComp].data->ncol = *(t_pTag->toInt());
547 break;
548 case FIFF_MNE_ROW_NAMES:
549 row_names = t_pTag->toString();
550 if (!row_names.isEmpty())
551 p_pFiffInfo->comps[countComp].data->row_names = FiffStream::split_name_list(row_names);
552 break;
553 case FIFF_MNE_COL_NAMES:
554 col_names = t_pTag->toString();
555 if (!col_names.isEmpty())
556 p_pFiffInfo->comps[countComp].data->col_names = FiffStream::split_name_list(col_names);
557 break;
559 //ToDo: Test; Float Matrix
560 p_pFiffInfo->comps[countComp].data->data = t_pTag->toFloatMatrix().transpose().cast<double>();
561 break;
562 }
563 }
564 }
565 }
566 }
567 //
568 // Bad channels
569 //
570 if(t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_MNE_BAD_CHANNELS)
571 {
572 while(t_pTag->kind != FIFF_BLOCK_END || *(t_pTag->toInt()) != FIFFB_MNE_BAD_CHANNELS)
573 {
574 t_fiffStream.read_rt_tag(t_pTag);
575 if(t_pTag->kind == FIFF_MNE_CH_NAME_LIST)
576 p_pFiffInfo->bads = FiffStream::split_name_list(t_pTag->data());
577 }
578 }
579 //
580 // General
581 //
582 switch(t_pTag->kind)
583 {
584 case FIFF_SFREQ:
585 p_pFiffInfo->sfreq = *(t_pTag->toFloat());
586 break;
587 case FIFF_LINE_FREQ:
588 p_pFiffInfo->linefreq = *(t_pTag->toFloat());
589 break;
590 case FIFF_HIGHPASS:
591 p_pFiffInfo->highpass = *(t_pTag->toFloat());
592 break;
593 case FIFF_LOWPASS:
594 p_pFiffInfo->lowpass = *(t_pTag->toFloat());
595 break;
596 case FIFF_NCHAN:
597 p_pFiffInfo->nchan = *(t_pTag->toInt());
598 break;
599 case FIFF_MEAS_DATE:
600 p_pFiffInfo->meas_date[0] = t_pTag->toInt()[0];
601 p_pFiffInfo->meas_date[1] = t_pTag->toInt()[1];
602 break;
603 case FIFF_PROJ_ID:
604 p_pFiffInfo->proj_id = *t_pTag->toInt();
605 break;
606 case FIFF_PROJ_NAME:
607 p_pFiffInfo->proj_name = t_pTag->toString();
608 break;
610 p_pFiffInfo->xplotter_layout = t_pTag->toString();
611 break;
613 p_pFiffInfo->experimenter = t_pTag->toString();
614 break;
615 case FIFF_DESCRIPTION:
616 p_pFiffInfo->description = t_pTag->toString();
617 break;
619 p_pFiffInfo->gantry_angle = *t_pTag->toInt();
620 break;
621 case FIFF_UTC_OFFSET:
622 p_pFiffInfo->utc_offset = t_pTag->toString();
623 break;
624 }
625
626 if (t_pTag->kind == FIFF_CH_INFO)
627 p_pFiffInfo->chs.append(t_pTag->toChInfo());
628
629 // END MEAS
630 if(t_pTag->kind == FIFF_BLOCK_END && *t_pTag->toInt() == FIFFB_MEAS_INFO)
631 {
632 printf("FIFF_BLOCK_END FIFFB_MEAS_INFO\n");
633 t_bReadMeasBlockEnd = true;
634 }
635 }
636
637 //
638 // Add the channel information and make a list of channel names
639 // for convenience
640 //
641 for (qint32 c = 0; c < p_pFiffInfo->nchan; ++c)
642 p_pFiffInfo->ch_names << p_pFiffInfo->chs[c].ch_name;
643
644 p_pDigData->npoint = p_pDigData->points.size();
645
646 for (int k = 0; k < p_pDigData->npoint; k++) {
647 p_pDigData->active.append(1);
648 p_pDigData->discard.append(0);
649 }
650
651 return MetaData(p_pFiffInfo, p_pDigData);
652}
653
654//=============================================================================================================
655
656void RtDataClient::readRawBuffer(qint32 p_nChannels,
657 MatrixXf& data,
658 fiff_int_t& kind)
659{
660 FiffStream t_fiffStream(this);
661 //
662 // Find the start
663 //
664 FiffTag::SPtr t_pTag;
665
666 t_fiffStream.read_rt_tag(t_pTag);
667
668 kind = t_pTag->kind;
669
670 if(kind == FIFF_DATA_BUFFER)
671 {
672 qint32 nSamples = (t_pTag->size()/4)/p_nChannels;
673 data = MatrixXf(Map< MatrixXf >(t_pTag->toFloat(), p_nChannels, nSamples));
674 }
675// else
676// data = tag.data;
677}
678
679//=============================================================================================================
680
681void RtDataClient::setClientAlias(const QString &p_sAlias)
682{
683 FiffStream t_fiffStream(this);
684 t_fiffStream.write_rt_command(2, p_sAlias);//MNE_RT.MNE_RT_SET_CLIENT_ALIAS, alias);
685 this->flush();
686}
#define FIFF_MNE_COORD_FRAME
#define FIFF_MNE_CTF_COMP_KIND
#define FIFF_MNE_CTF_COMP_CALIBRATED
#define FIFF_MNE_PROJ_ITEM_ACTIVE
#define FIFF_MNE_RT_CLIENT_ID
#define FIFF_MNE_CTF_COMP_DATA
int k
Definition fiff_tag.cpp:324
Header file describing the numerical values used in fif files.
#define FIFF_DATA_BUFFER
Definition fiff_file.h:556
#define FIFF_GANTRY_ANGLE
Definition fiff_file.h:555
#define FIFF_NCHAN
Definition fiff_file.h:453
#define FIFF_XPLOTTER_LAYOUT
Definition fiff_file.h:837
#define FIFF_PROJ_ID
Definition fiff_file.h:575
#define FIFF_HIGHPASS
Definition fiff_file.h:476
#define FIFF_EXPERIMENTER
Definition fiff_file.h:465
#define FIFF_PROJ_NAME
Definition fiff_file.h:576
#define FIFF_NAME
Definition fiff_file.h:485
#define FIFF_DESCRIPTION
Definition fiff_file.h:486
#define FIFF_LINE_FREQ
Definition fiff_file.h:489
#define FIFF_UTC_OFFSET
Definition fiff_file.h:451
#define FIFF_COORD_TRANS
Definition fiff_file.h:475
#define FIFF_MEAS_DATE
Definition fiff_file.h:457
#define FIFF_CH_INFO
Definition fiff_file.h:456
#define FIFF_DIG_POINT
Definition fiff_file.h:466
#define FIFF_LOWPASS
Definition fiff_file.h:472
#define FIFF_SFREQ
Definition fiff_file.h:454
declaration of the RtDataClient Class.
RtDataClient(QObject *parent=Q_NULLPTR)
void setClientAlias(const QString &p_sAlias)
void readRawBuffer(qint32 p_nChannels, Eigen::MatrixXf &data, FIFFLIB::fiff_int_t &kind)
FIFFLIB::FiffInfo::SPtr readInfo()
Digitization points container and description.
QSharedPointer< FiffDigitizerData > SPtr
CTF software compensation data.
FIFF measurement file information.
Definition fiff_info.h:85
QSharedPointer< FiffInfo > SPtr
Definition fiff_info.h:87
SSP projector data.
Definition fiff_proj.h:75
FIFF File I/O routines.
bool read_tag(QSharedPointer< FiffTag > &p_pTag, fiff_long_t pos=-1)
void write_rt_command(fiff_int_t command, const QString &data)
bool read_rt_tag(QSharedPointer< FiffTag > &p_pTag)
static QStringList split_name_list(QString p_sNameList)
QSharedPointer< FiffTag > SPtr
Definition fiff_tag.h:152