51#if defined(__LITTLE_ENDIAN__)
54#define BIG_ENDIAN_ARCH
59#if defined(__hpux) || defined(__Lynx__) || defined(__sun)
60#define BIG_ENDIAN_ARCH
62#if defined(__linux) || defined(WIN32) || defined(__APPLE__)
69#define NATIVE_ENDIAN FIFFV_LITTLE_ENDIAN
72#define NATIVE_ENDIAN FIFFV_LITTLE_ENDIAN
76#define NATIVE_ENDIAN FIFFV_BIG_ENDIAN
99#include <Eigen/SparseCore>
108#include <QSharedPointer>
134#define IS_MATRIX 0xFFFF0000
135#define MATRIX_CODING_DENSE 0x00004000
136#define MATRIX_CODING_CCS 0x00004010
137#define MATRIX_CODING_RCS 0x00004020
138#define DATA_TYPE 0x0000FFFF
156 using SPtr = QSharedPointer<FiffTag>;
158 using UPtr = std::unique_ptr<FiffTag>;
253 inline quint8*
toByte()
const;
271 inline qint16*
toShort()
const;
289 inline qint32*
toInt()
const;
382 inline QList< QSharedPointer<FiffDirEntry> >
toDirEntry()
const;
543 return (quint8*)this->data();
553 return (quint16*)this->data();
563 return (qint16*)this->data();
573 return (quint32*)this->data();
581 printf(
"Expected an integer tag : %d (found data type %d instead)\n",this->
kind,this->
getType());
585 return (qint32*)this->data();
593 printf(
"Expected a julian tag : %d (found data type %d instead)\n",this->
kind,this->
getType());
597 return (qint32*)this->data();
607 return (
float*)this->data();
617 return (
double*)this->data();
637 return (qint16*)this->data();
683 const qint32* t_pInt32 = (qint32*)this->data();
685 p_fiffID.
version = t_pInt32[0];
686 p_fiffID.
machid[0] = t_pInt32[1];
687 p_fiffID.
machid[1] = t_pInt32[2];
702 return t_fiffDigPoint;
705 qint32* t_pInt32 = (qint32*)this->data();
708 t_fiffDigPoint.
kind = t_pInt32[0];
709 t_fiffDigPoint.
ident = t_pInt32[1];
711 float* t_pFloat = (
float*)this->data();
712 t_fiffDigPoint.
r[0] = t_pFloat[2];
713 t_fiffDigPoint.
r[1] = t_pFloat[3];
714 t_fiffDigPoint.
r[2] = t_pFloat[4];
717 return t_fiffDigPoint;
728 return p_FiffCoordTrans;
731 qint32* t_pInt32 = (qint32*)this->data();
732 p_FiffCoordTrans.
from = t_pInt32[0];
733 p_FiffCoordTrans.
to = t_pInt32[1];
735 p_FiffCoordTrans.
trans.setIdentity(4,4);
736 float* t_pFloat = (
float*)this->data();
739 for (r = 0; r < 3; ++r) {
740 p_FiffCoordTrans.
trans(r,3) = t_pFloat[11+r];
741 for (c = 0; c < 3; ++c) {
742 p_FiffCoordTrans.
trans(r,c) = t_pFloat[2+count];
747 p_FiffCoordTrans.
invtrans.setIdentity(4,4);
749 for (r = 0; r < 3; ++r) {
750 p_FiffCoordTrans.
invtrans(r,3) = t_pFloat[23+r];
751 for (c = 0; c < 3; ++c) {
752 p_FiffCoordTrans.
invtrans(r,c) = t_pFloat[14+count];
757 return p_FiffCoordTrans;
773 qint32* t_pInt32 = (qint32*)this->data();
774 p_FiffChInfo.
scanNo = t_pInt32[0];
775 p_FiffChInfo.
logNo = t_pInt32[1];
776 p_FiffChInfo.
kind = t_pInt32[2];
777 float* t_pFloat = (
float*)this->data();
778 p_FiffChInfo.
range = t_pFloat[3];
779 p_FiffChInfo.
cal = t_pFloat[4];
788 for (r = 0; r < 3; ++r)
789 p_FiffChInfo.
chpos.
r0[r] = t_pFloat[6+r];
791 for (r = 0; r < 3; ++r)
792 p_FiffChInfo.
chpos.
ex[r] = t_pFloat[6+3+r];
794 for (r = 0; r < 3; ++r)
795 p_FiffChInfo.
chpos.
ey[r] = t_pFloat[6+6+r];
797 for (r = 0; r < 3; ++r)
798 p_FiffChInfo.
chpos.
ez[r] = t_pFloat[6+9+r];
809 for (r = 0; r < 3; ++r)
812 for (r = 0; r < 3; ++r)
815 for (r = 0; r < 3; ++r)
818 for (r = 0; r < 3; ++r)
825 if (p_FiffChInfo.
chpos.
ex.norm() > 0) {
826 p_FiffChInfo.
eeg_loc.block(0,0,3,1) = p_FiffChInfo.
chpos.
r0.block(0,0,3,1);
827 p_FiffChInfo.
eeg_loc.block(0,1,3,1) = p_FiffChInfo.
chpos.
ex.block(0,0,3,1);
830 p_FiffChInfo.
eeg_loc.block(0,0,3,1) = p_FiffChInfo.
chpos.
r0.block(0,0,3,1);
837 p_FiffChInfo.
unit = t_pInt32[18];
838 p_FiffChInfo.
unit_mul = t_pInt32[19];
843 const char* orig =
static_cast<const char*
>(this->data());
844 p_FiffChInfo.
ch_name = QString::fromUtf8(orig + 80).replace(
" ",
"");
864 QList< QSharedPointer<FiffDirEntry> > p_ListFiffDir;
866 return p_ListFiffDir;
869 QSharedPointer<FiffDirEntry> t_pFiffDirEntry;
870 qint32* t_pInt32 = (qint32*)this->data();
871 for (
int k = 0; k < this->size()/16; ++k)
873 t_pFiffDirEntry = QSharedPointer<FiffDirEntry>(
new FiffDirEntry);
874 t_pFiffDirEntry->kind = t_pInt32[k*4];
875 t_pFiffDirEntry->type = t_pInt32[k*4+1];
876 t_pFiffDirEntry->size = t_pInt32[k*4+2];
877 t_pFiffDirEntry->pos = t_pInt32[k*4+3];
878 p_ListFiffDir.append(t_pFiffDirEntry);
881 return p_ListFiffDir;
893 return Eigen::MatrixXi();
896 QVector<qint32> dims;
901 printf(
"Only two-dimensional matrices are supported at this time");
902 return Eigen::MatrixXi();
907 Eigen::MatrixXi p_Matrix(Eigen::Map<Eigen::MatrixXi>( (
int*)this->data(),dims[0], dims[1]));
917 return Eigen::MatrixXf();
921 printf(
"Error in FiffTag::toFloatMatrix(): Matrix is not dense!\n");
922 return Eigen::MatrixXf();
926 QVector<qint32> dims;
931 printf(
"Only two-dimensional matrices are supported at this time");
932 return Eigen::MatrixXf();
936 Eigen::MatrixXf p_Matrix((Eigen::Map<Eigen::MatrixXf>( (
float*)this->data(),dims[0], dims[1])));
946 return Eigen::SparseMatrix<double>();
950 printf(
"Error in FiffTag::toSparseFloatMatrix(): Matrix is not sparse!\n");
951 return Eigen::SparseMatrix<double>();
955 QVector<qint32> dims;
960 printf(
"Only two-dimensional matrices are supported at this time");
961 return Eigen::SparseMatrix<double>();
964 qint32 nnz = dims[0];
965 qint32 nrow = dims[1];
966 qint32 ncol = dims[2];
968 using T = Eigen::Triplet<double>;
969 std::vector<T> tripletList;
970 tripletList.reserve(nnz);
972 float *t_pFloat = (
float*)this->data();
973 int *t_pInt = (
int*)this->data();
974 qint32 offset1 = nnz;
975 qint32 offset2 = 2*nnz;
981 qWarning(
"Warning in FiffTag::toSparseFloatMatrix(): CCS has to be debugged - never done before.");
983 for(qint32 j = 0; j < ncol; ++j)
985 while( p < t_pInt[offset2+j+1])
988 tripletList.push_back(T(t_pInt[offset1+p], j,
static_cast<double>(t_pFloat[p])));
999 for(qint32 j = 0; j < nrow; ++j)
1001 while( p < t_pInt[offset2+j+1])
1004 tripletList.push_back(T(j, t_pInt[offset1+p],
static_cast<double>(t_pFloat[p])));
1015 Eigen::SparseMatrix<double> p_Matrix(nrow, ncol);
1016 p_Matrix.setFromTriplets(tripletList.begin(), tripletList.end());
FiffChPos class declaration.
Fiff library export/import macros.
#define FIFFSHARED_EXPORT
#define FIFFV_COORD_DEVICE
#define FIFFV_COORD_UNKNOWN
FiffDirEntry class declaration.
fiff_int_t fiff_type_base(fiff_int_t type)
fiff_int_t fiff_type_matrix_coding(fiff_int_t type)
fiff_int_t fiff_type_fundamental(fiff_int_t type)
FiffChInfo class declaration.
FiffId class declaration.
Header file describing the numerical values used in fif files.
#define FIFFT_CH_INFO_STRUCT
#define FIFFT_DIR_ENTRY_STRUCT
#define FIFFT_COORD_TRANS_STRUCT
#define FIFFT_DIG_POINT_STRUCT
Old fiff_type declarations - replace them.
FiffCoordTrans class declaration.
FiffDigPoint class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
Eigen::Matrix< float, 3, 2, Eigen::DontAlign > eeg_loc
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > coil_trans
Measurement channel position and coil type.
Coordinate transformation description.
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > trans
Eigen::Matrix< float, 4, 4, Eigen::DontAlign > invtrans
Digitization point description.
Directory entry description.
Universally unique identifier.
static fiff_int_t fiff_type_matrix_coding(fiff_int_t type)
QSharedPointer< FiffTag > SPtr
Eigen::MatrixXf toFloatMatrix() const
quint32 * toUnsignedInt() const
FiffTag(FiffTag &&other)=default
std::unique_ptr< FiffTag > UPtr
FiffCoordTrans toCoordTrans() const
std::unique_ptr< const FiffTag > ConstUPtr
qint32 * toJulian() const
fiff_int_t getMatrixCoding() const
Eigen::MatrixXi toIntMatrix() const
quint16 * toUnsignedShort() const
FiffChInfo toChInfo() const
qint16 * toDauPack16() const
FiffDigPoint toDigPoint() const
static void convert_tag_data(const FiffTag::UPtr &tag, int from_endian, int to_endian)
static void convert_matrix_to_file_data(const FiffTag::UPtr &tag)
FiffTag & operator=(FiffTag &&other)=default
double * toDouble() const
fiff_int_t getType() const
Eigen::SparseMatrix< double > toSparseFloatMatrix() const
static qint32 storageSize()
FiffTag & operator=(const FiffTag &other)=default
static void convert_matrix_from_file_data(const FiffTag::UPtr &tag)
static void convert_ch_pos(FiffChPos *pos)
FiffTag(const FiffTag &p_FiffTag)=default
QSharedPointer< const FiffTag > ConstSPtr
bool getMatrixDimensions(qint32 &p_ndim, QVector< qint32 > &p_Dims) const
QList< QSharedPointer< FiffDirEntry > > toDirEntry() const