mrdfits.pro

来自「basic median filter simulation」· PRO 代码 · 共 1,852 行 · 第 1/5 页

PRO
1,852
字号
    ; Find the first non-numeric character.    ; Get rid of blanks.    form = strcompress(form,/remove_all)    len = strlen(form)    if len le 0 then return    type = strmid(form, 0,1)    length = strmid(form,1,len-1)    ;    ; Ignore the number of decimal places.  We assume that there    ; is a decimal point.    ;    p = strpos(length, '.')    if p gt 0 then length = strmid(length,0,p)   if strlen(length) gt 0 then slen = fix(length) else slen = 1   if (type EQ 'F') or (type EQ 'E') then $     ;Updated April 2007        if (slen GE 8) then type = 'D'end; Read in the table information.pro mrd_read_ascii, unit, range, nbytes, nrows, nfld, typarr, posarr,   $     lenarr, nullarr, table, old_struct=old_struct, rows=rows    ;    ; Unit          Unit to read data from.    ; Range         Range of  to be read    ; Nbytes        Number of bytes per row.    ; Nrows         Number of rows.    ; Nfld          Number of fields in structure.    ; Typarr        Array indicating type of variable.    ; Posarr        Starting position of fields (first char at 0)    ; Lenarr        Length of fields    ; Nullarr       Array of null values    ; Table         Table to read information into.    ; Old_struct    Should recursive structure format be used?    bigstr = bytarr(nbytes, range[1]-range[0]+1)    if range[0] gt 0 then mrd_skip, unit, nbytes*range[0]    readu,unit, bigstr    if N_elements(rows) GT 0 then bigstr = bigstr[*,rows-range[0]]     ; Skip to the end of the data area.    nSkipRow = nrows - range[1] - 1    nskipB = 2880 - (nbytes*nrows) mod 2880    if nskipB eq 2880 then nskipB = 0    mrd_skip, unit, nskipRow*nbytes+nskipB    s1 = posarr-1    s2 = s1 + lenarr - 1    for i=0, nfld-1 do begin        flds = strtrim( bigstr[s1[i]:s2[i],* ] )        if strtrim(nullarr[i]) ne '' then begin	    		curr_col = table.(i)	                w = where(flds ne strtrim(nullarr[i]))            if w[0] ne -1 then begin                if N_elements(w) EQ 1 then w = w[0]                if typarr[i] eq 'I' then begin                    curr_col[w] = long(flds[w])                endif else if typarr[i] eq 'E' or typarr[i] eq 'F' then begin                    curr_col[w] = float(flds[w])                endif else if typarr[i] eq 'D' then begin                    curr_col[w] = double(flds[w])                endif else if typarr[i] eq 'A' then begin                    curr_col[w] = flds[w]                endif            endif                table.(i) = curr_col                        endif else begin                              if typarr[i] eq 'I' then begin                    table.(i) =  long(flds)            endif else if typarr[i] eq 'E' or typarr[i] eq 'F' then begin                    table.(i) = float(flds)            endif else if typarr[i] eq 'D' then begin                    table.(i) = double(flds)             endif else if typarr[i] eq 'A' then begin                    table.(i) = flds            endif        endelse    endforend; Define a structure to hold a FITS ASCII table.pro mrd_ascii, header, structyp, use_colnum,   $    range, table, $    nbytes, nrows, nfld, typarr, posarr, lenarr, nullarr, $    fnames, fvalues, scales, offsets, scaling, status, rows = rows, $    silent=silent, columns=columns, alias=alias, outalias=outalias    ;    ; Header                FITS header for table.    ; Structyp              IDL structure type to be used for    ;                       structure.    ; Use_colnum            Use column numbers not names.    ; Range                 Range of rows of interest    ; Table                 Structure to be defined.    ; Nbytes                Bytes per row    ; Nrows                 Number of rows in table    ; Nfld                  Number of fields    ; Typarr                Array of field types    ; Posarr                Array of field offsets    ; Lenarr                Array of field lengths    ; Nullarr               Array of field null values    ; Fname                 Column names    ; Fvalues               Formats for columns    ; Scales/offsets        Scaling factors for columns    ; Scaling               Do we need to scale?    ; Status                Return status.    table = 0    types  = ['I', 'E', 'F', 'D', 'A']    sclstr = ['0l', '0.0', '0.0', '0.0d0', ' ']    status = 0    if strmid(fxpar(header, 'XTENSION'),0,8) ne 'TABLE   ' then begin        message, 'ERROR - Header is not from ASCII table.',/CON        status = -1;        return    endif    nfld = fxpar(header, 'TFIELDS')    nrows = long64( fxpar(header, 'NAXIS2'))    nbytes = long64( fxpar(header, 'NAXIS1'))     if range[0] ge 0 then begin        range[0] = range[0] < (nrows-1)        range[1] = range[1] < (nrows-1)    endif else begin        range[0] = 0        range[1] = nrows-1    endelse    if N_elements(rows) EQ 0 then nrows = range[1] - range[0] + 1 else begin          bad = where(rows GT nrows, Nbad)          if Nbad GT 0  then begin              message,/CON,'ERROR: Row numbers must be between 0 and ' + $                      strtrim(nrows-1,2)             status = -1             return          endif                nrows = N_elements(rows)     endelse    if nrows le 0 then begin        if not keyword_set(silent) then begin            print,'MRDFITS: ASCII table.  ',strcompress(string(nfld)),  $                  ' columns, no rows'        endif        return    endif    ;    ;  Loop over the columns    typarr  = strarr(nfld)    lenarr  = intarr(nfld)    posarr  = intarr(nfld)    nullarr = strarr(nfld)    fnames  = strarr(nfld)    fvalues = strarr(nfld)    scales  = dblarr(nfld)    offsets = dblarr(nfld)    tname  =  strarr(nfld)    for i=0, nfld-1 do begin        suffix = strcompress(string(i+1), /remove_all)        fname = fxpar(header, 'TTYPE' + suffix, count=cnt)	tname[i] = fname	if cnt eq 0 then xx = temporary(fname)        fform = fxpar(header, 'TFORM' + suffix)        fpos = fxpar(header, 'TBCOL' + suffix)        fnull = fxpar(header, 'TNULL' + suffix, count=cnt)	if cnt eq 0 then fnull = ''        scales[i] = fxpar(header, 'TSCAL' + suffix)        if scales[i] eq 0.0d0 then scales[i] = 1.0d0        offsets[i] = fxpar(header, 'TZERO'+suffix)                fname = mrd_dofn(fname,i+1, use_colnum, alias=alias)        fnames[i] = fname        fname = mrd_chkfn(fname, fnames, i)                mrd_atype, fform, ftype, flen        typarr[i] = ftype        lenarr[i] = flen        posarr[i] = fpos        nullarr[i] = fnull                for j=0, n_elements(types) - 1 do begin            if ftype eq types[j] then begin                if ftype ne 'A' then begin                    val = sclstr[j]                endif else begin                    val = 'string(replicate(32b,'+strtrim(flen,2)+'))'                endelse                                        fvalues[i] = val                                        goto, next_col            endif        endfor                print, 'MRDFITS: Invalid format code:',ftype, ' for column ', i+1        status = -1        return  next_col:    endfor    if scaling then begin        w = where(scales ne 1.0d0 or offsets ne 0.0d0)        if w[0] eq -1 then scaling = 0    endif    if not scaling and not keyword_set(columns) then begin        table = mrd_struct(fnames, fvalues, nrows, structyp=structyp, $           silent=silent)    endif else begin        table = mrd_struct(fnames, fvalues, nrows, silent=silent)    endelse    if not keyword_set(silent) then begin        print,'MRDFITS: ASCII table.  ',strcompress(string(nfld)),  $         ' columns by ',strcompress(string(nrows)), ' rows.'    endif        outalias = transpose([ [tag_names(table)],[tname] ] )    status = 0    returnend; Eliminate columns from the table that do not match the; user specification.pro  mrd_columns, table, columns, fnames, fvalues, $    vcls, vtpes, scales,  offsets, scaling,        $    structyp=structyp, silent=silent    sz = size(columns)    type = sz[sz[0]+1]    nele = sz[sz[0]+2]    if type eq 8 or type eq 6 or type eq 0 then return  ; Can't use structs                                                    ; or complex.    if type eq 4 or type eq 5 then tcols = fix(columns)    if type eq 1 or type eq 2 or type eq 3 then tcols = columns    ; Convert strings to uppercase and compare with column names.    if type eq 7 then begin        for i=0, nele-1 do begin            cname = strupcase(columns[i])            w = where(cname eq strupcase(fnames))            if w[0] ne -1 then begin                if n_elements(tcols) eq 0 then begin                    tcols = w[0]+1                endif else begin                    tcols = [tcols, w[0]+1]                endelse            endif        endfor    endif    ; Subtract one from column indices and check that all indices >= 0.    if n_elements(tcols) gt 0 then begin        tcols = tcols-1        w = where(tcols ge 0)        if w[0] eq -1 then begin            dummy = temporary(tcols)        endif    endif    if n_elements(tcols) le 0 then begin        print, 'MRDFITS:  No columns match'                ; Undefine variables.  First ensure they are defined, then        ; use temporary() to undefine them.        table = 0        fnames = 0        fvalues = 0        vcls = 0        vtpes = 0        scales = 0        offsets = 0        dummy = temporary(fnames)        dummy = temporary(fvalues)        dummy = temporary(vcls)        dummy = temporary(vtpes)        dummy = temporary(scales)        dummy = temporary(offsets)        scaling = 0            endif else begin        ; Replace arrays with only desired columns.                fnames = fnames[tcols]        fvalues = fvalues[tcols]                ; Check if there are still variable length columns.        if n_elements(vcls) gt 0 then begin            vcls = vcls[tcols]            vtpes = vtpes[tcols]            w = where(vcls eq 1)            if w[0] eq -1 then begin                dummy = temporary(vcls)                dummy = temporary(vtpes)            endif        endif                ; Check if there are still columns that need scaling.        if n_elements(scales) gt 0 then begin            scales = scales[tcols]            offsets = offsets[tcols]            w = where(scales ne 1.0d0  or offsets ne 0.0d0)            if w[0] eq -1 then scaling = 0        endif                ndim = n_elements(table)                if scaling or n_elements(vcls) gt 0 then begin            tabx = mrd_struct(fnames, fvalues, ndim, silent=silent )        endif else begin            tabx = mrd_struct(fnames, fvalues, ndim, structyp=structyp, silent=silent )        endelse                for i=0, n_elements(tcols)-1 do begin                tabx.(i) = table.(tcols[i]);        endfor        table = tabx    endelse    end; Read in the image information. pro mrd_read_image, unit, range, maxd, rsize, table, rows = rows,status=status, $     unixpipe = unixpipe     ;     ; Unit          Unit to read data from.     ; Table         Table/array to read information into.     ;     error=0    catch,error

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?