-
Notifications
You must be signed in to change notification settings - Fork 4
/
nrtdm_metadata.m
172 lines (161 loc) · 5.1 KB
/
nrtdm_metadata.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
%This object defines details of the product
classdef nrtdm_metadata
properties(GetAccess = 'private', SetAccess = 'private')
debug
end
properties(Dependent)
units
fields
fields_no_units
dimension
end
properties(GetAccess = 'public', SetAccess = 'private')
product
entries
end
methods(Static)
function out=clean_entry_name(entry_name)
out=strrep(entry_name,...
'-','_'...
);
end
% function test
% if ~file.exist(nrtdm.config_dir)
% warning(['cannot find NRTDM config dir: ',nrtdm_product.config_dir,'. Skipping test.'])
% return
% end
% a=nrtdm_metadata('SC_Basic/Quaternion_Interpolated');
% %TODO: finish this test
% end
end
methods
function obj=nrtdm_metadata(product_name,debug)
if ~exist('debug','var') || isempty(debug)
debug=false;
end
%initialize
obj.product=nrtdm_product(product_name);
obj.debug=debug;
%load all metadata
text = fileread(obj.product.file);
%discover newlines
newlines=[0,strfind(text,newline)];
%sanitize
if isempty(newlines)
error(['could not discover any new lines in file ',obj.product.file,':',newline,text])
end
%search for this product
line_nr=0;
for i=1:numel(newlines)-1
if str.contains(text(newlines(i)+1:newlines(i+1)),['Orbital: ',obj.product.name])
line_nr=i;
break
end
end
%sanity
if line_nr==0
error(['could not definition of product ',obj.product.name,' in file ',obj.product.file,'.'])
end
%init metadata structure
obj.entries=struct('Orbital',obj.product.name);
%parse the entries of this product
for i=line_nr+1:numel(newlines)-1
%get this line
line=text(newlines(i)+1:newlines(i+1));
%get separator index within this line
sep_index=strfind(line,':');
if ~isempty(sep_index)
%extract entry name
entry_name=strtrim(line(1:sep_index-1));
%extract entry value
entry_value=strtrim(line(sep_index+1:end-1));
%add to structure
if isfield(obj.entries,nrtdm_metadata.clean_entry_name(entry_name))
%if already there, append
if iscell(obj.entries.(nrtdm_metadata.clean_entry_name(entry_name)))
obj.entries.(nrtdm_metadata.clean_entry_name(entry_name)){end+1}=entry_value;
else
obj.entries.(nrtdm_metadata.clean_entry_name(entry_name))={obj.entries.(nrtdm_metadata.clean_entry_name(entry_name)),entry_value};
end
else
%otherwise, create new entry
obj.entries.(nrtdm_metadata.clean_entry_name(entry_name))=entry_value;
end
else
%we're done
break
end
end
end
function out=get(obj,entry_name)
if ~isfield(obj.entries,nrtdm_metadata.clean_entry_name(entry_name))
error(['metadata of product ',obj.product.name,' does not include entry ',entry_name,'.'])
else
out=obj.entries.(nrtdm_metadata.clean_entry_name(entry_name));
end
end
function out=full_entries(obj)
c=cell(1,obj.dimension);
for i=1:numel(c)
c{i}=[obj.product.str,'/',num2str(i),' '];
end
out=[c{:}];
end
function out=get.dimension(obj)
out=str2double(obj.entries.('dimension'));
end
function out=get.units(obj)
out=cell(1,obj.dimension);
for i=1:numel(out)
if isfield(obj.entries,['field_',num2str(i,'%02i'),'_unit'])
out{i}=obj.entries.(['field_',num2str(i,'%02i'),'_unit']);
else
desc=obj.entries.(['field_',num2str(i,'%02i')]);
idx=[strfind(desc,'('),strfind(desc,')')];
if numel(idx) ~= 2
out{i}='?';
else
out{i}=desc(idx(1)+1:idx(2)-1);
end
end
end
for i=1:numel(out)
%translate '/s/s' to /s^2'
idx=strfind(out{i},'/s/s');
if ~isempty(idx)
out{i}=strrep(out{i},'/s/s','/s^2');
end
end
end
function out=get.fields_no_units(obj)
out=cell(1,obj.dimension);
for i=1:numel(out)
if isfield(obj.entries,['field_',num2str(i,'%02i'),'_descr'])
out{i}=obj.entries.(['field_',num2str(i,'%02i'),'_descr']);
else
desc=obj.entries.(['field_',num2str(i,'%02i')]);
idx=strfind(desc,'(');
switch numel(idx)
case 0
out{i}=desc;
otherwise
out{i}=desc(1:min(idx)-1);
end
end
end
end
function out=data_filename(obj,t_now,extension,data_dir)
if ~exist('extension','var') || isempty(extension)
extension='orbit';
end
if ~exist('data_dir','var') || isempty(data_dir)
data_dir=fullfile(nrtdm.data_dir,extension);
end
parent_dir=fullfile(data_dir,obj.product.str);
if ~file.exist(parent_dir)
file.mkdir(parent_dir);
end
out=fullfile(parent_dir,[datestr(t_now,'yyyy'), '_',num2str(day(t_now,'dayofyear'),'%03i'),'.',extension]);
end
end
end