Skip to content

Commit 60130ab

Browse files
committed
[c++/m] Add nix.Tag retrieveFeature Data function
1 parent a13b3f9 commit 60130ab

File tree

5 files changed

+65
-0
lines changed

5 files changed

+65
-0
lines changed

+nix/Tag.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@
121121
'Tag::openFeatureIdx', idx, @nix.Feature);
122122
end;
123123

124+
function data = retrieve_feature_data(obj, id_or_name)
125+
tmp = nix_mx('Tag::featureRetrieveData', obj.nix_handle, id_or_name);
126+
127+
% data must agree with file & dimensions
128+
% see mkarray.cc(42)
129+
data = permute(tmp, length(size(tmp)):-1:1);
130+
end
131+
124132
function data = retrieve_feature_data_idx(obj, idx)
125133
tmp = nix_mx('Tag::featureRetrieveDataIdx', obj.nix_handle, idx);
126134

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ void mexFunction(int nlhs,
331331
methods->add("Tag::featuresFiltered", nixtag::featuresFiltered);
332332
methods->add("Tag::retrieveData", nixtag::retrieveData);
333333
methods->add("Tag::retrieveDataIdx", nixtag::retrieveDataIdx);
334+
methods->add("Tag::featureRetrieveData", nixtag::retrieveFeatureData);
334335
methods->add("Tag::featureRetrieveDataIdx", nixtag::retrieveFeatureDataIdx);
335336

336337
classdef<nix::MultiTag>("MultiTag", methods)

src/nixtag.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ namespace nixtag {
130130
output.set(0, data);
131131
}
132132

133+
void retrieveFeatureData(const extractor &input, infusor &output) {
134+
nix::Tag currObj = input.entity<nix::Tag>(1);
135+
std::string name_id = input.str(2);
136+
137+
mxArray *data = make_mx_array_from_ds(currObj.retrieveFeatureData(name_id));
138+
output.set(0, data);
139+
}
140+
133141
void retrieveFeatureDataIdx(const extractor &input, infusor &output) {
134142
nix::Tag currObj = input.entity<nix::Tag>(1);
135143
nix::ndsize_t idx = (nix::ndsize_t)input.num<double>(2);

src/nixtag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ namespace nixtag {
4343

4444
void retrieveDataIdx(const extractor &input, infusor &output);
4545

46+
void retrieveFeatureData(const extractor &input, infusor &output);
47+
4648
void retrieveFeatureDataIdx(const extractor &input, infusor &output);
4749

4850
} // namespace nixtag

tests/TestTag.m

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
funcs{end+1} = @test_open_metadata;
3737
funcs{end+1} = @test_retrieve_data;
3838
funcs{end+1} = @test_retrieve_data_idx;
39+
funcs{end+1} = @test_retrieve_feature_data;
3940
funcs{end+1} = @test_retrieve_feature_data_idx;
4041
funcs{end+1} = @test_attrs;
4142
funcs{end+1} = @test_has_feature;
@@ -586,6 +587,51 @@
586587
assert(retData(1) == raw(t.position + 1), 'Position check failed');
587588
end
588589

590+
%% Test: Retrieve feature data by name and id
591+
function [] = test_retrieve_feature_data( varargin )
592+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
593+
b = f.create_block('testBlock', 'nixBlock');
594+
raw = [1, 2, 3, 4, 5, 6, 7, 8, 9];
595+
d = b.create_data_array_from_data('testDataArray', 'nixDataArray', raw);
596+
d.append_sampled_dimension(1);
597+
tagStartPos = [3];
598+
t = b.create_tag('testTag', 'nixTag', tagStartPos);
599+
t.extent = [3];
600+
t.add_reference(d);
601+
602+
rawFeature = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
603+
604+
% test get non existent
605+
try
606+
t.retrieve_data('I do not exist, dont hate me!');
607+
catch ME
608+
assert(~isempty(strfind(ME.message, 'no DataArray with the specified name')), ...
609+
'Non existent check fail');
610+
end
611+
612+
% test retrieve untagged feature data by name
613+
df = b.create_data_array_from_data('testUntagged', 'nixDataArray', rawFeature);
614+
df.append_sampled_dimension(1);
615+
t.add_feature(df, nix.LinkType.Untagged);
616+
retData = t.retrieve_feature_data('testUntagged');
617+
assert(size(retData, 2) == size(rawFeature, 2), 'Untagged size check fail');
618+
619+
% test retrieve tagged feature data by id
620+
df = b.create_data_array_from_data('testTagged', 'nixDataArray', rawFeature);
621+
df.append_sampled_dimension(1);
622+
t.add_feature(df, nix.LinkType.Tagged);
623+
retData = t.retrieve_feature_data(df.id);
624+
assert(size(retData, 2) == t.extent, 'Tagged Extent check fail');
625+
assert(retData(1) == rawFeature(t.position + 1), 'Tagged Position check fail');
626+
627+
% test retrieve indexed feature data by id
628+
df = b.create_data_array_from_data('testIndexed', 'nixDataArray', rawFeature);
629+
df.append_sampled_dimension(1);
630+
t.add_feature(df, nix.LinkType.Indexed);
631+
retData = t.retrieve_feature_data(df.id);
632+
assert(size(retData, 2) == size(rawFeature, 2), 'Indexed size check fail');
633+
end
634+
589635
%% Test: Retrieve feature data by index
590636
function [] = test_retrieve_feature_data_idx( varargin )
591637
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);

0 commit comments

Comments
 (0)