-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdateMetaData.m
More file actions
148 lines (136 loc) · 5.59 KB
/
updateMetaData.m
File metadata and controls
148 lines (136 loc) · 5.59 KB
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
function metaData = updateMetaData(metaData,Header,GPS,seq,stat,dupl)
% metaData = updateMetaData(metaData,Header,GPS,seq,stat,dupl)
%
% If the metaData structure has changed since
% this file was written, update it
%
% Last modified by A. Kelbert, 1 June 2018
fields = fieldnames(metaData);
oldMetaData = metaData;
instrumentType = metaData.InstrumentType;
if isnumeric(metaData.dt)
HZ = 1/metaData.dt;
else
HZ = 1/str2double(metaData.dt);
end
if nargin >= 5
metaData = initMetaData(Header,GPS,seq,stat,dupl,HZ,instrumentType);
elseif nargin <= 1
metaData = initMetaData;
else
error('Please specify Header, GPS, seq and stat strings');
end
i = find(strcmp(fields,'NIMS'));
if i>0
metaData.InstrumentType = 'NIMS';
metaData.InstrumentID = oldMetaData.NIMS;
end
i = find(strcmp(fields,'nims_comments'));
if i>0
metaData.field_comments = oldMetaData.nims_comments;
end
if nargin <= 1
% in this case only add new fields
for k=1:length(fields)
if isfield(metaData,fields{k})
metaData.(fields{k}) = oldMetaData.(fields{k});
end
end
else
% in this case, trust the newly computed times and errors, etc.
for k=1:length(fields)
if isfield(metaData,fields{k})
switch fields{k}
case {'startDate', 'endDate'}
% if new date is a valid date, leave it; new logic is
% to also trust the XML file over GPS is GPS_ERROR=1
if strcmp(metaData.(fields{k}),'yyyy-mm-dd') || metaData.GPS_ERROR
metaData.(fields{k}) = oldMetaData.(fields{k});
end
case {'startTime', 'endTime'}
% if new time is a valid time, leave it; new logic is
% to also trust the XML file over GPS is GPS_ERROR=1
if strcmp(metaData.(fields{k}),'HH:MM:SS') || metaData.GPS_ERROR
metaData.(fields{k}) = oldMetaData.(fields{k});
end
case {'lat', 'lon'}
% if new coordinates are more accurate, use them
if abs(metaData.(fields{k}) - oldMetaData.(fields{k})) < 0.001
% use new values (previously truncated them early)
else
metaData.(fields{k}) = oldMetaData.(fields{k});
end
case {'elev'}
% as of 2020, elevation seems more robustly computed.
% Use that.
case {'decl'}
% as of 2020, we use IGRF to compute the declination,
% to replace the old GNSS NMEA sentence with outdated
% world magnetic model. Overwrite the old values!
% ... but do this AFTER lat,lon,elev & time are updated
case {'nscan'}
% if valid, use new value, else leave the old one
if metaData.(fields{k}) <= 0
metaData.(fields{k}) = oldMetaData.(fields{k});
end
case {'InstrumentID', 'Magnetometer'}
% always explicitly use the old values
metaData.(fields{k}) = oldMetaData.(fields{k});
case {'SystemResponse'}
% if valid, use new value
if isempty(metaData.(fields{k}))
metaData.(fields{k}) = oldMetaData.(fields{k});
end
case {'nsec', 'ngaps', 'gaps'}
% we do NOT want this information updated, unless we
% just fixed a bug in the gap processing routine;
% in this case, temporarily comment out this line.
%metaData.(fields{k}) = oldMetaData.(fields{k});
case {'system_errors','errors'}
% leave them alone
otherwise
metaData.(fields{k}) = oldMetaData.(fields{k});
end
end
end
end
% once everything else is updated, compute the IGRF declination
% Compute declination using IGRF and an open-source toolbox by Drew Compston
valid_date = datenum([metaData.startDate ' ' metaData.startTime]);
try
map_elev = natmaplook(metaData.lat,metaData.lon);
catch
if isnan(metaData.elev)
map_elev = 0;
else
map_elev = metaData.elev;
end
end
% The latest IGRF dat file is 2020-2025 dat file as of JWC 7/12/23
if (valid_date > datenum('2025-01-01'))
valid_date = datenum('2025-01-01');
warning('Declination computed as of 2025-01-01. May be off by decimals.');
end
B = igrf(valid_date,metaData.lat,metaData.lon,map_elev/1000.);
igrfdecl = rad2deg(atan2(B(2),B(1)));
% Document what we are doing here!
decl_info.igrf.version = 13;
decl_info.igrf.toolbox = 'igrf.m by Drew Compston';
decl_info.igrf_conf.date = datestr(valid_date,'yyyy-mm-dd');
decl_info.igrf_conf.lat = metaData.lat;
decl_info.igrf_conf.lon = metaData.lon;
decl_info.igrf_conf.elev = metaData.elev;
decl_info.file_decl = metaData.decl_info.file_decl;
% Let the user know if a pre-2020 NIMS was used and declination updated
if ~isnan(metaData.decl)
disp(['NIMS file declination ' num2str(metaData.decl) ...
' replaced with IGRF declination ' num2str(igrfdecl) '. ']);
end
metaData.decl_info = decl_info;
metaData.decl = igrfdecl;
% finally, update the system response structure
if strcmp(metaData.InstrumentType,'NIMS')
metaData.SystemResponse = NIMsysRsp(metaData.InstrumentID,HZ);
elseif strcmp(metaData.InstrumentType,'ZEN')
metaData.SystemResponse = ZENsysRsp(metaData.InstrumentID,HZ);
end