diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5bc99a66..d291005d 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -90,7 +90,7 @@ RUN . /opt/conda/etc/profile.d/conda.sh \ # Install the yardl tool -ARG YARDL_VERSION=0.6.4 +ARG YARDL_VERSION=0.6.5 RUN wget --quiet "https://github.com/microsoft/yardl/releases/download/v${YARDL_VERSION}/yardl_${YARDL_VERSION}_linux_x86_64.tar.gz" \ && tar -xzf "yardl_${YARDL_VERSION}_linux_x86_64.tar.gz" \ && mv yardl "/opt/conda/envs/${CONDA_ENVIRONMENT_NAME}/bin/" \ diff --git a/.github/workflows/mrd_build.yml b/.github/workflows/mrd_build.yml index a40c7e2e..19091f2d 100644 --- a/.github/workflows/mrd_build.yml +++ b/.github/workflows/mrd_build.yml @@ -11,7 +11,7 @@ on: env: # Increase this to manually reset the conda environment cache CONDA_CACHE_NUMBER: 0 - YARDL_VERSION: 0.6.4 + YARDL_VERSION: 0.6.5 defaults: run: diff --git a/cpp/mrd-tools/converters.cc b/cpp/mrd-tools/converters.cc index ab9338c3..95842489 100644 --- a/cpp/mrd-tools/converters.cc +++ b/cpp/mrd-tools/converters.cc @@ -1087,6 +1087,11 @@ ISMRMRD::Image> convert(Image>& im) { return convert>(im); } +// Convert mrd::AcquisitionPrototype - no equivalent in ISMRMRD:: +int convert(AcquisitionPrototype&) { + return 0; +} + // Convert mrd::AcquisitionBucket - no equivalent in ISMRMRD:: int convert(AcquisitionBucket&) { return 0; @@ -1107,6 +1112,41 @@ int convert(ArrayComplexFloat&) { return 0; } +// no equivalent in ISMRMRD:: +int convert(PulseqDefinitions&) { + return 0; +} + +// no equivalent in ISMRMRD:: +int convert(std::vector&) { + return 0; +} + +// no equivalent in ISMRMRD::// +int convert(RFEvent&) { + return 0; +} + +// no equivalent in ISMRMRD:: +int convert(ArbitraryGradient&) { + return 0; +} + +// no equivalent in ISMRMRD:: +int convert(TrapezoidalGradient&) { + return 0; +} + +// no equivalent in ISMRMRD:: +int convert(ADCEvent&) { + return 0; +} + +// no equivalent in ISMRMRD:: +int convert(Shape&) { + 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..d1d3a79a 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,14 @@ int convert(AcquisitionBucket&); int convert(ReconData&); int convert(ImageArray&); int convert(ArrayComplexFloat&); +int convert(AcquisitionPrototype&); +int convert(PulseqDefinitions&); +int convert(std::vector&); +int convert(RFEvent&); +int convert(ArbitraryGradient&); +int convert(TrapezoidalGradient&); +int convert(ADCEvent&); +int convert(Shape&); Header convert(ISMRMRD::IsmrmrdHeader& hdr); Acquisition convert(ISMRMRD::Acquisition& acq); diff --git a/cpp/mrd/binary/protocols.cc b/cpp/mrd/binary/protocols.cc index 0c73ba12..fe32ea70 100644 --- a/cpp/mrd/binary/protocols.cc +++ b/cpp/mrd/binary/protocols.cc @@ -73,6 +73,17 @@ struct IsTriviallySerializable { offsetof(__T__, head) < offsetof(__T__, data) && offsetof(__T__, data) < offsetof(__T__, trajectory); }; +template <> +struct IsTriviallySerializable { + using __T__ = mrd::AcquisitionPrototype; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::head) + sizeof(__T__::data_sample_counts))) && + offsetof(__T__, head) < offsetof(__T__, data_sample_counts); +}; + template <> struct IsTriviallySerializable { using __T__ = mrd::SubjectInformationType; @@ -637,6 +648,122 @@ 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::PulseqDefinitions; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::gradient_raster_time) + sizeof(__T__::radiofrequency_raster_time) + sizeof(__T__::adc_raster_time) + sizeof(__T__::block_duration_raster) + sizeof(__T__::name) + sizeof(__T__::fov) + sizeof(__T__::total_duration) + sizeof(__T__::custom))) && + offsetof(__T__, gradient_raster_time) < offsetof(__T__, radiofrequency_raster_time) && offsetof(__T__, radiofrequency_raster_time) < offsetof(__T__, adc_raster_time) && offsetof(__T__, adc_raster_time) < offsetof(__T__, block_duration_raster) && offsetof(__T__, block_duration_raster) < offsetof(__T__, name) && offsetof(__T__, name) < offsetof(__T__, fov) && offsetof(__T__, fov) < offsetof(__T__, total_duration) && offsetof(__T__, total_duration) < offsetof(__T__, custom); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::Block; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::duration) + sizeof(__T__::rf) + sizeof(__T__::gx) + sizeof(__T__::gy) + sizeof(__T__::gz) + sizeof(__T__::adc) + sizeof(__T__::ext))) && + offsetof(__T__, id) < offsetof(__T__, duration) && offsetof(__T__, duration) < offsetof(__T__, rf) && offsetof(__T__, rf) < offsetof(__T__, gx) && offsetof(__T__, gx) < offsetof(__T__, gy) && offsetof(__T__, gy) < offsetof(__T__, gz) && offsetof(__T__, gz) < offsetof(__T__, adc) && offsetof(__T__, adc) < offsetof(__T__, ext); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::RFEvent; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::amp) + sizeof(__T__::mag_id) + sizeof(__T__::phase_id) + sizeof(__T__::time_id) + sizeof(__T__::center) + sizeof(__T__::delay) + sizeof(__T__::freq_ppm) + sizeof(__T__::phase_ppm) + sizeof(__T__::freq_offset) + sizeof(__T__::phase_offset) + sizeof(__T__::use))) && + offsetof(__T__, id) < offsetof(__T__, amp) && offsetof(__T__, amp) < offsetof(__T__, mag_id) && offsetof(__T__, mag_id) < offsetof(__T__, phase_id) && offsetof(__T__, phase_id) < offsetof(__T__, time_id) && offsetof(__T__, time_id) < offsetof(__T__, center) && offsetof(__T__, center) < offsetof(__T__, delay) && offsetof(__T__, delay) < offsetof(__T__, freq_ppm) && offsetof(__T__, freq_ppm) < offsetof(__T__, phase_ppm) && offsetof(__T__, phase_ppm) < offsetof(__T__, freq_offset) && offsetof(__T__, freq_offset) < offsetof(__T__, phase_offset) && offsetof(__T__, phase_offset) < offsetof(__T__, use); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::ArbitraryGradient; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::amp) + sizeof(__T__::first) + sizeof(__T__::last) + sizeof(__T__::shape_id) + sizeof(__T__::time_id) + sizeof(__T__::delay))) && + offsetof(__T__, id) < offsetof(__T__, amp) && offsetof(__T__, amp) < offsetof(__T__, first) && offsetof(__T__, first) < offsetof(__T__, last) && offsetof(__T__, last) < offsetof(__T__, shape_id) && offsetof(__T__, shape_id) < offsetof(__T__, time_id) && offsetof(__T__, time_id) < offsetof(__T__, delay); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::TrapezoidalGradient; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::amp) + sizeof(__T__::rise) + sizeof(__T__::flat) + sizeof(__T__::fall) + sizeof(__T__::delay))) && + offsetof(__T__, id) < offsetof(__T__, amp) && offsetof(__T__, amp) < offsetof(__T__, rise) && offsetof(__T__, rise) < offsetof(__T__, flat) && offsetof(__T__, flat) < offsetof(__T__, fall) && offsetof(__T__, fall) < offsetof(__T__, delay); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::ADCEvent; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::num) + sizeof(__T__::dwell) + sizeof(__T__::delay) + sizeof(__T__::freq_ppm) + sizeof(__T__::phase_ppm) + sizeof(__T__::freq) + sizeof(__T__::phase) + sizeof(__T__::phase_shape_id))) && + offsetof(__T__, id) < offsetof(__T__, num) && offsetof(__T__, num) < offsetof(__T__, dwell) && offsetof(__T__, dwell) < offsetof(__T__, delay) && offsetof(__T__, delay) < offsetof(__T__, freq_ppm) && offsetof(__T__, freq_ppm) < offsetof(__T__, phase_ppm) && offsetof(__T__, phase_ppm) < offsetof(__T__, freq) && offsetof(__T__, freq) < offsetof(__T__, phase) && offsetof(__T__, phase) < offsetof(__T__, phase_shape_id); +}; + +template <> +struct IsTriviallySerializable { + using __T__ = mrd::Shape; + static constexpr bool value = + std::is_standard_layout_v<__T__> && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + IsTriviallySerializable::value && + (sizeof(__T__) == (sizeof(__T__::id) + sizeof(__T__::num_samples) + sizeof(__T__::data))) && + offsetof(__T__, id) < offsetof(__T__, num_samples) && offsetof(__T__, num_samples) < offsetof(__T__, data); +}; + #ifndef _MSC_VER #pragma GCC diagnostic pop // #pragma GCC diagnostic ignored "-Winvalid-offsetof" #endif @@ -798,8 +925,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, typename T16, yardl::binary::Writer WriteT16, typename T17, yardl::binary::Writer WriteT17, typename T18, yardl::binary::Writer WriteT18, typename T19, yardl::binary::Writer WriteT19, typename T20, yardl::binary::Writer WriteT20, typename T21, yardl::binary::Writer WriteT21> +void WriteUnion(yardl::binary::CodedOutputStream& stream, std::variant const& value) { yardl::binary::WriteInteger(stream, value.index()); switch (value.index()) { case 0: { @@ -872,12 +999,52 @@ 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; + } + case 16: { + T16 const& v = std::get<16>(value); + WriteT16(stream, v); + break; + } + case 17: { + T17 const& v = std::get<17>(value); + WriteT17(stream, v); + break; + } + case 18: { + T18 const& v = std::get<18>(value); + WriteT18(stream, v); + break; + } + case 19: { + T19 const& v = std::get<19>(value); + WriteT19(stream, v); + break; + } + case 20: { + T20 const& v = std::get<20>(value); + WriteT20(stream, v); + break; + } + case 21: { + T21 const& v = std::get<21>(value); + WriteT21(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, typename T16, yardl::binary::Reader ReadT16, typename T17, yardl::binary::Reader ReadT17, typename T18, yardl::binary::Reader ReadT18, typename T19, yardl::binary::Reader ReadT19, typename T20, yardl::binary::Reader ReadT20, typename T21, yardl::binary::Reader ReadT21> +void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant& value) { size_t index; yardl::binary::ReadInteger(stream, index); switch (index) { @@ -965,6 +1132,54 @@ void ReadUnion(yardl::binary::CodedInputStream& stream, std::variant::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + mrd::binary::WriteAcquisitionHeader(stream, value.head); + yardl::binary::WriteNDArray(stream, value.data_sample_counts); +} + +[[maybe_unused]] void ReadAcquisitionPrototype(yardl::binary::CodedInputStream& stream, mrd::AcquisitionPrototype& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + mrd::binary::ReadAcquisitionHeader(stream, value.head); + yardl::binary::ReadNDArray(stream, value.data_sample_counts); +} + [[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 +2707,231 @@ template ReadT> mrd::binary::ReadArray, yardl::binary::ReadFloatingPoint>(stream, value); } +[[maybe_unused]] void WritePulseqDefinitions(yardl::binary::CodedOutputStream& stream, mrd::PulseqDefinitions const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteFloatingPoint(stream, value.gradient_raster_time); + yardl::binary::WriteFloatingPoint(stream, value.radiofrequency_raster_time); + yardl::binary::WriteFloatingPoint(stream, value.adc_raster_time); + yardl::binary::WriteFloatingPoint(stream, value.block_duration_raster); + yardl::binary::WriteOptional(stream, value.name); + yardl::binary::WriteOptional(stream, value.fov); + yardl::binary::WriteOptional(stream, value.total_duration); + yardl::binary::WriteMap(stream, value.custom); +} + +[[maybe_unused]] void ReadPulseqDefinitions(yardl::binary::CodedInputStream& stream, mrd::PulseqDefinitions& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadFloatingPoint(stream, value.gradient_raster_time); + yardl::binary::ReadFloatingPoint(stream, value.radiofrequency_raster_time); + yardl::binary::ReadFloatingPoint(stream, value.adc_raster_time); + yardl::binary::ReadFloatingPoint(stream, value.block_duration_raster); + yardl::binary::ReadOptional(stream, value.name); + yardl::binary::ReadOptional(stream, value.fov); + yardl::binary::ReadOptional(stream, value.total_duration); + yardl::binary::ReadMap(stream, value.custom); +} + +[[maybe_unused]] void WriteBlock(yardl::binary::CodedOutputStream& stream, mrd::Block const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteInteger(stream, value.duration); + yardl::binary::WriteInteger(stream, value.rf); + yardl::binary::WriteInteger(stream, value.gx); + yardl::binary::WriteInteger(stream, value.gy); + yardl::binary::WriteInteger(stream, value.gz); + yardl::binary::WriteInteger(stream, value.adc); + yardl::binary::WriteInteger(stream, value.ext); +} + +[[maybe_unused]] void ReadBlock(yardl::binary::CodedInputStream& stream, mrd::Block& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadInteger(stream, value.duration); + yardl::binary::ReadInteger(stream, value.rf); + yardl::binary::ReadInteger(stream, value.gx); + yardl::binary::ReadInteger(stream, value.gy); + yardl::binary::ReadInteger(stream, value.gz); + yardl::binary::ReadInteger(stream, value.adc); + yardl::binary::ReadInteger(stream, value.ext); +} + +[[maybe_unused]] void WriteRFEvent(yardl::binary::CodedOutputStream& stream, mrd::RFEvent const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteFloatingPoint(stream, value.amp); + yardl::binary::WriteInteger(stream, value.mag_id); + yardl::binary::WriteInteger(stream, value.phase_id); + yardl::binary::WriteInteger(stream, value.time_id); + yardl::binary::WriteFloatingPoint(stream, value.center); + yardl::binary::WriteInteger(stream, value.delay); + yardl::binary::WriteFloatingPoint(stream, value.freq_ppm); + yardl::binary::WriteFloatingPoint(stream, value.phase_ppm); + yardl::binary::WriteFloatingPoint(stream, value.freq_offset); + yardl::binary::WriteFloatingPoint(stream, value.phase_offset); + yardl::binary::WriteEnum(stream, value.use); +} + +[[maybe_unused]] void ReadRFEvent(yardl::binary::CodedInputStream& stream, mrd::RFEvent& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadFloatingPoint(stream, value.amp); + yardl::binary::ReadInteger(stream, value.mag_id); + yardl::binary::ReadInteger(stream, value.phase_id); + yardl::binary::ReadInteger(stream, value.time_id); + yardl::binary::ReadFloatingPoint(stream, value.center); + yardl::binary::ReadInteger(stream, value.delay); + yardl::binary::ReadFloatingPoint(stream, value.freq_ppm); + yardl::binary::ReadFloatingPoint(stream, value.phase_ppm); + yardl::binary::ReadFloatingPoint(stream, value.freq_offset); + yardl::binary::ReadFloatingPoint(stream, value.phase_offset); + yardl::binary::ReadEnum(stream, value.use); +} + +[[maybe_unused]] void WriteArbitraryGradient(yardl::binary::CodedOutputStream& stream, mrd::ArbitraryGradient const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteFloatingPoint(stream, value.amp); + yardl::binary::WriteFloatingPoint(stream, value.first); + yardl::binary::WriteFloatingPoint(stream, value.last); + yardl::binary::WriteInteger(stream, value.shape_id); + yardl::binary::WriteInteger(stream, value.time_id); + yardl::binary::WriteInteger(stream, value.delay); +} + +[[maybe_unused]] void ReadArbitraryGradient(yardl::binary::CodedInputStream& stream, mrd::ArbitraryGradient& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadFloatingPoint(stream, value.amp); + yardl::binary::ReadFloatingPoint(stream, value.first); + yardl::binary::ReadFloatingPoint(stream, value.last); + yardl::binary::ReadInteger(stream, value.shape_id); + yardl::binary::ReadInteger(stream, value.time_id); + yardl::binary::ReadInteger(stream, value.delay); +} + +[[maybe_unused]] void WriteTrapezoidalGradient(yardl::binary::CodedOutputStream& stream, mrd::TrapezoidalGradient const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteFloatingPoint(stream, value.amp); + yardl::binary::WriteInteger(stream, value.rise); + yardl::binary::WriteInteger(stream, value.flat); + yardl::binary::WriteInteger(stream, value.fall); + yardl::binary::WriteInteger(stream, value.delay); +} + +[[maybe_unused]] void ReadTrapezoidalGradient(yardl::binary::CodedInputStream& stream, mrd::TrapezoidalGradient& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadFloatingPoint(stream, value.amp); + yardl::binary::ReadInteger(stream, value.rise); + yardl::binary::ReadInteger(stream, value.flat); + yardl::binary::ReadInteger(stream, value.fall); + yardl::binary::ReadInteger(stream, value.delay); +} + +[[maybe_unused]] void WriteADCEvent(yardl::binary::CodedOutputStream& stream, mrd::ADCEvent const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteInteger(stream, value.num); + yardl::binary::WriteFloatingPoint(stream, value.dwell); + yardl::binary::WriteInteger(stream, value.delay); + yardl::binary::WriteFloatingPoint(stream, value.freq_ppm); + yardl::binary::WriteFloatingPoint(stream, value.phase_ppm); + yardl::binary::WriteFloatingPoint(stream, value.freq); + yardl::binary::WriteFloatingPoint(stream, value.phase); + yardl::binary::WriteInteger(stream, value.phase_shape_id); +} + +[[maybe_unused]] void ReadADCEvent(yardl::binary::CodedInputStream& stream, mrd::ADCEvent& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadInteger(stream, value.num); + yardl::binary::ReadFloatingPoint(stream, value.dwell); + yardl::binary::ReadInteger(stream, value.delay); + yardl::binary::ReadFloatingPoint(stream, value.freq_ppm); + yardl::binary::ReadFloatingPoint(stream, value.phase_ppm); + yardl::binary::ReadFloatingPoint(stream, value.freq); + yardl::binary::ReadFloatingPoint(stream, value.phase); + yardl::binary::ReadInteger(stream, value.phase_shape_id); +} + +[[maybe_unused]] void WriteShape(yardl::binary::CodedOutputStream& stream, mrd::Shape const& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::WriteTriviallySerializable(stream, value); + return; + } + + yardl::binary::WriteInteger(stream, value.id); + yardl::binary::WriteInteger(stream, value.num_samples); + yardl::binary::WriteNDArray(stream, value.data); +} + +[[maybe_unused]] void ReadShape(yardl::binary::CodedInputStream& stream, mrd::Shape& value) { + if constexpr (yardl::binary::IsTriviallySerializable::value) { + yardl::binary::ReadTriviallySerializable(stream, value); + return; + } + + yardl::binary::ReadInteger(stream, value.id); + yardl::binary::ReadInteger(stream, value.num_samples); + yardl::binary::ReadNDArray(stream, value.data); +} + [[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, yardl::binary::WriteVector, mrd::RFEvent, mrd::binary::WriteRFEvent, mrd::ArbitraryGradient, mrd::binary::WriteArbitraryGradient, mrd::TrapezoidalGradient, mrd::binary::WriteTrapezoidalGradient, mrd::ADCEvent, mrd::binary::WriteADCEvent, mrd::Shape, mrd::binary::WriteShape>(stream, value); } [[maybe_unused]] void ReadStreamItem(yardl::binary::CodedInputStream& stream, mrd::StreamItem& value) { @@ -2487,7 +2940,7 @@ template ReadT> return; } - ReadUnion(stream, value); + ReadUnion, yardl::binary::ReadVector, mrd::RFEvent, mrd::binary::ReadRFEvent, mrd::ArbitraryGradient, mrd::binary::ReadArbitraryGradient, mrd::TrapezoidalGradient, mrd::binary::ReadTrapezoidalGradient, mrd::ADCEvent, mrd::binary::ReadADCEvent, mrd::Shape, mrd::binary::ReadShape>(stream, value); } } // namespace diff --git a/cpp/mrd/hdf5/protocols.cc b/cpp/mrd/hdf5/protocols.cc index b333f6fd..50b046b3 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 InnerUnion22 { public: - InnerUnion14() : type_index_(-1) {} - InnerUnion14(std::variant const& v) : type_index_(static_cast(v.index())) { + InnerUnion22() : type_index_(-1) {} + InnerUnion22(std::variant const& v) : type_index_(static_cast(v.index())) { Init(v); } - InnerUnion14(std::variant const& v) : type_index_(static_cast(v.index()) - 1) { + InnerUnion22(std::variant const& v) : type_index_(static_cast(v.index()) - 1) { Init(v); } - InnerUnion14(InnerUnion14 const& v) = delete; + InnerUnion22(InnerUnion22 const& v) = delete; - InnerUnion14 operator=(InnerUnion14 const&) = delete; + InnerUnion22 operator=(InnerUnion22 const&) = delete; - ~InnerUnion14() { + ~InnerUnion22() { switch (type_index_) { case 0: value0_.~TInner0(); @@ -372,14 +372,38 @@ class InnerUnion14 { case 13: value13_.~TInner13(); break; + case 14: + value14_.~TInner14(); + break; + case 15: + value15_.~TInner15(); + break; + case 16: + value16_.~TInner16(); + break; + case 17: + value17_.~TInner17(); + break; + case 18: + value18_.~TInner18(); + break; + case 19: + value19_.~TInner19(); + break; + case 20: + value20_.~TInner20(); + break; + case 21: + value21_.~TInner21(); + 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 +464,38 @@ class InnerUnion14 { char empty13_[sizeof(TInner13)]{}; TInner13 value13_; }; + union { + char empty14_[sizeof(TInner14)]{}; + TInner14 value14_; + }; + union { + char empty15_[sizeof(TInner15)]{}; + TInner15 value15_; + }; + union { + char empty16_[sizeof(TInner16)]{}; + TInner16 value16_; + }; + union { + char empty17_[sizeof(TInner17)]{}; + TInner17 value17_; + }; + union { + char empty18_[sizeof(TInner18)]{}; + TInner18 value18_; + }; + union { + char empty19_[sizeof(TInner19)]{}; + TInner19 value19_; + }; + union { + char empty20_[sizeof(TInner20)]{}; + TInner20 value20_; + }; + union { + char empty21_[sizeof(TInner21)]{}; + TInner21 value21_; + }; private: template @@ -488,6 +544,30 @@ 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; + case 16: + new (&value16_) TInner16(std::get<16 + offset>(v)); + return; + case 17: + new (&value17_) TInner17(std::get<17 + offset>(v)); + return; + case 18: + new (&value18_) TInner18(std::get<18 + offset>(v)); + return; + case 19: + new (&value19_) TInner19(std::get<19 + offset>(v)); + return; + case 20: + new (&value20_) TInner20(std::get<20 + offset>(v)); + return; + case 21: + new (&value21_) TInner21(std::get<21 + offset>(v)); + return; } } @@ -556,6 +636,38 @@ 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; + case 16: + o.template emplace<16 + offset>(); + yardl::hdf5::ToOuter(value16_, std::get<16 + offset>(o)); + return; + case 17: + o.template emplace<17 + offset>(); + yardl::hdf5::ToOuter(value17_, std::get<17 + offset>(o)); + return; + case 18: + o.template emplace<18 + offset>(); + yardl::hdf5::ToOuter(value18_, std::get<18 + offset>(o)); + return; + case 19: + o.template emplace<19 + offset>(); + yardl::hdf5::ToOuter(value19_, std::get<19 + offset>(o)); + return; + case 20: + o.template emplace<20 + offset>(); + yardl::hdf5::ToOuter(value20_, std::get<20 + offset>(o)); + return; + case 21: + o.template emplace<21 + offset>(); + yardl::hdf5::ToOuter(value21_, std::get<21 + offset>(o)); + return; } throw std::runtime_error("unrecognized type variant type index " + std::to_string(type_index_)); } @@ -570,11 +682,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 InnerUnion22Ddl(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, H5::DataType const& t16, std::string const& tag16, H5::DataType const& t17, std::string const& tag17, H5::DataType const& t18, std::string const& tag18, H5::DataType const& t19, std::string const& tag19, H5::DataType const& t20, std::string const& tag20, H5::DataType const& t21, std::string const& tag21) { + using UnionType = ::InnerUnion22; 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, tag16, tag17, tag18, tag19, tag20, tag21)); rtn.insertMember(tag0, HOFFSET(UnionType, value0_), t0); rtn.insertMember(tag1, HOFFSET(UnionType, value1_), t1); rtn.insertMember(tag2, HOFFSET(UnionType, value2_), t2); @@ -589,6 +701,14 @@ 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); + rtn.insertMember(tag16, HOFFSET(UnionType, value16_), t16); + rtn.insertMember(tag17, HOFFSET(UnionType, value17_), t17); + rtn.insertMember(tag18, HOFFSET(UnionType, value18_), t18); + rtn.insertMember(tag19, HOFFSET(UnionType, value19_), t19); + rtn.insertMember(tag20, HOFFSET(UnionType, value20_), t20); + rtn.insertMember(tag21, HOFFSET(UnionType, value21_), t21); return rtn; } } @@ -752,6 +872,25 @@ namespace { return t; } +[[maybe_unused]] H5::EnumType GetRFPulseUseHdf5Ddl() { + H5::EnumType t(H5::PredType::NATIVE_INT32); + int32_t i = 0; + t.insert("undefined", &i); + i = 1; + t.insert("excitation", &i); + i = 2; + t.insert("refocusing", &i); + i = 3; + t.insert("inversion", &i); + i = 4; + t.insert("saturation", &i); + i = 5; + t.insert("preparation", &i); + i = 6; + t.insert("other", &i); + return t; +} + struct _Inner_EncodingCounters { _Inner_EncodingCounters() {} _Inner_EncodingCounters(mrd::EncodingCounters const& o) @@ -878,6 +1017,22 @@ struct _Inner_Acquisition { yardl::hdf5::InnerNdArray trajectory; }; +struct _Inner_AcquisitionPrototype { + _Inner_AcquisitionPrototype() {} + _Inner_AcquisitionPrototype(mrd::AcquisitionPrototype const& o) + : head(o.head), + data_sample_counts(o.data_sample_counts) { + } + + void ToOuter (mrd::AcquisitionPrototype& o) const { + yardl::hdf5::ToOuter(head, o.head); + yardl::hdf5::ToOuter(data_sample_counts, o.data_sample_counts); + } + + mrd::hdf5::_Inner_AcquisitionHeader head; + yardl::hdf5::InnerVlen data_sample_counts; +}; + struct _Inner_SubjectInformationType { _Inner_SubjectInformationType() {} _Inner_SubjectInformationType(mrd::SubjectInformationType const& o) @@ -1687,6 +1842,59 @@ struct _Inner_ImageArray { yardl::hdf5::InnerVlen, mrd::WaveformUint32> waveforms; }; +struct _Inner_PulseqDefinitions { + _Inner_PulseqDefinitions() {} + _Inner_PulseqDefinitions(mrd::PulseqDefinitions const& o) + : gradient_raster_time(o.gradient_raster_time), + radiofrequency_raster_time(o.radiofrequency_raster_time), + adc_raster_time(o.adc_raster_time), + block_duration_raster(o.block_duration_raster), + name(o.name), + fov(o.fov), + total_duration(o.total_duration), + custom(o.custom) { + } + + void ToOuter (mrd::PulseqDefinitions& o) const { + yardl::hdf5::ToOuter(gradient_raster_time, o.gradient_raster_time); + yardl::hdf5::ToOuter(radiofrequency_raster_time, o.radiofrequency_raster_time); + yardl::hdf5::ToOuter(adc_raster_time, o.adc_raster_time); + yardl::hdf5::ToOuter(block_duration_raster, o.block_duration_raster); + yardl::hdf5::ToOuter(name, o.name); + yardl::hdf5::ToOuter(fov, o.fov); + yardl::hdf5::ToOuter(total_duration, o.total_duration); + yardl::hdf5::ToOuter(custom, o.custom); + } + + double gradient_raster_time; + double radiofrequency_raster_time; + double adc_raster_time; + double block_duration_raster; + yardl::hdf5::InnerOptional name; + yardl::hdf5::InnerOptional fov; + yardl::hdf5::InnerOptional total_duration; + yardl::hdf5::InnerMap custom; +}; + +struct _Inner_Shape { + _Inner_Shape() {} + _Inner_Shape(mrd::Shape const& o) + : id(o.id), + num_samples(o.num_samples), + data(o.data) { + } + + void ToOuter (mrd::Shape& o) const { + yardl::hdf5::ToOuter(id, o.id); + yardl::hdf5::ToOuter(num_samples, o.num_samples); + yardl::hdf5::ToOuter(data, o.data); + } + + int32_t id; + uint64_t num_samples; + yardl::hdf5::InnerVlen data; +}; + [[maybe_unused]] H5::CompType GetEncodingCountersHdf5Ddl() { using RecordType = mrd::hdf5::_Inner_EncodingCounters; H5::CompType t(sizeof(RecordType)); @@ -1737,6 +1945,14 @@ struct _Inner_ImageArray { return t; } +[[maybe_unused]] H5::CompType GetAcquisitionPrototypeHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_AcquisitionPrototype; + H5::CompType t(sizeof(RecordType)); + t.insertMember("head", HOFFSET(RecordType, head), mrd::hdf5::GetAcquisitionHeaderHdf5Ddl()); + t.insertMember("dataSampleCounts", HOFFSET(RecordType, data_sample_counts), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_UINT32)); + return t; +} + [[maybe_unused]] H5::CompType GetSubjectInformationTypeHdf5Ddl() { using RecordType = mrd::hdf5::_Inner_SubjectInformationType; H5::CompType t(sizeof(RecordType)); @@ -2184,6 +2400,101 @@ template return t; } +[[maybe_unused]] H5::CompType GetPulseqDefinitionsHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_PulseqDefinitions; + H5::CompType t(sizeof(RecordType)); + t.insertMember("gradientRasterTime", HOFFSET(RecordType, gradient_raster_time), H5::PredType::NATIVE_DOUBLE); + t.insertMember("radiofrequencyRasterTime", HOFFSET(RecordType, radiofrequency_raster_time), H5::PredType::NATIVE_DOUBLE); + t.insertMember("adcRasterTime", HOFFSET(RecordType, adc_raster_time), H5::PredType::NATIVE_DOUBLE); + t.insertMember("blockDurationRaster", HOFFSET(RecordType, block_duration_raster), H5::PredType::NATIVE_DOUBLE); + t.insertMember("name", HOFFSET(RecordType, name), yardl::hdf5::OptionalTypeDdl(yardl::hdf5::InnerVlenStringDdl())); + t.insertMember("fov", HOFFSET(RecordType, fov), yardl::hdf5::OptionalTypeDdl(mrd::hdf5::GetThreeDimensionalFloatHdf5Ddl())); + t.insertMember("totalDuration", HOFFSET(RecordType, total_duration), yardl::hdf5::OptionalTypeDdl(H5::PredType::NATIVE_DOUBLE)); + t.insertMember("custom", HOFFSET(RecordType, custom), yardl::hdf5::InnerMapDdl(yardl::hdf5::InnerVlenStringDdl(), yardl::hdf5::InnerVlenStringDdl())); + return t; +} + +[[maybe_unused]] H5::CompType GetBlockHdf5Ddl() { + using RecordType = mrd::Block; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("duration", HOFFSET(RecordType, duration), H5::PredType::NATIVE_UINT64); + t.insertMember("rf", HOFFSET(RecordType, rf), H5::PredType::NATIVE_INT32); + t.insertMember("gx", HOFFSET(RecordType, gx), H5::PredType::NATIVE_INT32); + t.insertMember("gy", HOFFSET(RecordType, gy), H5::PredType::NATIVE_INT32); + t.insertMember("gz", HOFFSET(RecordType, gz), H5::PredType::NATIVE_INT32); + t.insertMember("adc", HOFFSET(RecordType, adc), H5::PredType::NATIVE_INT32); + t.insertMember("ext", HOFFSET(RecordType, ext), H5::PredType::NATIVE_INT32); + return t; +} + +[[maybe_unused]] H5::CompType GetRFEventHdf5Ddl() { + using RecordType = mrd::RFEvent; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("amp", HOFFSET(RecordType, amp), H5::PredType::NATIVE_DOUBLE); + t.insertMember("magId", HOFFSET(RecordType, mag_id), H5::PredType::NATIVE_INT32); + t.insertMember("phaseId", HOFFSET(RecordType, phase_id), H5::PredType::NATIVE_INT32); + t.insertMember("timeId", HOFFSET(RecordType, time_id), H5::PredType::NATIVE_INT32); + t.insertMember("center", HOFFSET(RecordType, center), H5::PredType::NATIVE_DOUBLE); + t.insertMember("delay", HOFFSET(RecordType, delay), H5::PredType::NATIVE_UINT64); + t.insertMember("freqPPM", HOFFSET(RecordType, freq_ppm), H5::PredType::NATIVE_DOUBLE); + t.insertMember("phasePPM", HOFFSET(RecordType, phase_ppm), H5::PredType::NATIVE_DOUBLE); + t.insertMember("freqOffset", HOFFSET(RecordType, freq_offset), H5::PredType::NATIVE_DOUBLE); + t.insertMember("phaseOffset", HOFFSET(RecordType, phase_offset), H5::PredType::NATIVE_DOUBLE); + t.insertMember("use", HOFFSET(RecordType, use), mrd::hdf5::GetRFPulseUseHdf5Ddl()); + return t; +} + +[[maybe_unused]] H5::CompType GetArbitraryGradientHdf5Ddl() { + using RecordType = mrd::ArbitraryGradient; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("amp", HOFFSET(RecordType, amp), H5::PredType::NATIVE_DOUBLE); + t.insertMember("first", HOFFSET(RecordType, first), H5::PredType::NATIVE_DOUBLE); + t.insertMember("last", HOFFSET(RecordType, last), H5::PredType::NATIVE_DOUBLE); + t.insertMember("shapeId", HOFFSET(RecordType, shape_id), H5::PredType::NATIVE_INT32); + t.insertMember("timeId", HOFFSET(RecordType, time_id), H5::PredType::NATIVE_INT32); + t.insertMember("delay", HOFFSET(RecordType, delay), H5::PredType::NATIVE_UINT64); + return t; +} + +[[maybe_unused]] H5::CompType GetTrapezoidalGradientHdf5Ddl() { + using RecordType = mrd::TrapezoidalGradient; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("amp", HOFFSET(RecordType, amp), H5::PredType::NATIVE_DOUBLE); + t.insertMember("rise", HOFFSET(RecordType, rise), H5::PredType::NATIVE_UINT64); + t.insertMember("flat", HOFFSET(RecordType, flat), H5::PredType::NATIVE_UINT64); + t.insertMember("fall", HOFFSET(RecordType, fall), H5::PredType::NATIVE_UINT64); + t.insertMember("delay", HOFFSET(RecordType, delay), H5::PredType::NATIVE_UINT64); + return t; +} + +[[maybe_unused]] H5::CompType GetADCEventHdf5Ddl() { + using RecordType = mrd::ADCEvent; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("num", HOFFSET(RecordType, num), H5::PredType::NATIVE_UINT64); + t.insertMember("dwell", HOFFSET(RecordType, dwell), H5::PredType::NATIVE_FLOAT); + t.insertMember("delay", HOFFSET(RecordType, delay), H5::PredType::NATIVE_UINT64); + t.insertMember("freqPPM", HOFFSET(RecordType, freq_ppm), H5::PredType::NATIVE_DOUBLE); + t.insertMember("phasePPM", HOFFSET(RecordType, phase_ppm), H5::PredType::NATIVE_DOUBLE); + t.insertMember("freq", HOFFSET(RecordType, freq), H5::PredType::NATIVE_DOUBLE); + t.insertMember("phase", HOFFSET(RecordType, phase), H5::PredType::NATIVE_DOUBLE); + t.insertMember("phaseShapeId", HOFFSET(RecordType, phase_shape_id), H5::PredType::NATIVE_INT32); + return t; +} + +[[maybe_unused]] H5::CompType GetShapeHdf5Ddl() { + using RecordType = mrd::hdf5::_Inner_Shape; + H5::CompType t(sizeof(RecordType)); + t.insertMember("id", HOFFSET(RecordType, id), H5::PredType::NATIVE_INT32); + t.insertMember("numSamples", HOFFSET(RecordType, num_samples), H5::PredType::NATIVE_UINT64); + t.insertMember("data", HOFFSET(RecordType, data), yardl::hdf5::InnerVlenDdl(H5::PredType::NATIVE_DOUBLE)); + return t; +} + } // namespace MrdWriter::MrdWriter(std::string path) @@ -2196,7 +2507,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(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionPrototypeHdf5Ddl(), "acquisitionPrototype", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "waveformUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "imageUint16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "imageInt16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "imageUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "imageInt32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "imageFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "imageDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "acquisitionBucket", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "reconData", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "arrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "imageArray", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetPulseqDefinitionsHdf5Ddl(), "pulseqDefinitions", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::InnerVlenDdl(mrd::hdf5::GetBlockHdf5Ddl()), "blocks", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetRFEventHdf5Ddl(), "rf", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetArbitraryGradientHdf5Ddl(), "arbitraryGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetTrapezoidalGradientHdf5Ddl(), "trapezoidalGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetADCEventHdf5Ddl(), "adc", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetShapeHdf5Ddl(), "shape", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>))))); } std::visit( @@ -2204,6 +2515,8 @@ 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, mrd::WaveformUint32>(static_cast(value.index()), arg); } else if constexpr (std::is_same_v) { @@ -2230,6 +2543,20 @@ void MrdWriter::WriteDataImpl(mrd::StreamItem const& value) { data_dataset_state_->Append, std::complex>, mrd::ArrayComplexFloat>(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, std::vector>(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(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 { static_assert(yardl::hdf5::always_false_v, "non-exhaustive visitor!"); } @@ -2239,7 +2566,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(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionPrototypeHdf5Ddl(), "acquisitionPrototype", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "waveformUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "imageUint16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "imageInt16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "imageUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "imageInt32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "imageFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "imageDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "acquisitionBucket", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "reconData", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "arrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "imageArray", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetPulseqDefinitionsHdf5Ddl(), "pulseqDefinitions", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::InnerVlenDdl(mrd::hdf5::GetBlockHdf5Ddl()), "blocks", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetRFEventHdf5Ddl(), "rf", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetArbitraryGradientHdf5Ddl(), "arbitraryGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetTrapezoidalGradientHdf5Ddl(), "trapezoidalGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetADCEventHdf5Ddl(), "adc", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetShapeHdf5Ddl(), "shape", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>))))); } data_dataset_state_.reset(); @@ -2261,7 +2588,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(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionPrototypeHdf5Ddl(), "acquisitionPrototype", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetWaveformHdf5Ddl(H5::PredType::NATIVE_UINT32), "waveformUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT16), "imageUint16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT16), "imageInt16", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_UINT32), "imageUint32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_INT32), "imageInt32", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_FLOAT), "imageFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl(H5::PredType::NATIVE_DOUBLE), "imageDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageHdf5Ddl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "imageComplexDouble", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetAcquisitionBucketHdf5Ddl(), "acquisitionBucket", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetReconDataHdf5Ddl(), "reconData", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::DynamicNDArrayDdl, std::complex>(yardl::hdf5::ComplexTypeDdl()), "arrayComplexFloat", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetImageArrayHdf5Ddl(), "imageArray", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetPulseqDefinitionsHdf5Ddl(), "pulseqDefinitions", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(yardl::hdf5::InnerVlenDdl(mrd::hdf5::GetBlockHdf5Ddl()), "blocks", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetRFEventHdf5Ddl(), "rf", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetArbitraryGradientHdf5Ddl(), "arbitraryGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetTrapezoidalGradientHdf5Ddl(), "trapezoidalGradient", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetADCEventHdf5Ddl(), "adc", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>)))), std::make_tuple(mrd::hdf5::GetShapeHdf5Ddl(), "shape", static_cast(std::max(sizeof(::InnerUnion22, 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, mrd::hdf5::_Inner_PulseqDefinitions, mrd::PulseqDefinitions, yardl::hdf5::InnerVlen, std::vector, mrd::RFEvent, mrd::RFEvent, mrd::ArbitraryGradient, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::ADCEvent, mrd::hdf5::_Inner_Shape, mrd::Shape>), sizeof(std::variant, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>))))); } auto [has_result, type_index, reader] = data_dataset_state_->ReadIndex(); @@ -2277,70 +2604,110 @@ bool MrdReader::ReadDataImpl(mrd::StreamItem& value) { break; } case 1: { - mrd::WaveformUint32& ref = value.emplace<1>(); - reader->Read, mrd::WaveformUint32>(ref); + mrd::AcquisitionPrototype& ref = value.emplace<1>(); + reader->Read(ref); break; } case 2: { - mrd::ImageUint16& ref = value.emplace<2>(); - reader->Read, mrd::ImageUint16>(ref); + mrd::WaveformUint32& ref = value.emplace<2>(); + reader->Read, mrd::WaveformUint32>(ref); break; } case 3: { - mrd::ImageInt16& ref = value.emplace<3>(); - reader->Read, mrd::ImageInt16>(ref); + mrd::ImageUint16& ref = value.emplace<3>(); + reader->Read, mrd::ImageUint16>(ref); break; } case 4: { - mrd::ImageUint32& ref = value.emplace<4>(); - reader->Read, mrd::ImageUint32>(ref); + mrd::ImageInt16& ref = value.emplace<4>(); + reader->Read, mrd::ImageInt16>(ref); break; } case 5: { - mrd::ImageInt32& ref = value.emplace<5>(); - reader->Read, mrd::ImageInt32>(ref); + mrd::ImageUint32& ref = value.emplace<5>(); + reader->Read, mrd::ImageUint32>(ref); break; } case 6: { - mrd::ImageFloat& ref = value.emplace<6>(); - reader->Read, mrd::ImageFloat>(ref); + mrd::ImageInt32& ref = value.emplace<6>(); + reader->Read, mrd::ImageInt32>(ref); break; } case 7: { - mrd::ImageDouble& ref = value.emplace<7>(); - reader->Read, mrd::ImageDouble>(ref); + mrd::ImageFloat& ref = value.emplace<7>(); + reader->Read, mrd::ImageFloat>(ref); break; } case 8: { - mrd::ImageComplexFloat& ref = value.emplace<8>(); - reader->Read, std::complex>, mrd::ImageComplexFloat>(ref); + mrd::ImageDouble& ref = value.emplace<8>(); + reader->Read, mrd::ImageDouble>(ref); break; } case 9: { - mrd::ImageComplexDouble& ref = value.emplace<9>(); - reader->Read, std::complex>, mrd::ImageComplexDouble>(ref); + mrd::ImageComplexFloat& ref = value.emplace<9>(); + reader->Read, std::complex>, mrd::ImageComplexFloat>(ref); break; } case 10: { - mrd::AcquisitionBucket& ref = value.emplace<10>(); - reader->Read(ref); + mrd::ImageComplexDouble& ref = value.emplace<10>(); + reader->Read, std::complex>, mrd::ImageComplexDouble>(ref); break; } case 11: { - mrd::ReconData& ref = value.emplace<11>(); - reader->Read(ref); + mrd::AcquisitionBucket& ref = value.emplace<11>(); + reader->Read(ref); break; } case 12: { - mrd::ArrayComplexFloat& ref = value.emplace<12>(); - reader->Read, std::complex>, mrd::ArrayComplexFloat>(ref); + mrd::ReconData& ref = value.emplace<12>(); + reader->Read(ref); break; } case 13: { - mrd::ImageArray& ref = value.emplace<13>(); + mrd::ArrayComplexFloat& ref = value.emplace<13>(); + reader->Read, std::complex>, mrd::ArrayComplexFloat>(ref); + break; + } + case 14: { + mrd::ImageArray& ref = value.emplace<14>(); reader->Read(ref); break; } + case 15: { + mrd::PulseqDefinitions& ref = value.emplace<15>(); + reader->Read(ref); + break; + } + case 16: { + std::vector& ref = value.emplace<16>(); + reader->Read, std::vector>(ref); + break; + } + case 17: { + mrd::RFEvent& ref = value.emplace<17>(); + reader->Read(ref); + break; + } + case 18: { + mrd::ArbitraryGradient& ref = value.emplace<18>(); + reader->Read(ref); + break; + } + case 19: { + mrd::TrapezoidalGradient& ref = value.emplace<19>(); + reader->Read(ref); + break; + } + case 20: { + mrd::ADCEvent& ref = value.emplace<20>(); + reader->Read(ref); + break; + } + case 21: { + mrd::Shape& ref = value.emplace<21>(); + reader->Read(ref); + break; + } } return true; diff --git a/cpp/mrd/hdf5/protocols.h b/cpp/mrd/hdf5/protocols.h index 1822992f..bb64d3fa 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 70357602..38a0a0bc 100644 --- a/cpp/mrd/ndjson/protocols.cc +++ b/cpp/mrd/ndjson/protocols.cc @@ -18,6 +18,9 @@ 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::AcquisitionPrototype const& value); +void from_json(ordered_json const& j, mrd::AcquisitionPrototype& value); + void to_json(ordered_json& j, mrd::PatientGender const& value); void from_json(ordered_json const& j, mrd::PatientGender& value); @@ -175,6 +178,30 @@ 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::PulseqDefinitions const& value); +void from_json(ordered_json const& j, mrd::PulseqDefinitions& value); + +void to_json(ordered_json& j, mrd::Block const& value); +void from_json(ordered_json const& j, mrd::Block& value); + +void to_json(ordered_json& j, mrd::RFPulseUse const& value); +void from_json(ordered_json const& j, mrd::RFPulseUse& value); + +void to_json(ordered_json& j, mrd::RFEvent const& value); +void from_json(ordered_json const& j, mrd::RFEvent& value); + +void to_json(ordered_json& j, mrd::ArbitraryGradient const& value); +void from_json(ordered_json const& j, mrd::ArbitraryGradient& value); + +void to_json(ordered_json& j, mrd::TrapezoidalGradient const& value); +void from_json(ordered_json const& j, mrd::TrapezoidalGradient& value); + +void to_json(ordered_json& j, mrd::ADCEvent const& value); +void from_json(ordered_json const& j, mrd::ADCEvent& value); + +void to_json(ordered_json& j, mrd::Shape const& value); +void from_json(ordered_json const& j, mrd::Shape& value); + } // namespace mrd NLOHMANN_JSON_NAMESPACE_BEGIN @@ -287,115 +314,171 @@ 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, mrd::PulseqDefinitions, std::vector, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>> { + 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, mrd::PulseqDefinitions, std::vector, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape> const& value) { switch (value.index()) { case 0: - j = ordered_json{ {"Acquisition", std::get(value)} }; + j = ordered_json{ {"acquisition", std::get(value)} }; break; case 1: - j = ordered_json{ {"WaveformUint32", std::get>(value)} }; + j = ordered_json{ {"acquisitionPrototype", std::get(value)} }; break; case 2: - j = ordered_json{ {"ImageUint16", std::get>(value)} }; + j = ordered_json{ {"waveformUint32", std::get>(value)} }; break; case 3: - j = ordered_json{ {"ImageInt16", std::get>(value)} }; + j = ordered_json{ {"imageUint16", std::get>(value)} }; break; case 4: - j = ordered_json{ {"ImageUint32", std::get>(value)} }; + j = ordered_json{ {"imageInt16", std::get>(value)} }; break; case 5: - j = ordered_json{ {"ImageInt32", std::get>(value)} }; + j = ordered_json{ {"imageUint32", std::get>(value)} }; break; case 6: - j = ordered_json{ {"ImageFloat", std::get>(value)} }; + j = ordered_json{ {"imageInt32", std::get>(value)} }; break; case 7: - j = ordered_json{ {"ImageDouble", std::get>(value)} }; + j = ordered_json{ {"imageFloat", std::get>(value)} }; break; case 8: - j = ordered_json{ {"ImageComplexFloat", std::get>>(value)} }; + j = ordered_json{ {"imageDouble", std::get>(value)} }; break; case 9: - j = ordered_json{ {"ImageComplexDouble", std::get>>(value)} }; + j = ordered_json{ {"imageComplexFloat", std::get>>(value)} }; break; case 10: - j = ordered_json{ {"AcquisitionBucket", std::get(value)} }; + j = ordered_json{ {"imageComplexDouble", std::get>>(value)} }; break; case 11: - j = ordered_json{ {"ReconData", std::get(value)} }; + j = ordered_json{ {"acquisitionBucket", std::get(value)} }; break; case 12: - j = ordered_json{ {"ArrayComplexFloat", std::get>>(value)} }; + j = ordered_json{ {"reconData", std::get(value)} }; break; case 13: - j = ordered_json{ {"ImageArray", std::get(value)} }; + j = ordered_json{ {"arrayComplexFloat", std::get>>(value)} }; + break; + case 14: + j = ordered_json{ {"imageArray", std::get(value)} }; + break; + case 15: + j = ordered_json{ {"pulseqDefinitions", std::get(value)} }; + break; + case 16: + j = ordered_json{ {"blocks", std::get>(value)} }; + break; + case 17: + j = ordered_json{ {"rf", std::get(value)} }; + break; + case 18: + j = ordered_json{ {"arbitraryGradient", std::get(value)} }; + break; + case 19: + j = ordered_json{ {"trapezoidalGradient", std::get(value)} }; + break; + case 20: + j = ordered_json{ {"adc", std::get(value)} }; + break; + case 21: + j = ordered_json{ {"shape", std::get(value)} }; break; default: throw std::runtime_error("Invalid union 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) { + 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, mrd::PulseqDefinitions, std::vector, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>& value) { auto it = j.begin(); std::string tag = it.key(); - if (tag == "Acquisition") { + if (tag == "acquisition") { value = it.value().get(); return; } - if (tag == "WaveformUint32") { + if (tag == "acquisitionPrototype") { + value = it.value().get(); + return; + } + if (tag == "waveformUint32") { value = it.value().get>(); return; } - if (tag == "ImageUint16") { + if (tag == "imageUint16") { value = it.value().get>(); return; } - if (tag == "ImageInt16") { + if (tag == "imageInt16") { value = it.value().get>(); return; } - if (tag == "ImageUint32") { + if (tag == "imageUint32") { value = it.value().get>(); return; } - if (tag == "ImageInt32") { + if (tag == "imageInt32") { value = it.value().get>(); return; } - if (tag == "ImageFloat") { + if (tag == "imageFloat") { value = it.value().get>(); return; } - if (tag == "ImageDouble") { + if (tag == "imageDouble") { value = it.value().get>(); return; } - if (tag == "ImageComplexFloat") { + if (tag == "imageComplexFloat") { value = it.value().get>>(); return; } - if (tag == "ImageComplexDouble") { + if (tag == "imageComplexDouble") { value = it.value().get>>(); return; } - if (tag == "AcquisitionBucket") { + if (tag == "acquisitionBucket") { value = it.value().get(); return; } - if (tag == "ReconData") { + if (tag == "reconData") { value = it.value().get(); return; } - if (tag == "ArrayComplexFloat") { + if (tag == "arrayComplexFloat") { value = it.value().get>>(); return; } - if (tag == "ImageArray") { + if (tag == "imageArray") { value = it.value().get(); return; } + if (tag == "pulseqDefinitions") { + value = it.value().get(); + return; + } + if (tag == "blocks") { + value = it.value().get>(); + return; + } + if (tag == "rf") { + value = it.value().get(); + return; + } + if (tag == "arbitraryGradient") { + value = it.value().get(); + return; + } + if (tag == "trapezoidalGradient") { + value = it.value().get(); + return; + } + if (tag == "adc") { + value = it.value().get(); + return; + } + if (tag == "shape") { + value = it.value().get(); + return; + } } }; @@ -928,6 +1011,25 @@ void from_json(ordered_json const& j, mrd::Acquisition& value) { } } +void to_json(ordered_json& j, mrd::AcquisitionPrototype const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.head)) { + j.push_back({"head", value.head}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.data_sample_counts)) { + j.push_back({"dataSampleCounts", value.data_sample_counts}); + } +} + +void from_json(ordered_json const& j, mrd::AcquisitionPrototype& value) { + if (auto it = j.find("head"); it != j.end()) { + it->get_to(value.head); + } + if (auto it = j.find("dataSampleCounts"); it != j.end()) { + it->get_to(value.data_sample_counts); + } +} + namespace { std::unordered_map const __PatientGender_values = { {"m", mrd::PatientGender::kM}, @@ -3029,6 +3131,428 @@ void from_json(ordered_json const& j, mrd::ImageArray& value) { } } +void to_json(ordered_json& j, mrd::PulseqDefinitions const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.gradient_raster_time)) { + j.push_back({"gradientRasterTime", value.gradient_raster_time}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.radiofrequency_raster_time)) { + j.push_back({"radiofrequencyRasterTime", value.radiofrequency_raster_time}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.adc_raster_time)) { + j.push_back({"adcRasterTime", value.adc_raster_time}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.block_duration_raster)) { + j.push_back({"blockDurationRaster", value.block_duration_raster}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.name)) { + j.push_back({"name", value.name}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.fov)) { + j.push_back({"fov", value.fov}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.total_duration)) { + j.push_back({"totalDuration", value.total_duration}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.custom)) { + j.push_back({"custom", value.custom}); + } +} + +void from_json(ordered_json const& j, mrd::PulseqDefinitions& value) { + if (auto it = j.find("gradientRasterTime"); it != j.end()) { + it->get_to(value.gradient_raster_time); + } + if (auto it = j.find("radiofrequencyRasterTime"); it != j.end()) { + it->get_to(value.radiofrequency_raster_time); + } + if (auto it = j.find("adcRasterTime"); it != j.end()) { + it->get_to(value.adc_raster_time); + } + if (auto it = j.find("blockDurationRaster"); it != j.end()) { + it->get_to(value.block_duration_raster); + } + if (auto it = j.find("name"); it != j.end()) { + it->get_to(value.name); + } + if (auto it = j.find("fov"); it != j.end()) { + it->get_to(value.fov); + } + if (auto it = j.find("totalDuration"); it != j.end()) { + it->get_to(value.total_duration); + } + if (auto it = j.find("custom"); it != j.end()) { + it->get_to(value.custom); + } +} + +void to_json(ordered_json& j, mrd::Block const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.duration)) { + j.push_back({"duration", value.duration}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.rf)) { + j.push_back({"rf", value.rf}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.gx)) { + j.push_back({"gx", value.gx}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.gy)) { + j.push_back({"gy", value.gy}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.gz)) { + j.push_back({"gz", value.gz}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.adc)) { + j.push_back({"adc", value.adc}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.ext)) { + j.push_back({"ext", value.ext}); + } +} + +void from_json(ordered_json const& j, mrd::Block& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("duration"); it != j.end()) { + it->get_to(value.duration); + } + if (auto it = j.find("rf"); it != j.end()) { + it->get_to(value.rf); + } + if (auto it = j.find("gx"); it != j.end()) { + it->get_to(value.gx); + } + if (auto it = j.find("gy"); it != j.end()) { + it->get_to(value.gy); + } + if (auto it = j.find("gz"); it != j.end()) { + it->get_to(value.gz); + } + if (auto it = j.find("adc"); it != j.end()) { + it->get_to(value.adc); + } + if (auto it = j.find("ext"); it != j.end()) { + it->get_to(value.ext); + } +} + +namespace { +std::unordered_map const __RFPulseUse_values = { + {"undefined", mrd::RFPulseUse::kUndefined}, + {"excitation", mrd::RFPulseUse::kExcitation}, + {"refocusing", mrd::RFPulseUse::kRefocusing}, + {"inversion", mrd::RFPulseUse::kInversion}, + {"saturation", mrd::RFPulseUse::kSaturation}, + {"preparation", mrd::RFPulseUse::kPreparation}, + {"other", mrd::RFPulseUse::kOther}, +}; +} //namespace + +void to_json(ordered_json& j, mrd::RFPulseUse const& value) { + switch (value) { + case mrd::RFPulseUse::kUndefined: + j = "undefined"; + break; + case mrd::RFPulseUse::kExcitation: + j = "excitation"; + break; + case mrd::RFPulseUse::kRefocusing: + j = "refocusing"; + break; + case mrd::RFPulseUse::kInversion: + j = "inversion"; + break; + case mrd::RFPulseUse::kSaturation: + j = "saturation"; + break; + case mrd::RFPulseUse::kPreparation: + j = "preparation"; + break; + case mrd::RFPulseUse::kOther: + j = "other"; + break; + default: + using underlying_type = typename std::underlying_type::type; + j = static_cast(value); + break; + } +} + +void from_json(ordered_json const& j, mrd::RFPulseUse& value) { + if (j.is_string()) { + auto symbol = j.get(); + if (auto res = __RFPulseUse_values.find(symbol); res != __RFPulseUse_values.end()) { + value = res->second; + return; + } + throw std::runtime_error("Invalid enum value '" + symbol + "' for enum mrd::RFPulseUse"); + } + using underlying_type = typename std::underlying_type::type; + value = static_cast(j.get()); +} + +void to_json(ordered_json& j, mrd::RFEvent const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.amp)) { + j.push_back({"amp", value.amp}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.mag_id)) { + j.push_back({"magId", value.mag_id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_id)) { + j.push_back({"phaseId", value.phase_id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.time_id)) { + j.push_back({"timeId", value.time_id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.center)) { + j.push_back({"center", value.center}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.delay)) { + j.push_back({"delay", value.delay}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.freq_ppm)) { + j.push_back({"freqPPM", value.freq_ppm}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_ppm)) { + j.push_back({"phasePPM", value.phase_ppm}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.freq_offset)) { + j.push_back({"freqOffset", value.freq_offset}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_offset)) { + j.push_back({"phaseOffset", value.phase_offset}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.use)) { + j.push_back({"use", value.use}); + } +} + +void from_json(ordered_json const& j, mrd::RFEvent& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("amp"); it != j.end()) { + it->get_to(value.amp); + } + if (auto it = j.find("magId"); it != j.end()) { + it->get_to(value.mag_id); + } + if (auto it = j.find("phaseId"); it != j.end()) { + it->get_to(value.phase_id); + } + if (auto it = j.find("timeId"); it != j.end()) { + it->get_to(value.time_id); + } + if (auto it = j.find("center"); it != j.end()) { + it->get_to(value.center); + } + if (auto it = j.find("delay"); it != j.end()) { + it->get_to(value.delay); + } + if (auto it = j.find("freqPPM"); it != j.end()) { + it->get_to(value.freq_ppm); + } + if (auto it = j.find("phasePPM"); it != j.end()) { + it->get_to(value.phase_ppm); + } + if (auto it = j.find("freqOffset"); it != j.end()) { + it->get_to(value.freq_offset); + } + if (auto it = j.find("phaseOffset"); it != j.end()) { + it->get_to(value.phase_offset); + } + if (auto it = j.find("use"); it != j.end()) { + it->get_to(value.use); + } +} + +void to_json(ordered_json& j, mrd::ArbitraryGradient const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.amp)) { + j.push_back({"amp", value.amp}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.first)) { + j.push_back({"first", value.first}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.last)) { + j.push_back({"last", value.last}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.shape_id)) { + j.push_back({"shapeId", value.shape_id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.time_id)) { + j.push_back({"timeId", value.time_id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.delay)) { + j.push_back({"delay", value.delay}); + } +} + +void from_json(ordered_json const& j, mrd::ArbitraryGradient& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("amp"); it != j.end()) { + it->get_to(value.amp); + } + if (auto it = j.find("first"); it != j.end()) { + it->get_to(value.first); + } + if (auto it = j.find("last"); it != j.end()) { + it->get_to(value.last); + } + if (auto it = j.find("shapeId"); it != j.end()) { + it->get_to(value.shape_id); + } + if (auto it = j.find("timeId"); it != j.end()) { + it->get_to(value.time_id); + } + if (auto it = j.find("delay"); it != j.end()) { + it->get_to(value.delay); + } +} + +void to_json(ordered_json& j, mrd::TrapezoidalGradient const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.amp)) { + j.push_back({"amp", value.amp}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.rise)) { + j.push_back({"rise", value.rise}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.flat)) { + j.push_back({"flat", value.flat}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.fall)) { + j.push_back({"fall", value.fall}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.delay)) { + j.push_back({"delay", value.delay}); + } +} + +void from_json(ordered_json const& j, mrd::TrapezoidalGradient& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("amp"); it != j.end()) { + it->get_to(value.amp); + } + if (auto it = j.find("rise"); it != j.end()) { + it->get_to(value.rise); + } + if (auto it = j.find("flat"); it != j.end()) { + it->get_to(value.flat); + } + if (auto it = j.find("fall"); it != j.end()) { + it->get_to(value.fall); + } + if (auto it = j.find("delay"); it != j.end()) { + it->get_to(value.delay); + } +} + +void to_json(ordered_json& j, mrd::ADCEvent const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.num)) { + j.push_back({"num", value.num}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.dwell)) { + j.push_back({"dwell", value.dwell}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.delay)) { + j.push_back({"delay", value.delay}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.freq_ppm)) { + j.push_back({"freqPPM", value.freq_ppm}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_ppm)) { + j.push_back({"phasePPM", value.phase_ppm}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.freq)) { + j.push_back({"freq", value.freq}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase)) { + j.push_back({"phase", value.phase}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.phase_shape_id)) { + j.push_back({"phaseShapeId", value.phase_shape_id}); + } +} + +void from_json(ordered_json const& j, mrd::ADCEvent& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("num"); it != j.end()) { + it->get_to(value.num); + } + if (auto it = j.find("dwell"); it != j.end()) { + it->get_to(value.dwell); + } + if (auto it = j.find("delay"); it != j.end()) { + it->get_to(value.delay); + } + if (auto it = j.find("freqPPM"); it != j.end()) { + it->get_to(value.freq_ppm); + } + if (auto it = j.find("phasePPM"); it != j.end()) { + it->get_to(value.phase_ppm); + } + if (auto it = j.find("freq"); it != j.end()) { + it->get_to(value.freq); + } + if (auto it = j.find("phase"); it != j.end()) { + it->get_to(value.phase); + } + if (auto it = j.find("phaseShapeId"); it != j.end()) { + it->get_to(value.phase_shape_id); + } +} + +void to_json(ordered_json& j, mrd::Shape const& value) { + j = ordered_json::object(); + if (yardl::ndjson::ShouldSerializeFieldValue(value.id)) { + j.push_back({"id", value.id}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.num_samples)) { + j.push_back({"numSamples", value.num_samples}); + } + if (yardl::ndjson::ShouldSerializeFieldValue(value.data)) { + j.push_back({"data", value.data}); + } +} + +void from_json(ordered_json const& j, mrd::Shape& value) { + if (auto it = j.find("id"); it != j.end()) { + it->get_to(value.id); + } + if (auto it = j.find("numSamples"); it != j.end()) { + it->get_to(value.num_samples); + } + if (auto it = j.find("data"); it != j.end()) { + it->get_to(value.data); + } +} + } // namespace mrd namespace mrd::ndjson { diff --git a/cpp/mrd/protocols.cc b/cpp/mrd/protocols.cc index 0040dccc..0c4c4f23 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":"ADCEvent","fields":[{"name":"id","type":"int32"},{"name":"num","type":"uint64"},{"name":"dwell","type":"float32"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freq","type":"float64"},{"name":"phase","type":"float64"},{"name":"phaseShapeId","type":"int32"}]},{"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":"AcquisitionPrototype","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"dataSampleCounts","type":{"array":{"items":"uint32","dimensions":1}}}]},{"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":"ArbitraryGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"first","type":"float64"},{"name":"last","type":"float64"},{"name":"shapeId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"delay","type":"uint64"}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Block","fields":[{"name":"id","type":"int32"},{"name":"duration","type":"uint64"},{"name":"rf","type":"int32"},{"name":"gx","type":"int32"},{"name":"gy","type":"int32"},{"name":"gz","type":"int32"},{"name":"adc","type":"int32"},{"name":"ext","type":"int32"}]},{"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":"PulseqDefinitions","fields":[{"name":"gradientRasterTime","type":"float64"},{"name":"radiofrequencyRasterTime","type":"float64"},{"name":"adcRasterTime","type":"float64"},{"name":"blockDurationRaster","type":"float64"},{"name":"name","type":[null,"string"]},{"name":"fov","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"totalDuration","type":[null,"float64"]},{"name":"custom","type":{"map":{"keys":"string","values":"string"}}}]},{"name":"RFEvent","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"magId","type":"int32"},{"name":"phaseId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"center","type":"float64"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freqOffset","type":"float64"},{"name":"phaseOffset","type":"float64"},{"name":"use","type":"Mrd.RFPulseUse"}]},{"name":"RFPulseUse","values":[{"symbol":"undefined","value":0},{"symbol":"excitation","value":1},{"symbol":"refocusing","value":2},{"symbol":"inversion","value":3},{"symbol":"saturation","value":4},{"symbol":"preparation","value":5},{"symbol":"other","value":6}]},{"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":"Shape","fields":[{"name":"id","type":"int32"},{"name":"numSamples","type":"uint64"},{"name":"data","type":{"array":{"items":"float64","dimensions":1}}}]},{"name":"StreamItem","type":[{"tag":"acquisition","explicitTag":true,"type":"Mrd.Acquisition"},{"tag":"acquisitionPrototype","explicitTag":true,"type":"Mrd.AcquisitionPrototype"},{"tag":"waveformUint32","explicitTag":true,"type":"Mrd.WaveformUint32"},{"tag":"imageUint16","explicitTag":true,"type":"Mrd.ImageUint16"},{"tag":"imageInt16","explicitTag":true,"type":"Mrd.ImageInt16"},{"tag":"imageUint32","explicitTag":true,"type":"Mrd.ImageUint32"},{"tag":"imageInt32","explicitTag":true,"type":"Mrd.ImageInt32"},{"tag":"imageFloat","explicitTag":true,"type":"Mrd.ImageFloat"},{"tag":"imageDouble","explicitTag":true,"type":"Mrd.ImageDouble"},{"tag":"imageComplexFloat","explicitTag":true,"type":"Mrd.ImageComplexFloat"},{"tag":"imageComplexDouble","explicitTag":true,"type":"Mrd.ImageComplexDouble"},{"tag":"acquisitionBucket","explicitTag":true,"type":"Mrd.AcquisitionBucket"},{"tag":"reconData","explicitTag":true,"type":"Mrd.ReconData"},{"tag":"arrayComplexFloat","explicitTag":true,"type":"Mrd.ArrayComplexFloat"},{"tag":"imageArray","explicitTag":true,"type":"Mrd.ImageArray"},{"tag":"pulseqDefinitions","explicitTag":true,"type":"Mrd.PulseqDefinitions"},{"tag":"blocks","explicitTag":true,"type":{"vector":{"items":"Mrd.Block"}}},{"tag":"rf","explicitTag":true,"type":"Mrd.RFEvent"},{"tag":"arbitraryGradient","explicitTag":true,"type":"Mrd.ArbitraryGradient"},{"tag":"trapezoidalGradient","explicitTag":true,"type":"Mrd.TrapezoidalGradient"},{"tag":"adc","explicitTag":true,"type":"Mrd.ADCEvent"},{"tag":"shape","explicitTag":true,"type":"Mrd.Shape"}]},{"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":"TrapezoidalGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"rise","type":"uint64"},{"name":"flat","type":"uint64"},{"name":"fall","type":"uint64"},{"name":"delay","type":"uint64"}]},{"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..f3301a5f 100644 --- a/cpp/mrd/types.h +++ b/cpp/mrd/types.h @@ -198,6 +198,23 @@ struct Acquisition { } }; +// Specifies header and data size of an acquisition, without the actual data. +struct AcquisitionPrototype { + // Acquisition header template + mrd::AcquisitionHeader head{}; + // Sample counts by coil + yardl::NDArray data_sample_counts{}; + + bool operator==(const AcquisitionPrototype& other) const { + return head == other.head && + data_sample_counts == other.data_sample_counts; + } + + bool operator!=(const AcquisitionPrototype& other) const { + return !(*this == other); + } +}; + enum class PatientGender { kM = 0, kF = 1, @@ -1210,8 +1227,266 @@ using Array = yardl::DynamicNDArray; using ArrayComplexFloat = mrd::Array>; +// Pulseq definitions +struct PulseqDefinitions { + // Default raster time (dwell time) of the shaped gradient events, specified in seconds + double gradient_raster_time{}; + // Default raster time (dwell time) of the radio-frequency pulse shapes, specified in seconds + double radiofrequency_raster_time{}; + // The value defining the alignment of the ADC dwell times. + // ADC dwell time must be integer multiple of the specified adcRasterTime. + // adcRasterTime is specified in seconds + double adc_raster_time{}; + // The value defining the alignment of the block durations, specified in seconds; + // the physical block duration must be integer multiple of the specified blockDurationRaster. + // Block duration in the blocks section are specified in the units of blockDurationRaster + double block_duration_raster{}; + // Human-readable name of the sequence + std::optional name{}; + // Field of view specified in meters. + std::optional fov{}; + // Total duration of the sequence is seconds + std::optional total_duration{}; + std::unordered_map custom{}; + + bool operator==(const PulseqDefinitions& other) const { + return gradient_raster_time == other.gradient_raster_time && + radiofrequency_raster_time == other.radiofrequency_raster_time && + adc_raster_time == other.adc_raster_time && + block_duration_raster == other.block_duration_raster && + name == other.name && + fov == other.fov && + total_duration == other.total_duration && + custom == other.custom; + } + + bool operator!=(const PulseqDefinitions& other) const { + return !(*this == other); + } +}; + +// A sequence block that includes possible RF, gradient, and ADC events. +struct Block { + // ID of the sequence block + int32_t id{}; + // Duration of the block in units of Definitions.blockDurationRaster + uint64_t duration{}; + // ID of the RF event + int32_t rf{}; + // ID of the gradient event on the X channel + int32_t gx{}; + // ID of the gradient event on the Y channel + int32_t gy{}; + // ID of the gradient event on the Z channel + int32_t gz{}; + // ID of the ADC event + int32_t adc{}; + // ID of the extension table entry + int32_t ext{}; + + bool operator==(const Block& other) const { + return id == other.id && + duration == other.duration && + rf == other.rf && + gx == other.gx && + gy == other.gy && + gz == other.gz && + adc == other.adc && + ext == other.ext; + } + + bool operator!=(const Block& other) const { + return !(*this == other); + } +}; + +enum class RFPulseUse { + kUndefined = 0, + kExcitation = 1, + kRefocusing = 2, + kInversion = 3, + kSaturation = 4, + kPreparation = 5, + kOther = 6, +}; + +// An RF event +struct RFEvent { + // ID of the RF event + int32_t id{}; + // Peak amplitude in Hz + double amp{}; + // Shape ID for the magnitude profile + int32_t mag_id{}; + // Shape ID for the phase profile + int32_t phase_id{}; + // Shape ID for the time sampling points, specified in the units of + // RadiofrequencyRasterTime. + // 0 means default time raster + int32_t time_id{}; + // Time point in microseconds relative to the beginning of + // the RF shape at which the effective rotation takes place + double center{}; + // Delay before starting the RF pulse, specified in microseconds + uint64_t delay{}; + // Frequency offset relative to the main system's frequency, + // specified in parts per million (ppm) + double freq_ppm{}; + // Phase offset proportional to the main system's frequency, + // specified in rad/MHz + double phase_ppm{}; + // Frequency offset in absolute units, specified in Hz + double freq_offset{}; + // Phase offset in absolute units, specified in radians + double phase_offset{}; + mrd::RFPulseUse use{}; + + bool operator==(const RFEvent& other) const { + return id == other.id && + amp == other.amp && + mag_id == other.mag_id && + phase_id == other.phase_id && + time_id == other.time_id && + center == other.center && + delay == other.delay && + freq_ppm == other.freq_ppm && + phase_ppm == other.phase_ppm && + freq_offset == other.freq_offset && + phase_offset == other.phase_offset && + use == other.use; + } + + bool operator!=(const RFEvent& other) const { + return !(*this == other); + } +}; + +// An arbitrary gradient event +struct ArbitraryGradient { + // ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + int32_t id{}; + // Peak amplitude in Hz/m + double amp{}; + // The amplitude at the start of the gradient. + double first{}; + // The amplitude at the end of the gradient. + double last{}; + // Shape ID for the gradient shape + int32_t shape_id{}; + // Shape ID for the time sampling points, specified in the units of GradientRasterTime. + // 0 means default time raster, -1 means 1/2 of the default time raster (gradient oversampling case). + int32_t time_id{}; + // Delay before starting the gradient, specified in microseconds + uint64_t delay{}; + + bool operator==(const ArbitraryGradient& other) const { + return id == other.id && + amp == other.amp && + first == other.first && + last == other.last && + shape_id == other.shape_id && + time_id == other.time_id && + delay == other.delay; + } + + bool operator!=(const ArbitraryGradient& other) const { + return !(*this == other); + } +}; + +// A trapezoidal gradient event +struct TrapezoidalGradient { + // ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + int32_t id{}; + // Peak amplitude in Hz/m + double amp{}; + // Rise time of the trapezoid in microseconds + uint64_t rise{}; + // Flat-top time of the trapezoid in microseconds + uint64_t flat{}; + // Fall time of the trapezoid in microseconds + uint64_t fall{}; + // Delay before starting the gradient, specified in microseconds + uint64_t delay{}; + + bool operator==(const TrapezoidalGradient& other) const { + return id == other.id && + amp == other.amp && + rise == other.rise && + flat == other.flat && + fall == other.fall && + delay == other.delay; + } + + bool operator!=(const TrapezoidalGradient& other) const { + return !(*this == other); + } +}; + +// An ADC event +struct ADCEvent { + // ID of the ADC event + int32_t id{}; + // Number of samples + uint64_t num{}; + // The ADC dwell time, specified in nanoseconds + float dwell{}; + // Delay between start of block and first sample, specified in microseconds + uint64_t delay{}; + // Frequency offset of the ADC receiver relative to the system frequency, + // specified in parts per million (ppm) + double freq_ppm{}; + // Phase offset of the ADC receiver proportional to the system frequency, + // specified in rad/MHz + double phase_ppm{}; + // Frequency offset of the ADC receiver in absolute units, specified in Hz + double freq{}; + // Phase offset in absolute units, specified in radians + double phase{}; + // The shape ID + int32_t phase_shape_id{}; + + bool operator==(const ADCEvent& other) const { + return id == other.id && + num == other.num && + dwell == other.dwell && + delay == other.delay && + freq_ppm == other.freq_ppm && + phase_ppm == other.phase_ppm && + freq == other.freq && + phase == other.phase && + phase_shape_id == other.phase_shape_id; + } + + bool operator!=(const ADCEvent& other) const { + return !(*this == other); + } +}; + +// A list of samples that is potentially compressed. +// If numSamples == size(data) then the shape is uncompressed. +struct Shape { + // ID of the shape + int32_t id{}; + // Number of samples of the uncompressed shape + uint64_t num_samples{}; + // Samples of the (potentially) compressed shape. See the Pulseq specification for compression details. + // In the spec, this should be float32, but PyPulseq uses float64. + yardl::NDArray data{}; + + bool operator==(const Shape& other) const { + return id == other.id && + num_samples == other.num_samples && + data == other.data; + } + + bool operator!=(const Shape& 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, mrd::RFEvent, mrd::ArbitraryGradient, mrd::TrapezoidalGradient, mrd::ADCEvent, mrd::Shape>; } // namespace mrd diff --git a/environment.yml b/environment.yml index 153ce54a..1c15bea5 100644 --- a/environment.yml +++ b/environment.yml @@ -22,6 +22,7 @@ dependencies: - ninja=1.11.0 - nlohmann_json=3.11.2 - nodejs=18.12.1 # local + - pip=25.2 - python=3.9.15 - pyfftw=0.13.1 - shellcheck=0.8.0 @@ -29,3 +30,5 @@ dependencies: - xmlschema=2.2.3 - xtensor=0.24.2 - xtensor-fftw=0.2.5 + - pip: + - pypulseq==1.4.2.post1 diff --git a/matlab/toolbox/+mrd/+binary/ADCEventSerializer.m b/matlab/toolbox/+mrd/+binary/ADCEventSerializer.m new file mode 100644 index 00000000..8c57b21e --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/ADCEventSerializer.m @@ -0,0 +1,32 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef ADCEventSerializer < yardl.binary.RecordSerializer + methods + function self = ADCEventSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Uint64Serializer; + field_serializers{3} = yardl.binary.Float32Serializer; + field_serializers{4} = yardl.binary.Uint64Serializer; + field_serializers{5} = yardl.binary.Float64Serializer; + field_serializers{6} = yardl.binary.Float64Serializer; + field_serializers{7} = yardl.binary.Float64Serializer; + field_serializers{8} = yardl.binary.Float64Serializer; + field_serializers{9} = yardl.binary.Int32Serializer; + self@yardl.binary.RecordSerializer('mrd.ADCEvent', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.ADCEvent + end + self.write_(outstream, value.id, value.num, value.dwell, value.delay, value.freq_ppm, value.phase_ppm, value.freq, value.phase, value.phase_shape_id); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.ADCEvent(id=fields{1}, num=fields{2}, dwell=fields{3}, delay=fields{4}, freq_ppm=fields{5}, phase_ppm=fields{6}, freq=fields{7}, phase=fields{8}, phase_shape_id=fields{9}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/AcquisitionPrototypeSerializer.m b/matlab/toolbox/+mrd/+binary/AcquisitionPrototypeSerializer.m new file mode 100644 index 00000000..63e64732 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/AcquisitionPrototypeSerializer.m @@ -0,0 +1,25 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef AcquisitionPrototypeSerializer < yardl.binary.RecordSerializer + methods + function self = AcquisitionPrototypeSerializer() + field_serializers{1} = mrd.binary.AcquisitionHeaderSerializer(); + field_serializers{2} = yardl.binary.NDArraySerializer(yardl.binary.Uint32Serializer, 1); + self@yardl.binary.RecordSerializer('mrd.AcquisitionPrototype', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.AcquisitionPrototype + end + self.write_(outstream, value.head, value.data_sample_counts); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.AcquisitionPrototype(head=fields{1}, data_sample_counts=fields{2}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/ArbitraryGradientSerializer.m b/matlab/toolbox/+mrd/+binary/ArbitraryGradientSerializer.m new file mode 100644 index 00000000..ea6ade09 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/ArbitraryGradientSerializer.m @@ -0,0 +1,30 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef ArbitraryGradientSerializer < yardl.binary.RecordSerializer + methods + function self = ArbitraryGradientSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Float64Serializer; + field_serializers{3} = yardl.binary.Float64Serializer; + field_serializers{4} = yardl.binary.Float64Serializer; + field_serializers{5} = yardl.binary.Int32Serializer; + field_serializers{6} = yardl.binary.Int32Serializer; + field_serializers{7} = yardl.binary.Uint64Serializer; + self@yardl.binary.RecordSerializer('mrd.ArbitraryGradient', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.ArbitraryGradient + end + self.write_(outstream, value.id, value.amp, value.first, value.last, value.shape_id, value.time_id, value.delay); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.ArbitraryGradient(id=fields{1}, amp=fields{2}, first=fields{3}, last=fields{4}, shape_id=fields{5}, time_id=fields{6}, delay=fields{7}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/BlockSerializer.m b/matlab/toolbox/+mrd/+binary/BlockSerializer.m new file mode 100644 index 00000000..11b41c26 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/BlockSerializer.m @@ -0,0 +1,31 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef BlockSerializer < yardl.binary.RecordSerializer + methods + function self = BlockSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Uint64Serializer; + field_serializers{3} = yardl.binary.Int32Serializer; + field_serializers{4} = yardl.binary.Int32Serializer; + field_serializers{5} = yardl.binary.Int32Serializer; + field_serializers{6} = yardl.binary.Int32Serializer; + field_serializers{7} = yardl.binary.Int32Serializer; + field_serializers{8} = yardl.binary.Int32Serializer; + self@yardl.binary.RecordSerializer('mrd.Block', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.Block + end + self.write_(outstream, value.id, value.duration, value.rf, value.gx, value.gy, value.gz, value.adc, value.ext); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.Block(id=fields{1}, duration=fields{2}, rf=fields{3}, gx=fields{4}, gy=fields{5}, gz=fields{6}, adc=fields{7}, ext=fields{8}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/MrdReader.m b/matlab/toolbox/+mrd/+binary/MrdReader.m index 83e7fd1d..b9e35aa5 100644 --- a/matlab/toolbox/+mrd/+binary/MrdReader.m +++ b/matlab/toolbox/+mrd/+binary/MrdReader.m @@ -17,7 +17,7 @@ self@mrd.MrdReaderBase(skip_completed_check=options.skip_completed_check); 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.AcquisitionPrototypeSerializer(), 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.binary.PulseqDefinitionsSerializer(), yardl.binary.VectorSerializer(mrd.binary.BlockSerializer()), mrd.binary.RFEventSerializer(), mrd.binary.ArbitraryGradientSerializer(), mrd.binary.TrapezoidalGradientSerializer(), mrd.binary.ADCEventSerializer(), mrd.binary.ShapeSerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.AcquisitionPrototype, @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, @mrd.StreamItem.PulseqDefinitions, @mrd.StreamItem.Blocks, @mrd.StreamItem.Rf, @mrd.StreamItem.ArbitraryGradient, @mrd.StreamItem.TrapezoidalGradient, @mrd.StreamItem.Adc, @mrd.StreamItem.Shape})); end end diff --git a/matlab/toolbox/+mrd/+binary/MrdWriter.m b/matlab/toolbox/+mrd/+binary/MrdWriter.m index 311e22a7..8099178a 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.AcquisitionPrototypeSerializer(), 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.binary.PulseqDefinitionsSerializer(), yardl.binary.VectorSerializer(mrd.binary.BlockSerializer()), mrd.binary.RFEventSerializer(), mrd.binary.ArbitraryGradientSerializer(), mrd.binary.TrapezoidalGradientSerializer(), mrd.binary.ADCEventSerializer(), mrd.binary.ShapeSerializer()}, {@mrd.StreamItem.Acquisition, @mrd.StreamItem.AcquisitionPrototype, @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, @mrd.StreamItem.PulseqDefinitions, @mrd.StreamItem.Blocks, @mrd.StreamItem.Rf, @mrd.StreamItem.ArbitraryGradient, @mrd.StreamItem.TrapezoidalGradient, @mrd.StreamItem.Adc, @mrd.StreamItem.Shape})); end end diff --git a/matlab/toolbox/+mrd/+binary/PulseqDefinitionsSerializer.m b/matlab/toolbox/+mrd/+binary/PulseqDefinitionsSerializer.m new file mode 100644 index 00000000..b623c52f --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/PulseqDefinitionsSerializer.m @@ -0,0 +1,31 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef PulseqDefinitionsSerializer < yardl.binary.RecordSerializer + methods + function self = PulseqDefinitionsSerializer() + field_serializers{1} = yardl.binary.Float64Serializer; + field_serializers{2} = yardl.binary.Float64Serializer; + field_serializers{3} = yardl.binary.Float64Serializer; + field_serializers{4} = yardl.binary.Float64Serializer; + field_serializers{5} = yardl.binary.OptionalSerializer(yardl.binary.StringSerializer); + field_serializers{6} = yardl.binary.OptionalSerializer(mrd.binary.ThreeDimensionalFloatSerializer()); + field_serializers{7} = yardl.binary.OptionalSerializer(yardl.binary.Float64Serializer); + field_serializers{8} = yardl.binary.MapSerializer(yardl.binary.StringSerializer, yardl.binary.StringSerializer); + self@yardl.binary.RecordSerializer('mrd.PulseqDefinitions', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.PulseqDefinitions + end + self.write_(outstream, value.gradient_raster_time, value.radiofrequency_raster_time, value.adc_raster_time, value.block_duration_raster, value.name, value.fov, value.total_duration, value.custom); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.PulseqDefinitions(gradient_raster_time=fields{1}, radiofrequency_raster_time=fields{2}, adc_raster_time=fields{3}, block_duration_raster=fields{4}, name=fields{5}, fov=fields{6}, total_duration=fields{7}, custom=fields{8}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/RFEventSerializer.m b/matlab/toolbox/+mrd/+binary/RFEventSerializer.m new file mode 100644 index 00000000..c96c889c --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/RFEventSerializer.m @@ -0,0 +1,35 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef RFEventSerializer < yardl.binary.RecordSerializer + methods + function self = RFEventSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Float64Serializer; + field_serializers{3} = yardl.binary.Int32Serializer; + field_serializers{4} = yardl.binary.Int32Serializer; + field_serializers{5} = yardl.binary.Int32Serializer; + field_serializers{6} = yardl.binary.Float64Serializer; + field_serializers{7} = yardl.binary.Uint64Serializer; + field_serializers{8} = yardl.binary.Float64Serializer; + field_serializers{9} = yardl.binary.Float64Serializer; + field_serializers{10} = yardl.binary.Float64Serializer; + field_serializers{11} = yardl.binary.Float64Serializer; + field_serializers{12} = yardl.binary.EnumSerializer('mrd.RFPulseUse', @mrd.RFPulseUse, yardl.binary.Int32Serializer); + self@yardl.binary.RecordSerializer('mrd.RFEvent', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.RFEvent + end + self.write_(outstream, value.id, value.amp, value.mag_id, value.phase_id, value.time_id, value.center, value.delay, value.freq_ppm, value.phase_ppm, value.freq_offset, value.phase_offset, value.use); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.RFEvent(id=fields{1}, amp=fields{2}, mag_id=fields{3}, phase_id=fields{4}, time_id=fields{5}, center=fields{6}, delay=fields{7}, freq_ppm=fields{8}, phase_ppm=fields{9}, freq_offset=fields{10}, phase_offset=fields{11}, use=fields{12}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/ShapeSerializer.m b/matlab/toolbox/+mrd/+binary/ShapeSerializer.m new file mode 100644 index 00000000..93c33e46 --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/ShapeSerializer.m @@ -0,0 +1,26 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef ShapeSerializer < yardl.binary.RecordSerializer + methods + function self = ShapeSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Uint64Serializer; + field_serializers{3} = yardl.binary.NDArraySerializer(yardl.binary.Float64Serializer, 1); + self@yardl.binary.RecordSerializer('mrd.Shape', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.Shape + end + self.write_(outstream, value.id, value.num_samples, value.data); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.Shape(id=fields{1}, num_samples=fields{2}, data=fields{3}); + end + end +end diff --git a/matlab/toolbox/+mrd/+binary/TrapezoidalGradientSerializer.m b/matlab/toolbox/+mrd/+binary/TrapezoidalGradientSerializer.m new file mode 100644 index 00000000..55778c0d --- /dev/null +++ b/matlab/toolbox/+mrd/+binary/TrapezoidalGradientSerializer.m @@ -0,0 +1,29 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef TrapezoidalGradientSerializer < yardl.binary.RecordSerializer + methods + function self = TrapezoidalGradientSerializer() + field_serializers{1} = yardl.binary.Int32Serializer; + field_serializers{2} = yardl.binary.Float64Serializer; + field_serializers{3} = yardl.binary.Uint64Serializer; + field_serializers{4} = yardl.binary.Uint64Serializer; + field_serializers{5} = yardl.binary.Uint64Serializer; + field_serializers{6} = yardl.binary.Uint64Serializer; + self@yardl.binary.RecordSerializer('mrd.TrapezoidalGradient', field_serializers); + end + + function write(self, outstream, value) + arguments + self + outstream (1,1) yardl.binary.CodedOutputStream + value (1,1) mrd.TrapezoidalGradient + end + self.write_(outstream, value.id, value.amp, value.rise, value.flat, value.fall, value.delay); + end + + function value = read(self, instream) + fields = self.read_(instream); + value = mrd.TrapezoidalGradient(id=fields{1}, amp=fields{2}, rise=fields{3}, flat=fields{4}, fall=fields{5}, delay=fields{6}); + end + end +end diff --git a/matlab/toolbox/+mrd/ADCEvent.m b/matlab/toolbox/+mrd/ADCEvent.m new file mode 100644 index 00000000..50b853bd --- /dev/null +++ b/matlab/toolbox/+mrd/ADCEvent.m @@ -0,0 +1,89 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef ADCEvent < handle + % An ADC event + properties + % ID of the ADC event + id + % Number of samples + num + % The ADC dwell time, specified in nanoseconds + dwell + % Delay between start of block and first sample, specified in microseconds + delay + % Frequency offset of the ADC receiver relative to the system frequency, + % specified in parts per million (ppm) + freq_ppm + % Phase offset of the ADC receiver proportional to the system frequency, + % specified in rad/MHz + phase_ppm + % Frequency offset of the ADC receiver in absolute units, specified in Hz + freq + % Phase offset in absolute units, specified in radians + phase + % The shape ID + phase_shape_id + end + + methods + function self = ADCEvent(kwargs) + arguments + kwargs.id = int32(0); + kwargs.num = uint64(0); + kwargs.dwell = single(0); + kwargs.delay = uint64(0); + kwargs.freq_ppm = double(0); + kwargs.phase_ppm = double(0); + kwargs.freq = double(0); + kwargs.phase = double(0); + kwargs.phase_shape_id = int32(0); + end + self.id = kwargs.id; + self.num = kwargs.num; + self.dwell = kwargs.dwell; + self.delay = kwargs.delay; + self.freq_ppm = kwargs.freq_ppm; + self.phase_ppm = kwargs.phase_ppm; + self.freq = kwargs.freq; + self.phase = kwargs.phase; + self.phase_shape_id = kwargs.phase_shape_id; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.ADCEvent") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.num}, {other.num}) && ... + isequal({self.dwell}, {other.dwell}) && ... + isequal({self.delay}, {other.delay}) && ... + isequal({self.freq_ppm}, {other.freq_ppm}) && ... + isequal({self.phase_ppm}, {other.phase_ppm}) && ... + isequal({self.freq}, {other.freq}) && ... + isequal({self.phase}, {other.phase}) && ... + isequal({self.phase_shape_id}, {other.phase_shape_id}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.ADCEvent(); + 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/AcquisitionPrototype.m b/matlab/toolbox/+mrd/AcquisitionPrototype.m new file mode 100644 index 00000000..5b2c519d --- /dev/null +++ b/matlab/toolbox/+mrd/AcquisitionPrototype.m @@ -0,0 +1,52 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef AcquisitionPrototype < handle + % Specifies header and data size of an acquisition, without the actual data. + properties + % Acquisition header template + head + % Sample counts by coil + data_sample_counts + end + + methods + function self = AcquisitionPrototype(kwargs) + arguments + kwargs.head = mrd.AcquisitionHeader(); + kwargs.data_sample_counts = uint32.empty(); + end + self.head = kwargs.head; + self.data_sample_counts = kwargs.data_sample_counts; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.AcquisitionPrototype") && ... + isequal({self.head}, {other.head}) && ... + isequal({self.data_sample_counts}, {other.data_sample_counts}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.AcquisitionPrototype(); + 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/ArbitraryGradient.m b/matlab/toolbox/+mrd/ArbitraryGradient.m new file mode 100644 index 00000000..e4b6aaa0 --- /dev/null +++ b/matlab/toolbox/+mrd/ArbitraryGradient.m @@ -0,0 +1,78 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef ArbitraryGradient < handle + % An arbitrary gradient event + properties + % ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + id + % Peak amplitude in Hz/m + amp + % The amplitude at the start of the gradient. + first + % The amplitude at the end of the gradient. + last + % Shape ID for the gradient shape + shape_id + % Shape ID for the time sampling points, specified in the units of GradientRasterTime. + % 0 means default time raster, -1 means 1/2 of the default time raster (gradient oversampling case). + time_id + % Delay before starting the gradient, specified in microseconds + delay + end + + methods + function self = ArbitraryGradient(kwargs) + arguments + kwargs.id = int32(0); + kwargs.amp = double(0); + kwargs.first = double(0); + kwargs.last = double(0); + kwargs.shape_id = int32(0); + kwargs.time_id = int32(0); + kwargs.delay = uint64(0); + end + self.id = kwargs.id; + self.amp = kwargs.amp; + self.first = kwargs.first; + self.last = kwargs.last; + self.shape_id = kwargs.shape_id; + self.time_id = kwargs.time_id; + self.delay = kwargs.delay; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.ArbitraryGradient") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.amp}, {other.amp}) && ... + isequal({self.first}, {other.first}) && ... + isequal({self.last}, {other.last}) && ... + isequal({self.shape_id}, {other.shape_id}) && ... + isequal({self.time_id}, {other.time_id}) && ... + isequal({self.delay}, {other.delay}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.ArbitraryGradient(); + 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/Block.m b/matlab/toolbox/+mrd/Block.m new file mode 100644 index 00000000..f04837fe --- /dev/null +++ b/matlab/toolbox/+mrd/Block.m @@ -0,0 +1,82 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef Block < handle + % A sequence block that includes possible RF, gradient, and ADC events. + properties + % ID of the sequence block + id + % Duration of the block in units of Definitions.blockDurationRaster + duration + % ID of the RF event + rf + % ID of the gradient event on the X channel + gx + % ID of the gradient event on the Y channel + gy + % ID of the gradient event on the Z channel + gz + % ID of the ADC event + adc + % ID of the extension table entry + ext + end + + methods + function self = Block(kwargs) + arguments + kwargs.id = int32(0); + kwargs.duration = uint64(0); + kwargs.rf = int32(0); + kwargs.gx = int32(0); + kwargs.gy = int32(0); + kwargs.gz = int32(0); + kwargs.adc = int32(0); + kwargs.ext = int32(0); + end + self.id = kwargs.id; + self.duration = kwargs.duration; + self.rf = kwargs.rf; + self.gx = kwargs.gx; + self.gy = kwargs.gy; + self.gz = kwargs.gz; + self.adc = kwargs.adc; + self.ext = kwargs.ext; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.Block") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.duration}, {other.duration}) && ... + isequal({self.rf}, {other.rf}) && ... + isequal({self.gx}, {other.gx}) && ... + isequal({self.gy}, {other.gy}) && ... + isequal({self.gz}, {other.gz}) && ... + isequal({self.adc}, {other.adc}) && ... + isequal({self.ext}, {other.ext}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.Block(); + 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/MrdWriterBase.m b/matlab/toolbox/+mrd/MrdWriterBase.m index 4057451e..b2fb00b4 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":"ADCEvent","fields":[{"name":"id","type":"int32"},{"name":"num","type":"uint64"},{"name":"dwell","type":"float32"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freq","type":"float64"},{"name":"phase","type":"float64"},{"name":"phaseShapeId","type":"int32"}]},{"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":"AcquisitionPrototype","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"dataSampleCounts","type":{"array":{"items":"uint32","dimensions":1}}}]},{"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":"ArbitraryGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"first","type":"float64"},{"name":"last","type":"float64"},{"name":"shapeId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"delay","type":"uint64"}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Block","fields":[{"name":"id","type":"int32"},{"name":"duration","type":"uint64"},{"name":"rf","type":"int32"},{"name":"gx","type":"int32"},{"name":"gy","type":"int32"},{"name":"gz","type":"int32"},{"name":"adc","type":"int32"},{"name":"ext","type":"int32"}]},{"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":"PulseqDefinitions","fields":[{"name":"gradientRasterTime","type":"float64"},{"name":"radiofrequencyRasterTime","type":"float64"},{"name":"adcRasterTime","type":"float64"},{"name":"blockDurationRaster","type":"float64"},{"name":"name","type":[null,"string"]},{"name":"fov","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"totalDuration","type":[null,"float64"]},{"name":"custom","type":{"map":{"keys":"string","values":"string"}}}]},{"name":"RFEvent","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"magId","type":"int32"},{"name":"phaseId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"center","type":"float64"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freqOffset","type":"float64"},{"name":"phaseOffset","type":"float64"},{"name":"use","type":"Mrd.RFPulseUse"}]},{"name":"RFPulseUse","values":[{"symbol":"undefined","value":0},{"symbol":"excitation","value":1},{"symbol":"refocusing","value":2},{"symbol":"inversion","value":3},{"symbol":"saturation","value":4},{"symbol":"preparation","value":5},{"symbol":"other","value":6}]},{"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":"Shape","fields":[{"name":"id","type":"int32"},{"name":"numSamples","type":"uint64"},{"name":"data","type":{"array":{"items":"float64","dimensions":1}}}]},{"name":"StreamItem","type":[{"tag":"acquisition","explicitTag":true,"type":"Mrd.Acquisition"},{"tag":"acquisitionPrototype","explicitTag":true,"type":"Mrd.AcquisitionPrototype"},{"tag":"waveformUint32","explicitTag":true,"type":"Mrd.WaveformUint32"},{"tag":"imageUint16","explicitTag":true,"type":"Mrd.ImageUint16"},{"tag":"imageInt16","explicitTag":true,"type":"Mrd.ImageInt16"},{"tag":"imageUint32","explicitTag":true,"type":"Mrd.ImageUint32"},{"tag":"imageInt32","explicitTag":true,"type":"Mrd.ImageInt32"},{"tag":"imageFloat","explicitTag":true,"type":"Mrd.ImageFloat"},{"tag":"imageDouble","explicitTag":true,"type":"Mrd.ImageDouble"},{"tag":"imageComplexFloat","explicitTag":true,"type":"Mrd.ImageComplexFloat"},{"tag":"imageComplexDouble","explicitTag":true,"type":"Mrd.ImageComplexDouble"},{"tag":"acquisitionBucket","explicitTag":true,"type":"Mrd.AcquisitionBucket"},{"tag":"reconData","explicitTag":true,"type":"Mrd.ReconData"},{"tag":"arrayComplexFloat","explicitTag":true,"type":"Mrd.ArrayComplexFloat"},{"tag":"imageArray","explicitTag":true,"type":"Mrd.ImageArray"},{"tag":"pulseqDefinitions","explicitTag":true,"type":"Mrd.PulseqDefinitions"},{"tag":"blocks","explicitTag":true,"type":{"vector":{"items":"Mrd.Block"}}},{"tag":"rf","explicitTag":true,"type":"Mrd.RFEvent"},{"tag":"arbitraryGradient","explicitTag":true,"type":"Mrd.ArbitraryGradient"},{"tag":"trapezoidalGradient","explicitTag":true,"type":"Mrd.TrapezoidalGradient"},{"tag":"adc","explicitTag":true,"type":"Mrd.ADCEvent"},{"tag":"shape","explicitTag":true,"type":"Mrd.Shape"}]},{"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":"TrapezoidalGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"rise","type":"uint64"},{"name":"flat","type":"uint64"},{"name":"fall","type":"uint64"},{"name":"delay","type":"uint64"}]},{"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/PulseqDefinitions.m b/matlab/toolbox/+mrd/PulseqDefinitions.m new file mode 100644 index 00000000..41d9ac53 --- /dev/null +++ b/matlab/toolbox/+mrd/PulseqDefinitions.m @@ -0,0 +1,85 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef PulseqDefinitions < handle + % Pulseq definitions + properties + % Default raster time (dwell time) of the shaped gradient events, specified in seconds + gradient_raster_time + % Default raster time (dwell time) of the radio-frequency pulse shapes, specified in seconds + radiofrequency_raster_time + % The value defining the alignment of the ADC dwell times. + % ADC dwell time must be integer multiple of the specified adcRasterTime. + % adcRasterTime is specified in seconds + adc_raster_time + % The value defining the alignment of the block durations, specified in seconds; + % the physical block duration must be integer multiple of the specified blockDurationRaster. + % Block duration in the blocks section are specified in the units of blockDurationRaster + block_duration_raster + % Human-readable name of the sequence + name + % Field of view specified in meters. + fov + % Total duration of the sequence is seconds + total_duration + custom + end + + methods + function self = PulseqDefinitions(kwargs) + arguments + kwargs.gradient_raster_time = double(0); + kwargs.radiofrequency_raster_time = double(0); + kwargs.adc_raster_time = double(0); + kwargs.block_duration_raster = double(0); + kwargs.name = yardl.None; + kwargs.fov = yardl.None; + kwargs.total_duration = yardl.None; + kwargs.custom = yardl.Map; + end + self.gradient_raster_time = kwargs.gradient_raster_time; + self.radiofrequency_raster_time = kwargs.radiofrequency_raster_time; + self.adc_raster_time = kwargs.adc_raster_time; + self.block_duration_raster = kwargs.block_duration_raster; + self.name = kwargs.name; + self.fov = kwargs.fov; + self.total_duration = kwargs.total_duration; + self.custom = kwargs.custom; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.PulseqDefinitions") && ... + isequal({self.gradient_raster_time}, {other.gradient_raster_time}) && ... + isequal({self.radiofrequency_raster_time}, {other.radiofrequency_raster_time}) && ... + isequal({self.adc_raster_time}, {other.adc_raster_time}) && ... + isequal({self.block_duration_raster}, {other.block_duration_raster}) && ... + isequal({self.name}, {other.name}) && ... + isequal({self.fov}, {other.fov}) && ... + isequal({self.total_duration}, {other.total_duration}) && ... + isequal({self.custom}, {other.custom}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.PulseqDefinitions(); + 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/RFEvent.m b/matlab/toolbox/+mrd/RFEvent.m new file mode 100644 index 00000000..a500fa8e --- /dev/null +++ b/matlab/toolbox/+mrd/RFEvent.m @@ -0,0 +1,106 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef RFEvent < handle + % An RF event + properties + % ID of the RF event + id + % Peak amplitude in Hz + amp + % Shape ID for the magnitude profile + mag_id + % Shape ID for the phase profile + phase_id + % Shape ID for the time sampling points, specified in the units of + % RadiofrequencyRasterTime. + % 0 means default time raster + time_id + % Time point in microseconds relative to the beginning of + % the RF shape at which the effective rotation takes place + center + % Delay before starting the RF pulse, specified in microseconds + delay + % Frequency offset relative to the main system's frequency, + % specified in parts per million (ppm) + freq_ppm + % Phase offset proportional to the main system's frequency, + % specified in rad/MHz + phase_ppm + % Frequency offset in absolute units, specified in Hz + freq_offset + % Phase offset in absolute units, specified in radians + phase_offset + use + end + + methods + function self = RFEvent(kwargs) + arguments + kwargs.id = int32(0); + kwargs.amp = double(0); + kwargs.mag_id = int32(0); + kwargs.phase_id = int32(0); + kwargs.time_id = int32(0); + kwargs.center = double(0); + kwargs.delay = uint64(0); + kwargs.freq_ppm = double(0); + kwargs.phase_ppm = double(0); + kwargs.freq_offset = double(0); + kwargs.phase_offset = double(0); + kwargs.use = mrd.RFPulseUse.UNDEFINED; + end + self.id = kwargs.id; + self.amp = kwargs.amp; + self.mag_id = kwargs.mag_id; + self.phase_id = kwargs.phase_id; + self.time_id = kwargs.time_id; + self.center = kwargs.center; + self.delay = kwargs.delay; + self.freq_ppm = kwargs.freq_ppm; + self.phase_ppm = kwargs.phase_ppm; + self.freq_offset = kwargs.freq_offset; + self.phase_offset = kwargs.phase_offset; + self.use = kwargs.use; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.RFEvent") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.amp}, {other.amp}) && ... + isequal({self.mag_id}, {other.mag_id}) && ... + isequal({self.phase_id}, {other.phase_id}) && ... + isequal({self.time_id}, {other.time_id}) && ... + isequal({self.center}, {other.center}) && ... + isequal({self.delay}, {other.delay}) && ... + isequal({self.freq_ppm}, {other.freq_ppm}) && ... + isequal({self.phase_ppm}, {other.phase_ppm}) && ... + isequal({self.freq_offset}, {other.freq_offset}) && ... + isequal({self.phase_offset}, {other.phase_offset}) && ... + isequal({self.use}, {other.use}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.RFEvent(); + 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/RFPulseUse.m b/matlab/toolbox/+mrd/RFPulseUse.m new file mode 100644 index 00000000..db84d3de --- /dev/null +++ b/matlab/toolbox/+mrd/RFPulseUse.m @@ -0,0 +1,40 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef RFPulseUse < uint64 + methods (Static) + function v = UNDEFINED + v = mrd.RFPulseUse(0); + end + function v = EXCITATION + v = mrd.RFPulseUse(1); + end + function v = REFOCUSING + v = mrd.RFPulseUse(2); + end + function v = INVERSION + v = mrd.RFPulseUse(3); + end + function v = SATURATION + v = mrd.RFPulseUse(4); + end + function v = PREPARATION + v = mrd.RFPulseUse(5); + end + function v = OTHER + v = mrd.RFPulseUse(6); + end + + function z = zeros(varargin) + elem = mrd.RFPulseUse(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/Shape.m b/matlab/toolbox/+mrd/Shape.m new file mode 100644 index 00000000..48019905 --- /dev/null +++ b/matlab/toolbox/+mrd/Shape.m @@ -0,0 +1,59 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef Shape < handle + % A list of samples that is potentially compressed. + % If numSamples == size(data) then the shape is uncompressed. + properties + % ID of the shape + id + % Number of samples of the uncompressed shape + num_samples + % Samples of the (potentially) compressed shape. See the Pulseq specification for compression details. + % In the spec, this should be float32, but PyPulseq uses float64. + data + end + + methods + function self = Shape(kwargs) + arguments + kwargs.id = int32(0); + kwargs.num_samples = uint64(0); + kwargs.data = double.empty(); + end + self.id = kwargs.id; + self.num_samples = kwargs.num_samples; + self.data = kwargs.data; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.Shape") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.num_samples}, {other.num_samples}) && ... + isequal({self.data}, {other.data}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.Shape(); + 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/StreamItem.m b/matlab/toolbox/+mrd/StreamItem.m index b803e8d8..8f396452 100644 --- a/matlab/toolbox/+mrd/StreamItem.m +++ b/matlab/toolbox/+mrd/StreamItem.m @@ -6,58 +6,90 @@ res = mrd.StreamItem(1, value); end - function res = WaveformUint32(value) + function res = AcquisitionPrototype(value) res = mrd.StreamItem(2, value); end - function res = ImageUint16(value) + function res = WaveformUint32(value) res = mrd.StreamItem(3, value); end - function res = ImageInt16(value) + function res = ImageUint16(value) res = mrd.StreamItem(4, value); end - function res = ImageUint32(value) + function res = ImageInt16(value) res = mrd.StreamItem(5, value); end - function res = ImageInt32(value) + function res = ImageUint32(value) res = mrd.StreamItem(6, value); end - function res = ImageFloat(value) + function res = ImageInt32(value) res = mrd.StreamItem(7, value); end - function res = ImageDouble(value) + function res = ImageFloat(value) res = mrd.StreamItem(8, value); end - function res = ImageComplexFloat(value) + function res = ImageDouble(value) res = mrd.StreamItem(9, value); end - function res = ImageComplexDouble(value) + function res = ImageComplexFloat(value) res = mrd.StreamItem(10, value); end - function res = AcquisitionBucket(value) + function res = ImageComplexDouble(value) res = mrd.StreamItem(11, value); end - function res = ReconData(value) + function res = AcquisitionBucket(value) res = mrd.StreamItem(12, value); end - function res = ArrayComplexFloat(value) + function res = ReconData(value) res = mrd.StreamItem(13, value); end - function res = ImageArray(value) + function res = ArrayComplexFloat(value) res = mrd.StreamItem(14, value); end + function res = ImageArray(value) + res = mrd.StreamItem(15, value); + end + + function res = PulseqDefinitions(value) + res = mrd.StreamItem(16, value); + end + + function res = Blocks(value) + res = mrd.StreamItem(17, value); + end + + function res = Rf(value) + res = mrd.StreamItem(18, value); + end + + function res = ArbitraryGradient(value) + res = mrd.StreamItem(19, value); + end + + function res = TrapezoidalGradient(value) + res = mrd.StreamItem(20, value); + end + + function res = Adc(value) + res = mrd.StreamItem(21, value); + end + + function res = Shape(value) + res = mrd.StreamItem(22, value); + end + function z = zeros(varargin) elem = mrd.StreamItem(0, yardl.None); if nargin == 0 @@ -77,58 +109,90 @@ res = self.index == 1; end - function res = isWaveformUint32(self) + function res = isAcquisitionPrototype(self) res = self.index == 2; end - function res = isImageUint16(self) + function res = isWaveformUint32(self) res = self.index == 3; end - function res = isImageInt16(self) + function res = isImageUint16(self) res = self.index == 4; end - function res = isImageUint32(self) + function res = isImageInt16(self) res = self.index == 5; end - function res = isImageInt32(self) + function res = isImageUint32(self) res = self.index == 6; end - function res = isImageFloat(self) + function res = isImageInt32(self) res = self.index == 7; end - function res = isImageDouble(self) + function res = isImageFloat(self) res = self.index == 8; end - function res = isImageComplexFloat(self) + function res = isImageDouble(self) res = self.index == 9; end - function res = isImageComplexDouble(self) + function res = isImageComplexFloat(self) res = self.index == 10; end - function res = isAcquisitionBucket(self) + function res = isImageComplexDouble(self) res = self.index == 11; end - function res = isReconData(self) + function res = isAcquisitionBucket(self) res = self.index == 12; end - function res = isArrayComplexFloat(self) + function res = isReconData(self) res = self.index == 13; end - function res = isImageArray(self) + function res = isArrayComplexFloat(self) res = self.index == 14; end + function res = isImageArray(self) + res = self.index == 15; + end + + function res = isPulseqDefinitions(self) + res = self.index == 16; + end + + function res = isBlocks(self) + res = self.index == 17; + end + + function res = isRf(self) + res = self.index == 18; + end + + function res = isArbitraryGradient(self) + res = self.index == 19; + end + + function res = isTrapezoidalGradient(self) + res = self.index == 20; + end + + function res = isAdc(self) + res = self.index == 21; + end + + function res = isShape(self) + res = self.index == 22; + end + function eq = eq(self, other) eq = isa(other, "mrd.StreamItem") && all([self.index_] == [other.index_], 'all') && all([self.value] == [other.value], 'all'); end @@ -138,7 +202,7 @@ end function t = tag(self) - tags_ = ["Acquisition", "WaveformUint32", "ImageUint16", "ImageInt16", "ImageUint32", "ImageInt32", "ImageFloat", "ImageDouble", "ImageComplexFloat", "ImageComplexDouble", "AcquisitionBucket", "ReconData", "ArrayComplexFloat", "ImageArray"]; + tags_ = ["Acquisition", "AcquisitionPrototype", "WaveformUint32", "ImageUint16", "ImageInt16", "ImageUint32", "ImageInt32", "ImageFloat", "ImageDouble", "ImageComplexFloat", "ImageComplexDouble", "AcquisitionBucket", "ReconData", "ArrayComplexFloat", "ImageArray", "PulseqDefinitions", "Blocks", "Rf", "ArbitraryGradient", "TrapezoidalGradient", "Adc", "Shape"]; t = tags_(self.index_); end end diff --git a/matlab/toolbox/+mrd/TrapezoidalGradient.m b/matlab/toolbox/+mrd/TrapezoidalGradient.m new file mode 100644 index 00000000..d6ef03ea --- /dev/null +++ b/matlab/toolbox/+mrd/TrapezoidalGradient.m @@ -0,0 +1,72 @@ +% This file was generated by the "yardl" tool. DO NOT EDIT. + +classdef TrapezoidalGradient < handle + % A trapezoidal gradient event + properties + % ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + id + % Peak amplitude in Hz/m + amp + % Rise time of the trapezoid in microseconds + rise + % Flat-top time of the trapezoid in microseconds + flat + % Fall time of the trapezoid in microseconds + fall + % Delay before starting the gradient, specified in microseconds + delay + end + + methods + function self = TrapezoidalGradient(kwargs) + arguments + kwargs.id = int32(0); + kwargs.amp = double(0); + kwargs.rise = uint64(0); + kwargs.flat = uint64(0); + kwargs.fall = uint64(0); + kwargs.delay = uint64(0); + end + self.id = kwargs.id; + self.amp = kwargs.amp; + self.rise = kwargs.rise; + self.flat = kwargs.flat; + self.fall = kwargs.fall; + self.delay = kwargs.delay; + end + + function res = eq(self, other) + res = ... + isa(other, "mrd.TrapezoidalGradient") && ... + isequal({self.id}, {other.id}) && ... + isequal({self.amp}, {other.amp}) && ... + isequal({self.rise}, {other.rise}) && ... + isequal({self.flat}, {other.flat}) && ... + isequal({self.fall}, {other.fall}) && ... + isequal({self.delay}, {other.delay}); + end + + function res = ne(self, other) + res = ~self.eq(other); + end + + function res = isequal(self, other) + res = all(eq(self, other)); + end + end + + methods (Static) + function z = zeros(varargin) + elem = mrd.TrapezoidalGradient(); + 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/model/mrd_acquisition.yml b/model/mrd_acquisition.yml index b6c55bd4..d6b2472a 100644 --- a/model/mrd_acquisition.yml +++ b/model/mrd_acquisition.yml @@ -124,4 +124,12 @@ Acquisition: !record samples: size(data, "samples") activeChannels: size(head.channelOrder) trajectoryDimensions: size(trajectory, "basis") - trajectorySamples: size(trajectory, "samples") \ No newline at end of file + trajectorySamples: size(trajectory, "samples") + +# Specifies header and data size of an acquisition, without the actual data. +AcquisitionPrototype: !record + fields: + # Acquisition header template + head: AcquisitionHeader + # Sample counts by coil + dataSampleCounts: uint[()] diff --git a/model/mrd_protocol.yml b/model/mrd_protocol.yml index d185d883..54808b3e 100644 --- a/model/mrd_protocol.yml +++ b/model/mrd_protocol.yml @@ -1,19 +1,27 @@ # Union of all primary types that can be streamed in the MRD Protocol -StreamItem: - - Acquisition - - WaveformUint32 - - ImageUint16 - - ImageInt16 - - ImageUint32 - - ImageInt32 - - ImageFloat - - ImageDouble - - ImageComplexFloat - - ImageComplexDouble - - AcquisitionBucket - - ReconData - - ArrayComplexFloat - - ImageArray +StreamItem: !union + acquisition: Acquisition + acquisitionPrototype: AcquisitionPrototype + waveformUint32: WaveformUint32 + imageUint16: ImageUint16 + imageInt16: ImageInt16 + imageUint32: ImageUint32 + imageInt32: ImageInt32 + imageFloat: ImageFloat + imageDouble: ImageDouble + imageComplexFloat: ImageComplexFloat + imageComplexDouble: ImageComplexDouble + acquisitionBucket: AcquisitionBucket + reconData: ReconData + arrayComplexFloat: ArrayComplexFloat + imageArray: ImageArray + pulseqDefinitions: PulseqDefinitions + blocks: Block* + rf: RFEvent + arbitraryGradient: ArbitraryGradient + trapezoidalGradient: TrapezoidalGradient + adc: ADCEvent + shape: Shape # The MRD Protocol diff --git a/model/mrd_pulseq.yml b/model/mrd_pulseq.yml new file mode 100644 index 00000000..36a6a978 --- /dev/null +++ b/model/mrd_pulseq.yml @@ -0,0 +1,203 @@ +# Pulseq definitions +PulseqDefinitions: !record + fields: + # Default raster time (dwell time) of the shaped gradient events, specified in seconds + gradientRasterTime: float64 + + # Default raster time (dwell time) of the radio-frequency pulse shapes, specified in seconds + radiofrequencyRasterTime: float64 + + # The value defining the alignment of the ADC dwell times. + # ADC dwell time must be integer multiple of the specified adcRasterTime. + # adcRasterTime is specified in seconds + adcRasterTime: float64 + + # The value defining the alignment of the block durations, specified in seconds; + # the physical block duration must be integer multiple of the specified blockDurationRaster. + # Block duration in the blocks section are specified in the units of blockDurationRaster + blockDurationRaster: float64 + + # Human-readable name of the sequence + name: string? + + # Field of view specified in meters. + fov: ThreeDimensionalFloat? + + # Total duration of the sequence is seconds + totalDuration: float64? + + custom: string->string + +# A sequence block that includes possible RF, gradient, and ADC events. +Block: !record + fields: + # ID of the sequence block + id: int32 + + # Duration of the block in units of Definitions.blockDurationRaster + duration: uint64 + + # ID of the RF event + rf: int32 + + # ID of the gradient event on the X channel + gx: int32 + + # ID of the gradient event on the Y channel + gy: int32 + + # ID of the gradient event on the Z channel + gz: int32 + + # ID of the ADC event + adc: int32 + + # ID of the extension table entry + ext: int32 + + +RFPulseUse: !enum + values: + - undefined + - excitation + - refocusing + - inversion + - saturation + - preparation + - other + +# An RF event +RFEvent: !record + fields: + # ID of the RF event + id: int32 + + # Peak amplitude in Hz + amp: float64 + + # Shape ID for the magnitude profile + magId: int32 + + # Shape ID for the phase profile + phaseId: int32 + + # Shape ID for the time sampling points, specified in the units of + # RadiofrequencyRasterTime. + # 0 means default time raster + timeId: int32 + + # Time point in microseconds relative to the beginning of + # the RF shape at which the effective rotation takes place + center: float64 + + # Delay before starting the RF pulse, specified in microseconds + delay: uint64 + + # Frequency offset relative to the main system's frequency, + # specified in parts per million (ppm) + freqPPM: float64 + + # Phase offset proportional to the main system's frequency, + # specified in rad/MHz + phasePPM: float64 + + # Frequency offset in absolute units, specified in Hz + freqOffset: float64 + + # Phase offset in absolute units, specified in radians + phaseOffset: float64 + + use: RFPulseUse + +# An arbitrary gradient event +ArbitraryGradient: !record + fields: + # ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + id: int32 + + # Peak amplitude in Hz/m + amp: float64 + + # The amplitude at the start of the gradient. + first: float64 + + # The amplitude at the end of the gradient. + last: float64 + + # Shape ID for the gradient shape + shapeId: int32 + + # Shape ID for the time sampling points, specified in the units of GradientRasterTime. + # 0 means default time raster, -1 means 1/2 of the default time raster (gradient oversampling case). + timeId: int32 + + # Delay before starting the gradient, specified in microseconds + delay: uint64 + +# A trapezoidal gradient event +TrapezoidalGradient: !record + fields: + # ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events. + id: int32 + + # Peak amplitude in Hz/m + amp: float64 + + # Rise time of the trapezoid in microseconds + rise: uint64 + + # Flat-top time of the trapezoid in microseconds + flat: uint64 + + # Fall time of the trapezoid in microseconds + fall: uint64 + + # Delay before starting the gradient, specified in microseconds + delay: uint64 + + +# An ADC event +ADCEvent: !record + fields: + # ID of the ADC event + id: int32 + + # Number of samples + num: uint64 + + # The ADC dwell time, specified in nanoseconds + dwell: float + + # Delay between start of block and first sample, specified in microseconds + delay: uint64 + + # Frequency offset of the ADC receiver relative to the system frequency, + # specified in parts per million (ppm) + freqPPM: float64 + + # Phase offset of the ADC receiver proportional to the system frequency, + # specified in rad/MHz + phasePPM: float64 + + # Frequency offset of the ADC receiver in absolute units, specified in Hz + freq: float64 + + # Phase offset in absolute units, specified in radians + phase: float64 + + # The shape ID + phaseShapeId: int32 + +# A list of samples that is potentially compressed. +# If numSamples == size(data) then the shape is uncompressed. +Shape: !record + fields: + # ID of the shape + id: int32 + + # Number of samples of the uncompressed shape + numSamples: uint64 + + # Samples of the (potentially) compressed shape. See the Pulseq specification for compression details. + # In the spec, this should be float32, but PyPulseq uses float64. + data: float64[()] diff --git a/python/mrd/__init__.py b/python/mrd/__init__.py index 52e0c64d..809e4329 100644 --- a/python/mrd/__init__.py +++ b/python/mrd/__init__.py @@ -20,16 +20,20 @@ def _parse_version(version: str) -> _Tuple[int, ...]: from .yardl_types import * from .types import ( + ADCEvent, AccelerationFactorType, Acquisition, AcquisitionBucket, AcquisitionData, AcquisitionFlags, AcquisitionHeader, + AcquisitionPrototype, AcquisitionSystemInformationType, AnyImage, + ArbitraryGradient, Array, ArrayComplexFloat, + Block, Calibration, CalibrationMode, CoilLabelType, @@ -70,6 +74,9 @@ def _parse_version(version: str) -> _Tuple[int, ...]: ParallelImagingType, PatientGender, PatientPosition, + PulseqDefinitions, + RFEvent, + RFPulseUse, ReconAssembly, ReconBuffer, ReconData, @@ -77,6 +84,7 @@ def _parse_version(version: str) -> _Tuple[int, ...]: SamplingDescription, SamplingLimits, SequenceParametersType, + Shape, StreamItem, StudyInformationType, SubjectInformationType, @@ -84,6 +92,7 @@ def _parse_version(version: str) -> _Tuple[int, ...]: Trajectory, TrajectoryData, TrajectoryDescriptionType, + TrapezoidalGradient, UserParameterBase64Type, UserParameterDoubleType, UserParameterLongType, diff --git a/python/mrd/_binary.py b/python/mrd/_binary.py index 8c3c7d86..72182920 100644 --- a/python/mrd/_binary.py +++ b/python/mrd/_binary.py @@ -632,7 +632,7 @@ def write_numpy(self, stream: CodedOutputStream, value: np.complex64) -> None: stream.write(self._struct, value.real, value.imag) def read(self, stream: CodedInputStream) -> ComplexFloat: - return ComplexFloat(*stream.read(self._struct)) + return complex(*stream.read(self._struct)) def read_numpy(self, stream: CodedInputStream) -> np.complex64: real, imag = stream.read(self._struct) @@ -656,7 +656,7 @@ def write_numpy(self, stream: CodedOutputStream, value: np.complex128) -> None: stream.write(self._struct, value.real, value.imag) def read(self, stream: CodedInputStream) -> ComplexDouble: - return ComplexDouble(*stream.read(self._struct)) + return complex(*stream.read(self._struct)) def read_numpy(self, stream: CodedInputStream) -> np.complex128: real, imag = stream.read(self._struct) @@ -687,7 +687,7 @@ def read(self, stream: CodedInputStream) -> str: return str(view, "utf-8") def read_numpy(self, stream: CodedInputStream) -> np.object_: - return np.object_(self.read(stream)) + return np.object_(self.read(stream)) # pyright: ignore [reportReturnType] string_serializer = StringSerializer() @@ -770,7 +770,7 @@ def read_numpy(self, stream: CodedInputStream) -> np.timedelta64: time_serializer = TimeSerializer() DATETIME_NANOSECONDS_DTYPE = np.dtype("datetime64[ns]") -EPOCH_DATETIME = datetime.datetime.utcfromtimestamp(0) +EPOCH_DATETIME = datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc) class DateTimeSerializer(TypeSerializer[DateTime, np.datetime64]): @@ -1034,7 +1034,7 @@ def read(self, stream: CodedInputStream) -> list[T]: return [self._element_serializer.read(stream) for _ in range(length)] def read_numpy(self, stream: CodedInputStream) -> np.object_: - return np.object_(self.read(stream)) + return np.object_(self.read(stream)) # pyright: ignore [reportReturnType] TKey = TypeVar("TKey") @@ -1073,7 +1073,7 @@ def read(self, stream: CodedInputStream) -> dict[TKey, TValue]: } def read_numpy(self, stream: CodedInputStream) -> np.object_: - return np.object_(self.read(stream)) + return np.object_(self.read(stream)) # pyright: ignore [reportReturnType] class NDArraySerializerBase( diff --git a/python/mrd/_dtypes.py b/python/mrd/_dtypes.py index 58417889..4215d496 100644 --- a/python/mrd/_dtypes.py +++ b/python/mrd/_dtypes.py @@ -3,6 +3,7 @@ import datetime from types import GenericAlias +from typing import Annotated, Any import sys if sys.version_info >= (3, 10): @@ -15,10 +16,13 @@ def make_get_dtype_func( dtype_map: dict[ - Union[type, GenericAlias], + Union[type, GenericAlias, Annotated[Any, Any]], Union[np.dtype[Any], Callable[[tuple[type, ...]], np.dtype[Any]]], - ] -) -> Callable[[Union[type, GenericAlias]], np.dtype[Any]]: + ], +) -> Callable[ + [Union[type, GenericAlias, Annotated[Any, Any]]], + np.dtype[Any], +]: dtype_map[bool] = np.dtype(np.bool_) dtype_map[yardl.Int8] = np.dtype(np.int8) dtype_map[yardl.UInt8] = np.dtype(np.uint8) @@ -50,7 +54,7 @@ def make_get_dtype_func( def get_dtype_impl( dtype_map: dict[ - Union[type, GenericAlias], + Union[type, GenericAlias, Annotated[Any, Any]], Union[np.dtype[Any], Callable[[tuple[type, ...]], np.dtype[Any]]], ], t: Union[type, GenericAlias], @@ -65,7 +69,8 @@ def get_dtype_impl( origin = get_origin(t) if origin == Union or ( - sys.version_info >= (3, 10) and isinstance(t, UnionType) + sys.version_info >= (3, 10) + and isinstance(t, UnionType) # pyright: ignore[reportUnnecessaryIsInstance] ): return _get_union_dtype(get_args(t)) diff --git a/python/mrd/_ndjson.py b/python/mrd/_ndjson.py index 7cb67c1d..427708e3 100644 --- a/python/mrd/_ndjson.py +++ b/python/mrd/_ndjson.py @@ -568,7 +568,7 @@ def from_json(self, json_object: object) -> str: return cast(str, json_object) def from_json_to_numpy(self, json_object: object) -> np.object_: - return np.object_(json_object) + return np.object_(json_object) # pyright: ignore [reportReturnType] string_converter = StringConverter() diff --git a/python/mrd/binary.py b/python/mrd/binary.py index c8321d8e..82bb69d6 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.AcquisitionPrototype, AcquisitionPrototypeSerializer()), (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()), (StreamItem.PulseqDefinitions, PulseqDefinitionsSerializer()), (StreamItem.Blocks, _binary.VectorSerializer(BlockSerializer())), (StreamItem.Rf, RFEventSerializer()), (StreamItem.ArbitraryGradient, ArbitraryGradientSerializer()), (StreamItem.TrapezoidalGradient, TrapezoidalGradientSerializer()), (StreamItem.Adc, ADCEventSerializer()), (StreamItem.Shape, ShapeSerializer())])).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.AcquisitionPrototype, AcquisitionPrototypeSerializer()), (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()), (StreamItem.PulseqDefinitions, PulseqDefinitionsSerializer()), (StreamItem.Blocks, _binary.VectorSerializer(BlockSerializer())), (StreamItem.Rf, RFEventSerializer()), (StreamItem.ArbitraryGradient, ArbitraryGradientSerializer()), (StreamItem.TrapezoidalGradient, TrapezoidalGradientSerializer()), (StreamItem.Adc, ADCEventSerializer()), (StreamItem.Shape, ShapeSerializer())])).read(self._stream) class BinaryMrdNoiseCovarianceWriter(_binary.BinaryProtocolWriter, MrdNoiseCovarianceWriterBase): """Binary writer for the MrdNoiseCovariance protocol. @@ -137,6 +137,24 @@ def read(self, stream: _binary.CodedInputStream) -> Acquisition: return Acquisition(head=field_values[0], data=field_values[1], trajectory=field_values[2]) +class AcquisitionPrototypeSerializer(_binary.RecordSerializer[AcquisitionPrototype]): + def __init__(self) -> None: + super().__init__([("head", AcquisitionHeaderSerializer()), ("data_sample_counts", _binary.NDArraySerializer(_binary.uint32_serializer, 1))]) + + def write(self, stream: _binary.CodedOutputStream, value: AcquisitionPrototype) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.head, value.data_sample_counts) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['head'], value['data_sample_counts']) + + def read(self, stream: _binary.CodedInputStream) -> AcquisitionPrototype: + field_values = self._read(stream) + return AcquisitionPrototype(head=field_values[0], data_sample_counts=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 +893,129 @@ 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 PulseqDefinitionsSerializer(_binary.RecordSerializer[PulseqDefinitions]): + def __init__(self) -> None: + super().__init__([("gradient_raster_time", _binary.float64_serializer), ("radiofrequency_raster_time", _binary.float64_serializer), ("adc_raster_time", _binary.float64_serializer), ("block_duration_raster", _binary.float64_serializer), ("name", _binary.OptionalSerializer(_binary.string_serializer)), ("fov", _binary.OptionalSerializer(ThreeDimensionalFloatSerializer())), ("total_duration", _binary.OptionalSerializer(_binary.float64_serializer)), ("custom", _binary.MapSerializer(_binary.string_serializer, _binary.string_serializer))]) + + def write(self, stream: _binary.CodedOutputStream, value: PulseqDefinitions) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.gradient_raster_time, value.radiofrequency_raster_time, value.adc_raster_time, value.block_duration_raster, value.name, value.fov, value.total_duration, value.custom) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['gradient_raster_time'], value['radiofrequency_raster_time'], value['adc_raster_time'], value['block_duration_raster'], value['name'], value['fov'], value['total_duration'], value['custom']) + + def read(self, stream: _binary.CodedInputStream) -> PulseqDefinitions: + field_values = self._read(stream) + return PulseqDefinitions(gradient_raster_time=field_values[0], radiofrequency_raster_time=field_values[1], adc_raster_time=field_values[2], block_duration_raster=field_values[3], name=field_values[4], fov=field_values[5], total_duration=field_values[6], custom=field_values[7]) + + +class BlockSerializer(_binary.RecordSerializer[Block]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("duration", _binary.uint64_serializer), ("rf", _binary.int32_serializer), ("gx", _binary.int32_serializer), ("gy", _binary.int32_serializer), ("gz", _binary.int32_serializer), ("adc", _binary.int32_serializer), ("ext", _binary.int32_serializer)]) + + def write(self, stream: _binary.CodedOutputStream, value: Block) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.duration, value.rf, value.gx, value.gy, value.gz, value.adc, value.ext) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['duration'], value['rf'], value['gx'], value['gy'], value['gz'], value['adc'], value['ext']) + + def read(self, stream: _binary.CodedInputStream) -> Block: + field_values = self._read(stream) + return Block(id=field_values[0], duration=field_values[1], rf=field_values[2], gx=field_values[3], gy=field_values[4], gz=field_values[5], adc=field_values[6], ext=field_values[7]) + + +class RFEventSerializer(_binary.RecordSerializer[RFEvent]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("amp", _binary.float64_serializer), ("mag_id", _binary.int32_serializer), ("phase_id", _binary.int32_serializer), ("time_id", _binary.int32_serializer), ("center", _binary.float64_serializer), ("delay", _binary.uint64_serializer), ("freq_ppm", _binary.float64_serializer), ("phase_ppm", _binary.float64_serializer), ("freq_offset", _binary.float64_serializer), ("phase_offset", _binary.float64_serializer), ("use", _binary.EnumSerializer(_binary.int32_serializer, RFPulseUse))]) + + def write(self, stream: _binary.CodedOutputStream, value: RFEvent) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.amp, value.mag_id, value.phase_id, value.time_id, value.center, value.delay, value.freq_ppm, value.phase_ppm, value.freq_offset, value.phase_offset, value.use) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['amp'], value['mag_id'], value['phase_id'], value['time_id'], value['center'], value['delay'], value['freq_ppm'], value['phase_ppm'], value['freq_offset'], value['phase_offset'], value['use']) + + def read(self, stream: _binary.CodedInputStream) -> RFEvent: + field_values = self._read(stream) + return RFEvent(id=field_values[0], amp=field_values[1], mag_id=field_values[2], phase_id=field_values[3], time_id=field_values[4], center=field_values[5], delay=field_values[6], freq_ppm=field_values[7], phase_ppm=field_values[8], freq_offset=field_values[9], phase_offset=field_values[10], use=field_values[11]) + + +class ArbitraryGradientSerializer(_binary.RecordSerializer[ArbitraryGradient]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("amp", _binary.float64_serializer), ("first", _binary.float64_serializer), ("last", _binary.float64_serializer), ("shape_id", _binary.int32_serializer), ("time_id", _binary.int32_serializer), ("delay", _binary.uint64_serializer)]) + + def write(self, stream: _binary.CodedOutputStream, value: ArbitraryGradient) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.amp, value.first, value.last, value.shape_id, value.time_id, value.delay) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['amp'], value['first'], value['last'], value['shape_id'], value['time_id'], value['delay']) + + def read(self, stream: _binary.CodedInputStream) -> ArbitraryGradient: + field_values = self._read(stream) + return ArbitraryGradient(id=field_values[0], amp=field_values[1], first=field_values[2], last=field_values[3], shape_id=field_values[4], time_id=field_values[5], delay=field_values[6]) + + +class TrapezoidalGradientSerializer(_binary.RecordSerializer[TrapezoidalGradient]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("amp", _binary.float64_serializer), ("rise", _binary.uint64_serializer), ("flat", _binary.uint64_serializer), ("fall", _binary.uint64_serializer), ("delay", _binary.uint64_serializer)]) + + def write(self, stream: _binary.CodedOutputStream, value: TrapezoidalGradient) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.amp, value.rise, value.flat, value.fall, value.delay) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['amp'], value['rise'], value['flat'], value['fall'], value['delay']) + + def read(self, stream: _binary.CodedInputStream) -> TrapezoidalGradient: + field_values = self._read(stream) + return TrapezoidalGradient(id=field_values[0], amp=field_values[1], rise=field_values[2], flat=field_values[3], fall=field_values[4], delay=field_values[5]) + + +class ADCEventSerializer(_binary.RecordSerializer[ADCEvent]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("num", _binary.uint64_serializer), ("dwell", _binary.float32_serializer), ("delay", _binary.uint64_serializer), ("freq_ppm", _binary.float64_serializer), ("phase_ppm", _binary.float64_serializer), ("freq", _binary.float64_serializer), ("phase", _binary.float64_serializer), ("phase_shape_id", _binary.int32_serializer)]) + + def write(self, stream: _binary.CodedOutputStream, value: ADCEvent) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.num, value.dwell, value.delay, value.freq_ppm, value.phase_ppm, value.freq, value.phase, value.phase_shape_id) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['num'], value['dwell'], value['delay'], value['freq_ppm'], value['phase_ppm'], value['freq'], value['phase'], value['phase_shape_id']) + + def read(self, stream: _binary.CodedInputStream) -> ADCEvent: + field_values = self._read(stream) + return ADCEvent(id=field_values[0], num=field_values[1], dwell=field_values[2], delay=field_values[3], freq_ppm=field_values[4], phase_ppm=field_values[5], freq=field_values[6], phase=field_values[7], phase_shape_id=field_values[8]) + + +class ShapeSerializer(_binary.RecordSerializer[Shape]): + def __init__(self) -> None: + super().__init__([("id", _binary.int32_serializer), ("num_samples", _binary.uint64_serializer), ("data", _binary.NDArraySerializer(_binary.float64_serializer, 1))]) + + def write(self, stream: _binary.CodedOutputStream, value: Shape) -> None: + if isinstance(value, np.void): + self.write_numpy(stream, value) + return + self._write(stream, value.id, value.num_samples, value.data) + + def write_numpy(self, stream: _binary.CodedOutputStream, value: np.void) -> None: + self._write(stream, value['id'], value['num_samples'], value['data']) + + def read(self, stream: _binary.CodedInputStream) -> Shape: + field_values = self._read(stream) + return Shape(id=field_values[0], num_samples=field_values[1], data=field_values[2]) + + diff --git a/python/mrd/ndjson.py b/python/mrd/ndjson.py index 88926aa7..33f412f6 100644 --- a/python/mrd/ndjson.py +++ b/python/mrd/ndjson.py @@ -374,6 +374,50 @@ def from_json_to_numpy(self, json_object: object) -> np.void: ) # type:ignore +class AcquisitionPrototypeConverter(_ndjson.JsonConverter[AcquisitionPrototype, np.void]): + def __init__(self) -> None: + self._head_converter = AcquisitionHeaderConverter() + self._data_sample_counts_converter = _ndjson.NDArrayConverter(_ndjson.uint32_converter, 1) + super().__init__(np.dtype([ + ("head", self._head_converter.overall_dtype()), + ("data_sample_counts", self._data_sample_counts_converter.overall_dtype()), + ])) + + def to_json(self, value: AcquisitionPrototype) -> object: + if not isinstance(value, AcquisitionPrototype): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'AcquisitionPrototype' instance") + json_object = {} + + json_object["head"] = self._head_converter.to_json(value.head) + json_object["dataSampleCounts"] = self._data_sample_counts_converter.to_json(value.data_sample_counts) + 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["dataSampleCounts"] = self._data_sample_counts_converter.numpy_to_json(value["data_sample_counts"]) + return json_object + + def from_json(self, json_object: object) -> AcquisitionPrototype: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return AcquisitionPrototype( + head=self._head_converter.from_json(json_object["head"],), + data_sample_counts=self._data_sample_counts_converter.from_json(json_object["dataSampleCounts"],), + ) + + 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_sample_counts_converter.from_json_to_numpy(json_object["dataSampleCounts"]), + ) # type:ignore + + patient_gender_name_to_value_map = { "m": PatientGender.M, "f": PatientGender.F, @@ -3149,6 +3193,565 @@ def from_json_to_numpy(self, json_object: object) -> np.void: ) # type:ignore +class PulseqDefinitionsConverter(_ndjson.JsonConverter[PulseqDefinitions, np.void]): + def __init__(self) -> None: + self._gradient_raster_time_converter = _ndjson.float64_converter + self._radiofrequency_raster_time_converter = _ndjson.float64_converter + self._adc_raster_time_converter = _ndjson.float64_converter + self._block_duration_raster_converter = _ndjson.float64_converter + self._name_converter = _ndjson.OptionalConverter(_ndjson.string_converter) + self._fov_converter = _ndjson.OptionalConverter(ThreeDimensionalFloatConverter()) + self._total_duration_converter = _ndjson.OptionalConverter(_ndjson.float64_converter) + self._custom_converter = _ndjson.MapConverter(_ndjson.string_converter, _ndjson.string_converter) + super().__init__(np.dtype([ + ("gradient_raster_time", self._gradient_raster_time_converter.overall_dtype()), + ("radiofrequency_raster_time", self._radiofrequency_raster_time_converter.overall_dtype()), + ("adc_raster_time", self._adc_raster_time_converter.overall_dtype()), + ("block_duration_raster", self._block_duration_raster_converter.overall_dtype()), + ("name", self._name_converter.overall_dtype()), + ("fov", self._fov_converter.overall_dtype()), + ("total_duration", self._total_duration_converter.overall_dtype()), + ("custom", self._custom_converter.overall_dtype()), + ])) + + def to_json(self, value: PulseqDefinitions) -> object: + if not isinstance(value, PulseqDefinitions): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'PulseqDefinitions' instance") + json_object = {} + + json_object["gradientRasterTime"] = self._gradient_raster_time_converter.to_json(value.gradient_raster_time) + json_object["radiofrequencyRasterTime"] = self._radiofrequency_raster_time_converter.to_json(value.radiofrequency_raster_time) + json_object["adcRasterTime"] = self._adc_raster_time_converter.to_json(value.adc_raster_time) + json_object["blockDurationRaster"] = self._block_duration_raster_converter.to_json(value.block_duration_raster) + if value.name is not None: + json_object["name"] = self._name_converter.to_json(value.name) + if value.fov is not None: + json_object["fov"] = self._fov_converter.to_json(value.fov) + if value.total_duration is not None: + json_object["totalDuration"] = self._total_duration_converter.to_json(value.total_duration) + json_object["custom"] = self._custom_converter.to_json(value.custom) + 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["gradientRasterTime"] = self._gradient_raster_time_converter.numpy_to_json(value["gradient_raster_time"]) + json_object["radiofrequencyRasterTime"] = self._radiofrequency_raster_time_converter.numpy_to_json(value["radiofrequency_raster_time"]) + json_object["adcRasterTime"] = self._adc_raster_time_converter.numpy_to_json(value["adc_raster_time"]) + json_object["blockDurationRaster"] = self._block_duration_raster_converter.numpy_to_json(value["block_duration_raster"]) + if (field_val := value["name"]) is not None: + json_object["name"] = self._name_converter.numpy_to_json(field_val) + if (field_val := value["fov"]) is not None: + json_object["fov"] = self._fov_converter.numpy_to_json(field_val) + if (field_val := value["total_duration"]) is not None: + json_object["totalDuration"] = self._total_duration_converter.numpy_to_json(field_val) + json_object["custom"] = self._custom_converter.numpy_to_json(value["custom"]) + return json_object + + def from_json(self, json_object: object) -> PulseqDefinitions: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return PulseqDefinitions( + gradient_raster_time=self._gradient_raster_time_converter.from_json(json_object["gradientRasterTime"],), + radiofrequency_raster_time=self._radiofrequency_raster_time_converter.from_json(json_object["radiofrequencyRasterTime"],), + adc_raster_time=self._adc_raster_time_converter.from_json(json_object["adcRasterTime"],), + block_duration_raster=self._block_duration_raster_converter.from_json(json_object["blockDurationRaster"],), + name=self._name_converter.from_json(json_object.get("name")), + fov=self._fov_converter.from_json(json_object.get("fov")), + total_duration=self._total_duration_converter.from_json(json_object.get("totalDuration")), + custom=self._custom_converter.from_json(json_object["custom"],), + ) + + 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_raster_time_converter.from_json_to_numpy(json_object["gradientRasterTime"]), + self._radiofrequency_raster_time_converter.from_json_to_numpy(json_object["radiofrequencyRasterTime"]), + self._adc_raster_time_converter.from_json_to_numpy(json_object["adcRasterTime"]), + self._block_duration_raster_converter.from_json_to_numpy(json_object["blockDurationRaster"]), + self._name_converter.from_json_to_numpy(json_object.get("name")), + self._fov_converter.from_json_to_numpy(json_object.get("fov")), + self._total_duration_converter.from_json_to_numpy(json_object.get("totalDuration")), + self._custom_converter.from_json_to_numpy(json_object["custom"]), + ) # type:ignore + + +class BlockConverter(_ndjson.JsonConverter[Block, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._duration_converter = _ndjson.uint64_converter + self._rf_converter = _ndjson.int32_converter + self._gx_converter = _ndjson.int32_converter + self._gy_converter = _ndjson.int32_converter + self._gz_converter = _ndjson.int32_converter + self._adc_converter = _ndjson.int32_converter + self._ext_converter = _ndjson.int32_converter + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("duration", self._duration_converter.overall_dtype()), + ("rf", self._rf_converter.overall_dtype()), + ("gx", self._gx_converter.overall_dtype()), + ("gy", self._gy_converter.overall_dtype()), + ("gz", self._gz_converter.overall_dtype()), + ("adc", self._adc_converter.overall_dtype()), + ("ext", self._ext_converter.overall_dtype()), + ])) + + def to_json(self, value: Block) -> object: + if not isinstance(value, Block): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'Block' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["duration"] = self._duration_converter.to_json(value.duration) + json_object["rf"] = self._rf_converter.to_json(value.rf) + json_object["gx"] = self._gx_converter.to_json(value.gx) + json_object["gy"] = self._gy_converter.to_json(value.gy) + json_object["gz"] = self._gz_converter.to_json(value.gz) + json_object["adc"] = self._adc_converter.to_json(value.adc) + json_object["ext"] = self._ext_converter.to_json(value.ext) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["duration"] = self._duration_converter.numpy_to_json(value["duration"]) + json_object["rf"] = self._rf_converter.numpy_to_json(value["rf"]) + json_object["gx"] = self._gx_converter.numpy_to_json(value["gx"]) + json_object["gy"] = self._gy_converter.numpy_to_json(value["gy"]) + json_object["gz"] = self._gz_converter.numpy_to_json(value["gz"]) + json_object["adc"] = self._adc_converter.numpy_to_json(value["adc"]) + json_object["ext"] = self._ext_converter.numpy_to_json(value["ext"]) + return json_object + + def from_json(self, json_object: object) -> Block: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return Block( + id=self._id_converter.from_json(json_object["id"],), + duration=self._duration_converter.from_json(json_object["duration"],), + rf=self._rf_converter.from_json(json_object["rf"],), + gx=self._gx_converter.from_json(json_object["gx"],), + gy=self._gy_converter.from_json(json_object["gy"],), + gz=self._gz_converter.from_json(json_object["gz"],), + adc=self._adc_converter.from_json(json_object["adc"],), + ext=self._ext_converter.from_json(json_object["ext"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._id_converter.from_json_to_numpy(json_object["id"]), + self._duration_converter.from_json_to_numpy(json_object["duration"]), + self._rf_converter.from_json_to_numpy(json_object["rf"]), + self._gx_converter.from_json_to_numpy(json_object["gx"]), + self._gy_converter.from_json_to_numpy(json_object["gy"]), + self._gz_converter.from_json_to_numpy(json_object["gz"]), + self._adc_converter.from_json_to_numpy(json_object["adc"]), + self._ext_converter.from_json_to_numpy(json_object["ext"]), + ) # type:ignore + + +rf_pulse_use_name_to_value_map = { + "undefined": RFPulseUse.UNDEFINED, + "excitation": RFPulseUse.EXCITATION, + "refocusing": RFPulseUse.REFOCUSING, + "inversion": RFPulseUse.INVERSION, + "saturation": RFPulseUse.SATURATION, + "preparation": RFPulseUse.PREPARATION, + "other": RFPulseUse.OTHER, +} +rf_pulse_use_value_to_name_map = {v: n for n, v in rf_pulse_use_name_to_value_map.items()} + +class RFEventConverter(_ndjson.JsonConverter[RFEvent, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._amp_converter = _ndjson.float64_converter + self._mag_id_converter = _ndjson.int32_converter + self._phase_id_converter = _ndjson.int32_converter + self._time_id_converter = _ndjson.int32_converter + self._center_converter = _ndjson.float64_converter + self._delay_converter = _ndjson.uint64_converter + self._freq_ppm_converter = _ndjson.float64_converter + self._phase_ppm_converter = _ndjson.float64_converter + self._freq_offset_converter = _ndjson.float64_converter + self._phase_offset_converter = _ndjson.float64_converter + self._use_converter = _ndjson.EnumConverter(RFPulseUse, np.int32, rf_pulse_use_name_to_value_map, rf_pulse_use_value_to_name_map) + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("amp", self._amp_converter.overall_dtype()), + ("mag_id", self._mag_id_converter.overall_dtype()), + ("phase_id", self._phase_id_converter.overall_dtype()), + ("time_id", self._time_id_converter.overall_dtype()), + ("center", self._center_converter.overall_dtype()), + ("delay", self._delay_converter.overall_dtype()), + ("freq_ppm", self._freq_ppm_converter.overall_dtype()), + ("phase_ppm", self._phase_ppm_converter.overall_dtype()), + ("freq_offset", self._freq_offset_converter.overall_dtype()), + ("phase_offset", self._phase_offset_converter.overall_dtype()), + ("use", self._use_converter.overall_dtype()), + ])) + + def to_json(self, value: RFEvent) -> object: + if not isinstance(value, RFEvent): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'RFEvent' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["amp"] = self._amp_converter.to_json(value.amp) + json_object["magId"] = self._mag_id_converter.to_json(value.mag_id) + json_object["phaseId"] = self._phase_id_converter.to_json(value.phase_id) + json_object["timeId"] = self._time_id_converter.to_json(value.time_id) + json_object["center"] = self._center_converter.to_json(value.center) + json_object["delay"] = self._delay_converter.to_json(value.delay) + json_object["freqPPM"] = self._freq_ppm_converter.to_json(value.freq_ppm) + json_object["phasePPM"] = self._phase_ppm_converter.to_json(value.phase_ppm) + json_object["freqOffset"] = self._freq_offset_converter.to_json(value.freq_offset) + json_object["phaseOffset"] = self._phase_offset_converter.to_json(value.phase_offset) + json_object["use"] = self._use_converter.to_json(value.use) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["amp"] = self._amp_converter.numpy_to_json(value["amp"]) + json_object["magId"] = self._mag_id_converter.numpy_to_json(value["mag_id"]) + json_object["phaseId"] = self._phase_id_converter.numpy_to_json(value["phase_id"]) + json_object["timeId"] = self._time_id_converter.numpy_to_json(value["time_id"]) + json_object["center"] = self._center_converter.numpy_to_json(value["center"]) + json_object["delay"] = self._delay_converter.numpy_to_json(value["delay"]) + json_object["freqPPM"] = self._freq_ppm_converter.numpy_to_json(value["freq_ppm"]) + json_object["phasePPM"] = self._phase_ppm_converter.numpy_to_json(value["phase_ppm"]) + json_object["freqOffset"] = self._freq_offset_converter.numpy_to_json(value["freq_offset"]) + json_object["phaseOffset"] = self._phase_offset_converter.numpy_to_json(value["phase_offset"]) + json_object["use"] = self._use_converter.numpy_to_json(value["use"]) + return json_object + + def from_json(self, json_object: object) -> RFEvent: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return RFEvent( + id=self._id_converter.from_json(json_object["id"],), + amp=self._amp_converter.from_json(json_object["amp"],), + mag_id=self._mag_id_converter.from_json(json_object["magId"],), + phase_id=self._phase_id_converter.from_json(json_object["phaseId"],), + time_id=self._time_id_converter.from_json(json_object["timeId"],), + center=self._center_converter.from_json(json_object["center"],), + delay=self._delay_converter.from_json(json_object["delay"],), + freq_ppm=self._freq_ppm_converter.from_json(json_object["freqPPM"],), + phase_ppm=self._phase_ppm_converter.from_json(json_object["phasePPM"],), + freq_offset=self._freq_offset_converter.from_json(json_object["freqOffset"],), + phase_offset=self._phase_offset_converter.from_json(json_object["phaseOffset"],), + use=self._use_converter.from_json(json_object["use"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._id_converter.from_json_to_numpy(json_object["id"]), + self._amp_converter.from_json_to_numpy(json_object["amp"]), + self._mag_id_converter.from_json_to_numpy(json_object["magId"]), + self._phase_id_converter.from_json_to_numpy(json_object["phaseId"]), + self._time_id_converter.from_json_to_numpy(json_object["timeId"]), + self._center_converter.from_json_to_numpy(json_object["center"]), + self._delay_converter.from_json_to_numpy(json_object["delay"]), + self._freq_ppm_converter.from_json_to_numpy(json_object["freqPPM"]), + self._phase_ppm_converter.from_json_to_numpy(json_object["phasePPM"]), + self._freq_offset_converter.from_json_to_numpy(json_object["freqOffset"]), + self._phase_offset_converter.from_json_to_numpy(json_object["phaseOffset"]), + self._use_converter.from_json_to_numpy(json_object["use"]), + ) # type:ignore + + +class ArbitraryGradientConverter(_ndjson.JsonConverter[ArbitraryGradient, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._amp_converter = _ndjson.float64_converter + self._first_converter = _ndjson.float64_converter + self._last_converter = _ndjson.float64_converter + self._shape_id_converter = _ndjson.int32_converter + self._time_id_converter = _ndjson.int32_converter + self._delay_converter = _ndjson.uint64_converter + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("amp", self._amp_converter.overall_dtype()), + ("first", self._first_converter.overall_dtype()), + ("last", self._last_converter.overall_dtype()), + ("shape_id", self._shape_id_converter.overall_dtype()), + ("time_id", self._time_id_converter.overall_dtype()), + ("delay", self._delay_converter.overall_dtype()), + ])) + + def to_json(self, value: ArbitraryGradient) -> object: + if not isinstance(value, ArbitraryGradient): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'ArbitraryGradient' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["amp"] = self._amp_converter.to_json(value.amp) + json_object["first"] = self._first_converter.to_json(value.first) + json_object["last"] = self._last_converter.to_json(value.last) + json_object["shapeId"] = self._shape_id_converter.to_json(value.shape_id) + json_object["timeId"] = self._time_id_converter.to_json(value.time_id) + json_object["delay"] = self._delay_converter.to_json(value.delay) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["amp"] = self._amp_converter.numpy_to_json(value["amp"]) + json_object["first"] = self._first_converter.numpy_to_json(value["first"]) + json_object["last"] = self._last_converter.numpy_to_json(value["last"]) + json_object["shapeId"] = self._shape_id_converter.numpy_to_json(value["shape_id"]) + json_object["timeId"] = self._time_id_converter.numpy_to_json(value["time_id"]) + json_object["delay"] = self._delay_converter.numpy_to_json(value["delay"]) + return json_object + + def from_json(self, json_object: object) -> ArbitraryGradient: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ArbitraryGradient( + id=self._id_converter.from_json(json_object["id"],), + amp=self._amp_converter.from_json(json_object["amp"],), + first=self._first_converter.from_json(json_object["first"],), + last=self._last_converter.from_json(json_object["last"],), + shape_id=self._shape_id_converter.from_json(json_object["shapeId"],), + time_id=self._time_id_converter.from_json(json_object["timeId"],), + delay=self._delay_converter.from_json(json_object["delay"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._id_converter.from_json_to_numpy(json_object["id"]), + self._amp_converter.from_json_to_numpy(json_object["amp"]), + self._first_converter.from_json_to_numpy(json_object["first"]), + self._last_converter.from_json_to_numpy(json_object["last"]), + self._shape_id_converter.from_json_to_numpy(json_object["shapeId"]), + self._time_id_converter.from_json_to_numpy(json_object["timeId"]), + self._delay_converter.from_json_to_numpy(json_object["delay"]), + ) # type:ignore + + +class TrapezoidalGradientConverter(_ndjson.JsonConverter[TrapezoidalGradient, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._amp_converter = _ndjson.float64_converter + self._rise_converter = _ndjson.uint64_converter + self._flat_converter = _ndjson.uint64_converter + self._fall_converter = _ndjson.uint64_converter + self._delay_converter = _ndjson.uint64_converter + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("amp", self._amp_converter.overall_dtype()), + ("rise", self._rise_converter.overall_dtype()), + ("flat", self._flat_converter.overall_dtype()), + ("fall", self._fall_converter.overall_dtype()), + ("delay", self._delay_converter.overall_dtype()), + ])) + + def to_json(self, value: TrapezoidalGradient) -> object: + if not isinstance(value, TrapezoidalGradient): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'TrapezoidalGradient' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["amp"] = self._amp_converter.to_json(value.amp) + json_object["rise"] = self._rise_converter.to_json(value.rise) + json_object["flat"] = self._flat_converter.to_json(value.flat) + json_object["fall"] = self._fall_converter.to_json(value.fall) + json_object["delay"] = self._delay_converter.to_json(value.delay) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["amp"] = self._amp_converter.numpy_to_json(value["amp"]) + json_object["rise"] = self._rise_converter.numpy_to_json(value["rise"]) + json_object["flat"] = self._flat_converter.numpy_to_json(value["flat"]) + json_object["fall"] = self._fall_converter.numpy_to_json(value["fall"]) + json_object["delay"] = self._delay_converter.numpy_to_json(value["delay"]) + return json_object + + def from_json(self, json_object: object) -> TrapezoidalGradient: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return TrapezoidalGradient( + id=self._id_converter.from_json(json_object["id"],), + amp=self._amp_converter.from_json(json_object["amp"],), + rise=self._rise_converter.from_json(json_object["rise"],), + flat=self._flat_converter.from_json(json_object["flat"],), + fall=self._fall_converter.from_json(json_object["fall"],), + delay=self._delay_converter.from_json(json_object["delay"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._id_converter.from_json_to_numpy(json_object["id"]), + self._amp_converter.from_json_to_numpy(json_object["amp"]), + self._rise_converter.from_json_to_numpy(json_object["rise"]), + self._flat_converter.from_json_to_numpy(json_object["flat"]), + self._fall_converter.from_json_to_numpy(json_object["fall"]), + self._delay_converter.from_json_to_numpy(json_object["delay"]), + ) # type:ignore + + +class ADCEventConverter(_ndjson.JsonConverter[ADCEvent, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._num_converter = _ndjson.uint64_converter + self._dwell_converter = _ndjson.float32_converter + self._delay_converter = _ndjson.uint64_converter + self._freq_ppm_converter = _ndjson.float64_converter + self._phase_ppm_converter = _ndjson.float64_converter + self._freq_converter = _ndjson.float64_converter + self._phase_converter = _ndjson.float64_converter + self._phase_shape_id_converter = _ndjson.int32_converter + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("num", self._num_converter.overall_dtype()), + ("dwell", self._dwell_converter.overall_dtype()), + ("delay", self._delay_converter.overall_dtype()), + ("freq_ppm", self._freq_ppm_converter.overall_dtype()), + ("phase_ppm", self._phase_ppm_converter.overall_dtype()), + ("freq", self._freq_converter.overall_dtype()), + ("phase", self._phase_converter.overall_dtype()), + ("phase_shape_id", self._phase_shape_id_converter.overall_dtype()), + ])) + + def to_json(self, value: ADCEvent) -> object: + if not isinstance(value, ADCEvent): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'ADCEvent' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["num"] = self._num_converter.to_json(value.num) + json_object["dwell"] = self._dwell_converter.to_json(value.dwell) + json_object["delay"] = self._delay_converter.to_json(value.delay) + json_object["freqPPM"] = self._freq_ppm_converter.to_json(value.freq_ppm) + json_object["phasePPM"] = self._phase_ppm_converter.to_json(value.phase_ppm) + json_object["freq"] = self._freq_converter.to_json(value.freq) + json_object["phase"] = self._phase_converter.to_json(value.phase) + json_object["phaseShapeId"] = self._phase_shape_id_converter.to_json(value.phase_shape_id) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["num"] = self._num_converter.numpy_to_json(value["num"]) + json_object["dwell"] = self._dwell_converter.numpy_to_json(value["dwell"]) + json_object["delay"] = self._delay_converter.numpy_to_json(value["delay"]) + json_object["freqPPM"] = self._freq_ppm_converter.numpy_to_json(value["freq_ppm"]) + json_object["phasePPM"] = self._phase_ppm_converter.numpy_to_json(value["phase_ppm"]) + json_object["freq"] = self._freq_converter.numpy_to_json(value["freq"]) + json_object["phase"] = self._phase_converter.numpy_to_json(value["phase"]) + json_object["phaseShapeId"] = self._phase_shape_id_converter.numpy_to_json(value["phase_shape_id"]) + return json_object + + def from_json(self, json_object: object) -> ADCEvent: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ADCEvent( + id=self._id_converter.from_json(json_object["id"],), + num=self._num_converter.from_json(json_object["num"],), + dwell=self._dwell_converter.from_json(json_object["dwell"],), + delay=self._delay_converter.from_json(json_object["delay"],), + freq_ppm=self._freq_ppm_converter.from_json(json_object["freqPPM"],), + phase_ppm=self._phase_ppm_converter.from_json(json_object["phasePPM"],), + freq=self._freq_converter.from_json(json_object["freq"],), + phase=self._phase_converter.from_json(json_object["phase"],), + phase_shape_id=self._phase_shape_id_converter.from_json(json_object["phaseShapeId"],), + ) + + def from_json_to_numpy(self, json_object: object) -> np.void: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return ( + self._id_converter.from_json_to_numpy(json_object["id"]), + self._num_converter.from_json_to_numpy(json_object["num"]), + self._dwell_converter.from_json_to_numpy(json_object["dwell"]), + self._delay_converter.from_json_to_numpy(json_object["delay"]), + self._freq_ppm_converter.from_json_to_numpy(json_object["freqPPM"]), + self._phase_ppm_converter.from_json_to_numpy(json_object["phasePPM"]), + self._freq_converter.from_json_to_numpy(json_object["freq"]), + self._phase_converter.from_json_to_numpy(json_object["phase"]), + self._phase_shape_id_converter.from_json_to_numpy(json_object["phaseShapeId"]), + ) # type:ignore + + +class ShapeConverter(_ndjson.JsonConverter[Shape, np.void]): + def __init__(self) -> None: + self._id_converter = _ndjson.int32_converter + self._num_samples_converter = _ndjson.uint64_converter + self._data_converter = _ndjson.NDArrayConverter(_ndjson.float64_converter, 1) + super().__init__(np.dtype([ + ("id", self._id_converter.overall_dtype()), + ("num_samples", self._num_samples_converter.overall_dtype()), + ("data", self._data_converter.overall_dtype()), + ])) + + def to_json(self, value: Shape) -> object: + if not isinstance(value, Shape): # pyright: ignore [reportUnnecessaryIsInstance] + raise TypeError("Expected 'Shape' instance") + json_object = {} + + json_object["id"] = self._id_converter.to_json(value.id) + json_object["numSamples"] = self._num_samples_converter.to_json(value.num_samples) + 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["id"] = self._id_converter.numpy_to_json(value["id"]) + json_object["numSamples"] = self._num_samples_converter.numpy_to_json(value["num_samples"]) + json_object["data"] = self._data_converter.numpy_to_json(value["data"]) + return json_object + + def from_json(self, json_object: object) -> Shape: + if not isinstance(json_object, dict): + raise TypeError("Expected 'dict' instance") + return Shape( + id=self._id_converter.from_json(json_object["id"],), + num_samples=self._num_samples_converter.from_json(json_object["numSamples"],), + 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._id_converter.from_json_to_numpy(json_object["id"]), + self._num_samples_converter.from_json_to_numpy(json_object["numSamples"]), + self._data_converter.from_json_to_numpy(json_object["data"]), + ) # type:ignore + + class NDJsonMrdWriter(_ndjson.NDJsonProtocolWriter, MrdWriterBase): """NDJson writer for the Mrd protocol. @@ -3166,7 +3769,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.AcquisitionPrototype, AcquisitionPrototypeConverter(), [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]), (StreamItem.PulseqDefinitions, PulseqDefinitionsConverter(), [dict]), (StreamItem.Blocks, _ndjson.VectorConverter(BlockConverter()), [list]), (StreamItem.Rf, RFEventConverter(), [dict]), (StreamItem.ArbitraryGradient, ArbitraryGradientConverter(), [dict]), (StreamItem.TrapezoidalGradient, TrapezoidalGradientConverter(), [dict]), (StreamItem.Adc, ADCEventConverter(), [dict]), (StreamItem.Shape, ShapeConverter(), [dict])], False) for item in value: json_item = converter.to_json(item) self._write_json_line({"data": json_item}) @@ -3189,7 +3792,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.AcquisitionPrototype, AcquisitionPrototypeConverter(), [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]), (StreamItem.PulseqDefinitions, PulseqDefinitionsConverter(), [dict]), (StreamItem.Blocks, _ndjson.VectorConverter(BlockConverter()), [list]), (StreamItem.Rf, RFEventConverter(), [dict]), (StreamItem.ArbitraryGradient, ArbitraryGradientConverter(), [dict]), (StreamItem.TrapezoidalGradient, TrapezoidalGradientConverter(), [dict]), (StreamItem.Adc, ADCEventConverter(), [dict]), (StreamItem.Shape, ShapeConverter(), [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 191d38fe..d22ca77c 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":"ADCEvent","fields":[{"name":"id","type":"int32"},{"name":"num","type":"uint64"},{"name":"dwell","type":"float32"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freq","type":"float64"},{"name":"phase","type":"float64"},{"name":"phaseShapeId","type":"int32"}]},{"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":"AcquisitionPrototype","fields":[{"name":"head","type":"Mrd.AcquisitionHeader"},{"name":"dataSampleCounts","type":{"array":{"items":"uint32","dimensions":1}}}]},{"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":"ArbitraryGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"first","type":"float64"},{"name":"last","type":"float64"},{"name":"shapeId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"delay","type":"uint64"}]},{"name":"Array","typeParameters":["T"],"type":{"array":{"items":"T"}}},{"name":"ArrayComplexFloat","type":{"name":"Mrd.Array","typeArguments":["complexfloat32"]}},{"name":"Block","fields":[{"name":"id","type":"int32"},{"name":"duration","type":"uint64"},{"name":"rf","type":"int32"},{"name":"gx","type":"int32"},{"name":"gy","type":"int32"},{"name":"gz","type":"int32"},{"name":"adc","type":"int32"},{"name":"ext","type":"int32"}]},{"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":"PulseqDefinitions","fields":[{"name":"gradientRasterTime","type":"float64"},{"name":"radiofrequencyRasterTime","type":"float64"},{"name":"adcRasterTime","type":"float64"},{"name":"blockDurationRaster","type":"float64"},{"name":"name","type":[null,"string"]},{"name":"fov","type":[null,"Mrd.ThreeDimensionalFloat"]},{"name":"totalDuration","type":[null,"float64"]},{"name":"custom","type":{"map":{"keys":"string","values":"string"}}}]},{"name":"RFEvent","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"magId","type":"int32"},{"name":"phaseId","type":"int32"},{"name":"timeId","type":"int32"},{"name":"center","type":"float64"},{"name":"delay","type":"uint64"},{"name":"freqPPM","type":"float64"},{"name":"phasePPM","type":"float64"},{"name":"freqOffset","type":"float64"},{"name":"phaseOffset","type":"float64"},{"name":"use","type":"Mrd.RFPulseUse"}]},{"name":"RFPulseUse","values":[{"symbol":"undefined","value":0},{"symbol":"excitation","value":1},{"symbol":"refocusing","value":2},{"symbol":"inversion","value":3},{"symbol":"saturation","value":4},{"symbol":"preparation","value":5},{"symbol":"other","value":6}]},{"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":"Shape","fields":[{"name":"id","type":"int32"},{"name":"numSamples","type":"uint64"},{"name":"data","type":{"array":{"items":"float64","dimensions":1}}}]},{"name":"StreamItem","type":[{"tag":"acquisition","explicitTag":true,"type":"Mrd.Acquisition"},{"tag":"acquisitionPrototype","explicitTag":true,"type":"Mrd.AcquisitionPrototype"},{"tag":"waveformUint32","explicitTag":true,"type":"Mrd.WaveformUint32"},{"tag":"imageUint16","explicitTag":true,"type":"Mrd.ImageUint16"},{"tag":"imageInt16","explicitTag":true,"type":"Mrd.ImageInt16"},{"tag":"imageUint32","explicitTag":true,"type":"Mrd.ImageUint32"},{"tag":"imageInt32","explicitTag":true,"type":"Mrd.ImageInt32"},{"tag":"imageFloat","explicitTag":true,"type":"Mrd.ImageFloat"},{"tag":"imageDouble","explicitTag":true,"type":"Mrd.ImageDouble"},{"tag":"imageComplexFloat","explicitTag":true,"type":"Mrd.ImageComplexFloat"},{"tag":"imageComplexDouble","explicitTag":true,"type":"Mrd.ImageComplexDouble"},{"tag":"acquisitionBucket","explicitTag":true,"type":"Mrd.AcquisitionBucket"},{"tag":"reconData","explicitTag":true,"type":"Mrd.ReconData"},{"tag":"arrayComplexFloat","explicitTag":true,"type":"Mrd.ArrayComplexFloat"},{"tag":"imageArray","explicitTag":true,"type":"Mrd.ImageArray"},{"tag":"pulseqDefinitions","explicitTag":true,"type":"Mrd.PulseqDefinitions"},{"tag":"blocks","explicitTag":true,"type":{"vector":{"items":"Mrd.Block"}}},{"tag":"rf","explicitTag":true,"type":"Mrd.RFEvent"},{"tag":"arbitraryGradient","explicitTag":true,"type":"Mrd.ArbitraryGradient"},{"tag":"trapezoidalGradient","explicitTag":true,"type":"Mrd.TrapezoidalGradient"},{"tag":"adc","explicitTag":true,"type":"Mrd.ADCEvent"},{"tag":"shape","explicitTag":true,"type":"Mrd.Shape"}]},{"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":"TrapezoidalGradient","fields":[{"name":"id","type":"int32"},{"name":"amp","type":"float64"},{"name":"rise","type":"uint64"},{"name":"flat","type":"uint64"},{"name":"fall","type":"uint64"},{"name":"delay","type":"uint64"}]},{"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/tools/mrd_to_seq.py b/python/mrd/tools/mrd_to_seq.py new file mode 100644 index 00000000..cbaede6f --- /dev/null +++ b/python/mrd/tools/mrd_to_seq.py @@ -0,0 +1,295 @@ +import argparse +import sys +from typing import Iterable, TextIO, Tuple, Union +import warnings + +import mrd + +from mrd.tools.seq_to_mrd import ( + _PULSEQ_SUPPORTED_VERSIONS, + _PULSEQ_VERSION_1_4_2, + _PULSEQ_VERSION_1_5_0, + _version_to_string, +) + +_rf_use_to_abbreviation_dict = {e: e.name.lower()[0] for e in mrd.RFPulseUse} + + +def _get_abbreviation_for_rf_use(rf_use: mrd.RFPulseUse) -> str: + try: + return _rf_use_to_abbreviation_dict[rf_use] + except KeyError: + raise ValueError(f"Invalid RF use '{rf_use}'") from None + + +def _parse_version(version_str: str) -> Tuple[int, int, int]: + parts = version_str.split(".") + if len(parts) != 3: + raise ValueError(f"Invalid version string: {version_str}") + try: + major, minor, patch = map(int, parts) + except ValueError: + raise ValueError(f"Invalid version string: {version_str}") + return major, minor, patch + + +def stream_items_to_pulseq_text( + items: Iterable[mrd.StreamItem], + file: TextIO, + version=_version_to_string(_PULSEQ_VERSION_1_4_2), +) -> None: + parsed_version = _parse_version(version) + + definitions = mrd.PulseqDefinitions() + blocks = [] + rf_events = [] + adc_events = [] + trap_grad_events = [] + arb_grad_events = [] + shapes = [] + + for item in items: + if isinstance(item, mrd.StreamItem.PulseqDefinitions): + # If this is not the first occurrence of a Definition, + # should we merge instead of replacing? Raise an error or warning? + definitions = item.value + elif isinstance(item, mrd.StreamItem.Blocks): + blocks.extend(item.value) + elif isinstance(item, mrd.StreamItem.Rf): + rf_events.append(item.value) + elif isinstance(item, mrd.StreamItem.Adc): + adc_events.append(item.value) + elif isinstance(item, mrd.StreamItem.TrapezoidalGradient): + trap_grad_events.append(item.value) + elif isinstance(item, mrd.StreamItem.ArbitraryGradient): + arb_grad_events.append(item.value) + elif isinstance(item, mrd.StreamItem.Shape): + shapes.append(item.value) + + write_header(file) + write_version(file, parsed_version) + write_definitions(file, definitions) + write_blocks(file, blocks) + write_rf_events(file, rf_events, parsed_version) + write_arbitrary_grad_events(file, arb_grad_events, parsed_version) + write_trap_grad_events(file, trap_grad_events) + write_adc_events(file, adc_events, parsed_version) + write_shapes(file, shapes) + + +def write_header(file: TextIO) -> None: + file.write("# Pulseq sequence file\n") + file.write("# Created by MRD\n\n") + + +def write_version(file: TextIO, version: Tuple[int, int, int]) -> None: + file.write("[VERSION]\n") + file.write(f"major {version[0]}\n") + file.write(f"minor {version[1]}\n") + file.write(f"revision {version[2]}\n\n") + + +def write_definitions(file: TextIO, definitions: Union[mrd.PulseqDefinitions, None]) -> None: + if definitions is None: + raise ValueError("No definitions were present in the stream.") + + file.write("[DEFINITIONS]\n") + file.write(f"AdcRasterTime {definitions.adc_raster_time:g}\n") + file.write(f"BlockDurationRaster {definitions.block_duration_raster:g}\n") + file.write(f"GradientRasterTime {definitions.gradient_raster_time:g}\n") + file.write(f"RadiofrequencyRasterTime {definitions.radiofrequency_raster_time:g}\n") + if definitions.name: + file.write(f"Name {definitions.name}\n") + if definitions.fov: + file.write( + f"FOV {definitions.fov.x:g} {definitions.fov.y:g} {definitions.fov.z:g}\n" + ) + if definitions.total_duration: + file.write(f"TotalDuration {definitions.total_duration:g}\n") + for key, value in definitions.custom.items(): + file.write(f"{key} {value}\n") + file.write("\n") + + +def write_blocks(file, blocks: list[mrd.Block]) -> None: + file.write("# Format of blocks:\n") + file.write("# NUM DUR RF GX GY GZ ADC EXT\n") + file.write("[BLOCKS]\n") + + id_width = len(str(len(blocks))) + for block in blocks: + file.write( + f"{block.id:{id_width}d} " + f"{block.duration:3d} {block.rf:3d} {block.gx:3d} {block.gy:3d} " + f"{block.gz:3d} {block.adc:2d} {block.ext:2d}\n" + ) + file.write("\n") + + +def write_arbitrary_grad_events( + file, arb_grad_events: list[mrd.ArbitraryGradient], version +) -> None: + if len(arb_grad_events) == 0: + return + + if version >= _PULSEQ_VERSION_1_5_0: + file.write("# Format of arbitrary gradients:\n") + file.write( + "# time_shape_id of 0 means default timing " + "(stepping with grad_raster starting at 1/2 of grad_raster)\n" + ) + file.write("# id amplitude first last amp_shape_id time_shape_id delay\n") + file.write("# .. Hz/m Hz/m Hz/m .. .. us\n") + file.write("[GRADIENTS]\n") + + "%d %12g %12g %12g %d %d %d" + for grad in arb_grad_events: + file.write( + f"{grad.id:.0f} {grad.amp:12g} {grad.first:12g} {grad.last:12g} " + f"{grad.shape_id:.0f} {grad.time_id:.0f} {grad.delay:.0f}\n" + ) + else: + file.write("# Format of arbitrary gradients:\n") + file.write( + "# time_shape_id of 0 means default timing (stepping with grad_raster starting at 1/2 of grad_raster)\n" + ) + file.write("# id amplitude amp_shape_id time_shape_id delay\n") + file.write("# .. Hz/m .. .. us\n") + file.write("[GRADIENTS]\n") + for grad in arb_grad_events: + if grad.first or grad.last: + warnings.warn(f"Data loss when writing arbitrary gradient to pulseq version {_version_to_string(version)}") + + file.write( + f"{grad.id:.0f} {grad.amp:12g} {grad.shape_id:.0f} {grad.time_id:.0f} {grad.delay:.0f}\n" + ) + + file.write("\n") + + +def write_trap_grad_events( + file, trap_grad_events: list[mrd.TrapezoidalGradient] +) -> None: + if len(trap_grad_events) == 0: + return + + file.write("# Format of trapezoid gradients:\n") + file.write("# id amplitude rise flat fall delay\n") + file.write("# .. Hz/m us us us us\n") + file.write("[TRAP]\n") + + for grad in trap_grad_events: + file.write( + f"{grad.id:2d} {grad.amp:12g} {grad.rise:3.0f} " + f"{grad.flat:4.0f} {grad.fall:3.0f} {grad.delay:3.0f}\n" + ) + + file.write("\n") + + +def write_rf_events(file, rf_events: list[mrd.RFEvent], version): + if len(rf_events) == 0: + return + + if version >= _PULSEQ_VERSION_1_5_0: + file.write("# Format of RF events:\n") + file.write( + "# id ampl. mag_id phase_id time_shape_id center delay freqPPM phasePPM freq phase use\n" + ) + file.write( + "# .. Hz .. .. .. us us ppm rad/MHz Hz rad ..\n" + ) + file.write("[RF]\n") + + for rf in rf_events: + file.write( + f"{rf.id:.0f} {rf.amp:12g} {rf.mag_id:.0f} {rf.phase_id:.0f} {rf.time_id:.0f} " + f"{rf.center:.0f} {rf.delay:g} {rf.freq_ppm:g} {rf.phase_ppm:g} " + f"{rf.freq_offset:g} {rf.phase_offset:g} {_get_abbreviation_for_rf_use(rf.use)}\n" + ) + else: + file.write("# Format of RF events:\n") + file.write("# id amplitude mag_id phase_id time_shape_id delay freq phase\n") + file.write("# .. Hz .... .... .... us Hz rad\n") + file.write("[RF]\n") + + for rf in rf_events: + if rf.center or rf.freq_ppm or rf.phase_ppm or rf.use != mrd.RFPulseUse.UNDEFINED: + warnings.warn(f"Data loss when writing RF event to pulseq version {_version_to_string(version)}") + + file.write( + f"{rf.id:.0f} {rf.amp:12g} {rf.mag_id:.0f} {rf.phase_id:.0f} {rf.time_id:.0f} " + f"{rf.delay:g} {rf.freq_offset:g} {rf.phase_offset:g}\n" + ) + + file.write("\n") + + +def write_adc_events(file, adc_events: list[mrd.ADCEvent], version) -> None: + if len(adc_events) == 0: + return + + if version >= _PULSEQ_VERSION_1_5_0: + file.write("# Format of ADC events:\n") + file.write("# id num dwell delay freqPPM phasePPM freq phase phase_id\n") + file.write("# .. .. ns us ppm rad/MHz Hz rad ..\n") + file.write("[ADC]\n") + + for adc in adc_events: + file.write( + f"{adc.id:.0f} {adc.num:.0f} {adc.dwell:.0f} {adc.delay:.0f} {adc.freq_ppm:g} " + f"{adc.phase_ppm:g} {adc.freq:g} {adc.phase:g} {adc.phase_shape_id:.0f}\n" + ) + else: + file.write("# Format of ADC events:\n") + file.write("# id num dwell delay freq phase\n") + file.write("# .. .. ns us Hz rad\n") + file.write("[ADC]\n") + + for adc in adc_events: + if adc.freq_ppm or adc.phase_ppm or adc.phase_shape_id: + warnings.warn(f"Data loss when writing ADC event to pulseq version {_version_to_string(version)}") + + file.write( + f"{adc.id:.0f} {adc.num:.0f} {adc.dwell:.0f} {adc.delay:.0f} " + f"{adc.freq:g} {adc.phase:g}\n" + ) + + file.write("\n") + + +def write_shapes(file, shapes: list[mrd.Shape]) -> None: + if len(shapes) == 0: + return + + file.write("# Sequence Shapes\n") + file.write("[SHAPES]\n\n") + + for shape in shapes: + file.write(f"shape_id {shape.id}\n") + file.write(f"num_samples {shape.num_samples}\n") + for sample in shape.data: + file.write(f"{sample:0.9g}\n") + file.write("\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Parses a pulseq .seq file into MRD stream items") + parser.add_argument('-i', '--input', type=str, required=False, help="Input file, defaults to stdin") + parser.add_argument('-o', '--output', type=str, required=False, help="Output file, defaults to stdout") + parser.add_argument( + "-v", + "--pulseq-version", + metavar="version", + type=str, + required=False, + help="Pulseq version to use, defaults to 1.4.2", + choices=[_version_to_string(v) for v in _PULSEQ_SUPPORTED_VERSIONS], + default=_version_to_string(_PULSEQ_VERSION_1_4_2), + ) + args = parser.parse_args() + + with (open(args.input, "rb") if args.input is not None else sys.stdin.buffer) as input: + with mrd.BinaryMrdReader(input) as reader: + with (open(args.output, "w") if args.output is not None else sys.stdout) as output: + reader.read_header() # Ignore header + stream_items_to_pulseq_text(reader.read_data(), output, args.pulseq_version) diff --git a/python/mrd/tools/seq_to_mrd.py b/python/mrd/tools/seq_to_mrd.py new file mode 100644 index 00000000..099e1d31 --- /dev/null +++ b/python/mrd/tools/seq_to_mrd.py @@ -0,0 +1,485 @@ +import argparse +import sys +from typing import Iterable, Optional, TextIO, Union, Tuple +import numpy as np +import mrd + +_PULSEQ_VERSION_1_4_2 = (1, 4, 2) +_PULSEQ_VERSION_1_5_0 = (1, 5, 0) +_PULSEQ_VERSION_1_5_1 = (1, 5, 1) + +_PULSEQ_SUPPORTED_VERSIONS = [ + _PULSEQ_VERSION_1_4_2, + _PULSEQ_VERSION_1_5_0, + _PULSEQ_VERSION_1_5_1, +] + + +def _version_to_string(version: Tuple[int, int, int]) -> str: + return f"{version[0]}.{version[1]}.{version[2]}" + + +_abbreviation_to_rf_use_dict = {e.name.lower()[0]: e for e in mrd.RFPulseUse} + + +def _get_rf_use_from_abbreviation(abbreviation: str) -> mrd.RFPulseUse: + try: + return _abbreviation_to_rf_use_dict[abbreviation] + except KeyError: + raise ValueError(f"Invalid RF use abbreviation '{abbreviation}'") from None + + +class _LinesIterator: + """ + Internal implementation of a peekable line iterator for pulseq .seq files. + + Behavior: + - Strips whitespace. + - Skips comment lines beginning with '#'. + - Provides lookahead via peek(). + - Line numbers correspond to the original file (1-based). + """ + + def __init__(self, file: TextIO): + self._file = file + self._buffer: Union[Tuple[int, str], None] = None + self._line_number = 0 + + def __iter__(self) -> "_LinesIterator": + return self + + def __next__(self) -> Tuple[int, str]: + if self._buffer is not None: + item = self._buffer + self._buffer = None + return item + + while True: + raw = self._file.readline() + if raw == "": # EOF + raise StopIteration + self._line_number += 1 + line = raw.strip() + if line.startswith("#"): + continue + return self._line_number, line + + def peek(self) -> Optional[Tuple[int, str]]: + if self._buffer is not None: + return self._buffer + try: + self._buffer = self.__next__() + except StopIteration: + return None + return self._buffer + + def skip_empty_lines(self) -> None: + while True: + next_line = self.peek() + if next_line is None or next_line[1] != "": + break + next(self) + + def read_until_next_section(self) -> Iterable[Tuple[int, str]]: + while True: + next_line = self.peek() + if next_line is None or ( + next_line[1].startswith("[") and next_line[1].endswith("]") + ): + break + + yield next(self) + + +def pulseq_text_to_stream_items(file: TextIO) -> Iterable[mrd.StreamItem]: + linesIterable = _LinesIterator(file) + + linesIterable.skip_empty_lines() + line_number, line = next(linesIterable) + if line != "[VERSION]": + raise RuntimeError( + f"Line {line_number}: Expected [VERSION] section start, got '{line}'" + ) + + version = _parse_version(linesIterable) + if version not in _PULSEQ_SUPPORTED_VERSIONS: + raise RuntimeError( + f"Unsupported pulseq version {_version_to_string(version)}. " + + f"Supported versions are: {', '.join(_version_to_string(v) for v in _PULSEQ_SUPPORTED_VERSIONS)}" + ) + + definitions: Optional[mrd.PulseqDefinitions] = None + blocks: list[mrd.Block] = [] + rf_events: list[mrd.RFEvent] = [] + trapezoidal_gradients: list[mrd.TrapezoidalGradient] = [] + arbitrary_gradients: list[mrd.ArbitraryGradient] = [] + adc_events: list[mrd.ADCEvent] = [] + shapes: list[mrd.Shape] = [] + + for line_number, line in linesIterable: + if line == "": + continue + elif line == "[DEFINITIONS]": + if version is None: + raise RuntimeError( + f"Line {line_number}: [DEFINITIONS] section before [VERSION] section" + ) + definitions = _parse_definitions(linesIterable) + elif line == "[BLOCKS]": + blocks = _parse_blocks(linesIterable) + elif line == "[RF]": + rf_events = _parse_rf_events(linesIterable, version) + elif line == "[TRAP]": + trapezoidal_gradients = _parse_trap_gradients(linesIterable) + elif line == "[GRADIENTS]": + arbitrary_gradients = _parse_arbitrary_gradients(linesIterable, version) + elif line == "[ADC]": + adc_events = _parse_adc_events(linesIterable, version) + elif line == "[SHAPES]": + shapes = _parse_shapes(linesIterable) + elif line == "[SIGNATURE]": + _parse_signature(linesIterable) + else: + if line.startswith("[") and line.endswith("]"): + raise RuntimeError( + f"Line {line_number}: Unexpected section start `{line}`" + ) + + raise RuntimeError(f"Line {line_number}: unexpected line `{line}`") + + if definitions: + yield mrd.StreamItem.PulseqDefinitions(definitions) + for shape in shapes: + yield mrd.StreamItem.Shape(shape) + for rf in rf_events: + yield mrd.StreamItem.Rf(rf) + for trap in trapezoidal_gradients: + yield mrd.StreamItem.TrapezoidalGradient(trap) + for grad in arbitrary_gradients: + yield mrd.StreamItem.ArbitraryGradient(grad) + for adc in adc_events: + yield mrd.StreamItem.Adc(adc) + yield mrd.StreamItem.Blocks(blocks) + + +def _parse_version(lines: _LinesIterator) -> Tuple[int, int, int]: + major, minor, revision = (0, 0, 0) + for line_number, line in lines.read_until_next_section(): + if line == "": + break + try: + tokens = line.split() + if len(tokens) != 2: + raise RuntimeError(f"Line {line_number}: Invalid version {line}") + key, value = tokens + if key == "major": + major = int(value) + elif key == "minor": + minor = int(value) + elif key == "revision": + revision = int(value) + else: + raise RuntimeError(f"Invalid version key {key}") + except Exception as e: + raise RuntimeError( + f"Line {line_number}: Invalid version line {line}" + ) from e + + return major, minor, revision + + +def _parse_definitions(lines: _LinesIterator) -> mrd.PulseqDefinitions: + definitions = mrd.PulseqDefinitions() + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + try: + tokens = line.split(" ") + key, *values = tokens + if key == "GradientRasterTime": + definitions.gradient_raster_time = float(values[0]) + elif key == "RadiofrequencyRasterTime": + definitions.radiofrequency_raster_time = float(values[0]) + elif key == "AdcRasterTime": + definitions.adc_raster_time = float(values[0]) + elif key == "BlockDurationRaster": + definitions.block_duration_raster = float(values[0]) + elif key == "Name": + definitions.name = values[0] + elif key == "FOV": + if len(values) != 3: + raise RuntimeError(f"Invalid FOV `{line}`") + definitions.fov = mrd.ThreeDimensionalFloat( + x=float(values[0]), y=float(values[1]), z=float(values[2]) + ) + elif key == "TotalDuration": + definitions.total_duration = float(values[0]) + else: + definitions.custom[key] = " ".join(values) + except Exception as e: + raise RuntimeError( + f"Line {line_number}: Invalid definition `{line}`" + ) from e + + return definitions + + +def _parse_blocks(lines: _LinesIterator) -> list[mrd.Block]: + blocks: list[mrd.Block] = [] + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + tokens = line.split() + try: + if len(tokens) != 8: + raise RuntimeError(f"Line {line_number}: Invalid block `{line}`") + + block = mrd.Block( + id=int(tokens[0]), + duration=int(tokens[1]), + rf=int(tokens[2]), + gx=int(tokens[3]), + gy=int(tokens[4]), + gz=int(tokens[5]), + adc=int(tokens[6]), + ext=int(tokens[7]), + ) + except Exception as e: + raise RuntimeError(f"Line {line_number}: Invalid block `{line}`") from e + + blocks.append(block) + + return blocks + + +def _parse_rf_events(lines: _LinesIterator, version) -> list[mrd.RFEvent]: + rf_events: list[mrd.RFEvent] = [] + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + tokens = line.split() + try: + if version >= _PULSEQ_VERSION_1_5_0: + if len(tokens) != 12: + raise RuntimeError( + f"Line {line_number}: Invalid RF event `{line}`" + ) + + rf_event = mrd.RFEvent( + id=int(tokens[0]), + amp=float(tokens[1]), + mag_id=int(tokens[2]), + phase_id=int(tokens[3]), + time_id=int(tokens[4]), + center=int(tokens[5]), + delay=int(tokens[6]), + freq_ppm=float(tokens[7]), + phase_ppm=float(tokens[8]), + freq_offset=float(tokens[9]), + phase_offset=float(tokens[10]), + use=_get_rf_use_from_abbreviation(tokens[11]), + ) + else: + if len(tokens) != 8: + raise RuntimeError( + f"Line {line_number}: Invalid RF event `{line}`" + ) + rf_event = mrd.RFEvent( + id=int(tokens[0]), + amp=float(tokens[1]), + mag_id=int(tokens[2]), + phase_id=int(tokens[3]), + time_id=int(tokens[4]), + delay=int(tokens[5]), + freq_offset=float(tokens[6]), + phase_offset=float(tokens[7]), + ) + + except Exception as e: + raise RuntimeError( + f"Line {line_number}: Invalid RF event `{line}`" + ) from e + + rf_events.append(rf_event) + + return rf_events + + +def _parse_trap_gradients(lines: _LinesIterator) -> list[mrd.TrapezoidalGradient]: + trap_gradients: list[mrd.TrapezoidalGradient] = [] + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + tokens = line.split() + try: + trap_gradient = mrd.TrapezoidalGradient( + id=int(tokens[0]), + amp=float(tokens[1]), + rise=int(tokens[2]), + flat=int(tokens[3]), + fall=int(tokens[4]), + delay=int(tokens[5]), + ) + except Exception as e: + raise RuntimeError( + f"Line {line_number}: Invalid trapezoidal gradient `{line}`" + ) from e + + trap_gradients.append(trap_gradient) + + return trap_gradients + + +def _parse_arbitrary_gradients( + lines: _LinesIterator, version +) -> list[mrd.ArbitraryGradient]: + arbitrary_gradients: list[mrd.ArbitraryGradient] = [] + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + tokens = line.split() + try: + if version >= _PULSEQ_VERSION_1_5_0: + if len(tokens) != 7: + raise RuntimeError( + f"Line {line_number}: Invalid arbitrary gradient `{line}`" + ) + arbitrary_gradient = mrd.ArbitraryGradient( + id=int(tokens[0]), + amp=float(tokens[1]), + first=float(tokens[2]), + last=float(tokens[3]), + shape_id=int(tokens[4]), + time_id=int(tokens[5]), + delay=int(tokens[6]), + ) + else: + if len(tokens) != 5: + raise RuntimeError( + f"Line {line_number}: Invalid arbitrary gradient `{line}`" + ) + arbitrary_gradient = mrd.ArbitraryGradient( + id=int(tokens[0]), + amp=float(tokens[1]), + shape_id=int(tokens[2]), + time_id=int(tokens[3]), + delay=int(tokens[4]), + ) + arbitrary_gradients.append(arbitrary_gradient) + except Exception as e: + raise RuntimeError( + f"Line {line_number}: Invalid arbitrary gradient `{line}`" + ) from e + + return arbitrary_gradients + + +def _parse_adc_events(lines: _LinesIterator, version) -> list[mrd.ADCEvent]: + adc_events: list[mrd.ADCEvent] = [] + for line_number, line in lines.read_until_next_section(): + if line == "": + continue + tokens = line.split() + try: + if version >= _PULSEQ_VERSION_1_5_0: + if len(tokens) != 9: + raise RuntimeError( + f"Line {line_number}: invalid ADC event `{line}`" + ) + adc_event = mrd.ADCEvent( + id=int(tokens[0]), + num=int(tokens[1]), + dwell=float(tokens[2]), + delay=int(tokens[3]), + freq_ppm=float(tokens[4]), + phase_ppm=float(tokens[5]), + freq=float(tokens[6]), + phase=float(tokens[7]), + phase_shape_id=int(tokens[8]), + ) + else: + if len(tokens) != 6: + raise RuntimeError( + f"Line {line_number}: invalid ADC event `{line}`" + ) + adc_event = mrd.ADCEvent( + id=int(tokens[0]), + num=int(tokens[1]), + dwell=float(tokens[2]), + delay=int(tokens[3]), + freq=float(tokens[4]), + phase=float(tokens[5]), + ) + except Exception as e: + raise RuntimeError( + f"Line {line_number}: invalid ADC event `{line}`" + ) from e + + adc_events.append(adc_event) + + return adc_events + + +def _parse_shapes(lines: _LinesIterator) -> list[mrd.Shape]: + shapes: list[mrd.Shape] = [] + + while True: + lines.skip_empty_lines() + peeked = lines.peek() + if not peeked or peeked[1].startswith("[") and peeked[1].endswith("]"): + break + + line_number, line = next(lines) + k, v = line.split() + if k != "shape_id" and k != "Shape_ID": + raise RuntimeError( + f"Line {line_number}: Expected shape_id, got `{line}`" + ) + shape_id = int(v) + + line_number, line = next(lines) + k, v = line.split() + if k != "num_samples" and k != "Num_Uncompressed": + raise RuntimeError( + f"Line {line_number}: Expected num_samples, got `{line}`" + ) + num_samples = int(v) + + data = [] + for line_number, line in lines: + if line == "": + break + try: + data.append(float(line)) + except ValueError: + raise RuntimeError( + f"Line {line_number}: Invalid shape data `{line}`" + ) + + shapes.append( + mrd.Shape( + id=shape_id, + num_samples=num_samples, + data=np.array(data, dtype=np.float64), + ) + ) + + return shapes + + +def _parse_signature(lines: _LinesIterator) -> None: + for _, line in lines: + if line == "": + break + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Converts a Pulseq .seq file into an MRD stream") + parser.add_argument('-i', '--input', type=str, required=False, help="Input file, defaults to stdin") + parser.add_argument('-o', '--output', type=str, required=False, help="Output file, defaults to stdout") + args = parser.parse_args() + + with (open(args.input, "r") if args.input is not None else sys.stdin) as input: + with (open(args.output, "wb") if args.output is not None else sys.stdout.buffer) as output: + with mrd.BinaryMrdWriter(output) as writer: + writer.write_header(None) + writer.write_data(pulseq_text_to_stream_items(input)) diff --git a/python/mrd/types.py b/python/mrd/types.py index 4e63966e..2aff212c 100644 --- a/python/mrd/types.py +++ b/python/mrd/types.py @@ -330,6 +330,37 @@ def __repr__(self) -> str: return f"Acquisition(head={repr(self.head)}, data={repr(self.data)}, trajectory={repr(self.trajectory)})" +class AcquisitionPrototype: + """Specifies header and data size of an acquisition, without the actual data.""" + + head: AcquisitionHeader + """Acquisition header template""" + + data_sample_counts: npt.NDArray[np.uint32] + """Sample counts by coil""" + + + def __init__(self, *, + head: typing.Optional[AcquisitionHeader] = None, + data_sample_counts: typing.Optional[npt.NDArray[np.uint32]] = None, + ): + self.head = head if head is not None else AcquisitionHeader() + self.data_sample_counts = data_sample_counts if data_sample_counts is not None else np.zeros((0), dtype=np.dtype(np.uint32)) + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, AcquisitionPrototype) + and self.head == other.head + and yardl.structural_equal(self.data_sample_counts, other.data_sample_counts) + ) + + def __str__(self) -> str: + return f"AcquisitionPrototype(head={self.head}, data_sample_counts={self.data_sample_counts})" + + def __repr__(self) -> str: + return f"AcquisitionPrototype(head={repr(self.head)}, data_sample_counts={repr(self.data_sample_counts)})" + + class PatientGender(yardl.OutOfRangeEnum): M = 0 F = 1 @@ -2088,8 +2119,490 @@ def __repr__(self) -> str: ArrayComplexFloat = Array[np.complex64] +class PulseqDefinitions: + """Pulseq definitions""" + + gradient_raster_time: yardl.Float64 + """Default raster time (dwell time) of the shaped gradient events, specified in seconds""" + + radiofrequency_raster_time: yardl.Float64 + """Default raster time (dwell time) of the radio-frequency pulse shapes, specified in seconds""" + + adc_raster_time: yardl.Float64 + """The value defining the alignment of the ADC dwell times. + ADC dwell time must be integer multiple of the specified adcRasterTime. + adcRasterTime is specified in seconds + """ + + block_duration_raster: yardl.Float64 + """The value defining the alignment of the block durations, specified in seconds; + the physical block duration must be integer multiple of the specified blockDurationRaster. + Block duration in the blocks section are specified in the units of blockDurationRaster + """ + + name: typing.Optional[str] + """Human-readable name of the sequence""" + + fov: typing.Optional[ThreeDimensionalFloat] + """Field of view specified in meters.""" + + total_duration: typing.Optional[yardl.Float64] + """Total duration of the sequence is seconds""" + + custom: dict[str, str] + + def __init__(self, *, + gradient_raster_time: yardl.Float64 = 0.0, + radiofrequency_raster_time: yardl.Float64 = 0.0, + adc_raster_time: yardl.Float64 = 0.0, + block_duration_raster: yardl.Float64 = 0.0, + name: typing.Optional[str] = None, + fov: typing.Optional[ThreeDimensionalFloat] = None, + total_duration: typing.Optional[yardl.Float64] = None, + custom: typing.Optional[dict[str, str]] = None, + ): + self.gradient_raster_time = gradient_raster_time + self.radiofrequency_raster_time = radiofrequency_raster_time + self.adc_raster_time = adc_raster_time + self.block_duration_raster = block_duration_raster + self.name = name + self.fov = fov + self.total_duration = total_duration + self.custom = custom if custom is not None else {} + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, PulseqDefinitions) + and self.gradient_raster_time == other.gradient_raster_time + and self.radiofrequency_raster_time == other.radiofrequency_raster_time + and self.adc_raster_time == other.adc_raster_time + and self.block_duration_raster == other.block_duration_raster + and self.name == other.name + and self.fov == other.fov + and self.total_duration == other.total_duration + and self.custom == other.custom + ) + + def __str__(self) -> str: + return f"PulseqDefinitions(gradient_raster_time={self.gradient_raster_time}, radiofrequency_raster_time={self.radiofrequency_raster_time}, adc_raster_time={self.adc_raster_time}, block_duration_raster={self.block_duration_raster}, name={self.name}, fov={self.fov}, total_duration={self.total_duration}, custom={self.custom})" + + def __repr__(self) -> str: + return f"PulseqDefinitions(gradient_raster_time={repr(self.gradient_raster_time)}, radiofrequency_raster_time={repr(self.radiofrequency_raster_time)}, adc_raster_time={repr(self.adc_raster_time)}, block_duration_raster={repr(self.block_duration_raster)}, name={repr(self.name)}, fov={repr(self.fov)}, total_duration={repr(self.total_duration)}, custom={repr(self.custom)})" + + +class Block: + """A sequence block that includes possible RF, gradient, and ADC events.""" + + id: yardl.Int32 + """ID of the sequence block""" + + duration: yardl.UInt64 + """Duration of the block in units of Definitions.blockDurationRaster""" + + rf: yardl.Int32 + """ID of the RF event""" + + gx: yardl.Int32 + """ID of the gradient event on the X channel""" + + gy: yardl.Int32 + """ID of the gradient event on the Y channel""" + + gz: yardl.Int32 + """ID of the gradient event on the Z channel""" + + adc: yardl.Int32 + """ID of the ADC event""" + + ext: yardl.Int32 + """ID of the extension table entry""" + + + def __init__(self, *, + id: yardl.Int32 = 0, + duration: yardl.UInt64 = 0, + rf: yardl.Int32 = 0, + gx: yardl.Int32 = 0, + gy: yardl.Int32 = 0, + gz: yardl.Int32 = 0, + adc: yardl.Int32 = 0, + ext: yardl.Int32 = 0, + ): + self.id = id + self.duration = duration + self.rf = rf + self.gx = gx + self.gy = gy + self.gz = gz + self.adc = adc + self.ext = ext + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, Block) + and self.id == other.id + and self.duration == other.duration + and self.rf == other.rf + and self.gx == other.gx + and self.gy == other.gy + and self.gz == other.gz + and self.adc == other.adc + and self.ext == other.ext + ) + + def __str__(self) -> str: + return f"Block(id={self.id}, duration={self.duration}, rf={self.rf}, gx={self.gx}, gy={self.gy}, gz={self.gz}, adc={self.adc}, ext={self.ext})" + + def __repr__(self) -> str: + return f"Block(id={repr(self.id)}, duration={repr(self.duration)}, rf={repr(self.rf)}, gx={repr(self.gx)}, gy={repr(self.gy)}, gz={repr(self.gz)}, adc={repr(self.adc)}, ext={repr(self.ext)})" + + +class RFPulseUse(yardl.OutOfRangeEnum): + UNDEFINED = 0 + EXCITATION = 1 + REFOCUSING = 2 + INVERSION = 3 + SATURATION = 4 + PREPARATION = 5 + OTHER = 6 + +class RFEvent: + """An RF event""" + + id: yardl.Int32 + """ID of the RF event""" + + amp: yardl.Float64 + """Peak amplitude in Hz""" + + mag_id: yardl.Int32 + """Shape ID for the magnitude profile""" + + phase_id: yardl.Int32 + """Shape ID for the phase profile""" + + time_id: yardl.Int32 + """Shape ID for the time sampling points, specified in the units of + RadiofrequencyRasterTime. + 0 means default time raster + """ + + center: yardl.Float64 + """Time point in microseconds relative to the beginning of + the RF shape at which the effective rotation takes place + """ + + delay: yardl.UInt64 + """Delay before starting the RF pulse, specified in microseconds""" + + freq_ppm: yardl.Float64 + """Frequency offset relative to the main system's frequency, + specified in parts per million (ppm) + """ + + phase_ppm: yardl.Float64 + """Phase offset proportional to the main system's frequency, + specified in rad/MHz + """ + + freq_offset: yardl.Float64 + """Frequency offset in absolute units, specified in Hz""" + + phase_offset: yardl.Float64 + """Phase offset in absolute units, specified in radians""" + + use: RFPulseUse + + def __init__(self, *, + id: yardl.Int32 = 0, + amp: yardl.Float64 = 0.0, + mag_id: yardl.Int32 = 0, + phase_id: yardl.Int32 = 0, + time_id: yardl.Int32 = 0, + center: yardl.Float64 = 0.0, + delay: yardl.UInt64 = 0, + freq_ppm: yardl.Float64 = 0.0, + phase_ppm: yardl.Float64 = 0.0, + freq_offset: yardl.Float64 = 0.0, + phase_offset: yardl.Float64 = 0.0, + use: RFPulseUse = RFPulseUse.UNDEFINED, + ): + self.id = id + self.amp = amp + self.mag_id = mag_id + self.phase_id = phase_id + self.time_id = time_id + self.center = center + self.delay = delay + self.freq_ppm = freq_ppm + self.phase_ppm = phase_ppm + self.freq_offset = freq_offset + self.phase_offset = phase_offset + self.use = use + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, RFEvent) + and self.id == other.id + and self.amp == other.amp + and self.mag_id == other.mag_id + and self.phase_id == other.phase_id + and self.time_id == other.time_id + and self.center == other.center + and self.delay == other.delay + and self.freq_ppm == other.freq_ppm + and self.phase_ppm == other.phase_ppm + and self.freq_offset == other.freq_offset + and self.phase_offset == other.phase_offset + and self.use == other.use + ) + + def __str__(self) -> str: + return f"RFEvent(id={self.id}, amp={self.amp}, mag_id={self.mag_id}, phase_id={self.phase_id}, time_id={self.time_id}, center={self.center}, delay={self.delay}, freq_ppm={self.freq_ppm}, phase_ppm={self.phase_ppm}, freq_offset={self.freq_offset}, phase_offset={self.phase_offset}, use={self.use})" + + def __repr__(self) -> str: + return f"RFEvent(id={repr(self.id)}, amp={repr(self.amp)}, mag_id={repr(self.mag_id)}, phase_id={repr(self.phase_id)}, time_id={repr(self.time_id)}, center={repr(self.center)}, delay={repr(self.delay)}, freq_ppm={repr(self.freq_ppm)}, phase_ppm={repr(self.phase_ppm)}, freq_offset={repr(self.freq_offset)}, phase_offset={repr(self.phase_offset)}, use={repr(self.use)})" + + +class ArbitraryGradient: + """An arbitrary gradient event""" + + id: yardl.Int32 + """ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events.""" + + amp: yardl.Float64 + """Peak amplitude in Hz/m""" + + first: yardl.Float64 + """The amplitude at the start of the gradient.""" + + last: yardl.Float64 + """The amplitude at the end of the gradient.""" + + shape_id: yardl.Int32 + """Shape ID for the gradient shape""" + + time_id: yardl.Int32 + """Shape ID for the time sampling points, specified in the units of GradientRasterTime. + 0 means default time raster, -1 means 1/2 of the default time raster (gradient oversampling case). + """ + + delay: yardl.UInt64 + """Delay before starting the gradient, specified in microseconds""" + + + def __init__(self, *, + id: yardl.Int32 = 0, + amp: yardl.Float64 = 0.0, + first: yardl.Float64 = 0.0, + last: yardl.Float64 = 0.0, + shape_id: yardl.Int32 = 0, + time_id: yardl.Int32 = 0, + delay: yardl.UInt64 = 0, + ): + self.id = id + self.amp = amp + self.first = first + self.last = last + self.shape_id = shape_id + self.time_id = time_id + self.delay = delay + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, ArbitraryGradient) + and self.id == other.id + and self.amp == other.amp + and self.first == other.first + and self.last == other.last + and self.shape_id == other.shape_id + and self.time_id == other.time_id + and self.delay == other.delay + ) + + def __str__(self) -> str: + return f"ArbitraryGradient(id={self.id}, amp={self.amp}, first={self.first}, last={self.last}, shape_id={self.shape_id}, time_id={self.time_id}, delay={self.delay})" + + def __repr__(self) -> str: + return f"ArbitraryGradient(id={repr(self.id)}, amp={repr(self.amp)}, first={repr(self.first)}, last={repr(self.last)}, shape_id={repr(self.shape_id)}, time_id={repr(self.time_id)}, delay={repr(self.delay)})" + + +class TrapezoidalGradient: + """A trapezoidal gradient event""" + + id: yardl.Int32 + """ID of the gradient event. Must be unique among all arbitrary and trapezoidal gradient events.""" + + amp: yardl.Float64 + """Peak amplitude in Hz/m""" + + rise: yardl.UInt64 + """Rise time of the trapezoid in microseconds""" + + flat: yardl.UInt64 + """Flat-top time of the trapezoid in microseconds""" + + fall: yardl.UInt64 + """Fall time of the trapezoid in microseconds""" + + delay: yardl.UInt64 + """Delay before starting the gradient, specified in microseconds""" + + + def __init__(self, *, + id: yardl.Int32 = 0, + amp: yardl.Float64 = 0.0, + rise: yardl.UInt64 = 0, + flat: yardl.UInt64 = 0, + fall: yardl.UInt64 = 0, + delay: yardl.UInt64 = 0, + ): + self.id = id + self.amp = amp + self.rise = rise + self.flat = flat + self.fall = fall + self.delay = delay + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, TrapezoidalGradient) + and self.id == other.id + and self.amp == other.amp + and self.rise == other.rise + and self.flat == other.flat + and self.fall == other.fall + and self.delay == other.delay + ) + + def __str__(self) -> str: + return f"TrapezoidalGradient(id={self.id}, amp={self.amp}, rise={self.rise}, flat={self.flat}, fall={self.fall}, delay={self.delay})" + + def __repr__(self) -> str: + return f"TrapezoidalGradient(id={repr(self.id)}, amp={repr(self.amp)}, rise={repr(self.rise)}, flat={repr(self.flat)}, fall={repr(self.fall)}, delay={repr(self.delay)})" + + +class ADCEvent: + """An ADC event""" + + id: yardl.Int32 + """ID of the ADC event""" + + num: yardl.UInt64 + """Number of samples""" + + dwell: yardl.Float32 + """The ADC dwell time, specified in nanoseconds""" + + delay: yardl.UInt64 + """Delay between start of block and first sample, specified in microseconds""" + + freq_ppm: yardl.Float64 + """Frequency offset of the ADC receiver relative to the system frequency, + specified in parts per million (ppm) + """ + + phase_ppm: yardl.Float64 + """Phase offset of the ADC receiver proportional to the system frequency, + specified in rad/MHz + """ + + freq: yardl.Float64 + """Frequency offset of the ADC receiver in absolute units, specified in Hz""" + + phase: yardl.Float64 + """Phase offset in absolute units, specified in radians""" + + phase_shape_id: yardl.Int32 + """The shape ID""" + + + def __init__(self, *, + id: yardl.Int32 = 0, + num: yardl.UInt64 = 0, + dwell: yardl.Float32 = 0.0, + delay: yardl.UInt64 = 0, + freq_ppm: yardl.Float64 = 0.0, + phase_ppm: yardl.Float64 = 0.0, + freq: yardl.Float64 = 0.0, + phase: yardl.Float64 = 0.0, + phase_shape_id: yardl.Int32 = 0, + ): + self.id = id + self.num = num + self.dwell = dwell + self.delay = delay + self.freq_ppm = freq_ppm + self.phase_ppm = phase_ppm + self.freq = freq + self.phase = phase + self.phase_shape_id = phase_shape_id + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, ADCEvent) + and self.id == other.id + and self.num == other.num + and self.dwell == other.dwell + and self.delay == other.delay + and self.freq_ppm == other.freq_ppm + and self.phase_ppm == other.phase_ppm + and self.freq == other.freq + and self.phase == other.phase + and self.phase_shape_id == other.phase_shape_id + ) + + def __str__(self) -> str: + return f"ADCEvent(id={self.id}, num={self.num}, dwell={self.dwell}, delay={self.delay}, freq_ppm={self.freq_ppm}, phase_ppm={self.phase_ppm}, freq={self.freq}, phase={self.phase}, phase_shape_id={self.phase_shape_id})" + + def __repr__(self) -> str: + return f"ADCEvent(id={repr(self.id)}, num={repr(self.num)}, dwell={repr(self.dwell)}, delay={repr(self.delay)}, freq_ppm={repr(self.freq_ppm)}, phase_ppm={repr(self.phase_ppm)}, freq={repr(self.freq)}, phase={repr(self.phase)}, phase_shape_id={repr(self.phase_shape_id)})" + + +class Shape: + """A list of samples that is potentially compressed. + If numSamples == size(data) then the shape is uncompressed. + """ + + id: yardl.Int32 + """ID of the shape""" + + num_samples: yardl.UInt64 + """Number of samples of the uncompressed shape""" + + data: npt.NDArray[np.float64] + """Samples of the (potentially) compressed shape. See the Pulseq specification for compression details. + In the spec, this should be float32, but PyPulseq uses float64. + """ + + + def __init__(self, *, + id: yardl.Int32 = 0, + num_samples: yardl.UInt64 = 0, + data: typing.Optional[npt.NDArray[np.float64]] = None, + ): + self.id = id + self.num_samples = num_samples + self.data = data if data is not None else np.zeros((0), dtype=np.dtype(np.float64)) + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, Shape) + and self.id == other.id + and self.num_samples == other.num_samples + and yardl.structural_equal(self.data, other.data) + ) + + def __str__(self) -> str: + return f"Shape(id={self.id}, num_samples={self.num_samples}, data={self.data})" + + def __repr__(self) -> str: + return f"Shape(id={repr(self.id)}, num_samples={repr(self.num_samples)}, data={repr(self.data)})" + + class StreamItem: Acquisition: typing.ClassVar[type["StreamItemUnionCase[Acquisition]"]] + AcquisitionPrototype: typing.ClassVar[type["StreamItemUnionCase[AcquisitionPrototype]"]] WaveformUint32: typing.ClassVar[type["StreamItemUnionCase[WaveformUint32]"]] ImageUint16: typing.ClassVar[type["StreamItemUnionCase[ImageUint16]"]] ImageInt16: typing.ClassVar[type["StreamItemUnionCase[ImageInt16]"]] @@ -2103,34 +2616,50 @@ class StreamItem: ReconData: typing.ClassVar[type["StreamItemUnionCase[ReconData]"]] ArrayComplexFloat: typing.ClassVar[type["StreamItemUnionCase[ArrayComplexFloat]"]] ImageArray: typing.ClassVar[type["StreamItemUnionCase[ImageArray]"]] + PulseqDefinitions: typing.ClassVar[type["StreamItemUnionCase[PulseqDefinitions]"]] + Blocks: typing.ClassVar[type["StreamItemUnionCase[list[Block]]"]] + Rf: typing.ClassVar[type["StreamItemUnionCase[RFEvent]"]] + ArbitraryGradient: typing.ClassVar[type["StreamItemUnionCase[ArbitraryGradient]"]] + TrapezoidalGradient: typing.ClassVar[type["StreamItemUnionCase[TrapezoidalGradient]"]] + Adc: typing.ClassVar[type["StreamItemUnionCase[ADCEvent]"]] + Shape: typing.ClassVar[type["StreamItemUnionCase[Shape]"]] 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.Acquisition = type("StreamItem.Acquisition", (StreamItemUnionCase,), {"index": 0, "tag": "acquisition"}) +StreamItem.AcquisitionPrototype = type("StreamItem.AcquisitionPrototype", (StreamItemUnionCase,), {"index": 1, "tag": "acquisitionPrototype"}) +StreamItem.WaveformUint32 = type("StreamItem.WaveformUint32", (StreamItemUnionCase,), {"index": 2, "tag": "waveformUint32"}) +StreamItem.ImageUint16 = type("StreamItem.ImageUint16", (StreamItemUnionCase,), {"index": 3, "tag": "imageUint16"}) +StreamItem.ImageInt16 = type("StreamItem.ImageInt16", (StreamItemUnionCase,), {"index": 4, "tag": "imageInt16"}) +StreamItem.ImageUint32 = type("StreamItem.ImageUint32", (StreamItemUnionCase,), {"index": 5, "tag": "imageUint32"}) +StreamItem.ImageInt32 = type("StreamItem.ImageInt32", (StreamItemUnionCase,), {"index": 6, "tag": "imageInt32"}) +StreamItem.ImageFloat = type("StreamItem.ImageFloat", (StreamItemUnionCase,), {"index": 7, "tag": "imageFloat"}) +StreamItem.ImageDouble = type("StreamItem.ImageDouble", (StreamItemUnionCase,), {"index": 8, "tag": "imageDouble"}) +StreamItem.ImageComplexFloat = type("StreamItem.ImageComplexFloat", (StreamItemUnionCase,), {"index": 9, "tag": "imageComplexFloat"}) +StreamItem.ImageComplexDouble = type("StreamItem.ImageComplexDouble", (StreamItemUnionCase,), {"index": 10, "tag": "imageComplexDouble"}) +StreamItem.AcquisitionBucket = type("StreamItem.AcquisitionBucket", (StreamItemUnionCase,), {"index": 11, "tag": "acquisitionBucket"}) +StreamItem.ReconData = type("StreamItem.ReconData", (StreamItemUnionCase,), {"index": 12, "tag": "reconData"}) +StreamItem.ArrayComplexFloat = type("StreamItem.ArrayComplexFloat", (StreamItemUnionCase,), {"index": 13, "tag": "arrayComplexFloat"}) +StreamItem.ImageArray = type("StreamItem.ImageArray", (StreamItemUnionCase,), {"index": 14, "tag": "imageArray"}) +StreamItem.PulseqDefinitions = type("StreamItem.PulseqDefinitions", (StreamItemUnionCase,), {"index": 15, "tag": "pulseqDefinitions"}) +StreamItem.Blocks = type("StreamItem.Blocks", (StreamItemUnionCase,), {"index": 16, "tag": "blocks"}) +StreamItem.Rf = type("StreamItem.Rf", (StreamItemUnionCase,), {"index": 17, "tag": "rf"}) +StreamItem.ArbitraryGradient = type("StreamItem.ArbitraryGradient", (StreamItemUnionCase,), {"index": 18, "tag": "arbitraryGradient"}) +StreamItem.TrapezoidalGradient = type("StreamItem.TrapezoidalGradient", (StreamItemUnionCase,), {"index": 19, "tag": "trapezoidalGradient"}) +StreamItem.Adc = type("StreamItem.Adc", (StreamItemUnionCase,), {"index": 20, "tag": "adc"}) +StreamItem.Shape = type("StreamItem.Shape", (StreamItemUnionCase,), {"index": 21, "tag": "shape"}) del StreamItemUnionCase def _mk_get_dtype(): - dtype_map: dict[typing.Union[type, types.GenericAlias], typing.Union[np.dtype[typing.Any], typing.Callable[[tuple[type, ...]], np.dtype[typing.Any]]]] = {} + dtype_map: dict[typing.Union[type, types.GenericAlias, typing.Annotated[typing.Any, typing.Any]], typing.Union[np.dtype[typing.Any], typing.Callable[[tuple[type, ...]], np.dtype[typing.Any]]]] = {} get_dtype = _dtypes.make_get_dtype_func(dtype_map) dtype_map.setdefault(AcquisitionFlags, np.dtype(np.uint64)) 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(AcquisitionPrototype, np.dtype([('head', get_dtype(AcquisitionHeader)), ('data_sample_counts', 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 +2722,14 @@ 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(PulseqDefinitions, np.dtype([('gradient_raster_time', np.dtype(np.float64)), ('radiofrequency_raster_time', np.dtype(np.float64)), ('adc_raster_time', np.dtype(np.float64)), ('block_duration_raster', np.dtype(np.float64)), ('name', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.object_))], align=True)), ('fov', np.dtype([('has_value', np.dtype(np.bool_)), ('value', get_dtype(ThreeDimensionalFloat))], align=True)), ('total_duration', np.dtype([('has_value', np.dtype(np.bool_)), ('value', np.dtype(np.float64))], align=True)), ('custom', np.dtype(np.object_))], align=True)) + dtype_map.setdefault(Block, np.dtype([('id', np.dtype(np.int32)), ('duration', np.dtype(np.uint64)), ('rf', np.dtype(np.int32)), ('gx', np.dtype(np.int32)), ('gy', np.dtype(np.int32)), ('gz', np.dtype(np.int32)), ('adc', np.dtype(np.int32)), ('ext', np.dtype(np.int32))], align=True)) + dtype_map.setdefault(RFPulseUse, np.dtype(np.int32)) + dtype_map.setdefault(RFEvent, np.dtype([('id', np.dtype(np.int32)), ('amp', np.dtype(np.float64)), ('mag_id', np.dtype(np.int32)), ('phase_id', np.dtype(np.int32)), ('time_id', np.dtype(np.int32)), ('center', np.dtype(np.float64)), ('delay', np.dtype(np.uint64)), ('freq_ppm', np.dtype(np.float64)), ('phase_ppm', np.dtype(np.float64)), ('freq_offset', np.dtype(np.float64)), ('phase_offset', np.dtype(np.float64)), ('use', get_dtype(RFPulseUse))], align=True)) + dtype_map.setdefault(ArbitraryGradient, np.dtype([('id', np.dtype(np.int32)), ('amp', np.dtype(np.float64)), ('first', np.dtype(np.float64)), ('last', np.dtype(np.float64)), ('shape_id', np.dtype(np.int32)), ('time_id', np.dtype(np.int32)), ('delay', np.dtype(np.uint64))], align=True)) + dtype_map.setdefault(TrapezoidalGradient, np.dtype([('id', np.dtype(np.int32)), ('amp', np.dtype(np.float64)), ('rise', np.dtype(np.uint64)), ('flat', np.dtype(np.uint64)), ('fall', np.dtype(np.uint64)), ('delay', np.dtype(np.uint64))], align=True)) + dtype_map.setdefault(ADCEvent, np.dtype([('id', np.dtype(np.int32)), ('num', np.dtype(np.uint64)), ('dwell', np.dtype(np.float32)), ('delay', np.dtype(np.uint64)), ('freq_ppm', np.dtype(np.float64)), ('phase_ppm', np.dtype(np.float64)), ('freq', np.dtype(np.float64)), ('phase', np.dtype(np.float64)), ('phase_shape_id', np.dtype(np.int32))], align=True)) + dtype_map.setdefault(Shape, np.dtype([('id', np.dtype(np.int32)), ('num_samples', np.dtype(np.uint64)), ('data', np.dtype(np.object_))], align=True)) dtype_map.setdefault(StreamItem, np.dtype(np.object_)) return get_dtype diff --git a/python/mrd/yardl_types.py b/python/mrd/yardl_types.py index 40693d23..019c5ca6 100644 --- a/python/mrd/yardl_types.py +++ b/python/mrd/yardl_types.py @@ -56,7 +56,7 @@ class DateTime: def __init__(self, nanoseconds_from_epoch: Union[int, np.datetime64] = 0): if isinstance(nanoseconds_from_epoch, np.datetime64): if nanoseconds_from_epoch.dtype != "datetime64[ns]": - self._value = np.datetime64(nanoseconds_from_epoch, "ns") + self._value = np.datetime64(nanoseconds_from_epoch, "ns") # type: ignore else: self._value = nanoseconds_from_epoch else: @@ -67,7 +67,9 @@ def numpy_value(self) -> np.datetime64: return self._value def to_datetime(self) -> datetime.datetime: - return datetime.datetime.utcfromtimestamp(self._value.astype(int) / 1e9) + return datetime.datetime.fromtimestamp( + self._value.astype(int) / 1e9, tz=datetime.timezone.utc + ) @staticmethod def from_components( @@ -269,8 +271,7 @@ def structural_equal(a: object, b: object) -> bool: if not isinstance(b, np.void): return b == a return a.dtype == b.dtype and all( - structural_equal(x, y) - for x, y in zip(a, b) # pyright: ignore [reportGeneralTypeIssues] + structural_equal(x, y) for x, y in zip(a, b) # type: ignore ) if isinstance(b, np.void): diff --git a/test/test.sh b/test/test.sh index 3f680304..009d8b36 100755 --- a/test/test.sh +++ b/test/test.sh @@ -56,5 +56,21 @@ python -m mrd.tools.stream_recon --input recon_in.pipe --output recon_out.pipe & python -m mrd.tools.export_png_images --input recon_out.pipe +echo Verifying Pulseq conversion +for dir in test_data/pulseq/*/; do + [[ -d "$dir" ]] || continue + pulseq_version=$(basename "$dir") + for file in "$dir"*; do + [[ -f "$file" ]] || continue + # convert to MRD stream and back, compare ignoring comments and whitespace + python -m mrd.tools.seq_to_mrd --input "$file" | python -m mrd.tools.mrd_to_seq --pulseq-version "$pulseq_version" | diff -I '#.*' --ignore-space-change "$file" - + if [[ "$pulseq_version" == "1.4.2" ]]; then + # Sanity check that PyPulseq can read the file + python -c "import pypulseq as pp; seq = pp.Sequence(); seq.read('$file')" + fi + done +done + + echo Cleaning up rm -f ./*.bin ./*.png ./*.pipe diff --git a/test/test_data/pulseq/1.4.2/example.seq b/test/test_data/pulseq/1.4.2/example.seq new file mode 100644 index 00000000..184a2abf --- /dev/null +++ b/test/test_data/pulseq/1.4.2/example.seq @@ -0,0 +1,63 @@ +# Pulseq sequence file +# Created by MRD + +[VERSION] +major 1 +minor 4 +revision 2 + +[DEFINITIONS] +AdcRasterTime 1e-07 +BlockDurationRaster 1e-05 +GradientRasterTime 1e-05 +RadiofrequencyRasterTime 1e-06 +FOV 0.256 0.256 0.004 +TotalDuration 0.0051 +CustomDefinition 42 + +# Format of blocks: +# NUM DUR RF GX GY GZ ADC EXT +[BLOCKS] +1 100 1 0 0 0 0 0 +2 83 0 1 0 0 0 0 +3 54 0 0 2 0 0 0 +4 24 0 0 0 3 0 0 +5 83 0 4 5 0 0 0 +6 83 0 0 2 1 0 0 +7 83 0 4 0 1 0 0 + +# Format of RF events: +# id amplitude mag_id phase_id time_shape_id delay freq phase +# .. Hz .... .... .... us Hz rad +[RF] +1 125 1 2 3 0 0 0 + +# Format of trapezoid gradients: +# id amplitude rise flat fall delay +# .. Hz/m us us us us +[TRAP] + 1 1.69492e+06 240 350 240 0 + 2 -1.66667e+06 240 60 240 0 + 3 833333 120 0 120 0 + 4 -1.69492e+06 240 350 240 0 + 5 1.66667e+06 240 60 240 0 + +# Sequence Shapes +[SHAPES] + +shape_id 1 +num_samples 2 +1 +1 + +shape_id 2 +num_samples 2 +0 +0 + +shape_id 3 +num_samples 2 +0 +1000 + +# Comment added to ensure editors preserve the preceding blank line. Pypulseq hangs if it is not present. diff --git a/test/test_data/pulseq/1.4.2/haste.seq b/test/test_data/pulseq/1.4.2/haste.seq new file mode 100644 index 00000000..f1e5ff47 --- /dev/null +++ b/test/test_data/pulseq/1.4.2/haste.seq @@ -0,0 +1,4902 @@ +# Pulseq sequence file +# Created by MRD + +[VERSION] +major 1 +minor 4 +revision 2 + +[DEFINITIONS] +AdcRasterTime 1e-07 +BlockDurationRaster 1e-05 +GradientRasterTime 1e-05 +RadiofrequencyRasterTime 1e-06 +TotalDuration 7 + +# Format of blocks: +# NUM DUR RF GX GY GZ ADC EXT +[BLOCKS] + 1 25 0 0 0 1 0 0 + 2 270 1 0 0 2 0 0 + 3 355 0 4 0 3 0 0 + 4 220 2 0 0 5 0 0 + 5 169 0 6 7 8 0 0 + 6 642 0 9 0 0 1 0 + 7 169 0 10 11 12 0 0 + 8 220 2 0 0 5 0 0 + 9 169 0 6 13 8 0 0 + 10 642 0 9 0 0 1 0 + 11 169 0 10 14 12 0 0 + 12 220 2 0 0 5 0 0 + 13 169 0 6 15 8 0 0 + 14 642 0 9 0 0 1 0 + 15 169 0 10 16 12 0 0 + 16 220 2 0 0 5 0 0 + 17 169 0 6 17 8 0 0 + 18 642 0 9 0 0 1 0 + 19 169 0 10 18 12 0 0 + 20 220 2 0 0 5 0 0 + 21 169 0 6 19 8 0 0 + 22 642 0 9 0 0 1 0 + 23 169 0 10 20 12 0 0 + 24 220 2 0 0 5 0 0 + 25 169 0 6 21 8 0 0 + 26 642 0 9 0 0 1 0 + 27 169 0 10 22 12 0 0 + 28 220 2 0 0 5 0 0 + 29 169 0 6 23 8 0 0 + 30 642 0 9 0 0 1 0 + 31 169 0 10 24 12 0 0 + 32 220 2 0 0 5 0 0 + 33 169 0 6 25 8 0 0 + 34 642 0 9 0 0 1 0 + 35 169 0 10 26 12 0 0 + 36 220 2 0 0 5 0 0 + 37 169 0 6 27 8 0 0 + 38 642 0 9 0 0 1 0 + 39 169 0 10 27 12 0 0 + 40 220 2 0 0 5 0 0 + 41 169 0 6 26 8 0 0 + 42 642 0 9 0 0 1 0 + 43 169 0 10 25 12 0 0 + 44 220 2 0 0 5 0 0 + 45 169 0 6 24 8 0 0 + 46 642 0 9 0 0 1 0 + 47 169 0 10 23 12 0 0 + 48 220 2 0 0 5 0 0 + 49 169 0 6 22 8 0 0 + 50 642 0 9 0 0 1 0 + 51 169 0 10 21 12 0 0 + 52 220 2 0 0 5 0 0 + 53 169 0 6 20 8 0 0 + 54 642 0 9 0 0 1 0 + 55 169 0 10 19 12 0 0 + 56 220 2 0 0 5 0 0 + 57 169 0 6 18 8 0 0 + 58 642 0 9 0 0 1 0 + 59 169 0 10 17 12 0 0 + 60 220 2 0 0 5 0 0 + 61 169 0 6 16 8 0 0 + 62 642 0 9 0 0 1 0 + 63 169 0 10 15 12 0 0 + 64 220 2 0 0 5 0 0 + 65 169 0 6 14 8 0 0 + 66 642 0 9 0 0 1 0 + 67 169 0 10 13 12 0 0 + 68 220 2 0 0 5 0 0 + 69 169 0 6 11 8 0 0 + 70 642 0 9 0 0 1 0 + 71 169 0 10 7 12 0 0 + 72 220 2 0 0 5 0 0 + 73 169 0 6 28 8 0 0 + 74 642 0 9 0 0 1 0 + 75 169 0 10 29 12 0 0 + 76 220 2 0 0 5 0 0 + 77 169 0 6 30 8 0 0 + 78 642 0 9 0 0 1 0 + 79 169 0 10 31 12 0 0 + 80 220 2 0 0 5 0 0 + 81 169 0 6 32 8 0 0 + 82 642 0 9 0 0 1 0 + 83 169 0 10 33 12 0 0 + 84 220 2 0 0 5 0 0 + 85 169 0 6 34 8 0 0 + 86 642 0 9 0 0 1 0 + 87 169 0 10 35 12 0 0 + 88 220 2 0 0 5 0 0 + 89 169 0 6 36 8 0 0 + 90 642 0 9 0 0 1 0 + 91 169 0 10 37 12 0 0 + 92 220 2 0 0 5 0 0 + 93 169 0 6 38 8 0 0 + 94 642 0 9 0 0 1 0 + 95 169 0 10 39 12 0 0 + 96 220 2 0 0 5 0 0 + 97 169 0 6 40 8 0 0 + 98 642 0 9 0 0 1 0 + 99 169 0 10 41 12 0 0 +100 220 2 0 0 5 0 0 +101 169 0 6 42 8 0 0 +102 642 0 9 0 0 1 0 +103 169 0 10 43 12 0 0 +104 220 2 0 0 5 0 0 +105 169 0 6 44 8 0 0 +106 642 0 9 0 0 1 0 +107 169 0 10 45 12 0 0 +108 220 2 0 0 5 0 0 +109 169 0 6 46 8 0 0 +110 642 0 9 0 0 1 0 +111 169 0 10 47 12 0 0 +112 220 2 0 0 5 0 0 +113 169 0 6 48 8 0 0 +114 642 0 9 0 0 1 0 +115 169 0 10 49 12 0 0 +116 220 2 0 0 5 0 0 +117 169 0 6 50 8 0 0 +118 642 0 9 0 0 1 0 +119 169 0 10 51 12 0 0 +120 220 2 0 0 5 0 0 +121 169 0 6 52 8 0 0 +122 642 0 9 0 0 1 0 +123 169 0 10 53 12 0 0 +124 220 2 0 0 5 0 0 +125 169 0 6 54 8 0 0 +126 642 0 9 0 0 1 0 +127 169 0 10 55 12 0 0 +128 220 2 0 0 5 0 0 +129 169 0 6 56 8 0 0 +130 642 0 9 0 0 1 0 +131 169 0 10 57 12 0 0 +132 220 2 0 0 5 0 0 +133 169 0 6 58 8 0 0 +134 642 0 9 0 0 1 0 +135 169 0 10 59 12 0 0 +136 220 2 0 0 5 0 0 +137 169 0 6 60 8 0 0 +138 642 0 9 0 0 1 0 +139 169 0 10 61 12 0 0 +140 220 2 0 0 5 0 0 +141 169 0 6 62 8 0 0 +142 642 0 9 0 0 1 0 +143 169 0 10 63 12 0 0 +144 220 2 0 0 5 0 0 +145 169 0 6 64 8 0 0 +146 642 0 9 0 0 1 0 +147 169 0 10 65 12 0 0 +148 220 2 0 0 5 0 0 +149 169 0 6 66 8 0 0 +150 642 0 9 0 0 1 0 +151 169 0 10 67 12 0 0 +152 220 2 0 0 5 0 0 +153 169 0 6 68 8 0 0 +154 642 0 9 0 0 1 0 +155 169 0 10 69 12 0 0 +156 220 2 0 0 5 0 0 +157 169 0 6 70 8 0 0 +158 642 0 9 0 0 1 0 +159 169 0 10 71 12 0 0 +160 220 2 0 0 5 0 0 +161 169 0 6 72 8 0 0 +162 642 0 9 0 0 1 0 +163 169 0 10 73 12 0 0 +164 220 0 0 0 5 0 0 +165 169 0 0 0 8 0 0 +166 150961 0 0 0 0 0 0 +167 500000 0 0 0 0 0 0 + +# Format of RF events: +# id amplitude mag_id phase_id time_shape_id delay freq phase +# .. Hz .... .... .... us Hz rad +[RF] +1 394.982 3 4 0 100 0 1.5708 +2 987.454 9 10 0 100 0 0 + +# Format of arbitrary gradients: +# time_shape_id of 0 means default timing (stepping with grad_raster starting at 1/2 of grad_raster) +# id amplitude amp_shape_id time_shape_id delay +# .. Hz/m .. .. us +[GRADIENTS] +1 320000 1 2 0 +2 320000 5 6 0 +3 320000 7 8 0 +5 320000 5 11 0 +6 180372 12 13 0 +8 491667 14 13 0 +9 38940.8 5 15 0 +10 180372 16 13 0 +12 491667 17 13 0 + +# Format of trapezoid gradients: +# id amplitude rise flat fall delay +# .. Hz/m us us us us +[TRAP] + 4 118061 250 3050 250 0 + 7 -21701.4 250 1190 250 0 +11 21701.4 250 1190 250 0 +13 -18988.7 250 1190 250 0 +14 18988.7 250 1190 250 0 +15 -16276 250 1190 250 0 +16 16276 250 1190 250 0 +17 -13563.4 250 1190 250 0 +18 13563.4 250 1190 250 0 +19 -10850.7 250 1190 250 0 +20 10850.7 250 1190 250 0 +21 -8138.02 250 1190 250 0 +22 8138.02 250 1190 250 0 +23 -5425.35 250 1190 250 0 +24 5425.35 250 1190 250 0 +25 -2712.67 250 1190 250 0 +26 2712.67 250 1190 250 0 +27 0 250 1190 250 0 +28 24414.1 250 1190 250 0 +29 -24414.1 250 1190 250 0 +30 27126.7 250 1190 250 0 +31 -27126.7 250 1190 250 0 +32 29839.4 250 1190 250 0 +33 -29839.4 250 1190 250 0 +34 32552.1 250 1190 250 0 +35 -32552.1 250 1190 250 0 +36 35264.8 250 1190 250 0 +37 -35264.8 250 1190 250 0 +38 37977.4 250 1190 250 0 +39 -37977.4 250 1190 250 0 +40 40690.1 250 1190 250 0 +41 -40690.1 250 1190 250 0 +42 43402.8 250 1190 250 0 +43 -43402.8 250 1190 250 0 +44 46115.5 250 1190 250 0 +45 -46115.5 250 1190 250 0 +46 48828.1 250 1190 250 0 +47 -48828.1 250 1190 250 0 +48 51540.8 250 1190 250 0 +49 -51540.8 250 1190 250 0 +50 54253.5 250 1190 250 0 +51 -54253.5 250 1190 250 0 +52 56966.1 250 1190 250 0 +53 -56966.1 250 1190 250 0 +54 59678.8 250 1190 250 0 +55 -59678.8 250 1190 250 0 +56 62391.5 250 1190 250 0 +57 -62391.5 250 1190 250 0 +58 65104.2 250 1190 250 0 +59 -65104.2 250 1190 250 0 +60 67816.8 250 1190 250 0 +61 -67816.8 250 1190 250 0 +62 70529.5 250 1190 250 0 +63 -70529.5 250 1190 250 0 +64 73242.2 250 1190 250 0 +65 -73242.2 250 1190 250 0 +66 75954.9 250 1190 250 0 +67 -75954.9 250 1190 250 0 +68 78667.5 250 1190 250 0 +69 -78667.5 250 1190 250 0 +70 81380.2 250 1190 250 0 +71 -81380.2 250 1190 250 0 +72 84092.9 250 1190 250 0 +73 -84092.9 250 1190 250 0 + +# Format of ADC events: +# id num dwell delay freq phase +# .. .. ns us Hz rad +[ADC] +1 64 100000 10 0 0 + +# Sequence Shapes +[SHAPES] + +shape_id 1 +num_samples 2 +0 +1 + +shape_id 2 +num_samples 2 +0 +25 + +shape_id 3 +num_samples 2500 +1.57976909e-10 +4.26875246e-09 +1.97782093e-08 +5.43134e-08 +1.15524074e-07 +2.11082039e-07 +3.48680544e-07 +5.3603361e-07 +7.80875439e-07 +1.0909597e-06 +1.47405899e-06 +1.93796427e-06 +2.49048344e-06 +3.13944247e-06 +3.89268234e-06 +4.75806064e-06 +5.74344904e-06 +6.85673467e-06 +8.10581696e-06 +9.49860896e-06 +1.10430365e-05 +1.27470357e-05 +1.46185548e-05 +1.66655518e-05 +1.88959948e-05 +2.1317861e-05 +2.3939132e-05 +2.67678042e-05 +2.98118757e-05 +3.30793482e-05 +3.65782398e-05 +4.03165614e-05 +4.43023309e-05 +4.85435739e-05 +5.30483194e-05 +5.7824589e-05 +6.28804119e-05 +6.82238242e-05 +7.38628514e-05 +7.98055262e-05 +8.60598666e-05 +9.26339053e-05 +9.95356604e-05 +0.00010677315 +0.000114354392 +0.000122287383 +0.000130580142 +0.00013924067 +0.000148276929 +0.000157696923 +0.00016750861 +0.000177719965 +0.000188338934 +0.000199373462 +0.000210831466 +0.00022272089 +0.000235049607 +0.000247825548 +0.000261056557 +0.000274750491 +0.000288915209 +0.00030355854 +0.000318688311 +0.000334312266 +0.000350438233 +0.000367073924 +0.000384227082 +0.000401905447 +0.000420116674 +0.000438868476 +0.000458168419 +0.000478024216 +0.000498443376 +0.000519433524 +0.000541002199 +0.000563156907 +0.00058590516 +0.000609254348 +0.000633211923 +0.000657785393 +0.000682981976 +0.000708809064 +0.00073527405 +0.000762384036 +0.000790146412 +0.00081856834 +0.00084765692 +0.00087741937 +0.000907862792 +0.00093899417 +0.000970820547 +0.00100334897 +0.00103658624 +0.00107053947 +0.00110521528 +0.00114062068 +0.00117676228 +0.00121364696 +0.00125128136 +0.0012896721 +0.00132882583 +0.00136874896 +0.0014094481 +0.00145092979 +0.00149320031 +0.00153626606 +0.00158013334 +0.00162480841 +0.00167029747 +0.00171660667 +0.00176374207 +0.00181170984 +0.00186051591 +0.00191016612 +0.00196066638 +0.00201202277 +0.00206424086 +0.00211732625 +0.00217128475 +0.00222612172 +0.00228184322 +0.00233845413 +0.00239596027 +0.00245436653 +0.00251367874 +0.00257390179 +0.00263504102 +0.00269710133 +0.00276008784 +0.00282400567 +0.00288885948 +0.00295465393 +0.00302139437 +0.00308908476 +0.00315773045 +0.0032273354 +0.00329790427 +0.00336944172 +0.0034419517 +0.00351543864 +0.00358990673 +0.00366536016 +0.00374180288 +0.00381923886 +0.00389767182 +0.00397710595 +0.00405754428 +0.00413899124 +0.00422145054 +0.00430492451 +0.00438941782 +0.00447493279 +0.00456147315 +0.00464904215 +0.00473764306 +0.0048272782 +0.0049179513 +0.00500966422 +0.00510242069 +0.00519622304 +0.00529107312 +0.00538697466 +0.00548392907 +0.00558193913 +0.00568100717 +0.00578113459 +0.00588232419 +0.00598457782 +0.00608789735 +0.00619228417 +0.00629774015 +0.00640426716 +0.00651186612 +0.00662053889 +0.0067302864 +0.00684111053 +0.00695301173 +0.00706599094 +0.00718004955 +0.00729518849 +0.00741140777 +0.00752870878 +0.00764709152 +0.00776655646 +0.00788710453 +0.00800873525 +0.00813144911 +0.00825524516 +0.00838012528 +0.00850608759 +0.00863313209 +0.0087612588 +0.0088904677 +0.00902075786 +0.00915212743 +0.0092845764 +0.00941810478 +0.00955271069 +0.00968839228 +0.00982514955 +0.00996298064 +0.0101018846 +0.0102418587 +0.0103829028 +0.0105250133 +0.0106681902 +0.0108124306 +0.0109577319 +0.0111040929 +0.0112515111 +0.0113999834 +0.0115495073 +0.0117000807 +0.011851701 +0.0120043643 +0.0121580688 +0.0123128109 +0.0124685867 +0.0126253935 +0.0127832284 +0.012942086 +0.0131019652 +0.0132628595 +0.0134247672 +0.0135876834 +0.0137516037 +0.0139165232 +0.0140824392 +0.0142493462 +0.0144172395 +0.0145861153 +0.0147559671 +0.0149267912 +0.015098582 +0.0152713349 +0.0154450433 +0.0156197026 +0.0157953072 +0.0159718525 +0.0161493309 +0.016327735 +0.0165070631 +0.0166873056 +0.0168684591 +0.017050514 +0.0172334649 +0.0174173061 +0.0176020302 +0.0177876297 +0.0179740991 +0.0181614291 +0.018349614 +0.0185386464 +0.018728517 +0.0189192202 +0.0191107467 +0.0193030909 +0.0194962434 +0.0196901951 +0.0198849384 +0.020080464 +0.0202767663 +0.0204738341 +0.0206716601 +0.0208702348 +0.0210695472 +0.0212695915 +0.0214703567 +0.0216718335 +0.0218740143 +0.0220768861 +0.0222804416 +0.0224846695 +0.0226895604 +0.0228951052 +0.0231012907 +0.0233081095 +0.0235155504 +0.0237236023 +0.0239322558 +0.0241414979 +0.0243513174 +0.0245617051 +0.0247726496 +0.0249841381 +0.0251961611 +0.0254087057 +0.0256217588 +0.025835311 +0.0260493495 +0.026263861 +0.0264788345 +0.0266942587 +0.0269101188 +0.0271264035 +0.0273430999 +0.027560195 +0.0277776755 +0.0279955287 +0.0282137413 +0.0284323003 +0.0286511909 +0.0288704019 +0.0290899165 +0.0293097254 +0.02952981 +0.029750159 +0.0299707558 +0.0301915891 +0.0304126423 +0.0306339022 +0.0308553539 +0.0310769808 +0.0312987715 +0.0315207057 +0.031742774 +0.0319649577 +0.0321872421 +0.0324096121 +0.0326320492 +0.0328545459 +0.0330770761 +0.0332996286 +0.0335221887 +0.0337447412 +0.033967264 +0.0341897458 +0.034412168 +0.0346345119 +0.0348567665 +0.0350789092 +0.0353009254 +0.0355227962 +0.0357445106 +0.0359660424 +0.0361873806 +0.0364085026 +0.0366293974 +0.0368500426 +0.0370704196 +0.0372905135 +0.0375103019 +0.0377297737 +0.0379489027 +0.0381676741 +0.0383860692 +0.0386040732 +0.03882166 +0.0390388146 +0.0392555185 +0.0394717492 +0.039687492 +0.0399027281 +0.0401174314 +0.0403315909 +0.0405451804 +0.0407581851 +0.0409705825 +0.0411823504 +0.0413934737 +0.0416039303 +0.0418136977 +0.042022761 +0.0422310941 +0.0424386822 +0.0426454991 +0.0428515263 +0.0430567451 +0.0432611331 +0.0434646681 +0.0436673313 +0.0438691005 +0.0440699533 +0.044269871 +0.0444688275 +0.0446668081 +0.0448637865 +0.0450597405 +0.0452546515 +0.0454484969 +0.0456412546 +0.0458329022 +0.0460234135 +0.0462127738 +0.0464009568 +0.046587944 +0.0467737056 +0.046958223 +0.0471414775 +0.0473234393 +0.0475040898 +0.0476834066 +0.0478613637 +0.0480379425 +0.0482131168 +0.0483868644 +0.0485591628 +0.048729986 +0.0488993153 +0.0490671247 +0.0492333882 +0.0493980832 +0.0495611914 +0.0497226827 +0.0498825386 +0.0500407331 +0.05019724 +0.050352037 +0.050505098 +0.0506564043 +0.05080593 +0.0509536453 +0.0510995351 +0.051243566 +0.0513857193 +0.0515259728 +0.0516642928 +0.0518006645 +0.0519350581 +0.0520674475 +0.052197814 +0.0523261279 +0.0524523668 +0.0525765046 +0.0526985154 +0.0528183766 +0.0529360622 +0.0530515462 +0.0531648062 +0.0532758124 +0.0533845462 +0.0534909777 +0.053595081 +0.0536968336 +0.0537962094 +0.0538931824 +0.0539877303 +0.0540798232 +0.0541694351 +0.0542565435 +0.0543411262 +0.0544231497 +0.0545025915 +0.0545794293 +0.0546536334 +0.0547251813 +0.0547940433 +0.054860197 +0.0549236163 +0.0549842753 +0.0550421439 +0.0550972037 +0.0551494248 +0.0551987812 +0.0552452467 +0.0552887954 +0.0553294048 +0.0553670451 +0.055401694 +0.055433318 +0.0554619022 +0.0554874092 +0.0555098206 +0.0555291101 +0.0555452481 +0.0555582121 +0.0555679761 +0.0555745102 +0.0555777885 +0.0555777922 +0.0555744842 +0.0555678494 +0.0555578545 +0.055544477 +0.0555276908 +0.0555074662 +0.0554837845 +0.0554566123 +0.055425927 +0.0553917028 +0.0553539097 +0.0553125292 +0.0552675314 +0.0552188866 +0.0551665761 +0.05511057 +0.0550508425 +0.054987371 +0.0549201258 +0.0548490807 +0.0547742136 +0.0546954945 +0.0546129048 +0.054526411 +0.054435987 +0.054341618 +0.0542432666 +0.0541409105 +0.0540345274 +0.0539240912 +0.0538095757 +0.0536909513 +0.0535681993 +0.0534412898 +0.0533102006 +0.0531749018 +0.0530353747 +0.052891586 +0.0527435206 +0.052591145 +0.052434437 +0.0522733741 +0.0521079265 +0.0519380756 +0.0517637916 +0.0515850484 +0.0514018275 +0.0512140989 +0.0510218404 +0.0508250259 +0.050623633 +0.0504176356 +0.0502070077 +0.0499917306 +0.0497717746 +0.0495471209 +0.0493177399 +0.0490836091 +0.0488447063 +0.048601009 +0.0483524874 +0.0480991229 +0.0478408895 +0.0475777648 +0.0473097265 +0.0470367484 +0.0467588082 +0.0464758836 +0.0461879484 +0.0458949842 +0.0455969647 +0.0452938676 +0.0449856706 +0.0446723476 +0.0443538837 +0.0440302491 +0.0437014215 +0.0433673859 +0.0430281125 +0.042683579 +0.0423337705 +0.0419786572 +0.0416182205 +0.041252438 +0.040881291 +0.0405047536 +0.040122807 +0.0397354253 +0.0393425934 +0.0389442891 +0.0385404862 +0.03813117 +0.0377163179 +0.037295904 +0.0368699133 +0.0364383273 +0.036001116 +0.0355582722 +0.0351097621 +0.0346555784 +0.0341956913 +0.0337300859 +0.0332587436 +0.0327816382 +0.0322987586 +0.0318100825 +0.0313155875 +0.0308152568 +0.0303090736 +0.0297970176 +0.0292790681 +0.0287552103 +0.0282254238 +0.0276896898 +0.0271479897 +0.0266003087 +0.0260466263 +0.0254869256 +0.0249211881 +0.0243493989 +0.0237715393 +0.0231875908 +0.0225975383 +0.0220013652 +0.0213990528 +0.0207905862 +0.0201759487 +0.0195551235 +0.0189280957 +0.0182948485 +0.0176553652 +0.0170096327 +0.0163576342 +0.0156993549 +0.015034779 +0.0143638914 +0.0136866784 +0.0130031239 +0.0123132141 +0.011616935 +0.0109142726 +0.010205212 +0.00948974025 +0.00876784232 +0.00803950708 +0.00730471872 +0.00656346558 +0.00581573462 +0.00506151281 +0.00430078711 +0.00353354588 +0.00275977631 +0.00197946653 +0.00119260431 +0.000399178156 +0.000400823483 +0.00120741199 +0.00202059862 +0.00284039439 +0.00366680999 +0.00449985638 +0.00533954334 +0.00618588226 +0.007038882 +0.00789855327 +0.00876490586 +0.00963794813 +0.0105176913 +0.0114041427 +0.0122973127 +0.0131972088 +0.0141038401 +0.0150172152 +0.0159373432 +0.016864229 +0.0177978836 +0.0187383126 +0.0196855236 +0.0206395257 +0.0216003228 +0.0225679241 +0.0235423353 +0.0245235637 +0.0255116131 +0.026506491 +0.0275082048 +0.0285167564 +0.029532155 +0.0305544026 +0.0315835029 +0.0326194689 +0.0336622931 +0.0347119905 +0.0357685573 +0.0368320011 +0.0379023291 +0.0389795378 +0.0400636308 +0.0411546193 +0.0422524959 +0.043357268 +0.0444689393 +0.0455875099 +0.0467129834 +0.0478453599 +0.0489846431 +0.0501308292 +0.051283922 +0.0524439253 +0.0536108389 +0.0547846593 +0.0559653901 +0.0571530275 +0.0583475754 +0.0595490336 +0.0607573949 +0.0619726665 +0.0631948411 +0.0644239262 +0.0656599104 +0.0669027939 +0.0681525692 +0.0694092512 +0.070672825 +0.0719432831 +0.0732206404 +0.0745048746 +0.0757959858 +0.0770939812 +0.0783988535 +0.0797105879 +0.0810291916 +0.0823546499 +0.0836869702 +0.0850261375 +0.086372152 +0.087725006 +0.0890846923 +0.0904512033 +0.091824539 +0.0932046846 +0.0945916474 +0.0959854051 +0.0973859578 +0.098793298 +0.100207418 +0.101628304 +0.103055961 +0.104490362 +0.105931513 +0.107379407 +0.108834021 +0.110295355 +0.111763395 +0.113238141 +0.11471957 +0.116207682 +0.117702454 +0.119203888 +0.120711967 +0.122226685 +0.123748019 +0.12527597 +0.126810521 +0.128351659 +0.129899368 +0.131453633 +0.133014455 +0.134581819 +0.136155695 +0.137736082 +0.139322966 +0.140916333 +0.142516166 +0.144122452 +0.145735174 +0.147354305 +0.148979858 +0.150611788 +0.152250096 +0.153894767 +0.155545786 +0.157203123 +0.158866763 +0.160536706 +0.162212923 +0.163895383 +0.165584102 +0.167279035 +0.168980166 +0.170687482 +0.172400966 +0.17412059 +0.175846338 +0.177578211 +0.179316163 +0.18106018 +0.182810247 +0.184566349 +0.186328441 +0.188096538 +0.189870596 +0.191650584 +0.193436503 +0.195228323 +0.197026014 +0.198829576 +0.200638965 +0.20245415 +0.204275131 +0.206101879 +0.207934365 +0.209772572 +0.211616471 +0.213466033 +0.215321243 +0.21718207 +0.219048485 +0.220920473 +0.222798005 +0.224681064 +0.226569608 +0.22846362 +0.230363071 +0.232267931 +0.234178185 +0.236093804 +0.238014743 +0.239940986 +0.241872519 +0.243809298 +0.245751292 +0.247698486 +0.249650836 +0.251608312 +0.253570914 +0.255538583 +0.257511318 +0.259489059 +0.261471778 +0.263459474 +0.265452087 +0.267449588 +0.269451976 +0.271459162 +0.273471206 +0.275487989 +0.277509511 +0.279535741 +0.28156665 +0.283602208 +0.285642385 +0.287687153 +0.28973645 +0.291790247 +0.293848544 +0.295911282 +0.297978431 +0.300049961 +0.302125812 +0.304206014 +0.306290448 +0.308379143 +0.310472071 +0.312569141 +0.314670324 +0.31677565 +0.318884999 +0.3209984 +0.323115796 +0.325237125 +0.327362388 +0.329491526 +0.331624508 +0.333761305 +0.335901856 +0.338046163 +0.340194136 +0.342345774 +0.344501019 +0.346659869 +0.348822236 +0.35098812 +0.353157461 +0.355330229 +0.357506365 +0.359685868 +0.36186868 +0.364054739 +0.366244018 +0.368436515 +0.370632112 +0.372830838 +0.375032634 +0.377237439 +0.379445255 +0.381655961 +0.383869618 +0.386086106 +0.388305396 +0.390527487 +0.39275229 +0.394979775 +0.397209942 +0.399442673 +0.401677996 +0.403915823 +0.406156123 +0.408398867 +0.410643995 +0.412891448 +0.415141225 +0.417393267 +0.419647515 +0.421903908 +0.424162447 +0.426423073 +0.428685725 +0.430950373 +0.433216959 +0.435485452 +0.437755793 +0.440027952 +0.442301899 +0.444577545 +0.44685486 +0.449133813 +0.451414347 +0.4536964 +0.455979943 +0.458264947 +0.460551351 +0.462839097 +0.465128154 +0.467418462 +0.469709963 +0.472002655 +0.474296451 +0.476591319 +0.478887171 +0.481184036 +0.483481824 +0.485780478 +0.488079965 +0.490380228 +0.492681205 +0.494982898 +0.497285217 +0.499588132 +0.501891553 +0.504195511 +0.506499887 +0.508804679 +0.511109769 +0.513415158 +0.515720844 +0.51802665 +0.520332694 +0.522638738 +0.524944901 +0.527251065 +0.529557109 +0.531863093 +0.534168959 +0.536474586 +0.538779974 +0.541085005 +0.543389738 +0.545694053 +0.547997952 +0.550301313 +0.552604139 +0.554906368 +0.557207882 +0.559508741 +0.561808825 +0.564108133 +0.566406548 +0.568704069 +0.571000636 +0.573296189 +0.57559067 +0.577884078 +0.580176294 +0.582467258 +0.58475703 +0.587045431 +0.589332461 +0.591618121 +0.59390223 +0.596184909 +0.598465919 +0.60074538 +0.603023112 +0.605299115 +0.60757339 +0.609845757 +0.612116277 +0.61438489 +0.616651475 +0.618916035 +0.621178448 +0.623438776 +0.625696898 +0.627952754 +0.630206347 +0.632457554 +0.634706378 +0.636952758 +0.639196575 +0.641437888 +0.643676579 +0.645912588 +0.648145914 +0.650376439 +0.652604163 +0.654828966 +0.657050908 +0.659269869 +0.661485791 +0.663698614 +0.665908337 +0.668114901 +0.670318186 +0.672518194 +0.674714863 +0.676908135 +0.67909801 +0.681284308 +0.68346715 +0.685646355 +0.687821925 +0.689993799 +0.692161858 +0.694326162 +0.696486652 +0.698643208 +0.70079577 +0.702944338 +0.705088854 +0.707229316 +0.709365547 +0.711497545 +0.713625312 +0.715748787 +0.717867851 +0.719982564 +0.722092748 +0.724198401 +0.726299524 +0.728395998 +0.730487823 +0.73257494 +0.734657228 +0.736734748 +0.73880738 +0.740875065 +0.742937803 +0.744995475 +0.74704814 +0.749095619 +0.751137972 +0.75317502 +0.755206883 +0.757233381 +0.759254515 +0.761270225 +0.763280451 +0.765285134 +0.767284274 +0.769277811 +0.771265686 +0.773247778 +0.775224149 +0.777194679 +0.779159367 +0.781118155 +0.783070982 +0.785017788 +0.786958516 +0.788893163 +0.790821612 +0.792743921 +0.794659972 +0.796569705 +0.79847306 +0.800370097 +0.802260637 +0.804144681 +0.806022227 +0.807893217 +0.809757531 +0.811615229 +0.813466132 +0.815310359 +0.817147672 +0.81897819 +0.820801795 +0.822618484 +0.824428141 +0.826230705 +0.828026235 +0.829814672 +0.831595898 +0.833369911 +0.835136652 +0.836896062 +0.83864814 +0.840392828 +0.842130005 +0.843859792 +0.845582008 +0.847296655 +0.849003673 +0.850703001 +0.85239464 +0.854078591 +0.855754673 +0.857423007 +0.859083414 +0.860735893 +0.862380445 +0.86401695 +0.865645468 +0.86726588 +0.868878126 +0.870482266 +0.87207818 +0.873665869 +0.875245214 +0.876816273 +0.878378928 +0.879933238 +0.881479025 +0.883016348 +0.884545147 +0.886065423 +0.887577057 +0.889080048 +0.890574336 +0.892059922 +0.893536747 +0.895004749 +0.896463931 +0.897914231 +0.89935565 +0.900788128 +0.902211607 +0.903626025 +0.905031443 +0.906427741 +0.90781486 +0.90919286 +0.910561681 +0.911921263 +0.913271546 +0.914612532 +0.915944159 +0.917266428 +0.91857928 +0.919882715 +0.921176612 +0.922461033 +0.923735917 +0.925001204 +0.926256895 +0.92750293 +0.928739309 +0.929965973 +0.931182861 +0.932390034 +0.933587372 +0.934774876 +0.935952485 +0.937120259 +0.938278079 +0.939425945 +0.940563798 +0.941691637 +0.942809463 +0.943917215 +0.945014834 +0.946102381 +0.947179675 +0.948246837 +0.949303806 +0.950350463 +0.951386869 +0.952413023 +0.953428805 +0.954434216 +0.955429316 +0.956413984 +0.957388163 +0.95835197 +0.959305227 +0.960247993 +0.96118027 +0.962101936 +0.963013053 +0.96391356 +0.964803457 +0.965682685 +0.966551244 +0.967409134 +0.968256235 +0.969092667 +0.969918311 +0.970733166 +0.971537173 +0.972330391 +0.973112762 +0.973884284 +0.97464484 +0.975394547 +0.976133347 +0.976861119 +0.977577984 +0.978283823 +0.978978693 +0.979662538 +0.980335355 +0.980997086 +0.98164773 +0.982287288 +0.982915699 +0.983533025 +0.984139204 +0.984734237 +0.985318065 +0.985890687 +0.986452162 +0.987002373 +0.987541318 +0.988069057 +0.988585532 +0.989090741 +0.989584625 +0.990067184 +0.990538478 +0.990998447 +0.991447031 +0.991884291 +0.992310166 +0.992724657 +0.993127823 +0.993519545 +0.993899822 +0.994268715 +0.994626224 +0.994972229 +0.99530679 +0.995629966 +0.995941579 +0.996241808 +0.996530473 +0.996807694 +0.997073472 +0.997327685 +0.997570395 +0.997801602 +0.998021245 +0.998229384 +0.99842602 +0.998611093 +0.998784602 +0.998946607 +0.999097049 +0.999235928 +0.999363244 +0.999478996 +0.999583185 +0.99967581 +0.999756813 +0.999826312 +0.999884188 +0.999930501 +0.99996525 +0.999988437 +1 +1 +0.999988437 +0.99996525 +0.999930501 +0.999884188 +0.999826312 +0.999756813 +0.99967581 +0.999583185 +0.999478996 +0.999363244 +0.999235928 +0.999097049 +0.998946607 +0.998784602 +0.998611093 +0.99842602 +0.998229384 +0.998021245 +0.997801602 +0.997570395 +0.997327685 +0.997073472 +0.996807694 +0.996530473 +0.996241808 +0.995941579 +0.995629966 +0.99530679 +0.994972229 +0.994626224 +0.994268715 +0.993899822 +0.993519545 +0.993127823 +0.992724657 +0.992310166 +0.991884291 +0.991447031 +0.990998447 +0.990538478 +0.990067184 +0.989584625 +0.989090741 +0.988585532 +0.988069057 +0.987541318 +0.987002373 +0.986452162 +0.985890687 +0.985318065 +0.984734237 +0.984139204 +0.983533025 +0.982915699 +0.982287288 +0.98164773 +0.980997086 +0.980335355 +0.979662538 +0.978978693 +0.978283823 +0.977577984 +0.976861119 +0.976133347 +0.975394547 +0.97464484 +0.973884284 +0.973112762 +0.972330391 +0.971537173 +0.970733166 +0.969918311 +0.969092667 +0.968256235 +0.967409134 +0.966551244 +0.965682685 +0.964803457 +0.96391356 +0.963013053 +0.962101936 +0.96118027 +0.960247993 +0.959305227 +0.95835197 +0.957388163 +0.956413984 +0.955429316 +0.954434216 +0.953428805 +0.952413023 +0.951386869 +0.950350463 +0.949303806 +0.948246837 +0.947179675 +0.946102381 +0.945014834 +0.943917215 +0.942809463 +0.941691637 +0.940563798 +0.939425945 +0.938278079 +0.937120259 +0.935952485 +0.934774876 +0.933587372 +0.932390034 +0.931182861 +0.929965973 +0.928739309 +0.92750293 +0.926256895 +0.925001204 +0.923735917 +0.922461033 +0.921176612 +0.919882715 +0.91857928 +0.917266428 +0.915944159 +0.914612532 +0.913271546 +0.911921263 +0.910561681 +0.90919286 +0.90781486 +0.906427741 +0.905031443 +0.903626025 +0.902211607 +0.900788128 +0.89935565 +0.897914231 +0.896463931 +0.895004749 +0.893536747 +0.892059922 +0.890574336 +0.889080048 +0.887577057 +0.886065423 +0.884545147 +0.883016348 +0.881479025 +0.879933238 +0.878378928 +0.876816273 +0.875245214 +0.873665869 +0.87207818 +0.870482266 +0.868878126 +0.86726588 +0.865645468 +0.86401695 +0.862380445 +0.860735893 +0.859083414 +0.857423007 +0.855754673 +0.854078591 +0.85239464 +0.850703001 +0.849003673 +0.847296655 +0.845582008 +0.843859792 +0.842130005 +0.840392828 +0.83864814 +0.836896062 +0.835136652 +0.833369911 +0.831595898 +0.829814672 +0.828026235 +0.826230705 +0.824428141 +0.822618484 +0.820801795 +0.81897819 +0.817147672 +0.815310359 +0.813466132 +0.811615229 +0.809757531 +0.807893217 +0.806022227 +0.804144681 +0.802260637 +0.800370097 +0.79847306 +0.796569705 +0.794659972 +0.792743921 +0.790821612 +0.788893163 +0.786958516 +0.785017788 +0.783070982 +0.781118155 +0.779159367 +0.777194679 +0.775224149 +0.773247778 +0.771265686 +0.769277811 +0.767284274 +0.765285134 +0.763280451 +0.761270225 +0.759254515 +0.757233381 +0.755206883 +0.75317502 +0.751137972 +0.749095619 +0.74704814 +0.744995475 +0.742937803 +0.740875065 +0.73880738 +0.736734748 +0.734657228 +0.73257494 +0.730487823 +0.728395998 +0.726299524 +0.724198401 +0.722092748 +0.719982564 +0.717867851 +0.715748787 +0.713625312 +0.711497545 +0.709365547 +0.707229316 +0.705088854 +0.702944338 +0.70079577 +0.698643208 +0.696486652 +0.694326162 +0.692161858 +0.689993799 +0.687821925 +0.685646355 +0.68346715 +0.681284308 +0.67909801 +0.676908135 +0.674714863 +0.672518194 +0.670318186 +0.668114901 +0.665908337 +0.663698614 +0.661485791 +0.659269869 +0.657050908 +0.654828966 +0.652604163 +0.650376439 +0.648145914 +0.645912588 +0.643676579 +0.641437888 +0.639196575 +0.636952758 +0.634706378 +0.632457554 +0.630206347 +0.627952754 +0.625696898 +0.623438776 +0.621178448 +0.618916035 +0.616651475 +0.61438489 +0.612116277 +0.609845757 +0.60757339 +0.605299115 +0.603023112 +0.60074538 +0.598465919 +0.596184909 +0.59390223 +0.591618121 +0.589332461 +0.587045431 +0.58475703 +0.582467258 +0.580176294 +0.577884078 +0.57559067 +0.573296189 +0.571000636 +0.568704069 +0.566406548 +0.564108133 +0.561808825 +0.559508741 +0.557207882 +0.554906368 +0.552604139 +0.550301313 +0.547997952 +0.545694053 +0.543389738 +0.541085005 +0.538779974 +0.536474586 +0.534168959 +0.531863093 +0.529557109 +0.527251065 +0.524944901 +0.522638738 +0.520332694 +0.51802665 +0.515720844 +0.513415158 +0.511109769 +0.508804679 +0.506499887 +0.504195511 +0.501891553 +0.499588132 +0.497285217 +0.494982898 +0.492681205 +0.490380228 +0.488079965 +0.485780478 +0.483481824 +0.481184036 +0.478887171 +0.476591319 +0.474296451 +0.472002655 +0.469709963 +0.467418462 +0.465128154 +0.462839097 +0.460551351 +0.458264947 +0.455979943 +0.4536964 +0.451414347 +0.449133813 +0.44685486 +0.444577545 +0.442301899 +0.440027952 +0.437755793 +0.435485452 +0.433216959 +0.430950373 +0.428685725 +0.426423073 +0.424162447 +0.421903908 +0.419647515 +0.417393267 +0.415141225 +0.412891448 +0.410643995 +0.408398867 +0.406156123 +0.403915823 +0.401677996 +0.399442673 +0.397209942 +0.394979775 +0.39275229 +0.390527487 +0.388305396 +0.386086106 +0.383869618 +0.381655961 +0.379445255 +0.377237439 +0.375032634 +0.372830838 +0.370632112 +0.368436515 +0.366244018 +0.364054739 +0.36186868 +0.359685868 +0.357506365 +0.355330229 +0.353157461 +0.35098812 +0.348822236 +0.346659869 +0.344501019 +0.342345774 +0.340194136 +0.338046163 +0.335901856 +0.333761305 +0.331624508 +0.329491526 +0.327362388 +0.325237125 +0.323115796 +0.3209984 +0.318884999 +0.31677565 +0.314670324 +0.312569141 +0.310472071 +0.308379143 +0.306290448 +0.304206014 +0.302125812 +0.300049961 +0.297978431 +0.295911282 +0.293848544 +0.291790247 +0.28973645 +0.287687153 +0.285642385 +0.283602208 +0.28156665 +0.279535741 +0.277509511 +0.275487989 +0.273471206 +0.271459162 +0.269451976 +0.267449588 +0.265452087 +0.263459474 +0.261471778 +0.259489059 +0.257511318 +0.255538583 +0.253570914 +0.251608312 +0.249650836 +0.247698486 +0.245751292 +0.243809298 +0.241872519 +0.239940986 +0.238014743 +0.236093804 +0.234178185 +0.232267931 +0.230363071 +0.22846362 +0.226569608 +0.224681064 +0.222798005 +0.220920473 +0.219048485 +0.21718207 +0.215321243 +0.213466033 +0.211616471 +0.209772572 +0.207934365 +0.206101879 +0.204275131 +0.20245415 +0.200638965 +0.198829576 +0.197026014 +0.195228323 +0.193436503 +0.191650584 +0.189870596 +0.188096538 +0.186328441 +0.184566349 +0.182810247 +0.18106018 +0.179316163 +0.177578211 +0.175846338 +0.17412059 +0.172400966 +0.170687482 +0.168980166 +0.167279035 +0.165584102 +0.163895383 +0.162212923 +0.160536706 +0.158866763 +0.157203123 +0.155545786 +0.153894767 +0.152250096 +0.150611788 +0.148979858 +0.147354305 +0.145735174 +0.144122452 +0.142516166 +0.140916333 +0.139322966 +0.137736082 +0.136155695 +0.134581819 +0.133014455 +0.131453633 +0.129899368 +0.128351659 +0.126810521 +0.12527597 +0.123748019 +0.122226685 +0.120711967 +0.119203888 +0.117702454 +0.116207682 +0.11471957 +0.113238141 +0.111763395 +0.110295355 +0.108834021 +0.107379407 +0.105931513 +0.104490362 +0.103055961 +0.101628304 +0.100207418 +0.098793298 +0.0973859578 +0.0959854051 +0.0945916474 +0.0932046846 +0.091824539 +0.0904512033 +0.0890846923 +0.087725006 +0.086372152 +0.0850261375 +0.0836869702 +0.0823546499 +0.0810291916 +0.0797105879 +0.0783988535 +0.0770939812 +0.0757959858 +0.0745048746 +0.0732206404 +0.0719432831 +0.070672825 +0.0694092512 +0.0681525692 +0.0669027939 +0.0656599104 +0.0644239262 +0.0631948411 +0.0619726665 +0.0607573949 +0.0595490336 +0.0583475754 +0.0571530275 +0.0559653901 +0.0547846593 +0.0536108389 +0.0524439253 +0.051283922 +0.0501308292 +0.0489846431 +0.0478453599 +0.0467129834 +0.0455875099 +0.0444689393 +0.043357268 +0.0422524959 +0.0411546193 +0.0400636308 +0.0389795378 +0.0379023291 +0.0368320011 +0.0357685573 +0.0347119905 +0.0336622931 +0.0326194689 +0.0315835029 +0.0305544026 +0.029532155 +0.0285167564 +0.0275082048 +0.026506491 +0.0255116131 +0.0245235637 +0.0235423353 +0.0225679241 +0.0216003228 +0.0206395257 +0.0196855236 +0.0187383126 +0.0177978836 +0.016864229 +0.0159373432 +0.0150172152 +0.0141038401 +0.0131972088 +0.0122973127 +0.0114041427 +0.0105176913 +0.00963794813 +0.00876490586 +0.00789855327 +0.007038882 +0.00618588226 +0.00533954334 +0.00449985638 +0.00366680999 +0.00284039439 +0.00202059862 +0.00120741199 +0.000400823483 +0.000399178156 +0.00119260431 +0.00197946653 +0.00275977631 +0.00353354588 +0.00430078711 +0.00506151281 +0.00581573462 +0.00656346558 +0.00730471872 +0.00803950708 +0.00876784232 +0.00948974025 +0.010205212 +0.0109142726 +0.011616935 +0.0123132141 +0.0130031239 +0.0136866784 +0.0143638914 +0.015034779 +0.0156993549 +0.0163576342 +0.0170096327 +0.0176553652 +0.0182948485 +0.0189280957 +0.0195551235 +0.0201759487 +0.0207905862 +0.0213990528 +0.0220013652 +0.0225975383 +0.0231875908 +0.0237715393 +0.0243493989 +0.0249211881 +0.0254869256 +0.0260466263 +0.0266003087 +0.0271479897 +0.0276896898 +0.0282254238 +0.0287552103 +0.0292790681 +0.0297970176 +0.0303090736 +0.0308152568 +0.0313155875 +0.0318100825 +0.0322987586 +0.0327816382 +0.0332587436 +0.0337300859 +0.0341956913 +0.0346555784 +0.0351097621 +0.0355582722 +0.036001116 +0.0364383273 +0.0368699133 +0.037295904 +0.0377163179 +0.03813117 +0.0385404862 +0.0389442891 +0.0393425934 +0.0397354253 +0.040122807 +0.0405047536 +0.040881291 +0.041252438 +0.0416182205 +0.0419786572 +0.0423337705 +0.042683579 +0.0430281125 +0.0433673859 +0.0437014215 +0.0440302491 +0.0443538837 +0.0446723476 +0.0449856706 +0.0452938676 +0.0455969647 +0.0458949842 +0.0461879484 +0.0464758836 +0.0467588082 +0.0470367484 +0.0473097265 +0.0475777648 +0.0478408895 +0.0480991229 +0.0483524874 +0.048601009 +0.0488447063 +0.0490836091 +0.0493177399 +0.0495471209 +0.0497717746 +0.0499917306 +0.0502070077 +0.0504176356 +0.050623633 +0.0508250259 +0.0510218404 +0.0512140989 +0.0514018275 +0.0515850484 +0.0517637916 +0.0519380756 +0.0521079265 +0.0522733741 +0.052434437 +0.052591145 +0.0527435206 +0.052891586 +0.0530353747 +0.0531749018 +0.0533102006 +0.0534412898 +0.0535681993 +0.0536909513 +0.0538095757 +0.0539240912 +0.0540345274 +0.0541409105 +0.0542432666 +0.054341618 +0.054435987 +0.054526411 +0.0546129048 +0.0546954945 +0.0547742136 +0.0548490807 +0.0549201258 +0.054987371 +0.0550508425 +0.05511057 +0.0551665761 +0.0552188866 +0.0552675314 +0.0553125292 +0.0553539097 +0.0553917028 +0.055425927 +0.0554566123 +0.0554837845 +0.0555074662 +0.0555276908 +0.055544477 +0.0555578545 +0.0555678494 +0.0555744842 +0.0555777922 +0.0555777885 +0.0555745102 +0.0555679761 +0.0555582121 +0.0555452481 +0.0555291101 +0.0555098206 +0.0554874092 +0.0554619022 +0.055433318 +0.055401694 +0.0553670451 +0.0553294048 +0.0552887954 +0.0552452467 +0.0551987812 +0.0551494248 +0.0550972037 +0.0550421439 +0.0549842753 +0.0549236163 +0.054860197 +0.0547940433 +0.0547251813 +0.0546536334 +0.0545794293 +0.0545025915 +0.0544231497 +0.0543411262 +0.0542565435 +0.0541694351 +0.0540798232 +0.0539877303 +0.0538931824 +0.0537962094 +0.0536968336 +0.053595081 +0.0534909777 +0.0533845462 +0.0532758124 +0.0531648062 +0.0530515462 +0.0529360622 +0.0528183766 +0.0526985154 +0.0525765046 +0.0524523668 +0.0523261279 +0.052197814 +0.0520674475 +0.0519350581 +0.0518006645 +0.0516642928 +0.0515259728 +0.0513857193 +0.051243566 +0.0510995351 +0.0509536453 +0.05080593 +0.0506564043 +0.050505098 +0.050352037 +0.05019724 +0.0500407331 +0.0498825386 +0.0497226827 +0.0495611914 +0.0493980832 +0.0492333882 +0.0490671247 +0.0488993153 +0.048729986 +0.0485591628 +0.0483868644 +0.0482131168 +0.0480379425 +0.0478613637 +0.0476834066 +0.0475040898 +0.0473234393 +0.0471414775 +0.046958223 +0.0467737056 +0.046587944 +0.0464009568 +0.0462127738 +0.0460234135 +0.0458329022 +0.0456412546 +0.0454484969 +0.0452546515 +0.0450597405 +0.0448637865 +0.0446668081 +0.0444688275 +0.044269871 +0.0440699533 +0.0438691005 +0.0436673313 +0.0434646681 +0.0432611331 +0.0430567451 +0.0428515263 +0.0426454991 +0.0424386822 +0.0422310941 +0.042022761 +0.0418136977 +0.0416039303 +0.0413934737 +0.0411823504 +0.0409705825 +0.0407581851 +0.0405451804 +0.0403315909 +0.0401174314 +0.0399027281 +0.039687492 +0.0394717492 +0.0392555185 +0.0390388146 +0.03882166 +0.0386040732 +0.0383860692 +0.0381676741 +0.0379489027 +0.0377297737 +0.0375103019 +0.0372905135 +0.0370704196 +0.0368500426 +0.0366293974 +0.0364085026 +0.0361873806 +0.0359660424 +0.0357445106 +0.0355227962 +0.0353009254 +0.0350789092 +0.0348567665 +0.0346345119 +0.034412168 +0.0341897458 +0.033967264 +0.0337447412 +0.0335221887 +0.0332996286 +0.0330770761 +0.0328545459 +0.0326320492 +0.0324096121 +0.0321872421 +0.0319649577 +0.031742774 +0.0315207057 +0.0312987715 +0.0310769808 +0.0308553539 +0.0306339022 +0.0304126423 +0.0301915891 +0.0299707558 +0.029750159 +0.02952981 +0.0293097254 +0.0290899165 +0.0288704019 +0.0286511909 +0.0284323003 +0.0282137413 +0.0279955287 +0.0277776755 +0.027560195 +0.0273430999 +0.0271264035 +0.0269101188 +0.0266942587 +0.0264788345 +0.026263861 +0.0260493495 +0.025835311 +0.0256217588 +0.0254087057 +0.0251961611 +0.0249841381 +0.0247726496 +0.0245617051 +0.0243513174 +0.0241414979 +0.0239322558 +0.0237236023 +0.0235155504 +0.0233081095 +0.0231012907 +0.0228951052 +0.0226895604 +0.0224846695 +0.0222804416 +0.0220768861 +0.0218740143 +0.0216718335 +0.0214703567 +0.0212695915 +0.0210695472 +0.0208702348 +0.0206716601 +0.0204738341 +0.0202767663 +0.020080464 +0.0198849384 +0.0196901951 +0.0194962434 +0.0193030909 +0.0191107467 +0.0189192202 +0.018728517 +0.0185386464 +0.018349614 +0.0181614291 +0.0179740991 +0.0177876297 +0.0176020302 +0.0174173061 +0.0172334649 +0.017050514 +0.0168684591 +0.0166873056 +0.0165070631 +0.016327735 +0.0161493309 +0.0159718525 +0.0157953072 +0.0156197026 +0.0154450433 +0.0152713349 +0.015098582 +0.0149267912 +0.0147559671 +0.0145861153 +0.0144172395 +0.0142493462 +0.0140824392 +0.0139165232 +0.0137516037 +0.0135876834 +0.0134247672 +0.0132628595 +0.0131019652 +0.012942086 +0.0127832284 +0.0126253935 +0.0124685867 +0.0123128109 +0.0121580688 +0.0120043643 +0.011851701 +0.0117000807 +0.0115495073 +0.0113999834 +0.0112515111 +0.0111040929 +0.0109577319 +0.0108124306 +0.0106681902 +0.0105250133 +0.0103829028 +0.0102418587 +0.0101018846 +0.00996298064 +0.00982514955 +0.00968839228 +0.00955271069 +0.00941810478 +0.0092845764 +0.00915212743 +0.00902075786 +0.0088904677 +0.0087612588 +0.00863313209 +0.00850608759 +0.00838012528 +0.00825524516 +0.00813144911 +0.00800873525 +0.00788710453 +0.00776655646 +0.00764709152 +0.00752870878 +0.00741140777 +0.00729518849 +0.00718004955 +0.00706599094 +0.00695301173 +0.00684111053 +0.0067302864 +0.00662053889 +0.00651186612 +0.00640426716 +0.00629774015 +0.00619228417 +0.00608789735 +0.00598457782 +0.00588232419 +0.00578113459 +0.00568100717 +0.00558193913 +0.00548392907 +0.00538697466 +0.00529107312 +0.00519622304 +0.00510242069 +0.00500966422 +0.0049179513 +0.0048272782 +0.00473764306 +0.00464904215 +0.00456147315 +0.00447493279 +0.00438941782 +0.00430492451 +0.00422145054 +0.00413899124 +0.00405754428 +0.00397710595 +0.00389767182 +0.00381923886 +0.00374180288 +0.00366536016 +0.00358990673 +0.00351543864 +0.0034419517 +0.00336944172 +0.00329790427 +0.0032273354 +0.00315773045 +0.00308908476 +0.00302139437 +0.00295465393 +0.00288885948 +0.00282400567 +0.00276008784 +0.00269710133 +0.00263504102 +0.00257390179 +0.00251367874 +0.00245436653 +0.00239596027 +0.00233845413 +0.00228184322 +0.00222612172 +0.00217128475 +0.00211732625 +0.00206424086 +0.00201202277 +0.00196066638 +0.00191016612 +0.00186051591 +0.00181170984 +0.00176374207 +0.00171660667 +0.00167029747 +0.00162480841 +0.00158013334 +0.00153626606 +0.00149320031 +0.00145092979 +0.0014094481 +0.00136874896 +0.00132882583 +0.0012896721 +0.00125128136 +0.00121364696 +0.00117676228 +0.00114062068 +0.00110521528 +0.00107053947 +0.00103658624 +0.00100334897 +0.000970820547 +0.00093899417 +0.000907862792 +0.00087741937 +0.00084765692 +0.00081856834 +0.000790146412 +0.000762384036 +0.00073527405 +0.000708809064 +0.000682981976 +0.000657785393 +0.000633211923 +0.000609254348 +0.00058590516 +0.000563156907 +0.000541002199 +0.000519433524 +0.000498443376 +0.000478024216 +0.000458168419 +0.000438868476 +0.000420116674 +0.000401905447 +0.000384227082 +0.000367073924 +0.000350438233 +0.000334312266 +0.000318688311 +0.00030355854 +0.000288915209 +0.000274750491 +0.000261056557 +0.000247825548 +0.000235049607 +0.00022272089 +0.000210831466 +0.000199373462 +0.000188338934 +0.000177719965 +0.00016750861 +0.000157696923 +0.000148276929 +0.00013924067 +0.000130580142 +0.000122287383 +0.000114354392 +0.00010677315 +9.95356604e-05 +9.26339053e-05 +8.60598666e-05 +7.98055262e-05 +7.38628514e-05 +6.82238242e-05 +6.28804119e-05 +5.7824589e-05 +5.30483194e-05 +4.85435739e-05 +4.43023309e-05 +4.03165614e-05 +3.65782398e-05 +3.30793482e-05 +2.98118757e-05 +2.67678042e-05 +2.3939132e-05 +2.1317861e-05 +1.88959948e-05 +1.66655518e-05 +1.46185548e-05 +1.27470357e-05 +1.10430365e-05 +9.49860896e-06 +8.10581696e-06 +6.85673467e-06 +5.74344904e-06 +4.75806064e-06 +3.89268234e-06 +3.13944247e-06 +2.49048344e-06 +1.93796427e-06 +1.47405899e-06 +1.0909597e-06 +7.80875439e-07 +5.3603361e-07 +3.48680544e-07 +2.11082039e-07 +1.15524074e-07 +5.43134e-08 +1.97782093e-08 +4.26875246e-09 +1.57976909e-10 + +shape_id 4 +num_samples 2500 +0.5 +0 +0 +622 +-0.5 +0 +0 +1247 +0.5 +0 +0 +622 + +shape_id 5 +num_samples 2 +1 +1 + +shape_id 6 +num_samples 2 +0 +270 + +shape_id 7 +num_samples 4 +1 +0.223484844 +0.223484844 +1 + +shape_id 8 +num_samples 4 +0 +25 +330 +355 + +shape_id 9 +num_samples 2000 +3.08579551e-10 +8.33986835e-09 +3.86480643e-08 +1.06152001e-07 +2.25824948e-07 +4.12692685e-07 +6.8183158e-07 +1.04836658e-06 +1.52746941e-06 +2.13435624e-06 +2.88428623e-06 +3.79255926e-06 +4.87451371e-06 +6.14552437e-06 +7.62100171e-06 +9.31638806e-06 +1.12471562e-05 +1.34288075e-05 +1.58768707e-05 +1.86068992e-05 +2.1634467e-05 +2.49751702e-05 +2.86446211e-05 +3.26584523e-05 +3.70322996e-05 +4.17818301e-05 +4.69226979e-05 +5.24705829e-05 +5.84411609e-05 +6.48501155e-05 +7.17131261e-05 +7.90458726e-05 +8.68640418e-05 +9.51833063e-05 +0.000104019324 +0.000113387752 +0.000123304242 +0.00013378443 +0.000144843914 +0.000156498296 +0.000168763145 +0.000181654032 +0.000195186469 +0.000209375954 +0.000224237971 +0.000239787958 +0.000256041298 +0.000273013371 +0.00029071953 +0.000309175026 +0.000328395137 +0.000348395057 +0.000369189918 +0.000390794827 +0.000413224887 +0.000436495029 +0.000460620213 +0.000485615368 +0.00051149528 +0.000538274646 +0.000565968279 +0.000594590732 +0.000624156557 +0.000654680305 +0.000686176296 +0.000718658906 +0.000752142339 +0.000786640856 +0.000822168484 +0.000858739193 +0.000896367012 +0.000935065618 +0.000974848866 +0.00101573032 +0.00105772354 +0.00110084191 +0.00114509882 +0.00119050755 +0.00123708125 +0.00128483272 +0.001333775 +0.00138392102 +0.00143528322 +0.00148787431 +0.00154170673 +0.00159679272 +0.0016531446 +0.00171077426 +0.0017696938 +0.00182991498 +0.00189144944 +0.00195430894 +0.00201850454 +0.00208404753 +0.00215094932 +0.00221922086 +0.00228887261 +0.00235991552 +0.00243236031 +0.00250621722 +0.00258149626 +0.00265820767 +0.00273636146 +0.00281596719 +0.0028970344 +0.00297957286 +0.00306359166 +0.00314909988 +0.00323610636 +0.00332461973 +0.00341464882 +0.00350620202 +0.00359928748 +0.00369391311 +0.00379008683 +0.0038878161 +0.00398710882 +0.00408797199 +0.00419041282 +0.00429443829 +0.00440005446 +0.00450726878 +0.00461608684 +0.00472651515 +0.00483855978 +0.00495222583 +0.00506751891 +0.0051844446 +0.00530300755 +0.00542321336 +0.0055450662 +0.00566857029 +0.00579373026 +0.00592054939 +0.00604903232 +0.00617918232 +0.00631100265 +0.0064444961 +0.00657966593 +0.00671651447 +0.00685504451 +0.00699525792 +0.00713715702 +0.00728074275 +0.00742601743 +0.00757298153 +0.00772163644 +0.00787198357 +0.00802402198 +0.00817775261 +0.00833317544 +0.00849028956 +0.00864909589 +0.00880959257 +0.00897177961 +0.0091356542 +0.00930121634 +0.00946846325 +0.00963739306 +0.0098080039 +0.00998029299 +0.0101542575 +0.0103298938 +0.0105071999 +0.0106861703 +0.0108668031 +0.0110490927 +0.0112330345 +0.0114186257 +0.0116058588 +0.011794731 +0.011985234 +0.0121773649 +0.0123711154 +0.0125664808 +0.0127634527 +0.0129620265 +0.013162192 +0.0133639444 +0.0135672744 +0.0137721747 +0.0139786368 +0.0141866514 +0.0143962111 +0.0146073047 +0.0148199247 +0.01503406 +0.0152497003 +0.0154668363 +0.0156854577 +0.0159055516 +0.0161271077 +0.0163501147 +0.0165745616 +0.0168004334 +0.0170277227 +0.0172564108 +0.0174864884 +0.0177179426 +0.0179507565 +0.0181849208 +0.0184204169 +0.0186572317 +0.0188953523 +0.0191347618 +0.0193754435 +0.0196173843 +0.0198605675 +0.0201049764 +0.0203505941 +0.0205974039 +0.020845389 +0.0210945308 +0.0213448126 +0.0215962157 +0.0218487214 +0.0221023113 +0.0223569665 +0.0226126667 +0.0228693951 +0.0231271274 +0.023385847 +0.0236455314 +0.0239061601 +0.0241677128 +0.0244301669 +0.0246935021 +0.0249576941 +0.0252227206 +0.0254885629 +0.0257551931 +0.0260225888 +0.0262907296 +0.0265595894 +0.0268291421 +0.0270993672 +0.0273702368 +0.0276417267 +0.0279138125 +0.0281864684 +0.0284596663 +0.028733382 +0.0290075876 +0.029282257 +0.0295573641 +0.0298328791 +0.0301087741 +0.0303850248 +0.0306615978 +0.0309384689 +0.0312156063 +0.0314929821 +0.0317705646 +0.0320483297 +0.0323262401 +0.0326042697 +0.032882385 +0.0331605598 +0.0334387571 +0.0337169506 +0.0339951031 +0.0342731886 +0.0345511697 +0.0348290168 +0.0351066962 +0.0353841744 +0.0356614143 +0.0359383896 +0.0362150632 +0.0364913978 +0.0367673598 +0.0370429158 +0.0373180322 +0.0375926718 +0.037866801 +0.0381403789 +0.0384133719 +0.0386857465 +0.0389574654 +0.0392284878 +0.0394987762 +0.0397682972 +0.0400370136 +0.0403048843 +0.0405718721 +0.0408379398 +0.0411030464 +0.0413671546 +0.0416302234 +0.0418922156 +0.0421530902 +0.04241281 +0.0426713303 +0.0429286174 +0.0431846231 +0.04343931 +0.0436926372 +0.0439445637 +0.0441950485 +0.0444440469 +0.0446915217 +0.0449374281 +0.0451817214 +0.0454243645 +0.0456653088 +0.0459045134 +0.0461419411 +0.0463775396 +0.0466112681 +0.0468430854 +0.0470729433 +0.0473008044 +0.0475266166 +0.0477503389 +0.0479719304 +0.0481913388 +0.0484085232 +0.0486234352 +0.0488360338 +0.0490462705 +0.0492541008 +0.0494594797 +0.0496623553 +0.0498626865 +0.0500604287 +0.0502555296 +0.0504479446 +0.0506376289 +0.0508245341 +0.0510086119 +0.0511898138 +0.0513680987 +0.0515434109 +0.0517157055 +0.0518849343 +0.0520510525 +0.0522140078 +0.0523737557 +0.052530244 +0.0526834242 +0.0528332479 +0.0529796705 +0.0531226397 +0.0532621033 +0.0533980206 +0.0535303354 +0.0536589995 +0.0537839644 +0.0539051779 +0.0540225953 +0.0541361682 +0.054245837 +0.0543515608 +0.0544532873 +0.0545509681 +0.0546445474 +0.0547339804 +0.0548192151 +0.0549002029 +0.054976888 +0.0550492257 +0.0551171675 +0.0551806539 +0.0552396439 +0.0552940778 +0.0553439148 +0.0553890988 +0.0554295778 +0.0554653034 +0.0554962233 +0.0555222891 +0.0555434525 +0.0555596538 +0.0555708483 +0.0555769876 +0.0555780157 +0.0555738844 +0.0555645414 +0.0555499382 +0.0555300228 +0.055504743 +0.0554740503 +0.0554378927 +0.0553962179 +0.0553489812 +0.055296123 +0.0552376024 +0.0551733635 +0.0551033542 +0.0550275259 +0.0549458303 +0.0548582152 +0.0547646284 +0.0546650253 +0.0545593463 +0.0544475503 +0.0543295853 +0.054205399 +0.0540749393 +0.0539381616 +0.0537950136 +0.0536454469 +0.0534894131 +0.0533268563 +0.0531577356 +0.052981995 +0.0527995899 +0.0526104718 +0.0524145849 +0.0522118881 +0.0520023294 +0.0517858602 +0.0515624322 +0.0513320006 +0.0510945097 +0.0508499183 +0.0505981743 +0.0503392331 +0.0500730462 +0.049799569 +0.0495187454 +0.0492305383 +0.0489348955 +0.0486317724 +0.0483211204 +0.048002895 +0.0476770513 +0.0473435372 +0.0470023155 +0.0466533341 +0.0462965481 +0.0459319167 +0.0455593914 +0.0451789275 +0.0447904803 +0.0443940088 +0.0439894646 +0.0435768068 +0.0431559905 +0.0427269712 +0.0422897041 +0.0418441519 +0.04139027 +0.0409280136 +0.0404573381 +0.0399782099 +0.0394905806 +0.0389944091 +0.0384896547 +0.0379762799 +0.03745424 +0.0369234979 +0.0363840126 +0.035835743 +0.0352786481 +0.0347126909 +0.0341378301 +0.0335540324 +0.0329612568 +0.0323594622 +0.0317486152 +0.0311286729 +0.0304996055 +0.0298613701 +0.0292139333 +0.0285572596 +0.0278913099 +0.0272160508 +0.0265314486 +0.0258374661 +0.0251340698 +0.0244212244 +0.023698898 +0.0229670554 +0.0222256668 +0.0214746948 +0.0207141098 +0.0199438818 +0.0191639736 +0.0183743592 +0.0175750051 +0.0167658832 +0.0159469601 +0.0151182087 +0.0142795984 +0.0134311002 +0.0125726862 +0.0117043285 +0.0108259991 +0.00993767008 +0.0090393154 +0.00813090801 +0.00721242186 +0.00628383178 +0.00534511171 +0.0043962379 +0.00343718473 +0.00246792915 +0.00148844742 +0.000498716196 +0.000501286995 +0.00151158439 +0.00253219786 +0.00356314867 +0.00460445741 +0.00565614505 +0.00671823137 +0.00779073592 +0.00887367688 +0.00996707473 +0.0110709462 +0.0121853082 +0.01331018 +0.0144455768 +0.0155915162 +0.0167480111 +0.0179150812 +0.0190927368 +0.0202809945 +0.0214798693 +0.0226893723 +0.0239095166 +0.0251403153 +0.0263817795 +0.0276339222 +0.0288967527 +0.0301702805 +0.0314545184 +0.0327494703 +0.034055151 +0.0353715681 +0.0366987251 +0.0380366333 +0.0393852964 +0.0407447219 +0.0421149172 +0.043495886 +0.0448876321 +0.0462901592 +0.0477034748 +0.0491275787 +0.0505624712 +0.0520081595 +0.0534646399 +0.0549319163 +0.0564099886 +0.0578988567 +0.0593985207 +0.0609089769 +0.0624302253 +0.0639622584 +0.0655050874 +0.0670586899 +0.0686230734 +0.0701982304 +0.071784161 +0.0733808503 +0.0749882981 +0.0766064897 +0.0782354325 +0.0798751041 +0.0815254971 +0.0831866115 +0.0848584324 +0.0865409523 +0.0882341564 +0.0899380371 +0.0916525722 +0.0933777615 +0.0951135904 +0.0968600363 +0.0986170918 +0.100384742 +0.102162965 +0.103951752 +0.10575109 +0.107560948 +0.109381326 +0.111212187 +0.113053523 +0.114905313 +0.116767533 +0.11864017 +0.120523192 +0.122416586 +0.124320328 +0.126234397 +0.128158763 +0.130093396 +0.132038295 +0.133993402 +0.135958716 +0.137934208 +0.139919832 +0.14191559 +0.143921435 +0.145937324 +0.147963256 +0.149999186 +0.152045086 +0.154100925 +0.156166673 +0.158242285 +0.160327747 +0.162423015 +0.164528057 +0.16664283 +0.168767318 +0.170901462 +0.173045248 +0.175198615 +0.177361533 +0.179533973 +0.181715891 +0.183907256 +0.186108008 +0.188318118 +0.190537542 +0.192766249 +0.19500418 +0.197251305 +0.199507579 +0.201772943 +0.204047367 +0.206330791 +0.208623201 +0.210924506 +0.213234693 +0.215553716 +0.217881501 +0.220218003 +0.222563192 +0.224917009 +0.22727941 +0.229650334 +0.232029721 +0.234417543 +0.236813724 +0.23921822 +0.241630986 +0.244051963 +0.246481076 +0.248918295 +0.251363575 +0.253816813 +0.256277978 +0.258747011 +0.261223882 +0.263708502 +0.266200781 +0.268700719 +0.271208227 +0.273723245 +0.276245713 +0.278775573 +0.281312764 +0.283857226 +0.286408871 +0.288967669 +0.29153353 +0.294106394 +0.296686172 +0.299272865 +0.301866353 +0.304466575 +0.307073474 +0.309686989 +0.31230703 +0.314933538 +0.317566454 +0.320205688 +0.322851151 +0.325502843 +0.328160644 +0.330824465 +0.333494276 +0.336169958 +0.338851482 +0.341538757 +0.344231695 +0.346930265 +0.34963432 +0.352343827 +0.35505873 +0.357778937 +0.360504329 +0.363234878 +0.365970492 +0.368711084 +0.371456593 +0.37420693 +0.376961976 +0.379721731 +0.382486075 +0.38525489 +0.388028145 +0.390805751 +0.393587619 +0.39637363 +0.399163783 +0.401957899 +0.40475598 +0.407557875 +0.410363555 +0.413172901 +0.415985823 +0.418802232 +0.421622097 +0.424445271 +0.427271664 +0.430101246 +0.432933897 +0.435769498 +0.438608021 +0.441449314 +0.44429335 +0.447140008 +0.4499892 +0.452840805 +0.455694795 +0.458551049 +0.461409479 +0.464269996 +0.467132479 +0.46999687 +0.472863078 +0.475730985 +0.478600532 +0.481471598 +0.484344095 +0.487217963 +0.490093052 +0.492969304 +0.495846599 +0.498724878 +0.501604021 +0.504483938 +0.507364511 +0.51024574 +0.513127387 +0.51600945 +0.518891811 +0.521774411 +0.524657071 +0.52753973 +0.53042233 +0.533304691 +0.536186814 +0.53906852 +0.541949809 +0.544830441 +0.547710419 +0.550589621 +0.553467989 +0.556345344 +0.559221625 +0.562096775 +0.564970613 +0.56784308 +0.570714116 +0.573583543 +0.576451302 +0.579317331 +0.582181454 +0.585043609 +0.587903738 +0.590761662 +0.59361732 +0.596470594 +0.599321425 +0.602169633 +0.605015218 +0.607858002 +0.610697925 +0.613534868 +0.616368771 +0.619199455 +0.622026861 +0.624850869 +0.627671421 +0.630488396 +0.633301675 +0.63611114 +0.63891679 +0.641718388 +0.644515932 +0.647309244 +0.650098264 +0.652882934 +0.655663073 +0.658438623 +0.661209524 +0.663975537 +0.666736722 +0.669492841 +0.672243893 +0.67498976 +0.677730262 +0.6804654 +0.683195055 +0.685919046 +0.688637376 +0.691349864 +0.694056451 +0.696757019 +0.699451447 +0.702139676 +0.704821587 +0.70749712 +0.710166097 +0.712828517 +0.715484202 +0.718133032 +0.720775008 +0.723409951 +0.726037741 +0.728658378 +0.731271625 +0.73387754 +0.736475945 +0.73906672 +0.741649806 +0.744225085 +0.746792436 +0.749351799 +0.751903057 +0.754446149 +0.756980956 +0.759507358 +0.762025297 +0.764534652 +0.767035306 +0.769527197 +0.772010267 +0.774484336 +0.776949346 +0.779405177 +0.781851828 +0.784289062 +0.786716878 +0.789135218 +0.791543841 +0.793942809 +0.796331942 +0.798711181 +0.801080465 +0.803439617 +0.805788577 +0.808127284 +0.81045562 +0.812773526 +0.815080822 +0.817377567 +0.819663525 +0.821938694 +0.824202955 +0.826456249 +0.828698456 +0.830929458 +0.833149195 +0.835357666 +0.837554634 +0.839740098 +0.841913998 +0.844076157 +0.846226573 +0.848365128 +0.850491703 +0.852606297 +0.854708731 +0.856799006 +0.858876944 +0.860942602 +0.862995744 +0.865036428 +0.867064476 +0.869079828 +0.871082425 +0.873072147 +0.875048995 +0.877012789 +0.87896353 +0.880901039 +0.882825375 +0.884736419 +0.886633992 +0.888518155 +0.890388727 +0.89224571 +0.894088984 +0.895918489 +0.897734165 +0.899535954 +0.901323676 +0.903097391 +0.90485698 +0.906602323 +0.908333421 +0.910050213 +0.911752522 +0.913440406 +0.915113747 +0.916772425 +0.91841644 +0.920045674 +0.921660125 +0.923259735 +0.924844325 +0.926413953 +0.927968442 +0.929507852 +0.931032062 +0.932540953 +0.934034586 +0.935512781 +0.936975598 +0.938422859 +0.939854562 +0.941270649 +0.942671061 +0.944055736 +0.945424616 +0.946777642 +0.948114753 +0.949435949 +0.950741112 +0.952030182 +0.953303158 +0.954559982 +0.955800533 +0.957024872 +0.95823282 +0.959424436 +0.960599601 +0.961758375 +0.962900579 +0.964026213 +0.965135217 +0.966227591 +0.967303276 +0.968362153 +0.96940434 +0.970429599 +0.97143805 +0.972429574 +0.973404109 +0.974361718 +0.975302219 +0.976225674 +0.977132022 +0.978021264 +0.97889322 +0.979748011 +0.980585575 +0.981405795 +0.982208729 +0.982994258 +0.983762443 +0.984513223 +0.98524648 +0.985962272 +0.9866606 +0.987341344 +0.988004506 +0.988650084 +0.989278078 +0.98988837 +0.990481019 +0.991055906 +0.99161315 +0.992152631 +0.992674291 +0.993178189 +0.993664265 +0.994132519 +0.994582951 +0.995015502 +0.995430112 +0.9958269 +0.996205688 +0.996566594 +0.996909559 +0.997234523 +0.997541487 +0.99783051 +0.998101473 +0.998354435 +0.998589396 +0.998806298 +0.999005198 +0.999186039 +0.99934876 +0.99949348 +0.99962008 +0.99972862 +0.99981904 +0.99989146 +0.9999457 +0.99998188 +1 +1 +0.99998188 +0.9999457 +0.99989146 +0.99981904 +0.99972862 +0.99962008 +0.99949348 +0.99934876 +0.999186039 +0.999005198 +0.998806298 +0.998589396 +0.998354435 +0.998101473 +0.99783051 +0.997541487 +0.997234523 +0.996909559 +0.996566594 +0.996205688 +0.9958269 +0.995430112 +0.995015502 +0.994582951 +0.994132519 +0.993664265 +0.993178189 +0.992674291 +0.992152631 +0.99161315 +0.991055906 +0.990481019 +0.98988837 +0.989278078 +0.988650084 +0.988004506 +0.987341344 +0.9866606 +0.985962272 +0.98524648 +0.984513223 +0.983762443 +0.982994258 +0.982208729 +0.981405795 +0.980585575 +0.979748011 +0.97889322 +0.978021264 +0.977132022 +0.976225674 +0.975302219 +0.974361718 +0.973404109 +0.972429574 +0.97143805 +0.970429599 +0.96940434 +0.968362153 +0.967303276 +0.966227591 +0.965135217 +0.964026213 +0.962900579 +0.961758375 +0.960599601 +0.959424436 +0.95823282 +0.957024872 +0.955800533 +0.954559982 +0.953303158 +0.952030182 +0.950741112 +0.949435949 +0.948114753 +0.946777642 +0.945424616 +0.944055736 +0.942671061 +0.941270649 +0.939854562 +0.938422859 +0.936975598 +0.935512781 +0.934034586 +0.932540953 +0.931032062 +0.929507852 +0.927968442 +0.926413953 +0.924844325 +0.923259735 +0.921660125 +0.920045674 +0.91841644 +0.916772425 +0.915113747 +0.913440406 +0.911752522 +0.910050213 +0.908333421 +0.906602323 +0.90485698 +0.903097391 +0.901323676 +0.899535954 +0.897734165 +0.895918489 +0.894088984 +0.89224571 +0.890388727 +0.888518155 +0.886633992 +0.884736419 +0.882825375 +0.880901039 +0.87896353 +0.877012789 +0.875048995 +0.873072147 +0.871082425 +0.869079828 +0.867064476 +0.865036428 +0.862995744 +0.860942602 +0.858876944 +0.856799006 +0.854708731 +0.852606297 +0.850491703 +0.848365128 +0.846226573 +0.844076157 +0.841913998 +0.839740098 +0.837554634 +0.835357666 +0.833149195 +0.830929458 +0.828698456 +0.826456249 +0.824202955 +0.821938694 +0.819663525 +0.817377567 +0.815080822 +0.812773526 +0.81045562 +0.808127284 +0.805788577 +0.803439617 +0.801080465 +0.798711181 +0.796331942 +0.793942809 +0.791543841 +0.789135218 +0.786716878 +0.784289062 +0.781851828 +0.779405177 +0.776949346 +0.774484336 +0.772010267 +0.769527197 +0.767035306 +0.764534652 +0.762025297 +0.759507358 +0.756980956 +0.754446149 +0.751903057 +0.749351799 +0.746792436 +0.744225085 +0.741649806 +0.73906672 +0.736475945 +0.73387754 +0.731271625 +0.728658378 +0.726037741 +0.723409951 +0.720775008 +0.718133032 +0.715484202 +0.712828517 +0.710166097 +0.70749712 +0.704821587 +0.702139676 +0.699451447 +0.696757019 +0.694056451 +0.691349864 +0.688637376 +0.685919046 +0.683195055 +0.6804654 +0.677730262 +0.67498976 +0.672243893 +0.669492841 +0.666736722 +0.663975537 +0.661209524 +0.658438623 +0.655663073 +0.652882934 +0.650098264 +0.647309244 +0.644515932 +0.641718388 +0.63891679 +0.63611114 +0.633301675 +0.630488396 +0.627671421 +0.624850869 +0.622026861 +0.619199455 +0.616368771 +0.613534868 +0.610697925 +0.607858002 +0.605015218 +0.602169633 +0.599321425 +0.596470594 +0.59361732 +0.590761662 +0.587903738 +0.585043609 +0.582181454 +0.579317331 +0.576451302 +0.573583543 +0.570714116 +0.56784308 +0.564970613 +0.562096775 +0.559221625 +0.556345344 +0.553467989 +0.550589621 +0.547710419 +0.544830441 +0.541949809 +0.53906852 +0.536186814 +0.533304691 +0.53042233 +0.52753973 +0.524657071 +0.521774411 +0.518891811 +0.51600945 +0.513127387 +0.51024574 +0.507364511 +0.504483938 +0.501604021 +0.498724878 +0.495846599 +0.492969304 +0.490093052 +0.487217963 +0.484344095 +0.481471598 +0.478600532 +0.475730985 +0.472863078 +0.46999687 +0.467132479 +0.464269996 +0.461409479 +0.458551049 +0.455694795 +0.452840805 +0.4499892 +0.447140008 +0.44429335 +0.441449314 +0.438608021 +0.435769498 +0.432933897 +0.430101246 +0.427271664 +0.424445271 +0.421622097 +0.418802232 +0.415985823 +0.413172901 +0.410363555 +0.407557875 +0.40475598 +0.401957899 +0.399163783 +0.39637363 +0.393587619 +0.390805751 +0.388028145 +0.38525489 +0.382486075 +0.379721731 +0.376961976 +0.37420693 +0.371456593 +0.368711084 +0.365970492 +0.363234878 +0.360504329 +0.357778937 +0.35505873 +0.352343827 +0.34963432 +0.346930265 +0.344231695 +0.341538757 +0.338851482 +0.336169958 +0.333494276 +0.330824465 +0.328160644 +0.325502843 +0.322851151 +0.320205688 +0.317566454 +0.314933538 +0.31230703 +0.309686989 +0.307073474 +0.304466575 +0.301866353 +0.299272865 +0.296686172 +0.294106394 +0.29153353 +0.288967669 +0.286408871 +0.283857226 +0.281312764 +0.278775573 +0.276245713 +0.273723245 +0.271208227 +0.268700719 +0.266200781 +0.263708502 +0.261223882 +0.258747011 +0.256277978 +0.253816813 +0.251363575 +0.248918295 +0.246481076 +0.244051963 +0.241630986 +0.23921822 +0.236813724 +0.234417543 +0.232029721 +0.229650334 +0.22727941 +0.224917009 +0.222563192 +0.220218003 +0.217881501 +0.215553716 +0.213234693 +0.210924506 +0.208623201 +0.206330791 +0.204047367 +0.201772943 +0.199507579 +0.197251305 +0.19500418 +0.192766249 +0.190537542 +0.188318118 +0.186108008 +0.183907256 +0.181715891 +0.179533973 +0.177361533 +0.175198615 +0.173045248 +0.170901462 +0.168767318 +0.16664283 +0.164528057 +0.162423015 +0.160327747 +0.158242285 +0.156166673 +0.154100925 +0.152045086 +0.149999186 +0.147963256 +0.145937324 +0.143921435 +0.14191559 +0.139919832 +0.137934208 +0.135958716 +0.133993402 +0.132038295 +0.130093396 +0.128158763 +0.126234397 +0.124320328 +0.122416586 +0.120523192 +0.11864017 +0.116767533 +0.114905313 +0.113053523 +0.111212187 +0.109381326 +0.107560948 +0.10575109 +0.103951752 +0.102162965 +0.100384742 +0.0986170918 +0.0968600363 +0.0951135904 +0.0933777615 +0.0916525722 +0.0899380371 +0.0882341564 +0.0865409523 +0.0848584324 +0.0831866115 +0.0815254971 +0.0798751041 +0.0782354325 +0.0766064897 +0.0749882981 +0.0733808503 +0.071784161 +0.0701982304 +0.0686230734 +0.0670586899 +0.0655050874 +0.0639622584 +0.0624302253 +0.0609089769 +0.0593985207 +0.0578988567 +0.0564099886 +0.0549319163 +0.0534646399 +0.0520081595 +0.0505624712 +0.0491275787 +0.0477034748 +0.0462901592 +0.0448876321 +0.043495886 +0.0421149172 +0.0407447219 +0.0393852964 +0.0380366333 +0.0366987251 +0.0353715681 +0.034055151 +0.0327494703 +0.0314545184 +0.0301702805 +0.0288967527 +0.0276339222 +0.0263817795 +0.0251403153 +0.0239095166 +0.0226893723 +0.0214798693 +0.0202809945 +0.0190927368 +0.0179150812 +0.0167480111 +0.0155915162 +0.0144455768 +0.01331018 +0.0121853082 +0.0110709462 +0.00996707473 +0.00887367688 +0.00779073592 +0.00671823137 +0.00565614505 +0.00460445741 +0.00356314867 +0.00253219786 +0.00151158439 +0.000501286995 +0.000498716196 +0.00148844742 +0.00246792915 +0.00343718473 +0.0043962379 +0.00534511171 +0.00628383178 +0.00721242186 +0.00813090801 +0.0090393154 +0.00993767008 +0.0108259991 +0.0117043285 +0.0125726862 +0.0134311002 +0.0142795984 +0.0151182087 +0.0159469601 +0.0167658832 +0.0175750051 +0.0183743592 +0.0191639736 +0.0199438818 +0.0207141098 +0.0214746948 +0.0222256668 +0.0229670554 +0.023698898 +0.0244212244 +0.0251340698 +0.0258374661 +0.0265314486 +0.0272160508 +0.0278913099 +0.0285572596 +0.0292139333 +0.0298613701 +0.0304996055 +0.0311286729 +0.0317486152 +0.0323594622 +0.0329612568 +0.0335540324 +0.0341378301 +0.0347126909 +0.0352786481 +0.035835743 +0.0363840126 +0.0369234979 +0.03745424 +0.0379762799 +0.0384896547 +0.0389944091 +0.0394905806 +0.0399782099 +0.0404573381 +0.0409280136 +0.04139027 +0.0418441519 +0.0422897041 +0.0427269712 +0.0431559905 +0.0435768068 +0.0439894646 +0.0443940088 +0.0447904803 +0.0451789275 +0.0455593914 +0.0459319167 +0.0462965481 +0.0466533341 +0.0470023155 +0.0473435372 +0.0476770513 +0.048002895 +0.0483211204 +0.0486317724 +0.0489348955 +0.0492305383 +0.0495187454 +0.049799569 +0.0500730462 +0.0503392331 +0.0505981743 +0.0508499183 +0.0510945097 +0.0513320006 +0.0515624322 +0.0517858602 +0.0520023294 +0.0522118881 +0.0524145849 +0.0526104718 +0.0527995899 +0.052981995 +0.0531577356 +0.0533268563 +0.0534894131 +0.0536454469 +0.0537950136 +0.0539381616 +0.0540749393 +0.054205399 +0.0543295853 +0.0544475503 +0.0545593463 +0.0546650253 +0.0547646284 +0.0548582152 +0.0549458303 +0.0550275259 +0.0551033542 +0.0551733635 +0.0552376024 +0.055296123 +0.0553489812 +0.0553962179 +0.0554378927 +0.0554740503 +0.055504743 +0.0555300228 +0.0555499382 +0.0555645414 +0.0555738844 +0.0555780157 +0.0555769876 +0.0555708483 +0.0555596538 +0.0555434525 +0.0555222891 +0.0554962233 +0.0554653034 +0.0554295778 +0.0553890988 +0.0553439148 +0.0552940778 +0.0552396439 +0.0551806539 +0.0551171675 +0.0550492257 +0.054976888 +0.0549002029 +0.0548192151 +0.0547339804 +0.0546445474 +0.0545509681 +0.0544532873 +0.0543515608 +0.054245837 +0.0541361682 +0.0540225953 +0.0539051779 +0.0537839644 +0.0536589995 +0.0535303354 +0.0533980206 +0.0532621033 +0.0531226397 +0.0529796705 +0.0528332479 +0.0526834242 +0.052530244 +0.0523737557 +0.0522140078 +0.0520510525 +0.0518849343 +0.0517157055 +0.0515434109 +0.0513680987 +0.0511898138 +0.0510086119 +0.0508245341 +0.0506376289 +0.0504479446 +0.0502555296 +0.0500604287 +0.0498626865 +0.0496623553 +0.0494594797 +0.0492541008 +0.0490462705 +0.0488360338 +0.0486234352 +0.0484085232 +0.0481913388 +0.0479719304 +0.0477503389 +0.0475266166 +0.0473008044 +0.0470729433 +0.0468430854 +0.0466112681 +0.0463775396 +0.0461419411 +0.0459045134 +0.0456653088 +0.0454243645 +0.0451817214 +0.0449374281 +0.0446915217 +0.0444440469 +0.0441950485 +0.0439445637 +0.0436926372 +0.04343931 +0.0431846231 +0.0429286174 +0.0426713303 +0.04241281 +0.0421530902 +0.0418922156 +0.0416302234 +0.0413671546 +0.0411030464 +0.0408379398 +0.0405718721 +0.0403048843 +0.0400370136 +0.0397682972 +0.0394987762 +0.0392284878 +0.0389574654 +0.0386857465 +0.0384133719 +0.0381403789 +0.037866801 +0.0375926718 +0.0373180322 +0.0370429158 +0.0367673598 +0.0364913978 +0.0362150632 +0.0359383896 +0.0356614143 +0.0353841744 +0.0351066962 +0.0348290168 +0.0345511697 +0.0342731886 +0.0339951031 +0.0337169506 +0.0334387571 +0.0331605598 +0.032882385 +0.0326042697 +0.0323262401 +0.0320483297 +0.0317705646 +0.0314929821 +0.0312156063 +0.0309384689 +0.0306615978 +0.0303850248 +0.0301087741 +0.0298328791 +0.0295573641 +0.029282257 +0.0290075876 +0.028733382 +0.0284596663 +0.0281864684 +0.0279138125 +0.0276417267 +0.0273702368 +0.0270993672 +0.0268291421 +0.0265595894 +0.0262907296 +0.0260225888 +0.0257551931 +0.0254885629 +0.0252227206 +0.0249576941 +0.0246935021 +0.0244301669 +0.0241677128 +0.0239061601 +0.0236455314 +0.023385847 +0.0231271274 +0.0228693951 +0.0226126667 +0.0223569665 +0.0221023113 +0.0218487214 +0.0215962157 +0.0213448126 +0.0210945308 +0.020845389 +0.0205974039 +0.0203505941 +0.0201049764 +0.0198605675 +0.0196173843 +0.0193754435 +0.0191347618 +0.0188953523 +0.0186572317 +0.0184204169 +0.0181849208 +0.0179507565 +0.0177179426 +0.0174864884 +0.0172564108 +0.0170277227 +0.0168004334 +0.0165745616 +0.0163501147 +0.0161271077 +0.0159055516 +0.0156854577 +0.0154668363 +0.0152497003 +0.01503406 +0.0148199247 +0.0146073047 +0.0143962111 +0.0141866514 +0.0139786368 +0.0137721747 +0.0135672744 +0.0133639444 +0.013162192 +0.0129620265 +0.0127634527 +0.0125664808 +0.0123711154 +0.0121773649 +0.011985234 +0.011794731 +0.0116058588 +0.0114186257 +0.0112330345 +0.0110490927 +0.0108668031 +0.0106861703 +0.0105071999 +0.0103298938 +0.0101542575 +0.00998029299 +0.0098080039 +0.00963739306 +0.00946846325 +0.00930121634 +0.0091356542 +0.00897177961 +0.00880959257 +0.00864909589 +0.00849028956 +0.00833317544 +0.00817775261 +0.00802402198 +0.00787198357 +0.00772163644 +0.00757298153 +0.00742601743 +0.00728074275 +0.00713715702 +0.00699525792 +0.00685504451 +0.00671651447 +0.00657966593 +0.0064444961 +0.00631100265 +0.00617918232 +0.00604903232 +0.00592054939 +0.00579373026 +0.00566857029 +0.0055450662 +0.00542321336 +0.00530300755 +0.0051844446 +0.00506751891 +0.00495222583 +0.00483855978 +0.00472651515 +0.00461608684 +0.00450726878 +0.00440005446 +0.00429443829 +0.00419041282 +0.00408797199 +0.00398710882 +0.0038878161 +0.00379008683 +0.00369391311 +0.00359928748 +0.00350620202 +0.00341464882 +0.00332461973 +0.00323610636 +0.00314909988 +0.00306359166 +0.00297957286 +0.0028970344 +0.00281596719 +0.00273636146 +0.00265820767 +0.00258149626 +0.00250621722 +0.00243236031 +0.00235991552 +0.00228887261 +0.00221922086 +0.00215094932 +0.00208404753 +0.00201850454 +0.00195430894 +0.00189144944 +0.00182991498 +0.0017696938 +0.00171077426 +0.0016531446 +0.00159679272 +0.00154170673 +0.00148787431 +0.00143528322 +0.00138392102 +0.001333775 +0.00128483272 +0.00123708125 +0.00119050755 +0.00114509882 +0.00110084191 +0.00105772354 +0.00101573032 +0.000974848866 +0.000935065618 +0.000896367012 +0.000858739193 +0.000822168484 +0.000786640856 +0.000752142339 +0.000718658906 +0.000686176296 +0.000654680305 +0.000624156557 +0.000594590732 +0.000565968279 +0.000538274646 +0.00051149528 +0.000485615368 +0.000460620213 +0.000436495029 +0.000413224887 +0.000390794827 +0.000369189918 +0.000348395057 +0.000328395137 +0.000309175026 +0.00029071953 +0.000273013371 +0.000256041298 +0.000239787958 +0.000224237971 +0.000209375954 +0.000195186469 +0.000181654032 +0.000168763145 +0.000156498296 +0.000144843914 +0.00013378443 +0.000123304242 +0.000113387752 +0.000104019324 +9.51833063e-05 +8.68640418e-05 +7.90458726e-05 +7.17131261e-05 +6.48501155e-05 +5.84411609e-05 +5.24705829e-05 +4.69226979e-05 +4.17818301e-05 +3.70322996e-05 +3.26584523e-05 +2.86446211e-05 +2.49751702e-05 +2.1634467e-05 +1.86068992e-05 +1.58768707e-05 +1.34288075e-05 +1.12471562e-05 +9.31638806e-06 +7.62100171e-06 +6.14552437e-06 +4.87451371e-06 +3.79255926e-06 +2.88428623e-06 +2.13435624e-06 +1.52746941e-06 +1.04836658e-06 +6.8183158e-07 +4.12692685e-07 +2.25824948e-07 +1.06152001e-07 +3.86480643e-08 +8.33986835e-09 +3.08579551e-10 + +shape_id 10 +num_samples 2000 +0.5 +0 +0 +497 +-0.5 +0 +0 +997 +0.5 +0 +0 +497 + +shape_id 11 +num_samples 2 +0 +220 + +shape_id 12 +num_samples 4 +0 +1 +1 +0.215892047 + +shape_id 13 +num_samples 4 +0 +25 +144 +169 + +shape_id 14 +num_samples 4 +0.650847435 +1 +1 +0 + +shape_id 15 +num_samples 2 +0 +642 + +shape_id 16 +num_samples 4 +0.215892047 +1 +1 +0 + +shape_id 17 +num_samples 4 +0 +1 +1 +0.650847435 + +# Comment added to ensure editors preserve the preceding blank line. Pypulseq hangs if it is not present. diff --git a/test/test_data/pulseq/1.5.0/gauss_pulses.seq b/test/test_data/pulseq/1.5.0/gauss_pulses.seq new file mode 100644 index 00000000..d2edeb27 --- /dev/null +++ b/test/test_data/pulseq/1.5.0/gauss_pulses.seq @@ -0,0 +1,5074 @@ +# Pulseq sequence file +# Created by MATLAB mr toolbox + +[VERSION] +major 1 +minor 5 +revision 0 + +[DEFINITIONS] +AdcRasterTime 1e-07 +BlockDurationRaster 1e-05 +GradientRasterTime 1e-05 +RadiofrequencyRasterTime 1e-06 + +# Format of blocks: +# NUM DUR RF GX GY GZ ADC EXT +[BLOCKS] + 1 100 1 0 0 0 0 0 + 2 100000 0 0 0 0 0 0 + 3 200 2 0 0 0 0 0 + 4 100000 0 0 0 0 0 0 + 5 100 3 0 0 0 0 0 + 6 100000 0 0 0 0 0 0 + 7 100 3 0 0 0 0 0 + 8 100000 0 0 0 0 0 0 + 9 200 4 0 0 0 0 0 +10 100000 0 0 0 0 0 0 +11 100 5 0 0 0 0 0 +12 100000 0 0 0 0 0 0 +13 100 6 0 0 0 0 0 +14 100000 0 0 0 0 0 0 +15 100 7 0 0 0 0 0 + +# Format of RF events: +# id ampl. mag_id phase_id time_shape_id center delay freqPPM phasePPM freq phase use +# .. Hz .. .. .. us us ppm rad/MHz Hz rad .. +# Field 'use' is the initial of: excitation refocusing inversion saturation preparation other undefined +[RF] +1 477.543 1 2 0 500 0 0 0 0 0 u +2 477.543 1 2 0 500 1000 0 0 0 0 u +3 750.122 1 2 0 500 0 0 0 0 0 u +4 375.063 3 4 0 1000 0 0 0 0 1.5708 u +5 750.122 1 2 0 500 0 0 0 1000 1.5708 u +6 316.492 5 2 0 500 0 0 0 0 0 u +7 772.873 6 2 0 500 0 0 0 0 0 u + +# Sequence Shapes +[SHAPES] + +shape_id 1 +num_samples 1000 +0.000863560755 +0.000888275586 +0.000913646081 +0.000939688055 +0.000966417662 +0.000993851395 +0.0010220061 +0.00105089896 +0.00108054754 +0.00111096976 +0.00114218391 +0.00117420866 +0.00120706306 +0.00124076657 +0.00127533902 +0.00131080066 +0.00134717216 +0.00138447458 +0.00142272943 +0.00146195864 +0.00150218458 +0.00154343005 +0.00158571833 +0.00162907313 +0.00167351865 +0.00171907956 +0.00176578098 +0.00181364856 +0.00186270841 +0.00191298718 +0.00196451199 +0.0020173105 +0.00207141089 +0.00212684187 +0.00218363271 +0.0022418132 +0.00230141369 +0.00236246512 +0.00242499897 +0.00248904732 +0.00255464283 +0.00262181876 +0.00269060897 +0.00276104793 +0.00283317073 +0.0029070131 +0.0029826114 +0.00306000262 +0.00313922442 +0.00322031512 +0.00330331371 +0.00338825985 +0.00347519389 +0.00356415688 +0.00365519058 +0.00374833743 +0.00384364063 +0.00394114409 +0.00404089245 +0.0041429311 +0.0042473062 +0.00435406465 +0.00446325414 +0.00457492313 +0.00468912086 +0.00480589738 +0.00492530355 +0.00504739102 +0.00517221228 +0.00529982065 +0.00543027028 +0.00556361616 +0.00569991417 +0.005839221 +0.00598159425 +0.00612709239 +0.00627577478 +0.00642770166 +0.0065829342 +0.00674153445 +0.0069035654 +0.00706909096 +0.00723817597 +0.00741088623 +0.00758728847 +0.00776745038 +0.00795144063 +0.00813932883 +0.00833118559 +0.00852708251 +0.00872709218 +0.00893128816 +0.00913974506 +0.00935253846 +0.00956974499 +0.0097914423 +0.010017709 +0.0102486249 +0.0104842707 +0.0107247282 +0.0109700803 +0.0112204108 +0.0114758047 +0.0117363481 +0.0120021281 +0.0122732328 +0.0125497516 +0.0128317748 +0.0131193938 +0.0134127012 +0.0137117905 +0.0140167566 +0.0143276953 +0.0146447035 +0.0149678792 +0.0152973217 +0.015633131 +0.0159754087 +0.0163242573 +0.0166797802 +0.0170420823 +0.0174112693 +0.0177874483 +0.0181707272 +0.0185612152 +0.0189590227 +0.0193642611 +0.0197770427 +0.0201974814 +0.0206256917 +0.0210617895 +0.0215058917 +0.0219581165 +0.0224185828 +0.0228874109 +0.023364722 +0.0238506386 +0.0243452841 +0.024848783 +0.0253612609 +0.0258828443 +0.026413661 +0.0269538397 +0.0275035101 +0.028062803 +0.0286318502 +0.0292107844 +0.0297997394 +0.03039885 +0.031008252 +0.0316280819 +0.0322584776 +0.0328995775 +0.0335515212 +0.0342144491 +0.0348885025 +0.0355738236 +0.0362705555 +0.0369788421 +0.0376988281 +0.0384306591 +0.0391744816 +0.0399304425 +0.04069869 +0.0414793726 +0.0422726397 +0.0430786414 +0.0438975286 +0.0447294526 +0.0455745656 +0.0464330202 +0.0473049699 +0.0481905683 +0.0490899701 +0.05000333 +0.0509308037 +0.0518725469 +0.0528287161 +0.0537994681 +0.0547849599 +0.0557853492 +0.0568007938 +0.0578314519 +0.0588774818 +0.0599390423 +0.0610162923 +0.0621093907 +0.0632184968 +0.0643437699 +0.0654853694 +0.0666434546 +0.067818185 +0.06900972 +0.0702182189 +0.0714438408 +0.0726867449 +0.0739470899 +0.0752250346 +0.0765207373 +0.0778343561 +0.0791660488 +0.0805159725 +0.0818842844 +0.0832711407 +0.0846766974 +0.0861011098 +0.0875445328 +0.0890071203 +0.0904890257 +0.0919904017 +0.0935114002 +0.0950521721 +0.0966128676 +0.0981936359 +0.099794625 +0.101415982 +0.103057854 +0.104720384 +0.106403717 +0.108107996 +0.109833361 +0.111579952 +0.113347908 +0.115137366 +0.116948461 +0.118781328 +0.120636098 +0.122512901 +0.124411868 +0.126333125 +0.128276797 +0.130243008 +0.132231879 +0.13424353 +0.136278077 +0.138335636 +0.140416321 +0.142520241 +0.144647505 +0.146798219 +0.148972487 +0.15117041 +0.153392086 +0.155637612 +0.157907081 +0.160200583 +0.162518206 +0.164860036 +0.167226154 +0.169616639 +0.172031568 +0.174471013 +0.176935044 +0.179423728 +0.181937128 +0.184475304 +0.187038312 +0.189626207 +0.192239036 +0.194876847 +0.197539682 +0.20022758 +0.202940575 +0.205678699 +0.208441978 +0.211230438 +0.214044095 +0.216882967 +0.219747064 +0.222636394 +0.225550958 +0.228490757 +0.231455783 +0.234446028 +0.237461475 +0.240502107 +0.2435679 +0.246658825 +0.249774849 +0.252915936 +0.256082043 +0.259273122 +0.262489122 +0.265729986 +0.268995651 +0.272286052 +0.275601117 +0.278940768 +0.282304923 +0.285693496 +0.289106394 +0.292543518 +0.296004767 +0.299490032 +0.302999198 +0.306532148 +0.310088755 +0.313668891 +0.31727242 +0.320899201 +0.324549086 +0.328221923 +0.331917556 +0.335635819 +0.339376543 +0.343139554 +0.346924671 +0.350731707 +0.354560469 +0.35841076 +0.362282375 +0.366175105 +0.370088733 +0.374023039 +0.377977795 +0.381952767 +0.385947716 +0.389962396 +0.393996558 +0.398049943 +0.402122288 +0.406213325 +0.410322779 +0.414450369 +0.418595808 +0.422758804 +0.426939057 +0.431136265 +0.435350116 +0.439580293 +0.443826476 +0.448088336 +0.452365539 +0.456657746 +0.460964611 +0.465285783 +0.469620906 +0.473969616 +0.478331546 +0.482706321 +0.487093563 +0.491492885 +0.495903897 +0.500326204 +0.504759403 +0.509203087 +0.513656844 +0.518120256 +0.5225929 +0.527074348 +0.531564166 +0.536061915 +0.540567153 +0.545079429 +0.549598291 +0.554123279 +0.558653931 +0.563189778 +0.567730348 +0.572275162 +0.576823739 +0.581375592 +0.585930231 +0.590487159 +0.595045878 +0.599605884 +0.604166668 +0.60872772 +0.613288522 +0.617848556 +0.622407299 +0.626964223 +0.631518797 +0.636070489 +0.640618759 +0.645163068 +0.649702872 +0.654237624 +0.658766774 +0.663289768 +0.667806053 +0.672315069 +0.676816255 +0.681309049 +0.685792885 +0.690267195 +0.69473141 +0.699184957 +0.703627263 +0.708057753 +0.712475849 +0.716880973 +0.721272546 +0.725649985 +0.730012708 +0.734360133 +0.738691675 +0.743006748 +0.747304768 +0.751585148 +0.755847301 +0.760090642 +0.764314582 +0.768518536 +0.772701916 +0.776864136 +0.78100461 +0.785122753 +0.789217979 +0.793289706 +0.79733735 +0.80136033 +0.805358064 +0.809329974 +0.813275482 +0.817194012 +0.821084989 +0.824947842 +0.828782 +0.832586896 +0.836361962 +0.840106638 +0.843820361 +0.847502575 +0.851152723 +0.854770256 +0.858354623 +0.86190528 +0.865421684 +0.868903298 +0.872349587 +0.875760021 +0.879134072 +0.882471218 +0.885770942 +0.889032729 +0.892256069 +0.89544046 +0.898585399 +0.901690394 +0.904754953 +0.907778593 +0.910760834 +0.913701202 +0.916599229 +0.919454452 +0.922266415 +0.925034667 +0.927758763 +0.930438265 +0.93307274 +0.935661762 +0.938204912 +0.940701778 +0.943151953 +0.945555039 +0.947910643 +0.95021838 +0.952477873 +0.95468875 +0.956850649 +0.958963215 +0.961026098 +0.963038958 +0.965001464 +0.966913289 +0.968774118 +0.970583641 +0.972341558 +0.974047576 +0.975701411 +0.977302788 +0.978851438 +0.980347104 +0.981789534 +0.983178488 +0.984513732 +0.985795043 +0.987022205 +0.988195012 +0.989313266 +0.99037678 +0.991385374 +0.992338878 +0.993237132 +0.994079983 +0.994867289 +0.995598917 +0.996274744 +0.996894655 +0.997458545 +0.997966319 +0.99841789 +0.998813183 +0.99915213 +0.999434673 +0.999660766 +0.999830368 +0.999943453 +1 +1 +0.999943453 +0.999830368 +0.999660766 +0.999434673 +0.99915213 +0.998813183 +0.99841789 +0.997966319 +0.997458545 +0.996894655 +0.996274744 +0.995598917 +0.994867289 +0.994079983 +0.993237132 +0.992338878 +0.991385374 +0.99037678 +0.989313266 +0.988195012 +0.987022205 +0.985795043 +0.984513732 +0.983178488 +0.981789534 +0.980347104 +0.978851438 +0.977302788 +0.975701411 +0.974047576 +0.972341558 +0.970583641 +0.968774118 +0.966913289 +0.965001464 +0.963038958 +0.961026098 +0.958963215 +0.956850649 +0.95468875 +0.952477873 +0.95021838 +0.947910643 +0.945555039 +0.943151953 +0.940701778 +0.938204912 +0.935661762 +0.93307274 +0.930438265 +0.927758763 +0.925034667 +0.922266415 +0.919454452 +0.916599229 +0.913701202 +0.910760834 +0.907778593 +0.904754953 +0.901690394 +0.898585399 +0.89544046 +0.892256069 +0.889032729 +0.885770942 +0.882471218 +0.879134072 +0.875760021 +0.872349587 +0.868903298 +0.865421684 +0.86190528 +0.858354623 +0.854770256 +0.851152723 +0.847502575 +0.843820361 +0.840106638 +0.836361962 +0.832586896 +0.828782 +0.824947842 +0.821084989 +0.817194012 +0.813275482 +0.809329974 +0.805358064 +0.80136033 +0.79733735 +0.793289706 +0.789217979 +0.785122753 +0.78100461 +0.776864136 +0.772701916 +0.768518536 +0.764314582 +0.760090642 +0.755847301 +0.751585148 +0.747304768 +0.743006748 +0.738691675 +0.734360133 +0.730012708 +0.725649985 +0.721272546 +0.716880973 +0.712475849 +0.708057753 +0.703627263 +0.699184957 +0.69473141 +0.690267195 +0.685792885 +0.681309049 +0.676816255 +0.672315069 +0.667806053 +0.663289768 +0.658766774 +0.654237624 +0.649702872 +0.645163068 +0.640618759 +0.636070489 +0.631518797 +0.626964223 +0.622407299 +0.617848556 +0.613288522 +0.60872772 +0.604166668 +0.599605884 +0.595045878 +0.590487159 +0.585930231 +0.581375592 +0.576823739 +0.572275162 +0.567730348 +0.563189778 +0.558653931 +0.554123279 +0.549598291 +0.545079429 +0.540567153 +0.536061915 +0.531564166 +0.527074348 +0.5225929 +0.518120256 +0.513656844 +0.509203087 +0.504759403 +0.500326204 +0.495903897 +0.491492885 +0.487093563 +0.482706321 +0.478331546 +0.473969616 +0.469620906 +0.465285783 +0.460964611 +0.456657746 +0.452365539 +0.448088336 +0.443826476 +0.439580293 +0.435350116 +0.431136265 +0.426939057 +0.422758804 +0.418595808 +0.414450369 +0.410322779 +0.406213325 +0.402122288 +0.398049943 +0.393996558 +0.389962396 +0.385947716 +0.381952767 +0.377977795 +0.374023039 +0.370088733 +0.366175105 +0.362282375 +0.35841076 +0.354560469 +0.350731707 +0.346924671 +0.343139554 +0.339376543 +0.335635819 +0.331917556 +0.328221923 +0.324549086 +0.320899201 +0.31727242 +0.313668891 +0.310088755 +0.306532148 +0.302999198 +0.299490032 +0.296004767 +0.292543518 +0.289106394 +0.285693496 +0.282304923 +0.278940768 +0.275601117 +0.272286052 +0.268995651 +0.265729986 +0.262489122 +0.259273122 +0.256082043 +0.252915936 +0.249774849 +0.246658825 +0.2435679 +0.240502107 +0.237461475 +0.234446028 +0.231455783 +0.228490757 +0.225550958 +0.222636394 +0.219747064 +0.216882967 +0.214044095 +0.211230438 +0.208441978 +0.205678699 +0.202940575 +0.20022758 +0.197539682 +0.194876847 +0.192239036 +0.189626207 +0.187038312 +0.184475304 +0.181937128 +0.179423728 +0.176935044 +0.174471013 +0.172031568 +0.169616639 +0.167226154 +0.164860036 +0.162518206 +0.160200583 +0.157907081 +0.155637612 +0.153392086 +0.15117041 +0.148972487 +0.146798219 +0.144647505 +0.142520241 +0.140416321 +0.138335636 +0.136278077 +0.13424353 +0.132231879 +0.130243008 +0.128276797 +0.126333125 +0.124411868 +0.122512901 +0.120636098 +0.118781328 +0.116948461 +0.115137366 +0.113347908 +0.111579952 +0.109833361 +0.108107996 +0.106403717 +0.104720384 +0.103057854 +0.101415982 +0.099794625 +0.0981936359 +0.0966128676 +0.0950521721 +0.0935114002 +0.0919904017 +0.0904890257 +0.0890071203 +0.0875445328 +0.0861011098 +0.0846766974 +0.0832711407 +0.0818842844 +0.0805159725 +0.0791660488 +0.0778343561 +0.0765207373 +0.0752250346 +0.0739470899 +0.0726867449 +0.0714438408 +0.0702182189 +0.06900972 +0.067818185 +0.0666434546 +0.0654853694 +0.0643437699 +0.0632184968 +0.0621093907 +0.0610162923 +0.0599390423 +0.0588774818 +0.0578314519 +0.0568007938 +0.0557853492 +0.0547849599 +0.0537994681 +0.0528287161 +0.0518725469 +0.0509308037 +0.05000333 +0.0490899701 +0.0481905683 +0.0473049699 +0.0464330202 +0.0455745656 +0.0447294526 +0.0438975286 +0.0430786414 +0.0422726397 +0.0414793726 +0.04069869 +0.0399304425 +0.0391744816 +0.0384306591 +0.0376988281 +0.0369788421 +0.0362705555 +0.0355738236 +0.0348885025 +0.0342144491 +0.0335515212 +0.0328995775 +0.0322584776 +0.0316280819 +0.031008252 +0.03039885 +0.0297997394 +0.0292107844 +0.0286318502 +0.028062803 +0.0275035101 +0.0269538397 +0.026413661 +0.0258828443 +0.0253612609 +0.024848783 +0.0243452841 +0.0238506386 +0.023364722 +0.0228874109 +0.0224185828 +0.0219581165 +0.0215058917 +0.0210617895 +0.0206256917 +0.0201974814 +0.0197770427 +0.0193642611 +0.0189590227 +0.0185612152 +0.0181707272 +0.0177874483 +0.0174112693 +0.0170420823 +0.0166797802 +0.0163242573 +0.0159754087 +0.015633131 +0.0152973217 +0.0149678792 +0.0146447035 +0.0143276953 +0.0140167566 +0.0137117905 +0.0134127012 +0.0131193938 +0.0128317748 +0.0125497516 +0.0122732328 +0.0120021281 +0.0117363481 +0.0114758047 +0.0112204108 +0.0109700803 +0.0107247282 +0.0104842707 +0.0102486249 +0.010017709 +0.0097914423 +0.00956974499 +0.00935253846 +0.00913974506 +0.00893128816 +0.00872709218 +0.00852708251 +0.00833118559 +0.00813932883 +0.00795144063 +0.00776745038 +0.00758728847 +0.00741088623 +0.00723817597 +0.00706909096 +0.0069035654 +0.00674153445 +0.0065829342 +0.00642770166 +0.00627577478 +0.00612709239 +0.00598159425 +0.005839221 +0.00569991417 +0.00556361616 +0.00543027028 +0.00529982065 +0.00517221228 +0.00504739102 +0.00492530355 +0.00480589738 +0.00468912086 +0.00457492313 +0.00446325414 +0.00435406465 +0.0042473062 +0.0041429311 +0.00404089245 +0.00394114409 +0.00384364063 +0.00374833743 +0.00365519058 +0.00356415688 +0.00347519389 +0.00338825985 +0.00330331371 +0.00322031512 +0.00313922442 +0.00306000262 +0.0029826114 +0.0029070131 +0.00283317073 +0.00276104793 +0.00269060897 +0.00262181876 +0.00255464283 +0.00248904732 +0.00242499897 +0.00236246512 +0.00230141369 +0.0022418132 +0.00218363271 +0.00212684187 +0.00207141089 +0.0020173105 +0.00196451199 +0.00191298718 +0.00186270841 +0.00181364856 +0.00176578098 +0.00171907956 +0.00167351865 +0.00162907313 +0.00158571833 +0.00154343005 +0.00150218458 +0.00146195864 +0.00142272943 +0.00138447458 +0.00134717216 +0.00131080066 +0.00127533902 +0.00124076657 +0.00120706306 +0.00117420866 +0.00114218391 +0.00111096976 +0.00108054754 +0.00105089896 +0.0010220061 +0.000993851395 +0.000966417662 +0.000939688055 +0.000913646081 +0.000888275586 +0.000863560755 + +shape_id 2 +num_samples 1000 +0 +0 +998 + +shape_id 3 +num_samples 2000 +0.000857478127 +0.000869674236 +0.000882031344 +0.000894551387 +0.00090723632 +0.00092008812 +0.000933108786 +0.000946300336 +0.000959664811 +0.000973204272 +0.000986920803 +0.00100081651 +0.00101489352 +0.00102915397 +0.00104360005 +0.00105823395 +0.00107305788 +0.00108807409 +0.00110328483 +0.0011186924 +0.0011342991 +0.00115010727 +0.00116611926 +0.00118233746 +0.00119876427 +0.00121540212 +0.00123225348 +0.00124932081 +0.00126660663 +0.00128411346 +0.00130184387 +0.00131980043 +0.00133798575 +0.00135640247 +0.00137505324 +0.00139394077 +0.00141306775 +0.00143243693 +0.00145205108 +0.001471913 +0.0014920255 +0.00151239144 +0.00153301371 +0.0015538952 +0.00157503886 +0.00159644764 +0.00161812455 +0.00164007261 +0.00166229487 +0.00168479441 +0.00170757434 +0.00173063782 +0.00175398801 +0.00177762811 +0.00180156136 +0.00182579103 +0.00185032042 +0.00187515284 +0.00190029166 +0.00192574028 +0.00195150212 +0.00197758063 +0.0020039793 +0.00203070166 +0.00205775127 +0.0020851317 +0.00211284659 +0.00214089959 +0.00216929439 +0.00219803472 +0.00222712434 +0.00225656703 +0.00228636664 +0.00231652702 +0.00234705208 +0.00237794575 +0.00240921201 +0.00244085487 +0.00247287836 +0.00250528658 +0.00253808365 +0.00257127371 +0.00260486097 +0.00263884965 +0.00267324403 +0.00270804842 +0.00274326717 +0.00277890465 +0.00281496531 +0.00285145359 +0.00288837401 +0.00292573111 +0.00296352948 +0.00300177374 +0.00304046856 +0.00307961864 +0.00311922873 +0.00315930362 +0.00319984815 +0.00324086718 +0.00328236564 +0.00332434847 +0.00336682068 +0.00340978732 +0.00345325347 +0.00349722426 +0.00354170487 +0.00358670052 +0.00363221646 +0.00367825801 +0.00372483051 +0.00377193938 +0.00381959004 +0.00386778799 +0.00391653876 +0.00396584793 +0.00401572114 +0.00406616405 +0.00411718238 +0.00416878191 +0.00422096845 +0.00427374787 +0.00432712606 +0.00438110901 +0.00443570271 +0.00449091322 +0.00454674664 +0.00460320915 +0.00466030693 +0.00471804624 +0.0047764334 +0.00483547476 +0.00489517672 +0.00495554574 +0.00501658833 +0.00507831105 +0.00514072052 +0.0052038234 +0.00526762639 +0.00533213629 +0.0053973599 +0.00546330409 +0.00552997581 +0.00559738203 +0.00566552978 +0.00573442616 +0.00580407831 +0.00587449342 +0.00594567876 +0.00601764162 +0.00609038938 +0.00616392945 +0.00623826931 +0.00631341649 +0.00638937857 +0.0064661632 +0.00654377809 +0.00662223099 +0.00670152971 +0.00678168212 +0.00686269617 +0.00694457983 +0.00702734116 +0.00711098826 +0.00719552929 +0.00728097248 +0.00736732611 +0.00745459852 +0.00754279812 +0.00763193336 +0.00772201276 +0.00781304492 +0.00790503846 +0.0079980021 +0.0080919446 +0.00818687478 +0.00828280154 +0.00837973381 +0.00847768062 +0.00857665103 +0.00867665419 +0.00877769927 +0.00887979556 +0.00898295237 +0.00908717908 +0.00919248515 +0.00929888009 +0.00940637348 +0.00951497496 +0.00962469423 +0.00973554106 +0.0098475253 +0.00996065682 +0.0100749456 +0.0101904017 +0.0103070351 +0.0104248561 +0.0105438749 +0.0106641017 +0.0107855469 +0.010908221 +0.0110321344 +0.0111572976 +0.0112837214 +0.0114114163 +0.0115403932 +0.0116706629 +0.0118022362 +0.0119351241 +0.0120693376 +0.0122048879 +0.012341786 +0.0124800432 +0.0126196709 +0.0127606803 +0.0129030829 +0.0130468902 +0.0131921138 +0.0133387652 +0.0134868563 +0.0136363987 +0.0137874043 +0.0139398851 +0.0140938529 +0.0142493199 +0.0144062982 +0.0145647999 +0.0147248373 +0.0148864228 +0.0150495687 +0.0152142874 +0.0153805916 +0.0155484938 +0.0157180067 +0.0158891431 +0.0160619157 +0.0162363374 +0.0164124212 +0.0165901801 +0.0167696272 +0.0169507756 +0.0171336386 +0.0173182294 +0.0175045616 +0.0176926483 +0.0178825033 +0.0180741401 +0.0182675722 +0.0184628135 +0.0186598777 +0.0188587786 +0.0190595303 +0.0192621466 +0.0194666417 +0.0196730296 +0.0198813247 +0.0200915411 +0.0203036932 +0.0205177954 +0.0207338622 +0.0209519081 +0.0211719478 +0.0213939959 +0.0216180672 +0.0218441765 +0.0220723387 +0.0223025688 +0.0225348817 +0.0227692926 +0.0230058166 +0.0232444691 +0.0234852651 +0.0237282202 +0.0239733497 +0.0242206692 +0.0244701942 +0.0247219404 +0.0249759234 +0.025232159 +0.025490663 +0.0257514513 +0.02601454 +0.0262799449 +0.0265476822 +0.0268177681 +0.0270902188 +0.0273650505 +0.0276422796 +0.0279219225 +0.0282039956 +0.0284885156 +0.028775499 +0.0290649625 +0.0293569228 +0.0296513966 +0.0299484009 +0.0302479525 +0.0305500684 +0.0308547656 +0.0311620613 +0.0314719725 +0.0317845164 +0.0320997104 +0.0324175718 +0.0327381179 +0.0330613661 +0.033387334 +0.0337160392 +0.0340474992 +0.0343817316 +0.0347187543 +0.035058585 +0.0354012415 +0.0357467417 +0.0360951035 +0.036446345 +0.0368004842 +0.0371575391 +0.0375175279 +0.0378804688 +0.0382463801 +0.0386152801 +0.038987187 +0.0393621194 +0.0397400955 +0.040121134 +0.0405052534 +0.0408924722 +0.0412828091 +0.0416762828 +0.0420729119 +0.0424727152 +0.0428757116 +0.0432819199 +0.0436913589 +0.0441040477 +0.0445200051 +0.0449392502 +0.0453618021 +0.0457876798 +0.0462169024 +0.0466494892 +0.0470854593 +0.0475248319 +0.0479676264 +0.048413862 +0.0488635581 +0.049316734 +0.0497734091 +0.0502336029 +0.0506973348 +0.0511646244 +0.0516354911 +0.0521099544 +0.052588034 +0.0530697495 +0.0535551205 +0.0540441665 +0.0545369074 +0.0550333627 +0.0555335522 +0.0560374957 +0.0565452128 +0.0570567234 +0.0575720472 +0.0580912041 +0.0586142138 +0.0591410962 +0.0596718712 +0.0602065585 +0.0607451782 +0.0612877499 +0.0618342938 +0.0623848295 +0.0629393772 +0.0634979566 +0.0640605877 +0.0646272903 +0.0651980846 +0.0657729902 +0.0663520273 +0.0669352156 +0.0675225753 +0.068114126 +0.0687098879 +0.0693098807 +0.0699141244 +0.070522639 +0.0711354442 +0.07175256 +0.0723740063 +0.0729998028 +0.0736299695 +0.0742645262 +0.0749034927 +0.0755468888 +0.0761947343 +0.0768470488 +0.0775038523 +0.0781651643 +0.0788310047 +0.0795013929 +0.0801763488 +0.0808558918 +0.0815400417 +0.0822288179 +0.0829222399 +0.0836203273 +0.0843230995 +0.0850305759 +0.085742776 +0.0864597189 +0.0871814242 +0.0879079109 +0.0886391984 +0.0893753058 +0.0901162522 +0.0908620567 +0.0916127384 +0.0923683162 +0.093128809 +0.0938942358 +0.0946646153 +0.0954399664 +0.0962203076 +0.0970056578 +0.0977960354 +0.098591459 +0.099391947 +0.100197518 +0.10100819 +0.101823981 +0.10264491 +0.103470995 +0.104302254 +0.105138704 +0.105980364 +0.106827251 +0.107679384 +0.108536779 +0.109399455 +0.110267429 +0.111140718 +0.112019339 +0.11290331 +0.113792648 +0.114687371 +0.115587494 +0.116493034 +0.117404009 +0.118320436 +0.119242329 +0.120169707 +0.121102586 +0.122040981 +0.122984908 +0.123934385 +0.124889426 +0.125850047 +0.126816265 +0.127788094 +0.12876555 +0.129748648 +0.130737404 +0.131731832 +0.132731948 +0.133737766 +0.134749301 +0.135766568 +0.13678958 +0.137818352 +0.138852899 +0.139893234 +0.140939371 +0.141991323 +0.143049105 +0.14411273 +0.145182211 +0.146257561 +0.147338792 +0.148425919 +0.149518953 +0.150617907 +0.151722794 +0.152833624 +0.153950412 +0.155073167 +0.156201903 +0.15733663 +0.158477359 +0.159624103 +0.160776872 +0.161935676 +0.163100527 +0.164271434 +0.165448408 +0.16663146 +0.167820598 +0.169015833 +0.170217175 +0.171424631 +0.172638213 +0.173857928 +0.175083785 +0.176315793 +0.17755396 +0.178798294 +0.180048804 +0.181305496 +0.182568379 +0.183837459 +0.185112744 +0.186394241 +0.187681956 +0.188975895 +0.190276066 +0.191582473 +0.192895123 +0.194214021 +0.195539172 +0.196870582 +0.198208255 +0.199552196 +0.200902409 +0.202258899 +0.203621669 +0.204990724 +0.206366065 +0.207747697 +0.209135623 +0.210529845 +0.211930365 +0.213337187 +0.214750311 +0.216169739 +0.217595473 +0.219027514 +0.220465862 +0.221910519 +0.223361485 +0.22481876 +0.226282343 +0.227752234 +0.229228433 +0.230710939 +0.23219975 +0.233694864 +0.235196281 +0.236703997 +0.23821801 +0.239738318 +0.241264919 +0.242797807 +0.244336981 +0.245882436 +0.247434168 +0.248992172 +0.250556445 +0.252126981 +0.253703774 +0.25528682 +0.256876111 +0.258471643 +0.260073409 +0.261681401 +0.263295613 +0.264916037 +0.266542666 +0.268175492 +0.269814505 +0.271459698 +0.273111061 +0.274768586 +0.276432262 +0.27810208 +0.27977803 +0.2814601 +0.28314828 +0.284842559 +0.286542925 +0.288249366 +0.28996187 +0.291680425 +0.293405018 +0.295135634 +0.296872262 +0.298614887 +0.300363495 +0.30211807 +0.3038786 +0.305645067 +0.307417457 +0.309195753 +0.31097994 +0.312770001 +0.314565918 +0.316367675 +0.318175254 +0.319988637 +0.321807806 +0.323632741 +0.325463424 +0.327299836 +0.329141956 +0.330989765 +0.332843242 +0.334702366 +0.336567116 +0.338437472 +0.340313409 +0.342194908 +0.344081944 +0.345974495 +0.347872538 +0.349776049 +0.351685004 +0.353599378 +0.355519146 +0.357444285 +0.359374767 +0.361310568 +0.363251661 +0.365198019 +0.367149615 +0.369106422 +0.371068413 +0.373035559 +0.375007832 +0.376985203 +0.378967643 +0.380955122 +0.38294761 +0.384945078 +0.386947494 +0.388954828 +0.390967048 +0.392984122 +0.395006018 +0.397032704 +0.399064146 +0.401100312 +0.403141168 +0.40518668 +0.407236814 +0.409291534 +0.411350807 +0.413414595 +0.415482864 +0.417555577 +0.419632698 +0.421714189 +0.423800014 +0.425890135 +0.427984513 +0.43008311 +0.432185888 +0.434292807 +0.436403828 +0.438518911 +0.440638015 +0.442761101 +0.444888126 +0.44701905 +0.44915383 +0.451292426 +0.453434794 +0.455580891 +0.457730675 +0.459884101 +0.462041127 +0.464201707 +0.466365798 +0.468533353 +0.470704328 +0.472878678 +0.475056355 +0.477237314 +0.479421509 +0.481608891 +0.483799413 +0.485993028 +0.488189688 +0.490389343 +0.492591946 +0.494797447 +0.497005796 +0.499216944 +0.50143084 +0.503647434 +0.505866675 +0.508088512 +0.510312893 +0.512539766 +0.514769079 +0.51700078 +0.519234816 +0.521471133 +0.523709677 +0.525950396 +0.528193235 +0.530438139 +0.532685053 +0.534933923 +0.537184692 +0.539437306 +0.541691708 +0.543947841 +0.546205649 +0.548465075 +0.550726062 +0.552988551 +0.555252486 +0.557517807 +0.559784457 +0.562052375 +0.564321505 +0.566591785 +0.568863156 +0.571135559 +0.573408933 +0.575683217 +0.57795835 +0.580234273 +0.582510922 +0.584788237 +0.587066155 +0.589344615 +0.591623554 +0.59390291 +0.596182618 +0.598462617 +0.600742842 +0.60302323 +0.605303717 +0.607584239 +0.609864731 +0.612145128 +0.614425366 +0.616705379 +0.618985102 +0.621264469 +0.623543415 +0.625821873 +0.628099778 +0.630377061 +0.632653657 +0.634929499 +0.63720452 +0.639478651 +0.641751827 +0.644023978 +0.646295037 +0.648564935 +0.650833605 +0.653100977 +0.655366984 +0.657631555 +0.659894623 +0.662156117 +0.664415968 +0.666674107 +0.668930464 +0.671184968 +0.673437551 +0.675688141 +0.677936668 +0.680183062 +0.682427252 +0.684669167 +0.686908736 +0.689145888 +0.691380552 +0.693612657 +0.69584213 +0.698068901 +0.700292897 +0.702514048 +0.70473228 +0.706947522 +0.709159702 +0.711368747 +0.713574586 +0.715777146 +0.717976353 +0.720172137 +0.722364424 +0.724553141 +0.726738215 +0.728919575 +0.731097146 +0.733270856 +0.735440632 +0.7376064 +0.739768088 +0.741925623 +0.74407893 +0.746227938 +0.748372572 +0.75051276 +0.752648428 +0.754779502 +0.75690591 +0.759027579 +0.761144433 +0.763256401 +0.76536341 +0.767465384 +0.769562252 +0.771653941 +0.773740375 +0.775821483 +0.777897192 +0.779967427 +0.782032116 +0.784091186 +0.786144563 +0.788192174 +0.790233948 +0.792269809 +0.794299687 +0.796323507 +0.798341198 +0.800352686 +0.802357899 +0.804356765 +0.80634921 +0.808335164 +0.810314553 +0.812287305 +0.814253349 +0.816212613 +0.818165024 +0.820110511 +0.822049003 +0.823980428 +0.825904715 +0.827821793 +0.829731591 +0.831634037 +0.833529062 +0.835416594 +0.837296564 +0.8391689 +0.841033534 +0.842890394 +0.844739412 +0.846580518 +0.848413642 +0.850238715 +0.852055669 +0.853864434 +0.855664942 +0.857457124 +0.859240913 +0.861016241 +0.862783039 +0.86454124 +0.866290778 +0.868031584 +0.869763592 +0.871486736 +0.873200948 +0.874906164 +0.876602318 +0.878289342 +0.879967174 +0.881635746 +0.883294995 +0.884944856 +0.886585265 +0.888216158 +0.889837471 +0.89144914 +0.893051104 +0.894643298 +0.896225661 +0.89779813 +0.899360644 +0.900913141 +0.902455559 +0.903987838 +0.905509918 +0.907021737 +0.908523236 +0.910014356 +0.911495037 +0.912965221 +0.914424848 +0.915873861 +0.917312202 +0.918739814 +0.920156638 +0.921562619 +0.922957701 +0.924341826 +0.92571494 +0.927076988 +0.928427914 +0.929767665 +0.931096185 +0.932413422 +0.933719323 +0.935013834 +0.936296902 +0.937568477 +0.938828507 +0.940076939 +0.941313724 +0.942538812 +0.943752152 +0.944953694 +0.946143391 +0.947321192 +0.948487051 +0.94964092 +0.95078275 +0.951912496 +0.953030112 +0.95413555 +0.955228767 +0.956309716 +0.957378354 +0.958434637 +0.95947852 +0.960509961 +0.961528918 +0.962535348 +0.96352921 +0.964510463 +0.965479066 +0.966434978 +0.967378161 +0.968308575 +0.969226182 +0.970130944 +0.971022822 +0.97190178 +0.972767782 +0.973620791 +0.974460772 +0.975287689 +0.976101509 +0.976902197 +0.977689721 +0.978464046 +0.979225141 +0.979972973 +0.980707513 +0.981428728 +0.982136589 +0.982831066 +0.983512129 +0.984179752 +0.984833904 +0.985474559 +0.986101691 +0.986715271 +0.987315276 +0.98790168 +0.988474457 +0.989033584 +0.989579038 +0.990110795 +0.990628832 +0.991133129 +0.991623664 +0.992100416 +0.992563365 +0.993012492 +0.993447777 +0.993869203 +0.994276751 +0.994670404 +0.995050146 +0.99541596 +0.995767831 +0.996105744 +0.996429686 +0.996739641 +0.997035597 +0.997317543 +0.997585464 +0.997839351 +0.998079192 +0.998304978 +0.998516699 +0.998714345 +0.998897909 +0.999067382 +0.999222758 +0.99936403 +0.999491191 +0.999604238 +0.999703164 +0.999787965 +0.999858638 +0.999915181 +0.999957589 +0.999985863 +1 +1 +0.999985863 +0.999957589 +0.999915181 +0.999858638 +0.999787965 +0.999703164 +0.999604238 +0.999491191 +0.99936403 +0.999222758 +0.999067382 +0.998897909 +0.998714345 +0.998516699 +0.998304978 +0.998079192 +0.997839351 +0.997585464 +0.997317543 +0.997035597 +0.996739641 +0.996429686 +0.996105744 +0.995767831 +0.99541596 +0.995050146 +0.994670404 +0.994276751 +0.993869203 +0.993447777 +0.993012492 +0.992563365 +0.992100416 +0.991623664 +0.991133129 +0.990628832 +0.990110795 +0.989579038 +0.989033584 +0.988474457 +0.98790168 +0.987315276 +0.986715271 +0.986101691 +0.985474559 +0.984833904 +0.984179752 +0.983512129 +0.982831066 +0.982136589 +0.981428728 +0.980707513 +0.979972973 +0.979225141 +0.978464046 +0.977689721 +0.976902197 +0.976101509 +0.975287689 +0.974460772 +0.973620791 +0.972767782 +0.97190178 +0.971022822 +0.970130944 +0.969226182 +0.968308575 +0.967378161 +0.966434978 +0.965479066 +0.964510463 +0.96352921 +0.962535348 +0.961528918 +0.960509961 +0.95947852 +0.958434637 +0.957378354 +0.956309716 +0.955228767 +0.95413555 +0.953030112 +0.951912496 +0.95078275 +0.94964092 +0.948487051 +0.947321192 +0.946143391 +0.944953694 +0.943752152 +0.942538812 +0.941313724 +0.940076939 +0.938828507 +0.937568477 +0.936296902 +0.935013834 +0.933719323 +0.932413422 +0.931096185 +0.929767665 +0.928427914 +0.927076988 +0.92571494 +0.924341826 +0.922957701 +0.921562619 +0.920156638 +0.918739814 +0.917312202 +0.915873861 +0.914424848 +0.912965221 +0.911495037 +0.910014356 +0.908523236 +0.907021737 +0.905509918 +0.903987838 +0.902455559 +0.900913141 +0.899360644 +0.89779813 +0.896225661 +0.894643298 +0.893051104 +0.89144914 +0.889837471 +0.888216158 +0.886585265 +0.884944856 +0.883294995 +0.881635746 +0.879967174 +0.878289342 +0.876602318 +0.874906164 +0.873200948 +0.871486736 +0.869763592 +0.868031584 +0.866290778 +0.86454124 +0.862783039 +0.861016241 +0.859240913 +0.857457124 +0.855664942 +0.853864434 +0.852055669 +0.850238715 +0.848413642 +0.846580518 +0.844739412 +0.842890394 +0.841033534 +0.8391689 +0.837296564 +0.835416594 +0.833529062 +0.831634037 +0.829731591 +0.827821793 +0.825904715 +0.823980428 +0.822049003 +0.820110511 +0.818165024 +0.816212613 +0.814253349 +0.812287305 +0.810314553 +0.808335164 +0.80634921 +0.804356765 +0.802357899 +0.800352686 +0.798341198 +0.796323507 +0.794299687 +0.792269809 +0.790233948 +0.788192174 +0.786144563 +0.784091186 +0.782032116 +0.779967427 +0.777897192 +0.775821483 +0.773740375 +0.771653941 +0.769562252 +0.767465384 +0.76536341 +0.763256401 +0.761144433 +0.759027579 +0.75690591 +0.754779502 +0.752648428 +0.75051276 +0.748372572 +0.746227938 +0.74407893 +0.741925623 +0.739768088 +0.7376064 +0.735440632 +0.733270856 +0.731097146 +0.728919575 +0.726738215 +0.724553141 +0.722364424 +0.720172137 +0.717976353 +0.715777146 +0.713574586 +0.711368747 +0.709159702 +0.706947522 +0.70473228 +0.702514048 +0.700292897 +0.698068901 +0.69584213 +0.693612657 +0.691380552 +0.689145888 +0.686908736 +0.684669167 +0.682427252 +0.680183062 +0.677936668 +0.675688141 +0.673437551 +0.671184968 +0.668930464 +0.666674107 +0.664415968 +0.662156117 +0.659894623 +0.657631555 +0.655366984 +0.653100977 +0.650833605 +0.648564935 +0.646295037 +0.644023978 +0.641751827 +0.639478651 +0.63720452 +0.634929499 +0.632653657 +0.630377061 +0.628099778 +0.625821873 +0.623543415 +0.621264469 +0.618985102 +0.616705379 +0.614425366 +0.612145128 +0.609864731 +0.607584239 +0.605303717 +0.60302323 +0.600742842 +0.598462617 +0.596182618 +0.59390291 +0.591623554 +0.589344615 +0.587066155 +0.584788237 +0.582510922 +0.580234273 +0.57795835 +0.575683217 +0.573408933 +0.571135559 +0.568863156 +0.566591785 +0.564321505 +0.562052375 +0.559784457 +0.557517807 +0.555252486 +0.552988551 +0.550726062 +0.548465075 +0.546205649 +0.543947841 +0.541691708 +0.539437306 +0.537184692 +0.534933923 +0.532685053 +0.530438139 +0.528193235 +0.525950396 +0.523709677 +0.521471133 +0.519234816 +0.51700078 +0.514769079 +0.512539766 +0.510312893 +0.508088512 +0.505866675 +0.503647434 +0.50143084 +0.499216944 +0.497005796 +0.494797447 +0.492591946 +0.490389343 +0.488189688 +0.485993028 +0.483799413 +0.481608891 +0.479421509 +0.477237314 +0.475056355 +0.472878678 +0.470704328 +0.468533353 +0.466365798 +0.464201707 +0.462041127 +0.459884101 +0.457730675 +0.455580891 +0.453434794 +0.451292426 +0.44915383 +0.44701905 +0.444888126 +0.442761101 +0.440638015 +0.438518911 +0.436403828 +0.434292807 +0.432185888 +0.43008311 +0.427984513 +0.425890135 +0.423800014 +0.421714189 +0.419632698 +0.417555577 +0.415482864 +0.413414595 +0.411350807 +0.409291534 +0.407236814 +0.40518668 +0.403141168 +0.401100312 +0.399064146 +0.397032704 +0.395006018 +0.392984122 +0.390967048 +0.388954828 +0.386947494 +0.384945078 +0.38294761 +0.380955122 +0.378967643 +0.376985203 +0.375007832 +0.373035559 +0.371068413 +0.369106422 +0.367149615 +0.365198019 +0.363251661 +0.361310568 +0.359374767 +0.357444285 +0.355519146 +0.353599378 +0.351685004 +0.349776049 +0.347872538 +0.345974495 +0.344081944 +0.342194908 +0.340313409 +0.338437472 +0.336567116 +0.334702366 +0.332843242 +0.330989765 +0.329141956 +0.327299836 +0.325463424 +0.323632741 +0.321807806 +0.319988637 +0.318175254 +0.316367675 +0.314565918 +0.312770001 +0.31097994 +0.309195753 +0.307417457 +0.305645067 +0.3038786 +0.30211807 +0.300363495 +0.298614887 +0.296872262 +0.295135634 +0.293405018 +0.291680425 +0.28996187 +0.288249366 +0.286542925 +0.284842559 +0.28314828 +0.2814601 +0.27977803 +0.27810208 +0.276432262 +0.274768586 +0.273111061 +0.271459698 +0.269814505 +0.268175492 +0.266542666 +0.264916037 +0.263295613 +0.261681401 +0.260073409 +0.258471643 +0.256876111 +0.25528682 +0.253703774 +0.252126981 +0.250556445 +0.248992172 +0.247434168 +0.245882436 +0.244336981 +0.242797807 +0.241264919 +0.239738318 +0.23821801 +0.236703997 +0.235196281 +0.233694864 +0.23219975 +0.230710939 +0.229228433 +0.227752234 +0.226282343 +0.22481876 +0.223361485 +0.221910519 +0.220465862 +0.219027514 +0.217595473 +0.216169739 +0.214750311 +0.213337187 +0.211930365 +0.210529845 +0.209135623 +0.207747697 +0.206366065 +0.204990724 +0.203621669 +0.202258899 +0.200902409 +0.199552196 +0.198208255 +0.196870582 +0.195539172 +0.194214021 +0.192895123 +0.191582473 +0.190276066 +0.188975895 +0.187681956 +0.186394241 +0.185112744 +0.183837459 +0.182568379 +0.181305496 +0.180048804 +0.178798294 +0.17755396 +0.176315793 +0.175083785 +0.173857928 +0.172638213 +0.171424631 +0.170217175 +0.169015833 +0.167820598 +0.16663146 +0.165448408 +0.164271434 +0.163100527 +0.161935676 +0.160776872 +0.159624103 +0.158477359 +0.15733663 +0.156201903 +0.155073167 +0.153950412 +0.152833624 +0.151722794 +0.150617907 +0.149518953 +0.148425919 +0.147338792 +0.146257561 +0.145182211 +0.14411273 +0.143049105 +0.141991323 +0.140939371 +0.139893234 +0.138852899 +0.137818352 +0.13678958 +0.135766568 +0.134749301 +0.133737766 +0.132731948 +0.131731832 +0.130737404 +0.129748648 +0.12876555 +0.127788094 +0.126816265 +0.125850047 +0.124889426 +0.123934385 +0.122984908 +0.122040981 +0.121102586 +0.120169707 +0.119242329 +0.118320436 +0.117404009 +0.116493034 +0.115587494 +0.114687371 +0.113792648 +0.11290331 +0.112019339 +0.111140718 +0.110267429 +0.109399455 +0.108536779 +0.107679384 +0.106827251 +0.105980364 +0.105138704 +0.104302254 +0.103470995 +0.10264491 +0.101823981 +0.10100819 +0.100197518 +0.099391947 +0.098591459 +0.0977960354 +0.0970056578 +0.0962203076 +0.0954399664 +0.0946646153 +0.0938942358 +0.093128809 +0.0923683162 +0.0916127384 +0.0908620567 +0.0901162522 +0.0893753058 +0.0886391984 +0.0879079109 +0.0871814242 +0.0864597189 +0.085742776 +0.0850305759 +0.0843230995 +0.0836203273 +0.0829222399 +0.0822288179 +0.0815400417 +0.0808558918 +0.0801763488 +0.0795013929 +0.0788310047 +0.0781651643 +0.0775038523 +0.0768470488 +0.0761947343 +0.0755468888 +0.0749034927 +0.0742645262 +0.0736299695 +0.0729998028 +0.0723740063 +0.07175256 +0.0711354442 +0.070522639 +0.0699141244 +0.0693098807 +0.0687098879 +0.068114126 +0.0675225753 +0.0669352156 +0.0663520273 +0.0657729902 +0.0651980846 +0.0646272903 +0.0640605877 +0.0634979566 +0.0629393772 +0.0623848295 +0.0618342938 +0.0612877499 +0.0607451782 +0.0602065585 +0.0596718712 +0.0591410962 +0.0586142138 +0.0580912041 +0.0575720472 +0.0570567234 +0.0565452128 +0.0560374957 +0.0555335522 +0.0550333627 +0.0545369074 +0.0540441665 +0.0535551205 +0.0530697495 +0.052588034 +0.0521099544 +0.0516354911 +0.0511646244 +0.0506973348 +0.0502336029 +0.0497734091 +0.049316734 +0.0488635581 +0.048413862 +0.0479676264 +0.0475248319 +0.0470854593 +0.0466494892 +0.0462169024 +0.0457876798 +0.0453618021 +0.0449392502 +0.0445200051 +0.0441040477 +0.0436913589 +0.0432819199 +0.0428757116 +0.0424727152 +0.0420729119 +0.0416762828 +0.0412828091 +0.0408924722 +0.0405052534 +0.040121134 +0.0397400955 +0.0393621194 +0.038987187 +0.0386152801 +0.0382463801 +0.0378804688 +0.0375175279 +0.0371575391 +0.0368004842 +0.036446345 +0.0360951035 +0.0357467417 +0.0354012415 +0.035058585 +0.0347187543 +0.0343817316 +0.0340474992 +0.0337160392 +0.033387334 +0.0330613661 +0.0327381179 +0.0324175718 +0.0320997104 +0.0317845164 +0.0314719725 +0.0311620613 +0.0308547656 +0.0305500684 +0.0302479525 +0.0299484009 +0.0296513966 +0.0293569228 +0.0290649625 +0.028775499 +0.0284885156 +0.0282039956 +0.0279219225 +0.0276422796 +0.0273650505 +0.0270902188 +0.0268177681 +0.0265476822 +0.0262799449 +0.02601454 +0.0257514513 +0.025490663 +0.025232159 +0.0249759234 +0.0247219404 +0.0244701942 +0.0242206692 +0.0239733497 +0.0237282202 +0.0234852651 +0.0232444691 +0.0230058166 +0.0227692926 +0.0225348817 +0.0223025688 +0.0220723387 +0.0218441765 +0.0216180672 +0.0213939959 +0.0211719478 +0.0209519081 +0.0207338622 +0.0205177954 +0.0203036932 +0.0200915411 +0.0198813247 +0.0196730296 +0.0194666417 +0.0192621466 +0.0190595303 +0.0188587786 +0.0186598777 +0.0184628135 +0.0182675722 +0.0180741401 +0.0178825033 +0.0176926483 +0.0175045616 +0.0173182294 +0.0171336386 +0.0169507756 +0.0167696272 +0.0165901801 +0.0164124212 +0.0162363374 +0.0160619157 +0.0158891431 +0.0157180067 +0.0155484938 +0.0153805916 +0.0152142874 +0.0150495687 +0.0148864228 +0.0147248373 +0.0145647999 +0.0144062982 +0.0142493199 +0.0140938529 +0.0139398851 +0.0137874043 +0.0136363987 +0.0134868563 +0.0133387652 +0.0131921138 +0.0130468902 +0.0129030829 +0.0127606803 +0.0126196709 +0.0124800432 +0.012341786 +0.0122048879 +0.0120693376 +0.0119351241 +0.0118022362 +0.0116706629 +0.0115403932 +0.0114114163 +0.0112837214 +0.0111572976 +0.0110321344 +0.010908221 +0.0107855469 +0.0106641017 +0.0105438749 +0.0104248561 +0.0103070351 +0.0101904017 +0.0100749456 +0.00996065682 +0.0098475253 +0.00973554106 +0.00962469423 +0.00951497496 +0.00940637348 +0.00929888009 +0.00919248515 +0.00908717908 +0.00898295237 +0.00887979556 +0.00877769927 +0.00867665419 +0.00857665103 +0.00847768062 +0.00837973381 +0.00828280154 +0.00818687478 +0.0080919446 +0.0079980021 +0.00790503846 +0.00781304492 +0.00772201276 +0.00763193336 +0.00754279812 +0.00745459852 +0.00736732611 +0.00728097248 +0.00719552929 +0.00711098826 +0.00702734116 +0.00694457983 +0.00686269617 +0.00678168212 +0.00670152971 +0.00662223099 +0.00654377809 +0.0064661632 +0.00638937857 +0.00631341649 +0.00623826931 +0.00616392945 +0.00609038938 +0.00601764162 +0.00594567876 +0.00587449342 +0.00580407831 +0.00573442616 +0.00566552978 +0.00559738203 +0.00552997581 +0.00546330409 +0.0053973599 +0.00533213629 +0.00526762639 +0.0052038234 +0.00514072052 +0.00507831105 +0.00501658833 +0.00495554574 +0.00489517672 +0.00483547476 +0.0047764334 +0.00471804624 +0.00466030693 +0.00460320915 +0.00454674664 +0.00449091322 +0.00443570271 +0.00438110901 +0.00432712606 +0.00427374787 +0.00422096845 +0.00416878191 +0.00411718238 +0.00406616405 +0.00401572114 +0.00396584793 +0.00391653876 +0.00386778799 +0.00381959004 +0.00377193938 +0.00372483051 +0.00367825801 +0.00363221646 +0.00358670052 +0.00354170487 +0.00349722426 +0.00345325347 +0.00340978732 +0.00336682068 +0.00332434847 +0.00328236564 +0.00324086718 +0.00319984815 +0.00315930362 +0.00311922873 +0.00307961864 +0.00304046856 +0.00300177374 +0.00296352948 +0.00292573111 +0.00288837401 +0.00285145359 +0.00281496531 +0.00277890465 +0.00274326717 +0.00270804842 +0.00267324403 +0.00263884965 +0.00260486097 +0.00257127371 +0.00253808365 +0.00250528658 +0.00247287836 +0.00244085487 +0.00240921201 +0.00237794575 +0.00234705208 +0.00231652702 +0.00228636664 +0.00225656703 +0.00222712434 +0.00219803472 +0.00216929439 +0.00214089959 +0.00211284659 +0.0020851317 +0.00205775127 +0.00203070166 +0.0020039793 +0.00197758063 +0.00195150212 +0.00192574028 +0.00190029166 +0.00187515284 +0.00185032042 +0.00182579103 +0.00180156136 +0.00177762811 +0.00175398801 +0.00173063782 +0.00170757434 +0.00168479441 +0.00166229487 +0.00164007261 +0.00161812455 +0.00159644764 +0.00157503886 +0.0015538952 +0.00153301371 +0.00151239144 +0.0014920255 +0.001471913 +0.00145205108 +0.00143243693 +0.00141306775 +0.00139394077 +0.00137505324 +0.00135640247 +0.00133798575 +0.00131980043 +0.00130184387 +0.00128411346 +0.00126660663 +0.00124932081 +0.00123225348 +0.00121540212 +0.00119876427 +0.00118233746 +0.00116611926 +0.00115010727 +0.0011342991 +0.0011186924 +0.00110328483 +0.00108807409 +0.00107305788 +0.00105823395 +0.00104360005 +0.00102915397 +0.00101489352 +0.00100081651 +0.000986920803 +0.000973204272 +0.000959664811 +0.000946300336 +0.000933108786 +0.00092008812 +0.00090723632 +0.000894551387 +0.000882031344 +0.000869674236 +0.000857478127 + +shape_id 4 +num_samples 2000 +0 +0 +1998 + +shape_id 5 +num_samples 1000 +0.456654876 +0.458088878 +0.459524495 +0.460961715 +0.462400524 +0.46384091 +0.46528286 +0.466726359 +0.468171395 +0.469617955 +0.471066024 +0.47251559 +0.473966638 +0.475419155 +0.476873127 +0.47832854 +0.479785381 +0.481243635 +0.482703288 +0.484164327 +0.485626736 +0.487090502 +0.488555611 +0.490022047 +0.491489797 +0.492958846 +0.494429179 +0.495900782 +0.497373639 +0.498847737 +0.50032306 +0.501799594 +0.503277322 +0.504756231 +0.506236305 +0.507717529 +0.509199888 +0.510683365 +0.512167947 +0.513653617 +0.515140359 +0.516628159 +0.518117001 +0.519606868 +0.521097745 +0.522589617 +0.524082466 +0.525576278 +0.527071036 +0.528566724 +0.530063326 +0.531560826 +0.533059207 +0.534558453 +0.536058547 +0.537559474 +0.539061215 +0.540563756 +0.542067079 +0.543571167 +0.545076004 +0.546581573 +0.548087856 +0.549594837 +0.551102499 +0.552610825 +0.554119797 +0.555629399 +0.557139613 +0.558650421 +0.560161807 +0.561673752 +0.56318624 +0.564699252 +0.566212772 +0.567726781 +0.569241261 +0.570756196 +0.572271566 +0.573787355 +0.575303544 +0.576820115 +0.57833705 +0.579854331 +0.581371939 +0.582889858 +0.584408067 +0.585926549 +0.587445286 +0.588964259 +0.590483449 +0.592002839 +0.593522408 +0.595042139 +0.596562014 +0.598082012 +0.599602116 +0.601122307 +0.602642565 +0.604162872 +0.605683209 +0.607203556 +0.608723895 +0.610244206 +0.61176447 +0.613284669 +0.614804782 +0.61632479 +0.617844674 +0.619364415 +0.620883993 +0.622403388 +0.623922581 +0.625441553 +0.626960283 +0.628478753 +0.629996941 +0.631514829 +0.633032397 +0.634549625 +0.636066492 +0.637582979 +0.639099067 +0.640614734 +0.642129961 +0.643644728 +0.645159015 +0.646672801 +0.648186066 +0.64969879 +0.651210953 +0.652722534 +0.654233513 +0.65574387 +0.657253584 +0.658762634 +0.660271001 +0.661778663 +0.663285601 +0.664791793 +0.666297218 +0.667801857 +0.669305688 +0.670808691 +0.672310844 +0.673812128 +0.675312521 +0.676812002 +0.678310551 +0.679808147 +0.681304768 +0.682800394 +0.684295004 +0.685788576 +0.68728109 +0.688772524 +0.690262858 +0.69175207 +0.693240139 +0.694727045 +0.696212764 +0.697697278 +0.699180564 +0.700662601 +0.702143367 +0.703622842 +0.705101004 +0.706577832 +0.708053304 +0.709527399 +0.711000096 +0.712471373 +0.713941208 +0.715409581 +0.716876469 +0.718341852 +0.719805707 +0.721268014 +0.72272875 +0.724187895 +0.725645426 +0.727101321 +0.728555561 +0.730008122 +0.731458983 +0.732908123 +0.734355519 +0.735801151 +0.737244996 +0.738687034 +0.740127241 +0.741565597 +0.74300208 +0.744436668 +0.745869339 +0.747300073 +0.748728846 +0.750155637 +0.751580426 +0.753003189 +0.754423905 +0.755842552 +0.75725911 +0.758673555 +0.760085866 +0.761496022 +0.762904 +0.76430978 +0.765713339 +0.767114655 +0.768513707 +0.769910473 +0.771304931 +0.772697061 +0.774086839 +0.775474244 +0.776859254 +0.778241849 +0.779622006 +0.780999703 +0.782374918 +0.783747631 +0.78511782 +0.786485462 +0.787850536 +0.789213021 +0.790572894 +0.791930135 +0.793284722 +0.794636633 +0.795985846 +0.797332341 +0.798676095 +0.800017086 +0.801355295 +0.802690698 +0.804023275 +0.805353004 +0.806679864 +0.808003832 +0.809324889 +0.810643012 +0.81195818 +0.813270372 +0.814579566 +0.815885742 +0.817188877 +0.818488951 +0.819785943 +0.82107983 +0.822370593 +0.823658209 +0.824942659 +0.82622392 +0.827501972 +0.828776793 +0.830048363 +0.83131666 +0.832581664 +0.833843354 +0.835101709 +0.836356707 +0.837608329 +0.838856554 +0.840101359 +0.841342726 +0.842580633 +0.843815059 +0.845045985 +0.846273388 +0.84749725 +0.848717548 +0.849934264 +0.851147375 +0.852356863 +0.853562706 +0.854764885 +0.855963378 +0.857158167 +0.85834923 +0.859536547 +0.860720098 +0.861899864 +0.863075824 +0.864247958 +0.865416246 +0.866580669 +0.867741207 +0.868897839 +0.870050546 +0.871199308 +0.872344106 +0.87348492 +0.874621731 +0.875754518 +0.876883263 +0.878007946 +0.879128548 +0.88024505 +0.881357431 +0.882465674 +0.883569758 +0.884669665 +0.885765376 +0.886856872 +0.887944134 +0.889027143 +0.89010588 +0.891180326 +0.892250463 +0.893316273 +0.894377735 +0.895434833 +0.896487548 +0.897535861 +0.898579753 +0.899619208 +0.900654205 +0.901684728 +0.902710758 +0.903732278 +0.904749268 +0.905761712 +0.906769592 +0.907772889 +0.908771587 +0.909765666 +0.910755111 +0.911739903 +0.912720026 +0.913695461 +0.914666191 +0.9156322 +0.91659347 +0.917549983 +0.918501724 +0.919448675 +0.920390819 +0.92132814 +0.92226062 +0.923188244 +0.924110994 +0.925028855 +0.925941809 +0.926849841 +0.927752934 +0.928651072 +0.929544239 +0.930432419 +0.931315596 +0.932193754 +0.933066877 +0.93393495 +0.934797957 +0.935655883 +0.936508712 +0.937356428 +0.938199017 +0.939036464 +0.939868752 +0.940695867 +0.941517795 +0.94233452 +0.943146027 +0.943952303 +0.944753331 +0.945549098 +0.946339589 +0.94712479 +0.947904687 +0.948679265 +0.949448511 +0.95021241 +0.950970948 +0.951724112 +0.952471888 +0.953214262 +0.953951221 +0.954682752 +0.95540884 +0.956129473 +0.956844637 +0.95755432 +0.958258509 +0.958957189 +0.95965035 +0.960337978 +0.96102006 +0.961696583 +0.962367537 +0.963032907 +0.963692683 +0.964346851 +0.964995401 +0.965638319 +0.966275594 +0.966907214 +0.967533168 +0.968153444 +0.968768031 +0.969376917 +0.969980091 +0.970577543 +0.97116926 +0.971755232 +0.972335449 +0.972909898 +0.973478571 +0.974041456 +0.974598543 +0.975149821 +0.975695281 +0.976234912 +0.976768704 +0.977296647 +0.977818732 +0.978334949 +0.978845288 +0.97934974 +0.979848295 +0.980340944 +0.980827678 +0.981308489 +0.981783366 +0.982252301 +0.982715285 +0.983172311 +0.983623368 +0.98406845 +0.984507547 +0.984940651 +0.985367754 +0.985788849 +0.986203928 +0.986612981 +0.987016003 +0.987412986 +0.987803922 +0.988188803 +0.988567623 +0.988940374 +0.98930705 +0.989667644 +0.990022149 +0.990370558 +0.990712864 +0.991049062 +0.991379145 +0.991703107 +0.992020942 +0.992332643 +0.992638206 +0.992937624 +0.993230891 +0.993518003 +0.993798953 +0.994073737 +0.994342349 +0.994604784 +0.994861038 +0.995111105 +0.995354981 +0.995592662 +0.995824142 +0.996049417 +0.996268484 +0.996481338 +0.996687975 +0.996888391 +0.997082583 +0.997270546 +0.997452278 +0.997627774 +0.997797032 +0.997960048 +0.99811682 +0.998267344 +0.998411617 +0.998549637 +0.998681401 +0.998806907 +0.998926152 +0.999039135 +0.999145852 +0.999246302 +0.999340483 +0.999428394 +0.999510032 +0.999585396 +0.999654485 +0.999717297 +0.999773831 +0.999824086 +0.999868062 +0.999905757 +0.99993717 +0.999962302 +0.999981151 +0.999993717 +1 +1 +0.999993717 +0.999981151 +0.999962302 +0.99993717 +0.999905757 +0.999868062 +0.999824086 +0.999773831 +0.999717297 +0.999654485 +0.999585396 +0.999510032 +0.999428394 +0.999340483 +0.999246302 +0.999145852 +0.999039135 +0.998926152 +0.998806907 +0.998681401 +0.998549637 +0.998411617 +0.998267344 +0.99811682 +0.997960048 +0.997797032 +0.997627774 +0.997452278 +0.997270546 +0.997082583 +0.996888391 +0.996687975 +0.996481338 +0.996268484 +0.996049417 +0.995824142 +0.995592662 +0.995354981 +0.995111105 +0.994861038 +0.994604784 +0.994342349 +0.994073737 +0.993798953 +0.993518003 +0.993230891 +0.992937624 +0.992638206 +0.992332643 +0.992020942 +0.991703107 +0.991379145 +0.991049062 +0.990712864 +0.990370558 +0.990022149 +0.989667644 +0.98930705 +0.988940374 +0.988567623 +0.988188803 +0.987803922 +0.987412986 +0.987016003 +0.986612981 +0.986203928 +0.985788849 +0.985367754 +0.984940651 +0.984507547 +0.98406845 +0.983623368 +0.983172311 +0.982715285 +0.982252301 +0.981783366 +0.981308489 +0.980827678 +0.980340944 +0.979848295 +0.97934974 +0.978845288 +0.978334949 +0.977818732 +0.977296647 +0.976768704 +0.976234912 +0.975695281 +0.975149821 +0.974598543 +0.974041456 +0.973478571 +0.972909898 +0.972335449 +0.971755232 +0.97116926 +0.970577543 +0.969980091 +0.969376917 +0.968768031 +0.968153444 +0.967533168 +0.966907214 +0.966275594 +0.965638319 +0.964995401 +0.964346851 +0.963692683 +0.963032907 +0.962367537 +0.961696583 +0.96102006 +0.960337978 +0.95965035 +0.958957189 +0.958258509 +0.95755432 +0.956844637 +0.956129473 +0.95540884 +0.954682752 +0.953951221 +0.953214262 +0.952471888 +0.951724112 +0.950970948 +0.95021241 +0.949448511 +0.948679265 +0.947904687 +0.94712479 +0.946339589 +0.945549098 +0.944753331 +0.943952303 +0.943146027 +0.94233452 +0.941517795 +0.940695867 +0.939868752 +0.939036464 +0.938199017 +0.937356428 +0.936508712 +0.935655883 +0.934797957 +0.93393495 +0.933066877 +0.932193754 +0.931315596 +0.930432419 +0.929544239 +0.928651072 +0.927752934 +0.926849841 +0.925941809 +0.925028855 +0.924110994 +0.923188244 +0.92226062 +0.92132814 +0.920390819 +0.919448675 +0.918501724 +0.917549983 +0.91659347 +0.9156322 +0.914666191 +0.913695461 +0.912720026 +0.911739903 +0.910755111 +0.909765666 +0.908771587 +0.907772889 +0.906769592 +0.905761712 +0.904749268 +0.903732278 +0.902710758 +0.901684728 +0.900654205 +0.899619208 +0.898579753 +0.897535861 +0.896487548 +0.895434833 +0.894377735 +0.893316273 +0.892250463 +0.891180326 +0.89010588 +0.889027143 +0.887944134 +0.886856872 +0.885765376 +0.884669665 +0.883569758 +0.882465674 +0.881357431 +0.88024505 +0.879128548 +0.878007946 +0.876883263 +0.875754518 +0.874621731 +0.87348492 +0.872344106 +0.871199308 +0.870050546 +0.868897839 +0.867741207 +0.866580669 +0.865416246 +0.864247958 +0.863075824 +0.861899864 +0.860720098 +0.859536547 +0.85834923 +0.857158167 +0.855963378 +0.854764885 +0.853562706 +0.852356863 +0.851147375 +0.849934264 +0.848717548 +0.84749725 +0.846273388 +0.845045985 +0.843815059 +0.842580633 +0.841342726 +0.840101359 +0.838856554 +0.837608329 +0.836356707 +0.835101709 +0.833843354 +0.832581664 +0.83131666 +0.830048363 +0.828776793 +0.827501972 +0.82622392 +0.824942659 +0.823658209 +0.822370593 +0.82107983 +0.819785943 +0.818488951 +0.817188877 +0.815885742 +0.814579566 +0.813270372 +0.81195818 +0.810643012 +0.809324889 +0.808003832 +0.806679864 +0.805353004 +0.804023275 +0.802690698 +0.801355295 +0.800017086 +0.798676095 +0.797332341 +0.795985846 +0.794636633 +0.793284722 +0.791930135 +0.790572894 +0.789213021 +0.787850536 +0.786485462 +0.78511782 +0.783747631 +0.782374918 +0.780999703 +0.779622006 +0.778241849 +0.776859254 +0.775474244 +0.774086839 +0.772697061 +0.771304931 +0.769910473 +0.768513707 +0.767114655 +0.765713339 +0.76430978 +0.762904 +0.761496022 +0.760085866 +0.758673555 +0.75725911 +0.755842552 +0.754423905 +0.753003189 +0.751580426 +0.750155637 +0.748728846 +0.747300073 +0.745869339 +0.744436668 +0.74300208 +0.741565597 +0.740127241 +0.738687034 +0.737244996 +0.735801151 +0.734355519 +0.732908123 +0.731458983 +0.730008122 +0.728555561 +0.727101321 +0.725645426 +0.724187895 +0.72272875 +0.721268014 +0.719805707 +0.718341852 +0.716876469 +0.715409581 +0.713941208 +0.712471373 +0.711000096 +0.709527399 +0.708053304 +0.706577832 +0.705101004 +0.703622842 +0.702143367 +0.700662601 +0.699180564 +0.697697278 +0.696212764 +0.694727045 +0.693240139 +0.69175207 +0.690262858 +0.688772524 +0.68728109 +0.685788576 +0.684295004 +0.682800394 +0.681304768 +0.679808147 +0.678310551 +0.676812002 +0.675312521 +0.673812128 +0.672310844 +0.670808691 +0.669305688 +0.667801857 +0.666297218 +0.664791793 +0.663285601 +0.661778663 +0.660271001 +0.658762634 +0.657253584 +0.65574387 +0.654233513 +0.652722534 +0.651210953 +0.64969879 +0.648186066 +0.646672801 +0.645159015 +0.643644728 +0.642129961 +0.640614734 +0.639099067 +0.637582979 +0.636066492 +0.634549625 +0.633032397 +0.631514829 +0.629996941 +0.628478753 +0.626960283 +0.625441553 +0.623922581 +0.622403388 +0.620883993 +0.619364415 +0.617844674 +0.61632479 +0.614804782 +0.613284669 +0.61176447 +0.610244206 +0.608723895 +0.607203556 +0.605683209 +0.604162872 +0.602642565 +0.601122307 +0.599602116 +0.598082012 +0.596562014 +0.595042139 +0.593522408 +0.592002839 +0.590483449 +0.588964259 +0.587445286 +0.585926549 +0.584408067 +0.582889858 +0.581371939 +0.579854331 +0.57833705 +0.576820115 +0.575303544 +0.573787355 +0.572271566 +0.570756196 +0.569241261 +0.567726781 +0.566212772 +0.564699252 +0.56318624 +0.561673752 +0.560161807 +0.558650421 +0.557139613 +0.555629399 +0.554119797 +0.552610825 +0.551102499 +0.549594837 +0.548087856 +0.546581573 +0.545076004 +0.543571167 +0.542067079 +0.540563756 +0.539061215 +0.537559474 +0.536058547 +0.534558453 +0.533059207 +0.531560826 +0.530063326 +0.528566724 +0.527071036 +0.525576278 +0.524082466 +0.522589617 +0.521097745 +0.519606868 +0.518117001 +0.516628159 +0.515140359 +0.513653617 +0.512167947 +0.510683365 +0.509199888 +0.507717529 +0.506236305 +0.504756231 +0.503277322 +0.501799594 +0.50032306 +0.498847737 +0.497373639 +0.495900782 +0.494429179 +0.492958846 +0.491489797 +0.490022047 +0.488555611 +0.487090502 +0.485626736 +0.484164327 +0.482703288 +0.481243635 +0.479785381 +0.47832854 +0.476873127 +0.475419155 +0.473966638 +0.47251559 +0.471066024 +0.469617955 +0.468171395 +0.466726359 +0.46528286 +0.46384091 +0.462400524 +0.460961715 +0.459524495 +0.458088878 +0.456654876 + +shape_id 6 +num_samples 1000 +0.000690849371 +0.000710624765 +0.000730928497 +0.000751773536 +0.000773173138 +0.000795140847 +0.000817690502 +0.000840836245 +0.000864592525 +0.000888974102 +0.000913996054 +0.000939673783 +0.000966023022 +0.000993059837 +0.00102080064 +0.00104926218 +0.00107846158 +0.0011084163 +0.00113914419 +0.00117066344 +0.00120299266 +0.0012361508 +0.00127015726 +0.00130503177 +0.00134079453 +0.00137746612 +0.00141506753 +0.00145362021 +0.00149314601 +0.00153366724 +0.00157520666 +0.00161778746 +0.00166143334 +0.00170616842 +0.00175201733 +0.00179900517 +0.00184715754 +0.00189650054 +0.00194706078 +0.00199886537 +0.00205194197 +0.00210631876 +0.00216202446 +0.00221908833 +0.00227754021 +0.00233741048 +0.00239873012 +0.00246153066 +0.00252584424 +0.0025917036 +0.00265914208 +0.00272819365 +0.00279889288 +0.00287127499 +0.00294537584 +0.00302123195 +0.00309888048 +0.00317835928 +0.00325970685 +0.00334296242 +0.00342816587 +0.00351535782 +0.00360457959 +0.00369587322 +0.00378928148 +0.0038848479 +0.00398261675 +0.00408263306 +0.00418494263 +0.00428959204 +0.00439662867 +0.00450610067 +0.00461805702 +0.00473254751 +0.00484962277 +0.00496933425 +0.00509173424 +0.00521687589 +0.00534481323 +0.00547560114 +0.0056092954 +0.00574595266 +0.0058856305 +0.0060283874 +0.00617428273 +0.00632337684 +0.00647573097 +0.00663140735 +0.00679046913 +0.00695298045 +0.00711900642 +0.00728861311 +0.00746186761 +0.00763883801 +0.00781959338 +0.00800420385 +0.00819274054 +0.00838527562 +0.00858188231 +0.00878263487 +0.00898760863 +0.00919687998 +0.00941052638 +0.00962862638 +0.00985125963 +0.0100785069 +0.0103104499 +0.0105471718 +0.0107887565 +0.0110352893 +0.0112868565 +0.0115435455 +0.0118054451 +0.012072645 +0.0123452361 +0.0126233105 +0.0129069615 +0.0131962835 +0.0134913721 +0.0137923242 +0.0140992378 +0.014412212 +0.0147313473 +0.0150567451 +0.0153885084 +0.0157267411 +0.0160715484 +0.0164230368 +0.016781314 +0.0171464886 +0.017518671 +0.0178979723 +0.0182845051 +0.0186783832 +0.0190797215 +0.0194886363 +0.0199052449 +0.020329666 +0.0207620196 +0.0212024266 +0.0216510094 +0.0221078916 +0.0225731979 +0.0230470542 +0.0235295877 +0.0240209268 +0.024521201 +0.0250305412 +0.0255490792 +0.0260769483 +0.0266142826 +0.0271612178 +0.0277178905 +0.0282844384 +0.0288610005 +0.029447717 +0.030044729 +0.0306521788 +0.03127021 +0.031898967 +0.0325385956 +0.0331892424 +0.0338510551 +0.0345241826 +0.0352087748 +0.0359049826 +0.0366129577 +0.0373328531 +0.0380648225 +0.0388090209 +0.039565604 +0.0403347283 +0.0411165514 +0.0419112318 +0.0427189288 +0.0435398025 +0.0443740139 +0.0452217247 +0.0460830974 +0.0469582953 +0.0478474825 +0.0487508236 +0.0496684839 +0.0506006296 +0.0515474272 +0.052509044 +0.0534856478 +0.0544774069 +0.0554844901 +0.0565070669 +0.0575453068 +0.0585993802 +0.0596694575 +0.0607557095 +0.0618583076 +0.0629774231 +0.0641132278 +0.0652658935 +0.0664355923 +0.0676224963 +0.0688267779 +0.0700486094 +0.071288163 +0.0725456109 +0.0738211255 +0.0751148788 +0.0764270426 +0.0777577886 +0.0791072882 +0.0804757126 +0.0818632326 +0.0832700184 +0.0846962401 +0.0861420669 +0.0876076679 +0.0890932112 +0.0905988645 +0.0921247948 +0.0936711681 +0.0952381499 +0.0968259047 +0.098434596 +0.100064387 +0.101715438 +0.10338791 +0.105081963 +0.106797755 +0.108535443 +0.110295182 +0.112077126 +0.113881429 +0.115708241 +0.117557712 +0.119429991 +0.121325223 +0.123243553 +0.125185125 +0.127150078 +0.129138553 +0.131150685 +0.133186611 +0.135246462 +0.137330369 +0.139438461 +0.141570863 +0.143727699 +0.14590909 +0.148115155 +0.150346008 +0.152601764 +0.154882533 +0.157188422 +0.159519536 +0.161875977 +0.164257843 +0.16666523 +0.16909823 +0.171556932 +0.174041423 +0.176551784 +0.179088095 +0.18165043 +0.184238862 +0.186853458 +0.189494284 +0.192161398 +0.194854859 +0.197574718 +0.200321025 +0.203093823 +0.205893153 +0.208719052 +0.21157155 +0.214450675 +0.21735645 +0.220288894 +0.22324802 +0.226233837 +0.22924635 +0.232285558 +0.235351455 +0.238444033 +0.241563275 +0.244709161 +0.247881666 +0.251080759 +0.254306404 +0.257558561 +0.260837183 +0.264142217 +0.267473606 +0.270831288 +0.274215194 +0.277625249 +0.281061373 +0.284523481 +0.288011482 +0.291525276 +0.295064763 +0.29862983 +0.302220365 +0.305836244 +0.309477341 +0.313143521 +0.316834644 +0.320550565 +0.32429113 +0.328056181 +0.331845553 +0.335659074 +0.339496565 +0.343357842 +0.347242714 +0.351150984 +0.355082446 +0.359036891 +0.3630141 +0.36701385 +0.37103591 +0.375080043 +0.379146003 +0.383233541 +0.387342398 +0.391472311 +0.395623008 +0.399794211 +0.403985636 +0.408196991 +0.412427978 +0.416678291 +0.420947619 +0.425235644 +0.42954204 +0.433866474 +0.438208609 +0.442568097 +0.446944588 +0.451337722 +0.455747132 +0.460172447 +0.464613288 +0.469069269 +0.473539997 +0.478025074 +0.482524094 +0.487036645 +0.49156231 +0.496100662 +0.500651272 +0.505213701 +0.509787507 +0.514372238 +0.518967439 +0.523572647 +0.528187394 +0.532811205 +0.537443601 +0.542084095 +0.546732195 +0.551387403 +0.556049215 +0.560717123 +0.565390611 +0.570069161 +0.574752245 +0.579439334 +0.584129891 +0.588823375 +0.593519241 +0.598216937 +0.602915906 +0.60761559 +0.612315421 +0.61701483 +0.621713244 +0.626410082 +0.631104763 +0.6357967 +0.6404853 +0.64516997 +0.64985011 +0.654525119 +0.65919439 +0.663857313 +0.668513278 +0.673161666 +0.677801861 +0.682433239 +0.687055177 +0.691667047 +0.69626822 +0.700858063 +0.705435942 +0.710001221 +0.714553262 +0.719091424 +0.723615065 +0.728123543 +0.732616212 +0.737092426 +0.74155154 +0.745992904 +0.75041587 +0.754819789 +0.759204011 +0.763567887 +0.767910765 +0.772231996 +0.77653093 +0.780806918 +0.785059309 +0.789287457 +0.793490713 +0.79766843 +0.801819964 +0.80594467 +0.810041905 +0.814111029 +0.818151402 +0.822162388 +0.826143351 +0.830093658 +0.83401268 +0.837899789 +0.841754359 +0.845575771 +0.849363404 +0.853116643 +0.856834878 +0.8605175 +0.864163903 +0.86777349 +0.871345662 +0.874879829 +0.878375403 +0.881831801 +0.885248445 +0.888624763 +0.891960188 +0.895254155 +0.898506109 +0.901715497 +0.904881775 +0.908004403 +0.911082846 +0.914116578 +0.917105078 +0.92004783 +0.922944327 +0.925794069 +0.92859656 +0.931351314 +0.934057852 +0.936715701 +0.939324396 +0.941883481 +0.944392505 +0.946851028 +0.949258617 +0.951614845 +0.953919298 +0.956171565 +0.958371248 +0.960517955 +0.962611305 +0.964650924 +0.966636447 +0.968567519 +0.970443795 +0.972264938 +0.974030621 +0.975740526 +0.977394345 +0.97899178 +0.980532544 +0.982016356 +0.98344295 +0.984812066 +0.986123457 +0.987376884 +0.988572121 +0.989708948 +0.990787161 +0.991806562 +0.992766966 +0.993668198 +0.994510094 +0.995292498 +0.99601527 +0.996678276 +0.997281396 +0.997824519 +0.998307546 +0.998730388 +0.999092968 +0.99939522 +0.999637087 +0.999818527 +0.999939505 +1 +1 +0.999939505 +0.999818527 +0.999637087 +0.99939522 +0.999092968 +0.998730388 +0.998307546 +0.997824519 +0.997281396 +0.996678276 +0.99601527 +0.995292498 +0.994510094 +0.993668198 +0.992766966 +0.991806562 +0.990787161 +0.989708948 +0.988572121 +0.987376884 +0.986123457 +0.984812066 +0.98344295 +0.982016356 +0.980532544 +0.97899178 +0.977394345 +0.975740526 +0.974030621 +0.972264938 +0.970443795 +0.968567519 +0.966636447 +0.964650924 +0.962611305 +0.960517955 +0.958371248 +0.956171565 +0.953919298 +0.951614845 +0.949258617 +0.946851028 +0.944392505 +0.941883481 +0.939324396 +0.936715701 +0.934057852 +0.931351314 +0.92859656 +0.925794069 +0.922944327 +0.92004783 +0.917105078 +0.914116578 +0.911082846 +0.908004403 +0.904881775 +0.901715497 +0.898506109 +0.895254155 +0.891960188 +0.888624763 +0.885248445 +0.881831801 +0.878375403 +0.874879829 +0.871345662 +0.86777349 +0.864163903 +0.8605175 +0.856834878 +0.853116643 +0.849363404 +0.845575771 +0.841754359 +0.837899789 +0.83401268 +0.830093658 +0.826143351 +0.822162388 +0.818151402 +0.814111029 +0.810041905 +0.80594467 +0.801819964 +0.79766843 +0.793490713 +0.789287457 +0.785059309 +0.780806918 +0.77653093 +0.772231996 +0.767910765 +0.763567887 +0.759204011 +0.754819789 +0.75041587 +0.745992904 +0.74155154 +0.737092426 +0.732616212 +0.728123543 +0.723615065 +0.719091424 +0.714553262 +0.710001221 +0.705435942 +0.700858063 +0.69626822 +0.691667047 +0.687055177 +0.682433239 +0.677801861 +0.673161666 +0.668513278 +0.663857313 +0.65919439 +0.654525119 +0.64985011 +0.64516997 +0.6404853 +0.6357967 +0.631104763 +0.626410082 +0.621713244 +0.61701483 +0.612315421 +0.60761559 +0.602915906 +0.598216937 +0.593519241 +0.588823375 +0.584129891 +0.579439334 +0.574752245 +0.570069161 +0.565390611 +0.560717123 +0.556049215 +0.551387403 +0.546732195 +0.542084095 +0.537443601 +0.532811205 +0.528187394 +0.523572647 +0.518967439 +0.514372238 +0.509787507 +0.505213701 +0.500651272 +0.496100662 +0.49156231 +0.487036645 +0.482524094 +0.478025074 +0.473539997 +0.469069269 +0.464613288 +0.460172447 +0.455747132 +0.451337722 +0.446944588 +0.442568097 +0.438208609 +0.433866474 +0.42954204 +0.425235644 +0.420947619 +0.416678291 +0.412427978 +0.408196991 +0.403985636 +0.399794211 +0.395623008 +0.391472311 +0.387342398 +0.383233541 +0.379146003 +0.375080043 +0.37103591 +0.36701385 +0.3630141 +0.359036891 +0.355082446 +0.351150984 +0.347242714 +0.343357842 +0.339496565 +0.335659074 +0.331845553 +0.328056181 +0.32429113 +0.320550565 +0.316834644 +0.313143521 +0.309477341 +0.305836244 +0.302220365 +0.29862983 +0.295064763 +0.291525276 +0.288011482 +0.284523481 +0.281061373 +0.277625249 +0.274215194 +0.270831288 +0.267473606 +0.264142217 +0.260837183 +0.257558561 +0.254306404 +0.251080759 +0.247881666 +0.244709161 +0.241563275 +0.238444033 +0.235351455 +0.232285558 +0.22924635 +0.226233837 +0.22324802 +0.220288894 +0.21735645 +0.214450675 +0.21157155 +0.208719052 +0.205893153 +0.203093823 +0.200321025 +0.197574718 +0.194854859 +0.192161398 +0.189494284 +0.186853458 +0.184238862 +0.18165043 +0.179088095 +0.176551784 +0.174041423 +0.171556932 +0.16909823 +0.16666523 +0.164257843 +0.161875977 +0.159519536 +0.157188422 +0.154882533 +0.152601764 +0.150346008 +0.148115155 +0.14590909 +0.143727699 +0.141570863 +0.139438461 +0.137330369 +0.135246462 +0.133186611 +0.131150685 +0.129138553 +0.127150078 +0.125185125 +0.123243553 +0.121325223 +0.119429991 +0.117557712 +0.115708241 +0.113881429 +0.112077126 +0.110295182 +0.108535443 +0.106797755 +0.105081963 +0.10338791 +0.101715438 +0.100064387 +0.098434596 +0.0968259047 +0.0952381499 +0.0936711681 +0.0921247948 +0.0905988645 +0.0890932112 +0.0876076679 +0.0861420669 +0.0846962401 +0.0832700184 +0.0818632326 +0.0804757126 +0.0791072882 +0.0777577886 +0.0764270426 +0.0751148788 +0.0738211255 +0.0725456109 +0.071288163 +0.0700486094 +0.0688267779 +0.0676224963 +0.0664355923 +0.0652658935 +0.0641132278 +0.0629774231 +0.0618583076 +0.0607557095 +0.0596694575 +0.0585993802 +0.0575453068 +0.0565070669 +0.0554844901 +0.0544774069 +0.0534856478 +0.052509044 +0.0515474272 +0.0506006296 +0.0496684839 +0.0487508236 +0.0478474825 +0.0469582953 +0.0460830974 +0.0452217247 +0.0443740139 +0.0435398025 +0.0427189288 +0.0419112318 +0.0411165514 +0.0403347283 +0.039565604 +0.0388090209 +0.0380648225 +0.0373328531 +0.0366129577 +0.0359049826 +0.0352087748 +0.0345241826 +0.0338510551 +0.0331892424 +0.0325385956 +0.031898967 +0.03127021 +0.0306521788 +0.030044729 +0.029447717 +0.0288610005 +0.0282844384 +0.0277178905 +0.0271612178 +0.0266142826 +0.0260769483 +0.0255490792 +0.0250305412 +0.024521201 +0.0240209268 +0.0235295877 +0.0230470542 +0.0225731979 +0.0221078916 +0.0216510094 +0.0212024266 +0.0207620196 +0.020329666 +0.0199052449 +0.0194886363 +0.0190797215 +0.0186783832 +0.0182845051 +0.0178979723 +0.017518671 +0.0171464886 +0.016781314 +0.0164230368 +0.0160715484 +0.0157267411 +0.0153885084 +0.0150567451 +0.0147313473 +0.014412212 +0.0140992378 +0.0137923242 +0.0134913721 +0.0131962835 +0.0129069615 +0.0126233105 +0.0123452361 +0.012072645 +0.0118054451 +0.0115435455 +0.0112868565 +0.0110352893 +0.0107887565 +0.0105471718 +0.0103104499 +0.0100785069 +0.00985125963 +0.00962862638 +0.00941052638 +0.00919687998 +0.00898760863 +0.00878263487 +0.00858188231 +0.00838527562 +0.00819274054 +0.00800420385 +0.00781959338 +0.00763883801 +0.00746186761 +0.00728861311 +0.00711900642 +0.00695298045 +0.00679046913 +0.00663140735 +0.00647573097 +0.00632337684 +0.00617428273 +0.0060283874 +0.0058856305 +0.00574595266 +0.0056092954 +0.00547560114 +0.00534481323 +0.00521687589 +0.00509173424 +0.00496933425 +0.00484962277 +0.00473254751 +0.00461805702 +0.00450610067 +0.00439662867 +0.00428959204 +0.00418494263 +0.00408263306 +0.00398261675 +0.0038848479 +0.00378928148 +0.00369587322 +0.00360457959 +0.00351535782 +0.00342816587 +0.00334296242 +0.00325970685 +0.00317835928 +0.00309888048 +0.00302123195 +0.00294537584 +0.00287127499 +0.00279889288 +0.00272819365 +0.00265914208 +0.0025917036 +0.00252584424 +0.00246153066 +0.00239873012 +0.00233741048 +0.00227754021 +0.00221908833 +0.00216202446 +0.00210631876 +0.00205194197 +0.00199886537 +0.00194706078 +0.00189650054 +0.00184715754 +0.00179900517 +0.00175201733 +0.00170616842 +0.00166143334 +0.00161778746 +0.00157520666 +0.00153366724 +0.00149314601 +0.00145362021 +0.00141506753 +0.00137746612 +0.00134079453 +0.00130503177 +0.00127015726 +0.0012361508 +0.00120299266 +0.00117066344 +0.00113914419 +0.0011084163 +0.00107846158 +0.00104926218 +0.00102080064 +0.000993059837 +0.000966023022 +0.000939673783 +0.000913996054 +0.000888974102 +0.000864592525 +0.000840836245 +0.000817690502 +0.000795140847 +0.000773173138 +0.000751773536 +0.000730928497 +0.000710624765 +0.000690849371 + +# Comment added to ensure editors preserve the preceding blank line. Pypulseq hangs if it is not present. diff --git a/test/test_data/pulseq/1.5.0/sinc_pulses.seq b/test/test_data/pulseq/1.5.0/sinc_pulses.seq new file mode 100644 index 00000000..1f2c69e7 --- /dev/null +++ b/test/test_data/pulseq/1.5.0/sinc_pulses.seq @@ -0,0 +1,5098 @@ +# Pulseq sequence file +# Created by MATLAB mr toolbox + +[VERSION] +major 1 +minor 5 +revision 0 + +[DEFINITIONS] +AdcRasterTime 1e-07 +BlockDurationRaster 1e-05 +GradientRasterTime 1e-05 +RadiofrequencyRasterTime 1e-06 + +# Format of blocks: +# NUM DUR RF GX GY GZ ADC EXT +[BLOCKS] + 1 100 1 0 0 0 0 0 + 2 100000 0 0 0 0 0 0 + 3 200 2 0 0 0 0 0 + 4 100000 0 0 0 0 0 0 + 5 100 3 0 0 0 0 0 + 6 100000 0 0 0 0 0 0 + 7 100 3 0 0 0 0 0 + 8 100000 0 0 0 0 0 0 + 9 200 4 0 0 0 0 0 +10 100000 0 0 0 0 0 0 +11 100 5 0 0 0 0 0 +12 100000 0 0 0 0 0 0 +13 100 6 0 0 0 0 0 +14 100000 0 0 0 0 0 0 +15 100 7 0 0 0 0 0 + +# Format of RF events: +# id ampl. mag_id phase_id time_shape_id center delay freqPPM phasePPM freq phase use +# .. Hz .. .. .. us us ppm rad/MHz Hz rad .. +# Field 'use' is the initial of: excitation refocusing inversion saturation preparation other undefined +[RF] +1 705.139 1 2 0 500 0 0 0 0 0 u +2 705.139 1 2 0 500 1000 0 0 0 0 u +3 1107.63 1 2 0 500 0 0 0 0 0 u +4 553.817 3 4 0 1000 0 0 0 0 1.5708 u +5 1107.63 1 2 0 500 0 0 0 1000 1.5708 u +6 286.482 5 6 0 500 0 0 0 0 0 u +7 1081.31 7 2 0 500 0 0 0 0 0 u + +# Sequence Shapes +[SHAPES] + +shape_id 1 +num_samples 1000 +0.001001001 +0.00300886869 +0.00502433213 +0.00704711925 +0.00907695593 +0.011113566 +0.0131566713 +0.0152059917 +0.017261245 +0.0193221473 +0.0213884125 +0.023459753 +0.0255358792 +0.0276164996 +0.0297013211 +0.0317900488 +0.0338823861 +0.0359780348 +0.0380766951 +0.0401780654 +0.0422818427 +0.0443877225 +0.0464953987 +0.0486045638 +0.050714909 +0.0528261238 +0.0549378966 +0.0570499144 +0.0591618631 +0.0612734269 +0.0633842894 +0.0654941325 +0.0676026372 +0.0697094836 +0.0718143503 +0.0739169152 +0.0760168551 +0.078113846 +0.0802075628 +0.0822976796 +0.0843838697 +0.0864658057 +0.0885431592 +0.0906156012 +0.0926828023 +0.0947444321 +0.0968001597 +0.0988496537 +0.100892582 +0.102928613 +0.104957413 +0.106978649 +0.108991988 +0.110997095 +0.112993637 +0.114981279 +0.116959687 +0.118928525 +0.12088746 +0.122836156 +0.124774278 +0.126701492 +0.128617463 +0.130521856 +0.132414336 +0.134294569 +0.136162222 +0.13801696 +0.139858449 +0.141686357 +0.143500351 +0.145300098 +0.147085267 +0.148855526 +0.150610545 +0.152349994 +0.154073542 +0.155780861 +0.157471624 +0.159145503 +0.160802171 +0.162441303 +0.164062574 +0.165665662 +0.167250242 +0.168815993 +0.170362595 +0.171889728 +0.173397074 +0.174884316 +0.176351138 +0.177797226 +0.179222265 +0.180625945 +0.182007955 +0.183367986 +0.184705731 +0.186020883 +0.187313138 +0.188582193 +0.189827748 +0.191049503 +0.19224716 +0.193420424 +0.194569001 +0.195692597 +0.196790924 +0.197863693 +0.198910617 +0.199931412 +0.200925797 +0.20189349 +0.202834214 +0.203747694 +0.204633655 +0.205491826 +0.206321939 +0.207123726 +0.207896924 +0.20864127 +0.209356505 +0.210042373 +0.210698618 +0.211324989 +0.211921237 +0.212487114 +0.213022378 +0.213526787 +0.214000102 +0.214442088 +0.214852512 +0.215231144 +0.215577756 +0.215892124 +0.216174028 +0.216423248 +0.21663957 +0.216822781 +0.216972672 +0.217089037 +0.217171673 +0.217220381 +0.217234963 +0.217215227 +0.217160983 +0.217072044 +0.216948227 +0.216789351 +0.21659524 +0.216365722 +0.216100625 +0.215799784 +0.215463037 +0.215090223 +0.214681188 +0.214235779 +0.213753848 +0.21323525 +0.212679844 +0.212087492 +0.211458061 +0.210791421 +0.210087446 +0.209346012 +0.208567002 +0.2077503 +0.206895796 +0.206003383 +0.205072957 +0.20410442 +0.203097675 +0.202052632 +0.200969203 +0.199847305 +0.198686858 +0.197487787 +0.196250022 +0.194973494 +0.19365814 +0.192303903 +0.190910725 +0.189478558 +0.188007355 +0.186497072 +0.184947672 +0.18335912 +0.181731387 +0.180064448 +0.17835828 +0.176612867 +0.174828196 +0.173004258 +0.171141048 +0.169238568 +0.16729682 +0.165315814 +0.163295562 +0.161236081 +0.159137394 +0.156999525 +0.154822505 +0.152606368 +0.150351154 +0.148056905 +0.14572367 +0.143351499 +0.14094045 +0.138490582 +0.136001962 +0.133474658 +0.130908744 +0.128304299 +0.125661404 +0.122980148 +0.12026062 +0.117502918 +0.11470714 +0.111873391 +0.10900178 +0.10609242 +0.103145429 +0.100160928 +0.0971390435 +0.0940799061 +0.0909836506 +0.0878504161 +0.0846803461 +0.0814735886 +0.0782302954 +0.0749506232 +0.0716347325 +0.0682827884 +0.06489496 +0.0614714209 +0.0580123489 +0.0545179258 +0.0509883379 +0.0474237756 +0.0438244335 +0.0401905103 +0.036522209 +0.0328197366 +0.0290833045 +0.0253131278 +0.0215094262 +0.017672423 +0.013802346 +0.00989942667 +0.00596390077 +0.00199600798 +0.00200400802 +0.00603589957 +0.0100994151 +0.014194299 +0.0183202919 +0.0224771304 +0.0266645474 +0.0308822718 +0.0351300286 +0.0394075394 +0.0437145216 +0.0480506891 +0.052415752 +0.0568094167 +0.0612313859 +0.0656813588 +0.0701590308 +0.0746640938 +0.0791962362 +0.0837551428 +0.0883404949 +0.0929519703 +0.0975892434 +0.102251985 +0.106939863 +0.111652542 +0.116389682 +0.121150942 +0.125935975 +0.130744433 +0.135575963 +0.140430211 +0.145306818 +0.150205423 +0.155125662 +0.160067166 +0.165029566 +0.170012488 +0.175015557 +0.180038392 +0.185080612 +0.190141832 +0.195221664 +0.200319719 +0.205435603 +0.210568921 +0.215719275 +0.220886263 +0.226069483 +0.231268529 +0.236482993 +0.241712464 +0.246956529 +0.252214773 +0.257486779 +0.262772126 +0.268070393 +0.273381155 +0.278703987 +0.28403846 +0.289384144 +0.294740606 +0.300107413 +0.305484129 +0.310870314 +0.316265531 +0.321669336 +0.327081288 +0.332500941 +0.337927849 +0.343361564 +0.348801637 +0.354247615 +0.359699048 +0.365155482 +0.37061646 +0.376081527 +0.381550226 +0.387022096 +0.39249668 +0.397973514 +0.403452138 +0.408932089 +0.414412901 +0.419894111 +0.425375253 +0.430855859 +0.436335464 +0.441813598 +0.447289793 +0.452763581 +0.45823449 +0.463702052 +0.469165794 +0.474625247 +0.480079938 +0.485529396 +0.490973149 +0.496410725 +0.501841651 +0.507265454 +0.512681663 +0.518089805 +0.523489407 +0.528879998 +0.534261104 +0.539632255 +0.544992978 +0.550342802 +0.555681256 +0.561007869 +0.566322172 +0.571623694 +0.576911968 +0.582186523 +0.587446893 +0.59269261 +0.597923209 +0.603138223 +0.608337189 +0.613519643 +0.618685121 +0.623833162 +0.628963307 +0.634075094 +0.639168067 +0.644241768 +0.64929574 +0.654329531 +0.659342686 +0.664334755 +0.669305286 +0.674253831 +0.679179944 +0.684083178 +0.68896309 +0.693819238 +0.698651182 +0.703458483 +0.708240704 +0.71299741 +0.71772817 +0.722432552 +0.727110128 +0.73176047 +0.736383155 +0.74097776 +0.745543866 +0.750081054 +0.75458891 +0.759067019 +0.763514973 +0.767932362 +0.772318781 +0.776673827 +0.7809971 +0.785288201 +0.789546737 +0.793772314 +0.797964543 +0.802123037 +0.806247413 +0.81033729 +0.814392289 +0.818412036 +0.822396158 +0.826344288 +0.830256059 +0.834131108 +0.837969077 +0.841769609 +0.845532351 +0.849256954 +0.852943072 +0.856590361 +0.860198484 +0.863767103 +0.867295886 +0.870784505 +0.874232635 +0.877639954 +0.881006143 +0.88433089 +0.887613883 +0.890854815 +0.894053384 +0.897209291 +0.90032224 +0.90339194 +0.906418104 +0.909400448 +0.912338693 +0.915232564 +0.918081788 +0.920886099 +0.923645234 +0.926358934 +0.929026944 +0.931649012 +0.934224894 +0.936754347 +0.939237132 +0.941673017 +0.944061772 +0.946403173 +0.948696999 +0.950943034 +0.953141066 +0.955290889 +0.9573923 +0.9594451 +0.961449097 +0.963404101 +0.965309928 +0.967166397 +0.968973335 +0.97073057 +0.972437936 +0.974095272 +0.975702422 +0.977259233 +0.978765559 +0.980221257 +0.98162619 +0.982980225 +0.984283233 +0.985535092 +0.986735684 +0.987884894 +0.988982613 +0.990028739 +0.991023172 +0.991965817 +0.992856587 +0.993695395 +0.994482164 +0.995216818 +0.995899288 +0.996529509 +0.997107422 +0.997632971 +0.998106108 +0.998526787 +0.998894968 +0.999210617 +0.999473703 +0.999684202 +0.999842093 +0.999947363 +1 +1 +0.999947363 +0.999842093 +0.999684202 +0.999473703 +0.999210617 +0.998894968 +0.998526787 +0.998106108 +0.997632971 +0.997107422 +0.996529509 +0.995899288 +0.995216818 +0.994482164 +0.993695395 +0.992856587 +0.991965817 +0.991023172 +0.990028739 +0.988982613 +0.987884894 +0.986735684 +0.985535092 +0.984283233 +0.982980225 +0.98162619 +0.980221257 +0.978765559 +0.977259233 +0.975702422 +0.974095272 +0.972437936 +0.97073057 +0.968973335 +0.967166397 +0.965309928 +0.963404101 +0.961449097 +0.9594451 +0.9573923 +0.955290889 +0.953141066 +0.950943034 +0.948696999 +0.946403173 +0.944061772 +0.941673017 +0.939237132 +0.936754347 +0.934224894 +0.931649012 +0.929026944 +0.926358934 +0.923645234 +0.920886099 +0.918081788 +0.915232564 +0.912338693 +0.909400448 +0.906418104 +0.90339194 +0.90032224 +0.897209291 +0.894053384 +0.890854815 +0.887613883 +0.88433089 +0.881006143 +0.877639954 +0.874232635 +0.870784505 +0.867295886 +0.863767103 +0.860198484 +0.856590361 +0.852943072 +0.849256954 +0.845532351 +0.841769609 +0.837969077 +0.834131108 +0.830256059 +0.826344288 +0.822396158 +0.818412036 +0.814392289 +0.81033729 +0.806247413 +0.802123037 +0.797964543 +0.793772314 +0.789546737 +0.785288201 +0.7809971 +0.776673827 +0.772318781 +0.767932362 +0.763514973 +0.759067019 +0.75458891 +0.750081054 +0.745543866 +0.74097776 +0.736383155 +0.73176047 +0.727110128 +0.722432552 +0.71772817 +0.71299741 +0.708240704 +0.703458483 +0.698651182 +0.693819238 +0.68896309 +0.684083178 +0.679179944 +0.674253831 +0.669305286 +0.664334755 +0.659342686 +0.654329531 +0.64929574 +0.644241768 +0.639168067 +0.634075094 +0.628963307 +0.623833162 +0.618685121 +0.613519643 +0.608337189 +0.603138223 +0.597923209 +0.59269261 +0.587446893 +0.582186523 +0.576911968 +0.571623694 +0.566322172 +0.561007869 +0.555681256 +0.550342802 +0.544992978 +0.539632255 +0.534261104 +0.528879998 +0.523489407 +0.518089805 +0.512681663 +0.507265454 +0.501841651 +0.496410725 +0.490973149 +0.485529396 +0.480079938 +0.474625247 +0.469165794 +0.463702052 +0.45823449 +0.452763581 +0.447289793 +0.441813598 +0.436335464 +0.430855859 +0.425375253 +0.419894111 +0.414412901 +0.408932089 +0.403452138 +0.397973514 +0.39249668 +0.387022096 +0.381550226 +0.376081527 +0.37061646 +0.365155482 +0.359699048 +0.354247615 +0.348801637 +0.343361564 +0.337927849 +0.332500941 +0.327081288 +0.321669336 +0.316265531 +0.310870314 +0.305484129 +0.300107413 +0.294740606 +0.289384144 +0.28403846 +0.278703987 +0.273381155 +0.268070393 +0.262772126 +0.257486779 +0.252214773 +0.246956529 +0.241712464 +0.236482993 +0.231268529 +0.226069483 +0.220886263 +0.215719275 +0.210568921 +0.205435603 +0.200319719 +0.195221664 +0.190141832 +0.185080612 +0.180038392 +0.175015557 +0.170012488 +0.165029566 +0.160067166 +0.155125662 +0.150205423 +0.145306818 +0.140430211 +0.135575963 +0.130744433 +0.125935975 +0.121150942 +0.116389682 +0.111652542 +0.106939863 +0.102251985 +0.0975892434 +0.0929519703 +0.0883404949 +0.0837551428 +0.0791962362 +0.0746640938 +0.0701590308 +0.0656813588 +0.0612313859 +0.0568094167 +0.052415752 +0.0480506891 +0.0437145216 +0.0394075394 +0.0351300286 +0.0308822718 +0.0266645474 +0.0224771304 +0.0183202919 +0.014194299 +0.0100994151 +0.00603589957 +0.00200400802 +0.00199600798 +0.00596390077 +0.00989942667 +0.013802346 +0.017672423 +0.0215094262 +0.0253131278 +0.0290833045 +0.0328197366 +0.036522209 +0.0401905103 +0.0438244335 +0.0474237756 +0.0509883379 +0.0545179258 +0.0580123489 +0.0614714209 +0.06489496 +0.0682827884 +0.0716347325 +0.0749506232 +0.0782302954 +0.0814735886 +0.0846803461 +0.0878504161 +0.0909836506 +0.0940799061 +0.0971390435 +0.100160928 +0.103145429 +0.10609242 +0.10900178 +0.111873391 +0.11470714 +0.117502918 +0.12026062 +0.122980148 +0.125661404 +0.128304299 +0.130908744 +0.133474658 +0.136001962 +0.138490582 +0.14094045 +0.143351499 +0.14572367 +0.148056905 +0.150351154 +0.152606368 +0.154822505 +0.156999525 +0.159137394 +0.161236081 +0.163295562 +0.165315814 +0.16729682 +0.169238568 +0.171141048 +0.173004258 +0.174828196 +0.176612867 +0.17835828 +0.180064448 +0.181731387 +0.18335912 +0.184947672 +0.186497072 +0.188007355 +0.189478558 +0.190910725 +0.192303903 +0.19365814 +0.194973494 +0.196250022 +0.197487787 +0.198686858 +0.199847305 +0.200969203 +0.202052632 +0.203097675 +0.20410442 +0.205072957 +0.206003383 +0.206895796 +0.2077503 +0.208567002 +0.209346012 +0.210087446 +0.210791421 +0.211458061 +0.212087492 +0.212679844 +0.21323525 +0.213753848 +0.214235779 +0.214681188 +0.215090223 +0.215463037 +0.215799784 +0.216100625 +0.216365722 +0.21659524 +0.216789351 +0.216948227 +0.217072044 +0.217160983 +0.217215227 +0.217234963 +0.217220381 +0.217171673 +0.217089037 +0.216972672 +0.216822781 +0.21663957 +0.216423248 +0.216174028 +0.215892124 +0.215577756 +0.215231144 +0.214852512 +0.214442088 +0.214000102 +0.213526787 +0.213022378 +0.212487114 +0.211921237 +0.211324989 +0.210698618 +0.210042373 +0.209356505 +0.20864127 +0.207896924 +0.207123726 +0.206321939 +0.205491826 +0.204633655 +0.203747694 +0.202834214 +0.20189349 +0.200925797 +0.199931412 +0.198910617 +0.197863693 +0.196790924 +0.195692597 +0.194569001 +0.193420424 +0.19224716 +0.191049503 +0.189827748 +0.188582193 +0.187313138 +0.186020883 +0.184705731 +0.183367986 +0.182007955 +0.180625945 +0.179222265 +0.177797226 +0.176351138 +0.174884316 +0.173397074 +0.171889728 +0.170362595 +0.168815993 +0.167250242 +0.165665662 +0.164062574 +0.162441303 +0.160802171 +0.159145503 +0.157471624 +0.155780861 +0.154073542 +0.152349994 +0.150610545 +0.148855526 +0.147085267 +0.145300098 +0.143500351 +0.141686357 +0.139858449 +0.13801696 +0.136162222 +0.134294569 +0.132414336 +0.130521856 +0.128617463 +0.126701492 +0.124774278 +0.122836156 +0.12088746 +0.118928525 +0.116959687 +0.114981279 +0.112993637 +0.110997095 +0.108991988 +0.106978649 +0.104957413 +0.102928613 +0.100892582 +0.0988496537 +0.0968001597 +0.0947444321 +0.0926828023 +0.0906156012 +0.0885431592 +0.0864658057 +0.0843838697 +0.0822976796 +0.0802075628 +0.078113846 +0.0760168551 +0.0739169152 +0.0718143503 +0.0697094836 +0.0676026372 +0.0654941325 +0.0633842894 +0.0612734269 +0.0591618631 +0.0570499144 +0.0549378966 +0.0528261238 +0.050714909 +0.0486045638 +0.0464953987 +0.0443877225 +0.0422818427 +0.0401780654 +0.0380766951 +0.0359780348 +0.0338823861 +0.0317900488 +0.0297013211 +0.0276164996 +0.0255358792 +0.023459753 +0.0213884125 +0.0193221473 +0.017261245 +0.0152059917 +0.0131566713 +0.011113566 +0.00907695593 +0.00704711925 +0.00502433213 +0.00300886869 +0.001001001 + +shape_id 2 +num_samples 1000 +0.5 +0 +0 +247 +-0.5 +0 +0 +497 +0.5 +0 +0 +247 + +shape_id 3 +num_samples 2000 +0.000500250125 +0.00150223361 +0.00250616672 +0.00351201571 +0.00451974671 +0.0055293257 +0.00654071855 +0.007553891 +0.00856880864 +0.00958543697 +0.0106037413 +0.011623687 +0.0126452389 +0.0136683623 +0.0146930218 +0.0157191823 +0.0167468083 +0.0177758644 +0.0188063149 +0.0198381241 +0.0208712561 +0.021905675 +0.0229413447 +0.0239782289 +0.0250162914 +0.0260554958 +0.0270958054 +0.0281371837 +0.0291795939 +0.0302229992 +0.0312673625 +0.0323126469 +0.033358815 +0.0344058297 +0.0354536536 +0.0365022492 +0.0375515788 +0.0386016049 +0.0396522896 +0.040703595 +0.0417554833 +0.0428079162 +0.0438608557 +0.0449142635 +0.0459681012 +0.0470223304 +0.0480769126 +0.0491318091 +0.0501869813 +0.0512423904 +0.0522979975 +0.0533537636 +0.0544096497 +0.0554656166 +0.0565216252 +0.0575776363 +0.0586336103 +0.0596895079 +0.0607452896 +0.0618009157 +0.0628563467 +0.0639115428 +0.0649664641 +0.0660210708 +0.067075323 +0.0681291806 +0.0691826036 +0.0702355518 +0.071287985 +0.0723398629 +0.0733911452 +0.0744417916 +0.0754917614 +0.0765410143 +0.0775895096 +0.0786372068 +0.0796840651 +0.0807300439 +0.0817751022 +0.0828191993 +0.0838622944 +0.0849043464 +0.0859453143 +0.0869851572 +0.088023834 +0.0890613035 +0.0900975246 +0.091132456 +0.0921660566 +0.0931982851 +0.0942291 +0.0952584602 +0.0962863241 +0.0973126503 +0.0983373975 +0.099360524 +0.100381988 +0.101401749 +0.102419765 +0.103435993 +0.104450394 +0.105462924 +0.106473542 +0.107482207 +0.108488876 +0.109493509 +0.110496063 +0.111496496 +0.112494768 +0.113490835 +0.114484656 +0.11547619 +0.116465394 +0.117452227 +0.118436647 +0.119418611 +0.120398079 +0.121375008 +0.122349356 +0.123321082 +0.124290144 +0.125256499 +0.126220107 +0.127180924 +0.12813891 +0.129094022 +0.130046219 +0.130995459 +0.1319417 +0.1328849 +0.133825017 +0.13476201 +0.135695837 +0.136626456 +0.137553825 +0.138477904 +0.139398649 +0.14031602 +0.141229975 +0.142140472 +0.143047469 +0.143950926 +0.1448508 +0.145747051 +0.146639636 +0.147528515 +0.148413645 +0.149294986 +0.150172496 +0.151046135 +0.15191586 +0.15278163 +0.153643405 +0.154501144 +0.155354804 +0.156204346 +0.157049728 +0.15789091 +0.15872785 +0.159560509 +0.160388844 +0.161212815 +0.162032382 +0.162847504 +0.163658141 +0.164464252 +0.165265797 +0.166062735 +0.166855026 +0.16764263 +0.168425507 +0.169203616 +0.169976918 +0.170745373 +0.171508941 +0.172267582 +0.173021256 +0.173769924 +0.174513547 +0.175252084 +0.175985496 +0.176713744 +0.177436789 +0.178154592 +0.178867113 +0.179574314 +0.180276155 +0.180972599 +0.181663605 +0.182349136 +0.183029153 +0.183703617 +0.184372491 +0.185035736 +0.185693313 +0.186345185 +0.186991314 +0.187631662 +0.188266192 +0.188894865 +0.189517644 +0.190134492 +0.190745371 +0.191350244 +0.191949074 +0.192541825 +0.193128458 +0.193708938 +0.194283228 +0.194851291 +0.195413091 +0.195968592 +0.196517757 +0.197060551 +0.197596937 +0.19812688 +0.198650344 +0.199167293 +0.199677693 +0.200181507 +0.200678702 +0.20116924 +0.201653089 +0.202130213 +0.202600577 +0.203064147 +0.203520889 +0.203970768 +0.20441375 +0.204849802 +0.20527889 +0.20570098 +0.206116038 +0.206524032 +0.206924928 +0.207318693 +0.207705294 +0.208084698 +0.208456874 +0.208821787 +0.209179407 +0.209529701 +0.209872637 +0.210208184 +0.210536308 +0.21085698 +0.211170168 +0.211475841 +0.211773967 +0.212064516 +0.212347458 +0.212622761 +0.212890395 +0.213150331 +0.213402538 +0.213646986 +0.213883646 +0.214112489 +0.214333484 +0.214546603 +0.214751818 +0.214949099 +0.215138417 +0.215319745 +0.215493053 +0.215658315 +0.215815502 +0.215964586 +0.216105541 +0.216238338 +0.216362951 +0.216479353 +0.216587516 +0.216687415 +0.216779024 +0.216862315 +0.216937263 +0.217003843 +0.217062029 +0.217111794 +0.217153115 +0.217185967 +0.217210323 +0.217226161 +0.217233455 +0.217232182 +0.217222317 +0.217203837 +0.217176718 +0.217140937 +0.21709647 +0.217043296 +0.21698139 +0.216910731 +0.216831296 +0.216743064 +0.216646012 +0.216540118 +0.216425362 +0.216301722 +0.216169177 +0.216027706 +0.215877289 +0.215717905 +0.215549535 +0.215372158 +0.215185754 +0.214990305 +0.214785791 +0.214572193 +0.214349492 +0.214117669 +0.213876707 +0.213626587 +0.213367292 +0.213098803 +0.212821104 +0.212534176 +0.212238004 +0.21193257 +0.211617858 +0.211293852 +0.210960536 +0.210617893 +0.210265909 +0.209904568 +0.209533855 +0.209153755 +0.208764253 +0.208365336 +0.207956989 +0.207539198 +0.20711195 +0.206675231 +0.206229028 +0.205773329 +0.20530812 +0.204833389 +0.204349124 +0.203855313 +0.203351945 +0.202839007 +0.20231649 +0.201784381 +0.20124267 +0.200691348 +0.200130403 +0.199559825 +0.198979606 +0.198389735 +0.197790204 +0.197181003 +0.196562125 +0.195933559 +0.1952953 +0.194647337 +0.193989665 +0.193322275 +0.19264516 +0.191958314 +0.191261729 +0.1905554 +0.189839321 +0.189113486 +0.188377888 +0.187632523 +0.186877386 +0.186112472 +0.185337776 +0.184553295 +0.183759023 +0.182954958 +0.182141097 +0.181317434 +0.180483969 +0.179640698 +0.178787619 +0.177924729 +0.177052027 +0.176169511 +0.17527718 +0.174375032 +0.173463068 +0.172541286 +0.171609686 +0.170668268 +0.169717032 +0.168755979 +0.16778511 +0.166804425 +0.165813927 +0.164813616 +0.163803495 +0.162783565 +0.16175383 +0.160714291 +0.159664952 +0.158605816 +0.157536886 +0.156458167 +0.155369662 +0.154271375 +0.153163312 +0.152045476 +0.150917874 +0.14978051 +0.148633391 +0.147476522 +0.146309909 +0.145133559 +0.143947478 +0.142751675 +0.141546155 +0.140330927 +0.139105998 +0.137871377 +0.136627072 +0.135373092 +0.134109445 +0.132836141 +0.131553189 +0.130260599 +0.128958382 +0.127646547 +0.126325105 +0.124994066 +0.123653443 +0.122303247 +0.120943488 +0.11957418 +0.118195334 +0.116806962 +0.115409079 +0.114001695 +0.112584826 +0.111158485 +0.109722685 +0.10827744 +0.106822766 +0.105358676 +0.103885185 +0.10240231 +0.100910065 +0.0994084659 +0.0978975291 +0.0963772708 +0.0948477076 +0.0933088562 +0.0917607339 +0.0902033581 +0.0886367463 +0.0870609166 +0.0854758871 +0.0838816764 +0.0822783031 +0.0806657864 +0.0790441454 +0.0774133997 +0.0757735691 +0.0741246738 +0.0724667341 +0.0707997706 +0.0691238041 +0.0674388559 +0.0657449474 +0.0640421002 +0.0623303364 +0.060609678 +0.0588801477 +0.0571417681 +0.0553945623 +0.0536385535 +0.0518737653 +0.0501002214 +0.048317946 +0.0465269634 +0.0447272981 +0.042918975 +0.0411020192 +0.0392764561 +0.0374423112 +0.0355996106 +0.0337483802 +0.0318886466 +0.0300204364 +0.0281437765 +0.026258694 +0.0243652165 +0.0224633716 +0.0205531872 +0.0186346915 +0.016707913 +0.0147728804 +0.0128296227 +0.010878169 +0.00891854875 +0.00695079177 +0.00497492797 +0.00299098756 +0.000999000999 +0.001001001 +0.00300898748 +0.00502492725 +0.00704878884 +0.00908054056 +0.0111201505 +0.0131675864 +0.0152228159 +0.0172858062 +0.0193565246 +0.0214349378 +0.0235210124 +0.0256147148 +0.0277160111 +0.0298248671 +0.0319412486 +0.0340651209 +0.0361964493 +0.0383351985 +0.0404813334 +0.0426348183 +0.0447956176 +0.0469636952 +0.0491390148 +0.0513215401 +0.0535112342 +0.0557080604 +0.0579119813 +0.0601229597 +0.062340958 +0.0645659382 +0.0667978623 +0.0690366921 +0.071282389 +0.0735349142 +0.0757942289 +0.0780602939 +0.0803330697 +0.0826125167 +0.0848985951 +0.0871912649 +0.0894904857 +0.0917962171 +0.0941084184 +0.0964270487 +0.0987520668 +0.101083431 +0.103421101 +0.105765034 +0.108115188 +0.110471521 +0.112833991 +0.115202554 +0.117577169 +0.119957793 +0.122344381 +0.124736891 +0.12713528 +0.129539502 +0.131949515 +0.134365274 +0.136786734 +0.139213852 +0.141646582 +0.144084879 +0.146528698 +0.148977994 +0.151432722 +0.153892834 +0.156358287 +0.158829033 +0.161305026 +0.163786219 +0.166272567 +0.168764022 +0.171260536 +0.173762064 +0.176268557 +0.178779968 +0.18129625 +0.183817353 +0.186343231 +0.188873834 +0.191409115 +0.193949025 +0.196493515 +0.199042536 +0.201596039 +0.204153975 +0.206716294 +0.209282946 +0.211853883 +0.214429053 +0.217008407 +0.219591895 +0.222179466 +0.22477107 +0.227366655 +0.229966172 +0.232569568 +0.235176794 +0.237787797 +0.240402526 +0.243020929 +0.245642955 +0.248268552 +0.250897668 +0.25353025 +0.256166246 +0.258805604 +0.261448271 +0.264094195 +0.266743322 +0.269395599 +0.272050974 +0.274709393 +0.277370802 +0.280035149 +0.282702379 +0.285372439 +0.288045274 +0.290720831 +0.293399056 +0.296079894 +0.298763291 +0.301449193 +0.304137544 +0.30682829 +0.309521376 +0.312216748 +0.31491435 +0.317614127 +0.320316023 +0.323019984 +0.325725953 +0.328433876 +0.331143696 +0.333855358 +0.336568806 +0.339283983 +0.342000834 +0.344719303 +0.347439333 +0.350160867 +0.35288385 +0.355608225 +0.358333935 +0.361060924 +0.363789134 +0.366518509 +0.369248992 +0.371980526 +0.374713053 +0.377446517 +0.38018086 +0.382916024 +0.385651953 +0.388388589 +0.391125875 +0.393863752 +0.396602163 +0.39934105 +0.402080356 +0.404820022 +0.407559991 +0.410300204 +0.413040604 +0.415781133 +0.418521732 +0.421262342 +0.424002907 +0.426743367 +0.429483664 +0.43222374 +0.434963536 +0.437702993 +0.440442054 +0.44318066 +0.445918751 +0.44865627 +0.451393158 +0.454129355 +0.456864804 +0.459599445 +0.462333219 +0.465066069 +0.467797934 +0.470528756 +0.473258476 +0.475987036 +0.478714375 +0.481440436 +0.484165159 +0.486888485 +0.489610356 +0.492330711 +0.495049493 +0.497766642 +0.500482099 +0.503195805 +0.5059077 +0.508617727 +0.511325826 +0.514031937 +0.516736002 +0.519437961 +0.522137757 +0.524835328 +0.527530618 +0.530223566 +0.532914113 +0.535602201 +0.53828777 +0.540970762 +0.543651118 +0.546328778 +0.549003684 +0.551675777 +0.554344998 +0.557011289 +0.55967459 +0.562334842 +0.564991988 +0.567645968 +0.570296723 +0.572944196 +0.575588327 +0.578229057 +0.580866329 +0.583500084 +0.586130263 +0.588756809 +0.591379662 +0.593998764 +0.596614058 +0.599225485 +0.601832986 +0.604436505 +0.607035982 +0.60963136 +0.612222581 +0.614809588 +0.617392321 +0.619970724 +0.62254474 +0.62511431 +0.627679376 +0.630239882 +0.632795771 +0.635346984 +0.637893465 +0.640435156 +0.642972001 +0.645503943 +0.648030924 +0.650552888 +0.653069778 +0.655581537 +0.658088109 +0.660589438 +0.663085467 +0.66557614 +0.6680614 +0.670541192 +0.673015459 +0.675484147 +0.677947198 +0.680404557 +0.682856169 +0.685301978 +0.687741929 +0.690175967 +0.692604036 +0.695026081 +0.697442048 +0.699851881 +0.702255526 +0.704652929 +0.707044034 +0.709428788 +0.711807137 +0.714179025 +0.7165444 +0.718903208 +0.721255394 +0.723600905 +0.725939688 +0.728271689 +0.730596855 +0.732915134 +0.735226472 +0.737530816 +0.739828114 +0.742118313 +0.744401361 +0.746677206 +0.748945795 +0.751207077 +0.753461 +0.755707512 +0.757946563 +0.760178099 +0.762402072 +0.764618428 +0.766827118 +0.769028091 +0.771221296 +0.773406683 +0.775584201 +0.777753801 +0.779915433 +0.782069047 +0.784214594 +0.786352023 +0.788481286 +0.790602335 +0.792715119 +0.79481959 +0.796915701 +0.799003401 +0.801082644 +0.803153381 +0.805215565 +0.807269148 +0.809314082 +0.81135032 +0.813377816 +0.815396521 +0.817406391 +0.819407377 +0.821399434 +0.823382516 +0.825356577 +0.827321571 +0.829277452 +0.831224176 +0.833161697 +0.83508997 +0.83700895 +0.838918593 +0.840818855 +0.842709692 +0.844591059 +0.846462914 +0.848325211 +0.850177909 +0.852020964 +0.853854334 +0.855677975 +0.857491845 +0.859295903 +0.861090105 +0.862874411 +0.864648779 +0.866413167 +0.868167535 +0.869911841 +0.871646045 +0.873370106 +0.875083985 +0.876787641 +0.878481034 +0.880164125 +0.881836876 +0.883499246 +0.885151196 +0.886792689 +0.888423687 +0.890044149 +0.89165404 +0.893253322 +0.894841956 +0.896419906 +0.897987135 +0.899543607 +0.901089284 +0.902624131 +0.904148112 +0.905661191 +0.907163333 +0.908654502 +0.910134663 +0.911603783 +0.913061826 +0.914508758 +0.915944546 +0.917369155 +0.918782553 +0.920184706 +0.921575581 +0.922955146 +0.924323368 +0.925680215 +0.927025655 +0.928359657 +0.92968219 +0.930993221 +0.932292722 +0.93358066 +0.934857006 +0.93612173 +0.937374802 +0.938616192 +0.939845871 +0.941063811 +0.942269983 +0.943464359 +0.944646909 +0.945817607 +0.946976425 +0.948123336 +0.949258312 +0.950381327 +0.951492355 +0.952591369 +0.953678343 +0.954753253 +0.955816071 +0.956866775 +0.957905338 +0.958931736 +0.959945945 +0.960947941 +0.961937701 +0.962915201 +0.963880419 +0.96483333 +0.965773913 +0.966702146 +0.967618007 +0.968521474 +0.969412526 +0.970291142 +0.9711573 +0.972010982 +0.972852165 +0.973680832 +0.974496961 +0.975300535 +0.976091533 +0.976869937 +0.977635729 +0.97838889 +0.979129404 +0.979857251 +0.980572416 +0.981274881 +0.98196463 +0.982641646 +0.983305913 +0.983957416 +0.984596139 +0.985222068 +0.985835186 +0.986435481 +0.987022937 +0.98759754 +0.988159278 +0.988708137 +0.989244104 +0.989767166 +0.99027731 +0.990774526 +0.9912588 +0.991730122 +0.99218848 +0.992633864 +0.993066263 +0.993485666 +0.993892065 +0.994285448 +0.994665808 +0.995033134 +0.995387418 +0.995728653 +0.996056829 +0.996371939 +0.996673975 +0.996962931 +0.997238799 +0.997501573 +0.997751247 +0.997987815 +0.998211271 +0.99842161 +0.998618827 +0.998802917 +0.998973876 +0.999131701 +0.999276386 +0.999407929 +0.999526326 +0.999631575 +0.999723674 +0.999802619 +0.99986841 +0.999921045 +0.999960522 +0.999986841 +1 +1 +0.999986841 +0.999960522 +0.999921045 +0.99986841 +0.999802619 +0.999723674 +0.999631575 +0.999526326 +0.999407929 +0.999276386 +0.999131701 +0.998973876 +0.998802917 +0.998618827 +0.99842161 +0.998211271 +0.997987815 +0.997751247 +0.997501573 +0.997238799 +0.996962931 +0.996673975 +0.996371939 +0.996056829 +0.995728653 +0.995387418 +0.995033134 +0.994665808 +0.994285448 +0.993892065 +0.993485666 +0.993066263 +0.992633864 +0.99218848 +0.991730122 +0.9912588 +0.990774526 +0.99027731 +0.989767166 +0.989244104 +0.988708137 +0.988159278 +0.98759754 +0.987022937 +0.986435481 +0.985835186 +0.985222068 +0.984596139 +0.983957416 +0.983305913 +0.982641646 +0.98196463 +0.981274881 +0.980572416 +0.979857251 +0.979129404 +0.97838889 +0.977635729 +0.976869937 +0.976091533 +0.975300535 +0.974496961 +0.973680832 +0.972852165 +0.972010982 +0.9711573 +0.970291142 +0.969412526 +0.968521474 +0.967618007 +0.966702146 +0.965773913 +0.96483333 +0.963880419 +0.962915201 +0.961937701 +0.960947941 +0.959945945 +0.958931736 +0.957905338 +0.956866775 +0.955816071 +0.954753253 +0.953678343 +0.952591369 +0.951492355 +0.950381327 +0.949258312 +0.948123336 +0.946976425 +0.945817607 +0.944646909 +0.943464359 +0.942269983 +0.941063811 +0.939845871 +0.938616192 +0.937374802 +0.93612173 +0.934857006 +0.93358066 +0.932292722 +0.930993221 +0.92968219 +0.928359657 +0.927025655 +0.925680215 +0.924323368 +0.922955146 +0.921575581 +0.920184706 +0.918782553 +0.917369155 +0.915944546 +0.914508758 +0.913061826 +0.911603783 +0.910134663 +0.908654502 +0.907163333 +0.905661191 +0.904148112 +0.902624131 +0.901089284 +0.899543607 +0.897987135 +0.896419906 +0.894841956 +0.893253322 +0.89165404 +0.890044149 +0.888423687 +0.886792689 +0.885151196 +0.883499246 +0.881836876 +0.880164125 +0.878481034 +0.876787641 +0.875083985 +0.873370106 +0.871646045 +0.869911841 +0.868167535 +0.866413167 +0.864648779 +0.862874411 +0.861090105 +0.859295903 +0.857491845 +0.855677975 +0.853854334 +0.852020964 +0.850177909 +0.848325211 +0.846462914 +0.844591059 +0.842709692 +0.840818855 +0.838918593 +0.83700895 +0.83508997 +0.833161697 +0.831224176 +0.829277452 +0.827321571 +0.825356577 +0.823382516 +0.821399434 +0.819407377 +0.817406391 +0.815396521 +0.813377816 +0.81135032 +0.809314082 +0.807269148 +0.805215565 +0.803153381 +0.801082644 +0.799003401 +0.796915701 +0.79481959 +0.792715119 +0.790602335 +0.788481286 +0.786352023 +0.784214594 +0.782069047 +0.779915433 +0.777753801 +0.775584201 +0.773406683 +0.771221296 +0.769028091 +0.766827118 +0.764618428 +0.762402072 +0.760178099 +0.757946563 +0.755707512 +0.753461 +0.751207077 +0.748945795 +0.746677206 +0.744401361 +0.742118313 +0.739828114 +0.737530816 +0.735226472 +0.732915134 +0.730596855 +0.728271689 +0.725939688 +0.723600905 +0.721255394 +0.718903208 +0.7165444 +0.714179025 +0.711807137 +0.709428788 +0.707044034 +0.704652929 +0.702255526 +0.699851881 +0.697442048 +0.695026081 +0.692604036 +0.690175967 +0.687741929 +0.685301978 +0.682856169 +0.680404557 +0.677947198 +0.675484147 +0.673015459 +0.670541192 +0.6680614 +0.66557614 +0.663085467 +0.660589438 +0.658088109 +0.655581537 +0.653069778 +0.650552888 +0.648030924 +0.645503943 +0.642972001 +0.640435156 +0.637893465 +0.635346984 +0.632795771 +0.630239882 +0.627679376 +0.62511431 +0.62254474 +0.619970724 +0.617392321 +0.614809588 +0.612222581 +0.60963136 +0.607035982 +0.604436505 +0.601832986 +0.599225485 +0.596614058 +0.593998764 +0.591379662 +0.588756809 +0.586130263 +0.583500084 +0.580866329 +0.578229057 +0.575588327 +0.572944196 +0.570296723 +0.567645968 +0.564991988 +0.562334842 +0.55967459 +0.557011289 +0.554344998 +0.551675777 +0.549003684 +0.546328778 +0.543651118 +0.540970762 +0.53828777 +0.535602201 +0.532914113 +0.530223566 +0.527530618 +0.524835328 +0.522137757 +0.519437961 +0.516736002 +0.514031937 +0.511325826 +0.508617727 +0.5059077 +0.503195805 +0.500482099 +0.497766642 +0.495049493 +0.492330711 +0.489610356 +0.486888485 +0.484165159 +0.481440436 +0.478714375 +0.475987036 +0.473258476 +0.470528756 +0.467797934 +0.465066069 +0.462333219 +0.459599445 +0.456864804 +0.454129355 +0.451393158 +0.44865627 +0.445918751 +0.44318066 +0.440442054 +0.437702993 +0.434963536 +0.43222374 +0.429483664 +0.426743367 +0.424002907 +0.421262342 +0.418521732 +0.415781133 +0.413040604 +0.410300204 +0.407559991 +0.404820022 +0.402080356 +0.39934105 +0.396602163 +0.393863752 +0.391125875 +0.388388589 +0.385651953 +0.382916024 +0.38018086 +0.377446517 +0.374713053 +0.371980526 +0.369248992 +0.366518509 +0.363789134 +0.361060924 +0.358333935 +0.355608225 +0.35288385 +0.350160867 +0.347439333 +0.344719303 +0.342000834 +0.339283983 +0.336568806 +0.333855358 +0.331143696 +0.328433876 +0.325725953 +0.323019984 +0.320316023 +0.317614127 +0.31491435 +0.312216748 +0.309521376 +0.30682829 +0.304137544 +0.301449193 +0.298763291 +0.296079894 +0.293399056 +0.290720831 +0.288045274 +0.285372439 +0.282702379 +0.280035149 +0.277370802 +0.274709393 +0.272050974 +0.269395599 +0.266743322 +0.264094195 +0.261448271 +0.258805604 +0.256166246 +0.25353025 +0.250897668 +0.248268552 +0.245642955 +0.243020929 +0.240402526 +0.237787797 +0.235176794 +0.232569568 +0.229966172 +0.227366655 +0.22477107 +0.222179466 +0.219591895 +0.217008407 +0.214429053 +0.211853883 +0.209282946 +0.206716294 +0.204153975 +0.201596039 +0.199042536 +0.196493515 +0.193949025 +0.191409115 +0.188873834 +0.186343231 +0.183817353 +0.18129625 +0.178779968 +0.176268557 +0.173762064 +0.171260536 +0.168764022 +0.166272567 +0.163786219 +0.161305026 +0.158829033 +0.156358287 +0.153892834 +0.151432722 +0.148977994 +0.146528698 +0.144084879 +0.141646582 +0.139213852 +0.136786734 +0.134365274 +0.131949515 +0.129539502 +0.12713528 +0.124736891 +0.122344381 +0.119957793 +0.117577169 +0.115202554 +0.112833991 +0.110471521 +0.108115188 +0.105765034 +0.103421101 +0.101083431 +0.0987520668 +0.0964270487 +0.0941084184 +0.0917962171 +0.0894904857 +0.0871912649 +0.0848985951 +0.0826125167 +0.0803330697 +0.0780602939 +0.0757942289 +0.0735349142 +0.071282389 +0.0690366921 +0.0667978623 +0.0645659382 +0.062340958 +0.0601229597 +0.0579119813 +0.0557080604 +0.0535112342 +0.0513215401 +0.0491390148 +0.0469636952 +0.0447956176 +0.0426348183 +0.0404813334 +0.0383351985 +0.0361964493 +0.0340651209 +0.0319412486 +0.0298248671 +0.0277160111 +0.0256147148 +0.0235210124 +0.0214349378 +0.0193565246 +0.0172858062 +0.0152228159 +0.0131675864 +0.0111201505 +0.00908054056 +0.00704878884 +0.00502492725 +0.00300898748 +0.001001001 +0.000999000999 +0.00299098756 +0.00497492797 +0.00695079177 +0.00891854875 +0.010878169 +0.0128296227 +0.0147728804 +0.016707913 +0.0186346915 +0.0205531872 +0.0224633716 +0.0243652165 +0.026258694 +0.0281437765 +0.0300204364 +0.0318886466 +0.0337483802 +0.0355996106 +0.0374423112 +0.0392764561 +0.0411020192 +0.042918975 +0.0447272981 +0.0465269634 +0.048317946 +0.0501002214 +0.0518737653 +0.0536385535 +0.0553945623 +0.0571417681 +0.0588801477 +0.060609678 +0.0623303364 +0.0640421002 +0.0657449474 +0.0674388559 +0.0691238041 +0.0707997706 +0.0724667341 +0.0741246738 +0.0757735691 +0.0774133997 +0.0790441454 +0.0806657864 +0.0822783031 +0.0838816764 +0.0854758871 +0.0870609166 +0.0886367463 +0.0902033581 +0.0917607339 +0.0933088562 +0.0948477076 +0.0963772708 +0.0978975291 +0.0994084659 +0.100910065 +0.10240231 +0.103885185 +0.105358676 +0.106822766 +0.10827744 +0.109722685 +0.111158485 +0.112584826 +0.114001695 +0.115409079 +0.116806962 +0.118195334 +0.11957418 +0.120943488 +0.122303247 +0.123653443 +0.124994066 +0.126325105 +0.127646547 +0.128958382 +0.130260599 +0.131553189 +0.132836141 +0.134109445 +0.135373092 +0.136627072 +0.137871377 +0.139105998 +0.140330927 +0.141546155 +0.142751675 +0.143947478 +0.145133559 +0.146309909 +0.147476522 +0.148633391 +0.14978051 +0.150917874 +0.152045476 +0.153163312 +0.154271375 +0.155369662 +0.156458167 +0.157536886 +0.158605816 +0.159664952 +0.160714291 +0.16175383 +0.162783565 +0.163803495 +0.164813616 +0.165813927 +0.166804425 +0.16778511 +0.168755979 +0.169717032 +0.170668268 +0.171609686 +0.172541286 +0.173463068 +0.174375032 +0.17527718 +0.176169511 +0.177052027 +0.177924729 +0.178787619 +0.179640698 +0.180483969 +0.181317434 +0.182141097 +0.182954958 +0.183759023 +0.184553295 +0.185337776 +0.186112472 +0.186877386 +0.187632523 +0.188377888 +0.189113486 +0.189839321 +0.1905554 +0.191261729 +0.191958314 +0.19264516 +0.193322275 +0.193989665 +0.194647337 +0.1952953 +0.195933559 +0.196562125 +0.197181003 +0.197790204 +0.198389735 +0.198979606 +0.199559825 +0.200130403 +0.200691348 +0.20124267 +0.201784381 +0.20231649 +0.202839007 +0.203351945 +0.203855313 +0.204349124 +0.204833389 +0.20530812 +0.205773329 +0.206229028 +0.206675231 +0.20711195 +0.207539198 +0.207956989 +0.208365336 +0.208764253 +0.209153755 +0.209533855 +0.209904568 +0.210265909 +0.210617893 +0.210960536 +0.211293852 +0.211617858 +0.21193257 +0.212238004 +0.212534176 +0.212821104 +0.213098803 +0.213367292 +0.213626587 +0.213876707 +0.214117669 +0.214349492 +0.214572193 +0.214785791 +0.214990305 +0.215185754 +0.215372158 +0.215549535 +0.215717905 +0.215877289 +0.216027706 +0.216169177 +0.216301722 +0.216425362 +0.216540118 +0.216646012 +0.216743064 +0.216831296 +0.216910731 +0.21698139 +0.217043296 +0.21709647 +0.217140937 +0.217176718 +0.217203837 +0.217222317 +0.217232182 +0.217233455 +0.217226161 +0.217210323 +0.217185967 +0.217153115 +0.217111794 +0.217062029 +0.217003843 +0.216937263 +0.216862315 +0.216779024 +0.216687415 +0.216587516 +0.216479353 +0.216362951 +0.216238338 +0.216105541 +0.215964586 +0.215815502 +0.215658315 +0.215493053 +0.215319745 +0.215138417 +0.214949099 +0.214751818 +0.214546603 +0.214333484 +0.214112489 +0.213883646 +0.213646986 +0.213402538 +0.213150331 +0.212890395 +0.212622761 +0.212347458 +0.212064516 +0.211773967 +0.211475841 +0.211170168 +0.21085698 +0.210536308 +0.210208184 +0.209872637 +0.209529701 +0.209179407 +0.208821787 +0.208456874 +0.208084698 +0.207705294 +0.207318693 +0.206924928 +0.206524032 +0.206116038 +0.20570098 +0.20527889 +0.204849802 +0.20441375 +0.203970768 +0.203520889 +0.203064147 +0.202600577 +0.202130213 +0.201653089 +0.20116924 +0.200678702 +0.200181507 +0.199677693 +0.199167293 +0.198650344 +0.19812688 +0.197596937 +0.197060551 +0.196517757 +0.195968592 +0.195413091 +0.194851291 +0.194283228 +0.193708938 +0.193128458 +0.192541825 +0.191949074 +0.191350244 +0.190745371 +0.190134492 +0.189517644 +0.188894865 +0.188266192 +0.187631662 +0.186991314 +0.186345185 +0.185693313 +0.185035736 +0.184372491 +0.183703617 +0.183029153 +0.182349136 +0.181663605 +0.180972599 +0.180276155 +0.179574314 +0.178867113 +0.178154592 +0.177436789 +0.176713744 +0.175985496 +0.175252084 +0.174513547 +0.173769924 +0.173021256 +0.172267582 +0.171508941 +0.170745373 +0.169976918 +0.169203616 +0.168425507 +0.16764263 +0.166855026 +0.166062735 +0.165265797 +0.164464252 +0.163658141 +0.162847504 +0.162032382 +0.161212815 +0.160388844 +0.159560509 +0.15872785 +0.15789091 +0.157049728 +0.156204346 +0.155354804 +0.154501144 +0.153643405 +0.15278163 +0.15191586 +0.151046135 +0.150172496 +0.149294986 +0.148413645 +0.147528515 +0.146639636 +0.145747051 +0.1448508 +0.143950926 +0.143047469 +0.142140472 +0.141229975 +0.14031602 +0.139398649 +0.138477904 +0.137553825 +0.136626456 +0.135695837 +0.13476201 +0.133825017 +0.1328849 +0.1319417 +0.130995459 +0.130046219 +0.129094022 +0.12813891 +0.127180924 +0.126220107 +0.125256499 +0.124290144 +0.123321082 +0.122349356 +0.121375008 +0.120398079 +0.119418611 +0.118436647 +0.117452227 +0.116465394 +0.11547619 +0.114484656 +0.113490835 +0.112494768 +0.111496496 +0.110496063 +0.109493509 +0.108488876 +0.107482207 +0.106473542 +0.105462924 +0.104450394 +0.103435993 +0.102419765 +0.101401749 +0.100381988 +0.099360524 +0.0983373975 +0.0973126503 +0.0962863241 +0.0952584602 +0.0942291 +0.0931982851 +0.0921660566 +0.091132456 +0.0900975246 +0.0890613035 +0.088023834 +0.0869851572 +0.0859453143 +0.0849043464 +0.0838622944 +0.0828191993 +0.0817751022 +0.0807300439 +0.0796840651 +0.0786372068 +0.0775895096 +0.0765410143 +0.0754917614 +0.0744417916 +0.0733911452 +0.0723398629 +0.071287985 +0.0702355518 +0.0691826036 +0.0681291806 +0.067075323 +0.0660210708 +0.0649664641 +0.0639115428 +0.0628563467 +0.0618009157 +0.0607452896 +0.0596895079 +0.0586336103 +0.0575776363 +0.0565216252 +0.0554656166 +0.0544096497 +0.0533537636 +0.0522979975 +0.0512423904 +0.0501869813 +0.0491318091 +0.0480769126 +0.0470223304 +0.0459681012 +0.0449142635 +0.0438608557 +0.0428079162 +0.0417554833 +0.040703595 +0.0396522896 +0.0386016049 +0.0375515788 +0.0365022492 +0.0354536536 +0.0344058297 +0.033358815 +0.0323126469 +0.0312673625 +0.0302229992 +0.0291795939 +0.0281371837 +0.0270958054 +0.0260554958 +0.0250162914 +0.0239782289 +0.0229413447 +0.021905675 +0.0208712561 +0.0198381241 +0.0188063149 +0.0177758644 +0.0167468083 +0.0157191823 +0.0146930218 +0.0136683623 +0.0126452389 +0.011623687 +0.0106037413 +0.00958543697 +0.00856880864 +0.007553891 +0.00654071855 +0.0055293257 +0.00451974671 +0.00351201571 +0.00250616672 +0.00150223361 +0.000500250125 + +shape_id 4 +num_samples 2000 +0.5 +0 +0 +497 +-0.5 +0 +0 +997 +0.5 +0 +0 +497 + +shape_id 5 +num_samples 1000 +0.637256505 +0.638528551 +0.639799396 +0.641069033 +0.642337455 +0.643604655 +0.644870625 +0.646135358 +0.647398848 +0.648661087 +0.649922068 +0.651181785 +0.652440229 +0.653697394 +0.654953273 +0.656207859 +0.657461144 +0.658713123 +0.659963786 +0.661213129 +0.662461142 +0.663707821 +0.664953156 +0.666197142 +0.667439772 +0.668681038 +0.669920933 +0.671159451 +0.672396584 +0.673632326 +0.674866668 +0.676099606 +0.677331131 +0.678561236 +0.679789915 +0.681017161 +0.682242966 +0.683467324 +0.684690228 +0.685911671 +0.687131646 +0.688350146 +0.689567164 +0.690782693 +0.691996727 +0.693209259 +0.694420281 +0.695629786 +0.696837769 +0.698044222 +0.699249138 +0.70045251 +0.701654332 +0.702854597 +0.704053298 +0.705250428 +0.70644598 +0.707639947 +0.708832324 +0.710023102 +0.711212276 +0.712399838 +0.713585781 +0.7147701 +0.715952787 +0.717133835 +0.718313238 +0.719490989 +0.720667082 +0.721841509 +0.723014264 +0.72418534 +0.725354731 +0.72652243 +0.72768843 +0.728852724 +0.730015307 +0.731176171 +0.732335309 +0.733492716 +0.734648384 +0.735802308 +0.736954479 +0.738104892 +0.739253541 +0.740400417 +0.741545516 +0.742688831 +0.743830354 +0.74497008 +0.746108002 +0.747244113 +0.748378407 +0.749510878 +0.750641518 +0.751770322 +0.752897283 +0.754022395 +0.75514565 +0.756267044 +0.757386568 +0.758504218 +0.759619985 +0.760733865 +0.761845851 +0.762955935 +0.764064113 +0.765170377 +0.766274722 +0.76737714 +0.768477626 +0.769576173 +0.770672775 +0.771767425 +0.772860118 +0.773950847 +0.775039606 +0.776126388 +0.777211187 +0.778293998 +0.779374813 +0.780453627 +0.781530434 +0.782605227 +0.783677999 +0.784748746 +0.78581746 +0.786884136 +0.787948767 +0.789011347 +0.790071871 +0.791130331 +0.792186723 +0.793241039 +0.794293274 +0.795343422 +0.796391477 +0.797437432 +0.798481282 +0.79952302 +0.800562641 +0.801600139 +0.802635507 +0.80366874 +0.804699831 +0.805728775 +0.806755566 +0.807780197 +0.808802664 +0.809822959 +0.810841078 +0.811857014 +0.812870761 +0.813882314 +0.814891666 +0.815898812 +0.816903746 +0.817906463 +0.818906956 +0.819905219 +0.820901247 +0.821895034 +0.822886575 +0.823875863 +0.824862892 +0.825847658 +0.826830155 +0.827810376 +0.828788316 +0.82976397 +0.830737331 +0.831708395 +0.832677154 +0.833643605 +0.834607741 +0.835569557 +0.836529046 +0.837486205 +0.838441026 +0.839393505 +0.840343635 +0.841291412 +0.84223683 +0.843179883 +0.844120566 +0.845058874 +0.845994801 +0.846928341 +0.847859489 +0.84878824 +0.849714589 +0.850638529 +0.851560056 +0.852479165 +0.853395849 +0.854310104 +0.855221924 +0.856131304 +0.857038239 +0.857942723 +0.858844751 +0.859744318 +0.860641419 +0.861536048 +0.862428201 +0.863317871 +0.864205055 +0.865089746 +0.86597194 +0.866851631 +0.867728814 +0.868603485 +0.869475637 +0.870345267 +0.871212368 +0.872076937 +0.872938967 +0.873798454 +0.874655393 +0.875509779 +0.876361606 +0.87721087 +0.878057567 +0.87890169 +0.879743235 +0.880582198 +0.881418572 +0.882252354 +0.883083539 +0.883912121 +0.884738096 +0.885561459 +0.886382205 +0.88720033 +0.888015828 +0.888828695 +0.889638926 +0.890446516 +0.891251461 +0.892053756 +0.892853397 +0.893650377 +0.894444694 +0.895236342 +0.896025317 +0.896811614 +0.897595228 +0.898376155 +0.89915439 +0.899929929 +0.900702768 +0.901472901 +0.902240324 +0.903005033 +0.903767023 +0.904526289 +0.905282828 +0.906036635 +0.906787706 +0.907536035 +0.908281619 +0.909024454 +0.909764534 +0.910501856 +0.911236416 +0.911968208 +0.912697229 +0.913423475 +0.914146941 +0.914867623 +0.915585516 +0.916300617 +0.917012921 +0.917722425 +0.918429123 +0.919133013 +0.919834089 +0.920532347 +0.921227785 +0.921920396 +0.922610178 +0.923297127 +0.923981237 +0.924662506 +0.925340929 +0.926016503 +0.926689223 +0.927359085 +0.928026086 +0.928690221 +0.929351487 +0.93000988 +0.930665395 +0.93131803 +0.93196778 +0.932614641 +0.93325861 +0.933899682 +0.934537855 +0.935173124 +0.935805486 +0.936434936 +0.937061472 +0.937685089 +0.938305783 +0.938923552 +0.939538392 +0.940150298 +0.940759268 +0.941365297 +0.941968383 +0.942568521 +0.943165709 +0.943759941 +0.944351216 +0.94493953 +0.945524879 +0.946107259 +0.946686668 +0.947263101 +0.947836556 +0.94840703 +0.948974517 +0.949539017 +0.950100524 +0.950659036 +0.95121455 +0.951767061 +0.952316568 +0.952863067 +0.953406554 +0.953947026 +0.95448448 +0.955018914 +0.955550323 +0.956078704 +0.956604056 +0.957126374 +0.957645655 +0.958161897 +0.958675095 +0.959185248 +0.959692353 +0.960196405 +0.960697403 +0.961195344 +0.961690223 +0.96218204 +0.962670789 +0.96315647 +0.963639078 +0.964118611 +0.964595067 +0.965068442 +0.965538733 +0.966005939 +0.966470055 +0.966931079 +0.96738901 +0.967843843 +0.968295576 +0.968744207 +0.969189732 +0.96963215 +0.970071458 +0.970507653 +0.970940732 +0.971370693 +0.971797533 +0.972221251 +0.972641842 +0.973059306 +0.973473639 +0.973884839 +0.974292903 +0.97469783 +0.975099617 +0.97549826 +0.975893759 +0.976286111 +0.976675313 +0.977061362 +0.977444258 +0.977823998 +0.978200578 +0.978573998 +0.978944254 +0.979311345 +0.979675269 +0.980036023 +0.980393605 +0.980748014 +0.981099246 +0.9814473 +0.981792174 +0.982133866 +0.982472374 +0.982807696 +0.983139829 +0.983468773 +0.983794524 +0.984117081 +0.984436443 +0.984752607 +0.985065571 +0.985375333 +0.985681892 +0.985985246 +0.986285393 +0.986582332 +0.98687606 +0.987166575 +0.987453877 +0.987737963 +0.988018832 +0.988296482 +0.988570911 +0.988842118 +0.989110101 +0.989374859 +0.98963639 +0.989894692 +0.990149764 +0.990401605 +0.990650212 +0.990895586 +0.991137723 +0.991376622 +0.991612283 +0.991844704 +0.992073883 +0.992299819 +0.992522511 +0.992741957 +0.992958156 +0.993171107 +0.993380809 +0.99358726 +0.993790459 +0.993990405 +0.994187096 +0.994380533 +0.994570712 +0.994757634 +0.994941297 +0.9951217 +0.995298842 +0.995472723 +0.99564334 +0.995810693 +0.995974781 +0.996135602 +0.996293157 +0.996447444 +0.996598462 +0.996746211 +0.996890689 +0.997031895 +0.997169829 +0.99730449 +0.997435877 +0.99756399 +0.997688826 +0.997810387 +0.997928671 +0.998043677 +0.998155405 +0.998263854 +0.998369024 +0.998470913 +0.998569521 +0.998664848 +0.998756893 +0.998845656 +0.998931136 +0.999013332 +0.999092244 +0.999167871 +0.999240214 +0.999309271 +0.999375042 +0.999437527 +0.999496726 +0.999552638 +0.999605263 +0.9996546 +0.999700649 +0.99974341 +0.999782883 +0.999819067 +0.999851962 +0.999881569 +0.999907886 +0.999930914 +0.999950653 +0.999967102 +0.999980261 +0.99999013 +0.99999671 +1 +1 +0.99999671 +0.99999013 +0.999980261 +0.999967102 +0.999950653 +0.999930914 +0.999907886 +0.999881569 +0.999851962 +0.999819067 +0.999782883 +0.99974341 +0.999700649 +0.9996546 +0.999605263 +0.999552638 +0.999496726 +0.999437527 +0.999375042 +0.999309271 +0.999240214 +0.999167871 +0.999092244 +0.999013332 +0.998931136 +0.998845656 +0.998756893 +0.998664848 +0.998569521 +0.998470913 +0.998369024 +0.998263854 +0.998155405 +0.998043677 +0.997928671 +0.997810387 +0.997688826 +0.99756399 +0.997435877 +0.99730449 +0.997169829 +0.997031895 +0.996890689 +0.996746211 +0.996598462 +0.996447444 +0.996293157 +0.996135602 +0.995974781 +0.995810693 +0.99564334 +0.995472723 +0.995298842 +0.9951217 +0.994941297 +0.994757634 +0.994570712 +0.994380533 +0.994187096 +0.993990405 +0.993790459 +0.99358726 +0.993380809 +0.993171107 +0.992958156 +0.992741957 +0.992522511 +0.992299819 +0.992073883 +0.991844704 +0.991612283 +0.991376622 +0.991137723 +0.990895586 +0.990650212 +0.990401605 +0.990149764 +0.989894692 +0.98963639 +0.989374859 +0.989110101 +0.988842118 +0.988570911 +0.988296482 +0.988018832 +0.987737963 +0.987453877 +0.987166575 +0.98687606 +0.986582332 +0.986285393 +0.985985246 +0.985681892 +0.985375333 +0.985065571 +0.984752607 +0.984436443 +0.984117081 +0.983794524 +0.983468773 +0.983139829 +0.982807696 +0.982472374 +0.982133866 +0.981792174 +0.9814473 +0.981099246 +0.980748014 +0.980393605 +0.980036023 +0.979675269 +0.979311345 +0.978944254 +0.978573998 +0.978200578 +0.977823998 +0.977444258 +0.977061362 +0.976675313 +0.976286111 +0.975893759 +0.97549826 +0.975099617 +0.97469783 +0.974292903 +0.973884839 +0.973473639 +0.973059306 +0.972641842 +0.972221251 +0.971797533 +0.971370693 +0.970940732 +0.970507653 +0.970071458 +0.96963215 +0.969189732 +0.968744207 +0.968295576 +0.967843843 +0.96738901 +0.966931079 +0.966470055 +0.966005939 +0.965538733 +0.965068442 +0.964595067 +0.964118611 +0.963639078 +0.96315647 +0.962670789 +0.96218204 +0.961690223 +0.961195344 +0.960697403 +0.960196405 +0.959692353 +0.959185248 +0.958675095 +0.958161897 +0.957645655 +0.957126374 +0.956604056 +0.956078704 +0.955550323 +0.955018914 +0.95448448 +0.953947026 +0.953406554 +0.952863067 +0.952316568 +0.951767061 +0.95121455 +0.950659036 +0.950100524 +0.949539017 +0.948974517 +0.94840703 +0.947836556 +0.947263101 +0.946686668 +0.946107259 +0.945524879 +0.94493953 +0.944351216 +0.943759941 +0.943165709 +0.942568521 +0.941968383 +0.941365297 +0.940759268 +0.940150298 +0.939538392 +0.938923552 +0.938305783 +0.937685089 +0.937061472 +0.936434936 +0.935805486 +0.935173124 +0.934537855 +0.933899682 +0.93325861 +0.932614641 +0.93196778 +0.93131803 +0.930665395 +0.93000988 +0.929351487 +0.928690221 +0.928026086 +0.927359085 +0.926689223 +0.926016503 +0.925340929 +0.924662506 +0.923981237 +0.923297127 +0.922610178 +0.921920396 +0.921227785 +0.920532347 +0.919834089 +0.919133013 +0.918429123 +0.917722425 +0.917012921 +0.916300617 +0.915585516 +0.914867623 +0.914146941 +0.913423475 +0.912697229 +0.911968208 +0.911236416 +0.910501856 +0.909764534 +0.909024454 +0.908281619 +0.907536035 +0.906787706 +0.906036635 +0.905282828 +0.904526289 +0.903767023 +0.903005033 +0.902240324 +0.901472901 +0.900702768 +0.899929929 +0.89915439 +0.898376155 +0.897595228 +0.896811614 +0.896025317 +0.895236342 +0.894444694 +0.893650377 +0.892853397 +0.892053756 +0.891251461 +0.890446516 +0.889638926 +0.888828695 +0.888015828 +0.88720033 +0.886382205 +0.885561459 +0.884738096 +0.883912121 +0.883083539 +0.882252354 +0.881418572 +0.880582198 +0.879743235 +0.87890169 +0.878057567 +0.87721087 +0.876361606 +0.875509779 +0.874655393 +0.873798454 +0.872938967 +0.872076937 +0.871212368 +0.870345267 +0.869475637 +0.868603485 +0.867728814 +0.866851631 +0.86597194 +0.865089746 +0.864205055 +0.863317871 +0.862428201 +0.861536048 +0.860641419 +0.859744318 +0.858844751 +0.857942723 +0.857038239 +0.856131304 +0.855221924 +0.854310104 +0.853395849 +0.852479165 +0.851560056 +0.850638529 +0.849714589 +0.84878824 +0.847859489 +0.846928341 +0.845994801 +0.845058874 +0.844120566 +0.843179883 +0.84223683 +0.841291412 +0.840343635 +0.839393505 +0.838441026 +0.837486205 +0.836529046 +0.835569557 +0.834607741 +0.833643605 +0.832677154 +0.831708395 +0.830737331 +0.82976397 +0.828788316 +0.827810376 +0.826830155 +0.825847658 +0.824862892 +0.823875863 +0.822886575 +0.821895034 +0.820901247 +0.819905219 +0.818906956 +0.817906463 +0.816903746 +0.815898812 +0.814891666 +0.813882314 +0.812870761 +0.811857014 +0.810841078 +0.809822959 +0.808802664 +0.807780197 +0.806755566 +0.805728775 +0.804699831 +0.80366874 +0.802635507 +0.801600139 +0.800562641 +0.79952302 +0.798481282 +0.797437432 +0.796391477 +0.795343422 +0.794293274 +0.793241039 +0.792186723 +0.791130331 +0.790071871 +0.789011347 +0.787948767 +0.786884136 +0.78581746 +0.784748746 +0.783677999 +0.782605227 +0.781530434 +0.780453627 +0.779374813 +0.778293998 +0.777211187 +0.776126388 +0.775039606 +0.773950847 +0.772860118 +0.771767425 +0.770672775 +0.769576173 +0.768477626 +0.76737714 +0.766274722 +0.765170377 +0.764064113 +0.762955935 +0.761845851 +0.760733865 +0.759619985 +0.758504218 +0.757386568 +0.756267044 +0.75514565 +0.754022395 +0.752897283 +0.751770322 +0.750641518 +0.749510878 +0.748378407 +0.747244113 +0.746108002 +0.74497008 +0.743830354 +0.742688831 +0.741545516 +0.740400417 +0.739253541 +0.738104892 +0.736954479 +0.735802308 +0.734648384 +0.733492716 +0.732335309 +0.731176171 +0.730015307 +0.728852724 +0.72768843 +0.72652243 +0.725354731 +0.72418534 +0.723014264 +0.721841509 +0.720667082 +0.719490989 +0.718313238 +0.717133835 +0.715952787 +0.7147701 +0.713585781 +0.712399838 +0.711212276 +0.710023102 +0.708832324 +0.707639947 +0.70644598 +0.705250428 +0.704053298 +0.702854597 +0.701654332 +0.70045251 +0.699249138 +0.698044222 +0.696837769 +0.695629786 +0.694420281 +0.693209259 +0.691996727 +0.690782693 +0.689567164 +0.688350146 +0.687131646 +0.685911671 +0.684690228 +0.683467324 +0.682242966 +0.681017161 +0.679789915 +0.678561236 +0.677331131 +0.676099606 +0.674866668 +0.673632326 +0.672396584 +0.671159451 +0.669920933 +0.668681038 +0.667439772 +0.666197142 +0.664953156 +0.663707821 +0.662461142 +0.661213129 +0.659963786 +0.658713123 +0.657461144 +0.656207859 +0.654953273 +0.653697394 +0.652440229 +0.651181785 +0.649922068 +0.648661087 +0.647398848 +0.646135358 +0.644870625 +0.643604655 +0.642337455 +0.641069033 +0.639799396 +0.638528551 +0.637256505 + +shape_id 6 +num_samples 1000 +0 +0 +998 + +shape_id 7 +num_samples 1000 +0.00080080169 +0.00240710951 +0.00401952967 +0.00563786858 +0.00726193113 +0.00889152073 +0.0105264393 +0.0121664874 +0.013811464 +0.0154611666 +0.0171153914 +0.0187739332 +0.0204365853 +0.0221031396 +0.0237733866 +0.0254471156 +0.0271241144 +0.0288041694 +0.0304870658 +0.0321725875 +0.0338605169 +0.0355506353 +0.0372427227 +0.0389365578 +0.040631918 +0.0423285795 +0.0440263174 +0.0457249053 +0.0474241159 +0.0491237206 +0.0508234896 +0.052523192 +0.0542225958 +0.0559214679 +0.0576195739 +0.0593166785 +0.0610125454 +0.0627069369 +0.0643996147 +0.0660903392 +0.0677788698 +0.069464965 +0.0711483822 +0.0728288782 +0.0745062084 +0.0761801275 +0.0778503893 +0.0795167467 +0.0811789518 +0.0828367557 +0.0844899088 +0.0861381606 +0.08778126 +0.0894189547 +0.0910509922 +0.0926771188 +0.0942970804 +0.0959106221 +0.0975174883 +0.0991174227 +0.100710168 +0.102295468 +0.103873064 +0.105442696 +0.107004107 +0.108557036 +0.110101223 +0.111636408 +0.113162329 +0.114678724 +0.116185332 +0.117681891 +0.119168137 +0.120643807 +0.122108639 +0.123562367 +0.125004729 +0.126435461 +0.127854296 +0.129260972 +0.130655223 +0.132036784 +0.133405391 +0.134760777 +0.136102678 +0.137430828 +0.138744963 +0.140044816 +0.141330123 +0.142600618 +0.143856036 +0.145096112 +0.146320582 +0.147529181 +0.148721644 +0.149897706 +0.151057105 +0.152199576 +0.153324856 +0.154432682 +0.155522792 +0.156594922 +0.157648812 +0.158684199 +0.159700824 +0.160698425 +0.161676743 +0.162635519 +0.163574495 +0.164493411 +0.165392012 +0.16627004 +0.167127241 +0.167963358 +0.168778137 +0.169571326 +0.170342672 +0.171091923 +0.171818829 +0.172523139 +0.173204606 +0.173862982 +0.17449802 +0.175109475 +0.175697102 +0.176260659 +0.176799903 +0.177314594 +0.177804492 +0.178269359 +0.178708959 +0.179123056 +0.179511416 +0.179873807 +0.180209997 +0.180519758 +0.18080286 +0.181059079 +0.181288188 +0.181489966 +0.18166419 +0.18181064 +0.1819291 +0.182019353 +0.182081184 +0.182114381 +0.182118734 +0.182094035 +0.182040076 +0.181956652 +0.181843563 +0.181700606 +0.181527585 +0.181324302 +0.181090564 +0.180826179 +0.180530957 +0.180204712 +0.179847259 +0.179458415 +0.179038 +0.178585837 +0.17810175 +0.177585567 +0.177037119 +0.176456236 +0.175842756 +0.175196515 +0.174517354 +0.173805117 +0.173059649 +0.172280799 +0.171468419 +0.170622364 +0.16974249 +0.168828659 +0.167880733 +0.166898579 +0.165882067 +0.164831068 +0.163745459 +0.162625117 +0.161469926 +0.16027977 +0.159054537 +0.157794119 +0.156498411 +0.155167312 +0.153800722 +0.152398546 +0.150960694 +0.149487078 +0.147977611 +0.146432214 +0.144850809 +0.143233322 +0.141579683 +0.139889825 +0.138163684 +0.136401203 +0.134602324 +0.132766997 +0.130895173 +0.128986808 +0.127041862 +0.125060298 +0.123042084 +0.120987191 +0.118895593 +0.116767272 +0.114602208 +0.112400391 +0.110161811 +0.107886464 +0.105574348 +0.103225468 +0.100839832 +0.0984174501 +0.0959583398 +0.0934625209 +0.0909300179 +0.0883608595 +0.0857550786 +0.0831127126 +0.080433803 +0.0777183955 +0.0749665405 +0.0721782924 +0.0693537102 +0.0664928572 +0.063595801 +0.0606626138 +0.0576933721 +0.0546881569 +0.0516470535 +0.048570152 +0.0454575466 +0.0423093363 +0.0391256243 +0.0359065186 +0.0326521316 +0.0293625802 +0.0260379857 +0.0226784744 +0.0192841766 +0.0158552276 +0.012391767 +0.00889393905 +0.00536189258 +0.00179578101 +0.00180423768 +0.00543800092 +0.00910534154 +0.0128060878 +0.0165400634 +0.0203070873 +0.0241069742 +0.0279395338 +0.0318045715 +0.0357018881 +0.0396312796 +0.0435925378 +0.0475854495 +0.0516097974 +0.0556653592 +0.0597519083 +0.0638692136 +0.0680170393 +0.0721951451 +0.0764032864 +0.0806412138 +0.0849086736 +0.0892054076 +0.093531153 +0.0978856428 +0.102268605 +0.106679764 +0.11111884 +0.115585547 +0.120079596 +0.124600694 +0.129148542 +0.13372284 +0.138323279 +0.14294955 +0.147601337 +0.152278322 +0.15698018 +0.161706584 +0.166457202 +0.171231698 +0.176029732 +0.180850961 +0.185695035 +0.190561602 +0.195450308 +0.20036079 +0.205292685 +0.210245626 +0.215219239 +0.22021315 +0.225226979 +0.230260342 +0.235312853 +0.240384121 +0.245473751 +0.250581345 +0.255706502 +0.260848817 +0.26600788 +0.27118328 +0.276374601 +0.281581424 +0.286803327 +0.292039885 +0.297290667 +0.302555242 +0.307833176 +0.313124029 +0.318427359 +0.323742723 +0.329069674 +0.334407759 +0.339756527 +0.34511552 +0.350484281 +0.355862347 +0.361249254 +0.366644535 +0.37204772 +0.377458337 +0.382875911 +0.388299966 +0.393730022 +0.399165597 +0.404606208 +0.410051367 +0.415500588 +0.420953378 +0.426409247 +0.431867699 +0.437328238 +0.442790366 +0.448253583 +0.453717387 +0.459181275 +0.464644741 +0.47010728 +0.475568384 +0.481027542 +0.486484244 +0.491937977 +0.49738823 +0.502834486 +0.508276231 +0.513712948 +0.519144118 +0.524569225 +0.529987747 +0.535399166 +0.54080296 +0.546198607 +0.551585586 +0.556963375 +0.562331449 +0.567689286 +0.573036362 +0.578372154 +0.583696136 +0.589007785 +0.594306577 +0.599591988 +0.604863493 +0.610120569 +0.615362691 +0.620589338 +0.625799986 +0.630994112 +0.636171196 +0.641330714 +0.646472148 +0.651594977 +0.656698682 +0.661782746 +0.66684665 +0.671889879 +0.676911918 +0.681912253 +0.686890372 +0.691845763 +0.696777916 +0.701686324 +0.706570479 +0.711429876 +0.716264011 +0.721072383 +0.725854492 +0.730609839 +0.735337929 +0.740038267 +0.744710361 +0.749353722 +0.753967862 +0.758552295 +0.76310654 +0.767630114 +0.77212254 +0.776583344 +0.781012051 +0.785408193 +0.789771302 +0.794100914 +0.798396567 +0.802657803 +0.806884166 +0.811075205 +0.81523047 +0.819349515 +0.823431898 +0.827477181 +0.831484927 +0.835454704 +0.839386083 +0.843278641 +0.847131955 +0.850945609 +0.854719188 +0.858452283 +0.862144489 +0.865795403 +0.869404628 +0.87297177 +0.87649644 +0.879978254 +0.883416829 +0.88681179 +0.890162765 +0.893469386 +0.89673129 +0.899948119 +0.903119519 +0.906245141 +0.90932464 +0.912357677 +0.915343917 +0.918283031 +0.921174693 +0.924018584 +0.926814389 +0.929561797 +0.932260506 +0.934910214 +0.937510627 +0.940061458 +0.942562422 +0.94501324 +0.947413641 +0.949763357 +0.952062125 +0.95430969 +0.9565058 +0.958650211 +0.960742682 +0.96278298 +0.964770876 +0.966706149 +0.968588581 +0.970417962 +0.972194086 +0.973916755 +0.975585775 +0.977200958 +0.978762125 +0.980269098 +0.98172171 +0.983119796 +0.984463199 +0.985751769 +0.98698536 +0.988163834 +0.989287057 +0.990354904 +0.991367254 +0.992323993 +0.993225013 +0.994070213 +0.994859497 +0.995592777 +0.996269969 +0.996890997 +0.997455792 +0.997964289 +0.99841643 +0.998812166 +0.999151452 +0.999434248 +0.999660523 +0.999830252 +0.999943415 +1 +1 +0.999943415 +0.999830252 +0.999660523 +0.999434248 +0.999151452 +0.998812166 +0.99841643 +0.997964289 +0.997455792 +0.996890997 +0.996269969 +0.995592777 +0.994859497 +0.994070213 +0.993225013 +0.992323993 +0.991367254 +0.990354904 +0.989287057 +0.988163834 +0.98698536 +0.985751769 +0.984463199 +0.983119796 +0.98172171 +0.980269098 +0.978762125 +0.977200958 +0.975585775 +0.973916755 +0.972194086 +0.970417962 +0.968588581 +0.966706149 +0.964770876 +0.96278298 +0.960742682 +0.958650211 +0.9565058 +0.95430969 +0.952062125 +0.949763357 +0.947413641 +0.94501324 +0.942562422 +0.940061458 +0.937510627 +0.934910214 +0.932260506 +0.929561797 +0.926814389 +0.924018584 +0.921174693 +0.918283031 +0.915343917 +0.912357677 +0.90932464 +0.906245141 +0.903119519 +0.899948119 +0.89673129 +0.893469386 +0.890162765 +0.88681179 +0.883416829 +0.879978254 +0.87649644 +0.87297177 +0.869404628 +0.865795403 +0.862144489 +0.858452283 +0.854719188 +0.850945609 +0.847131955 +0.843278641 +0.839386083 +0.835454704 +0.831484927 +0.827477181 +0.823431898 +0.819349515 +0.81523047 +0.811075205 +0.806884166 +0.802657803 +0.798396567 +0.794100914 +0.789771302 +0.785408193 +0.781012051 +0.776583344 +0.77212254 +0.767630114 +0.76310654 +0.758552295 +0.753967862 +0.749353722 +0.744710361 +0.740038267 +0.735337929 +0.730609839 +0.725854492 +0.721072383 +0.716264011 +0.711429876 +0.706570479 +0.701686324 +0.696777916 +0.691845763 +0.686890372 +0.681912253 +0.676911918 +0.671889879 +0.66684665 +0.661782746 +0.656698682 +0.651594977 +0.646472148 +0.641330714 +0.636171196 +0.630994112 +0.625799986 +0.620589338 +0.615362691 +0.610120569 +0.604863493 +0.599591988 +0.594306577 +0.589007785 +0.583696136 +0.578372154 +0.573036362 +0.567689286 +0.562331449 +0.556963375 +0.551585586 +0.546198607 +0.54080296 +0.535399166 +0.529987747 +0.524569225 +0.519144118 +0.513712948 +0.508276231 +0.502834486 +0.49738823 +0.491937977 +0.486484244 +0.481027542 +0.475568384 +0.47010728 +0.464644741 +0.459181275 +0.453717387 +0.448253583 +0.442790366 +0.437328238 +0.431867699 +0.426409247 +0.420953378 +0.415500588 +0.410051367 +0.404606208 +0.399165597 +0.393730022 +0.388299966 +0.382875911 +0.377458337 +0.37204772 +0.366644535 +0.361249254 +0.355862347 +0.350484281 +0.34511552 +0.339756527 +0.334407759 +0.329069674 +0.323742723 +0.318427359 +0.313124029 +0.307833176 +0.302555242 +0.297290667 +0.292039885 +0.286803327 +0.281581424 +0.276374601 +0.27118328 +0.26600788 +0.260848817 +0.255706502 +0.250581345 +0.245473751 +0.240384121 +0.235312853 +0.230260342 +0.225226979 +0.22021315 +0.215219239 +0.210245626 +0.205292685 +0.20036079 +0.195450308 +0.190561602 +0.185695035 +0.180850961 +0.176029732 +0.171231698 +0.166457202 +0.161706584 +0.15698018 +0.152278322 +0.147601337 +0.14294955 +0.138323279 +0.13372284 +0.129148542 +0.124600694 +0.120079596 +0.115585547 +0.11111884 +0.106679764 +0.102268605 +0.0978856428 +0.093531153 +0.0892054076 +0.0849086736 +0.0806412138 +0.0764032864 +0.0721951451 +0.0680170393 +0.0638692136 +0.0597519083 +0.0556653592 +0.0516097974 +0.0475854495 +0.0435925378 +0.0396312796 +0.0357018881 +0.0318045715 +0.0279395338 +0.0241069742 +0.0203070873 +0.0165400634 +0.0128060878 +0.00910534154 +0.00543800092 +0.00180423768 +0.00179578101 +0.00536189258 +0.00889393905 +0.012391767 +0.0158552276 +0.0192841766 +0.0226784744 +0.0260379857 +0.0293625802 +0.0326521316 +0.0359065186 +0.0391256243 +0.0423093363 +0.0454575466 +0.048570152 +0.0516470535 +0.0546881569 +0.0576933721 +0.0606626138 +0.063595801 +0.0664928572 +0.0693537102 +0.0721782924 +0.0749665405 +0.0777183955 +0.080433803 +0.0831127126 +0.0857550786 +0.0883608595 +0.0909300179 +0.0934625209 +0.0959583398 +0.0984174501 +0.100839832 +0.103225468 +0.105574348 +0.107886464 +0.110161811 +0.112400391 +0.114602208 +0.116767272 +0.118895593 +0.120987191 +0.123042084 +0.125060298 +0.127041862 +0.128986808 +0.130895173 +0.132766997 +0.134602324 +0.136401203 +0.138163684 +0.139889825 +0.141579683 +0.143233322 +0.144850809 +0.146432214 +0.147977611 +0.149487078 +0.150960694 +0.152398546 +0.153800722 +0.155167312 +0.156498411 +0.157794119 +0.159054537 +0.16027977 +0.161469926 +0.162625117 +0.163745459 +0.164831068 +0.165882067 +0.166898579 +0.167880733 +0.168828659 +0.16974249 +0.170622364 +0.171468419 +0.172280799 +0.173059649 +0.173805117 +0.174517354 +0.175196515 +0.175842756 +0.176456236 +0.177037119 +0.177585567 +0.17810175 +0.178585837 +0.179038 +0.179458415 +0.179847259 +0.180204712 +0.180530957 +0.180826179 +0.181090564 +0.181324302 +0.181527585 +0.181700606 +0.181843563 +0.181956652 +0.182040076 +0.182094035 +0.182118734 +0.182114381 +0.182081184 +0.182019353 +0.1819291 +0.18181064 +0.18166419 +0.181489966 +0.181288188 +0.181059079 +0.18080286 +0.180519758 +0.180209997 +0.179873807 +0.179511416 +0.179123056 +0.178708959 +0.178269359 +0.177804492 +0.177314594 +0.176799903 +0.176260659 +0.175697102 +0.175109475 +0.17449802 +0.173862982 +0.173204606 +0.172523139 +0.171818829 +0.171091923 +0.170342672 +0.169571326 +0.168778137 +0.167963358 +0.167127241 +0.16627004 +0.165392012 +0.164493411 +0.163574495 +0.162635519 +0.161676743 +0.160698425 +0.159700824 +0.158684199 +0.157648812 +0.156594922 +0.155522792 +0.154432682 +0.153324856 +0.152199576 +0.151057105 +0.149897706 +0.148721644 +0.147529181 +0.146320582 +0.145096112 +0.143856036 +0.142600618 +0.141330123 +0.140044816 +0.138744963 +0.137430828 +0.136102678 +0.134760777 +0.133405391 +0.132036784 +0.130655223 +0.129260972 +0.127854296 +0.126435461 +0.125004729 +0.123562367 +0.122108639 +0.120643807 +0.119168137 +0.117681891 +0.116185332 +0.114678724 +0.113162329 +0.111636408 +0.110101223 +0.108557036 +0.107004107 +0.105442696 +0.103873064 +0.102295468 +0.100710168 +0.0991174227 +0.0975174883 +0.0959106221 +0.0942970804 +0.0926771188 +0.0910509922 +0.0894189547 +0.08778126 +0.0861381606 +0.0844899088 +0.0828367557 +0.0811789518 +0.0795167467 +0.0778503893 +0.0761801275 +0.0745062084 +0.0728288782 +0.0711483822 +0.069464965 +0.0677788698 +0.0660903392 +0.0643996147 +0.0627069369 +0.0610125454 +0.0593166785 +0.0576195739 +0.0559214679 +0.0542225958 +0.052523192 +0.0508234896 +0.0491237206 +0.0474241159 +0.0457249053 +0.0440263174 +0.0423285795 +0.040631918 +0.0389365578 +0.0372427227 +0.0355506353 +0.0338605169 +0.0321725875 +0.0304870658 +0.0288041694 +0.0271241144 +0.0254471156 +0.0237733866 +0.0221031396 +0.0204365853 +0.0187739332 +0.0171153914 +0.0154611666 +0.013811464 +0.0121664874 +0.0105264393 +0.00889152073 +0.00726193113 +0.00563786858 +0.00401952967 +0.00240710951 +0.00080080169 + +# Comment added to ensure editors preserve the preceding blank line. Pypulseq hangs if it is not present.