Skip to content

Commit c28a20a

Browse files
committed
[c++/m] Refactor nix.MultiTag retrieveData function
- rename existing function to retrieveDataIdx - remove index manipulation on Matlab side - rewrite existing test
1 parent 60130ab commit c28a20a

File tree

5 files changed

+72
-28
lines changed

5 files changed

+72
-28
lines changed

+nix/MultiTag.m

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,10 @@
6262
'MultiTag::openReferenceIdx', idx, @nix.DataArray);
6363
end;
6464

65-
function data = retrieve_data(obj, pos_index, ref_index)
66-
% convert Matlab-like to C-like index
67-
assert(pos_index > 0, 'Position index must be positive');
68-
assert(ref_index > 0, 'Reference index must be positive');
69-
tmp = nix_mx('MultiTag::retrieveData', obj.nix_handle, ...
70-
pos_index - 1, ref_index - 1);
65+
function data = retrieve_data_idx(obj, pos_idx, ref_idx)
66+
tmp = nix_mx('MultiTag::retrieveDataIdx', obj.nix_handle, pos_idx, ref_idx);
7167

72-
% data must agree with file & dimensions
73-
% see mkarray.cc(42)
68+
% data must agree with file & dimensions see mkarray.cc(42)
7469
data = permute(tmp, length(size(tmp)):-1:1);
7570
end;
7671

nix_mx.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,6 @@ void mexFunction(int nlhs,
364364
.reg("sourceCount", GETTER(nix::ndsize_t, nix::MultiTag, sourceCount))
365365
.reg("referenceCount", GETTER(nix::ndsize_t, nix::MultiTag, referenceCount))
366366
.reg("featureCount", GETTER(nix::ndsize_t, nix::MultiTag, featureCount));
367-
methods->add("MultiTag::retrieveData", nixmultitag::retrieveData);
368367
methods->add("MultiTag::featureRetrieveData", nixmultitag::retrieveFeatureData);
369368
methods->add("MultiTag::addReference", nixmultitag::addReference);
370369
methods->add("MultiTag::addReferences", nixmultitag::addReferences);
@@ -379,6 +378,7 @@ void mexFunction(int nlhs,
379378
methods->add("MultiTag::sourcesFiltered", nixmultitag::sourcesFiltered);
380379
methods->add("MultiTag::referencesFiltered", nixmultitag::referencesFiltered);
381380
methods->add("MultiTag::featuresFiltered", nixmultitag::featuresFiltered);
381+
methods->add("MultiTag::retrieveDataIdx", nixmultitag::retrieveDataIdx);
382382

383383
classdef<nix::Section>("Section", methods)
384384
.desc(&nixsection::describe)

src/nixmultitag.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,6 @@ namespace nixmultitag {
6161
output.set(0, handle(newFeat));
6262
}
6363

64-
void retrieveData(const extractor &input, infusor &output) {
65-
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
66-
double p_index = input.num<double>(2);
67-
double f_index = input.num<double>(3);
68-
69-
mxArray *data = make_mx_array_from_ds(currObj.retrieveData(p_index, f_index));
70-
output.set(0, data);
71-
}
72-
7364
void retrieveFeatureData(const extractor &input, infusor &output) {
7465
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
7566
double p_index = input.num<double>(2);
@@ -135,4 +126,13 @@ namespace nixmultitag {
135126
output.set(0, res);
136127
}
137128

129+
void retrieveDataIdx(const extractor &input, infusor &output) {
130+
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
131+
size_t pos_idx = (size_t)input.num<double>(2);
132+
size_t ref_idx = (size_t)input.num<double>(3);
133+
134+
mxArray *data = make_mx_array_from_ds(currObj.retrieveData(pos_idx, ref_idx));
135+
output.set(0, data);
136+
}
137+
138138
} // namespace nixmultitag

src/nixmultitag.h

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

2626
void createFeature(const extractor &input, infusor &output);
2727

28-
void retrieveData(const extractor &input, infusor &output);
29-
3028
void retrieveFeatureData(const extractor &input, infusor &output);
3129

3230
void addPositions(const extractor &input, infusor &output);
@@ -45,6 +43,8 @@ namespace nixmultitag {
4543

4644
void featuresFiltered(const extractor &input, infusor &output);
4745

46+
void retrieveDataIdx(const extractor &input, infusor &output);
47+
4848
} // namespace nixmultitag
4949

5050
#endif

tests/TestMultiTag.m

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +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;
43+
funcs{end+1} = @test_retrieve_data_idx;
4444
funcs{end+1} = @test_retrieve_feature_data;
4545
funcs{end+1} = @test_set_units;
4646
funcs{end+1} = @test_attrs;
@@ -644,14 +644,63 @@
644644
assert(strcmp(t.open_metadata.name, 'testSection'));
645645
end
646646

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

653-
data = tag.retrieve_data(1, 1);
654-
assert(~isempty(data));
701+
assert(isequal(t.retrieve_data_idx(0, 0), raw1(1:1)), 'Retrieve pos 1, ref 1 fail');
702+
assert(isequal(t.retrieve_data_idx(1, 0), raw1(2, 2:4)), 'Retrieve pos 2, ref 1 fail');
703+
assert(isequal(t.retrieve_data_idx(2, 1), raw2(1:2, 3:6)), 'Retrieve pos 3, ref 2 fail');
655704
end
656705

657706
%% Test: Retrieve feature data

0 commit comments

Comments
 (0)