1 |
roquet |
1.3 |
function [varargout]=profile_read_argo(dataset,nf,m,varargin); |
2 |
|
|
% read hydrographic data in the ARGO netcdf format |
3 |
|
|
% return the m-th profile from the nf-th file referenced in |
4 |
|
|
% dataset.fileInList. |
5 |
|
|
% |
6 |
|
|
% if m=0 : |
7 |
roquet |
1.5 |
% dataset=profile_read_argo(dataset,nf,0); |
8 |
|
|
% dataset.nprofiles: number of profiles in the nf-th file |
9 |
|
|
% dataset.data_argo: argo data in a struct variable |
10 |
roquet |
1.3 |
% |
11 |
|
|
% if m~=0 : |
12 |
roquet |
1.5 |
% profileCur=profile_read_argo(dataset,nf,m); |
13 |
roquet |
1.3 |
% |
14 |
|
|
% profileCur = (m-th profile of nf-th file) |
15 |
|
|
% pnum_txt: '5900841' |
16 |
|
|
% ymd: 20060101 |
17 |
|
|
% hms: 3207 |
18 |
|
|
% lat: -46.709 |
19 |
|
|
% lon: 137.501 |
20 |
|
|
% direc: 1 |
21 |
|
|
% t: [1x115 single] |
22 |
|
|
% s: [1x115 single] |
23 |
|
|
% p: [1x115 single] |
24 |
|
|
% t_ERR: [1x115 single] |
25 |
|
|
% s_ERR: [1x115 single] |
26 |
gforget |
1.10 |
% isBAD: 0 |
27 |
roquet |
1.3 |
% |
28 |
gforget |
1.1 |
|
29 |
|
|
fileIn=[dataset.dirIn dataset.fileInList(nf).name]; |
30 |
|
|
|
31 |
roquet |
1.3 |
if m==0; % return the number of profile. |
32 |
gforget |
1.2 |
|
33 |
roquet |
1.3 |
%get the number of profiles: |
34 |
gforget |
1.7 |
list_var={'JULD','LATITUDE','LONGITUDE','DIRECTION','PLATFORM_NUMBER','DATA_MODE',... |
35 |
gforget |
1.10 |
'JULD_QC','POSITION_QC','PRES_ADJUSTED_QC','PRES_QC',... |
36 |
|
|
'TEMP_ADJUSTED_QC','TEMP_QC','PSAL_ADJUSTED_QC','PSAL_QC'}; |
37 |
roquet |
1.3 |
argo_data=[]; |
38 |
|
|
for ii=1:length(list_var), |
39 |
|
|
ncload(fileIn,list_var{ii}); |
40 |
roquet |
1.4 |
data=eval(list_var{ii}); |
41 |
gforget |
1.8 |
if ~isempty(data); |
42 |
roquet |
1.4 |
nc=ncopen(fileIn); |
43 |
|
|
FillVal=ncgetFillVal(nc,list_var{ii}); |
44 |
|
|
ncclose(nc); |
45 |
|
|
if ischar(FillVal), |
46 |
|
|
data(strcmp(data,FillVal))=' '; |
47 |
|
|
else |
48 |
|
|
data(data==FillVal)=NaN; |
49 |
|
|
end |
50 |
gforget |
1.8 |
end |
51 |
roquet |
1.4 |
argo_data=setfield(argo_data,list_var{ii},data); |
52 |
gforget |
1.2 |
end |
53 |
gforget |
1.7 |
|
54 |
roquet |
1.4 |
list_var={'PRES_ADJUSTED','PRES','TEMP_ADJUSTED','TEMP','TEMP_ADJUSTED_ERROR',... |
55 |
|
|
'PSAL_ADJUSTED','PSAL','PSAL_ADJUSTED_ERROR'}; |
56 |
|
|
for ii=1:length(list_var), |
57 |
|
|
ncload(fileIn,list_var{ii}); |
58 |
|
|
data=double(eval(list_var{ii})); |
59 |
gforget |
1.8 |
if ~isempty(data); |
60 |
roquet |
1.4 |
nc=ncopen(fileIn); |
61 |
|
|
FillVal=ncgetFillVal(nc,list_var{ii}); |
62 |
|
|
ncclose(nc); |
63 |
|
|
data(data==FillVal)=NaN; |
64 |
gforget |
1.8 |
end; |
65 |
roquet |
1.4 |
argo_data=setfield(argo_data,list_var{ii},data); |
66 |
|
|
end |
67 |
|
|
|
68 |
roquet |
1.5 |
dataset.argo_data=argo_data; |
69 |
|
|
dataset.nprofiles = length(JULD); |
70 |
gforget |
1.10 |
if isempty(dataset.argo_data.TEMP); |
71 |
|
|
dataset.nprofiles=0; |
72 |
|
|
fprintf(['empty file:' dataset.fileInList(nf).name '\n']); |
73 |
|
|
end; |
74 |
gforget |
1.7 |
|
75 |
|
|
if ~isfield(dataset,'greyList'); |
76 |
|
|
if ~isempty(dir([dataset.dirIn '../../ar_greylist.txt'])); |
77 |
|
|
fidgrey=fopen([dataset.dirIn '../../ar_greylist.txt'],'rt'); |
78 |
|
|
tmp1=fgetl(fidgrey); |
79 |
|
|
greylist=[]; ii=0; |
80 |
|
|
while ~feof(fidgrey); |
81 |
|
|
tmp1=fgetl(fidgrey); tmp2=strfind(tmp1,','); |
82 |
|
|
|
83 |
|
|
cur_pnum=double(tmp1(1:tmp2(1)-1)); |
84 |
|
|
cur_pnum=cur_pnum(find(cur_pnum~=0&cur_pnum~=32)); |
85 |
|
|
cur_pnum=char(cur_pnum); |
86 |
|
|
|
87 |
|
|
date_ref=double(tmp1(tmp2(2)+1:tmp2(3)-1)); |
88 |
|
|
date_ref=date_ref(find(date_ref~=0&date_ref~=32)); |
89 |
|
|
date_ref=char(date_ref); |
90 |
|
|
date_ref=[str2num(date_ref(1:4)) str2num(date_ref(5:6)) str2num(date_ref(7:8)) 0 0 0]; |
91 |
|
|
|
92 |
|
|
vnam=tmp1(tmp2(1)+1:tmp2(2)-1); |
93 |
|
|
|
94 |
|
|
ii=ii+1; |
95 |
|
|
greylist(ii).pnum=cur_pnum; |
96 |
|
|
greylist(ii).start=date_ref; |
97 |
|
|
greylist(ii).vnam=vnam; |
98 |
|
|
end; |
99 |
|
|
fclose(fidgrey); |
100 |
|
|
|
101 |
|
|
dataset.greyList.pnum={greylist(:).pnum}; |
102 |
|
|
dataset.greyList.start={greylist(:).start}; |
103 |
|
|
dataset.greyList.vnam={greylist(:).vnam}; |
104 |
|
|
else; |
105 |
|
|
dataset.greyList.pnum=[]; |
106 |
|
|
dataset.greyList.start=[]; |
107 |
|
|
dataset.greyList.vnam=[]; |
108 |
|
|
end; |
109 |
|
|
end; |
110 |
|
|
|
111 |
roquet |
1.5 |
varargout{1}=dataset; |
112 |
gforget |
1.2 |
|
113 |
roquet |
1.3 |
else;%if m==0; |
114 |
gforget |
1.10 |
|
115 |
roquet |
1.3 |
% load data |
116 |
roquet |
1.5 |
argo_data=dataset.argo_data; |
117 |
gforget |
1.2 |
|
118 |
|
|
%date, position, etc |
119 |
roquet |
1.3 |
juld=argo_data.JULD(m)+datenum(1950,1,1); |
120 |
|
|
[Y, M, D, H, MN, S] = datevec(juld); |
121 |
|
|
ymd=Y*1e4+M*1e2+D; |
122 |
|
|
hms=H*1e4+MN*1e2+S; |
123 |
gforget |
1.2 |
|
124 |
roquet |
1.3 |
lat=argo_data.LATITUDE(m); |
125 |
|
|
lon=argo_data.LONGITUDE(m); if lon < 0; lon=lon+360;end; |
126 |
gforget |
1.2 |
|
127 |
roquet |
1.3 |
direction=argo_data.DIRECTION(m); |
128 |
|
|
direc=0; |
129 |
|
|
if(direction=='A');direc=1;end; |
130 |
|
|
if(direction=='D');direc=2;end |
131 |
gforget |
1.2 |
|
132 |
roquet |
1.3 |
pnum_txt=deblank(argo_data.PLATFORM_NUMBER(m,:)); |
133 |
|
|
pnum_txt=pnum_txt(ismember(pnum_txt,'0123456789')); pnum=str2num(pnum_txt); |
134 |
|
|
if isempty(pnum_txt); pnum_txt='9999'; pnum=9999; disp(['no name for profile ' num2str(m)]); end; |
135 |
gforget |
1.2 |
|
136 |
|
|
|
137 |
roquet |
1.3 |
% pressure data |
138 |
gforget |
1.2 |
|
139 |
roquet |
1.3 |
p=argo_data.PRES_ADJUSTED(m,:); |
140 |
|
|
p_QC=argo_data.PRES_ADJUSTED_QC(m,:); |
141 |
roquet |
1.4 |
if all(isnan(p)), p=argo_data.PRES(m,:); p_QC=argo_data.PRES_QC(m,:); end |
142 |
roquet |
1.3 |
p_QC(isnan(p))='5'; |
143 |
gforget |
1.2 |
|
144 |
roquet |
1.3 |
for n=1:length(p)-1; % doubles |
145 |
|
|
tmp1=find(p(n+1:end)==p(n)); p(n+tmp1)=NaN; p_QC(n+tmp1)='5'; |
146 |
gforget |
1.2 |
end |
147 |
gforget |
1.10 |
|
148 |
|
|
% QC on position, date and pressure |
149 |
|
|
isBAD=0; |
150 |
|
|
|
151 |
|
|
if ~ismember(argo_data.POSITION_QC(m),'1258'); isBAD=1; end; |
152 |
|
|
if ~ismember(argo_data.JULD_QC(m),'1258'); isBAD=1; end; |
153 |
|
|
|
154 |
|
|
tmp1=find(~ismember(p_QC,'1258')); |
155 |
gforget |
1.2 |
if(length(tmp1)<=5); |
156 |
|
|
%get rid of these few bad points and keep the profile |
157 |
gforget |
1.10 |
p(tmp1)=NaN; |
158 |
gforget |
1.2 |
else; |
159 |
|
|
%flag the profile (will be masked in the main file) |
160 |
|
|
%but keep the bad points (to interp and be able to CHECK) |
161 |
gforget |
1.10 |
isBAD=1; |
162 |
gforget |
1.2 |
end; |
163 |
|
|
|
164 |
roquet |
1.3 |
% temperature data |
165 |
gforget |
1.10 |
%[num2str(m) ' in ' dataset.fileInList(nf).name] |
166 |
roquet |
1.3 |
t=argo_data.TEMP_ADJUSTED(m,:); |
167 |
|
|
t_QC=argo_data.TEMP_ADJUSTED_QC(m,:); |
168 |
|
|
t_ERR=argo_data.TEMP_ADJUSTED_ERROR(m,:); |
169 |
|
|
t_ERR(isnan(t_ERR))=0; |
170 |
roquet |
1.4 |
if all(isnan(t)), t=argo_data.TEMP(m,:); t_QC=argo_data.TEMP_QC(m,:); end |
171 |
gforget |
1.6 |
|
172 |
|
|
%accomodate files that have no salinity |
173 |
|
|
if isempty(argo_data.PSAL); |
174 |
|
|
argo_data.PSAL=NaN*argo_data.TEMP; |
175 |
|
|
argo_data.PSAL_QC=char(32*ones(size(argo_data.TEMP_ADJUSTED_QC))); |
176 |
|
|
argo_data.PSAL_ADJUSTED=NaN*argo_data.TEMP; |
177 |
|
|
argo_data.PSAL_ADJUSTED_ERROR=NaN*argo_data.TEMP; |
178 |
|
|
argo_data.PSAL_ADJUSTED_QC=char(32*ones(size(argo_data.TEMP_ADJUSTED_QC))); |
179 |
|
|
end; |
180 |
|
|
|
181 |
roquet |
1.3 |
% salinity data |
182 |
|
|
s=argo_data.PSAL_ADJUSTED(m,:); |
183 |
|
|
s_QC=argo_data.PSAL_ADJUSTED_QC(m,:); |
184 |
|
|
s_ERR=argo_data.PSAL_ADJUSTED_ERROR(m,:); |
185 |
|
|
s_ERR(isnan(s_ERR))=0; |
186 |
roquet |
1.4 |
if all(isnan(s)), s=argo_data.PSAL(m,:); s_QC=argo_data.PSAL_QC(m,:); end |
187 |
gforget |
1.2 |
|
188 |
roquet |
1.3 |
if isnan(t(1)); %this file does not contain temperature data... |
189 |
gforget |
1.2 |
t=NaN*p; t_ERR=0*p; |
190 |
|
|
else; |
191 |
gforget |
1.10 |
t(~ismember(t_QC,'1258'))=NaN; |
192 |
gforget |
1.2 |
end; |
193 |
roquet |
1.3 |
if isnan(s(1)); %this file does not contain salinity data... |
194 |
|
|
s=NaN*p; s_ERR=0*p; |
195 |
gforget |
1.2 |
else; |
196 |
gforget |
1.10 |
s(~ismember(s_QC,'1258'))=NaN; |
197 |
gforget |
1.2 |
end; |
198 |
|
|
|
199 |
|
|
profileCur.pnum_txt=pnum_txt; |
200 |
|
|
profileCur.ymd=ymd; profileCur.hms=hms; |
201 |
|
|
profileCur.lat=lat; profileCur.lon=lon; |
202 |
|
|
profileCur.direc=direc; |
203 |
gforget |
1.9 |
profileCur.T=t; |
204 |
|
|
profileCur.S=s; |
205 |
gforget |
1.2 |
profileCur.p=p; |
206 |
gforget |
1.9 |
profileCur.T_ERR=t_ERR; |
207 |
|
|
profileCur.S_ERR=s_ERR; |
208 |
gforget |
1.10 |
profileCur.isBAD=isBAD; |
209 |
gforget |
1.7 |
profileCur.DATA_MODE=argo_data.DATA_MODE(m); |
210 |
gforget |
1.2 |
|
211 |
|
|
varargout = {profileCur}; |
212 |
|
|
|
213 |
gforget |
1.1 |
end; |
214 |
|
|
|
215 |
|
|
|
216 |
|
|
|