[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NetCDF Attribute Inquiry



Alex Schuster wrote:
> I am reading NetCDF files. I do not know for sure which of the
> attributes are really stored in the file, so I use NCDF_ATTINQ() to
> check before.
> 
> With missing attributes, there are two problems:
> 
> 1) I always get a message like that:
> % NCDF_ATTINQ: Attribute inquiry failed, name "somthing" already in use.
> This doesn't look good, but I can live with that. No idea why it it
> tells me that the name is already being used, because it is not.
> 
> 2) This one is worse: sometimes the result structure of NCDF_ATTINQ()
> does not have a datatype of 'UNKNOWN', but of 'BYTE'. With a random
> length. Another NCDF_ATTINQ() gives a different result. Any idea what's
> happening here?
> 
> My workaround so far is the usage of this function:
> 
> function attribute_there, id, varid, name
>  result = ncdf_attinq( id, varid, name )
>   if ( result.datatype ne 'UNKNOWN'  $
>                 and  result.length gt 0  $
>                 and  result.length lt 1000 ) then begin
>     result = ncdf_attinq( id, varid, name )
>     if ( result.datatype ne 'UNKNOWN'  $
>                 and  result.length gt 0  $
>                 and  result.length lt 1000 ) then begin
>       return, 1
>     endif
>   endif
> return, 0
> end
> 
> I check two times, and I also check for not-too-crazy length fields. I
> guess this will work most of the time, but it's not perfect and will
> fail some time.

Alex,

Here is a function which returns a list of attribute names for a given
variable name. If the variable name is set to the null string '', a list
of global attribute names is returned.

FUNCTION NCDF_ATTDIR, CDFID, VARNAME

;- Check arguments
if n_params() ne 2 then message, 'Usage: RESULT = NCDF_ATTDIR(CDFID,
VARNAME)'
if n_elements(cdfid) eq 0 then message, 'CDFID is undefined'
if n_elements(varname) eq 0 then message, 'VARNAME is undefined'

;- Set default return value
attnames = ''

;- Get attribute information
if varname eq '' then begin
  fileinfo = ncdf_inquire(cdfid)
  natts = fileinfo.ngatts
endif else begin
  varid = ncdf_varid(cdfid, varname)
  varinfo = ncdf_varinq(cdfid, varid)
  natts = varinfo.natts
endelse

;- If attributes were found, get attribute names
if natts gt 0 then begin
  attnames = strarr(natts)
  for index = 0, natts - 1 do begin
    if varname eq '' then begin
      name = ncdf_attname(cdfid, index, /global)
    endif else begin
      name = ncdf_attname(cdfid, varid, index)
    endelse
    attnames[index] = name
  endfor
endif

;- Return the result
return, attnames

END

Cheers,
Liam.
http://cimss.ssec.wisc.edu/~gumley