Skip to content

Commit f43ab97

Browse files
committed
[c++/m] Add nix.MultiTag retrieveData
1 parent 923401c commit f43ab97

File tree

5 files changed

+83
-0
lines changed

5 files changed

+83
-0
lines changed

+nix/MultiTag.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@
6262
'MultiTag::openReferenceIdx', idx, @nix.DataArray);
6363
end;
6464

65+
function data = retrieve_data(obj, pos_idx, id_or_name)
66+
tmp = nix_mx('MultiTag::retrieveData', obj.nix_handle, pos_idx, id_or_name);
67+
68+
% data must agree with file & dimensions see mkarray.cc(42)
69+
data = permute(tmp, length(size(tmp)):-1:1);
70+
end;
71+
6572
function data = retrieve_data_idx(obj, pos_idx, ref_idx)
6673
tmp = nix_mx('MultiTag::retrieveDataIdx', obj.nix_handle, pos_idx, ref_idx);
6774

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ void mexFunction(int nlhs,
377377
methods->add("MultiTag::sourcesFiltered", nixmultitag::sourcesFiltered);
378378
methods->add("MultiTag::referencesFiltered", nixmultitag::referencesFiltered);
379379
methods->add("MultiTag::featuresFiltered", nixmultitag::featuresFiltered);
380+
methods->add("MultiTag::retrieveData", nixmultitag::retrieveData);
380381
methods->add("MultiTag::retrieveDataIdx", nixmultitag::retrieveDataIdx);
381382
methods->add("MultiTag::featureRetrieveDataIdx", nixmultitag::retrieveFeatureDataIdx);
382383

src/nixmultitag.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ namespace nixmultitag {
117117
output.set(0, res);
118118
}
119119

120+
void retrieveData(const extractor &input, infusor &output) {
121+
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
122+
size_t pos_idx = (size_t)input.num<double>(2);
123+
std::string name_id = input.str(3);
124+
125+
mxArray *data = make_mx_array_from_ds(currObj.retrieveData(pos_idx, name_id));
126+
output.set(0, data);
127+
}
128+
120129
void retrieveDataIdx(const extractor &input, infusor &output) {
121130
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
122131
size_t pos_idx = (size_t)input.num<double>(2);

src/nixmultitag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace nixmultitag {
4141

4242
void featuresFiltered(const extractor &input, infusor &output);
4343

44+
void retrieveData(const extractor &input, infusor &output);
45+
4446
void retrieveDataIdx(const extractor &input, infusor &output);
4547

4648
void retrieveFeatureDataIdx(const extractor &input, infusor &output);

tests/TestMultiTag.m

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
funcs{end+1} = @test_set_open_extents;
4141
funcs{end+1} = @test_set_metadata;
4242
funcs{end+1} = @test_open_metadata;
43+
funcs{end+1} = @test_retrieve_data;
4344
funcs{end+1} = @test_retrieve_data_idx;
4445
funcs{end+1} = @test_retrieve_feature_data_idx;
4546
funcs{end+1} = @test_set_units;
@@ -644,6 +645,69 @@
644645
assert(strcmp(t.open_metadata.name, 'testSection'));
645646
end
646647

648+
%% Test: Retrieve reference data by id or name
649+
function [] = test_retrieve_data( varargin )
650+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
651+
b = f.create_block('testBlock', 'nixBlock');
652+
653+
pos(1,:) = [0, 0]; ext(1,:) = [0, 0]; % result 111
654+
pos(2,:) = [1, 1]; ext(2,:) = [0, 3]; % result 122 123 124
655+
pos(3,:) = [0, 2]; ext(3,:) = [2, 4]; % result 113 114 115 116
656+
% 123 124 125 126
657+
658+
d_pos = b.create_data_array_from_data('positionsDA', 'nixDataArray', pos);
659+
d_pos.append_sampled_dimension(0);
660+
d_pos.append_sampled_dimension(0);
661+
662+
d_ext = b.create_data_array_from_data('extentsDA', 'nixDataArray', ext);
663+
d_ext.append_sampled_dimension(0);
664+
d_ext.append_sampled_dimension(0);
665+
666+
t = b.create_multi_tag('testMultiTag', 'nixMultiTag', d_pos);
667+
t.set_extents(d_ext);
668+
669+
% create 2D reference data_arrays
670+
raw1 = [111, 112, 113, 114, 115, 116, 117, 118; ...
671+
121, 122, 123, 124, 125, 126, 127, 128];
672+
d1 = b.create_data_array_from_data('reference1', 'nixDataArray', raw1);
673+
d1.append_sampled_dimension(1);
674+
d1.append_sampled_dimension(1);
675+
676+
raw2 = [211, 212, 213, 214, 215, 216, 217, 218; ...
677+
221, 222, 223, 224, 225, 226, 227, 228];
678+
d2 = b.create_data_array_from_data('reference2', 'nixDataArray', raw2);
679+
d2.append_sampled_dimension(1);
680+
d2.append_sampled_dimension(1);
681+
682+
% add data_arrays as references to multi tag
683+
t.add_reference(d1);
684+
t.add_reference(d2);
685+
686+
% test invalid position idx
687+
try
688+
t.retrieve_data(100, 'reference1');
689+
catch ME
690+
assert(~isempty(strfind(ME.message, 'ounds of positions or extents')), ...
691+
'Invalid position index failed');
692+
end
693+
assert(exist('ME') == 1, 'Invalid position index fail, error not raised');
694+
clear ME;
695+
696+
% test invalid reference name
697+
try
698+
t.retrieve_data(0, 'I do not exist');
699+
catch ME
700+
assert(~isempty(strfind(ME.message, 'no DataArray with the specified name or id')), ...
701+
'Invalid reference name failed');
702+
end
703+
assert(exist('ME') == 1, 'Invalid reference name fail, error not raised');
704+
clear ME;
705+
706+
assert(isequal(t.retrieve_data(0, d1.name), raw1(1:1)), 'Retrieve pos 1, ref 1 fail');
707+
assert(isequal(t.retrieve_data(1, d1.id), raw1(2, 2:4)), 'Retrieve pos 2, ref 1 fail');
708+
assert(isequal(t.retrieve_data(2, d2.id), raw2(1:2, 3:6)), 'Retrieve pos 3, ref 2 fail');
709+
end
710+
647711
%% Test: Retrieve reference data by index
648712
function [] = test_retrieve_data_idx( varargin )
649713
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);

0 commit comments

Comments
 (0)