⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sxopen.pro

📁 basic median filter simulation
💻 PRO
字号:
pro SXOPEN,unit,fname,header,history,access;+; NAME:;       SXOPEN; PURPOSE:;       Open a Space Telescope formatted (STSDAS) header file.; EXPLANATION:;       Saves the parameters required subsequent SX routines in;       the common block Stcommn.  Optionally save the header in ;       the string array Header, and the history in the string array;       History.  Open the data file associated with this;       header on the same unit.;; CALLING SEQUENCE:;       SXOPEN, Unit, Fname [, Header [,History] [,Access]];; INPUTS:;       Unit = IDL unit used for IO.  Must be from 1 to 9.;       Fname = File name of header file.  Default extension;               is .hhh for header files and .hhd for data;               files.    If an extension is supplied it must have the ;               form .xxh where xx are any alphanumeric characters. The;               data file must have extension .xxd;               No version number is allowed.  Most recent versions;               of the files are used.;; OPTIONAL INPUT PARAMETER:;       Access = 'R' to open for read, 'W' to open for write.;; OUTPUTS:;       Stcommn = Common block containing ST parameter blocks.;               (Long arrays.);; OPTIONAL OUTPUT PARAMETERS:;       Header = 80 char by N string array containing the;               names, values and comments from the FITS header.;               Use the function SXPAR to obtain individual;               parameter values.;       History = String array containing the value of the;               history parameter.;; COMMON BLOCKS:;       STCOMMN - Contains RESULT(20,10) where RESULT(i,LUN) =;       0 - 121147 for consistency check, 1 - Unit for consistency,;       2 - bitpix, 3 - naxis, 4 - groups (0 or 1), 5 - pcount,;       6 - gcount, 7 - psize, 8 - data type as idl type code,;       9 - bytes / record, 10 to 10+N-1 - dimension N,;       17 = record length of file in bytes.;       18 - # of groups written, 19 = gcount.;; SIDE EFFECTS:;       The data and header files are accessed.;; RESTRICTIONS:;       Works only for disc files.  The data file must have;       must have the extension ".xxd" and the header file must;       have the extension ".xxh" where x is any alphanumeric character;; PROCEDURE:;       The header file is opened and each line is read.;       Important parameters are stored in the output;       parameter.  If the last two parameters are specified;       the parameter names and values are stored.  The common;       block STCOMMN is filled with the type of data, dimensions,;       etc. for use by SXREAD.;;       If access is for write, each element of the header;       array, which must be supplied, is written to the;       header file.  The common block is filled with;       relevant parameters for SXWRITE.  A keyword of "END";       ends the header.;; MODIFICATION HISTORY:;       Written, DMS, May, 1983.;       D. Lindler Feb. 1990;               Modified to allow var. record length header files.;       D. Lindler April 1990   Conversion to new VMS IDL;       Added /BLOCK when opening new .hhd file;       Converted to IDL V5.0   W. Landsman   September 1997;       Recognize unsigned datatype for V5.1 or greater   W. Landsman Jan 2000;       Assume since V5.5  W. Landsman Sep 2006;-;------------------------------------------------------------------------------        On_error,2        common stcommn,result,filename;     if N_params() LT 2 then begin         print, 'Syntax: SXOPEN, unit, fname, [ header, history, access]'         return     endif;        if N_elements(result) NE 200 then begin ;defined?                result = lonarr(20,10)                filename = strarr(10)                endif;        if (unit lt 1) OR (unit gt 9) then $                message,'Unit number must be from 1 to 9.';        close,unit              ;close unit first;        n = N_params(0)              ;# of parameters we have        if n LT 5 then access = 'R'   ;read access if unspecified;; Add default extension (.hhh) if not specified       ;        xname=strtrim(fname,2)        if strmid(xname,strlen(xname)-4,1) NE '.' then xname = xname + '.hhh'        t=xname                         ;Open keywords.        CASE strupcase(access) OF'R':    sxhread,fname,header               ;Read FITS header'W':    sxhwrite,fname,header              ;Write FITS headerELSE:   message,'Illegal access value, must be R or W'        ENDCASE;        result[*,unit]=0        ;Zero our block             filename[unit]=fname    ;Save file name           result[0,unit]=121147L  ;Code for descr block           result[1,unit] = unit   ;Save unit number            result[6,unit]=1        ;Default value of GCOUNT is 1;; Get keyword names and values from header array; name =  strtrim(strmid(header,0,8),2)   ;param name value = strtrim(strmid(header,10,20),2) ;param value; L_bitpix = where(name EQ 'BITPIX',nfound)      if nfound GT 0 then result[2,unit] = value[L_bitpix[0]] else $       message,'Required Keyword BITPIX not found',/CON; l_naxis = where(strmid(name,0,5) EQ 'NAXIS',nfound)               IF nfound GT 0 then BEGIN           axis = fix(strtrim(strmid(name[l_naxis],5,3),2))           for i=0,nfound-1 do begin                if axis[i] EQ 0 then  $                       result[3,unit]=value[l_naxis[i]] else  $  ;# of dimensions                       result[9+axis[i],unit]=value[l_naxis[i]] ;each dimension            endfor       endif else message,'Required Keyword NAXIS not found';            if n GE 4 then BEGIN                ;Create history parameter?   L_hist = where(name EQ 'HISTORY',nfound)     IF nfound then history = strtrim(strmid(header[l_hist],8,72),2) else $                  history = ''  ENDIF; L_groups = where(name EQ 'GROUPS',nfound)   if nfound GT 0 then result[4,unit] = value[L_groups[0]] eq 'T'; L_pcount = where(name EQ 'PCOUNT',nfound)   if nfound GT 0 then result[5,unit] = value[L_pcount[0]]; L_gcount = where(name EQ 'GCOUNT',nfound)if nfound GT 0 then result[6,unit] = value[L_gcount[0]]; L_psize = where(name EQ 'PSIZE',nfound) if nfound GT 0 then result[7,unit] = value[L_psize[0]]/8 $               else result[7,unit] = result[5,unit]*result[2,unit]; L_datatype = where(name EQ 'DATATYPE',nfound) if nfound GT 0 then begin                 v = value[L_datatype[0]]      ;Process data type.                v = strmid(v,1,strlen(v)-2)   ;Remove apostrophes                v = strtrim(v,2)                    ;trim blanks                CASE v OF       ;Cvt datatype to IDL type code                    'BYTE':                 result[8,unit]=1                'LOGICAL*1':            result[8,unit]=1        ;Byte                'INTEGER*1':            result[8,unit]=1                'REAL*4':               result[8,unit]=4                'INTEGER*2':            result[8,unit]=2                'UNSIGNED*2':           result[8,unit]=12                'INTEGER*4':            result[8,unit]=3                'UNSIGNED*4':           result[8,unit]=13                 'REAL*8':               result[8,unit]=5                'COMPLEX*8':            result[8,unit]=6                ELSE:                   message,'Undefined Datatype value'                ENDCASE         ;V OF endif                       ;DATATYPE;;; If DATATYPE not specified assume integer of size specified by BITPIX;        if result[8,unit] EQ 0 then begin                CASE result[2,unit] OF                        8: result[8,unit]=1             ;byte                       16: result[8,unit]=2             ;integer*2                       32: result[8,unit]=3             ;integer*4                      -32: result[8,unit]=4                      -64: result[8,unit]=5                     else: message,'Unable to determine data type'                ENDCASE        endif;              bytes = abs(result[2,unit])/8l  ;bytes/datum        for j=1,result[3,unit] do $     ;accum bytes/record                        bytes=bytes*result[9+j,unit]        bytes = bytes + result[7,unit]     ;+ header.        result[9,unit]=bytes               ;Save bytes/record. ;        xname=strmid(xname,0,strlen(xname)-1)+'d'   ;Change to data filename  ;        If result[3,unit] GT 0 then begin      ;NAXIS non-zero?          close,unit          if strupcase(access) eq 'R' then $                openr,unit,xname  $          else begin                nrecs = (result[6,unit]*result[9,unit]+511)/512                openw, unit, xname          endelse        result[17,unit] = 512           ;Save record length            endif else result[17,unit]=0    ;NAXIS = 0        returnend  

⌨️ 快捷键说明

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