PRO read_feedback, Files, DepRange=DepRange, VarName=VarNames, NumData=NumData, $ OutLats=OutLats, OutLons=OutLons, $ OutInstruments=OutInst, OutPlatform=OutPlatform, $ OutDeps=OutDeps, $ OutObs1=OutObs1, OutObs2=OutObs2, $ OutMod1=OutMod1, OutMod2=OutMod2, $ OutQC1=OutQC1, OutQC2=OutQC2, $ MDT=MDT, OutDates=OutDates, $ rmdi=rmdi, quiet=quiet, $ OutProfileNum=OutProfileNum ;------------------------------------------------------------------------------------------ ;Program to read in data from a feedback format file ; ; Inputs: ; File => File name to be read in ; DepRange => (optional) Range of depths for which the data is to be extracted. ; ; Outputs: ; ;Author: Matt Martin. 29/09/09 ;------------------------------------------------------------------------------------------ rmdi = 99999. if NOT keyword_set(DepRange) then DepRange=[0.,1.e1] ;Default to top 10 metres. NumFiles=n_elements(Files) ifile2=0 numdata=0 for ifile = 0, NumFiles-1 do begin File = Files(ifile) ;1. Open the netcdf file ncid = ncdf_open(File, /nowrite) if ncid lt 0 and not keyword_set(quiet) then print, 'Error opening file '+File if ncid ge 0 then begin if not keyword_set(quiet) then print, 'Opened file '+File+' successfully' ;2. Get info about file ncinfo = ncdf_inquire(ncid) ;3. Read in the relevant dimensions NumExtra = 0 for idim = 0, ncinfo.ndims-1 do begin ncdf_diminq, ncid, idim, name, dimlen if name eq 'N_OBS' then NumObs = dimlen $ else if name eq 'N_LEVELS' then NumLevels = dimlen $ else if name eq 'N_VARS' then NumVars = dimlen $ else if name eq 'N_QCF' then NumFlags = dimlen $ else if name eq 'N_ENTRIES' then NumEntries = dimlen $ else if name eq 'N_EXTRA' then NumExtra = dimlen $ else if name eq 'STRINGNAM' then strnam = dimlen $ else if name eq 'STRINGGRID' then strgrid = dimlen $ else if name eq 'STRINGWMO' then strwmo = dimlen $ else if name eq 'STRINGTYP' then strtyp = dimlen $ else if name eq 'STRINGJULD' then strjuld = dimlen endfor ;4. Set up arrays if (NumObs gt 0) then begin ByteNam = intarr(strnam, NumVars) if (n_elements(NumEntries) eq 1) then ByteEntries = intarr(strnam, NumEntries) ByteId = intarr(strwmo, NumObs) ByteType = intarr(strtyp, NumObs) ByteJulDRef = intarr(strjuld) VarNames = strarr(NumVars) if (n_elements(NumEntries) eq 1) then Entries = strarr(NumEntries) Id = strarr(NumObs) Type = strarr(NumObs) if NumExtra gt 0 then begin ByteExtra = intarr(strnam, NumExtra) Extra = strarr(NumExtra) endif Longitude = fltarr(NumObs) Latitude = fltarr(NumObs) Depth = fltarr(NumLevels, NumObs) DepQC = intarr(NumLevels, NumObs) JulD = dblarr(NumObs) ObsQC = intarr(NumObs) PosQC = intarr(NumObs) JulDQC = intarr(NumObs) Obs = fltarr(NumLevels, NumObs, NumVars) Hx = fltarr(NumLevels, NumObs, NumVars) VarQC = intarr(NumObs, NumVars) LevelQC = intarr(NumLevels, NumObs, NumVars) ;5. Read in the data varid = ncdf_varid(ncid, 'VARIABLES') ncdf_varget, ncid, varid, ByteNam ; info, VarNames ; info, ByteNam for ivar= 0, NumVars-1 do begin VarNames(ivar) = string(ByteNam(*,ivar)) endfor if ifile2 eq 0 then VarName = VarNames(0) if VarName ne VarNames(0) then message, 'Can only read in from files containing the same variables' varid = ncdf_varid(ncid, 'JULD_REFERENCE') ncdf_varget, ncid, varid, ByteJulDRef JulDRef = string(ByteJulDRef) RefDate = JULDAY(fix(strmid(JulDRef,4,2)), fix(strmid(JulDRef,6,2)), fix(strmid(JulDRef,0,4)), $ fix(strmid(JulDRef,8,2)), fix(strmid(JulDRef,10,2)), fix(strmid(JulDRef,12,2))) print, 'RefDate: ',RefDate varid = ncdf_varid(ncid, 'JULD') ncdf_varget, ncid, varid, JulD ; print, JulD Dates = dblarr(NumLevels, NumObs) for iob = 0L, long(NumObs)-1L do begin dt = RefDate + JulD(iob) ; print,dt, JulD(iob) Dates(0:NumLevels-1, iob) = replicate(dt, NumLevels) endfor varid = ncdf_varid(ncid, 'STATION_IDENTIFIER') ncdf_varget, ncid, varid, ByteId Identifier = string(ByteId) varid = ncdf_varid(ncid, 'STATION_TYPE') ncdf_varget, ncid, varid, ByteType Type = string(ByteType) varid = ncdf_varid(ncid, 'LONGITUDE') ncdf_varget, ncid, varid, Longitude varid = ncdf_varid(ncid, 'LATITUDE') ncdf_varget, ncid, varid, Latitude varid = ncdf_varid(ncid, 'DEPTH') ncdf_varget, ncid, varid, Depth ncdf_attget, ncid, varid, '_Fillvalue', FillVal pts = where(Depth eq FillVal, count) if count gt 0 then Depth(pts) = rmdi varid = ncdf_varid(ncid, 'OBSERVATION_QC') ncdf_varget, ncid, varid, ObsQC ncdf_attget, ncid, varid, '_Fillvalue', FillVal pts = where(ObsQC eq FillVal, count) if count gt 0 then ObsQC(pts) = rmdi for ivar = 0, NumVars-1 do begin varid = ncdf_varid(ncid, strtrim(VarNames(ivar))+'_OBS') ncdf_varget, ncid, varid, tmp Obs(*,*,ivar) = tmp ncdf_attget, ncid, varid, '_Fillvalue', FillValObs varid = ncdf_varid(ncid, strtrim(VarNames(ivar))+'_Hx') if (varid gt -1) then begin ncdf_varget, ncid, varid, tmp Hx(*,*,ivar) = tmp ncdf_attget, ncid, varid, '_Fillvalue', FillValHx endif else begin FillValHx=0 endelse varid = ncdf_varid(ncid, strtrim(VarNames(ivar))+'_QC') ncdf_varget, ncid, varid, tmp VarQC(*,ivar) = tmp ncdf_attget, ncid, varid, '_Fillvalue', FillValQC varid = ncdf_varid(ncid, strtrim(VarNames(ivar))+'_LEVEL_QC') ncdf_varget, ncid, varid, tmp LevelQC(*,*,ivar) = tmp ncdf_attget, ncid, varid, '_Fillvalue', FillValLevQC endfor ; print,' DJL levelqc(*,218,0) ',levelqc(*,218,0) ; print,' DJL levelqc(*,218,1) ',levelqc(*,218,1) pts = where(Obs eq FillValObs, count) if count gt 0 then Obs(pts) = rmdi pts = where(Hx eq FillValHx, count) if count gt 0 then Hx(pts) = rmdi pts = where(VarQC eq FillValQC, count) if count gt 0 then VarQC(pts) = rmdi pts = where(LevelQC eq FillValLevQC, count) if count gt 0 then LevelQC(pts) = rmdi Obs1 = Obs(*,*,0) Hx1 = Hx(*,*,0) VarQC1=LevelQC(*,*,0) if NumVars gt 1 then begin Obs2 = Obs(*,*,1) Hx2 = Hx(*,*,1) VarQC2=LevelQC(*,*,1) endif if strtrim(VarName,2) eq 'SLA' then begin MDT = fltarr(NumLevels, NumObs) print, NumLevels, NumObs varid = ncdf_varid(ncid, 'MDT') ncdf_varget, ncid, varid, MDT ncdf_attget, ncid, varid, '_Fillvalue', FillVal pts = where(MDT eq FillVal, count) if count gt 0 then MDT(pts) = rmdi Obs2 = MDT endif ;6. Put the data into the correct form to be output from this routine Platformsa = strarr(NumLevels, NumObs) Instrumentsa = strarr(NumLevels, NumObs) Lons = fltarr(NumLevels,NumObs) Lats = fltarr(NumLevels,NumObs) ProfileNum = lonarr(NumLevels,NumObs) for i=0,NumLevels-1 do begin Platformsa(i,*)=Type Instrumentsa(i,*)=Identifier endfor for i=0L,long(NumObs)-1L do begin Lats(*,i)=Latitude(i) Lons(*,i)=Longitude(i) ProfileNum(*,i) = i+1 endfor ; pts = where(Depth ge DepRange(0) and Depth le DepRange(1), NumDataInc) NumData=NumData+NumDataInc ; if ifile2 eq 0 then begin OutObs1 = [Obs1(pts)] OutMod1 = [Hx1(pts)] OutQC1 = [VarQC1(pts)] OutDeps = [Depth(pts)] OutLats = [Lats(pts)] OutLons = [Lons(pts)] OutDates= [Dates(pts)] OutInst= [Instrumentsa(pts)] OutPlatform= [Platformsa(pts)] OutProfileNum = [ProfileNum(pts)] if NumVars eq 2 then begin OutObs2 = [Obs2(pts)] OutMod2 = [Hx2(pts)] OutQC2 = [VarQC2(pts)] endif endif else begin OutObs1 = [OutObs1, Obs1(pts)] OutMod1 = [OutMod1, Hx1(pts)] OutQC1 = [OutQC1, VarQC1(pts)] OutDeps = [OutDeps, Depth(pts)] OutLats = [OutLats, Lats(pts)] OutLons = [OutLons, Lons(pts)] OutDates= [OutDates, Dates(pts)] OutInst= [OutInst, Instrumentsa(pts)] OutPlatform= [OutPlatform, Platformsa(pts)] OutProfileNum = [OutProfileNum, ProfileNum(pts)] if NumVars eq 2 then begin OutObs2 = [OutObs2, Obs2(pts)] OutMod2 = [OutMod2, Hx2(pts)] OutQC2 = [OutQC2, VarQC2(pts)] endif endelse if NumVars eq 1 then begin if VarName ne 'SLA' then OutObs2 = fltarr(n_elements(OutObs1)) + rmdi OutMod2 = fltarr(n_elements(OutMod1)) + rmdi OutQC2 = fltarr(n_elements(OutQC1)) + rmdi endif ; ifile2=ifile2+1 endif ncdf_close, ncid endif endfor ;ifile pts1 = where(OutQC1 eq 1, count1) pts2 = where(OutQC1 ne 1, count2) if count1 gt 0 then OutQc1(pts1) = 0 if count2 gt 0 then OutQc1(pts2) = 1 if NumVars gt 1 then begin pts1 = where(OutQC2 eq 1, count1) pts2 = where(OutQC2 ne 1, count2) if count1 gt 0 then OutQc2(pts1) = 0 if count2 gt 0 then OutQc2(pts2) = 1 endif END