aqnwb 0.2.0
Loading...
Searching...
No Matches
BaseIO.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <any>
4#include <cstdint>
5#include <iostream>
6#include <memory>
7#include <string>
8#include <typeindex>
9#include <unordered_map>
10#include <unordered_set>
11#include <variant>
12#include <vector>
13
14#include <boost/multi_array.hpp> // TODO move this and function def to the cpp file
15
16#include "Types.hpp"
17
18#define DEFAULT_STR_SIZE 256
19#define DEFAULT_ARRAY_SIZE 1
20
25
30namespace AQNWB::IO
31{
34} // namespace AQNWB::IO
35
36namespace AQNWB::IO
37{
38
47{
48public:
67
73 BaseDataType(Type t = T_I32, SizeType s = 1);
74
77
78 // handy accessors
79 static const BaseDataType U8;
80 static const BaseDataType U16;
81 static const BaseDataType U32;
82 static const BaseDataType U64;
83 static const BaseDataType I8;
84 static const BaseDataType I16;
85 static const BaseDataType I32;
86 static const BaseDataType I64;
87 static const BaseDataType F32;
88 static const BaseDataType F64;
89 static const BaseDataType DSTR;
90 static BaseDataType STR(
91 SizeType size);
92
93 // Define the equality operator
94 bool operator==(const BaseDataType& other) const
95 {
96 return type == other.type && typeSize == other.typeSize;
97 }
98
99 // Variant data type for representing any 1D vector with BaseDataType values
100 using BaseDataVectorVariant = std::variant<std::monostate,
101 std::vector<uint8_t>,
102 std::vector<uint16_t>,
103 std::vector<uint32_t>,
104 std::vector<uint64_t>,
105 std::vector<int8_t>,
106 std::vector<int16_t>,
107 std::vector<int32_t>,
108 std::vector<int64_t>,
109 std::vector<float>,
110 std::vector<double>,
111 std::vector<std::string>>;
112
121 static BaseDataType fromTypeId(const std::type_index& typeIndex)
122 {
123 if (typeIndex == typeid(uint8_t)) {
124 return BaseDataType(U8);
125 } else if (typeIndex == typeid(uint16_t)) {
126 return BaseDataType(U16);
127 } else if (typeIndex == typeid(uint32_t)) {
128 return BaseDataType(U32);
129 } else if (typeIndex == typeid(uint64_t)) {
130 return BaseDataType(U64);
131 } else if (typeIndex == typeid(int8_t)) {
132 return BaseDataType(I8);
133 } else if (typeIndex == typeid(int16_t)) {
134 return BaseDataType(I16);
135 } else if (typeIndex == typeid(int32_t)) {
136 return BaseDataType(I32);
137 } else if (typeIndex == typeid(int64_t)) {
138 return BaseDataType(I64);
139 } else if (typeIndex == typeid(float)) {
140 return BaseDataType(F32);
141 } else if (typeIndex == typeid(double)) {
142 return BaseDataType(F64);
143 } else {
144 throw std::runtime_error("Unsupported data type");
145 }
146 }
147};
148
149class DataBlockGeneric;
150
155enum class SearchMode
156{
166};
167
171enum class FileMode
172{
177
185
193};
194
204{
205public:
214 const SizeArray& shape,
215 const SizeArray& chunking);
216
220 virtual ~ArrayDataSetConfig() = default;
221
226 inline BaseDataType getType() const { return m_type; }
227
232 inline SizeArray getShape() const { return m_shape; }
233
238 inline SizeArray getChunking() const { return m_chunking; }
239
240protected:
241 // The data type of the dataset
243 // The shape of the dataset
245 // The chunking of the dataset
247};
248
259{
260public:
264 BaseIO(const std::string& filename);
265
269 BaseIO(const BaseIO&) = delete;
270
274 BaseIO& operator=(const BaseIO&) = delete;
275
279 virtual ~BaseIO();
280
285 virtual std::string getFileName() const { return m_filename; }
286
295 virtual StorageObjectType getStorageObjectType(std::string path) const = 0;
296
301 virtual Status open() = 0;
302
308 virtual Status open(FileMode mode) = 0;
309
314 virtual Status close() = 0;
315
320 virtual Status flush() = 0;
321
328 virtual bool objectExists(const std::string& path) const = 0;
329
338 virtual bool attributeExists(const std::string& path) const = 0;
339
357 virtual std::vector<std::pair<std::string, StorageObjectType>>
358 getStorageObjects(const std::string& path,
359 const StorageObjectType& objectType =
360 StorageObjectType::Undefined) const = 0;
361
387 virtual std::unordered_map<std::string, std::string> findTypes(
388 const std::string& starting_path,
389 const std::unordered_set<std::string>& types,
390 SearchMode search_mode,
391 bool exclude_starting_path = false) const;
392
411 std::string getFullTypeName(const std::string& path);
412
429 const std::string& dataPath,
430 const std::vector<SizeType>& start = {},
431 const std::vector<SizeType>& count = {},
432 const std::vector<SizeType>& stride = {},
433 const std::vector<SizeType>& block = {}) = 0;
434
446 virtual DataBlockGeneric readAttribute(const std::string& dataPath) const = 0;
447
454 virtual std::string readReferenceAttribute(
455 const std::string& dataPath) const = 0;
456
467 const void* data,
468 const std::string& path,
469 const std::string& name,
470 const SizeType& size = 1) = 0;
471
480 virtual Status createAttribute(const std::string& data,
481 const std::string& path,
482 const std::string& name,
483 const bool overwrite = false) = 0;
484
495 virtual Status createAttribute(const std::vector<std::string>& data,
496 const std::string& path,
497 const std::string& name,
498 const bool overwrite = false) = 0;
499
507 virtual Status createReferenceAttribute(const std::string& referencePath,
508 const std::string& path,
509 const std::string& name) = 0;
510
516 virtual Status createGroup(const std::string& path) = 0;
517
525 virtual Status createLink(const std::string& path,
526 const std::string& reference) = 0;
527
534 virtual Status createStringDataSet(const std::string& path,
535 const std::string& value) = 0;
536
544 const std::string& path, const std::vector<std::string>& values) = 0;
545
554 const std::string& path, const std::vector<std::string>& references) = 0;
555
560 virtual Status startRecording();
561
566 virtual Status stopRecording();
567
575 virtual bool canModifyObjects() { return true; }
576
584 virtual std::unique_ptr<BaseRecordingData> createArrayDataSet(
585 const ArrayDataSetConfig& config, const std::string& path) = 0;
586
592 virtual std::shared_ptr<BaseRecordingData> getDataSet(
593 const std::string& path) = 0;
594
600 virtual std::vector<SizeType> getStorageObjectShape(
601 const std::string path) = 0;
602
610 Status createCommonNWBAttributes(const std::string& path,
611 const std::string& objectNamespace,
612 const std::string& neurodataType = "");
613
618 inline bool isOpen() const { return m_opened; }
619
624 inline bool isReadyToOpen() const { return m_readyToOpen; }
625
630 inline std::shared_ptr<RecordingObjects> getRecordingObjects() const
631 {
632 return m_recording_objects;
633 }
634
635protected:
639 const std::string m_filename;
640
646 virtual Status createGroupIfDoesNotExist(const std::string& path) = 0;
647
652
657
662 std::shared_ptr<RecordingObjects> m_recording_objects;
663};
664
671{
672public:
677
682
687
691 virtual ~BaseRecordingData();
692
702 Status writeDataBlock(const std::vector<SizeType>& dataShape,
703 const BaseDataType& type,
704 const void* data);
705
714 virtual Status writeDataBlock(const std::vector<SizeType>& dataShape,
715 const std::vector<SizeType>& positionOffset,
716 const BaseDataType& type,
717 const void* data) = 0;
718
729 virtual Status writeDataBlock(const std::vector<SizeType>& dataShape,
730 const std::vector<SizeType>& positionOffset,
731 const BaseDataType& type,
732 const std::vector<std::string>& data) = 0;
733
738 inline SizeType getNumDimensions() const { return m_shape.size(); }
739
744 inline const std::vector<SizeType>& getShape() const { return m_shape; }
745
750 inline const std::vector<SizeType>& getPosition() const { return m_position; }
751
752protected:
756 std::vector<SizeType> m_shape;
757
761 std::vector<SizeType> m_position;
762};
763
764} // namespace AQNWB::IO
AQNWB::Types::StorageObjectType StorageObjectType
Definition BaseIO.hpp:21
AQNWB::Types::Status Status
Definition BaseIO.hpp:22
AQNWB::Types::SizeArray SizeArray
Definition BaseIO.hpp:23
AQNWB::Types::SizeType SizeType
Definition Channel.hpp:8
The configuration for an array dataset.
Definition BaseIO.hpp:204
virtual ~ArrayDataSetConfig()=default
Virtual destructor to ensure proper cleanup in derived classes.
SizeArray m_chunking
Definition BaseIO.hpp:246
SizeArray m_shape
Definition BaseIO.hpp:244
BaseDataType m_type
Definition BaseIO.hpp:242
SizeArray getShape() const
Returns the shape of the dataset.
Definition BaseIO.hpp:232
ArrayDataSetConfig(const BaseDataType &type, const SizeArray &shape, const SizeArray &chunking)
Constructs an ArrayDataSetConfig object with the specified type, shape, and chunking.
Definition BaseIO.cpp:35
BaseDataType getType() const
Returns the data type of the dataset.
Definition BaseIO.hpp:226
SizeArray getChunking() const
Returns the chunking of the dataset.
Definition BaseIO.hpp:238
Represents a base data type.
Definition BaseIO.hpp:47
static const BaseDataType F32
Accessor for 32-bit floating point.
Definition BaseIO.hpp:87
static const BaseDataType I64
Accessor for signed 64-bit integer.
Definition BaseIO.hpp:86
static BaseDataType STR(SizeType size)
Accessor for string with specified size.
Definition BaseIO.cpp:17
static const BaseDataType U32
Accessor for unsigned 32-bit integer.
Definition BaseIO.hpp:81
static const BaseDataType DSTR
Accessor for dynamic string.
Definition BaseIO.hpp:89
Type
Enumeration of different data types.
Definition BaseIO.hpp:53
@ V_STR
Variable length string.
Definition BaseIO.hpp:65
@ T_I32
Signed 32-bit integer.
Definition BaseIO.hpp:60
@ T_I64
Signed 64-bit integer.
Definition BaseIO.hpp:61
@ T_I8
Signed 8-bit integer.
Definition BaseIO.hpp:58
@ T_U32
Unsigned 32-bit integer.
Definition BaseIO.hpp:56
@ T_U64
Unsigned 64-bit integer.
Definition BaseIO.hpp:57
@ T_U8
Unsigned 8-bit integer.
Definition BaseIO.hpp:54
@ T_F32
32-bit floating point
Definition BaseIO.hpp:62
@ T_STR
String.
Definition BaseIO.hpp:64
@ T_F64
64-bit floating point
Definition BaseIO.hpp:63
@ T_U16
Unsigned 16-bit integer.
Definition BaseIO.hpp:55
@ T_I16
Signed 16-bit integer.
Definition BaseIO.hpp:59
static const BaseDataType U64
Accessor for unsigned 64-bit integer.
Definition BaseIO.hpp:82
static const BaseDataType U16
Accessor for unsigned 16-bit integer.
Definition BaseIO.hpp:80
static const BaseDataType F64
Accessor for 64-bit floating point.
Definition BaseIO.hpp:88
static const BaseDataType U8
Accessor for unsigned 8-bit integer.
Definition BaseIO.hpp:79
static const BaseDataType I32
Accessor for signed 32-bit integer.
Definition BaseIO.hpp:85
static const BaseDataType I16
Accessor for signed 16-bit integer.
Definition BaseIO.hpp:84
BaseDataType(Type t=T_I32, SizeType s=1)
Constructs a BaseDataType object with the specified type and size.
Definition BaseIO.cpp:11
Type type
The data type.
Definition BaseIO.hpp:75
std::variant< std::monostate, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< uint64_t >, std::vector< int8_t >, std::vector< int16_t >, std::vector< int32_t >, std::vector< int64_t >, std::vector< float >, std::vector< double >, std::vector< std::string > > BaseDataVectorVariant
Definition BaseIO.hpp:100
SizeType typeSize
The size of the data type.
Definition BaseIO.hpp:76
static BaseDataType fromTypeId(const std::type_index &typeIndex)
Get the BaseDataType from a std::type_index.
Definition BaseIO.hpp:121
bool operator==(const BaseDataType &other) const
Definition BaseIO.hpp:94
static const BaseDataType I8
Accessor for signed 8-bit integer.
Definition BaseIO.hpp:83
virtual bool objectExists(const std::string &path) const =0
Checks whether a Dataset, Group, or Link already exists at the location in the file.
virtual StorageObjectType getStorageObjectType(std::string path) const =0
Get the storage type (Group, Dataset, Attribute) of the object at path.
virtual bool attributeExists(const std::string &path) const =0
Checks whether an Attribute exists at the location in the file.
BaseIO & operator=(const BaseIO &)=delete
Assignment operator is deleted to prevent copying.
virtual Status createReferenceAttribute(const std::string &referencePath, const std::string &path, const std::string &name)=0
Sets an object reference attribute for a given location in the file.
virtual Status createStringDataSet(const std::string &path, const std::string &value)=0
Creates a non-modifiable dataset with a string value.
virtual Status close()=0
Closes the file.
Definition BaseIO.cpp:239
BaseIO(const std::string &filename)
Constructor for the BaseIO class.
Definition BaseIO.cpp:46
bool isOpen() const
Returns true if the file is open.
Definition BaseIO.hpp:618
virtual Status stopRecording()
Stops the recording process.
Definition BaseIO.cpp:215
virtual std::vector< SizeType > getStorageObjectShape(const std::string path)=0
Returns the size of the dataset or attribute for each dimension.
virtual Status createAttribute(const BaseDataType &type, const void *data, const std::string &path, const std::string &name, const SizeType &size=1)=0
Creates an attribute at a given location in the file.
virtual Status createAttribute(const std::string &data, const std::string &path, const std::string &name, const bool overwrite=false)=0
Creates a string attribute at a given location in the file.
virtual DataBlockGeneric readDataset(const std::string &dataPath, const std::vector< SizeType > &start={}, const std::vector< SizeType > &count={}, const std::vector< SizeType > &stride={}, const std::vector< SizeType > &block={})=0
Reads a dataset and determines the data type.
virtual ~BaseIO()
Destructor the BaseIO class.
Definition BaseIO.cpp:54
virtual std::unordered_map< std::string, std::string > findTypes(const std::string &starting_path, const std::unordered_set< std::string > &types, SearchMode search_mode, bool exclude_starting_path=false) const
Finds all datasets and groups of the given types in the HDF5 file.
Definition BaseIO.cpp:97
virtual Status createGroup(const std::string &path)=0
Creates a new group in the file.
Status createCommonNWBAttributes(const std::string &path, const std::string &objectNamespace, const std::string &neurodataType="")
Convenience function for creating NWB related attributes.
Definition BaseIO.cpp:56
virtual Status createLink(const std::string &path, const std::string &reference)=0
Creates a soft link to another location in the file.
const std::string m_filename
The name of the file.
Definition BaseIO.hpp:639
bool m_readyToOpen
Whether the file is ready to be opened.
Definition BaseIO.hpp:651
virtual Status flush()=0
Flush data to disk.
std::shared_ptr< RecordingObjects > getRecordingObjects() const
Returns the recording objects container for this IO object.
Definition BaseIO.hpp:630
bool isReadyToOpen() const
Returns true if the file is able to be opened.
Definition BaseIO.hpp:624
virtual std::vector< std::pair< std::string, StorageObjectType > > getStorageObjects(const std::string &path, const StorageObjectType &objectType=StorageObjectType::Undefined) const =0
Gets the list of storage objects (groups, datasets, attributes) inside a group.
virtual Status createAttribute(const std::vector< std::string > &data, const std::string &path, const std::string &name, const bool overwrite=false)=0
Creates an array of variable length strings attribute at a given location in the file.
virtual Status createGroupIfDoesNotExist(const std::string &path)=0
Creates a new group if it does not already exist.
virtual DataBlockGeneric readAttribute(const std::string &dataPath) const =0
Reads a attribute and determines the data type.
virtual std::string getFileName() const
Returns the full path to the file.
Definition BaseIO.hpp:285
virtual std::unique_ptr< BaseRecordingData > createArrayDataSet(const ArrayDataSetConfig &config, const std::string &path)=0
Creates an extendable dataset with the given configuration and path.
std::string getFullTypeName(const std::string &path)
Get the full name of the type from the attribute in the file.
Definition BaseIO.cpp:67
virtual Status startRecording()
Starts the recording process.
Definition BaseIO.cpp:203
virtual std::shared_ptr< BaseRecordingData > getDataSet(const std::string &path)=0
Returns a pointer to a dataset at a given path.
virtual std::string readReferenceAttribute(const std::string &dataPath) const =0
Reads a reference attribute and returns the path to the referenced object.
virtual bool canModifyObjects()
Returns true if the file is in a mode where objects can be added or deleted. Note,...
Definition BaseIO.hpp:575
BaseIO(const BaseIO &)=delete
Copy constructor is deleted to prevent construction-copying.
virtual Status open(FileMode mode)=0
Opens an existing file or creates a new file for writing.
virtual Status open()=0
Opens the file for writing.
virtual Status createReferenceDataSet(const std::string &path, const std::vector< std::string > &references)=0
Creates a dataset that holds an array of references to groups within the file.
virtual Status createStringDataSet(const std::string &path, const std::vector< std::string > &values)=0
Creates a dataset that holds an array of string values.
std::shared_ptr< RecordingObjects > m_recording_objects
The recording objects for tracking all RegisteredType objects used for recording associated with this...
Definition BaseIO.hpp:662
bool m_opened
Whether the file is currently open.
Definition BaseIO.hpp:656
The base class to represent recording data that can be extended.
Definition BaseIO.hpp:671
virtual Status writeDataBlock(const std::vector< SizeType > &dataShape, const std::vector< SizeType > &positionOffset, const BaseDataType &type, const std::vector< std::string > &data)=0
Writes a block of string data (any number of dimensions).
SizeType getNumDimensions() const
Get the number of dimensions in the dataset.
Definition BaseIO.hpp:738
BaseRecordingData()
Default constructor.
Definition BaseIO.cpp:199
const std::vector< SizeType > & getPosition() const
Get the current position in the dataset.
Definition BaseIO.hpp:750
Status writeDataBlock(const std::vector< SizeType > &dataShape, const BaseDataType &type, const void *data)
Writes a block of data using the stored position information. This is not intended to be overwritten ...
Definition BaseIO.cpp:250
std::vector< SizeType > m_position
The current position in the dataset.
Definition BaseIO.hpp:761
BaseRecordingData(const BaseRecordingData &)=delete
Deleted copy constructor to prevent construction-copying.
virtual Status writeDataBlock(const std::vector< SizeType > &dataShape, const std::vector< SizeType > &positionOffset, const BaseDataType &type, const void *data)=0
Writes a block of data (any number of dimensions).
BaseRecordingData & operator=(const BaseRecordingData &)=delete
Deleted copy assignment operator to prevent copying.
std::vector< SizeType > m_shape
The size of the dataset in each dimension.
Definition BaseIO.hpp:756
virtual ~BaseRecordingData()
Destructor.
Definition BaseIO.cpp:201
const std::vector< SizeType > & getShape() const
Get the size of the dataset.
Definition BaseIO.hpp:744
Generic structure to hold type-erased data and shape.
Definition ReadIO.hpp:30
The RecordingObjects class provides an interface for managing and holding groups of RegisteredType ob...
Definition RecordingObjects.hpp:27
StorageObjectType
Types of object used in the NWB schema.
Definition Types.hpp:54
Status
Represents the status of an operation.
Definition Types.hpp:23
std::vector< size_t > SizeArray
Alias for an array of size types used in the project.
Definition Types.hpp:88
size_t SizeType
Alias for the size type used in the project.
Definition Types.hpp:77
The namespace for IO components of AqNWB.
FileMode
The access mode for the file.
Definition BaseIO.hpp:172
@ ReadOnly
Opens the file in read only mode.
Definition BaseIO.hpp:192
@ ReadWrite
Opens the file with both read and write access.
Definition BaseIO.hpp:184
@ Overwrite
Opens the file and overwrites any existing file.
Definition BaseIO.hpp:176
SearchMode
Enum class for specifying the search mode for findTypes.
Definition BaseIO.hpp:156
@ STOP_ON_TYPE
Stop searching inside an object once a matching type is found.
Definition BaseIO.hpp:160
@ CONTINUE_ON_TYPE
Continue searching inside an object even after a matching type is found.
Definition BaseIO.hpp:165