From f94b98900493468f0bb22210abeba0a650a1fe30 Mon Sep 17 00:00:00 2001 From: kento Date: Fri, 19 Sep 2025 14:19:12 +0000 Subject: [PATCH 1/4] Add gradient and pulse fields as new StreamItem of `mrd_protocol.yml` --- model/mrd_gradient.yml | 34 ++++++++++++++++++++++++++++++++++ model/mrd_protocol.yml | 2 ++ model/mrd_pulse.yml | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 model/mrd_gradient.yml create mode 100644 model/mrd_pulse.yml diff --git a/model/mrd_gradient.yml b/model/mrd_gradient.yml new file mode 100644 index 00000000..c14c09cc --- /dev/null +++ b/model/mrd_gradient.yml @@ -0,0 +1,34 @@ +# gradient of defined direction stored as 1D array samples +GradientData: !array + items: float + dimensions: + samples: + +GradientDirection: !enum + values: + z: 1 + y: 2 + x: 3 + +GradientHeader: !record + fields: + # Clock time stamp (e.g. nanoseconds since midnight) + gradientTimeStampNs: uint64 + # Gradient sample duration in nanoseconds + gradientSampleTimeNs: uint + # Grad calibration (T/m/A). Can be here or as a calGradMap calibration image or neither + pulseCalibration: float*? + # Gradient direction as enum + gradientDirection: GradientDirection + +Gradient: !record + fields: + # Grad header + head: GradientHeader + # gradient data + data: GradientData + computedFields: + samples: size(data, "samples") + # timestamps in ns + starttime: head.gradientTimeStampNs + endtime: head.gradientTimeStampNs + samples * head.gradientSampleTimeNs diff --git a/model/mrd_protocol.yml b/model/mrd_protocol.yml index d185d883..4ff97b4b 100644 --- a/model/mrd_protocol.yml +++ b/model/mrd_protocol.yml @@ -1,6 +1,8 @@ # Union of all primary types that can be streamed in the MRD Protocol StreamItem: - Acquisition + - Pulse + - Gradient - WaveformUint32 - ImageUint16 - ImageInt16 diff --git a/model/mrd_pulse.yml b/model/mrd_pulse.yml new file mode 100644 index 00000000..4afb842e --- /dev/null +++ b/model/mrd_pulse.yml @@ -0,0 +1,42 @@ +PulseData: !array + items: float + dimensions: + coils: + samples: + +PulsePhase: !array + items: float + dimensions: + samples: + +PulsePhaseOffset: !array + items: float + dimensions: + coils: + +PulseHeader: !record + fields: + # Clock time stamp (e.g. nanoseconds since midnight) + pulseTimeStampNs: uint64 + # Channel numbers + channelOrder: uint* + # Sample time in ns + sampleTimeNs: uint + # Pulse calibration (rad/s/V). Can be here or as a calB1Map calibration image or neither + pulseCalibration: float*? + +Pulse: !record + fields: + # Pulse header + head: PulseHeader + # Raw pulse amplitude array + amplitude: PulseData + # Full profile of pulse phase array + phase: PulsePhase + # Pulse phase offset + phaseOffset: PulsePhaseOffset + computedFields: + # Assuming writer sets amp and phase array the same size + coils: size(amplitude, "coils") + samples: size(amplitude, "samples") + activeChannels: size(head.channelOrder) From a9cd76dc829fb0478d50f72292024f997b520c69 Mon Sep 17 00:00:00 2001 From: kento Date: Fri, 19 Sep 2025 15:34:21 +0000 Subject: [PATCH 2/4] Add convert functions from mrd to ismrmrd for mrd.Gradient and mrd.Pulse --- cpp/mrd-tools/converters.cc | 10 ++++++++++ cpp/mrd-tools/converters.h | 4 +++- cpp/mrd-tools/mrd_to_ismrmrd.cc | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cpp/mrd-tools/converters.cc b/cpp/mrd-tools/converters.cc index ab9338c3..abfb61f8 100644 --- a/cpp/mrd-tools/converters.cc +++ b/cpp/mrd-tools/converters.cc @@ -1107,6 +1107,16 @@ int convert(ArrayComplexFloat&) { return 0; } +// Convert mrd::Gradient - no equivalent in ISMRMRD:: +int convert(Gradient&) { + return 0; +} + +// Convert mrd::Pulse - no equivalent in ISMRMRD:: +int convert(Pulse&) { + return 0; +} + yardl::Date date_from_string(const std::string& s) { std::stringstream ss{s}; diff --git a/cpp/mrd-tools/converters.h b/cpp/mrd-tools/converters.h index 490359bf..ffea93d4 100644 --- a/cpp/mrd-tools/converters.h +++ b/cpp/mrd-tools/converters.h @@ -2,8 +2,8 @@ #include "mrd/types.h" -#include #include +#include namespace mrd::converters { @@ -22,6 +22,8 @@ int convert(AcquisitionBucket&); int convert(ReconData&); int convert(ImageArray&); int convert(ArrayComplexFloat&); +int convert(Gradient&); +int convert(Pulse&); Header convert(ISMRMRD::IsmrmrdHeader& hdr); Acquisition convert(ISMRMRD::Acquisition& acq); diff --git a/cpp/mrd-tools/mrd_to_ismrmrd.cc b/cpp/mrd-tools/mrd_to_ismrmrd.cc index 99371164..a48744fe 100644 --- a/cpp/mrd-tools/mrd_to_ismrmrd.cc +++ b/cpp/mrd-tools/mrd_to_ismrmrd.cc @@ -82,6 +82,8 @@ int main(int argc, char** argv) { mrd::StreamItem item; while (r.ReadData(item)) { + // if item type is mrd::Pulse or mrd::Gradient, skip from visit serailizer + // as the ISMRMRD format does not support these types std::visit([&serializer](auto&& arg) { serializer.serialize(convert(arg)); }, item); } From 158470bfe985c823aad02e65482d475173669a8c Mon Sep 17 00:00:00 2001 From: kento Date: Fri, 19 Sep 2025 15:35:40 +0000 Subject: [PATCH 3/4] yardl generated code tested with 'just validate' --- cpp/mrd/binary/protocols.cc | 248 ++++++++++++++++- cpp/mrd/hdf5/protocols.cc | 259 +++++++++++++++--- cpp/mrd/hdf5/protocols.h | 4 +- cpp/mrd/ndjson/protocols.cc | 210 +++++++++++++- cpp/mrd/protocols.cc | 2 +- cpp/mrd/types.h | 130 ++++++++- .../+mrd/+binary/GradientHeaderSerializer.m | 27 ++ .../toolbox/+mrd/+binary/GradientSerializer.m | 25 ++ matlab/toolbox/+mrd/+binary/MrdReader.m | 2 +- matlab/toolbox/+mrd/+binary/MrdWriter.m | 2 +- .../+mrd/+binary/PulseHeaderSerializer.m | 27 ++ matlab/toolbox/+mrd/+binary/PulseSerializer.m | 27 ++ matlab/toolbox/+mrd/Gradient.m | 53 ++++ matlab/toolbox/+mrd/GradientData.m | 9 + matlab/toolbox/+mrd/GradientDirection.m | 28 ++ matlab/toolbox/+mrd/GradientHeader.m | 46 ++++ matlab/toolbox/+mrd/MrdWriterBase.m | 2 +- matlab/toolbox/+mrd/Pulse.m | 74 +++++ matlab/toolbox/+mrd/PulseData.m | 8 + matlab/toolbox/+mrd/PulseHeader.m | 57 ++++ matlab/toolbox/+mrd/PulsePhase.m | 8 + matlab/toolbox/+mrd/PulsePhaseOffset.m | 8 + matlab/toolbox/+mrd/StreamItem.m | 70 +++-- python/mrd/__init__.py | 9 + python/mrd/binary.py | 76 ++++- python/mrd/ndjson.py | 227 ++++++++++++++- python/mrd/protocols.py | 2 +- python/mrd/types.py | 224 ++++++++++++++- 28 files changed, 1749 insertions(+), 115 deletions(-) create mode 100644 matlab/toolbox/+mrd/+binary/GradientHeaderSerializer.m create mode 100644 matlab/toolbox/+mrd/+binary/GradientSerializer.m create mode 100644 matlab/toolbox/+mrd/+binary/PulseHeaderSerializer.m create mode 100644 matlab/toolbox/+mrd/+binary/PulseSerializer.m create mode 100644 matlab/toolbox/+mrd/Gradient.m create mode 100644 matlab/toolbox/+mrd/GradientData.m create mode 100644 matlab/toolbox/+mrd/GradientDirection.m create mode 100644 matlab/toolbox/+mrd/GradientHeader.m create mode 100644 matlab/toolbox/+mrd/Pulse.m create mode 100644 matlab/toolbox/+mrd/PulseData.m create mode 100644 matlab/toolbox/+mrd/PulseHeader.m create mode 100644 matlab/toolbox/+mrd/PulsePhase.m create mode 100644 matlab/toolbox/+mrd/PulsePhaseOffset.m diff --git a/cpp/mrd/binary/protocols.cc b/cpp/mrd/binary/protocols.cc index 035af5e4..af64bb32 100644 --- a/cpp/mrd/binary/protocols.cc +++ b/cpp/mrd/binary/protocols.cc @@ -73,6 +73,30 @@ struct IsTriviallySerializable { offsetof(__T__, head) < offsetof(__T__, data) && offsetof(__T__, data) < offsetof(__T__, trajectory); }; +template <> +struct IsTriviallySerializable { + using __T__ = mrd::GradientHeader; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::gradient_time_stamp_ns) + sizeof(__T__::gradient_sample_time_ns) + sizeof(__T__::pulse_calibration) + sizeof(__T__::gradient_direction))) && + offsetof(__T__, gradient_time_stamp_ns) < offsetof(__T__, gradient_sample_time_ns) && offsetof(__T__, gradient_sample_time_ns) < offsetof(__T__, pulse_calibration) && offsetof(__T__, pulse_calibration) < offsetof(__T__, gradient_direction); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::Gradient; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::head) + sizeof(__T__::data))) && + offsetof(__T__, head) < offsetof(__T__, data); +}; + template <> struct IsTriviallySerializable { using __T__ = mrd::SubjectInformationType; @@ -637,6 +661,32 @@ struct IsTriviallySerializable { offsetof(__T__, data) < offsetof(__T__, headers) && offsetof(__T__, headers) < offsetof(__T__, meta) && offsetof(__T__, meta) < offsetof(__T__, waveforms); }; +template <> +struct IsTriviallySerializable { + using __T__ = mrd::PulseHeader; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::pulse_time_stamp_ns) + sizeof(__T__::channel_order) + sizeof(__T__::sample_time_ns) + sizeof(__T__::pulse_calibration))) && + offsetof(__T__, pulse_time_stamp_ns) < offsetof(__T__, channel_order) && offsetof(__T__, channel_order) < offsetof(__T__, sample_time_ns) && offsetof(__T__, sample_time_ns) < offsetof(__T__, pulse_calibration); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::Pulse; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::head) + sizeof(__T__::amplitude) + sizeof(__T__::phase) + sizeof(__T__::phase_offset))) && + offsetof(__T__, head) < offsetof(__T__, amplitude) && offsetof(__T__, amplitude) < offsetof(__T__, phase) && offsetof(__T__, phase) < offsetof(__T__, phase_offset); +}; + #ifndef _MSC_VER #pragma GCC diagnostic pop // #pragma GCC diagnostic ignored "-Winvalid-offsetof" #endif @@ -798,8 +848,8 @@ void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant WriteT0, typename T1, yardl::binary::Writer WriteT1, typename T2, yardl::binary::Writer WriteT2, typename T3, yardl::binary::Writer WriteT3, typename T4, yardl::binary::Writer WriteT4, typename T5, yardl::binary::Writer WriteT5, typename T6, yardl::binary::Writer WriteT6, typename T7, yardl::binary::Writer WriteT7, typename T8, yardl::binary::Writer WriteT8, typename T9, yardl::binary::Writer WriteT9, typename T10, yardl::binary::Writer WriteT10, typename T11, yardl::binary::Writer WriteT11, typename T12, yardl::binary::Writer WriteT12, typename T13, yardl::binary::Writer WriteT13> -void WriteUnion(yardl::binary::CodedOutputStream& stream, std::variant const& value) { +template WriteT0, typename T1, yardl::binary::Writer WriteT1, typename T2, yardl::binary::Writer WriteT2, typename T3, yardl::binary::Writer WriteT3, typename T4, yardl::binary::Writer WriteT4, typename T5, yardl::binary::Writer WriteT5, typename T6, yardl::binary::Writer WriteT6, typename T7, yardl::binary::Writer WriteT7, typename T8, yardl::binary::Writer WriteT8, typename T9, yardl::binary::Writer WriteT9, typename T10, yardl::binary::Writer WriteT10, typename T11, yardl::binary::Writer WriteT11, typename T12, yardl::binary::Writer WriteT12, typename T13, yardl::binary::Writer WriteT13, typename T14, yardl::binary::Writer WriteT14, typename T15, yardl::binary::Writer WriteT15> +void WriteUnion(yardl::binary::CodedOutputStream& stream, std::variant const& value) { yardl::binary::WriteInteger(stream, value.index()); switch (value.index()) { case 0: { @@ -872,12 +922,22 @@ void WriteUnion(yardl::binary::CodedOutputStream& stream, std::variant(value); + WriteT14(stream, v); + break; + } + case 15: { + T15 const& v = std::get<15>(value); + WriteT15(stream, v); + break; + } default: throw std::runtime_error("Invalid union index."); } } -template ReadT0, typename T1, yardl::binary::Reader ReadT1, typename T2, yardl::binary::Reader ReadT2, typename T3, yardl::binary::Reader ReadT3, typename T4, yardl::binary::Reader ReadT4, typename T5, yardl::binary::Reader ReadT5, typename T6, yardl::binary::Reader ReadT6, typename T7, yardl::binary::Reader ReadT7, typename T8, yardl::binary::Reader ReadT8, typename T9, yardl::binary::Reader ReadT9, typename T10, yardl::binary::Reader ReadT10, typename T11, yardl::binary::Reader ReadT11, typename T12, yardl::binary::Reader ReadT12, typename T13, yardl::binary::Reader ReadT13> -void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant& value) { +template ReadT0, typename T1, yardl::binary::Reader ReadT1, typename T2, yardl::binary::Reader ReadT2, typename T3, yardl::binary::Reader ReadT3, typename T4, yardl::binary::Reader ReadT4, typename T5, yardl::binary::Reader ReadT5, typename T6, yardl::binary::Reader ReadT6, typename T7, yardl::binary::Reader ReadT7, typename T8, yardl::binary::Reader ReadT8, typename T9, yardl::binary::Reader ReadT9, typename T10, yardl::binary::Reader ReadT10, typename T11, yardl::binary::Reader ReadT11, typename T12, yardl::binary::Reader ReadT12, typename T13, yardl::binary::Reader ReadT13, typename T14, yardl::binary::Reader ReadT14, typename T15, yardl::binary::Reader ReadT15> +void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant& value) { size_t index; yardl::binary::ReadInteger(stream, index); switch (index) { @@ -965,6 +1025,18 @@ void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteNDArray(stream, value); +} + +[[maybe_unused]] void ReadGradientData(yardl::binary::CodedInputStream& stream, mrd::GradientData& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadNDArray(stream, value); +} + +[[maybe_unused]] void WriteGradientHeader(yardl::binary::CodedOutputStream& stream, mrd::GradientHeader const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.gradient_time_stamp_ns); + yardl::binary::WriteInteger(stream, value.gradient_sample_time_ns); + yardl::binary::WriteOptional, yardl::binary::WriteVector>(stream, value.pulse_calibration); + yardl::binary::WriteEnum(stream, value.gradient_direction); +} + +[[maybe_unused]] void ReadGradientHeader(yardl::binary::CodedInputStream& stream, mrd::GradientHeader& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.gradient_time_stamp_ns); + yardl::binary::ReadInteger(stream, value.gradient_sample_time_ns); + yardl::binary::ReadOptional, yardl::binary::ReadVector>(stream, value.pulse_calibration); + yardl::binary::ReadEnum(stream, value.gradient_direction); +} + +[[maybe_unused]] void WriteGradient(yardl::binary::CodedOutputStream& stream, mrd::Gradient const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + mrd::binary::WriteGradientHeader(stream, value.head); + mrd::binary::WriteGradientData(stream, value.data); +} + +[[maybe_unused]] void ReadGradient(yardl::binary::CodedInputStream& stream, mrd::Gradient& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + mrd::binary::ReadGradientHeader(stream, value.head); + mrd::binary::ReadGradientData(stream, value.data); +} + [[maybe_unused]] void WriteSubjectInformationType(yardl::binary::CodedOutputStream& stream, mrd::SubjectInformationType const& value) { if constexpr (yardl::binary::IsTriviallySerializable::value) { yardl::binary::WriteTriviallySerializable(stream, value); @@ -2472,13 +2606,115 @@ template ReadT> mrd::binary::ReadArray, yardl::binary::ReadFloatingPoint>(stream, value); } +[[maybe_unused]] void WritePulseHeader(yardl::binary::CodedOutputStream& stream, mrd::PulseHeader const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.pulse_time_stamp_ns); + yardl::binary::WriteVector(stream, value.channel_order); + yardl::binary::WriteInteger(stream, value.sample_time_ns); + yardl::binary::WriteOptional, yardl::binary::WriteVector>(stream, value.pulse_calibration); +} + +[[maybe_unused]] void ReadPulseHeader(yardl::binary::CodedInputStream& stream, mrd::PulseHeader& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.pulse_time_stamp_ns); + yardl::binary::ReadVector(stream, value.channel_order); + yardl::binary::ReadInteger(stream, value.sample_time_ns); + yardl::binary::ReadOptional, yardl::binary::ReadVector>(stream, value.pulse_calibration); +} + +[[maybe_unused]] void WritePulseData(yardl::binary::CodedOutputStream& stream, mrd::PulseData const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteNDArray(stream, value); +} + +[[maybe_unused]] void ReadPulseData(yardl::binary::CodedInputStream& stream, mrd::PulseData& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadNDArray(stream, value); +} + +[[maybe_unused]] void WritePulsePhase(yardl::binary::CodedOutputStream& stream, mrd::PulsePhase const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteNDArray(stream, value); +} + +[[maybe_unused]] void ReadPulsePhase(yardl::binary::CodedInputStream& stream, mrd::PulsePhase& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadNDArray(stream, value); +} + +[[maybe_unused]] void WritePulsePhaseOffset(yardl::binary::CodedOutputStream& stream, mrd::PulsePhaseOffset const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteNDArray(stream, value); +} + +[[maybe_unused]] void ReadPulsePhaseOffset(yardl::binary::CodedInputStream& stream, mrd::PulsePhaseOffset& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadNDArray(stream, value); +} + +[[maybe_unused]] void WritePulse(yardl::binary::CodedOutputStream& stream, mrd::Pulse const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + mrd::binary::WritePulseHeader(stream, value.head); + mrd::binary::WritePulseData(stream, value.amplitude); + mrd::binary::WritePulsePhase(stream, value.phase); + mrd::binary::WritePulsePhaseOffset(stream, value.phase_offset); +} + +[[maybe_unused]] void ReadPulse(yardl::binary::CodedInputStream& stream, mrd::Pulse& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + mrd::binary::ReadPulseHeader(stream, value.head); + mrd::binary::ReadPulseData(stream, value.amplitude); + mrd::binary::ReadPulsePhase(stream, value.phase); + mrd::binary::ReadPulsePhaseOffset(stream, value.phase_offset); +} + [[maybe_unused]] void WriteStreamItem(yardl::binary::CodedOutputStream& stream, mrd::StreamItem const& value) { if constexpr (yardl::binary::IsTriviallySerializable::value) { yardl::binary::WriteTriviallySerializable(stream, value); return; } - WriteUnion(stream, value); + WriteUnion(stream, value); } [[maybe_unused]] void ReadStreamItem(yardl::binary::CodedInputStream& stream, mrd::StreamItem& value) { @@ -2487,7 +2723,7 @@ template ReadT> return; } - ReadUnion(stream, value); + ReadUnion(stream, value); } } // namespace diff --git a/cpp/mrd/hdf5/protocols.cc b/cpp/mrd/hdf5/protocols.cc index 5932ac6c..417d9eff 100644 --- a/cpp/mrd/hdf5/protocols.cc +++ b/cpp/mrd/hdf5/protocols.cc @@ -312,23 +312,23 @@ H5::CompType InnerUnion8Ddl(bool nullable, H5::DataType const& t0, std::string c return rtn; } -template -class InnerUnion14 { +template +class InnerUnion16 { public: - InnerUnion14() : type_index_(-1) {} - InnerUnion14(std::variant const& v) : type_index_(static_cast(v.index())) { + InnerUnion16() : type_index_(-1) {} + InnerUnion16(std::variant const& v) : type_index_(static_cast(v.index())) { Init(v); } - InnerUnion14(std::variant const& v) : type_index_(static_cast(v.index()) - 1) { + InnerUnion16(std::variant const& v) : type_index_(static_cast(v.index()) - 1) { Init(v); } - InnerUnion14(InnerUnion14 const& v) = delete; + InnerUnion16(InnerUnion16 const& v) = delete; - InnerUnion14 operator=(InnerUnion14 const&) = delete; + InnerUnion16 operator=(InnerUnion16 const&) = delete; - ~InnerUnion14() { + ~InnerUnion16() { switch (type_index_) { case 0: value0_.~TInner0(); @@ -372,14 +372,20 @@ class InnerUnion14 { case 13: value13_.~TInner13(); break; + case 14: + value14_.~TInner14(); + break; + case 15: + value15_.~TInner15(); + break; } } - void ToOuter(std::variant& o) const { + void ToOuter(std::variant& o) const { ToOuterImpl(o); } - void ToOuter(std::variant& o) const { + void ToOuter(std::variant& o) const { ToOuterImpl(o); } @@ -440,6 +446,14 @@ class InnerUnion14 { char empty13_[sizeof(TInner13)]{}; TInner13 value13_; }; + union { + char empty14_[sizeof(TInner14)]{}; + TInner14 value14_; + }; + union { + char empty15_[sizeof(TInner15)]{}; + TInner15 value15_; + }; private: template @@ -488,6 +502,12 @@ class InnerUnion14 { case 13: new (&value13_) TInner13(std::get<13 + offset>(v)); return; + case 14: + new (&value14_) TInner14(std::get<14 + offset>(v)); + return; + case 15: + new (&value15_) TInner15(std::get<15 + offset>(v)); + return; } } @@ -556,6 +576,14 @@ class InnerUnion14 { o.template emplace<13 + offset>(); yardl::hdf5::ToOuter(value13_, std::get<13 + offset>(o)); return; + case 14: + o.template emplace<14 + offset>(); + yardl::hdf5::ToOuter(value14_, std::get<14 + offset>(o)); + return; + case 15: + o.template emplace<15 + offset>(); + yardl::hdf5::ToOuter(value15_, std::get<15 + offset>(o)); + return; } throw std::runtime_error("unrecognized type variant type index " + std::to_string(type_index_)); } @@ -570,11 +598,11 @@ class InnerUnion14 { } }; -template -H5::CompType InnerUnion14Ddl(bool nullable, H5::DataType const& t0, std::string const& tag0, H5::DataType const& t1, std::string const& tag1, H5::DataType const& t2, std::string const& tag2, H5::DataType const& t3, std::string const& tag3, H5::DataType const& t4, std::string const& tag4, H5::DataType const& t5, std::string const& tag5, H5::DataType const& t6, std::string const& tag6, H5::DataType const& t7, std::string const& tag7, H5::DataType const& t8, std::string const& tag8, H5::DataType const& t9, std::string const& tag9, H5::DataType const& t10, std::string const& tag10, H5::DataType const& t11, std::string const& tag11, H5::DataType const& t12, std::string const& tag12, H5::DataType const& t13, std::string const& tag13) { - using UnionType = ::InnerUnion14; +template +H5::CompType InnerUnion16Ddl(bool nullable, H5::DataType const& t0, std::string const& tag0, H5::DataType const& t1, std::string const& tag1, H5::DataType const& t2, std::string const& tag2, H5::DataType const& t3, std::string const& tag3, H5::DataType const& t4, std::string const& tag4, H5::DataType const& t5, std::string const& tag5, H5::DataType const& t6, std::string const& tag6, H5::DataType const& t7, std::string const& tag7, H5::DataType const& t8, std::string const& tag8, H5::DataType const& t9, std::string const& tag9, H5::DataType const& t10, std::string const& tag10, H5::DataType const& t11, std::string const& tag11, H5::DataType const& t12, std::string const& tag12, H5::DataType const& t13, std::string const& tag13, H5::DataType const& t14, std::string const& tag14, H5::DataType const& t15, std::string const& tag15) { + using UnionType = ::InnerUnion16; H5::CompType rtn(sizeof(UnionType)); - rtn.insertMember("$type", HOFFSET(UnionType, type_index_), yardl::hdf5::UnionTypeEnumDdl(nullable, tag0, tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8, tag9, tag10, tag11, tag12, tag13)); + rtn.insertMember("$type", HOFFSET(UnionType, type_index_), yardl::hdf5::UnionTypeEnumDdl(nullable, tag0, tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8, tag9, tag10, tag11, tag12, tag13, tag14, tag15)); rtn.insertMember(tag0, HOFFSET(UnionType, value0_), t0); rtn.insertMember(tag1, HOFFSET(UnionType, value1_), t1); rtn.insertMember(tag2, HOFFSET(UnionType, value2_), t2); @@ -589,12 +617,25 @@ H5::CompType InnerUnion14Ddl(bool nullable, H5::DataType const& t0, std::string rtn.insertMember(tag11, HOFFSET(UnionType, value11_), t11); rtn.insertMember(tag12, HOFFSET(UnionType, value12_), t12); rtn.insertMember(tag13, HOFFSET(UnionType, value13_), t13); + rtn.insertMember(tag14, HOFFSET(UnionType, value14_), t14); + rtn.insertMember(tag15, HOFFSET(UnionType, value15_), t15); return rtn; } } namespace mrd::hdf5 { namespace { +[[maybe_unused]] H5::EnumType GetGradientDirectionHdf5Ddl() { + H5::EnumType t(H5::PredType::NATIVE_INT32); + int32_t i = 1; + t.insert("z", &i); + i = 2; + t.insert("y", &i); + i = 3; + t.insert("x", &i); + return t; +} + [[maybe_unused]] H5::EnumType GetPatientGenderHdf5Ddl() { H5::EnumType t(H5::PredType::NATIVE_INT32); int32_t i = 0; @@ -878,6 +919,44 @@ struct _Inner_Acquisition { yardl::hdf5::InnerNdArray trajectory; }; +struct _Inner_GradientHeader { + _Inner_GradientHeader() {} + _Inner_GradientHeader(mrd::GradientHeader const& o) + : gradient_time_stamp_ns(o.gradient_time_stamp_ns), + gradient_sample_time_ns(o.gradient_sample_time_ns), + pulse_calibration(o.pulse_calibration), + gradient_direction(o.gradient_direction) { + } + + void ToOuter (mrd::GradientHeader& o) const { + yardl::hdf5::ToOuter(gradient_time_stamp_ns, o.gradient_time_stamp_ns); + yardl::hdf5::ToOuter(gradient_sample_time_ns, o.gradient_sample_time_ns); + yardl::hdf5::ToOuter(pulse_calibration, o.pulse_calibration); + yardl::hdf5::ToOuter(gradient_direction, o.gradient_direction); + } + + uint64_t gradient_time_stamp_ns; + uint32_t gradient_sample_time_ns; + yardl::hdf5::InnerOptional, std::vector> pulse_calibration; + mrd::GradientDirection gradient_direction; +}; + +struct _Inner_Gradient { + _Inner_Gradient() {} + _Inner_Gradient(mrd::Gradient const& o) + : head(o.head), + data(o.data) { + } + + void ToOuter (mrd::Gradient& o) const { + yardl::hdf5::ToOuter(head, o.head); + yardl::hdf5::ToOuter(data, o.data); + } + + mrd::hdf5::_Inner_GradientHeader head; + yardl::hdf5::InnerVlen data; +}; + struct _Inner_SubjectInformationType { _Inner_SubjectInformationType() {} _Inner_SubjectInformationType(mrd::SubjectInformationType const& o) @@ -1687,6 +1766,50 @@ struct _Inner_ImageArray { yardl::hdf5::InnerVlen, mrd::WaveformUint32> waveforms; }; +struct _Inner_PulseHeader { + _Inner_PulseHeader() {} + _Inner_PulseHeader(mrd::PulseHeader const& o) + : pulse_time_stamp_ns(o.pulse_time_stamp_ns), + channel_order(o.channel_order), + sample_time_ns(o.sample_time_ns), + pulse_calibration(o.pulse_calibration) { + } + + void ToOuter (mrd::PulseHeader& o) const { + yardl::hdf5::ToOuter(pulse_time_stamp_ns, o.pulse_time_stamp_ns); + yardl::hdf5::ToOuter(channel_order, o.channel_order); + yardl::hdf5::ToOuter(sample_time_ns, o.sample_time_ns); + yardl::hdf5::ToOuter(pulse_calibration, o.pulse_calibration); + } + + uint64_t pulse_time_stamp_ns; + yardl::hdf5::InnerVlen channel_order; + uint32_t sample_time_ns; + yardl::hdf5::InnerOptional, std::vector> pulse_calibration; +}; + +struct _Inner_Pulse { + _Inner_Pulse() {} + _Inner_Pulse(mrd::Pulse const& o) + : head(o.head), + amplitude(o.amplitude), + phase(o.phase), + phase_offset(o.phase_offset) { + } + + void ToOuter (mrd::Pulse& o) const { + yardl::hdf5::ToOuter(head, o.head); + yardl::hdf5::ToOuter(amplitude, o.amplitude); + yardl::hdf5::ToOuter(phase, o.phase); + yardl::hdf5::ToOuter(phase_offset, o.phase_offset); + } + + mrd::hdf5::_Inner_PulseHeader head; + yardl::hdf5::InnerNdArray amplitude; + yardl::hdf5::InnerVlen phase; + yardl::hdf5::InnerVlen phase_offset; +}; + [[maybe_unused]] H5::CompType GetEncodingCountersHdf5Ddl() { using RecordType = mrd::hdf5::_Inner_EncodingCounters; H5::CompType t(sizeof(RecordType)); @@ -1737,6 +1860,24 @@ struct _Inner_ImageArray { return t; } +[[maybe_unused]] H5::CompType GetGradientHeaderHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_GradientHeader; + H5::CompType t(sizeof(RecordType)); + t.insertMember("gradientTimeStampNs", HOFFSET(RecordType, gradient_time_stamp_ns), H5::PredType::NATIVE_UINT64); + t.insertMember("gradientSampleTimeNs", HOFFSET(RecordType, gradient_sample_time_ns), H5::PredType::NATIVE_UINT32); + t.insertMember("pulseCalibration", HOFFSET(RecordType, pulse_calibration), yardl::hdf5::OptionalTypeDdl, std::vector>(yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_FLOAT))); + t.insertMember("gradientDirection", HOFFSET(RecordType, gradient_direction), mrd::hdf5::GetGradientDirectionHdf5Ddl()); + return t; +} + +[[maybe_unused]] H5::CompType GetGradientHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_Gradient; + H5::CompType t(sizeof(RecordType)); + t.insertMember("head", HOFFSET(RecordType, head), mrd::hdf5::GetGradientHeaderHdf5Ddl()); + t.insertMember("data", HOFFSET(RecordType, data), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_FLOAT)); + return t; +} + [[maybe_unused]] H5::CompType GetSubjectInformationTypeHdf5Ddl() { using RecordType = mrd::hdf5::_Inner_SubjectInformationType; H5::CompType t(sizeof(RecordType)); @@ -2184,6 +2325,26 @@ template return t; } +[[maybe_unused]] H5::CompType GetPulseHeaderHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_PulseHeader; + H5::CompType t(sizeof(RecordType)); + t.insertMember("pulseTimeStampNs", HOFFSET(RecordType, pulse_time_stamp_ns), H5::PredType::NATIVE_UINT64); + t.insertMember("channelOrder", HOFFSET(RecordType, channel_order), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_UINT32)); + t.insertMember("sampleTimeNs", HOFFSET(RecordType, sample_time_ns), H5::PredType::NATIVE_UINT32); + t.insertMember("pulseCalibration", HOFFSET(RecordType, pulse_calibration), yardl::hdf5::OptionalTypeDdl, std::vector>(yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_FLOAT))); + return t; +} + +[[maybe_unused]] H5::CompType GetPulseHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_Pulse; + H5::CompType t(sizeof(RecordType)); + t.insertMember("head", HOFFSET(RecordType, head), mrd::hdf5::GetPulseHeaderHdf5Ddl()); + t.insertMember("amplitude", HOFFSET(RecordType, amplitude), yardl::hdf5::NDArrayDdl(H5::PredType::NATIVE_FLOAT)); + t.insertMember("phase", HOFFSET(RecordType, phase), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_FLOAT)); + t.insertMember("phaseOffset", HOFFSET(RecordType, phase_offset), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_FLOAT)); + return t; +} + } // namespace MrdWriter::MrdWriter(std::string path) @@ -2196,7 +2357,7 @@ void MrdWriter::WriteHeaderImpl(std::optional const& value) { void MrdWriter::WriteDataImpl(mrd::StreamItem const& value) { if (!data_dataset_state_) { - data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); + data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetPulseHdf5Ddl(), "Pulse", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetGradientHdf5Ddl(), "Gradient", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); } std::visit( @@ -2204,6 +2365,10 @@ void MrdWriter::WriteDataImpl(mrd::StreamItem const& value) { using T = std::decay_t; if constexpr (std::is_same_v) { data_dataset_state_->Append(static_cast(value.index()), arg); + } else if constexpr (std::is_same_v) { + data_dataset_state_->Append(static_cast(value.index()), arg); + } else if constexpr (std::is_same_v) { + data_dataset_state_->Append(static_cast(value.index()), arg); } else if constexpr (std::is_same_v) { data_dataset_state_->Append, mrd::WaveformUint32>(static_cast(value.index()), arg); } else if constexpr (std::is_same_v) { @@ -2239,7 +2404,7 @@ void MrdWriter::WriteDataImpl(mrd::StreamItem const& value) { void MrdWriter::EndDataImpl() { if (!data_dataset_state_) { - data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); + data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetPulseHdf5Ddl(), "Pulse", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetGradientHdf5Ddl(), "Gradient", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); } data_dataset_state_.reset(); @@ -2261,7 +2426,7 @@ void MrdReader::ReadHeaderImpl(std::optional& value) { bool MrdReader::ReadDataImpl(mrd::StreamItem& value) { if (!data_dataset_state_) { - data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion14, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); + data_dataset_state_ = std::make_unique>(group_, "data", false, std::make_tuple(mrd::hdf5::GetAcquisitionHdf5Ddl(), "Acquisition", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetPulseHdf5Ddl(), "Pulse", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetGradientHdf5Ddl(), "Gradient", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "WaveformUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "ImageUint16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "ImageInt16", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "ImageUint32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "ImageInt32", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "ImageFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "ImageDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ImageComplexDouble", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "AcquisitionBucket", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "ReconData", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "ArrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "ImageArray", static_cast(std::max(sizeof(::InnerUnion16, mrd::WaveformUint32, mrd::hdf5::_Inner_Image, mrd::ImageUint16, mrd::hdf5::_Inner_Image, mrd::ImageInt16, mrd::hdf5::_Inner_Image, mrd::ImageUint32, mrd::hdf5::_Inner_Image, mrd::ImageInt32, mrd::hdf5::_Inner_Image, mrd::ImageFloat, mrd::hdf5::_Inner_Image, mrd::ImageDouble, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexFloat, mrd::hdf5::_Inner_Image, std::complex>, mrd::ImageComplexDouble, mrd::hdf5::_Inner_AcquisitionBucket, mrd::AcquisitionBucket, mrd::hdf5::_Inner_ReconData, mrd::ReconData, yardl::hdf5::InnerDynamicNdArray, std::complex>, mrd::ArrayComplexFloat, mrd::hdf5::_Inner_ImageArray, mrd::ImageArray>), sizeof(std::variant))))); } auto [has_result, type_index, reader] = data_dataset_state_->ReadIndex(); @@ -2277,67 +2442,77 @@ bool MrdReader::ReadDataImpl(mrd::StreamItem& value) { break; } case 1: { - mrd::WaveformUint32& ref = value.emplace<1>(); - reader->Read, mrd::WaveformUint32>(ref); + mrd::Pulse& ref = value.emplace<1>(); + reader->Read(ref); break; } case 2: { - mrd::ImageUint16& ref = value.emplace<2>(); - reader->Read, mrd::ImageUint16>(ref); + mrd::Gradient& ref = value.emplace<2>(); + reader->Read(ref); break; } case 3: { - mrd::ImageInt16& ref = value.emplace<3>(); - reader->Read, mrd::ImageInt16>(ref); + mrd::WaveformUint32& ref = value.emplace<3>(); + reader->Read, mrd::WaveformUint32>(ref); break; } case 4: { - mrd::ImageUint32& ref = value.emplace<4>(); - reader->Read, mrd::ImageUint32>(ref); + mrd::ImageUint16& ref = value.emplace<4>(); + reader->Read, mrd::ImageUint16>(ref); break; } case 5: { - mrd::ImageInt32& ref = value.emplace<5>(); - reader->Read, mrd::ImageInt32>(ref); + mrd::ImageInt16& ref = value.emplace<5>(); + reader->Read, mrd::ImageInt16>(ref); break; } case 6: { - mrd::ImageFloat& ref = value.emplace<6>(); - reader->Read, mrd::ImageFloat>(ref); + mrd::ImageUint32& ref = value.emplace<6>(); + reader->Read, mrd::ImageUint32>(ref); break; } case 7: { - mrd::ImageDouble& ref = value.emplace<7>(); - reader->Read, mrd::ImageDouble>(ref); + mrd::ImageInt32& ref = value.emplace<7>(); + reader->Read, mrd::ImageInt32>(ref); break; } case 8: { - mrd::ImageComplexFloat& ref = value.emplace<8>(); - reader->Read, std::complex>, mrd::ImageComplexFloat>(ref); + mrd::ImageFloat& ref = value.emplace<8>(); + reader->Read, mrd::ImageFloat>(ref); break; } case 9: { - mrd::ImageComplexDouble& ref = value.emplace<9>(); - reader->Read, std::complex>, mrd::ImageComplexDouble>(ref); + mrd::ImageDouble& ref = value.emplace<9>(); + reader->Read, mrd::ImageDouble>(ref); break; } case 10: { - mrd::AcquisitionBucket& ref = value.emplace<10>(); - reader->Read(ref); + mrd::ImageComplexFloat& ref = value.emplace<10>(); + reader->Read, std::complex>, mrd::ImageComplexFloat>(ref); break; } case 11: { - mrd::ReconData& ref = value.emplace<11>(); - reader->Read(ref); + mrd::ImageComplexDouble& ref = value.emplace<11>(); + reader->Read, std::complex>, mrd::ImageComplexDouble>(ref); break; } case 12: { - mrd::ArrayComplexFloat& ref = value.emplace<12>(); - reader->Read, std::complex>, mrd::ArrayComplexFloat>(ref); + mrd::AcquisitionBucket& ref = value.emplace<12>(); + reader->Read(ref); break; } case 13: { - mrd::ImageArray& ref = value.emplace<13>(); + mrd::ReconData& ref = value.emplace<13>(); + reader->Read(ref); + break; + } + case 14: { + mrd::ArrayComplexFloat& ref = value.emplace<14>(); + reader->Read, std::complex>, mrd::ArrayComplexFloat>(ref); + break; + } + case 15: { + mrd::ImageArray& ref = value.emplace<15>(); reader->Read(ref); break; } diff --git a/cpp/mrd/hdf5/protocols.h b/cpp/mrd/hdf5/protocols.h index 25aed732..ba124966 100644 --- a/cpp/mrd/hdf5/protocols.h +++ b/cpp/mrd/hdf5/protocols.h @@ -28,7 +28,7 @@ class MrdWriter : public mrd::MrdWriterBase, public yardl::hdf5::Hdf5Writer { void Flush() override; private: - std::unique_ptr> data_dataset_state_; + std::unique_ptr> data_dataset_state_; }; // HDF5 reader for the Mrd protocol. @@ -42,7 +42,7 @@ class MrdReader : public mrd::MrdReaderBase, public yardl::hdf5::Hdf5Reader { bool ReadDataImpl(mrd::StreamItem& value) override; private: - std::unique_ptr> data_dataset_state_; + std::unique_ptr> data_dataset_state_; }; // HDF5 writer for the MrdNoiseCovariance protocol. diff --git a/cpp/mrd/ndjson/protocols.cc b/cpp/mrd/ndjson/protocols.cc index 4fe15da8..24c55723 100644 --- a/cpp/mrd/ndjson/protocols.cc +++ b/cpp/mrd/ndjson/protocols.cc @@ -18,6 +18,15 @@ void from_json(ordered_json const& j, mrd::AcquisitionHeader& value); void to_json(ordered_json& j, mrd::Acquisition const& value); void from_json(ordered_json const& j, mrd::Acquisition& value); +void to_json(ordered_json& j, mrd::GradientDirection const& value); +void from_json(ordered_json const& j, mrd::GradientDirection& value); + +void to_json(ordered_json& j, mrd::GradientHeader const& value); +void from_json(ordered_json const& j, mrd::GradientHeader& value); + +void to_json(ordered_json& j, mrd::Gradient const& value); +void from_json(ordered_json const& j, mrd::Gradient& value); + void to_json(ordered_json& j, mrd::PatientGender const& value); void from_json(ordered_json const& j, mrd::PatientGender& value); @@ -175,6 +184,12 @@ void from_json(ordered_json const& j, mrd::ReconData& value); void to_json(ordered_json& j, mrd::ImageArray const& value); void from_json(ordered_json const& j, mrd::ImageArray& value); +void to_json(ordered_json& j, mrd::PulseHeader const& value); +void from_json(ordered_json const& j, mrd::PulseHeader& value); + +void to_json(ordered_json& j, mrd::Pulse const& value); +void from_json(ordered_json const& j, mrd::Pulse& value); + } // namespace mrd NLOHMANN_JSON_NAMESPACE_BEGIN @@ -287,49 +302,55 @@ struct adl_serializer, mrd::Image, mr }; template <> -struct adl_serializer, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray>> { - static void to_json(ordered_json& j, std::variant, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray> const& value) { +struct adl_serializer, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray>> { + static void to_json(ordered_json& j, std::variant, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray> const& value) { switch (value.index()) { case 0: j = ordered_json{ {"Acquisition", std::get(value)} }; break; case 1: - j = ordered_json{ {"WaveformUint32", std::get>(value)} }; + j = ordered_json{ {"Pulse", std::get(value)} }; break; case 2: - j = ordered_json{ {"ImageUint16", std::get>(value)} }; + j = ordered_json{ {"Gradient", std::get(value)} }; break; case 3: - j = ordered_json{ {"ImageInt16", std::get>(value)} }; + j = ordered_json{ {"WaveformUint32", std::get>(value)} }; break; case 4: - j = ordered_json{ {"ImageUint32", std::get>(value)} }; + j = ordered_json{ {"ImageUint16", std::get>(value)} }; break; case 5: - j = ordered_json{ {"ImageInt32", std::get>(value)} }; + j = ordered_json{ {"ImageInt16", std::get>(value)} }; break; case 6: - j = ordered_json{ {"ImageFloat", std::get>(value)} }; + j = ordered_json{ {"ImageUint32", std::get>(value)} }; break; case 7: - j = ordered_json{ {"ImageDouble", std::get>(value)} }; + j = ordered_json{ {"ImageInt32", std::get>(value)} }; break; case 8: - j = ordered_json{ {"ImageComplexFloat", std::get>>(value)} }; + j = ordered_json{ {"ImageFloat", std::get>(value)} }; break; case 9: - j = ordered_json{ {"ImageComplexDouble", std::get>>(value)} }; + j = ordered_json{ {"ImageDouble", std::get>(value)} }; break; case 10: - j = ordered_json{ {"AcquisitionBucket", std::get(value)} }; + j = ordered_json{ {"ImageComplexFloat", std::get>>(value)} }; break; case 11: - j = ordered_json{ {"ReconData", std::get(value)} }; + j = ordered_json{ {"ImageComplexDouble", std::get>>(value)} }; break; case 12: - j = ordered_json{ {"ArrayComplexFloat", std::get>>(value)} }; + j = ordered_json{ {"AcquisitionBucket", std::get(value)} }; break; case 13: + j = ordered_json{ {"ReconData", std::get(value)} }; + break; + case 14: + j = ordered_json{ {"ArrayComplexFloat", std::get>>(value)} }; + break; + case 15: j = ordered_json{ {"ImageArray", std::get(value)} }; break; default: @@ -337,13 +358,21 @@ struct adl_serializer, mr } } - static void from_json(ordered_json const& j, std::variant, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray>& value) { + static void from_json(ordered_json const& j, std::variant, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image, mrd::Image>, mrd::Image>, mrd::AcquisitionBucket, mrd::ReconData, yardl::DynamicNDArray>, mrd::ImageArray>& value) { auto it = j.begin(); std::string tag = it.key(); if (tag == "Acquisition") { value = it.value().get(); return; } + if (tag == "Pulse") { + value = it.value().get(); + return; + } + if (tag == "Gradient") { + value = it.value().get(); + return; + } if (tag == "WaveformUint32") { value = it.value().get>(); return; @@ -928,6 +957,95 @@ void from_json(ordered_json const& j, mrd::Acquisition& value) { } } +namespace { +std::unordered_map const __GradientDirection_values = { + {"z", mrd::GradientDirection::kZ}, + {"y", mrd::GradientDirection::kY}, + {"x", mrd::GradientDirection::kX}, +}; +} //namespace + +void to_json(ordered_json& j, mrd::GradientDirection const& value) { + switch (value) { + case mrd::GradientDirection::kZ: + j = "z"; + break; + case mrd::GradientDirection::kY: + j = "y"; + break; + case mrd::GradientDirection::kX: + j = "x"; + break; + default: + using underlying_type = typename std::underlying_type::type; + j = static_cast(value); + break; + } +} + +void from_json(ordered_json const& j, mrd::GradientDirection& value) { + if (j.is_string()) { + auto symbol = j.get(); + if (auto res = __GradientDirection_values.find(symbol); res != __GradientDirection_values.end()) { + value = res->second; + return; + } + throw std::runtime_error("Invalid enum value '" + symbol + "' for enum mrd::GradientDirection"); + } + using underlying_type = typename std::underlying_type::type; + value = static_cast(j.get()); +} + +void to_json(ordered_json& j, mrd::GradientHeader const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.gradient_time_stamp_ns)) { + j.push_back({"gradientTimeStampNs", value.gradient_time_stamp_ns}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.gradient_sample_time_ns)) { + j.push_back({"gradientSampleTimeNs", value.gradient_sample_time_ns}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.pulse_calibration)) { + j.push_back({"pulseCalibration", value.pulse_calibration}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.gradient_direction)) { + j.push_back({"gradientDirection", value.gradient_direction}); + } +} + +void from_json(ordered_json const& j, mrd::GradientHeader& value) { + if (auto it = j.find("gradientTimeStampNs"); it != j.end()) { + it->get_to(value.gradient_time_stamp_ns); + } + if (auto it = j.find("gradientSampleTimeNs"); it != j.end()) { + it->get_to(value.gradient_sample_time_ns); + } + if (auto it = j.find("pulseCalibration"); it != j.end()) { + it->get_to(value.pulse_calibration); + } + if (auto it = j.find("gradientDirection"); it != j.end()) { + it->get_to(value.gradient_direction); + } +} + +void to_json(ordered_json& j, mrd::Gradient const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.head)) { + j.push_back({"head", value.head}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.data)) { + j.push_back({"data", value.data}); + } +} + +void from_json(ordered_json const& j, mrd::Gradient& value) { + if (auto it = j.find("head"); it != j.end()) { + it->get_to(value.head); + } + if (auto it = j.find("data"); it != j.end()) { + it->get_to(value.data); + } +} + namespace { std::unordered_map const __PatientGender_values = { {"m", mrd::PatientGender::kM}, @@ -3029,6 +3147,68 @@ void from_json(ordered_json const& j, mrd::ImageArray& value) { } } +void to_json(ordered_json& j, mrd::PulseHeader const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.pulse_time_stamp_ns)) { + j.push_back({"pulseTimeStampNs", value.pulse_time_stamp_ns}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.channel_order)) { + j.push_back({"channelOrder", value.channel_order}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.sample_time_ns)) { + j.push_back({"sampleTimeNs", value.sample_time_ns}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.pulse_calibration)) { + j.push_back({"pulseCalibration", value.pulse_calibration}); + } +} + +void from_json(ordered_json const& j, mrd::PulseHeader& value) { + if (auto it = j.find("pulseTimeStampNs"); it != j.end()) { + it->get_to(value.pulse_time_stamp_ns); + } + if (auto it = j.find("channelOrder"); it != j.end()) { + it->get_to(value.channel_order); + } + if (auto it = j.find("sampleTimeNs"); it != j.end()) { + it->get_to(value.sample_time_ns); + } + if (auto it = j.find("pulseCalibration"); it != j.end()) { + it->get_to(value.pulse_calibration); + } +} + +void to_json(ordered_json& j, mrd::Pulse const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.head)) { + j.push_back({"head", value.head}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.amplitude)) { + j.push_back({"amplitude", value.amplitude}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase)) { + j.push_back({"phase", value.phase}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_offset)) { + j.push_back({"phaseOffset", value.phase_offset}); + } +} + +void from_json(ordered_json const& j, mrd::Pulse& value) { + if (auto it = j.find("head"); it != j.end()) { + it->get_to(value.head); + } + if (auto it = j.find("amplitude"); it != j.end()) { + it->get_to(value.amplitude); + } + if (auto it = j.find("phase"); it != j.end()) { + it->get_to(value.phase); + } + if (auto it = j.find("phaseOffset"); it != j.end()) { + it->get_to(value.phase_offset); + } +} + } // namespace mrd namespace mrd::ndjson { diff --git a/cpp/mrd/protocols.cc b/cpp/mrd/protocols.cc index 455798ec..7870228e 100644 --- a/cpp/mrd/protocols.cc +++ b/cpp/mrd/protocols.cc @@ -39,7 +39,7 @@ void MrdReaderBaseInvalidState(uint8_t attempted, uint8_t current) { } // namespace -std::string MrdWriterBase::schema_ = R"({"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]})"; +std::string MrdWriterBase::schema_ = R"({"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Gradient","fields":[{"name":"head","type":"Mrd.GradientHeader"},{"name":"data","type":"Mrd.GradientData"}]},{"name":"GradientData","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"GradientDirection","values":[{"symbol":"z","value":1},{"symbol":"y","value":2},{"symbol":"x","value":3}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"GradientHeader","fields":[{"name":"gradientTimeStampNs","type":"uint64"},{"name":"gradientSampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]},{"name":"gradientDirection","type":"Mrd.GradientDirection"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"Pulse","fields":[{"name":"head","type":"Mrd.PulseHeader"},{"name":"amplitude","type":"Mrd.PulseData"},{"name":"phase","type":"Mrd.PulsePhase"},{"name":"phaseOffset","type":"Mrd.PulsePhaseOffset"}]},{"name":"PulseData","type":{"array":{"items":"float32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"PulseHeader","fields":[{"name":"pulseTimeStampNs","type":"uint64"},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"sampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]}]},{"name":"PulsePhase","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"PulsePhaseOffset","type":{"array":{"items":"float32","dimensions":[{"name":"coils"}]}}},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"Pulse","type":"Mrd.Pulse"},{"tag":"Gradient","type":"Mrd.Gradient"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]})"; std::vector MrdWriterBase::previous_schemas_ = { }; diff --git a/cpp/mrd/types.h b/cpp/mrd/types.h index 6153d206..8dd80953 100644 --- a/cpp/mrd/types.h +++ b/cpp/mrd/types.h @@ -198,6 +198,71 @@ struct Acquisition { } }; +// gradient of defined direction stored as 1D array samples +using GradientData = yardl::NDArray; + +enum class GradientDirection { + kZ = 1, + kY = 2, + kX = 3, +}; + +struct GradientHeader { + // Clock time stamp (e.g. nanoseconds since midnight) + uint64_t gradient_time_stamp_ns{}; + // Gradient sample duration in nanoseconds + uint32_t gradient_sample_time_ns{}; + // Grad calibration (T/m/A). Can be here or as a calGradMap calibration image or neither + std::optional> pulse_calibration{}; + // Gradient direction as enum + mrd::GradientDirection gradient_direction{}; + + bool operator==(const GradientHeader& other) const { + return gradient_time_stamp_ns == other.gradient_time_stamp_ns && + gradient_sample_time_ns == other.gradient_sample_time_ns && + pulse_calibration == other.pulse_calibration && + gradient_direction == other.gradient_direction; + } + + bool operator!=(const GradientHeader& other) const { + return !(*this == other); + } +}; + +struct Gradient { + // Grad header + mrd::GradientHeader head{}; + // gradient data + mrd::GradientData data{}; + + yardl::Size Samples() const { + return yardl::shape(data, 0); + } + + // timestamps in ns + uint64_t const& Starttime() const { + return head.gradient_time_stamp_ns; + } + + // timestamps in ns + uint64_t& Starttime() { + return const_cast(std::as_const(*this).Starttime()); + } + + yardl::Size Endtime() const { + return head.gradient_time_stamp_ns + Samples() * static_cast(head.gradient_sample_time_ns); + } + + bool operator==(const Gradient& other) const { + return head == other.head && + data == other.data; + } + + bool operator!=(const Gradient& other) const { + return !(*this == other); + } +}; + enum class PatientGender { kM = 0, kF = 1, @@ -1210,8 +1275,71 @@ using Array = yardl::DynamicNDArray; using ArrayComplexFloat = mrd::Array>; +struct PulseHeader { + // Clock time stamp (e.g. nanoseconds since midnight) + uint64_t pulse_time_stamp_ns{}; + // Channel numbers + std::vector channel_order{}; + // Sample time in ns + uint32_t sample_time_ns{}; + // Pulse calibration (rad/s/V). Can be here or as a calB1Map calibration image or neither + std::optional> pulse_calibration{}; + + bool operator==(const PulseHeader& other) const { + return pulse_time_stamp_ns == other.pulse_time_stamp_ns && + channel_order == other.channel_order && + sample_time_ns == other.sample_time_ns && + pulse_calibration == other.pulse_calibration; + } + + bool operator!=(const PulseHeader& other) const { + return !(*this == other); + } +}; + +using PulseData = yardl::NDArray; + +using PulsePhase = yardl::NDArray; + +using PulsePhaseOffset = yardl::NDArray; + +struct Pulse { + // Pulse header + mrd::PulseHeader head{}; + // Raw pulse amplitude array + mrd::PulseData amplitude{}; + // Full profile of pulse phase array + mrd::PulsePhase phase{}; + // Pulse phase offset + mrd::PulsePhaseOffset phase_offset{}; + + // Assuming writer sets amp and phase array the same size + yardl::Size Coils() const { + return yardl::shape(amplitude, 0); + } + + yardl::Size Samples() const { + return yardl::shape(amplitude, 1); + } + + yardl::Size ActiveChannels() const { + return head.channel_order.size(); + } + + bool operator==(const Pulse& other) const { + return head == other.head && + amplitude == other.amplitude && + phase == other.phase && + phase_offset == other.phase_offset; + } + + bool operator!=(const Pulse& other) const { + return !(*this == other); + } +}; + // Union of all primary types that can be streamed in the MRD Protocol -using StreamItem = std::variant; +using StreamItem = std::variant; } // namespace mrd diff --git a/matlab/toolbox/+mrd/+binary/GradientHeaderSerializer.m b/matlab/toolbox/+mrd/+binary/GradientHeaderSerializer.m new file mode 100644 index 00000000..988f3461 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/GradientHeaderSerializer.m @@ -0,0 +1,27 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef GradientHeaderSerializer < yardl.binary.RecordSerializer + methods + function self = GradientHeaderSerializer() + field_serializers{1} = yardl.binary.Uint64Serializer; + field_serializers{2} = yardl.binary.Uint32Serializer; + field_serializers{3} = yardl.binary.OptionalSerializer(yardl.binary.VectorSerializer(yardl.binary.Float32Serializer)); + field_serializers{4} = yardl.binary.EnumSerializer('mrd.GradientDirection', @mrd.GradientDirection, yardl.binary.Int32Serializer); + self@yardl.binary.RecordSerializer('mrd.GradientHeader', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.GradientHeader + end + self.write_(outstream, value.gradient_time_stamp_ns, value.gradient_sample_time_ns, value.pulse_calibration, value.gradient_direction); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.GradientHeader(gradient_time_stamp_ns=fields{1}, gradient_sample_time_ns=fields{2}, pulse_calibration=fields{3}, gradient_direction=fields{4}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/GradientSerializer.m b/matlab/toolbox/+mrd/+binary/GradientSerializer.m new file mode 100644 index 00000000..615eef8d --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/GradientSerializer.m @@ -0,0 +1,25 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef GradientSerializer < yardl.binary.RecordSerializer + methods + function self = GradientSerializer() + field_serializers{1} = mrd.binary.GradientHeaderSerializer(); + field_serializers{2} = yardl.binary.NDArraySerializer(yardl.binary.Float32Serializer, 1); + self@yardl.binary.RecordSerializer('mrd.Gradient', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.Gradient + end + self.write_(outstream, value.head, value.data); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.Gradient(head=fields{1}, data=fields{2}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/MrdReader.m b/matlab/toolbox/+mrd/+binary/MrdReader.m index c43433bc..79284209 100644 --- a/matlab/toolbox/+mrd/+binary/MrdReader.m +++ b/matlab/toolbox/+mrd/+binary/MrdReader.m @@ -13,7 +13,7 @@ self@mrd.MrdReaderBase(); self@yardl.binary.BinaryProtocolReader(filename, mrd.MrdReaderBase.schema); self.header_serializer = yardl.binary.OptionalSerializer(mrd.binary.HeaderSerializer()); - self.data_serializer = yardl.binary.StreamSerializer(yardl.binary.UnionSerializer('mrd.StreamItem', {mrd.binary.AcquisitionSerializer(), mrd.binary.WaveformSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint16Serializer), mrd.binary.ImageSerializer(yardl.binary.Int16Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Int32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float64Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat64Serializer), mrd.binary.AcquisitionBucketSerializer(), mrd.binary.ReconDataSerializer(), yardl.binary.DynamicNDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageArraySerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.WaveformUint32, @mrd.StreamItem.ImageUint16, @mrd.StreamItem.ImageInt16, @mrd.StreamItem.ImageUint32, @mrd.StreamItem.ImageInt32, @mrd.StreamItem.ImageFloat, @mrd.StreamItem.ImageDouble, @mrd.StreamItem.ImageComplexFloat, @mrd.StreamItem.ImageComplexDouble, @mrd.StreamItem.AcquisitionBucket, @mrd.StreamItem.ReconData, @mrd.StreamItem.ArrayComplexFloat, @mrd.StreamItem.ImageArray})); + self.data_serializer = yardl.binary.StreamSerializer(yardl.binary.UnionSerializer('mrd.StreamItem', {mrd.binary.AcquisitionSerializer(), mrd.binary.PulseSerializer(), mrd.binary.GradientSerializer(), mrd.binary.WaveformSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint16Serializer), mrd.binary.ImageSerializer(yardl.binary.Int16Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Int32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float64Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat64Serializer), mrd.binary.AcquisitionBucketSerializer(), mrd.binary.ReconDataSerializer(), yardl.binary.DynamicNDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageArraySerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.Pulse, @mrd.StreamItem.Gradient, @mrd.StreamItem.WaveformUint32, @mrd.StreamItem.ImageUint16, @mrd.StreamItem.ImageInt16, @mrd.StreamItem.ImageUint32, @mrd.StreamItem.ImageInt32, @mrd.StreamItem.ImageFloat, @mrd.StreamItem.ImageDouble, @mrd.StreamItem.ImageComplexFloat, @mrd.StreamItem.ImageComplexDouble, @mrd.StreamItem.AcquisitionBucket, @mrd.StreamItem.ReconData, @mrd.StreamItem.ArrayComplexFloat, @mrd.StreamItem.ImageArray})); end end diff --git a/matlab/toolbox/+mrd/+binary/MrdWriter.m b/matlab/toolbox/+mrd/+binary/MrdWriter.m index 311e22a7..29f704c2 100644 --- a/matlab/toolbox/+mrd/+binary/MrdWriter.m +++ b/matlab/toolbox/+mrd/+binary/MrdWriter.m @@ -13,7 +13,7 @@ self@mrd.MrdWriterBase(); self@yardl.binary.BinaryProtocolWriter(filename, mrd.MrdWriterBase.schema); self.header_serializer = yardl.binary.OptionalSerializer(mrd.binary.HeaderSerializer()); - self.data_serializer = yardl.binary.StreamSerializer(yardl.binary.UnionSerializer('mrd.StreamItem', {mrd.binary.AcquisitionSerializer(), mrd.binary.WaveformSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint16Serializer), mrd.binary.ImageSerializer(yardl.binary.Int16Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Int32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float64Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat64Serializer), mrd.binary.AcquisitionBucketSerializer(), mrd.binary.ReconDataSerializer(), yardl.binary.DynamicNDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageArraySerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.WaveformUint32, @mrd.StreamItem.ImageUint16, @mrd.StreamItem.ImageInt16, @mrd.StreamItem.ImageUint32, @mrd.StreamItem.ImageInt32, @mrd.StreamItem.ImageFloat, @mrd.StreamItem.ImageDouble, @mrd.StreamItem.ImageComplexFloat, @mrd.StreamItem.ImageComplexDouble, @mrd.StreamItem.AcquisitionBucket, @mrd.StreamItem.ReconData, @mrd.StreamItem.ArrayComplexFloat, @mrd.StreamItem.ImageArray})); + self.data_serializer = yardl.binary.StreamSerializer(yardl.binary.UnionSerializer('mrd.StreamItem', {mrd.binary.AcquisitionSerializer(), mrd.binary.PulseSerializer(), mrd.binary.GradientSerializer(), mrd.binary.WaveformSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint16Serializer), mrd.binary.ImageSerializer(yardl.binary.Int16Serializer), mrd.binary.ImageSerializer(yardl.binary.Uint32Serializer), mrd.binary.ImageSerializer(yardl.binary.Int32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float32Serializer), mrd.binary.ImageSerializer(yardl.binary.Float64Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageSerializer(yardl.binary.Complexfloat64Serializer), mrd.binary.AcquisitionBucketSerializer(), mrd.binary.ReconDataSerializer(), yardl.binary.DynamicNDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.ImageArraySerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.Pulse, @mrd.StreamItem.Gradient, @mrd.StreamItem.WaveformUint32, @mrd.StreamItem.ImageUint16, @mrd.StreamItem.ImageInt16, @mrd.StreamItem.ImageUint32, @mrd.StreamItem.ImageInt32, @mrd.StreamItem.ImageFloat, @mrd.StreamItem.ImageDouble, @mrd.StreamItem.ImageComplexFloat, @mrd.StreamItem.ImageComplexDouble, @mrd.StreamItem.AcquisitionBucket, @mrd.StreamItem.ReconData, @mrd.StreamItem.ArrayComplexFloat, @mrd.StreamItem.ImageArray})); end end diff --git a/matlab/toolbox/+mrd/+binary/PulseHeaderSerializer.m b/matlab/toolbox/+mrd/+binary/PulseHeaderSerializer.m new file mode 100644 index 00000000..72aa2bf9 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/PulseHeaderSerializer.m @@ -0,0 +1,27 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef PulseHeaderSerializer < yardl.binary.RecordSerializer + methods + function self = PulseHeaderSerializer() + field_serializers{1} = yardl.binary.Uint64Serializer; + field_serializers{2} = yardl.binary.VectorSerializer(yardl.binary.Uint32Serializer); + field_serializers{3} = yardl.binary.Uint32Serializer; + field_serializers{4} = yardl.binary.OptionalSerializer(yardl.binary.VectorSerializer(yardl.binary.Float32Serializer)); + self@yardl.binary.RecordSerializer('mrd.PulseHeader', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.PulseHeader + end + self.write_(outstream, value.pulse_time_stamp_ns, value.channel_order, value.sample_time_ns, value.pulse_calibration); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.PulseHeader(pulse_time_stamp_ns=fields{1}, channel_order=fields{2}, sample_time_ns=fields{3}, pulse_calibration=fields{4}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/PulseSerializer.m b/matlab/toolbox/+mrd/+binary/PulseSerializer.m new file mode 100644 index 00000000..6314593c --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/PulseSerializer.m @@ -0,0 +1,27 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef PulseSerializer < yardl.binary.RecordSerializer + methods + function self = PulseSerializer() + field_serializers{1} = mrd.binary.PulseHeaderSerializer(); + field_serializers{2} = yardl.binary.NDArraySerializer(yardl.binary.Float32Serializer, 2); + field_serializers{3} = yardl.binary.NDArraySerializer(yardl.binary.Float32Serializer, 1); + field_serializers{4} = yardl.binary.NDArraySerializer(yardl.binary.Float32Serializer, 1); + self@yardl.binary.RecordSerializer('mrd.Pulse', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.Pulse + end + self.write_(outstream, value.head, value.amplitude, value.phase, value.phase_offset); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.Pulse(head=fields{1}, amplitude=fields{2}, phase=fields{3}, phase_offset=fields{4}); + end + end +end diff --git a/matlab/toolbox/+mrd/Gradient.m b/matlab/toolbox/+mrd/Gradient.m new file mode 100644 index 00000000..b6d457b4 --- /dev/null +++ b/matlab/toolbox/+mrd/Gradient.m @@ -0,0 +1,53 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef Gradient < handle + properties + % Grad header + head + % gradient data + data + end + + methods + function self = Gradient(kwargs) + arguments + kwargs.head; + kwargs.data = single.empty(0); + end + if ~isfield(kwargs, "head") + throw(yardl.TypeError("Missing required keyword argument 'head'")) + end + self.head = kwargs.head; + self.data = kwargs.data; + end + + function res = samples(self) + res = size(self.data, ndims(self.data)-(0)); + return + end + + function res = starttime(self) + % timestamps in ns + res = self.head.gradient_time_stamp_ns; + return + end + + function res = endtime(self) + res = self.head.gradient_time_stamp_ns + self.samples() .* uint64(self.head.gradient_sample_time_ns); + return + end + + + function res = eq(self, other) + res = ... + isa(other, "mrd.Gradient") && ... + isequal(self.head, other.head) && ... + isequal(self.data, other.data); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + end + +end diff --git a/matlab/toolbox/+mrd/GradientData.m b/matlab/toolbox/+mrd/GradientData.m new file mode 100644 index 00000000..1ed5be6d --- /dev/null +++ b/matlab/toolbox/+mrd/GradientData.m @@ -0,0 +1,9 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +function a = GradientData(array) + % gradient of defined direction stored as 1D array samples + arguments + array single + end + a = array; +end diff --git a/matlab/toolbox/+mrd/GradientDirection.m b/matlab/toolbox/+mrd/GradientDirection.m new file mode 100644 index 00000000..b8d17776 --- /dev/null +++ b/matlab/toolbox/+mrd/GradientDirection.m @@ -0,0 +1,28 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef GradientDirection < uint64 + methods (Static) + function v = Z + v = mrd.GradientDirection(1); + end + function v = Y + v = mrd.GradientDirection(2); + end + function v = X + v = mrd.GradientDirection(3); + end + + function z = zeros(varargin) + elem = mrd.GradientDirection(0); + if nargin == 0 + z = elem; + return; + end + sz = [varargin{:}]; + if isscalar(sz) + sz = [sz, sz]; + end + z = reshape(repelem(elem, prod(sz)), sz); + end + end +end diff --git a/matlab/toolbox/+mrd/GradientHeader.m b/matlab/toolbox/+mrd/GradientHeader.m new file mode 100644 index 00000000..5d1014ea --- /dev/null +++ b/matlab/toolbox/+mrd/GradientHeader.m @@ -0,0 +1,46 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef GradientHeader < handle + properties + % Clock time stamp (e.g. nanoseconds since midnight) + gradient_time_stamp_ns + % Gradient sample duration in nanoseconds + gradient_sample_time_ns + % Grad calibration (T/m/A). Can be here or as a calGradMap calibration image or neither + pulse_calibration + % Gradient direction as enum + gradient_direction + end + + methods + function self = GradientHeader(kwargs) + arguments + kwargs.gradient_time_stamp_ns = uint64(0); + kwargs.gradient_sample_time_ns = uint32(0); + kwargs.pulse_calibration = yardl.None; + kwargs.gradient_direction; + end + self.gradient_time_stamp_ns = kwargs.gradient_time_stamp_ns; + self.gradient_sample_time_ns = kwargs.gradient_sample_time_ns; + self.pulse_calibration = kwargs.pulse_calibration; + if ~isfield(kwargs, "gradient_direction") + throw(yardl.TypeError("Missing required keyword argument 'gradient_direction'")) + end + self.gradient_direction = kwargs.gradient_direction; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.GradientHeader") && ... + isequal(self.gradient_time_stamp_ns, other.gradient_time_stamp_ns) && ... + isequal(self.gradient_sample_time_ns, other.gradient_sample_time_ns) && ... + isequal(self.pulse_calibration, other.pulse_calibration) && ... + isequal(self.gradient_direction, other.gradient_direction); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + end + +end diff --git a/matlab/toolbox/+mrd/MrdWriterBase.m b/matlab/toolbox/+mrd/MrdWriterBase.m index 4057451e..4704758c 100644 --- a/matlab/toolbox/+mrd/MrdWriterBase.m +++ b/matlab/toolbox/+mrd/MrdWriterBase.m @@ -51,7 +51,7 @@ function end_data(self) methods (Static) function res = schema() - res = string('{"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]}'); + res = string('{"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Gradient","fields":[{"name":"head","type":"Mrd.GradientHeader"},{"name":"data","type":"Mrd.GradientData"}]},{"name":"GradientData","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"GradientDirection","values":[{"symbol":"z","value":1},{"symbol":"y","value":2},{"symbol":"x","value":3}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"GradientHeader","fields":[{"name":"gradientTimeStampNs","type":"uint64"},{"name":"gradientSampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]},{"name":"gradientDirection","type":"Mrd.GradientDirection"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"Pulse","fields":[{"name":"head","type":"Mrd.PulseHeader"},{"name":"amplitude","type":"Mrd.PulseData"},{"name":"phase","type":"Mrd.PulsePhase"},{"name":"phaseOffset","type":"Mrd.PulsePhaseOffset"}]},{"name":"PulseData","type":{"array":{"items":"float32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"PulseHeader","fields":[{"name":"pulseTimeStampNs","type":"uint64"},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"sampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]}]},{"name":"PulsePhase","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"PulsePhaseOffset","type":{"array":{"items":"float32","dimensions":[{"name":"coils"}]}}},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"Pulse","type":"Mrd.Pulse"},{"tag":"Gradient","type":"Mrd.Gradient"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]}'); end end diff --git a/matlab/toolbox/+mrd/Pulse.m b/matlab/toolbox/+mrd/Pulse.m new file mode 100644 index 00000000..ba19b986 --- /dev/null +++ b/matlab/toolbox/+mrd/Pulse.m @@ -0,0 +1,74 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef Pulse < handle + properties + % Pulse header + head + % Raw pulse amplitude array + amplitude + % Full profile of pulse phase array + phase + % Pulse phase offset + phase_offset + end + + methods + function self = Pulse(kwargs) + arguments + kwargs.head = mrd.PulseHeader(); + kwargs.amplitude = single.empty(0, 0); + kwargs.phase = single.empty(0); + kwargs.phase_offset = single.empty(0); + end + self.head = kwargs.head; + self.amplitude = kwargs.amplitude; + self.phase = kwargs.phase; + self.phase_offset = kwargs.phase_offset; + end + + function res = coils(self) + % Assuming writer sets amp and phase array the same size + res = size(self.amplitude, ndims(self.amplitude)-(0)); + return + end + + function res = samples(self) + res = size(self.amplitude, ndims(self.amplitude)-(1)); + return + end + + function res = active_channels(self) + res = length(self.head.channel_order); + return + end + + + function res = eq(self, other) + res = ... + isa(other, "mrd.Pulse") && ... + isequal(self.head, other.head) && ... + isequal(self.amplitude, other.amplitude) && ... + isequal(self.phase, other.phase) && ... + isequal(self.phase_offset, other.phase_offset); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.Pulse(); + if nargin == 0 + z = elem; + return; + end + sz = [varargin{:}]; + if isscalar(sz) + sz = [sz, sz]; + end + z = reshape(repelem(elem, prod(sz)), sz); + end + end +end diff --git a/matlab/toolbox/+mrd/PulseData.m b/matlab/toolbox/+mrd/PulseData.m new file mode 100644 index 00000000..277d148c --- /dev/null +++ b/matlab/toolbox/+mrd/PulseData.m @@ -0,0 +1,8 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +function a = PulseData(array) + arguments + array single + end + a = array; +end diff --git a/matlab/toolbox/+mrd/PulseHeader.m b/matlab/toolbox/+mrd/PulseHeader.m new file mode 100644 index 00000000..52e76b1e --- /dev/null +++ b/matlab/toolbox/+mrd/PulseHeader.m @@ -0,0 +1,57 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef PulseHeader < handle + properties + % Clock time stamp (e.g. nanoseconds since midnight) + pulse_time_stamp_ns + % Channel numbers + channel_order + % Sample time in ns + sample_time_ns + % Pulse calibration (rad/s/V). Can be here or as a calB1Map calibration image or neither + pulse_calibration + end + + methods + function self = PulseHeader(kwargs) + arguments + kwargs.pulse_time_stamp_ns = uint64(0); + kwargs.channel_order = uint32.empty(); + kwargs.sample_time_ns = uint32(0); + kwargs.pulse_calibration = yardl.None; + end + self.pulse_time_stamp_ns = kwargs.pulse_time_stamp_ns; + self.channel_order = kwargs.channel_order; + self.sample_time_ns = kwargs.sample_time_ns; + self.pulse_calibration = kwargs.pulse_calibration; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.PulseHeader") && ... + isequal(self.pulse_time_stamp_ns, other.pulse_time_stamp_ns) && ... + isequal(self.channel_order, other.channel_order) && ... + isequal(self.sample_time_ns, other.sample_time_ns) && ... + isequal(self.pulse_calibration, other.pulse_calibration); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.PulseHeader(); + if nargin == 0 + z = elem; + return; + end + sz = [varargin{:}]; + if isscalar(sz) + sz = [sz, sz]; + end + z = reshape(repelem(elem, prod(sz)), sz); + end + end +end diff --git a/matlab/toolbox/+mrd/PulsePhase.m b/matlab/toolbox/+mrd/PulsePhase.m new file mode 100644 index 00000000..d3bdb4a7 --- /dev/null +++ b/matlab/toolbox/+mrd/PulsePhase.m @@ -0,0 +1,8 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +function a = PulsePhase(array) + arguments + array single + end + a = array; +end diff --git a/matlab/toolbox/+mrd/PulsePhaseOffset.m b/matlab/toolbox/+mrd/PulsePhaseOffset.m new file mode 100644 index 00000000..1b0ec08b --- /dev/null +++ b/matlab/toolbox/+mrd/PulsePhaseOffset.m @@ -0,0 +1,8 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +function a = PulsePhaseOffset(array) + arguments + array single + end + a = array; +end diff --git a/matlab/toolbox/+mrd/StreamItem.m b/matlab/toolbox/+mrd/StreamItem.m index ac4da357..1b09fe37 100644 --- a/matlab/toolbox/+mrd/StreamItem.m +++ b/matlab/toolbox/+mrd/StreamItem.m @@ -6,58 +6,66 @@ res = mrd.StreamItem(1, value); end - function res = WaveformUint32(value) + function res = Pulse(value) res = mrd.StreamItem(2, value); end - function res = ImageUint16(value) + function res = Gradient(value) res = mrd.StreamItem(3, value); end - function res = ImageInt16(value) + function res = WaveformUint32(value) res = mrd.StreamItem(4, value); end - function res = ImageUint32(value) + function res = ImageUint16(value) res = mrd.StreamItem(5, value); end - function res = ImageInt32(value) + function res = ImageInt16(value) res = mrd.StreamItem(6, value); end - function res = ImageFloat(value) + function res = ImageUint32(value) res = mrd.StreamItem(7, value); end - function res = ImageDouble(value) + function res = ImageInt32(value) res = mrd.StreamItem(8, value); end - function res = ImageComplexFloat(value) + function res = ImageFloat(value) res = mrd.StreamItem(9, value); end - function res = ImageComplexDouble(value) + function res = ImageDouble(value) res = mrd.StreamItem(10, value); end - function res = AcquisitionBucket(value) + function res = ImageComplexFloat(value) res = mrd.StreamItem(11, value); end - function res = ReconData(value) + function res = ImageComplexDouble(value) res = mrd.StreamItem(12, value); end - function res = ArrayComplexFloat(value) + function res = AcquisitionBucket(value) res = mrd.StreamItem(13, value); end - function res = ImageArray(value) + function res = ReconData(value) res = mrd.StreamItem(14, value); end + function res = ArrayComplexFloat(value) + res = mrd.StreamItem(15, value); + end + + function res = ImageArray(value) + res = mrd.StreamItem(16, value); + end + function z = zeros(varargin) elem = mrd.StreamItem(0, yardl.None); if nargin == 0 @@ -77,58 +85,66 @@ res = self.index == 1; end - function res = isWaveformUint32(self) + function res = isPulse(self) res = self.index == 2; end - function res = isImageUint16(self) + function res = isGradient(self) res = self.index == 3; end - function res = isImageInt16(self) + function res = isWaveformUint32(self) res = self.index == 4; end - function res = isImageUint32(self) + function res = isImageUint16(self) res = self.index == 5; end - function res = isImageInt32(self) + function res = isImageInt16(self) res = self.index == 6; end - function res = isImageFloat(self) + function res = isImageUint32(self) res = self.index == 7; end - function res = isImageDouble(self) + function res = isImageInt32(self) res = self.index == 8; end - function res = isImageComplexFloat(self) + function res = isImageFloat(self) res = self.index == 9; end - function res = isImageComplexDouble(self) + function res = isImageDouble(self) res = self.index == 10; end - function res = isAcquisitionBucket(self) + function res = isImageComplexFloat(self) res = self.index == 11; end - function res = isReconData(self) + function res = isImageComplexDouble(self) res = self.index == 12; end - function res = isArrayComplexFloat(self) + function res = isAcquisitionBucket(self) res = self.index == 13; end - function res = isImageArray(self) + function res = isReconData(self) res = self.index == 14; end + function res = isArrayComplexFloat(self) + res = self.index == 15; + end + + function res = isImageArray(self) + res = self.index == 16; + end + function eq = eq(self, other) eq = isa(other, "mrd.StreamItem") && isequal(self.index, other.index) && isequal(self.value, other.value); end @@ -138,7 +154,7 @@ end function t = tag(self) - tags_ = ["Acquisition", "WaveformUint32", "ImageUint16", "ImageInt16", "ImageUint32", "ImageInt32", "ImageFloat", "ImageDouble", "ImageComplexFloat", "ImageComplexDouble", "AcquisitionBucket", "ReconData", "ArrayComplexFloat", "ImageArray"]; + tags_ = ["Acquisition", "Pulse", "Gradient", "WaveformUint32", "ImageUint16", "ImageInt16", "ImageUint32", "ImageInt32", "ImageFloat", "ImageDouble", "ImageComplexFloat", "ImageComplexDouble", "AcquisitionBucket", "ReconData", "ArrayComplexFloat", "ImageArray"]; t = tags_(self.index_); end end diff --git a/python/mrd/__init__.py b/python/mrd/__init__.py index 52e0c64d..480c94c9 100644 --- a/python/mrd/__init__.py +++ b/python/mrd/__init__.py @@ -41,7 +41,11 @@ def _parse_version(version: str) -> _Tuple[int, ...]: EncodingType, ExperimentalConditionsType, FieldOfViewMm, + Gradient, + GradientData, + GradientDirection, GradientDirectionType, + GradientHeader, Header, Image, ImageArray, @@ -70,6 +74,11 @@ def _parse_version(version: str) -> _Tuple[int, ...]: ParallelImagingType, PatientGender, PatientPosition, + Pulse, + PulseData, + PulseHeader, + PulsePhase, + PulsePhaseOffset, ReconAssembly, ReconBuffer, ReconData, diff --git a/python/mrd/binary.py b/python/mrd/binary.py index 5f8dd301..21705ed0 100644 --- a/python/mrd/binary.py +++ b/python/mrd/binary.py @@ -34,7 +34,7 @@ def _write_header(self, value: typing.Optional[Header]) -> None: _binary.OptionalSerializer(HeaderSerializer()).write(self._stream, value) def _write_data(self, value: collections.abc.Iterable[StreamItem]) -> None: - _binary.StreamSerializer(_binary.UnionSerializer(StreamItem, [(StreamItem.Acquisition, AcquisitionSerializer()), (StreamItem.WaveformUint32, WaveformSerializer(_binary.uint32_serializer)), (StreamItem.ImageUint16, ImageSerializer(_binary.uint16_serializer)), (StreamItem.ImageInt16, ImageSerializer(_binary.int16_serializer)), (StreamItem.ImageUint32, ImageSerializer(_binary.uint32_serializer)), (StreamItem.ImageInt32, ImageSerializer(_binary.int32_serializer)), (StreamItem.ImageFloat, ImageSerializer(_binary.float32_serializer)), (StreamItem.ImageDouble, ImageSerializer(_binary.float64_serializer)), (StreamItem.ImageComplexFloat, ImageSerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageComplexDouble, ImageSerializer(_binary.complexfloat64_serializer)), (StreamItem.AcquisitionBucket, AcquisitionBucketSerializer()), (StreamItem.ReconData, ReconDataSerializer()), (StreamItem.ArrayComplexFloat, _binary.DynamicNDArraySerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageArray, ImageArraySerializer())])).write(self._stream, value) + _binary.StreamSerializer(_binary.UnionSerializer(StreamItem, [(StreamItem.Acquisition, AcquisitionSerializer()), (StreamItem.Pulse, PulseSerializer()), (StreamItem.Gradient, GradientSerializer()), (StreamItem.WaveformUint32, WaveformSerializer(_binary.uint32_serializer)), (StreamItem.ImageUint16, ImageSerializer(_binary.uint16_serializer)), (StreamItem.ImageInt16, ImageSerializer(_binary.int16_serializer)), (StreamItem.ImageUint32, ImageSerializer(_binary.uint32_serializer)), (StreamItem.ImageInt32, ImageSerializer(_binary.int32_serializer)), (StreamItem.ImageFloat, ImageSerializer(_binary.float32_serializer)), (StreamItem.ImageDouble, ImageSerializer(_binary.float64_serializer)), (StreamItem.ImageComplexFloat, ImageSerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageComplexDouble, ImageSerializer(_binary.complexfloat64_serializer)), (StreamItem.AcquisitionBucket, AcquisitionBucketSerializer()), (StreamItem.ReconData, ReconDataSerializer()), (StreamItem.ArrayComplexFloat, _binary.DynamicNDArraySerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageArray, ImageArraySerializer())])).write(self._stream, value) class BinaryMrdReader(_binary.BinaryProtocolReader, MrdReaderBase): @@ -52,7 +52,7 @@ def _read_header(self) -> typing.Optional[Header]: return _binary.OptionalSerializer(HeaderSerializer()).read(self._stream) def _read_data(self) -> collections.abc.Iterable[StreamItem]: - return _binary.StreamSerializer(_binary.UnionSerializer(StreamItem, [(StreamItem.Acquisition, AcquisitionSerializer()), (StreamItem.WaveformUint32, WaveformSerializer(_binary.uint32_serializer)), (StreamItem.ImageUint16, ImageSerializer(_binary.uint16_serializer)), (StreamItem.ImageInt16, ImageSerializer(_binary.int16_serializer)), (StreamItem.ImageUint32, ImageSerializer(_binary.uint32_serializer)), (StreamItem.ImageInt32, ImageSerializer(_binary.int32_serializer)), (StreamItem.ImageFloat, ImageSerializer(_binary.float32_serializer)), (StreamItem.ImageDouble, ImageSerializer(_binary.float64_serializer)), (StreamItem.ImageComplexFloat, ImageSerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageComplexDouble, ImageSerializer(_binary.complexfloat64_serializer)), (StreamItem.AcquisitionBucket, AcquisitionBucketSerializer()), (StreamItem.ReconData, ReconDataSerializer()), (StreamItem.ArrayComplexFloat, _binary.DynamicNDArraySerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageArray, ImageArraySerializer())])).read(self._stream) + return _binary.StreamSerializer(_binary.UnionSerializer(StreamItem, [(StreamItem.Acquisition, AcquisitionSerializer()), (StreamItem.Pulse, PulseSerializer()), (StreamItem.Gradient, GradientSerializer()), (StreamItem.WaveformUint32, WaveformSerializer(_binary.uint32_serializer)), (StreamItem.ImageUint16, ImageSerializer(_binary.uint16_serializer)), (StreamItem.ImageInt16, ImageSerializer(_binary.int16_serializer)), (StreamItem.ImageUint32, ImageSerializer(_binary.uint32_serializer)), (StreamItem.ImageInt32, ImageSerializer(_binary.int32_serializer)), (StreamItem.ImageFloat, ImageSerializer(_binary.float32_serializer)), (StreamItem.ImageDouble, ImageSerializer(_binary.float64_serializer)), (StreamItem.ImageComplexFloat, ImageSerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageComplexDouble, ImageSerializer(_binary.complexfloat64_serializer)), (StreamItem.AcquisitionBucket, AcquisitionBucketSerializer()), (StreamItem.ReconData, ReconDataSerializer()), (StreamItem.ArrayComplexFloat, _binary.DynamicNDArraySerializer(_binary.complexfloat32_serializer)), (StreamItem.ImageArray, ImageArraySerializer())])).read(self._stream) class BinaryMrdNoiseCovarianceWriter(_binary.BinaryProtocolWriter, MrdNoiseCovarianceWriterBase): """Binary writer for the MrdNoiseCovariance protocol. @@ -137,6 +137,42 @@ def read(self, stream: _binary.CodedInputStream) -> Acquisition: return Acquisition(head=field_values[0], data=field_values[1], trajectory=field_values[2]) +class GradientHeaderSerializer(_binary.RecordSerializer[GradientHeader]): + def __init__(self) -> None: + super().__init__([("gradient_time_stamp_ns", _binary.uint64_serializer), ("gradient_sample_time_ns", _binary.uint32_serializer), ("pulse_calibration", _binary.OptionalSerializer(_binary.VectorSerializer(_binary.float32_serializer))), ("gradient_direction", _binary.EnumSerializer(_binary.int32_serializer, GradientDirection))]) + + def write(self, stream: _binary.CodedOutputStream, value: GradientHeader) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.gradient_time_stamp_ns, value.gradient_sample_time_ns, value.pulse_calibration, value.gradient_direction) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['gradient_time_stamp_ns'], value['gradient_sample_time_ns'], value['pulse_calibration'], value['gradient_direction']) + + def read(self, stream: _binary.CodedInputStream) -> GradientHeader: + field_values = self._read(stream) + return GradientHeader(gradient_time_stamp_ns=field_values[0], gradient_sample_time_ns=field_values[1], pulse_calibration=field_values[2], gradient_direction=field_values[3]) + + +class GradientSerializer(_binary.RecordSerializer[Gradient]): + def __init__(self) -> None: + super().__init__([("head", GradientHeaderSerializer()), ("data", _binary.NDArraySerializer(_binary.float32_serializer, 1))]) + + def write(self, stream: _binary.CodedOutputStream, value: Gradient) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.head, value.data) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['head'], value['data']) + + def read(self, stream: _binary.CodedInputStream) -> Gradient: + field_values = self._read(stream) + return Gradient(head=field_values[0], data=field_values[1]) + + class SubjectInformationTypeSerializer(_binary.RecordSerializer[SubjectInformationType]): def __init__(self) -> None: super().__init__([("patient_name", _binary.OptionalSerializer(_binary.string_serializer)), ("patient_weight_kg", _binary.OptionalSerializer(_binary.float32_serializer)), ("patient_height_m", _binary.OptionalSerializer(_binary.float32_serializer)), ("patient_id", _binary.OptionalSerializer(_binary.string_serializer)), ("patient_birthdate", _binary.OptionalSerializer(_binary.date_serializer)), ("patient_gender", _binary.OptionalSerializer(_binary.EnumSerializer(_binary.int32_serializer, PatientGender)))]) @@ -875,3 +911,39 @@ def read(self, stream: _binary.CodedInputStream) -> ImageArray: return ImageArray(data=field_values[0], headers=field_values[1], meta=field_values[2], waveforms=field_values[3]) +class PulseHeaderSerializer(_binary.RecordSerializer[PulseHeader]): + def __init__(self) -> None: + super().__init__([("pulse_time_stamp_ns", _binary.uint64_serializer), ("channel_order", _binary.VectorSerializer(_binary.uint32_serializer)), ("sample_time_ns", _binary.uint32_serializer), ("pulse_calibration", _binary.OptionalSerializer(_binary.VectorSerializer(_binary.float32_serializer)))]) + + def write(self, stream: _binary.CodedOutputStream, value: PulseHeader) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.pulse_time_stamp_ns, value.channel_order, value.sample_time_ns, value.pulse_calibration) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['pulse_time_stamp_ns'], value['channel_order'], value['sample_time_ns'], value['pulse_calibration']) + + def read(self, stream: _binary.CodedInputStream) -> PulseHeader: + field_values = self._read(stream) + return PulseHeader(pulse_time_stamp_ns=field_values[0], channel_order=field_values[1], sample_time_ns=field_values[2], pulse_calibration=field_values[3]) + + +class PulseSerializer(_binary.RecordSerializer[Pulse]): + def __init__(self) -> None: + super().__init__([("head", PulseHeaderSerializer()), ("amplitude", _binary.NDArraySerializer(_binary.float32_serializer, 2)), ("phase", _binary.NDArraySerializer(_binary.float32_serializer, 1)), ("phase_offset", _binary.NDArraySerializer(_binary.float32_serializer, 1))]) + + def write(self, stream: _binary.CodedOutputStream, value: Pulse) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.head, value.amplitude, value.phase, value.phase_offset) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['head'], value['amplitude'], value['phase'], value['phase_offset']) + + def read(self, stream: _binary.CodedInputStream) -> Pulse: + field_values = self._read(stream) + return Pulse(head=field_values[0], amplitude=field_values[1], phase=field_values[2], phase_offset=field_values[3]) + + diff --git a/python/mrd/ndjson.py b/python/mrd/ndjson.py index c7bf2dea..d4f7a539 100644 --- a/python/mrd/ndjson.py +++ b/python/mrd/ndjson.py @@ -374,6 +374,115 @@ def from_json_to_numpy(self, json_object: object) -> np.void: ) # type:ignore +gradient_direction_name_to_value_map = { + "z": GradientDirection.Z, + "y": GradientDirection.Y, + "x": GradientDirection.X, +} +gradient_direction_value_to_name_map = {v: n for n, v in gradient_direction_name_to_value_map.items()} + +class GradientHeaderConverter(_ndjson.JsonConverter[GradientHeader, np.void]): + def __init__(self) -> None: + self._gradient_time_stamp_ns_converter = _ndjson.uint64_converter + self._gradient_sample_time_ns_converter = _ndjson.uint32_converter + self._pulse_calibration_converter = _ndjson.OptionalConverter(_ndjson.VectorConverter(_ndjson.float32_converter)) + self._gradient_direction_converter = _ndjson.EnumConverter(GradientDirection, np.int32, gradient_direction_name_to_value_map, gradient_direction_value_to_name_map) + super().__init__(np.dtype([ + ("gradient_time_stamp_ns", self._gradient_time_stamp_ns_converter.overall_dtype()), + ("gradient_sample_time_ns", self._gradient_sample_time_ns_converter.overall_dtype()), + ("pulse_calibration", self._pulse_calibration_converter.overall_dtype()), + ("gradient_direction", self._gradient_direction_converter.overall_dtype()), + ])) + + def to_json(self, value: GradientHeader) -> object: + if not isinstance(value, GradientHeader): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'GradientHeader' instance") + json_object = {} + + json_object["gradientTimeStampNs"] = self._gradient_time_stamp_ns_converter.to_json(value.gradient_time_stamp_ns) + json_object["gradientSampleTimeNs"] = self._gradient_sample_time_ns_converter.to_json(value.gradient_sample_time_ns) + if value.pulse_calibration is not None: + json_object["pulseCalibration"] = self._pulse_calibration_converter.to_json(value.pulse_calibration) + json_object["gradientDirection"] = self._gradient_direction_converter.to_json(value.gradient_direction) + return json_object + + def numpy_to_json(self, value: np.void) -> object: + if not isinstance(value, np.void): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'np.void' instance") + json_object = {} + + json_object["gradientTimeStampNs"] = self._gradient_time_stamp_ns_converter.numpy_to_json(value["gradient_time_stamp_ns"]) + json_object["gradientSampleTimeNs"] = self._gradient_sample_time_ns_converter.numpy_to_json(value["gradient_sample_time_ns"]) + if (field_val := value["pulse_calibration"]) is not None: + json_object["pulseCalibration"] = self._pulse_calibration_converter.numpy_to_json(field_val) + json_object["gradientDirection"] = self._gradient_direction_converter.numpy_to_json(value["gradient_direction"]) + return json_object + + def from_json(self, json_object: object) -> GradientHeader: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return GradientHeader( + gradient_time_stamp_ns=self._gradient_time_stamp_ns_converter.from_json(json_object["gradientTimeStampNs"],), + gradient_sample_time_ns=self._gradient_sample_time_ns_converter.from_json(json_object["gradientSampleTimeNs"],), + pulse_calibration=self._pulse_calibration_converter.from_json(json_object.get("pulseCalibration")), + gradient_direction=self._gradient_direction_converter.from_json(json_object["gradientDirection"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._gradient_time_stamp_ns_converter.from_json_to_numpy(json_object["gradientTimeStampNs"]), + self._gradient_sample_time_ns_converter.from_json_to_numpy(json_object["gradientSampleTimeNs"]), + self._pulse_calibration_converter.from_json_to_numpy(json_object.get("pulseCalibration")), + self._gradient_direction_converter.from_json_to_numpy(json_object["gradientDirection"]), + ) # type:ignore + + +class GradientConverter(_ndjson.JsonConverter[Gradient, np.void]): + def __init__(self) -> None: + self._head_converter = GradientHeaderConverter() + self._data_converter = _ndjson.NDArrayConverter(_ndjson.float32_converter, 1) + super().__init__(np.dtype([ + ("head", self._head_converter.overall_dtype()), + ("data", self._data_converter.overall_dtype()), + ])) + + def to_json(self, value: Gradient) -> object: + if not isinstance(value, Gradient): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'Gradient' instance") + json_object = {} + + json_object["head"] = self._head_converter.to_json(value.head) + json_object["data"] = self._data_converter.to_json(value.data) + return json_object + + def numpy_to_json(self, value: np.void) -> object: + if not isinstance(value, np.void): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'np.void' instance") + json_object = {} + + json_object["head"] = self._head_converter.numpy_to_json(value["head"]) + json_object["data"] = self._data_converter.numpy_to_json(value["data"]) + return json_object + + def from_json(self, json_object: object) -> Gradient: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return Gradient( + head=self._head_converter.from_json(json_object["head"],), + data=self._data_converter.from_json(json_object["data"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._head_converter.from_json_to_numpy(json_object["head"]), + self._data_converter.from_json_to_numpy(json_object["data"]), + ) # type:ignore + + patient_gender_name_to_value_map = { "m": PatientGender.M, "f": PatientGender.F, @@ -3149,6 +3258,120 @@ def from_json_to_numpy(self, json_object: object) -> np.void: ) # type:ignore +class PulseHeaderConverter(_ndjson.JsonConverter[PulseHeader, np.void]): + def __init__(self) -> None: + self._pulse_time_stamp_ns_converter = _ndjson.uint64_converter + self._channel_order_converter = _ndjson.VectorConverter(_ndjson.uint32_converter) + self._sample_time_ns_converter = _ndjson.uint32_converter + self._pulse_calibration_converter = _ndjson.OptionalConverter(_ndjson.VectorConverter(_ndjson.float32_converter)) + super().__init__(np.dtype([ + ("pulse_time_stamp_ns", self._pulse_time_stamp_ns_converter.overall_dtype()), + ("channel_order", self._channel_order_converter.overall_dtype()), + ("sample_time_ns", self._sample_time_ns_converter.overall_dtype()), + ("pulse_calibration", self._pulse_calibration_converter.overall_dtype()), + ])) + + def to_json(self, value: PulseHeader) -> object: + if not isinstance(value, PulseHeader): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'PulseHeader' instance") + json_object = {} + + json_object["pulseTimeStampNs"] = self._pulse_time_stamp_ns_converter.to_json(value.pulse_time_stamp_ns) + json_object["channelOrder"] = self._channel_order_converter.to_json(value.channel_order) + json_object["sampleTimeNs"] = self._sample_time_ns_converter.to_json(value.sample_time_ns) + if value.pulse_calibration is not None: + json_object["pulseCalibration"] = self._pulse_calibration_converter.to_json(value.pulse_calibration) + return json_object + + def numpy_to_json(self, value: np.void) -> object: + if not isinstance(value, np.void): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'np.void' instance") + json_object = {} + + json_object["pulseTimeStampNs"] = self._pulse_time_stamp_ns_converter.numpy_to_json(value["pulse_time_stamp_ns"]) + json_object["channelOrder"] = self._channel_order_converter.numpy_to_json(value["channel_order"]) + json_object["sampleTimeNs"] = self._sample_time_ns_converter.numpy_to_json(value["sample_time_ns"]) + if (field_val := value["pulse_calibration"]) is not None: + json_object["pulseCalibration"] = self._pulse_calibration_converter.numpy_to_json(field_val) + return json_object + + def from_json(self, json_object: object) -> PulseHeader: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return PulseHeader( + pulse_time_stamp_ns=self._pulse_time_stamp_ns_converter.from_json(json_object["pulseTimeStampNs"],), + channel_order=self._channel_order_converter.from_json(json_object["channelOrder"],), + sample_time_ns=self._sample_time_ns_converter.from_json(json_object["sampleTimeNs"],), + pulse_calibration=self._pulse_calibration_converter.from_json(json_object.get("pulseCalibration")), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._pulse_time_stamp_ns_converter.from_json_to_numpy(json_object["pulseTimeStampNs"]), + self._channel_order_converter.from_json_to_numpy(json_object["channelOrder"]), + self._sample_time_ns_converter.from_json_to_numpy(json_object["sampleTimeNs"]), + self._pulse_calibration_converter.from_json_to_numpy(json_object.get("pulseCalibration")), + ) # type:ignore + + +class PulseConverter(_ndjson.JsonConverter[Pulse, np.void]): + def __init__(self) -> None: + self._head_converter = PulseHeaderConverter() + self._amplitude_converter = _ndjson.NDArrayConverter(_ndjson.float32_converter, 2) + self._phase_converter = _ndjson.NDArrayConverter(_ndjson.float32_converter, 1) + self._phase_offset_converter = _ndjson.NDArrayConverter(_ndjson.float32_converter, 1) + super().__init__(np.dtype([ + ("head", self._head_converter.overall_dtype()), + ("amplitude", self._amplitude_converter.overall_dtype()), + ("phase", self._phase_converter.overall_dtype()), + ("phase_offset", self._phase_offset_converter.overall_dtype()), + ])) + + def to_json(self, value: Pulse) -> object: + if not isinstance(value, Pulse): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'Pulse' instance") + json_object = {} + + json_object["head"] = self._head_converter.to_json(value.head) + json_object["amplitude"] = self._amplitude_converter.to_json(value.amplitude) + json_object["phase"] = self._phase_converter.to_json(value.phase) + json_object["phaseOffset"] = self._phase_offset_converter.to_json(value.phase_offset) + return json_object + + def numpy_to_json(self, value: np.void) -> object: + if not isinstance(value, np.void): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'np.void' instance") + json_object = {} + + json_object["head"] = self._head_converter.numpy_to_json(value["head"]) + json_object["amplitude"] = self._amplitude_converter.numpy_to_json(value["amplitude"]) + json_object["phase"] = self._phase_converter.numpy_to_json(value["phase"]) + json_object["phaseOffset"] = self._phase_offset_converter.numpy_to_json(value["phase_offset"]) + return json_object + + def from_json(self, json_object: object) -> Pulse: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return Pulse( + head=self._head_converter.from_json(json_object["head"],), + amplitude=self._amplitude_converter.from_json(json_object["amplitude"],), + phase=self._phase_converter.from_json(json_object["phase"],), + phase_offset=self._phase_offset_converter.from_json(json_object["phaseOffset"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._head_converter.from_json_to_numpy(json_object["head"]), + self._amplitude_converter.from_json_to_numpy(json_object["amplitude"]), + self._phase_converter.from_json_to_numpy(json_object["phase"]), + self._phase_offset_converter.from_json_to_numpy(json_object["phaseOffset"]), + ) # type:ignore + + class NDJsonMrdWriter(_ndjson.NDJsonProtocolWriter, MrdWriterBase): """NDJson writer for the Mrd protocol. @@ -3166,7 +3389,7 @@ def _write_header(self, value: typing.Optional[Header]) -> None: self._write_json_line({"header": json_value}) def _write_data(self, value: collections.abc.Iterable[StreamItem]) -> None: - converter = _ndjson.UnionConverter(StreamItem, [(StreamItem.Acquisition, AcquisitionConverter(), [dict]), (StreamItem.WaveformUint32, WaveformConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageUint16, ImageConverter(_ndjson.uint16_converter), [dict]), (StreamItem.ImageInt16, ImageConverter(_ndjson.int16_converter), [dict]), (StreamItem.ImageUint32, ImageConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageInt32, ImageConverter(_ndjson.int32_converter), [dict]), (StreamItem.ImageFloat, ImageConverter(_ndjson.float32_converter), [dict]), (StreamItem.ImageDouble, ImageConverter(_ndjson.float64_converter), [dict]), (StreamItem.ImageComplexFloat, ImageConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageComplexDouble, ImageConverter(_ndjson.complexfloat64_converter), [dict]), (StreamItem.AcquisitionBucket, AcquisitionBucketConverter(), [dict]), (StreamItem.ReconData, ReconDataConverter(), [dict]), (StreamItem.ArrayComplexFloat, _ndjson.DynamicNDArrayConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageArray, ImageArrayConverter(), [dict])], False) + converter = _ndjson.UnionConverter(StreamItem, [(StreamItem.Acquisition, AcquisitionConverter(), [dict]), (StreamItem.Pulse, PulseConverter(), [dict]), (StreamItem.Gradient, GradientConverter(), [dict]), (StreamItem.WaveformUint32, WaveformConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageUint16, ImageConverter(_ndjson.uint16_converter), [dict]), (StreamItem.ImageInt16, ImageConverter(_ndjson.int16_converter), [dict]), (StreamItem.ImageUint32, ImageConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageInt32, ImageConverter(_ndjson.int32_converter), [dict]), (StreamItem.ImageFloat, ImageConverter(_ndjson.float32_converter), [dict]), (StreamItem.ImageDouble, ImageConverter(_ndjson.float64_converter), [dict]), (StreamItem.ImageComplexFloat, ImageConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageComplexDouble, ImageConverter(_ndjson.complexfloat64_converter), [dict]), (StreamItem.AcquisitionBucket, AcquisitionBucketConverter(), [dict]), (StreamItem.ReconData, ReconDataConverter(), [dict]), (StreamItem.ArrayComplexFloat, _ndjson.DynamicNDArrayConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageArray, ImageArrayConverter(), [dict])], False) for item in value: json_item = converter.to_json(item) self._write_json_line({"data": json_item}) @@ -3189,7 +3412,7 @@ def _read_header(self) -> typing.Optional[Header]: return converter.from_json(json_object) def _read_data(self) -> collections.abc.Iterable[StreamItem]: - converter = _ndjson.UnionConverter(StreamItem, [(StreamItem.Acquisition, AcquisitionConverter(), [dict]), (StreamItem.WaveformUint32, WaveformConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageUint16, ImageConverter(_ndjson.uint16_converter), [dict]), (StreamItem.ImageInt16, ImageConverter(_ndjson.int16_converter), [dict]), (StreamItem.ImageUint32, ImageConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageInt32, ImageConverter(_ndjson.int32_converter), [dict]), (StreamItem.ImageFloat, ImageConverter(_ndjson.float32_converter), [dict]), (StreamItem.ImageDouble, ImageConverter(_ndjson.float64_converter), [dict]), (StreamItem.ImageComplexFloat, ImageConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageComplexDouble, ImageConverter(_ndjson.complexfloat64_converter), [dict]), (StreamItem.AcquisitionBucket, AcquisitionBucketConverter(), [dict]), (StreamItem.ReconData, ReconDataConverter(), [dict]), (StreamItem.ArrayComplexFloat, _ndjson.DynamicNDArrayConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageArray, ImageArrayConverter(), [dict])], False) + converter = _ndjson.UnionConverter(StreamItem, [(StreamItem.Acquisition, AcquisitionConverter(), [dict]), (StreamItem.Pulse, PulseConverter(), [dict]), (StreamItem.Gradient, GradientConverter(), [dict]), (StreamItem.WaveformUint32, WaveformConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageUint16, ImageConverter(_ndjson.uint16_converter), [dict]), (StreamItem.ImageInt16, ImageConverter(_ndjson.int16_converter), [dict]), (StreamItem.ImageUint32, ImageConverter(_ndjson.uint32_converter), [dict]), (StreamItem.ImageInt32, ImageConverter(_ndjson.int32_converter), [dict]), (StreamItem.ImageFloat, ImageConverter(_ndjson.float32_converter), [dict]), (StreamItem.ImageDouble, ImageConverter(_ndjson.float64_converter), [dict]), (StreamItem.ImageComplexFloat, ImageConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageComplexDouble, ImageConverter(_ndjson.complexfloat64_converter), [dict]), (StreamItem.AcquisitionBucket, AcquisitionBucketConverter(), [dict]), (StreamItem.ReconData, ReconDataConverter(), [dict]), (StreamItem.ArrayComplexFloat, _ndjson.DynamicNDArrayConverter(_ndjson.complexfloat32_converter), [dict]), (StreamItem.ImageArray, ImageArrayConverter(), [dict])], False) while (json_object := self._read_json_line("data", False)) is not _ndjson.MISSING_SENTINEL: yield converter.from_json(json_object) diff --git a/python/mrd/protocols.py b/python/mrd/protocols.py index 4c71d177..bf1499b1 100644 --- a/python/mrd/protocols.py +++ b/python/mrd/protocols.py @@ -24,7 +24,7 @@ class MrdWriterBase(abc.ABC): def __init__(self) -> None: self._state = 0 - schema = r"""{"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]}""" + schema = r"""{"protocol":{"name":"Mrd","sequence":[{"name":"header","type":[null,"Mrd.Header"]},{"name":"data","type":{"stream":{"items":"Mrd.StreamItem"}}}]},"types":[{"name":"AccelerationFactorType","fields":[{"name":"kspaceEncodingStep1","type":"uint32"},{"name":"kspaceEncodingStep2","type":"uint32"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"Acquisition","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"data","type":"Mrd.AcquisitionData"},{"name":"trajectory","type":"Mrd.TrajectoryData"}]},{"name":"AcquisitionBucket","fields":[{"name":"data","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"ref","type":{"vector":{"items":"Mrd.Acquisition"}}},{"name":"datastats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"refstats","type":{"vector":{"items":"Mrd.EncodingLimitsType"}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"AcquisitionData","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"AcquisitionFlags","base":"uint64","values":[{"symbol":"firstInEncodeStep1","value":1},{"symbol":"lastInEncodeStep1","value":2},{"symbol":"firstInEncodeStep2","value":4},{"symbol":"lastInEncodeStep2","value":8},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768},{"symbol":"firstInSegment","value":65536},{"symbol":"lastInSegment","value":131072},{"symbol":"isNoiseMeasurement","value":262144},{"symbol":"isParallelCalibration","value":524288},{"symbol":"isParallelCalibrationAndImaging","value":1048576},{"symbol":"isReverse","value":2097152},{"symbol":"isNavigationData","value":4194304},{"symbol":"isPhasecorrData","value":8388608},{"symbol":"lastInMeasurement","value":16777216},{"symbol":"isHpfeedbackData","value":33554432},{"symbol":"isDummyscanData","value":67108864},{"symbol":"isRtfeedbackData","value":134217728},{"symbol":"isSurfacecoilcorrectionscanData","value":268435456},{"symbol":"isPhaseStabilizationReference","value":536870912},{"symbol":"isPhaseStabilization","value":1073741824}]},{"name":"AcquisitionHeader","fields":[{"name":"flags","type":"Mrd.AcquisitionFlags"},{"name":"idx","type":"Mrd.EncodingCounters"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"discardPre","type":[null,"uint32"]},{"name":"discardPost","type":[null,"uint32"]},{"name":"centerSample","type":[null,"uint32"]},{"name":"encodingSpaceRef","type":[null,"uint32"]},{"name":"sampleTimeNs","type":[null,"uint64"]},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"readDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"phaseDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"AcquisitionSystemInformationType","fields":[{"name":"systemVendor","type":[null,"string"]},{"name":"systemModel","type":[null,"string"]},{"name":"systemFieldStrengthT","type":[null,"float32"]},{"name":"relativeReceiverNoiseBandwidth","type":[null,"float32"]},{"name":"receiverChannels","type":[null,"uint32"]},{"name":"coilLabel","type":{"vector":{"items":"Mrd.CoilLabelType"}}},{"name":"institutionName","type":[null,"string"]},{"name":"stationName","type":[null,"string"]},{"name":"deviceID","type":[null,"string"]},{"name":"deviceSerialNumber","type":[null,"string"]}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Calibration","values":[{"symbol":"separable2D","value":0},{"symbol":"full3D","value":1},{"symbol":"other","value":2}]},{"name":"CalibrationMode","values":[{"symbol":"noacceleration","value":0},{"symbol":"embedded","value":1},{"symbol":"interleaved","value":2},{"symbol":"separate","value":3},{"symbol":"external","value":4},{"symbol":"other","value":5}]},{"name":"CoilLabelType","fields":[{"name":"coilNumber","type":"uint32"},{"name":"coilName","type":"string"}]},{"name":"DiffusionDimension","values":[{"symbol":"average","value":0},{"symbol":"contrast","value":1},{"symbol":"phase","value":2},{"symbol":"repetition","value":3},{"symbol":"set","value":4},{"symbol":"segment","value":5},{"symbol":"user0","value":6},{"symbol":"user1","value":7},{"symbol":"user2","value":8},{"symbol":"user3","value":9},{"symbol":"user4","value":10},{"symbol":"user5","value":11},{"symbol":"user6","value":12},{"symbol":"user7","value":13}]},{"name":"DiffusionType","fields":[{"name":"gradientDirection","type":"Mrd.GradientDirectionType"},{"name":"bvalue","type":"float32"}]},{"name":"EncodingCounters","fields":[{"name":"kspaceEncodeStep1","type":[null,"uint32"]},{"name":"kspaceEncodeStep2","type":[null,"uint32"]},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"segment","type":[null,"uint32"]},{"name":"user","type":{"vector":{"items":"uint32"}}}]},{"name":"EncodingLimitsType","fields":[{"name":"kspaceEncodingStep0","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep1","type":[null,"Mrd.LimitType"]},{"name":"kspaceEncodingStep2","type":[null,"Mrd.LimitType"]},{"name":"average","type":[null,"Mrd.LimitType"]},{"name":"slice","type":[null,"Mrd.LimitType"]},{"name":"contrast","type":[null,"Mrd.LimitType"]},{"name":"phase","type":[null,"Mrd.LimitType"]},{"name":"repetition","type":[null,"Mrd.LimitType"]},{"name":"set","type":[null,"Mrd.LimitType"]},{"name":"segment","type":[null,"Mrd.LimitType"]},{"name":"user0","type":[null,"Mrd.LimitType"]},{"name":"user1","type":[null,"Mrd.LimitType"]},{"name":"user2","type":[null,"Mrd.LimitType"]},{"name":"user3","type":[null,"Mrd.LimitType"]},{"name":"user4","type":[null,"Mrd.LimitType"]},{"name":"user5","type":[null,"Mrd.LimitType"]},{"name":"user6","type":[null,"Mrd.LimitType"]},{"name":"user7","type":[null,"Mrd.LimitType"]}]},{"name":"EncodingSpaceType","fields":[{"name":"matrixSize","type":"Mrd.MatrixSizeType"},{"name":"fieldOfViewMm","type":"Mrd.FieldOfViewMm"}]},{"name":"EncodingType","fields":[{"name":"encodedSpace","type":"Mrd.EncodingSpaceType"},{"name":"reconSpace","type":"Mrd.EncodingSpaceType"},{"name":"encodingLimits","type":"Mrd.EncodingLimitsType"},{"name":"trajectory","type":"Mrd.Trajectory"},{"name":"trajectoryDescription","type":[null,"Mrd.TrajectoryDescriptionType"]},{"name":"parallelImaging","type":[null,"Mrd.ParallelImagingType"]},{"name":"echoTrainLength","type":[null,"int64"]}]},{"name":"ExperimentalConditionsType","fields":[{"name":"h1resonanceFrequencyHz","type":"int64"}]},{"name":"FieldOfViewMm","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Gradient","fields":[{"name":"head","type":"Mrd.GradientHeader"},{"name":"data","type":"Mrd.GradientData"}]},{"name":"GradientData","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"GradientDirection","values":[{"symbol":"z","value":1},{"symbol":"y","value":2},{"symbol":"x","value":3}]},{"name":"GradientDirectionType","fields":[{"name":"rl","type":"float32"},{"name":"ap","type":"float32"},{"name":"fh","type":"float32"}]},{"name":"GradientHeader","fields":[{"name":"gradientTimeStampNs","type":"uint64"},{"name":"gradientSampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]},{"name":"gradientDirection","type":"Mrd.GradientDirection"}]},{"name":"Header","fields":[{"name":"version","type":[null,"int64"]},{"name":"subjectInformation","type":[null,"Mrd.SubjectInformationType"]},{"name":"studyInformation","type":[null,"Mrd.StudyInformationType"]},{"name":"measurementInformation","type":[null,"Mrd.MeasurementInformationType"]},{"name":"acquisitionSystemInformation","type":[null,"Mrd.AcquisitionSystemInformationType"]},{"name":"experimentalConditions","type":"Mrd.ExperimentalConditionsType"},{"name":"encoding","type":{"vector":{"items":"Mrd.EncodingType"}}},{"name":"sequenceParameters","type":[null,"Mrd.SequenceParametersType"]},{"name":"userParameters","type":[null,"Mrd.UserParametersType"]},{"name":"waveformInformation","type":{"vector":{"items":"Mrd.WaveformInformationType"}}}]},{"name":"Image","typeParameters":["T"],"fields":[{"name":"head","type":"Mrd.ImageHeader"},{"name":"data","type":{"name":"Mrd.ImageData","typeArguments":["T"]}},{"name":"meta","type":"Mrd.ImageMeta"}]},{"name":"ImageArray","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"headers","type":{"array":{"items":"Mrd.ImageHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"meta","type":{"array":{"items":"Mrd.ImageMeta","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"}]}}},{"name":"waveforms","type":{"vector":{"items":"Mrd.WaveformUint32"}}}]},{"name":"ImageComplexDouble","type":{"name":"Mrd.Image","typeArguments":["complexfloat64"]}},{"name":"ImageComplexFloat","type":{"name":"Mrd.Image","typeArguments":["complexfloat32"]}},{"name":"ImageData","typeParameters":["Y"],"type":{"array":{"items":"Y","dimensions":[{"name":"channel"},{"name":"z"},{"name":"y"},{"name":"x"}]}}},{"name":"ImageDouble","type":{"name":"Mrd.Image","typeArguments":["float64"]}},{"name":"ImageFlags","base":"uint64","values":[{"symbol":"isNavigationData","value":1},{"symbol":"firstInAverage","value":16},{"symbol":"lastInAverage","value":32},{"symbol":"firstInSlice","value":64},{"symbol":"lastInSlice","value":128},{"symbol":"firstInContrast","value":256},{"symbol":"lastInContrast","value":512},{"symbol":"firstInPhase","value":1024},{"symbol":"lastInPhase","value":2048},{"symbol":"firstInRepetition","value":4096},{"symbol":"lastInRepetition","value":8192},{"symbol":"firstInSet","value":16384},{"symbol":"lastInSet","value":32768}]},{"name":"ImageFloat","type":{"name":"Mrd.Image","typeArguments":["float32"]}},{"name":"ImageHeader","fields":[{"name":"flags","type":"Mrd.ImageFlags"},{"name":"measurementUid","type":"uint32"},{"name":"fieldOfView","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"position","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"colDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"lineDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"sliceDir","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"patientTablePosition","type":{"array":{"items":"float32","dimensions":[{"length":3}]}}},{"name":"average","type":[null,"uint32"]},{"name":"slice","type":[null,"uint32"]},{"name":"contrast","type":[null,"uint32"]},{"name":"phase","type":[null,"uint32"]},{"name":"repetition","type":[null,"uint32"]},{"name":"set","type":[null,"uint32"]},{"name":"acquisitionTimeStampNs","type":[null,"uint64"]},{"name":"physiologyTimeStampNs","type":{"vector":{"items":"uint64"}}},{"name":"imageType","type":"Mrd.ImageType"},{"name":"imageIndex","type":[null,"uint32"]},{"name":"imageSeriesIndex","type":[null,"uint32"]},{"name":"userInt","type":{"vector":{"items":"int32"}}},{"name":"userFloat","type":{"vector":{"items":"float32"}}}]},{"name":"ImageInt16","type":{"name":"Mrd.Image","typeArguments":["int16"]}},{"name":"ImageInt32","type":{"name":"Mrd.Image","typeArguments":["int32"]}},{"name":"ImageMeta","type":{"map":{"keys":"string","values":{"vector":{"items":"Mrd.ImageMetaValue"}}}}},{"name":"ImageMetaValue","type":[{"tag":"string","type":"string"},{"tag":"int64","type":"int64"},{"tag":"float64","type":"float64"}]},{"name":"ImageType","values":[{"symbol":"magnitude","value":1},{"symbol":"phase","value":2},{"symbol":"real","value":3},{"symbol":"imag","value":4},{"symbol":"complex","value":5}]},{"name":"ImageUint16","type":{"name":"Mrd.Image","typeArguments":["uint16"]}},{"name":"ImageUint32","type":{"name":"Mrd.Image","typeArguments":["uint32"]}},{"name":"InterleavingDimension","values":[{"symbol":"phase","value":0},{"symbol":"repetition","value":1},{"symbol":"contrast","value":2},{"symbol":"average","value":3},{"symbol":"other","value":4}]},{"name":"LimitType","fields":[{"name":"minimum","type":"uint32"},{"name":"maximum","type":"uint32"},{"name":"center","type":"uint32"}]},{"name":"MatrixSizeType","fields":[{"name":"x","type":"uint32"},{"name":"y","type":"uint32"},{"name":"z","type":"uint32"}]},{"name":"MeasurementDependencyType","fields":[{"name":"dependencyType","type":"string"},{"name":"measurementID","type":"string"}]},{"name":"MeasurementInformationType","fields":[{"name":"measurementID","type":[null,"string"]},{"name":"seriesDate","type":[null,"date"]},{"name":"seriesTime","type":[null,"time"]},{"name":"patientPosition","type":"Mrd.PatientPosition"},{"name":"relativeTablePosition","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"initialSeriesNumber","type":[null,"int64"]},{"name":"protocolName","type":[null,"string"]},{"name":"sequenceName","type":[null,"string"]},{"name":"seriesDescription","type":[null,"string"]},{"name":"measurementDependency","type":{"vector":{"items":"Mrd.MeasurementDependencyType"}}},{"name":"seriesInstanceUIDRoot","type":[null,"string"]},{"name":"frameOfReferenceUID","type":[null,"string"]},{"name":"referencedImageSequence","type":[null,"Mrd.ReferencedImageSequenceType"]}]},{"name":"MultibandSpacingType","fields":[{"name":"dZ","type":{"vector":{"items":"float32"}}}]},{"name":"MultibandType","fields":[{"name":"spacing","type":{"vector":{"items":"Mrd.MultibandSpacingType"}}},{"name":"deltaKz","type":"float32"},{"name":"multibandFactor","type":"uint32"},{"name":"calibration","type":"Mrd.Calibration"},{"name":"calibrationEncoding","type":"uint64"}]},{"name":"ParallelImagingType","fields":[{"name":"accelerationFactor","type":"Mrd.AccelerationFactorType"},{"name":"calibrationMode","type":[null,"Mrd.CalibrationMode"]},{"name":"interleavingDimension","type":[null,"Mrd.InterleavingDimension"]},{"name":"multiband","type":[null,"Mrd.MultibandType"]}]},{"name":"PatientGender","values":[{"symbol":"m","value":0},{"symbol":"f","value":1},{"symbol":"o","value":2}]},{"name":"PatientPosition","values":[{"symbol":"hFP","value":0},{"symbol":"hFS","value":1},{"symbol":"hFDR","value":2},{"symbol":"hFDL","value":3},{"symbol":"fFP","value":4},{"symbol":"fFS","value":5},{"symbol":"fFDR","value":6},{"symbol":"fFDL","value":7}]},{"name":"Pulse","fields":[{"name":"head","type":"Mrd.PulseHeader"},{"name":"amplitude","type":"Mrd.PulseData"},{"name":"phase","type":"Mrd.PulsePhase"},{"name":"phaseOffset","type":"Mrd.PulsePhaseOffset"}]},{"name":"PulseData","type":{"array":{"items":"float32","dimensions":[{"name":"coils"},{"name":"samples"}]}}},{"name":"PulseHeader","fields":[{"name":"pulseTimeStampNs","type":"uint64"},{"name":"channelOrder","type":{"vector":{"items":"uint32"}}},{"name":"sampleTimeNs","type":"uint32"},{"name":"pulseCalibration","type":[null,{"vector":{"items":"float32"}}]}]},{"name":"PulsePhase","type":{"array":{"items":"float32","dimensions":[{"name":"samples"}]}}},{"name":"PulsePhaseOffset","type":{"array":{"items":"float32","dimensions":[{"name":"coils"}]}}},{"name":"ReconAssembly","fields":[{"name":"data","type":"Mrd.ReconBuffer"},{"name":"ref","type":[null,"Mrd.ReconBuffer"]}]},{"name":"ReconBuffer","fields":[{"name":"data","type":{"array":{"items":"complexfloat32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"chan"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}},{"name":"trajectory","type":{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"basis"},{"name":"samples"}]}}},{"name":"density","type":[null,{"array":{"items":"float32","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"},{"name":"e0"}]}}]},{"name":"headers","type":{"array":{"items":"Mrd.AcquisitionHeader","dimensions":[{"name":"loc"},{"name":"s"},{"name":"n"},{"name":"e2"},{"name":"e1"}]}}},{"name":"sampling","type":"Mrd.SamplingDescription"}]},{"name":"ReconData","fields":[{"name":"buffers","type":{"vector":{"items":"Mrd.ReconAssembly"}}}]},{"name":"ReferencedImageSequenceType","fields":[{"name":"referencedSOPInstanceUID","type":{"vector":{"items":"string"}}}]},{"name":"SamplingDescription","fields":[{"name":"encodedFOV","type":"Mrd.FieldOfViewMm"},{"name":"reconFOV","type":"Mrd.FieldOfViewMm"},{"name":"encodedMatrix","type":"Mrd.MatrixSizeType"},{"name":"reconMatrix","type":"Mrd.MatrixSizeType"},{"name":"samplingLimits","type":"Mrd.SamplingLimits"}]},{"name":"SamplingLimits","fields":[{"name":"kspaceEncodingStep0","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep1","type":"Mrd.LimitType"},{"name":"kspaceEncodingStep2","type":"Mrd.LimitType"}]},{"name":"SequenceParametersType","fields":[{"name":"tR","type":{"vector":{"items":"float32"}}},{"name":"tE","type":{"vector":{"items":"float32"}}},{"name":"tI","type":{"vector":{"items":"float32"}}},{"name":"flipAngleDeg","type":{"vector":{"items":"float32"}}},{"name":"sequenceType","type":[null,"string"]},{"name":"echoSpacing","type":{"vector":{"items":"float32"}}},{"name":"diffusionDimension","type":[null,"Mrd.DiffusionDimension"]},{"name":"diffusion","type":{"vector":{"items":"Mrd.DiffusionType"}}},{"name":"diffusionScheme","type":[null,"string"]}]},{"name":"StreamItem","type":[{"tag":"Acquisition","type":"Mrd.Acquisition"},{"tag":"Pulse","type":"Mrd.Pulse"},{"tag":"Gradient","type":"Mrd.Gradient"},{"tag":"WaveformUint32","type":"Mrd.WaveformUint32"},{"tag":"ImageUint16","type":"Mrd.ImageUint16"},{"tag":"ImageInt16","type":"Mrd.ImageInt16"},{"tag":"ImageUint32","type":"Mrd.ImageUint32"},{"tag":"ImageInt32","type":"Mrd.ImageInt32"},{"tag":"ImageFloat","type":"Mrd.ImageFloat"},{"tag":"ImageDouble","type":"Mrd.ImageDouble"},{"tag":"ImageComplexFloat","type":"Mrd.ImageComplexFloat"},{"tag":"ImageComplexDouble","type":"Mrd.ImageComplexDouble"},{"tag":"AcquisitionBucket","type":"Mrd.AcquisitionBucket"},{"tag":"ReconData","type":"Mrd.ReconData"},{"tag":"ArrayComplexFloat","type":"Mrd.ArrayComplexFloat"},{"tag":"ImageArray","type":"Mrd.ImageArray"}]},{"name":"StudyInformationType","fields":[{"name":"studyDate","type":[null,"date"]},{"name":"studyTime","type":[null,"time"]},{"name":"studyID","type":[null,"string"]},{"name":"accessionNumber","type":[null,"int64"]},{"name":"referringPhysicianName","type":[null,"string"]},{"name":"studyDescription","type":[null,"string"]},{"name":"studyInstanceUID","type":[null,"string"]},{"name":"bodyPartExamined","type":[null,"string"]}]},{"name":"SubjectInformationType","fields":[{"name":"patientName","type":[null,"string"]},{"name":"patientWeightKg","type":[null,"float32"]},{"name":"patientHeightM","type":[null,"float32"]},{"name":"patientID","type":[null,"string"]},{"name":"patientBirthdate","type":[null,"date"]},{"name":"patientGender","type":[null,"Mrd.PatientGender"]}]},{"name":"ThreeDimensionalFloat","fields":[{"name":"x","type":"float32"},{"name":"y","type":"float32"},{"name":"z","type":"float32"}]},{"name":"Trajectory","values":[{"symbol":"cartesian","value":0},{"symbol":"epi","value":1},{"symbol":"radial","value":2},{"symbol":"goldenangle","value":3},{"symbol":"spiral","value":4},{"symbol":"other","value":5}]},{"name":"TrajectoryData","type":{"array":{"items":"float32","dimensions":[{"name":"basis"},{"name":"samples"}]}}},{"name":"TrajectoryDescriptionType","fields":[{"name":"identifier","type":"string"},{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"comment","type":[null,"string"]}]},{"name":"UserParameterBase64Type","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParameterDoubleType","fields":[{"name":"name","type":"string"},{"name":"value","type":"float64"}]},{"name":"UserParameterLongType","fields":[{"name":"name","type":"string"},{"name":"value","type":"int64"}]},{"name":"UserParameterStringType","fields":[{"name":"name","type":"string"},{"name":"value","type":"string"}]},{"name":"UserParametersType","fields":[{"name":"userParameterLong","type":{"vector":{"items":"Mrd.UserParameterLongType"}}},{"name":"userParameterDouble","type":{"vector":{"items":"Mrd.UserParameterDoubleType"}}},{"name":"userParameterString","type":{"vector":{"items":"Mrd.UserParameterStringType"}}},{"name":"userParameterBase64","type":{"vector":{"items":"Mrd.UserParameterBase64Type"}}}]},{"name":"Waveform","typeParameters":["T"],"fields":[{"name":"flags","type":"uint64"},{"name":"measurementUid","type":"uint32"},{"name":"scanCounter","type":"uint32"},{"name":"timeStampNs","type":"uint64"},{"name":"sampleTimeNs","type":"uint64"},{"name":"waveformId","type":"uint32"},{"name":"data","type":{"name":"Mrd.WaveformSamples","typeArguments":["T"]}}]},{"name":"WaveformInformationType","fields":[{"name":"waveformName","type":"string"},{"name":"waveformType","type":"Mrd.WaveformType"},{"name":"userParameters","type":"Mrd.UserParametersType"}]},{"name":"WaveformSamples","typeParameters":["T"],"type":{"array":{"items":"T","dimensions":[{"name":"channels"},{"name":"samples"}]}}},{"name":"WaveformType","values":[{"symbol":"ecg","value":0},{"symbol":"pulse","value":1},{"symbol":"respiratory","value":2},{"symbol":"trigger","value":3},{"symbol":"gradientwaveform","value":4},{"symbol":"other","value":5}]},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}},{"name":"WaveformUint32","type":{"name":"Mrd.Waveform","typeArguments":["uint32"]}}]}""" def close(self) -> None: if self._state == 3: diff --git a/python/mrd/types.py b/python/mrd/types.py index 6e92d113..8b5e8597 100644 --- a/python/mrd/types.py +++ b/python/mrd/types.py @@ -330,6 +330,96 @@ def __repr__(self) -> str: return f"Acquisition(head={repr(self.head)}, data={repr(self.data)}, trajectory={repr(self.trajectory)})" +GradientData = npt.NDArray[np.float32] +"""gradient of defined direction stored as 1D array samples""" + + +class GradientDirection(yardl.OutOfRangeEnum): + Z = 1 + Y = 2 + X = 3 + +class GradientHeader: + gradient_time_stamp_ns: yardl.UInt64 + """Clock time stamp (e.g. nanoseconds since midnight)""" + + gradient_sample_time_ns: yardl.UInt32 + """Gradient sample duration in nanoseconds""" + + pulse_calibration: typing.Optional[list[yardl.Float32]] + """Grad calibration (T/m/A). Can be here or as a calGradMap calibration image or neither""" + + gradient_direction: GradientDirection + """Gradient direction as enum""" + + + def __init__(self, *, + gradient_time_stamp_ns: yardl.UInt64 = 0, + gradient_sample_time_ns: yardl.UInt32 = 0, + pulse_calibration: typing.Optional[list[yardl.Float32]] = None, + gradient_direction: GradientDirection, + ): + self.gradient_time_stamp_ns = gradient_time_stamp_ns + self.gradient_sample_time_ns = gradient_sample_time_ns + self.pulse_calibration = pulse_calibration + self.gradient_direction = gradient_direction + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, GradientHeader) + and self.gradient_time_stamp_ns == other.gradient_time_stamp_ns + and self.gradient_sample_time_ns == other.gradient_sample_time_ns + and self.pulse_calibration == other.pulse_calibration + and self.gradient_direction == other.gradient_direction + ) + + def __str__(self) -> str: + return f"GradientHeader(gradientTimeStampNs={self.gradient_time_stamp_ns}, gradientSampleTimeNs={self.gradient_sample_time_ns}, pulseCalibration={self.pulse_calibration}, gradientDirection={self.gradient_direction})" + + def __repr__(self) -> str: + return f"GradientHeader(gradientTimeStampNs={repr(self.gradient_time_stamp_ns)}, gradientSampleTimeNs={repr(self.gradient_sample_time_ns)}, pulseCalibration={repr(self.pulse_calibration)}, gradientDirection={repr(self.gradient_direction)})" + + +class Gradient: + head: GradientHeader + """Grad header""" + + data: GradientData + """gradient data""" + + + def __init__(self, *, + head: GradientHeader, + data: typing.Optional[GradientData] = None, + ): + self.head = head + self.data = data if data is not None else np.zeros((0), dtype=np.dtype(np.float32)) + + def samples(self) -> yardl.Size: + return self.data.shape[0] + + def starttime(self) -> yardl.UInt64: + """timestamps in ns""" + + return self.head.gradient_time_stamp_ns + + def endtime(self) -> yardl.Size: + return self.head.gradient_time_stamp_ns + self.samples() * int(self.head.gradient_sample_time_ns) + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, Gradient) + and self.head == other.head + and yardl.structural_equal(self.data, other.data) + ) + + def __str__(self) -> str: + return f"Gradient(head={self.head}, data={self.data})" + + def __repr__(self) -> str: + return f"Gradient(head={repr(self.head)}, data={repr(self.data)})" + + class PatientGender(yardl.OutOfRangeEnum): M = 0 F = 1 @@ -2088,8 +2178,109 @@ def __repr__(self) -> str: ArrayComplexFloat = Array[np.complex64] +class PulseHeader: + pulse_time_stamp_ns: yardl.UInt64 + """Clock time stamp (e.g. nanoseconds since midnight)""" + + channel_order: list[yardl.UInt32] + """Channel numbers""" + + sample_time_ns: yardl.UInt32 + """Sample time in ns""" + + pulse_calibration: typing.Optional[list[yardl.Float32]] + """Pulse calibration (rad/s/V). Can be here or as a calB1Map calibration image or neither""" + + + def __init__(self, *, + pulse_time_stamp_ns: yardl.UInt64 = 0, + channel_order: typing.Optional[list[yardl.UInt32]] = None, + sample_time_ns: yardl.UInt32 = 0, + pulse_calibration: typing.Optional[list[yardl.Float32]] = None, + ): + self.pulse_time_stamp_ns = pulse_time_stamp_ns + self.channel_order = channel_order if channel_order is not None else [] + self.sample_time_ns = sample_time_ns + self.pulse_calibration = pulse_calibration + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, PulseHeader) + and self.pulse_time_stamp_ns == other.pulse_time_stamp_ns + and self.channel_order == other.channel_order + and self.sample_time_ns == other.sample_time_ns + and self.pulse_calibration == other.pulse_calibration + ) + + def __str__(self) -> str: + return f"PulseHeader(pulseTimeStampNs={self.pulse_time_stamp_ns}, channelOrder={self.channel_order}, sampleTimeNs={self.sample_time_ns}, pulseCalibration={self.pulse_calibration})" + + def __repr__(self) -> str: + return f"PulseHeader(pulseTimeStampNs={repr(self.pulse_time_stamp_ns)}, channelOrder={repr(self.channel_order)}, sampleTimeNs={repr(self.sample_time_ns)}, pulseCalibration={repr(self.pulse_calibration)})" + + +PulseData = npt.NDArray[np.float32] + +PulsePhase = npt.NDArray[np.float32] + +PulsePhaseOffset = npt.NDArray[np.float32] + +class Pulse: + head: PulseHeader + """Pulse header""" + + amplitude: PulseData + """Raw pulse amplitude array""" + + phase: PulsePhase + """Full profile of pulse phase array""" + + phase_offset: PulsePhaseOffset + """Pulse phase offset""" + + + def __init__(self, *, + head: typing.Optional[PulseHeader] = None, + amplitude: typing.Optional[PulseData] = None, + phase: typing.Optional[PulsePhase] = None, + phase_offset: typing.Optional[PulsePhaseOffset] = None, + ): + self.head = head if head is not None else PulseHeader() + self.amplitude = amplitude if amplitude is not None else np.zeros((0, 0), dtype=np.dtype(np.float32)) + self.phase = phase if phase is not None else np.zeros((0), dtype=np.dtype(np.float32)) + self.phase_offset = phase_offset if phase_offset is not None else np.zeros((0), dtype=np.dtype(np.float32)) + + def coils(self) -> yardl.Size: + """Assuming writer sets amp and phase array the same size""" + + return self.amplitude.shape[0] + + def samples(self) -> yardl.Size: + return self.amplitude.shape[1] + + def active_channels(self) -> yardl.Size: + return len(self.head.channel_order) + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, Pulse) + and self.head == other.head + and yardl.structural_equal(self.amplitude, other.amplitude) + and yardl.structural_equal(self.phase, other.phase) + and yardl.structural_equal(self.phase_offset, other.phase_offset) + ) + + def __str__(self) -> str: + return f"Pulse(head={self.head}, amplitude={self.amplitude}, phase={self.phase}, phaseOffset={self.phase_offset})" + + def __repr__(self) -> str: + return f"Pulse(head={repr(self.head)}, amplitude={repr(self.amplitude)}, phase={repr(self.phase)}, phaseOffset={repr(self.phase_offset)})" + + class StreamItem: Acquisition: typing.ClassVar[type["StreamItemUnionCase[Acquisition]"]] + Pulse: typing.ClassVar[type["StreamItemUnionCase[Pulse]"]] + Gradient: typing.ClassVar[type["StreamItemUnionCase[Gradient]"]] WaveformUint32: typing.ClassVar[type["StreamItemUnionCase[WaveformUint32]"]] ImageUint16: typing.ClassVar[type["StreamItemUnionCase[ImageUint16]"]] ImageInt16: typing.ClassVar[type["StreamItemUnionCase[ImageInt16]"]] @@ -2108,19 +2299,21 @@ class StreamItemUnionCase(StreamItem, yardl.UnionCase[_T]): pass StreamItem.Acquisition = type("StreamItem.Acquisition", (StreamItemUnionCase,), {"index": 0, "tag": "Acquisition"}) -StreamItem.WaveformUint32 = type("StreamItem.WaveformUint32", (StreamItemUnionCase,), {"index": 1, "tag": "WaveformUint32"}) -StreamItem.ImageUint16 = type("StreamItem.ImageUint16", (StreamItemUnionCase,), {"index": 2, "tag": "ImageUint16"}) -StreamItem.ImageInt16 = type("StreamItem.ImageInt16", (StreamItemUnionCase,), {"index": 3, "tag": "ImageInt16"}) -StreamItem.ImageUint32 = type("StreamItem.ImageUint32", (StreamItemUnionCase,), {"index": 4, "tag": "ImageUint32"}) -StreamItem.ImageInt32 = type("StreamItem.ImageInt32", (StreamItemUnionCase,), {"index": 5, "tag": "ImageInt32"}) -StreamItem.ImageFloat = type("StreamItem.ImageFloat", (StreamItemUnionCase,), {"index": 6, "tag": "ImageFloat"}) -StreamItem.ImageDouble = type("StreamItem.ImageDouble", (StreamItemUnionCase,), {"index": 7, "tag": "ImageDouble"}) -StreamItem.ImageComplexFloat = type("StreamItem.ImageComplexFloat", (StreamItemUnionCase,), {"index": 8, "tag": "ImageComplexFloat"}) -StreamItem.ImageComplexDouble = type("StreamItem.ImageComplexDouble", (StreamItemUnionCase,), {"index": 9, "tag": "ImageComplexDouble"}) -StreamItem.AcquisitionBucket = type("StreamItem.AcquisitionBucket", (StreamItemUnionCase,), {"index": 10, "tag": "AcquisitionBucket"}) -StreamItem.ReconData = type("StreamItem.ReconData", (StreamItemUnionCase,), {"index": 11, "tag": "ReconData"}) -StreamItem.ArrayComplexFloat = type("StreamItem.ArrayComplexFloat", (StreamItemUnionCase,), {"index": 12, "tag": "ArrayComplexFloat"}) -StreamItem.ImageArray = type("StreamItem.ImageArray", (StreamItemUnionCase,), {"index": 13, "tag": "ImageArray"}) +StreamItem.Pulse = type("StreamItem.Pulse", (StreamItemUnionCase,), {"index": 1, "tag": "Pulse"}) +StreamItem.Gradient = type("StreamItem.Gradient", (StreamItemUnionCase,), {"index": 2, "tag": "Gradient"}) +StreamItem.WaveformUint32 = type("StreamItem.WaveformUint32", (StreamItemUnionCase,), {"index": 3, "tag": "WaveformUint32"}) +StreamItem.ImageUint16 = type("StreamItem.ImageUint16", (StreamItemUnionCase,), {"index": 4, "tag": "ImageUint16"}) +StreamItem.ImageInt16 = type("StreamItem.ImageInt16", (StreamItemUnionCase,), {"index": 5, "tag": "ImageInt16"}) +StreamItem.ImageUint32 = type("StreamItem.ImageUint32", (StreamItemUnionCase,), {"index": 6, "tag": "ImageUint32"}) +StreamItem.ImageInt32 = type("StreamItem.ImageInt32", (StreamItemUnionCase,), {"index": 7, "tag": "ImageInt32"}) +StreamItem.ImageFloat = type("StreamItem.ImageFloat", (StreamItemUnionCase,), {"index": 8, "tag": "ImageFloat"}) +StreamItem.ImageDouble = type("StreamItem.ImageDouble", (StreamItemUnionCase,), {"index": 9, "tag": "ImageDouble"}) +StreamItem.ImageComplexFloat = type("StreamItem.ImageComplexFloat", (StreamItemUnionCase,), {"index": 10, "tag": "ImageComplexFloat"}) +StreamItem.ImageComplexDouble = type("StreamItem.ImageComplexDouble", (StreamItemUnionCase,), {"index": 11, "tag": "ImageComplexDouble"}) +StreamItem.AcquisitionBucket = type("StreamItem.AcquisitionBucket", (StreamItemUnionCase,), {"index": 12, "tag": "AcquisitionBucket"}) +StreamItem.ReconData = type("StreamItem.ReconData", (StreamItemUnionCase,), {"index": 13, "tag": "ReconData"}) +StreamItem.ArrayComplexFloat = type("StreamItem.ArrayComplexFloat", (StreamItemUnionCase,), {"index": 14, "tag": "ArrayComplexFloat"}) +StreamItem.ImageArray = type("StreamItem.ImageArray", (StreamItemUnionCase,), {"index": 15, "tag": "ImageArray"}) del StreamItemUnionCase def _mk_get_dtype(): @@ -2131,6 +2324,9 @@ def _mk_get_dtype(): dtype_map.setdefault(EncodingCounters, np.dtype([('kspace_encode_step_1', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('kspace_encode_step_2', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('average', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('slice', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('contrast', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('phase', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('repetition', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('set', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('segment', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('user', np.dtype(np.object_))], align=True)) dtype_map.setdefault(AcquisitionHeader, np.dtype([('flags', get_dtype(AcquisitionFlags)), ('idx', get_dtype(EncodingCounters)), ('measurement_uid', np.dtype(np.uint32)), ('scan_counter', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('acquisition_time_stamp_ns', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint64))], align=True)), ('physiology_time_stamp_ns', np.dtype(np.object_)), ('channel_order', np.dtype(np.object_)), ('discard_pre', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('discard_post', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('center_sample', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('encoding_space_ref', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint32))], align=True)), ('sample_time_ns', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.uint64))], align=True)), ('position', np.dtype(np.float32), (3,)), ('read_dir', np.dtype(np.float32), (3,)), ('phase_dir', np.dtype(np.float32), (3,)), ('slice_dir', np.dtype(np.float32), (3,)), ('patient_table_position', np.dtype(np.float32), (3,)), ('user_int', np.dtype(np.object_)), ('user_float', np.dtype(np.object_))], align=True)) dtype_map.setdefault(Acquisition, np.dtype([('head', get_dtype(AcquisitionHeader)), ('data', np.dtype(np.object_)), ('trajectory', np.dtype(np.object_))], align=True)) + dtype_map.setdefault(GradientDirection, np.dtype(np.int32)) + dtype_map.setdefault(GradientHeader, np.dtype([('gradient_time_stamp_ns', np.dtype(np.uint64)), ('gradient_sample_time_ns', np.dtype(np.uint32)), ('pulse_calibration', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('gradient_direction', get_dtype(GradientDirection))], align=True)) + dtype_map.setdefault(Gradient, np.dtype([('head', get_dtype(GradientHeader)), ('data', np.dtype(np.object_))], align=True)) dtype_map.setdefault(PatientGender, np.dtype(np.int32)) dtype_map.setdefault(SubjectInformationType, np.dtype([('patient_name', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('patient_weight_kg', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.float32))], align=True)), ('patient_height_m', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.float32))], align=True)), ('patient_id', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('patient_birthdate', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.datetime64))], align=True)), ('patient_gender', np.dtype([('has_value', np.dtype(np.bool_)), ('value', get_dtype(PatientGender))], align=True))], align=True)) dtype_map.setdefault(StudyInformationType, np.dtype([('study_date', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.datetime64))], align=True)), ('study_time', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.timedelta64))], align=True)), ('study_id', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('accession_number', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.int64))], align=True)), ('referring_physician_name', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('study_description', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('study_instance_uid', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('body_part_examined', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True))], align=True)) @@ -2193,6 +2389,8 @@ def _mk_get_dtype(): dtype_map.setdefault(ReconAssembly, np.dtype([('data', get_dtype(ReconBuffer)), ('ref', np.dtype([('has_value', np.dtype(np.bool_)), ('value', get_dtype(ReconBuffer))], align=True))], align=True)) dtype_map.setdefault(ReconData, np.dtype([('buffers', np.dtype(np.object_))], align=True)) dtype_map.setdefault(ImageArray, np.dtype([('data', np.dtype(np.object_)), ('headers', np.dtype(np.object_)), ('meta', np.dtype(np.object_)), ('waveforms', np.dtype(np.object_))], align=True)) + dtype_map.setdefault(PulseHeader, np.dtype([('pulse_time_stamp_ns', np.dtype(np.uint64)), ('channel_order', np.dtype(np.object_)), ('sample_time_ns', np.dtype(np.uint32)), ('pulse_calibration', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True))], align=True)) + dtype_map.setdefault(Pulse, np.dtype([('head', get_dtype(PulseHeader)), ('amplitude', np.dtype(np.object_)), ('phase', np.dtype(np.object_)), ('phase_offset', np.dtype(np.object_))], align=True)) dtype_map.setdefault(StreamItem, np.dtype(np.object_)) return get_dtype From 9a62c67a82c1a5f9605c76f8a4ed3209f027ef10 Mon Sep 17 00:00:00 2001 From: kento Date: Tue, 23 Sep 2025 13:58:02 +0000 Subject: [PATCH 4/4] rename gradient direction to axis --- model/mrd_gradient.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/model/mrd_gradient.yml b/model/mrd_gradient.yml index c14c09cc..d3669803 100644 --- a/model/mrd_gradient.yml +++ b/model/mrd_gradient.yml @@ -4,7 +4,7 @@ GradientData: !array dimensions: samples: -GradientDirection: !enum +GradientAxis: !enum values: z: 1 y: 2 @@ -18,8 +18,8 @@ GradientHeader: !record gradientSampleTimeNs: uint # Grad calibration (T/m/A). Can be here or as a calGradMap calibration image or neither pulseCalibration: float*? - # Gradient direction as enum - gradientDirection: GradientDirection + # Gradient axis as enum + gradientAxis: GradientAxis Gradient: !record fields: