function mcdaodhd_read,hdf_file,swathattr=swathattr, swathname=swathname compile_opt strictarr, strictarrsubs, defint32 ;####################################################################### ; Ingest MCDAODHD data into a format for convenient use in IDL ;####################################################################### ;NAME: mcdaodhd_read ;PURPOSE: Read MxDAODHD data from disk and return a readable data ;structure for use in IDL ;ARGUMENTS: ; HDF_FILE : location on disk of MxDAODHD HDF granule ;INPUT KEYWORDS (OPTIONAL): ; SWATHNAME : Name of swath to pull from file ; (e.g. 'Landocean_Terraaqua_AOD'). If this keyword is ; specified, only the single swath will be returned. ; RETURN VALUE: ; This function returns an IDL structure with the following ; tags for each observation in HDF_FILE: ; LON : longitude, -180 to 180 ; LAT : latitude, -90 to 90 ; JD : Julian date. This can be processed in IDL ; using JULDAY(), CALDAT, or the C() format code. See ; the help for those procedures for details. Also see ; the example code below. ; TAU : Aerosol Optical Depth ; ERRSD : Estimated uncertainty of TAU ; SDTAU : Standard deviation of L2 retrievals within ; grid cell ; SDOBSERR : Empirically estimates observation ; uncertainty ; N : Number of L2 retrievals within grid cell ; SWATHIDX : Index to SWATHATTR (see below) ;OUTPUT KEYWORDS (OPTIONAL): ; SWATHATTR : Structure containing attributes of swaths ; extracted from HDF file. This structure has the following ; tags: ; SWATHNAME : Full name of the swath ; SATELLITE : 'terra', 'aqua' or 'terraaqua' ; LANDOCEAN : 'land', 'ocean', or 'landocean' ; ALGORITHM VERSION : version of processing algorithm ; SOFTWARE VERSION : version of PGE software ; NOBS : number of observations in the swath ; This structure has one entry for each swath, and in cases ; where multiple swaths are retrieved, data in this structure ; can be indexed from the SWATHIDX field in the output ; structure. ;FILESYSTEM INPUT : reads data from HDF_FILE. ;FILESYSTEM OUTPUT : None. ;USAGE EXAMPLE: ; HDF_FILE = 'MCDAODHD.A20121017.1200.51.NRT.hdf' ; Example 1: Extract all swaths from file and show distribution of AOD for ; over-land AOD from MODIS-Terra ; MCDAOD_DATA = MCDAODHD_READ(HDF_FILE,SWATHATTR=SWATHATTR) ; I_TERRA_LAND = WHERE(SWATHATTR.SWATHNAME eq 'Land_Terra_AOD') ; F_TERRA_LAND = WHERE(MCDAOD_DATA.SWATHIDX eq I_TERRA_LAND[0]) ; TAU_TERRA_LAND = MCDAOD_DATA[F_TERRA_LAND].TAU ; PRINT,MEAN(TAU_TERRA_LAND),STDDEV(TAU_TERRA_LAND) ; Example 2: Extract over-ocean data from MODIS-Aqua only and show ; range of latitude of observations with AOD > 0.2 ; OCEAN_AQUA_DATA = ; MCDAODHD_READ(HDF_FILE,SWATHNAME='Ocean_Aqua_AOD') ; We don't need SWATHATTR in this case ; FGT02 = WHERE(OCEAN_AQUA_DATA.TAU gt 0.2) ; PRINT,MIN(OCEAN_AQUA_DATA[FGT02].LAT) ; PRINT,MAX(OCEAN_AQUA_DATA[FGT02].LAT) if(file_test(hdf_file,/read) eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Can't read input file: ",hdf_file ; return,-1 endif ; get number and list of swaths nswaths = eos_sw_inqswath(hdf_file,swathlist) if(nswaths eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: No HDF-EOS Swath data in input file: ",hdf_file return,-1 endif swaths=strsplit(swathlist,',',/extract) if n_elements(swathname) ne 0 then begin iswathname = where(swaths eq swathname,iswathname_found) if(iswathname_found eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Cannot find swath ",swathname, "in input file: ",hdf_file return,-1 endif endif ;create output structures swath_attr_structure=create_struct(name='NRL_MODIS_AOD_v1_SWATH_ATTRIBUTES', $ 'swathname','', $ 'satellite','', $ 'landocean','', $ 'algorithm_version','', $ 'software_version','', $ 'nobs',0l) obsnew_data_structure = create_struct(name='NRL_MODIS_AOD_v3_DATA', $ 'swathidx',0l, $ 'lon',0.0, $ 'lat',0.0, $ 'jd',0.0d, $ 'tau',0.0, $ 'errsd',0.0, $ 'sdtau',0.0, $ 'sdobserr',0.0, $ 'n',0l) ;iswath=3 if n_elements(swathname) ne 0 then begin iswath0 = iswathname[0] iswath1 = iswathname[0] endif else begin iswath0 = 0 iswath1 = nswaths-1 endelse for iswath=iswath0, iswath1 do begin ;get attribute names and dimensions result = eos_sw_query(hdf_file,swaths[iswath],swathinfo) if(result lt 1) then print,foo else null=temporary(result) ; load attributes into structure swathattr1=swath_attr_structure swathattr1.swathname = swaths[iswath] swathattr1.nobs = swathinfo.dimension_sizes[0] cd,file_dirname(hdf_file) hdfeos_fid = eos_sw_open(file_basename(hdf_file)) swath_id = eos_sw_attach(hdfeos_fid,swaths[iswath]) if(stregex(swathinfo.attributes,'Satellite',/boolean) eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Missing attribute ''Satellite'' from ",hdf_file ; return,-1 endif result = eos_sw_readattr(swath_id,'Satellite',satellite) swathattr1.satellite = satellite if(stregex(swathinfo.attributes,'Landocean',/boolean) eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Missing attribute ''Landocean'' from ",hdf_file ; return,-1 endif result = eos_sw_readattr(swath_id,'Landocean',landocean) swathattr1.landocean = landocean if(stregex(swathinfo.attributes,'Algorithm_Version_Label',/boolean) eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Missing attribute ''Algorithm_Version_Label'' from ",hdf_file ; return,-1 endif result = eos_sw_readattr(swath_id,'Algorithm_Version_Label',algorithm_version) swathattr1.algorithm_version = algorithm_version if(stregex(swathinfo.attributes,'Software_Version_Label',/boolean) eq 0) then begin print,"MOD04_OBSNEW_HDF_READ: Missing attribute ''Software_Version_Label'' from ",hdf_file ; return,-1 endif result = eos_sw_readattr(swath_id,'Software_Version_Label',software_version) swathattr1.software_version = software_version if(swathattr1.nobs gt 0) then begin ; skip if no data ; load data into structure swathdata1 = replicate(obsnew_data_structure,swathinfo.dimension_sizes[0]) swathdata1.swathidx = iswath geofields = strsplit(swathinfo.geo_field_names,',',/extract) datafields = strsplit(swathinfo.field_names,',',/extract) ;longitude islongitude=where(geofields eq 'Longitude',nislongitude) if(nislongitude ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''Longitude'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'Longitude',longitude) swathdata1.lon = longitude ;latitude islatitude=where(geofields eq 'Latitude',nislatitude) if(nislatitude ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''Latitude'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'Latitude',latitude) swathdata1.lat = latitude ;longitude islongitude=where(geofields eq 'Longitude',nislongitude) if(nislongitude ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''Longitude'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'Longitude',longitude) swathdata1.lon = longitude ;jd isjd=where(geofields eq 'Time',nisjd) if(nisjd ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''Time'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'Time',jd) swathdata1.jd = jd ;tau; istau=where(datafields eq 'Aerosol_Optical_Depth',nistau) if(nistau ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''Aerosol_Optical_Depth'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'Aerosol_Optical_Depth',tau) swathdata1.tau = tau ;errsd iserrsd=where(datafields eq 'AOD_Error_SD',niserrsd) if(niserrsd ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''AOD_Error_SD'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'AOD_Error_SD',errsd) swathdata1.errsd = errsd ;sdtau issdtau=where(datafields eq 'AOD_Grid_Cell_SD',nissdtau) if(nissdtau ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''AOD_Grid_Cell_SD'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'AOD_Grid_Cell_SD',sdtau) swathdata1.sdtau = sdtau ;sdobserr issdobserr=where(datafields eq 'AOD_Observation_Error',nissdobserr) if(nissdobserr ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''AOD_Observation_Error'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'AOD_Observation_Error',sdobserr) swathdata1.sdobserr = sdobserr ;n isn=where(datafields eq 'AOD_N10km_In_Grid',nisn) if(nisn ne 1) then begin print,"MOD04_OBSNEW_HDF_READ: Missing field ''AOD_N10km_In_Grid'' from ",hdf_file ; return,-1 endif result = eos_sw_readfield(swath_id,'AOD_N10km_In_Grid',n) swathdata1.n = n if n_elements(swathdataall) eq 0 then swathdataall = swathdata1 else swathdataall = [temporary(swathdataall),temporary(swathdata1)] endif ;close up file result=eos_sw_detach(swath_id) result=eos_sw_close(hdfeos_fid) if n_elements(swathattrall) eq 0 then swathattrall = swathattr1 else swathattrall = [temporary(swathattrall),temporary(swathattr1)] endfor swathattr = temporary(swathattrall) return,swathdataall end