/** * The function main marks the entry point of the program. * By default, main has the storage class extern. * * @param [in] argc (argument count) is an integer that indicates how many arguments were entered on the command line when the program was started. * @param [in] argv (argument vector) is an array of pointers to arrays of character objects. The array objects are null-terminated strings, representing the arguments that were entered on the command line when the program was started. * @return the value that was set to exit() (which is 0 if exit() is called via quit()). */ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // QFile t_fileIn("./MNE-sample-data/MEG/sample/sample_audvis_raw.fif"); // QFile t_fileIn("./MNE-sample-data/MEG/test_output.fif"); QFile t_fileIn("./MNE-sample-data/MEG/sample/sample_write/test_output.fif"); QFile t_fileOut("./MNE-sample-data/MEG/sample/sample_write/test_output2.fif"); // QFile t_fileOut("./MNE-sample-data/MEG/test_output2.fif"); // // Setup for reading the raw data // FiffRawData raw(t_fileIn); // // Set up pick list: MEG + STI 014 - bad channels // // bool want_meg = true; bool want_eeg = false; bool want_stim = false; QStringList include; include << "STI 014"; // MatrixXi picks = Fiff::pick_types(raw.info, want_meg, want_eeg, want_stim, include, raw.info.bads); MatrixXi picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include, raw.info.bads); // prefer member function if(picks.cols() == 0) { include.clear(); include << "STI101" << "STI201" << "STI301"; // picks = Fiff::pick_types(raw.info, want_meg, want_eeg, want_stim, include, raw.info.bads); picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include, raw.info.bads);// prefer member function if(picks.cols() == 0) { printf("channel list may need modification\n"); return -1; } } // RowVectorXd cals; FiffStream::SPtr outfid = Fiff::start_writing_raw(t_fileOut,raw.info, cals/*, picks*/); // // Set up the reading parameters // fiff_int_t from = raw.first_samp; fiff_int_t to = raw.last_samp; float quantum_sec = 10.0f;//read and write in 10 sec junks fiff_int_t quantum = ceil(quantum_sec*raw.info.sfreq); // // To read the whole file at once set // //quantum = to - from + 1; // // // Read and write all the data // bool first_buffer = true; fiff_int_t first, last; MatrixXd data; MatrixXd times; for(first = from; first < to; first+=quantum) { last = first+quantum-1; if (last > to) { last = to; } if (!raw.read_raw_segment(data,times,first,last/*,picks*/)) { printf("error during read_raw_segment\n"); return -1; } // // You can add your own miracle here // printf("Writing..."); if (first_buffer) { if (first > 0) outfid->write_int(FIFF_FIRST_SAMPLE,&first); first_buffer = false; } outfid->write_raw_buffer(data,cals); printf("[done]\n"); } outfid->finish_writing_raw(); printf("Finished\n"); return 0;//a.exec(); }
bool FiffDigPointSet::readFromStream(FiffStream::SPtr &p_pStream, FiffDigPointSet &p_Dig) { // // Open the file, create directory // bool open_here = false; if (!p_pStream->device()->isOpen()) { QString t_sFileName = p_pStream->streamName(); if(!p_pStream->open()) return false; printf("Opening header data %s...\n",t_sFileName.toUtf8().constData()); open_here = true; } // // Read the measurement info // //read_hpi_info(p_pStream,p_Tree, info); fiff_int_t kind = -1; fiff_int_t pos = -1; FiffTag::SPtr t_pTag; // // Locate the Electrodes // QList<FiffDirNode::SPtr> isotrak = p_pStream->dirtree()->dir_tree_find(FIFFB_ISOTRAK); fiff_int_t coord_frame = FIFFV_COORD_HEAD; FiffCoordTrans dig_trans; qint32 k = 0; if (isotrak.size() == 1) { for (k = 0; k < isotrak[0]->nent(); ++k) { kind = isotrak[0]->dir[k]->kind; pos = isotrak[0]->dir[k]->pos; if (kind == FIFF_DIG_POINT) { p_pStream->read_tag(t_pTag, pos); p_Dig.m_qListDigPoint.append(t_pTag->toDigPoint()); } else { if (kind == FIFF_MNE_COORD_FRAME) { p_pStream->read_tag(t_pTag, pos); qDebug() << "NEEDS To BE DEBBUGED: FIFF_MNE_COORD_FRAME" << t_pTag->getType(); coord_frame = *t_pTag->toInt(); } else if (kind == FIFF_COORD_TRANS) { p_pStream->read_tag(t_pTag, pos); qDebug() << "NEEDS To BE DEBBUGED: FIFF_COORD_TRANS" << t_pTag->getType(); dig_trans = t_pTag->toCoordTrans(); } } } } for(k = 0; k < p_Dig.size(); ++k) { p_Dig[k].coord_frame = coord_frame; } // // All kinds of auxliary stuff // if(open_here) { p_pStream->close(); } return true; }
bool FiffDirTree::copy_tree(FiffStream::SPtr p_pStreamIn, FiffId& in_id, QList<FiffDirTree>& p_Nodes, FiffStream::SPtr p_pStreamOut) { if(p_Nodes.size() <= 0) return false; qint32 k, p; for(k = 0; k < p_Nodes.size(); ++k) { p_pStreamOut->start_block(p_Nodes[k].block);//8 if (p_Nodes[k].id.version != -1) { if (in_id.version != -1) p_pStreamOut->write_id(FIFF_PARENT_FILE_ID, in_id);//9 p_pStreamOut->write_id(FIFF_BLOCK_ID);//10 p_pStreamOut->write_id(FIFF_PARENT_BLOCK_ID, p_Nodes[k].id);//11 } for (p = 0; p < p_Nodes[k].nent; ++p) { // // Do not copy these tags // if(p_Nodes[k].dir[p].kind == FIFF_BLOCK_ID || p_Nodes[k].dir[p].kind == FIFF_PARENT_BLOCK_ID || p_Nodes[k].dir[p].kind == FIFF_PARENT_FILE_ID) continue; // // Read and write tags, pass data through transparently // if (!p_pStreamIn->device()->seek(p_Nodes[k].dir[p].pos)) //fseek(fidin, nodes(k).dir(p).pos, 'bof') == -1 { printf("Could not seek to the tag\n"); return false; } //ToDo this is the same like read_tag FiffTag::SPtr tag(new FiffTag()); //QDataStream in(fidin); FiffStream::SPtr in = p_pStreamIn; in->setByteOrder(QDataStream::BigEndian); // // Read fiff tag header from stream // *in >> tag->kind; *in >> tag->type; qint32 size; *in >> size; tag->resize(size); *in >> tag->next; // // Read data when available // if (tag->size() > 0) { in->readRawData(tag->data(), tag->size()); FiffTag::convert_tag_data(tag,FIFFV_BIG_ENDIAN,FIFFV_NATIVE_ENDIAN); } //QDataStream out(p_pStreamOut); FiffStream::SPtr out = p_pStreamOut; out->setByteOrder(QDataStream::BigEndian); *out << (qint32)tag->kind; *out << (qint32)tag->type; *out << (qint32)tag->size(); *out << (qint32)FIFFV_NEXT_SEQ; out->writeRawData(tag->data(),tag->size()); } for(p = 0; p < p_Nodes[k].nchild; ++p) { QList<FiffDirTree> childList; childList << p_Nodes[k].children[p]; FiffDirTree::copy_tree(p_pStreamIn, in_id, childList, p_pStreamOut); } p_pStreamOut->end_block(p_Nodes[k].block); } return true; }