Skip to content

Commit 42e357b

Browse files
committed
Generalize hdf5 types
1 parent 7986d2f commit 42e357b

2 files changed

Lines changed: 169 additions & 101 deletions

File tree

Source/Plugins/CommonLibs/OpenEphysHDF5Lib/HDF5FileFormat.cpp

Lines changed: 133 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,13 @@ void HDF5FileBase::close()
111111
opened = false;
112112
}
113113

114-
int HDF5FileBase::setAttribute(DataTypes type, const void* data, String path, String name)
114+
int HDF5FileBase::setAttribute(BaseDataType type, const void* data, String path, String name)
115115
{
116116
return setAttributeArray(type, data, 1, path, name);
117117
}
118118

119119

120-
int HDF5FileBase::setAttributeArray(DataTypes type, const void* data, int size, String path, String name)
120+
int HDF5FileBase::setAttributeArray(BaseDataType type, const void* data, int size, String path, String name)
121121
{
122122
H5Location* loc;
123123
Group gloc;
@@ -335,13 +335,13 @@ HDF5RecordingData* HDF5FileBase::getDataSet(String path)
335335
}
336336
}
337337

338-
HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int chunkX, String path)
338+
HDF5RecordingData* HDF5FileBase::createDataSet(BaseDataType type, int sizeX, int chunkX, String path)
339339
{
340340
int chunks[3] = {chunkX, 0, 0};
341341
return createDataSet(type,1,&sizeX,chunks,path);
342342
}
343343

344-
HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path)
344+
HDF5RecordingData* HDF5FileBase::createDataSet(BaseDataType type, int sizeX, int sizeY, int chunkX, String path)
345345
{
346346
int size[2];
347347
int chunks[3] = {chunkX, 0, 0};
@@ -350,7 +350,7 @@ HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int si
350350
return createDataSet(type,2,size,chunks,path);
351351
}
352352

353-
HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path)
353+
HDF5RecordingData* HDF5FileBase::createDataSet(BaseDataType type, int sizeX, int sizeY, int sizeZ, int chunkX, String path)
354354
{
355355
int size[3];
356356
int chunks[3] = {chunkX, 0, 0};
@@ -360,7 +360,7 @@ HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int si
360360
return createDataSet(type,3,size,chunks,path);
361361
}
362362

363-
HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path)
363+
HDF5RecordingData* HDF5FileBase::createDataSet(BaseDataType type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path)
364364
{
365365
int size[3];
366366
int chunks[3] = {chunkX, chunkY, 0};
@@ -370,7 +370,7 @@ HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int si
370370
return createDataSet(type,3,size,chunks,path);
371371
}
372372

373-
HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path)
373+
HDF5RecordingData* HDF5FileBase::createDataSet(BaseDataType type, int dimension, int* size, int* chunking, String path)
374374
{
375375
ScopedPointer<DataSet> data;
376376
DSetCreatPropList prop;
@@ -426,88 +426,135 @@ HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int dimension, in
426426

427427
}
428428

429-
H5::DataType HDF5FileBase::getNativeType(DataTypes type)
429+
H5::DataType HDF5FileBase::getNativeType(BaseDataType type)
430430
{
431-
switch (type)
432-
{
433-
case I8:
434-
return PredType::NATIVE_INT8;
435-
break;
436-
case I16:
437-
return PredType::NATIVE_INT16;
438-
break;
439-
case I32:
440-
return PredType::NATIVE_INT32;
441-
break;
442-
case I64:
443-
return PredType::NATIVE_INT64;
444-
break;
445-
case U8:
446-
return PredType::NATIVE_UINT8;
447-
break;
448-
case U16:
449-
return PredType::NATIVE_UINT16;
450-
break;
451-
case U32:
452-
return PredType::NATIVE_UINT32;
453-
break;
454-
case U64:
455-
return PredType::NATIVE_UINT64;
456-
break;
457-
case F32:
458-
return PredType::NATIVE_FLOAT;
459-
break;
460-
case F64:
461-
return PredType::NATIVE_DOUBLE;
462-
break;
463-
case STR:
464-
return StrType(PredType::C_S1,MAX_STR_SIZE);
465-
break;
466-
}
467-
return PredType::NATIVE_INT32;
431+
H5::DataType baseType;
432+
433+
switch (type.type)
434+
{
435+
case BaseDataType::Type::T_I8:
436+
baseType = PredType::NATIVE_INT8;
437+
break;
438+
case BaseDataType::Type::T_I16:
439+
baseType = PredType::NATIVE_INT16;
440+
break;
441+
case BaseDataType::Type::T_I32:
442+
baseType = PredType::NATIVE_INT32;
443+
break;
444+
case BaseDataType::Type::T_I64:
445+
baseType = PredType::NATIVE_INT64;
446+
break;
447+
case BaseDataType::Type::T_U8:
448+
baseType = PredType::NATIVE_UINT8;
449+
break;
450+
case BaseDataType::Type::T_U16:
451+
baseType = PredType::NATIVE_UINT16;
452+
break;
453+
case BaseDataType::Type::T_U32:
454+
baseType = PredType::NATIVE_UINT32;
455+
break;
456+
case BaseDataType::Type::T_U64:
457+
baseType = PredType::NATIVE_UINT64;
458+
break;
459+
case BaseDataType::Type::T_F32:
460+
baseType = PredType::NATIVE_FLOAT;
461+
break;
462+
case BaseDataType::Type::T_F64:
463+
baseType = PredType::NATIVE_DOUBLE;
464+
break;
465+
case BaseDataType::Type::T_STR:
466+
return StrType(PredType::C_S1, type.typeSize);
467+
break;
468+
default:
469+
baseType = PredType::NATIVE_INT32;
470+
}
471+
if (type.typeSize > 1)
472+
{
473+
hsize_t size = type.typeSize;
474+
return ArrayType(baseType, 1, &size);
475+
}
476+
else return baseType;
468477
}
469478

470-
H5::DataType HDF5FileBase::getH5Type(DataTypes type)
479+
H5::DataType HDF5FileBase::getH5Type(BaseDataType type)
471480
{
472-
switch (type)
473-
{
474-
case I8:
475-
return PredType::STD_I8LE;
476-
break;
477-
case I16:
478-
return PredType::STD_I16LE;
479-
break;
480-
case I32:
481-
return PredType::STD_I32LE;
482-
break;
483-
case I64:
484-
return PredType::STD_I64LE;
485-
break;
486-
case U8:
487-
return PredType::STD_U8LE;
488-
break;
489-
case U16:
490-
return PredType::STD_U16LE;
491-
break;
492-
case U32:
493-
return PredType::STD_U32LE;
494-
break;
495-
case U64:
496-
return PredType::STD_U64LE;
497-
break;
498-
case F32:
499-
return PredType::IEEE_F32LE;
500-
break;
501-
case F64:
502-
return PredType::IEEE_F64LE;
503-
break;
504-
case STR:
505-
return StrType(PredType::C_S1,MAX_STR_SIZE);
506-
break;
507-
}
508-
return PredType::STD_I32LE;
481+
H5::DataType baseType;
482+
483+
switch (type.type)
484+
{
485+
case BaseDataType::Type::T_I8:
486+
baseType = PredType::STD_I8LE;
487+
break;
488+
case BaseDataType::Type::T_I16:
489+
baseType = PredType::STD_I16LE;
490+
break;
491+
case BaseDataType::Type::T_I32:
492+
baseType = PredType::STD_I32LE;
493+
break;
494+
case BaseDataType::Type::T_I64:
495+
baseType = PredType::STD_I64LE;
496+
break;
497+
case BaseDataType::Type::T_U8:
498+
baseType = PredType::STD_U8LE;
499+
break;
500+
case BaseDataType::Type::T_U16:
501+
baseType = PredType::STD_U16LE;
502+
break;
503+
case BaseDataType::Type::T_U32:
504+
baseType = PredType::STD_U32LE;
505+
break;
506+
case BaseDataType::Type::T_U64:
507+
baseType = PredType::STD_U64LE;
508+
break;
509+
case BaseDataType::Type::T_F32:
510+
return PredType::IEEE_F32LE;
511+
break;
512+
case BaseDataType::Type::T_F64:
513+
baseType = PredType::IEEE_F64LE;
514+
break;
515+
case BaseDataType::Type::T_STR:
516+
return StrType(PredType::C_S1, type.typeSize);
517+
break;
518+
default:
519+
return PredType::STD_I32LE;
520+
}
521+
if (type.typeSize > 1)
522+
{
523+
hsize_t size = type.typeSize;
524+
return ArrayType(baseType, 1, &size);
525+
}
526+
else return baseType;
509527
}
510528

529+
//BaseDataType
530+
531+
HDF5FileBase::BaseDataType::BaseDataType(HDF5FileBase::BaseDataType::Type t, size_t s)
532+
: type(t), typeSize(s)
533+
{}
534+
535+
HDF5FileBase::BaseDataType::BaseDataType()
536+
: type(T_I32), typeSize(1)
537+
{}
538+
539+
HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::STR(size_t size)
540+
{
541+
return HDF5FileBase::BaseDataType(T_STR, size);
542+
}
543+
544+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::U8 = HDF5FileBase::BaseDataType(T_U8, 1);
545+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::U16 = HDF5FileBase::BaseDataType(T_U16, 1);
546+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::U32 = HDF5FileBase::BaseDataType(T_U32, 1);
547+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::U64 = HDF5FileBase::BaseDataType(T_U64, 1);
548+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::I8 = HDF5FileBase::BaseDataType(T_I8, 1);
549+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::I16 = HDF5FileBase::BaseDataType(T_I16, 1);
550+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::I32 = HDF5FileBase::BaseDataType(T_I32, 1);
551+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::I64 = HDF5FileBase::BaseDataType(T_I64, 1);
552+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::F32 = HDF5FileBase::BaseDataType(T_F32, 1);
553+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::F64 = HDF5FileBase::BaseDataType(T_F64, 1);
554+
const HDF5FileBase::BaseDataType HDF5FileBase::BaseDataType::DSTR = HDF5FileBase::BaseDataType(T_STR, DEFAULT_STR_SIZE);
555+
556+
//H5RecordingData
557+
511558
HDF5RecordingData::HDF5RecordingData(DataSet* data)
512559
{
513560
DataSpace dSpace;
@@ -543,12 +590,12 @@ HDF5RecordingData::~HDF5RecordingData()
543590
//Safety
544591
dSet->flush(H5F_SCOPE_GLOBAL);
545592
}
546-
int HDF5RecordingData::writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, const void* data)
593+
int HDF5RecordingData::writeDataBlock(int xDataSize, HDF5FileBase::BaseDataType type, const void* data)
547594
{
548595
return writeDataBlock(xDataSize,size[1],type,data);
549596
}
550597

551-
int HDF5RecordingData::writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, const void* data)
598+
int HDF5RecordingData::writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::BaseDataType type, const void* data)
552599
{
553600
hsize_t dim[3],offset[3];
554601
DataSpace fSpace;
@@ -602,7 +649,7 @@ int HDF5RecordingData::writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase
602649
}
603650

604651

605-
int HDF5RecordingData::writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, const void* data)
652+
int HDF5RecordingData::writeDataRow(int yPos, int xDataSize, HDF5FileBase::BaseDataType type, const void* data)
606653
{
607654
hsize_t dim[2],offset[2];
608655
DataSpace fSpace;

Source/Plugins/CommonLibs/OpenEphysHDF5Lib/HDF5FileFormat.h

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#define CHUNK_XSIZE 2048
3434
#endif
3535

36-
#define MAX_STR_SIZE 256
36+
#define DEFAULT_STR_SIZE 256
3737

3838
namespace H5
3939
{
@@ -59,37 +59,58 @@ class COMMON_LIB HDF5FileBase
5959
virtual String getFileName() = 0;
6060
bool isOpen() const;
6161
bool isReadyToOpen() const;
62-
typedef enum DataTypes { U8, U16, U32, U64, I8, I16, I32, I64, F32, F64, STR} DataTypes;
63-
64-
static H5::DataType getNativeType(DataTypes type);
65-
static H5::DataType getH5Type(DataTypes type);
62+
class COMMON_LIB BaseDataType {
63+
public:
64+
enum Type { T_U8, T_U16, T_U32, T_U64, T_I8, T_I16, T_I32, T_I64, T_F32, T_F64, T_STR };
65+
BaseDataType();
66+
BaseDataType(Type, size_t);
67+
Type type;
68+
size_t typeSize;
69+
70+
//handy accessors
71+
static const BaseDataType U8;
72+
static const BaseDataType U16;
73+
static const BaseDataType U32;
74+
static const BaseDataType U64;
75+
static const BaseDataType I8;
76+
static const BaseDataType I16;
77+
static const BaseDataType I32;
78+
static const BaseDataType I64;
79+
static const BaseDataType F32;
80+
static const BaseDataType F64;
81+
static const BaseDataType DSTR;
82+
static BaseDataType STR(size_t size);
83+
};
84+
85+
static H5::DataType getNativeType(BaseDataType type);
86+
static H5::DataType getH5Type(BaseDataType type);
6687

6788
protected:
6889

6990
virtual int createFileStructure() = 0;
7091

71-
int setAttribute(DataTypes type, const void* data, String path, String name);
92+
int setAttribute(BaseDataType type, const void* data, String path, String name);
7293
int setAttributeStr(const String& value, String path, String name);
73-
int setAttributeArray(DataTypes type, const void* data, int size, String path, String name);
94+
int setAttributeArray(BaseDataType type, const void* data, int size, String path, String name);
7495
int setAttributeStrArray(const StringArray& data, String path, String name);
7596
int createGroup(String path);
7697
int createGroupIfDoesNotExist(String path);
7798

7899
HDF5RecordingData* getDataSet(String path);
79100

80101
//aliases for createDataSet
81-
HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int chunkX, String path);
82-
HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path);
83-
HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path);
84-
HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path);
102+
HDF5RecordingData* createDataSet(BaseDataType type, int sizeX, int chunkX, String path);
103+
HDF5RecordingData* createDataSet(BaseDataType type, int sizeX, int sizeY, int chunkX, String path);
104+
HDF5RecordingData* createDataSet(BaseDataType type, int sizeX, int sizeY, int sizeZ, int chunkX, String path);
105+
HDF5RecordingData* createDataSet(BaseDataType type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path);
85106

86107
bool readyToOpen;
87108

88109
private:
89110
int setAttributeStrArray(Array<const char*>& data, int maxSize, String path, String name);
90111

91112
//create an extendable dataset
92-
HDF5RecordingData* createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path);
113+
HDF5RecordingData* createDataSet(BaseDataType type, int dimension, int* size, int* chunking, String path);
93114
int open(bool newfile, int nChans);
94115
ScopedPointer<H5::H5File> file;
95116
bool opened;
@@ -103,10 +124,10 @@ class COMMON_LIB HDF5RecordingData
103124
HDF5RecordingData(H5::DataSet* data);
104125
~HDF5RecordingData();
105126

106-
int writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, const void* data);
107-
int writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, const void* data);
127+
int writeDataBlock(int xDataSize, HDF5FileBase::BaseDataType type, const void* data);
128+
int writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::BaseDataType type, const void* data);
108129

109-
int writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, const void* data);
130+
int writeDataRow(int yPos, int xDataSize, HDF5FileBase::BaseDataType type, const void* data);
110131

111132
void getRowXPositions(Array<uint32>& rows);
112133

0 commit comments

Comments
 (0)