1 |
function [MITprof]=MITprof_stats_load(dirData,listData,varCur,varargin); |
2 |
%[MITprof]=MITprof_stats_load(dirData,listData,varCur,varargin); |
3 |
%object: loads a series of MITprof files, and computes |
4 |
% normalized misfits for one variable |
5 |
%input: dirData is the data directory name |
6 |
% listData is the data file list (e.g. {'argo_in*'} or {'argo_in*','argo_at*'} ) |
7 |
% varCur is 'T' or 'S' |
8 |
%optional : |
9 |
% EITHER normFactor (optional; double) is the normalization factor (1./prof_?weight by default) |
10 |
% OR varSpec (optional; char) is e.g. 'prof_T' or 'prof_Testim' |
11 |
% OR varSpec,true to remask varSpec according to e.g. prof_T & prof_Testim & prof_Tweight |
12 |
%output: MITprof.prof is the normalized misfit |
13 |
%note: by assumption, all of the files in listData must share the same vertical grid |
14 |
|
15 |
normFactor=[]; varSpec=''; doRemask=false; |
16 |
if nargin>3; |
17 |
if isnumeric(varargin{1}); normFactor=varargin{1}; end; |
18 |
if ischar(varargin{1}); varSpec=varargin{1}; end; |
19 |
end; |
20 |
if nargin>4; |
21 |
if islogical(varargin{2}); doRemask=varargin{2}; end; |
22 |
end; |
23 |
|
24 |
useExtendedProfDepth=0; |
25 |
|
26 |
%develop listData (that may include wildcards) |
27 |
listData_bak=listData; |
28 |
listData={}; |
29 |
for ii=1:length(listData_bak); |
30 |
tmp1=dir([dirData listData_bak{ii}]); |
31 |
for jj=1:length(tmp1); |
32 |
ii2=length(listData)+1; |
33 |
listData{ii2}=tmp1(jj).name; |
34 |
end; |
35 |
end; |
36 |
%avoid duplicates |
37 |
listData=unique(listData); |
38 |
|
39 |
%loop over files |
40 |
for iFile=1:length(listData); |
41 |
fileData=dir([dirData listData{iFile}]); |
42 |
fileData=fileData.name; |
43 |
if ~isempty(varSpec); |
44 |
fprintf([' loading ' varSpec ' from ' fileData '...\n']); |
45 |
else; |
46 |
fprintf([' loading ' varCur ' from ' fileData '...\n']); |
47 |
end; |
48 |
MITprofCur=MITprof_load([dirData fileData]); |
49 |
|
50 |
if isfield(MITprofCur,'prof_TeccoV4R2')&~isfield(MITprofCur,'prof_Testim'); |
51 |
MITprofCur.prof_Testim=MITprofCur.prof_TeccoV4R2; |
52 |
end; |
53 |
if isfield(MITprofCur,'prof_SeccoV4R2')&~isfield(MITprofCur,'prof_Sestim'); |
54 |
MITprofCur.prof_Sestim=MITprofCur.prof_SeccoV4R2; |
55 |
end; |
56 |
|
57 |
%fixes: |
58 |
if ~isfield(MITprofCur,['prof_' varCur]); |
59 |
tmp1=NaN*ones(MITprofCur.np,MITprofCur.nr); |
60 |
eval(['MITprofCur.prof_' varCur '=tmp1;']); |
61 |
eval(['MITprofCur.prof_' varCur 'estim=tmp1;']); |
62 |
eval(['MITprofCur.prof_' varCur 'weight=tmp1;']); |
63 |
eval(['MITprofCur.prof_' varCur 'flag=[];']); |
64 |
end; |
65 |
|
66 |
if ~isfield(MITprofCur,['prof_' varCur 'weight']); |
67 |
eval(['MITprofCur.prof_' varCur 'weight=1+0*MITprofCur.prof_' varCur ';']); |
68 |
end; |
69 |
|
70 |
%replace weights with normFactor: |
71 |
if ~isempty(normFactor); |
72 |
eval(['tmp1=MITprofCur.prof_' varCur 'weight;']); |
73 |
tmp1(tmp1>0)=normFactor; |
74 |
eval(['MITprofCur.prof_' varCur 'weight=tmp1;']); |
75 |
end; |
76 |
|
77 |
%map variable of interest to MITprofCur.prof: |
78 |
if isempty(varSpec); |
79 |
eval(['tmp1=(MITprofCur.prof_' varCur 'estim-MITprofCur.prof_' varCur ')' ... |
80 |
'.*sqrt(MITprofCur.prof_' varCur 'weight);']); |
81 |
tmp1(tmp1==0)=NaN; |
82 |
else; |
83 |
eval(['tmp1=MITprofCur.' varSpec ';']); |
84 |
if doRemask; |
85 |
eval(['tmp1(isnan(MITprofCur.prof_' varCur '))=NaN;']); |
86 |
eval(['tmp1(isnan(MITprofCur.prof_' varCur 'estim))=NaN;']); |
87 |
eval(['tmp1(isnan(MITprofCur.prof_' varCur 'weight))=NaN;']); |
88 |
eval(['tmp1(MITprofCur.prof_' varCur 'weight==0)=NaN;']); |
89 |
end; |
90 |
end; |
91 |
% |
92 |
MITprofCur.prof=tmp1; |
93 |
|
94 |
%remove bad profiles: |
95 |
if isfield(MITprofCur,'prof_flag'); |
96 |
tmp1=MITprofCur.prof_flag; tmp1=isnan(tmp1); |
97 |
MITprofCur.prof_flag(tmp1)=0; |
98 |
MITprofCur=MITprof_subset(MITprofCur,'flag',0); |
99 |
MITprofCur=rmfield(MITprofCur,'prof_flag'); |
100 |
end; |
101 |
|
102 |
%remove un-needed variables: |
103 |
listKeep={'prof_YYYYMMDD','prof_HHMMSS','prof_lon','prof_lat',... |
104 |
'prof_depth','prof_date','prof_basin','prof_point','prof_descr',... |
105 |
'list_descr','nd','np','nr','prof'}; |
106 |
listField=fieldnames(MITprofCur); |
107 |
for iField=1:length(listField); |
108 |
if sum(strcmp(listKeep,listField{iField}))==0; |
109 |
MITprofCur=rmfield(MITprofCur,listField{iField}); |
110 |
end; |
111 |
end; |
112 |
|
113 |
%bug in 2013b? the following return wrong dates when SS='60' |
114 |
%MITprofCur.prof_date=datenum(num2str(MITprofCur.prof_YYYYMMDD*1e6+MITprofCur.prof_HHMMSS),'yyyymmddHHMMSS'); |
115 |
%old: ii=find(MITprofCur.prof_date<datenum(1992,1,1)|MITprofCur.prof_date>datenum(2008,12,27)); MITprofCur.prof(ii,:)=NaN; |
116 |
|
117 |
%extend prof_depth if needed: |
118 |
if iFile>1; |
119 |
prof_depth=union(MITprof.prof_depth,MITprofCur.prof_depth,'rows'); |
120 |
for kk=1:2; |
121 |
if kk==1; tmpProf=MITprof; else; tmpProf=MITprofCur; end; |
122 |
if length(prof_depth)>length(tmpProf.prof_depth); |
123 |
tmp1=tmpProf.prof; |
124 |
tmp2=NaN*zeros(tmpProf.np,length(prof_depth)); |
125 |
ii=NaN*length(tmpProf.prof_depth); |
126 |
for jj=1:length(tmpProf.prof_depth); |
127 |
ii(jj)=find(prof_depth==tmpProf.prof_depth(jj)); |
128 |
end; |
129 |
tmp2(:,ii)=tmpProf.prof; |
130 |
tmpProf.prof=tmp2; |
131 |
tmpProf.nr=length(prof_depth); |
132 |
tmpProf.prof_depth=prof_depth; |
133 |
end; |
134 |
if kk==1; MITprof=tmpProf; else; MITprofCur=tmpProf; end; |
135 |
end; |
136 |
end; |
137 |
|
138 |
if iFile==1; |
139 |
MITprof=MITprofCur; |
140 |
else; |
141 |
MITprof=MITprof_concat(MITprof,MITprofCur); |
142 |
end; |
143 |
clear MITprofCur; |
144 |
end; |
145 |
|
146 |
|