1 |
gforget |
1.1 |
%function: MITprof_read |
2 |
roquet |
1.10 |
%object: read netcdf data files in the "MIT format". Low-level function. |
3 |
|
|
% use MITprof_load instead to load data from a MITprof |
4 |
|
|
% netcdf file. |
5 |
gforget |
1.1 |
%author: Gael Forget (gforget@mit.edu) |
6 |
|
|
%date: june 21th, 2006 |
7 |
|
|
% |
8 |
gforget |
1.3 |
%usage: [MITprof]=MITprof_read(fileIn); |
9 |
gforget |
1.1 |
% ---> loads full data set |
10 |
gforget |
1.3 |
% [MITprof]=MITprof_read(fileIn,list_vars); |
11 |
gforget |
1.1 |
% ---> loads only the files listed in list_vars cell |
12 |
|
|
% array (e.g. list_vars={'prof_T','prof_Tweight'}) |
13 |
|
|
% plus the one dimensional information (prof_lon etc.) |
14 |
|
|
% |
15 |
roquet |
1.10 |
%inputs: fileIn data file name |
16 |
|
|
% list_vars variables list (optional) |
17 |
roquet |
1.11 |
% if no list_vars is provided, all fields are loaded. |
18 |
gforget |
1.1 |
% |
19 |
|
|
%outputs: MITprof structure containing the various fields/vectors |
20 |
|
|
|
21 |
gforget |
1.3 |
function [MITprof]=MITprof_read(fileIn,varargin); |
22 |
gforget |
1.1 |
|
23 |
roquet |
1.7 |
|
24 |
roquet |
1.11 |
% check that file exists, and open it |
25 |
roquet |
1.9 |
if ~exist(fileIn,'file'), error([fileIn ' : file not found']); end |
26 |
roquet |
1.7 |
|
27 |
roquet |
1.11 |
% open netcdf |
28 |
|
|
nc=ncopen(fileIn); |
29 |
|
|
MITprof=[]; |
30 |
gforget |
1.1 |
|
31 |
roquet |
1.11 |
% build the list of variable to load |
32 |
|
|
if nargin>1; list_vars=varargin{1}; |
33 |
|
|
else, list_vars=ncvars(nc); end |
34 |
|
|
if isempty(list_vars), return, end |
35 |
gforget |
1.13 |
%list_vars=[{'prof_lon','prof_lat'} list_vars]; |
36 |
|
|
%if ismember('prof_date',list_vars), list_vars=[{'prof_YYYYMMDD','prof_HHMMSS'} list_vars]; end |
37 |
roquet |
1.11 |
[list,m]=unique(list_vars); |
38 |
|
|
list_vars=list_vars(sort(m)); |
39 |
|
|
|
40 |
roquet |
1.12 |
% is there only one profile? |
41 |
|
|
one_profile=0; |
42 |
|
|
data=ncgetvar(nc,'prof_lon'); |
43 |
|
|
if length(data)==1, one_profile=1; end |
44 |
|
|
|
45 |
roquet |
1.11 |
% load fields into MITprof struct |
46 |
|
|
for ii=1:length(list_vars), |
47 |
|
|
data=ncgetvar(nc,list_vars{ii}); |
48 |
roquet |
1.12 |
if size(data,1)==1 & ~one_profile, |
49 |
roquet |
1.11 |
data=reshape(data,length(data),1); |
50 |
roquet |
1.7 |
end |
51 |
roquet |
1.12 |
MITprof=setfield(MITprof,list_vars{ii},data); |
52 |
|
|
end |
53 |
roquet |
1.11 |
|
54 |
roquet |
1.12 |
% load depth vector separately (either in prof_depth or depth variable) |
55 |
|
|
if ismember('prof_depth', list_vars) |
56 |
|
|
data=ncgetvar(nc,'prof_depth'); |
57 |
|
|
elseif ismember('depth', list_vars) |
58 |
|
|
data=ncgetvar(nc,'depth'); |
59 |
roquet |
1.11 |
end |
60 |
roquet |
1.12 |
data=reshape(data,length(data),1); |
61 |
|
|
MITprof=setfield(MITprof,'prof_depth',data); |
62 |
roquet |
1.7 |
|
63 |
roquet |
1.12 |
% add field prof_date if not already in the nc file |
64 |
|
|
if ismember('prof_date',list_vars) & ~isfield(MITprof,'prof_date'); |
65 |
|
|
MITprof.prof_date=datenum(num2str(MITprof.prof_YYYYMMDD*1e6+MITprof.prof_HHMMSS),'yyyymmddHHMMSS'); |
66 |
gforget |
1.1 |
end; |
67 |
|
|
|
68 |
gforget |
1.13 |
% add prof_YYYYMMDD and prof_HHMMSS if possible |
69 |
|
|
if isfield(MITprof,'prof_date') & ~isfield(MITprof,'prof_YYYYMMDD'); |
70 |
|
|
tmp1=datevec(MITprof.prof_date); |
71 |
|
|
MITprof.prof_YYYYMMDD=tmp1(:,1)*1e4+tmp1(:,2)*1e2+tmp1(:,3); |
72 |
|
|
MITprof.prof_HHMMSS=tmp1(:,4)*1e4+tmp1(:,5)*1e2+tmp1(:,6); |
73 |
|
|
end; |
74 |
|
|
|
75 |
roquet |
1.11 |
% close file |
76 |
|
|
ncclose(nc); |
77 |
|
|
|
78 |
gforget |
1.5 |
%make sure that lon is -180+180: |
79 |
roquet |
1.7 |
%------------------------------- |
80 |
gforget |
1.5 |
tmp_lon=MITprof.prof_lon; |
81 |
|
|
tmp_lon(find(tmp_lon>180))=tmp_lon(find(tmp_lon>180))-360; |
82 |
|
|
MITprof.prof_lon=tmp_lon; |
83 |
|
|
|
84 |
gforget |
1.6 |
%get rid of empty variables: |
85 |
roquet |
1.7 |
%--------------------------- |
86 |
gforget |
1.6 |
fldNames=fieldnames(MITprof); |
87 |
|
|
for iFld=1:length(fldNames); |
88 |
|
|
eval(['test0=isempty(MITprof.' fldNames{iFld} ');']); |
89 |
|
|
if test0; MITprof=rmfield(MITprof,fldNames{iFld}); end; |
90 |
|
|
end; |