v2.0.0
Loading...
Searching...
No Matches
fiff_stream.h
Go to the documentation of this file.
1//=============================================================================================================
35
36#ifndef FIFF_STREAM_H
37#define FIFF_STREAM_H
38
39//=============================================================================================================
40// INCLUDES
41//=============================================================================================================
42
43#include "fiff_global.h"
44#include "fiff_types.h"
45#include "fiff_id.h"
46
47#include "fiff_dir_node.h"
48#include "fiff_dir_entry.h"
49
50//=============================================================================================================
51// EIGEN INCLUDES
52//=============================================================================================================
53
54#include <Eigen/Core>
55#include <Eigen/SparseCore>
56
57//=============================================================================================================
58// QT INCLUDES
59//=============================================================================================================
60
61#include <QByteArray>
62#include <QDataStream>
63#include <QIODevice>
64#include <QList>
65#include <QSharedPointer>
66#include <QString>
67#include <QStringList>
68#include <memory>
69
70//=============================================================================================================
71// DEFINE NAMESPACE FIFFLIB
72//=============================================================================================================
73
74namespace FIFFLIB
75{
76
77//=============================================================================================================
78// FORWARD DECLARATIONS
79//=============================================================================================================
80
81class FiffStream;
82class FiffTag;
83class FiffCtfComp;
84class FiffRawData;
85class FiffInfo;
86class FiffInfoBase;
87class FiffCov;
88class FiffProj;
89class FiffEvokedSet;
90class FiffNamedMatrix;
91class FiffDigPoint;
92class FiffChInfo;
93class FiffChPos;
94class FiffCoordTrans;
96
97//=============================================================================================================
111
112class FIFFSHARED_EXPORT FiffStream : public QDataStream
113{
114public:
115 using SPtr = QSharedPointer<FiffStream>;
116 using ConstSPtr = QSharedPointer<const FiffStream>;
117 using UPtr = std::unique_ptr<FiffStream>;
118 using ConstUPtr = std::unique_ptr<const FiffStream>;
119
120 //=========================================================================================================
126 explicit FiffStream(QIODevice* p_pIODevice);
127
128 //=========================================================================================================
135 explicit FiffStream(QByteArray* a, QIODevice::OpenMode mode);
136
137 //=========================================================================================================
143 QString streamName();
144
145 //=========================================================================================================
151 FiffId id() const;
152
153 //=========================================================================================================
160 QList<FiffDirEntry::SPtr>& dir();
161
162 //=========================================================================================================
169 const QList<FiffDirEntry::SPtr>& dir() const;
170
171 //=========================================================================================================
177 int nent() const;
178
179 //=========================================================================================================
186 const FiffDirNode::SPtr& dirtree() const;
187
188 //=========================================================================================================
198
199 //=========================================================================================================
203 void end_file();
204
205 //=========================================================================================================
210 void finish_writing_raw();
211
212 //=========================================================================================================
223 bool get_evoked_entries(const QList<FiffDirNode::SPtr>& evoked_node, QStringList& comments, QList<fiff_int_t>& aspect_kinds, QString& t);
224
225 //=========================================================================================================
231 // using QFile::open;
232
233 //=========================================================================================================
241 bool open(QIODevice::OpenModeFlag mode = QIODevice::ReadOnly);
242
243 //=========================================================================================================
250 bool close();
251
252 //=========================================================================================================
260 FiffDirNode::SPtr make_subtree(QList<FiffDirEntry::SPtr>& dentry);
261
262 //=========================================================================================================
274 QStringList read_bad_channels(const FiffDirNode::SPtr& p_Node);
275
276 //=========================================================================================================
282 void write_bad_channels(const QStringList& bads);
283
284 //=========================================================================================================
298 bool attach_env(const QString& workingDir, const QString& command);
299
300 //=========================================================================================================
312 bool read_cov(const FiffDirNode::SPtr& p_Node, fiff_int_t cov_kind, FiffCov& p_covData);
313
314 //=========================================================================================================
326 QList<FiffCtfComp> read_ctf_comp(const FiffDirNode::SPtr& p_Node, const QList<FiffChInfo>& p_Chs);
327
328 //=========================================================================================================
339 bool read_digitizer_data(const FiffDirNode::SPtr& p_Node, FiffDigitizerData& p_digData);
340
341 //=========================================================================================================
354 bool read_meas_info(const FiffDirNode::SPtr& p_Node, FiffInfo& p_Info, FiffDirNode::SPtr& p_NodeInfo);
355
356 //=========================================================================================================
367 bool read_meas_info_base(const FiffDirNode::SPtr& p_Node, FiffInfoBase& p_InfoForward);
368
369 //=========================================================================================================
381 bool read_named_matrix(const FiffDirNode::SPtr& p_Node, fiff_int_t matkind, FiffNamedMatrix& mat);
382
383 //=========================================================================================================
391 QList<FiffProj> read_proj(const FiffDirNode::SPtr& p_Node);
392
393 //=========================================================================================================
403 bool read_tag_data(std::unique_ptr<FiffTag>& p_pTag, fiff_long_t pos = -1);
404
405 //=========================================================================================================
415 fiff_long_t read_tag_info(std::unique_ptr<FiffTag>& p_pTag, bool p_bDoSkip = true);
416
417 //=========================================================================================================
426 bool read_rt_tag(std::unique_ptr<FiffTag>& p_pTag);
427
428 //=========================================================================================================
438 bool read_tag(std::unique_ptr<FiffTag>& p_pTag,
439 fiff_long_t pos = -1);
440
441 //=========================================================================================================
454 static bool setup_read_raw(QIODevice& p_IODevice,
455 FiffRawData& data,
456 bool allow_maxshield = true,
457 bool is_littleEndian = false);
458
459 //=========================================================================================================
469 static QStringList split_name_list(QString p_sNameList);
470
471 //=========================================================================================================
480
481 //=========================================================================================================
489 static FiffStream::SPtr start_file(QIODevice& p_IODevice);
490
491 //=========================================================================================================
499 static FiffStream::SPtr open_update(QIODevice& p_IODevice);
500
501 //=========================================================================================================
515 static FiffStream::SPtr start_writing_raw(QIODevice& p_IODevice,
516 const FiffInfo& info,
517 Eigen::RowVectorXd& cals,
518 Eigen::MatrixXi sel = defaultMatrixXi,
519 bool bResetRange = true);
520
521 //=========================================================================================================
531 fiff_long_t write_tag(const std::unique_ptr<FiffTag>& p_pTag, fiff_long_t pos = -1);
532
533 //=========================================================================================================
544
545 //=========================================================================================================
553 fiff_long_t write_ch_pos(const FiffChPos& chpos);
554
555 //=========================================================================================================
564
565 //=========================================================================================================
573 fiff_long_t write_cov(const FiffCov& p_FiffCov);
574
575 //=========================================================================================================
585 fiff_long_t write_ctf_comp(const QList<FiffCtfComp>& comps);
586
587 //=========================================================================================================
598
599 //=========================================================================================================
611
612 //=========================================================================================================
622 fiff_long_t write_dir_entries(const QList<FiffDirEntry::SPtr>& dir, fiff_long_t pos = -1);
623
624 //=========================================================================================================
634 fiff_long_t write_double(fiff_int_t kind, const double* data, fiff_int_t nel = 1);
635
636 //=========================================================================================================
647
648 //=========================================================================================================
656 fiff_long_t write_info_base(const FiffInfoBase& p_FiffInfoBase);
657
658 //=========================================================================================================
670
671 //=========================================================================================================
682 fiff_long_t write_int_matrix(fiff_int_t kind, const Eigen::MatrixXi& mat);
683
684 //=========================================================================================================
694 fiff_long_t write_float(fiff_int_t kind, const float* data, fiff_int_t nel = 1);
695
696 //=========================================================================================================
705 fiff_long_t write_float_matrix(fiff_int_t kind, const Eigen::MatrixXf& mat);
706
707 //=========================================================================================================
718 fiff_long_t write_float_sparse_ccs(fiff_int_t kind, const Eigen::SparseMatrix<float>& mat);
719
720 //=========================================================================================================
731 fiff_long_t write_float_sparse_rcs(fiff_int_t kind, const Eigen::SparseMatrix<float>& mat);
732
733 //=========================================================================================================
744 fiff_long_t write_name_list(fiff_int_t kind, const QStringList& data);
745
746 //=========================================================================================================
758
759 //=========================================================================================================
771 fiff_long_t write_evoked_set(const FiffEvokedSet& p_FiffEvokedSet);
772
773 //=========================================================================================================
783 fiff_long_t write_proj(const QList<FiffProj>& projs);
784
785 //=========================================================================================================
796 bool write_raw_buffer(const Eigen::MatrixXd& buf, const Eigen::RowVectorXd& cals);
797
798 //=========================================================================================================
809 bool write_raw_buffer(const Eigen::MatrixXd& buf, const Eigen::SparseMatrix<double>& mult);
810
811 //=========================================================================================================
822 bool write_raw_buffer(const Eigen::MatrixXd& buf);
823
824 //=========================================================================================================
833 fiff_long_t write_string(fiff_int_t kind, const QString& data);
834
835 //=========================================================================================================
842 void write_rt_command(fiff_int_t command, const QString& data);
843
844 //=========================================================================================================
858 static bool copyProcessingHistory(const QString& fromPath, const QString& toPath);
859
860private:
861 //=========================================================================================================
869 bool check_beginning(std::unique_ptr<FiffTag>& p_pTag);
870
871 //=========================================================================================================
879 QList<FiffDirEntry::SPtr> make_dir(bool* ok = nullptr);
880
881private:
882 // char *file_name; /**< Name of the file. */ -> Use streamName() instead
883 // FILE *fd; /**< The normal file descriptor. */ -> file descitpion is part of the stream: stream->device()
884 FiffId m_id;
885 QList<FiffDirEntry::SPtr> m_dir;
886 // int nent; /**< How many entries? */ -> Use nent() instead
887 FiffDirNode::SPtr m_dirtree;
888 // char *ext_file_name; /**< Name of the file holding the external data. */
889 // FILE *ext_fd; /**< The file descriptor of the above file if open . */
890};
891} // NAMESPACE
892
893#endif // FIFF_STREAM_H
constexpr auto FIFFV_NEXT_SEQ
Export/import macros and build-info accessors for the FIFFLIB shared library.
#define FIFFSHARED_EXPORT
Definition fiff_global.h:44
Recursive node of the parsed FIFF block tree (FIFFB_* hierarchy with directory entries and children).
Single entry of the FIFF tag directory: kind, type, byte size and absolute file position.
128-bit FIFF identifier record (machine ID + creation time) used to stamp files, blocks and parent re...
Primitive scalar typedefs and forward-compatible aliases backing the FIFF type system.
FIFF file I/O, in-memory data structures and high-level readers/writers.
qint32 fiff_int_t
Definition fiff_types.h:86
qint64 fiff_long_t
Definition fiff_types.h:88
Per-channel FIFF descriptor: identifiers, kind, calibration, coil type, channel-frame coil position a...
Channel coil-frame placement: origin r0 (m) and orthonormal axes ex / ey / ez in FIFFV_COORD_DEVICE.
Definition fiff_ch_pos.h:65
Labelled 4x4 FIFF affine: source frame, destination frame, rotation, translation and cached inverse.
FIFF noise / data covariance: matrix, channel names, kind, applied projectors, bads,...
Definition fiff_cov.h:82
One CTF software-gradient compensation matrix: grade kind, calibration flag and the gradiometer × ref...
One digitizer point: kind (cardinal/HPI/EEG/extra), ident, 3D position in FIFFV_COORD_HEAD.
Registration-ready digitization data: dig points, device→head transform and HPI fit metadata.
QSharedPointer< FiffDirNode > SPtr
Set of FiffEvoked instances sharing one FiffInfo, plus channel-picking and compensation helpers.
128-bit FIFF identifier: hardware machine ID plus creation time, stamped on every file and block.
Definition fiff_id.h:69
static FiffId & getDefault()
Definition fiff_id.cpp:197
Full FIFF measurement info: per-channel descriptors, sampling and filter setup, projectors,...
Definition fiff_info.h:90
Stripped FIFF measurement info: channel list, sampling rate, device→head transform and bad-channel li...
FIFF named matrix: dense / sparse Eigen matrix plus row-name and column-name string lists.
Single SSP projection item: kind, active flag, desired flag and the named projection vector matrix.
Definition fiff_proj.h:82
Continuous FIFF raw recording: FiffInfo plus a random-access directory of FIFF_DATA_BUFFER tags.
FIFF tag-stream reader/writer: wraps a QIODevice and exposes typed read_* / write_* methods for every...
bool write_raw_buffer(const Eigen::MatrixXd &buf, const Eigen::RowVectorXd &cals)
fiff_long_t write_cov(const FiffCov &p_FiffCov)
bool read_cov(const FiffDirNode::SPtr &p_Node, fiff_int_t cov_kind, FiffCov &p_covData)
fiff_long_t write_dir_entries(const QList< FiffDirEntry::SPtr > &dir, fiff_long_t pos=-1)
fiff_long_t start_block(fiff_int_t kind)
fiff_long_t write_float_matrix(fiff_int_t kind, const Eigen::MatrixXf &mat)
fiff_long_t write_proj(const QList< FiffProj > &projs)
std::unique_ptr< const FiffStream > ConstUPtr
QSharedPointer< const FiffStream > ConstSPtr
fiff_long_t write_int_matrix(fiff_int_t kind, const Eigen::MatrixXi &mat)
QSharedPointer< FiffStream > SPtr
bool read_rt_tag(std::unique_ptr< FiffTag > &p_pTag)
std::unique_ptr< FiffStream > UPtr
bool read_tag_data(std::unique_ptr< FiffTag > &p_pTag, fiff_long_t pos=-1)
bool read_meas_info_base(const FiffDirNode::SPtr &p_Node, FiffInfoBase &p_InfoForward)
fiff_long_t write_tag(const std::unique_ptr< FiffTag > &p_pTag, fiff_long_t pos=-1)
static bool copyProcessingHistory(const QString &fromPath, const QString &toPath)
void write_bad_channels(const QStringList &bads)
fiff_long_t write_dig_point(const FiffDigPoint &dig)
fiff_long_t write_int(fiff_int_t kind, const fiff_int_t *data, fiff_int_t nel=1, fiff_int_t next=FIFFV_NEXT_SEQ)
static bool setup_read_raw(QIODevice &p_IODevice, FiffRawData &data, bool allow_maxshield=true, bool is_littleEndian=false)
QList< FiffCtfComp > read_ctf_comp(const FiffDirNode::SPtr &p_Node, const QList< FiffChInfo > &p_Chs)
fiff_long_t write_float(fiff_int_t kind, const float *data, fiff_int_t nel=1)
fiff_long_t write_id(fiff_int_t kind, const FiffId &id=FiffId::getDefault())
fiff_long_t write_float_sparse_rcs(fiff_int_t kind, const Eigen::SparseMatrix< float > &mat)
fiff_long_t write_ch_pos(const FiffChPos &chpos)
bool write_raw_buffer(const Eigen::MatrixXd &buf, const Eigen::SparseMatrix< double > &mult)
void write_rt_command(fiff_int_t command, const QString &data)
fiff_long_t write_coord_trans(const FiffCoordTrans &trans)
bool get_evoked_entries(const QList< FiffDirNode::SPtr > &evoked_node, QStringList &comments, QList< fiff_int_t > &aspect_kinds, QString &t)
fiff_long_t write_name_list(fiff_int_t kind, const QStringList &data)
bool read_meas_info(const FiffDirNode::SPtr &p_Node, FiffInfo &p_Info, FiffDirNode::SPtr &p_NodeInfo)
bool open(QIODevice::OpenModeFlag mode=QIODevice::ReadOnly)
fiff_long_t read_tag_info(std::unique_ptr< FiffTag > &p_pTag, bool p_bDoSkip=true)
bool write_raw_buffer(const Eigen::MatrixXd &buf)
fiff_long_t write_named_matrix(fiff_int_t kind, const FiffNamedMatrix &mat)
FiffStream(QIODevice *p_pIODevice)
FiffId id() const
static QStringList split_name_list(QString p_sNameList)
fiff_long_t write_string(fiff_int_t kind, const QString &data)
QStringList read_bad_channels(const FiffDirNode::SPtr &p_Node)
fiff_long_t write_evoked_set(const FiffEvokedSet &p_FiffEvokedSet)
const FiffDirNode::SPtr & dirtree() const
bool read_digitizer_data(const FiffDirNode::SPtr &p_Node, FiffDigitizerData &p_digData)
static FiffStream::SPtr start_writing_raw(QIODevice &p_IODevice, const FiffInfo &info, Eigen::RowVectorXd &cals, Eigen::MatrixXi sel=defaultMatrixXi, bool bResetRange=true)
fiff_long_t write_dir_pointer(fiff_int_t dirpos, fiff_long_t pos=-1, fiff_int_t next=FIFFV_NEXT_SEQ)
static FiffStream::SPtr start_file(QIODevice &p_IODevice)
fiff_long_t write_info_base(const FiffInfoBase &p_FiffInfoBase)
fiff_long_t end_block(fiff_int_t kind, fiff_int_t next=FIFFV_NEXT_SEQ)
fiff_long_t write_float_sparse_ccs(fiff_int_t kind, const Eigen::SparseMatrix< float > &mat)
fiff_long_t write_ch_info(const FiffChInfo &ch)
fiff_long_t write_ctf_comp(const QList< FiffCtfComp > &comps)
bool read_tag(std::unique_ptr< FiffTag > &p_pTag, fiff_long_t pos=-1)
fiff_long_t write_double(fiff_int_t kind, const double *data, fiff_int_t nel=1)
bool attach_env(const QString &workingDir, const QString &command)
QList< FiffProj > read_proj(const FiffDirNode::SPtr &p_Node)
static FiffStream::SPtr open_update(QIODevice &p_IODevice)
FiffDirNode::SPtr make_subtree(QList< FiffDirEntry::SPtr > &dentry)
bool read_named_matrix(const FiffDirNode::SPtr &p_Node, fiff_int_t matkind, FiffNamedMatrix &mat)
QList< FiffDirEntry::SPtr > & dir()
FIFF tag: 16-byte header (kind, type, size, next) plus payload, with typed decoders for every FIFFT_*...
Definition fiff_tag.h:161