0001 function S = mirs(file, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 try
0030 X = read_native_mirs(file);
0031 catch ME
0032 if strcmp(ME.identifier,'MATLAB:subsassignnumelmismatch')
0033 error('atmlab:invalid_data','Something is wrong with the file')
0034 else
0035 error(ME.identifier,ME.message)
0036 end
0037
0038 end
0039
0040 core_fields = {'scanUTC','lat','lon'};
0041 extra_fields = optargs(varargin, {{}});
0042 all_fields = [core_fields(:); extra_fields(:)];
0043
0044
0045
0046
0047
0048
0049 pseudo_fields = {'MIRS_IWP'};
0050
0051 for F = all_fields'
0052 if ismember(F{1},pseudo_fields)
0053 continue
0054 end
0055 S.(F{1}) = X.(F{1});
0056 if isvector(S.(F{1})),
0057 S.(F{1}) = S.(F{1})';
0058 end
0059 end
0060
0061 S.lat = double(S.lat);
0062 S.lon = double(S.lon);
0063 S.time = double(S.scanUTC);
0064
0065
0066 D = datasets;
0067 info = D.mirs.find_info_from_granule(file);
0068
0069 date = dayofyear_inverse(2000+str2double(info.year02), str2double(info.doy));
0070 S.epoch = round(date2unixsecs(date.year, date.month, date.day));
0071
0072 S.version = X.algsn;
0073 S.path = file;
0074
0075 S = MaskInvalidGeoTimedataWithNaN(S);
0076
0077 S = rmfield(S,{'scanUTC'});
0078
0079 end
0080
0081 function S = read_native_mirs(filename)
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 errId = ['atmlab:' mfilename ':error'];
0146 if ~exist(filename,'file')
0147 error(errId,'No such file: %s',filename)
0148 end
0149 tmpdir = create_tmpfolder();
0150 cleanupObject = onCleanup(@() delete_tmpfolder(tmpdir));
0151 filename = uncompress(filename,tmpdir);
0152 if isempty(filename), error(errId,'Uncompressing failed'); end
0153
0154 fid = fopen (filename, 'rb', 'b');
0155 cleanupObj2 = onCleanup(@() (fclose(fid)));
0156 if (fid == -1)
0157 error (errId, 'Can''t open input file %s', filename);
0158 end
0159
0160
0161
0162
0163
0164 fread (fid, 1, 'int32');
0165 S.itype = fread (fid, 1, 'int32');
0166 S.algsn = fread (fid, 1, 'int32');
0167 fread (fid, 1, 'int32');
0168
0169 fread (fid, 1, 'int32');
0170 S.nprf = fread (fid, 1, 'int32');
0171 fread (fid, 1, 'int32');
0172
0173 fread (fid, 1, 'int32');
0174 S.nPosScan = fread (fid, 1, 'int32');
0175 fread (fid, 1, 'int32');
0176
0177 fread (fid, 1, 'int32');
0178 S.nScanLines = fread (fid, 1, 'int32');
0179 fread (fid, 1, 'int32');
0180
0181
0182 allfields = {'ProfIndx','iTypAtm','TPW','Clw','RWP','SWP','IWP','GWP',...
0183 'RR','SFR','CldTop','CldBase','CldThick','PrecipType','RainFlag',...
0184 'LWP','iTypSfc','SWE','SnowCover','SM','SIC','WindSp','WindDir',...
0185 'WindU','WindV','SnowGS','SIC_FY','SIC_MY','QC','lat','lon','node',...
0186 'scanUTC','scanYear','scanDay','iscanPos','iscanLine','angle',...
0187 'RelAziAngle','SolZenAngle','nIter','ChiSq'};
0188 tmp = cell(1,2*length(allfields)); tmp(1:2:end-1)= allfields;
0189 X = struct(tmp{:});
0190 for i = 1:S.nprf
0191
0192 fread (fid,1,'int32');
0193 X.ProfIndx(i) = fread (fid,1, 'int32');
0194 fread (fid, 1, 'int32');
0195
0196
0197 fread (fid, 1, 'int32');
0198 X.iTypAtm(i) = fread (fid, 1, 'int32');
0199 X.TPW(i) = fread (fid, 1, 'single');
0200 X.Clw(i) = fread (fid, 1, 'single');
0201 X.RWP(i) = fread (fid, 1, 'single');
0202 X.SWP(i) = fread (fid, 1, 'single');
0203 X.IWP(i) = fread (fid, 1, 'single');
0204 X.GWP(i) = fread (fid, 1, 'single');
0205 X.RR(i) = fread (fid, 1, 'single');
0206 X.SFR(i) = fread (fid, 1, 'single');
0207 X.CldTop(i) = fread (fid, 1, 'single');
0208 X.CldBase(i) = fread (fid, 1, 'single');
0209 X.CldThick(i) = fread (fid, 1, 'single');
0210 X.PrecipType(i) = fread (fid, 1, 'single');
0211 X.RainFlag(i) = fread (fid, 1, 'single');
0212 X.LWP(i) = fread (fid, 1, 'single');
0213 fread (fid, 1, 'int32');
0214
0215
0216 fread(fid,1,'int32');
0217 X.iTypSfc(i) = fread (fid, 1, 'int32');
0218 X.SWE(i) = fread (fid, 1, 'single');
0219 X.SnowCover(i) = fread (fid, 1, 'single');
0220 X.SM(i) = fread (fid, 1, 'single');
0221 X.SIC(i) = fread (fid, 1, 'single');
0222 X.WindSp(i) = fread (fid, 1, 'single');
0223 X.WindDir(i) = fread (fid, 1, 'single');
0224 X.WindU(i) = fread (fid, 1, 'single');
0225 X.WindV(i) = fread (fid, 1, 'single');
0226 X.SnowGS(i) = fread (fid, 1, 'single');
0227 X.SIC_FY(i) = fread (fid, 1, 'single');
0228 X.SIC_MY(i) = fread (fid, 1, 'single');
0229 fread(fid,1,'int32');
0230
0231
0232 fread(fid,1,'int32');
0233 X.QC(i,1:4) = fread (fid, 4, 'int32');
0234 fread(fid,1,'int32');
0235
0236
0237 fread(fid,1,'int32');
0238 X.lat(i) = fread (fid, 1, 'single');
0239 X.lon(i) = fread (fid, 1, 'single');
0240 X.node(i) = fread (fid, 1, 'int32');
0241 X.scanUTC(i) = fread (fid, 1, 'single');
0242 X.scanYear(i) = fread (fid, 1, 'int32');
0243 X.scanDay(i) = fread (fid, 1, 'int32');
0244 X.iscanPos(i) = fread (fid, 1, 'int32');
0245 X.iscanLine(i) = fread (fid, 1, 'int32');
0246 X.angle(i) = fread (fid, 1, 'single');
0247 X.RelAziAngle(i) = fread (fid, 1, 'single');
0248 X.SolZenAngle(i) = fread (fid, 1, 'single');
0249 fread(fid,1,'int32');
0250
0251 if S.itype==1
0252
0253 fread(fid,1,'int32');
0254 X.nIter(i) = fread (fid, 1, 'int32');
0255 X.ChiSq(i) = fread (fid, 1, 'single');
0256 fread(fid,1,'int32');
0257 else
0258 X.nIter(i) = -1;
0259 X.ChiSq(i) = 0;
0260 end
0261 end
0262 S = catstruct(S,X);
0263
0264 end