;----------------------------------------------------------------- ; NAME: read_climsat_swath2 ; ; PURPOSE: Reads data written in climsat_scan format. ; ; LANGUAGE: IDL ; ; INPUTS: ; ifile -> input climsat-formatted data file ; ; INPUT KEYWORDS: ; ; header1 -> Gives basic header information ; header2 -> Gives header information on variable names ; lon_gm -> Gives longitude information from Greewich (0-360) ; region -> [slat,nlat,wlon,elon], lat = (-90 to 90), lon = (0 ; to 360) ; ; OUTPUTS: ; ; Outputs structure contains data ; Outputs -1 if no data in selected region ; ; NOTES: ; High resolution data fields, that can be found in the SSM/I ; climsat-formatted data, can not be processed with this code. ; EXTERNALS: ; convert_time.pro ; ; CREATION HISTORY: Darren Jackson CIRES/ETL June 2003 ; - version 2, Jan 2005, Cuts out spatial region ; Removed FOR loop that was not needed. ; - August 2005. Added satid to dat structure ; - June 2007. Region longitude range now 0-360. ;----------------------------------------------------------------- FUNCTION read_climsat_swath2, ifile, header1=header1, header2=header2, $ lon_gm=lon_gm, region=region ; ; Define structure for header record ; hdr1 = {file:STRING('',format='(a80)'), $ satellite:STRING('',format='(a20)'), $ sensor:STRING('',format='(a20)'), $ satid:0, $ nfieldslow:0, $ npixelslow:0, $ nfieldshigh:0, $ npixelshigh:0, $ missing:0} ; ; Open input file ; OPENR,ilun,ifile,/get_lun READU,ilun,hdr1 FREE_LUN,ilun IF(KEYWORD_SET(header1)) THEN RETURN, hdr1 hdr2 = REPLICATE({scale:0.0, $ offset:0.0, $ units:STRING('',format='(a40)'), $ desc:STRING('',format='(a80)')},hdr1.nfieldslow) fill = BYTARR(132) OPENR,ilun,ifile,/get_lun READU,ilun,fill,hdr2 FREE_LUN,ilun IF(KEYWORD_SET(header2)) THEN RETURN, hdr2 IF(hdr1.nfieldshigh ne 0) THEN BEGIN PRINT,'High resolution data fields can not be processed' STOP ENDIF data = {time:0L, $ lat:0, $ lon:0, $ tb:INTARR(hdr1.nfieldslow)} ; ; Find total number of data records in data file ; fill = BYTARR(5000) OPENR,ilun,ifile,/get_lun READU,ilun,fill nrec=0L WHILE NOT EOF(ilun) DO BEGIN READU,ilun,data IF(data.time gt 0) THEN nrec = nrec + 1 ENDWHILE maxrec = nrec FREE_LUN,ilun IF(maxrec gt 0) THEN BEGIN ; ; Assign output structure ; dat = REPLICATE({satid:'', $ month:0, $ day:0, $ year:0, $ hour:0, $ min:0, $ sec:0, $ sp:0, $ iline:0, $ lat:0.0, $ lon:0.0, $ tb:FLTARR(hdr1.nfieldslow)},maxrec) ; ; Fill output data arrays ; OPENR,ilun,ifile,/get_lun READU,ilun,fill nrec=0L ipos=1 iline = 1 WHILE NOT EOF(ilun) DO BEGIN READU,ilun,data IF(data.time gt 0) THEN BEGIN result = CONVERT_TIME(data.time,1970) dat[nrec].satid = STRTRIM(hdr1.satid,1) dat[nrec].month = result(0) dat[nrec].day = result(1) dat[nrec].year = result(2) dat[nrec].hour = result(3) dat[nrec].min = result(4) dat[nrec].sec = result(5) dat[nrec].sp = ipos dat[nrec].iline = iline dat[nrec].lat = data.lat/100. dat[nrec].lon = data.lon/100. dat[nrec].tb = data.tb/hdr2.scale - hdr2.offset nrec++ ENDIF ipos++ IF(ipos gt hdr1.npixelslow) THEN BEGIN ipos = 1 iline++ ENDIF ENDWHILE FREE_LUN,ilun ; ; Apply regional filter if requested ; IF(KEYWORD_SET(region)) THEN BEGIN region2 = region region2(2)=region2(2)-180. region2(3)=region2(3)-180. b = WHERE(dat.lon ge region2(2) and dat.lon lt region2(3) and $ dat.lat ge region2(0) and dat.lat lt region2(1), bcnt) IF(bcnt gt 0) THEN BEGIN dat2 = REPLICATE({satid:'', $ month:0, $ day:0, $ year:0, $ hour:0, $ min:0, $ sec:0, $ sp:0, $ iline:0, $ lat:0.0, $ lon:0.0, $ tb:FLTARR(hdr1.nfieldslow)},bcnt) dat2.satid = dat[b].satid dat2.month = dat[b].month dat2.day = dat[b].day dat2.year = dat[b].year dat2.hour = dat[b].hour dat2.min = dat[b].min dat2.sec = dat[b].sec dat2.sp = dat[b].sp dat2.iline = dat[b].iline dat2.lat = dat[b].lat dat2.lon = dat[b].lon dat2.tb = dat[b].tb ENDIF ELSE BEGIN ; PRINT,'Region selected for file='+ifile+' has no data' nodata = -1 RETURN, nodata ENDELSE ENDIF ; ; Adjust longitude values to be 0-360 ; IF(KEYWORD_SET(lon_gm)) THEN BEGIN IF(KEYWORD_SET(region)) THEN BEGIN b = WHERE(dat2.lon lt 0.,bcnt) IF(bcnt gt 0) THEN dat2(b).lon = 360. + TEMPORARY(dat2(b).lon ) ENDIF ELSE BEGIN b = WHERE(dat.lon lt 0.,bcnt) IF(bcnt gt 0) THEN dat(b).lon = 360. + TEMPORARY(dat(b).lon ) ENDELSE ENDIF IF(KEYWORD_SET(region)) THEN BEGIN RETURN, dat2 ENDIF ELSE BEGIN RETURN, dat ENDELSE ENDIF ELSE BEGIN nodata = -1 RETURN, nodata ENDELSE END