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//=============================================================================================================
109
110class FIFFSHARED_EXPORT FiffStream : public QDataStream
111{
112public:
113 using SPtr = QSharedPointer<FiffStream>;
114 using ConstSPtr = QSharedPointer<const FiffStream>;
115 using UPtr = std::unique_ptr<FiffStream>;
116 using ConstUPtr = std::unique_ptr<const FiffStream>;
117
118 //=========================================================================================================
124 explicit FiffStream(QIODevice *p_pIODevice);
125
126 //=========================================================================================================
133 explicit FiffStream(QByteArray * a, QIODevice::OpenMode mode);
134
135 //=========================================================================================================
141 QString streamName();
142
143 //=========================================================================================================
149 FiffId id() const;
150
151 //=========================================================================================================
158 QList<FiffDirEntry::SPtr>& dir();
159
160 //=========================================================================================================
167 const QList<FiffDirEntry::SPtr>& dir() const;
168
169 //=========================================================================================================
175 int nent() const;
176
177 //=========================================================================================================
184 const FiffDirNode::SPtr& dirtree() const;
185
186 //=========================================================================================================
195 fiff_long_t end_block(fiff_int_t kind, fiff_int_t next = FIFFV_NEXT_SEQ);
196
197 //=========================================================================================================
201 void end_file();
202
203 //=========================================================================================================
208 void finish_writing_raw();
209
210 //=========================================================================================================
221 bool get_evoked_entries(const QList<FiffDirNode::SPtr> &evoked_node, QStringList &comments, QList<fiff_int_t> &aspect_kinds, QString &t);
222
223 //=========================================================================================================
229// using QFile::open;
230
231 //=========================================================================================================
239 bool open(QIODevice::OpenModeFlag mode = QIODevice::ReadOnly);
240
241 //=========================================================================================================
248 bool close();
249
250 //=========================================================================================================
258 FiffDirNode::SPtr make_subtree(QList<FiffDirEntry::SPtr>& dentry);
259
260 //=========================================================================================================
272 QStringList read_bad_channels(const FiffDirNode::SPtr& p_Node);
273
274 //=========================================================================================================
280 void write_bad_channels(const QStringList& bads);
281
282 //=========================================================================================================
296 bool attach_env(const QString& workingDir, const QString& command);
297
298 //=========================================================================================================
310 bool read_cov(const FiffDirNode::SPtr& p_Node, fiff_int_t cov_kind, FiffCov& p_covData);
311
312 //=========================================================================================================
323 QList<FiffCtfComp> read_ctf_comp(const FiffDirNode::SPtr& p_Node, const QList<FiffChInfo>& p_Chs);
324
325 //=========================================================================================================
336 bool read_digitizer_data(const FiffDirNode::SPtr& p_Node, FiffDigitizerData& p_digData);
337
338 //=========================================================================================================
351 bool read_meas_info(const FiffDirNode::SPtr& p_Node, FiffInfo& p_Info, FiffDirNode::SPtr& p_NodeInfo);
352
353 //=========================================================================================================
364 bool read_meas_info_base(const FiffDirNode::SPtr& p_Node, FiffInfoBase& p_InfoForward);
365
366 //=========================================================================================================
378 bool read_named_matrix(const FiffDirNode::SPtr& p_Node, fiff_int_t matkind, FiffNamedMatrix& mat);
379
380 //=========================================================================================================
388 QList<FiffProj> read_proj(const FiffDirNode::SPtr& p_Node);
389
390 //=========================================================================================================
400 bool read_tag_data(std::unique_ptr<FiffTag>& p_pTag, fiff_long_t pos = -1);
401
402 //=========================================================================================================
412 fiff_long_t read_tag_info(std::unique_ptr<FiffTag>& p_pTag, bool p_bDoSkip = true);
413
414 //=========================================================================================================
423 bool read_rt_tag(std::unique_ptr<FiffTag>& p_pTag);
424
425 //=========================================================================================================
435 bool read_tag(std::unique_ptr<FiffTag>& p_pTag,
436 fiff_long_t pos = -1);
437
438 //=========================================================================================================
450 static bool setup_read_raw(QIODevice &p_IODevice,
451 FiffRawData& data,
452 bool allow_maxshield = true,
453 bool is_littleEndian = false);
454
455 //=========================================================================================================
465 static QStringList split_name_list(QString p_sNameList);
466
467 //=========================================================================================================
475 fiff_long_t start_block(fiff_int_t kind);
476
477 //=========================================================================================================
485 static FiffStream::SPtr start_file(QIODevice& p_IODevice);
486
487 //=========================================================================================================
495 static FiffStream::SPtr open_update(QIODevice& p_IODevice);
496
497 //=========================================================================================================
511 static FiffStream::SPtr start_writing_raw(QIODevice &p_IODevice,
512 const FiffInfo& info,
513 Eigen::RowVectorXd& cals,
514 Eigen::MatrixXi sel = defaultMatrixXi,
515 bool bResetRange = true);
516
517 //=========================================================================================================
527 fiff_long_t write_tag(const std::unique_ptr<FiffTag>& p_pTag, fiff_long_t pos = -1);
528
529 //=========================================================================================================
539 fiff_long_t write_ch_info(const FiffChInfo& ch);
540
541 //=========================================================================================================
549 fiff_long_t write_ch_pos(const FiffChPos& chpos);
550
551 //=========================================================================================================
559 fiff_long_t write_coord_trans(const FiffCoordTrans &trans);
560
561 //=========================================================================================================
569 fiff_long_t write_cov(const FiffCov &p_FiffCov);
570
571 //=========================================================================================================
581 fiff_long_t write_ctf_comp(const QList<FiffCtfComp>& comps);
582
583 //=========================================================================================================
593 fiff_long_t write_dig_point(const FiffDigPoint& dig);
594
595 //=========================================================================================================
606 fiff_long_t write_dir_pointer(fiff_int_t dirpos, fiff_long_t pos = -1, fiff_int_t next = FIFFV_NEXT_SEQ);
607
608 //=========================================================================================================
618 fiff_long_t write_dir_entries(const QList<FiffDirEntry::SPtr>& dir, fiff_long_t pos = -1);
619
620 //=========================================================================================================
630 fiff_long_t write_double(fiff_int_t kind, const double* data, fiff_int_t nel = 1);
631
632 //=========================================================================================================
642 fiff_long_t write_id(fiff_int_t kind, const FiffId& id = FiffId::getDefault());
643
644 //=========================================================================================================
652 fiff_long_t write_info_base(const FiffInfoBase & p_FiffInfoBase);
653
654 //=========================================================================================================
665 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);
666
667 //=========================================================================================================
678 fiff_long_t write_int_matrix(fiff_int_t kind, const Eigen::MatrixXi& mat);
679
680 //=========================================================================================================
690 fiff_long_t write_float(fiff_int_t kind, const float* data, fiff_int_t nel = 1);
691
692 //=========================================================================================================
701 fiff_long_t write_float_matrix(fiff_int_t kind, const Eigen::MatrixXf& mat);
702
703 //=========================================================================================================
714 fiff_long_t write_float_sparse_ccs(fiff_int_t kind, const Eigen::SparseMatrix<float>& mat);
715
716 //=========================================================================================================
727 fiff_long_t write_float_sparse_rcs(fiff_int_t kind, const Eigen::SparseMatrix<float>& mat);
728
729 //=========================================================================================================
740 fiff_long_t write_name_list(fiff_int_t kind, const QStringList& data);
741
742 //=========================================================================================================
753 fiff_long_t write_named_matrix(fiff_int_t kind, const FiffNamedMatrix& mat);
754
755 //=========================================================================================================
767 fiff_long_t write_evoked_set(const FiffEvokedSet& p_FiffEvokedSet);
768
769 //=========================================================================================================
779 fiff_long_t write_proj(const QList<FiffProj>& projs);
780
781 //=========================================================================================================
792 bool write_raw_buffer(const Eigen::MatrixXd& buf, const Eigen::RowVectorXd& cals);
793
794 //=========================================================================================================
805 bool write_raw_buffer(const Eigen::MatrixXd& buf, const Eigen::SparseMatrix<double>& mult);
806
807 //=========================================================================================================
818 bool write_raw_buffer(const Eigen::MatrixXd& buf);
819
820 //=========================================================================================================
829 fiff_long_t write_string(fiff_int_t kind, const QString& data);
830
831 //=========================================================================================================
838 void write_rt_command(fiff_int_t command, const QString& data);
839
840 //=========================================================================================================
854 static bool copyProcessingHistory(const QString& fromPath, const QString& toPath);
855
856private:
857 //=========================================================================================================
865 bool check_beginning(std::unique_ptr<FiffTag>& p_pTag);
866
867 //=========================================================================================================
875 QList<FiffDirEntry::SPtr> make_dir(bool *ok=nullptr);
876
877private:
878
879// char *file_name; /**< Name of the file. */ -> Use streamName() instead
880// FILE *fd; /**< The normal file descriptor. */ -> file descitpion is part of the stream: stream->device()
881 FiffId m_id;
882 QList<FiffDirEntry::SPtr> m_dir;
883// int nent; /**< How many entries?. */ -> Use nent() instead
884 FiffDirNode::SPtr m_dirtree;
885// char *ext_file_name; /**< Name of the file holding the external data. */
886// FILE *ext_fd; /**< The file descriptor of the above file if open . */
887
888};
889} // NAMESPACE
890
891#endif // FIFF_STREAM_H
128-bit FIFF identifier record (machine ID + creation time) used to stamp files, blocks and parent re...
#define FIFFV_NEXT_SEQ
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.
Export/import macros and build-info accessors for the FIFFLIB shared library.
#define FIFFSHARED_EXPORT
Definition fiff_global.h:44
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.
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:63
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:79
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:66
static FiffId & getDefault()
Definition fiff_id.cpp:196
Full FIFF measurement info: per-channel descriptors, sampling and filter setup, projectors,...
Definition fiff_info.h:88
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:78
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:159