Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
365 changes: 359 additions & 6 deletions cpp/mrd/binary/protocols.cc

Large diffs are not rendered by default.

334 changes: 312 additions & 22 deletions cpp/mrd/hdf5/protocols.cc

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions cpp/mrd/hdf5/protocols.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class MrdWriter : public mrd::MrdWriterBase, public yardl::hdf5::Hdf5Writer {
void Flush() override;

private:
std::unique_ptr<yardl::hdf5::UnionDatasetWriter<14>> data_dataset_state_;
std::unique_ptr<yardl::hdf5::UnionDatasetWriter<22>> data_dataset_state_;
};

// HDF5 reader for the Mrd protocol.
Expand All @@ -42,7 +42,7 @@ class MrdReader : public mrd::MrdReaderBase, public yardl::hdf5::Hdf5Reader {
bool ReadDataImpl(mrd::StreamItem& value) override;

private:
std::unique_ptr<yardl::hdf5::UnionDatasetReader<14>> data_dataset_state_;
std::unique_ptr<yardl::hdf5::UnionDatasetReader<22>> data_dataset_state_;
};

// HDF5 writer for the MrdNoiseCovariance protocol.
Expand Down
403 changes: 372 additions & 31 deletions cpp/mrd/ndjson/protocols.cc

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cpp/mrd/protocols.cc

Large diffs are not rendered by default.

100 changes: 92 additions & 8 deletions cpp/mrd/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -866,12 +866,13 @@ struct ImageFlags : yardl::BaseFlags<uint64_t, ImageFlags> {
static const ImageFlags kLastInSet;
};

enum class ImageType {
kMagnitude = 1,
kPhase = 2,
kReal = 3,
kImag = 4,
kComplex = 5,
enum class ImageType : uint64_t {
kMagnitude = 1ULL,
kPhase = 2ULL,
kReal = 3ULL,
kImag = 4ULL,
kComplex = 5ULL,
kRgbaMap = 6ULL,
};

template <typename Y>
Expand Down Expand Up @@ -1014,7 +1015,7 @@ struct NoiseCovariance {
std::vector<mrd::CoilLabelType> coil_labels{};
// Comes from Header.acquisitionSystemInformation.relativeReceiverNoiseBandwidth
float receiver_noise_bandwidth{};
// Comes from Acquisition.sampleTimeNs
// Comes from Acquisition.sampleTimeUs
uint64_t noise_dwell_time_ns{};
// Number of samples used to compute matrix
yardl::Size sample_count{};
Expand Down Expand Up @@ -1210,8 +1211,91 @@ using Array = yardl::DynamicNDArray<T>;

using ArrayComplexFloat = mrd::Array<std::complex<float>>;

enum class ArrayType {
kSpinDensityMap = 1,
kT1Map = 2,
kT2Map = 3,
kT2starMap = 4,
kAdcMap = 5,
kB0Map = 6,
kB1Map = 7,
kSensitivityMap = 8,
kGfactorMap = 9,
kUserMap = 10,
};

using ArrayMetaValue = std::variant<std::string, int64_t, double>;

using ArrayMeta = std::unordered_map<std::string, std::vector<mrd::ArrayMetaValue>>;

enum class ArrayDimension {
kChannel = 0,
kZ = 1,
kY = 2,
kX = 3,
kFrequency = 4,
kBasis = 5,
kSamples = 6,
kLoc = 7,
kS = 8,
kN = 9,
kE2 = 10,
kE1 = 11,
kE0 = 12,
kTime = 13,
};

struct NDArrayHeader {
std::vector<mrd::ArrayDimension> dimension_labels{};
mrd::ArrayType array_type{};
mrd::ArrayMeta meta{};

bool operator==(const NDArrayHeader& other) const {
return dimension_labels == other.dimension_labels &&
array_type == other.array_type &&
meta == other.meta;
}

bool operator!=(const NDArrayHeader& other) const {
return !(*this == other);
}
};

template <typename T>
struct NDArray {
mrd::NDArrayHeader head{};
mrd::Array<T> data{};

bool operator==(const NDArray& other) const {
return head == other.head &&
data == other.data;
}

bool operator!=(const NDArray& other) const {
return !(*this == other);
}
};

using NDArrayUint16 = mrd::NDArray<uint16_t>;

using NDArrayInt16 = mrd::NDArray<int16_t>;

using NDArrayUint32 = mrd::NDArray<uint32_t>;

using NDArrayInt32 = mrd::NDArray<int32_t>;

using NDArrayFloat = mrd::NDArray<float>;

using NDArrayDouble = mrd::NDArray<double>;

using NDArrayComplexFloat = mrd::NDArray<std::complex<float>>;

using NDArrayComplexDouble = mrd::NDArray<std::complex<double>>;

using AnyNDArray = std::variant<mrd::NDArrayUint16, mrd::NDArrayInt16, mrd::NDArrayUint32, mrd::NDArrayInt32, mrd::NDArrayFloat, mrd::NDArrayDouble, mrd::NDArrayComplexFloat, mrd::NDArrayComplexDouble>;

// Union of all primary types that can be streamed in the MRD Protocol
using StreamItem = std::variant<mrd::Acquisition, mrd::WaveformUint32, mrd::ImageUint16, mrd::ImageInt16, mrd::ImageUint32, mrd::ImageInt32, mrd::ImageFloat, mrd::ImageDouble, mrd::ImageComplexFloat, mrd::ImageComplexDouble, mrd::AcquisitionBucket, mrd::ReconData, mrd::ArrayComplexFloat, mrd::ImageArray>;
using StreamItem = std::variant<mrd::Acquisition, mrd::WaveformUint32, mrd::ImageUint16, mrd::ImageInt16, mrd::ImageUint32, mrd::ImageInt32, mrd::ImageFloat, mrd::ImageDouble, mrd::ImageComplexFloat, mrd::ImageComplexDouble, mrd::AcquisitionBucket, mrd::ReconData, mrd::ArrayComplexFloat, mrd::ImageArray, mrd::NDArrayUint16, mrd::NDArrayInt16, mrd::NDArrayUint32, mrd::NDArrayInt32, mrd::NDArrayFloat, mrd::NDArrayDouble, mrd::NDArrayComplexFloat, mrd::NDArrayComplexDouble>;

} // namespace mrd

2 changes: 1 addition & 1 deletion matlab/toolbox/+mrd/+binary/ImageHeaderSerializer.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
field_serializers{14} = yardl.binary.OptionalSerializer(yardl.binary.Uint32Serializer);
field_serializers{15} = yardl.binary.OptionalSerializer(yardl.binary.Uint64Serializer);
field_serializers{16} = yardl.binary.VectorSerializer(yardl.binary.Uint64Serializer);
field_serializers{17} = yardl.binary.EnumSerializer('mrd.ImageType', @mrd.ImageType, yardl.binary.Int32Serializer);
field_serializers{17} = yardl.binary.EnumSerializer('mrd.ImageType', @mrd.ImageType, yardl.binary.Uint64Serializer);
field_serializers{18} = yardl.binary.OptionalSerializer(yardl.binary.Uint32Serializer);
field_serializers{19} = yardl.binary.OptionalSerializer(yardl.binary.Uint32Serializer);
field_serializers{20} = yardl.binary.VectorSerializer(yardl.binary.Int32Serializer);
Expand Down
2 changes: 1 addition & 1 deletion matlab/toolbox/+mrd/+binary/MrdReader.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
[email protected](skip_completed_check=options.skip_completed_check);
[email protected](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.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.NDArraySerializer(yardl.binary.Uint16Serializer), mrd.binary.NDArraySerializer(yardl.binary.Int16Serializer), mrd.binary.NDArraySerializer(yardl.binary.Uint32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Int32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Float32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Float64Serializer), mrd.binary.NDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Complexfloat64Serializer)}, {@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, @mrd.StreamItem.NdArrayUint16, @mrd.StreamItem.NdArrayInt16, @mrd.StreamItem.NdArrayUint32, @mrd.StreamItem.NdArrayInt32, @mrd.StreamItem.NdArrayFloat, @mrd.StreamItem.NdArrayDouble, @mrd.StreamItem.NdArrayComplexFloat, @mrd.StreamItem.NdArrayComplexDouble}));
end
end

Expand Down
2 changes: 1 addition & 1 deletion matlab/toolbox/+mrd/+binary/MrdWriter.m
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
[email protected]();
[email protected](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.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.NDArraySerializer(yardl.binary.Uint16Serializer), mrd.binary.NDArraySerializer(yardl.binary.Int16Serializer), mrd.binary.NDArraySerializer(yardl.binary.Uint32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Int32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Float32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Float64Serializer), mrd.binary.NDArraySerializer(yardl.binary.Complexfloat32Serializer), mrd.binary.NDArraySerializer(yardl.binary.Complexfloat64Serializer)}, {@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, @mrd.StreamItem.NdArrayUint16, @mrd.StreamItem.NdArrayInt16, @mrd.StreamItem.NdArrayUint32, @mrd.StreamItem.NdArrayInt32, @mrd.StreamItem.NdArrayFloat, @mrd.StreamItem.NdArrayDouble, @mrd.StreamItem.NdArrayComplexFloat, @mrd.StreamItem.NdArrayComplexDouble}));
end
end

Expand Down
26 changes: 26 additions & 0 deletions matlab/toolbox/+mrd/+binary/NDArrayHeaderSerializer.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
% This file was generated by the "yardl" tool. DO NOT EDIT.

classdef NDArrayHeaderSerializer < yardl.binary.RecordSerializer
methods
function self = NDArrayHeaderSerializer()
field_serializers{1} = yardl.binary.VectorSerializer(yardl.binary.EnumSerializer('mrd.ArrayDimension', @mrd.ArrayDimension, yardl.binary.Int32Serializer));
field_serializers{2} = yardl.binary.EnumSerializer('mrd.ArrayType', @mrd.ArrayType, yardl.binary.Int32Serializer);
field_serializers{3} = yardl.binary.MapSerializer(yardl.binary.StringSerializer, yardl.binary.VectorSerializer(yardl.binary.UnionSerializer('mrd.ArrayMetaValue', {yardl.binary.StringSerializer, yardl.binary.Int64Serializer, yardl.binary.Float64Serializer}, {@mrd.ArrayMetaValue.String, @mrd.ArrayMetaValue.Int64, @mrd.ArrayMetaValue.Float64})));
[email protected]('mrd.NDArrayHeader', field_serializers);
end

function write(self, outstream, value)
arguments
self
outstream (1,1) yardl.binary.CodedOutputStream
value (1,1) mrd.NDArrayHeader
end
self.write_(outstream, value.dimension_labels, value.array_type, value.meta);
end

function value = read(self, instream)
fields = self.read_(instream);
value = mrd.NDArrayHeader(dimension_labels=fields{1}, array_type=fields{2}, meta=fields{3});
end
end
end
25 changes: 25 additions & 0 deletions matlab/toolbox/+mrd/+binary/NDArraySerializer.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
% This file was generated by the "yardl" tool. DO NOT EDIT.

classdef NDArraySerializer < yardl.binary.RecordSerializer
methods
function self = NDArraySerializer(t_serializer)
field_serializers{1} = mrd.binary.NDArrayHeaderSerializer();
field_serializers{2} = yardl.binary.DynamicNDArraySerializer(t_serializer);
[email protected]('mrd.NDArray', field_serializers);
end

function write(self, outstream, value)
arguments
self
outstream (1,1) yardl.binary.CodedOutputStream
value (1,1) mrd.NDArray
end
self.write_(outstream, value.head, value.data);
end

function value = read(self, instream)
fields = self.read_(instream);
value = mrd.NDArray(head=fields{1}, data=fields{2});
end
end
end
97 changes: 97 additions & 0 deletions matlab/toolbox/+mrd/AnyNDArray.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
% This file was generated by the "yardl" tool. DO NOT EDIT.

classdef AnyNDArray < yardl.Union
methods (Static)
function res = NDArrayUint16(value)
res = mrd.AnyNDArray(1, value);
end

function res = NDArrayInt16(value)
res = mrd.AnyNDArray(2, value);
end

function res = NDArrayUint32(value)
res = mrd.AnyNDArray(3, value);
end

function res = NDArrayInt32(value)
res = mrd.AnyNDArray(4, value);
end

function res = NDArrayFloat(value)
res = mrd.AnyNDArray(5, value);
end

function res = NDArrayDouble(value)
res = mrd.AnyNDArray(6, value);
end

function res = NDArrayComplexFloat(value)
res = mrd.AnyNDArray(7, value);
end

function res = NDArrayComplexDouble(value)
res = mrd.AnyNDArray(8, value);
end

function z = zeros(varargin)
elem = mrd.AnyNDArray(0, yardl.None);
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

methods
function res = isNDArrayUint16(self)
res = self.index == 1;
end

function res = isNDArrayInt16(self)
res = self.index == 2;
end

function res = isNDArrayUint32(self)
res = self.index == 3;
end

function res = isNDArrayInt32(self)
res = self.index == 4;
end

function res = isNDArrayFloat(self)
res = self.index == 5;
end

function res = isNDArrayDouble(self)
res = self.index == 6;
end

function res = isNDArrayComplexFloat(self)
res = self.index == 7;
end

function res = isNDArrayComplexDouble(self)
res = self.index == 8;
end

function eq = eq(self, other)
eq = isa(other, "mrd.AnyNDArray") && all([self.index_] == [other.index_], 'all') && all([self.value] == [other.value], 'all');
end

function ne = ne(self, other)
ne = ~self.eq(other);
end

function t = tag(self)
tags_ = ["NDArrayUint16", "NDArrayInt16", "NDArrayUint32", "NDArrayInt32", "NDArrayFloat", "NDArrayDouble", "NDArrayComplexFloat", "NDArrayComplexDouble"];
t = tags_(self.index_);
end
end
end
61 changes: 61 additions & 0 deletions matlab/toolbox/+mrd/ArrayDimension.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
% This file was generated by the "yardl" tool. DO NOT EDIT.

classdef ArrayDimension < uint64
methods (Static)
function v = CHANNEL
v = mrd.ArrayDimension(0);
end
function v = Z
v = mrd.ArrayDimension(1);
end
function v = Y
v = mrd.ArrayDimension(2);
end
function v = X
v = mrd.ArrayDimension(3);
end
function v = FREQUENCY
v = mrd.ArrayDimension(4);
end
function v = BASIS
v = mrd.ArrayDimension(5);
end
function v = SAMPLES
v = mrd.ArrayDimension(6);
end
function v = LOC
v = mrd.ArrayDimension(7);
end
function v = S
v = mrd.ArrayDimension(8);
end
function v = N
v = mrd.ArrayDimension(9);
end
function v = E2
v = mrd.ArrayDimension(10);
end
function v = E1
v = mrd.ArrayDimension(11);
end
function v = E0
v = mrd.ArrayDimension(12);
end
function v = TIME
v = mrd.ArrayDimension(13);
end

function z = zeros(varargin)
elem = mrd.ArrayDimension(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
4 changes: 4 additions & 0 deletions matlab/toolbox/+mrd/ArrayMeta.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
% This file was generated by the "yardl" tool. DO NOT EDIT.

classdef ArrayMeta < yardl.Map
end
Loading
Loading