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