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

📄 fxbwrite.pro

📁 basic median filter simulation
💻 PRO
字号:
	PRO FXBWRITE, UNIT, DATA, COL, ROW, BIT=BIT, NANVALUE=NANVALUE,	$		ERRMSG=ERRMSG;+; NAME: ;	FXBWRITE; Purpose     : ;	Write a binary data array to a disk FITS binary table file.; Explanation : ;	Each call to FXBWRITE will write to the data file, which should already;	have been created and opened by FXBCREATE.  One needs to call this;	routine for every column and every row in the binary table.  FXBFINISH;	will then close the file.; Use         : ;	FXBWRITE, UNIT, DATA, COL, ROW; Inputs      : ;	UNIT	= Logical unit number corresponding to the file containing the;		  binary table.;	DATA	= IDL data array to be written to the file.;	COL	= Column in the binary table to place data in, starting from;		  column one.;	ROW	= Row in the binary table to place data in, starting from row;		  one.; Opt. Inputs : ;	None.; Outputs     : ;	None.; Opt. Outputs: ;	None.; Keywords    : ;	BIT	= Number of bits in bit mask arrays (type "X").  Only used if;		  the column is of variable size.;	NANVALUE= Value signalling data dropout.  All points corresponding to;		  this value are set to be IEEE NaN (not-a-number).  Ignored;		  unless DATA is of type float, double-precision or complex.;	ERRMSG	= If defined and passed, then any error messages will be;		  returned to the user in this parameter rather than;		  depending on the MESSAGE routine in IDL.  If no errors are;		  encountered, then a null string is returned.  In order to;		  use this feature, ERRMSG must be defined first, e.g.;;			ERRMSG = '';			FXBWRITE, ERRMSG=ERRMSG, ...;			IF ERRMSG NE '' THEN ...;; Calls       : ;	HOST_TO_IEEE; Common      : ;	Uses common block FXBINTABLE--see "fxbintable.pro" for more;	information.; Restrictions: ;	The binary table file must have been opened with FXBCREATE.;;	The data must be consistent with the column definition in the binary;	table header.;;	The row number must be consistent with the number of rows stored in the;	binary table header.;; Side effects: ;	None.; Category    : ;	Data Handling, I/O, FITS, Generic.; Prev. Hist. : ;	W. Thompson, Jan 1992, based on WRITEFITS by J. Woffard and W. Landsman.;	W. Thompson, Feb 1992, modified to support variable length arrays.;	W. Thompson, Feb 1992, removed all references to temporary files.; Written     : ;	William Thompson, GSFC, January 1992.; Modified    : ;	Version 1, William Thompson, GSFC, 12 April 1993.;		Incorporated into CDS library.;	Version 2, William Thompson, GSFC, 21 July 1993.;		Fixed bug with variable length arrays.;	Version 3, William Thompson, GSFC, 31 May 1994;		Added ERRMSG keyword.;       Version 4, William Thompson, GSFC, 23 June 1994;               Modified so that ERRMSG is not touched if not defined.;	Version 5, Wayne Landsman, GSFC, 12 Aug 1997;		Recognize IDL double complex data type; Version     :;       Version 5, 12 August 1997;	Converted to IDL V5.0   W. Landsman   September 1997;-;@fxbintable	ON_ERROR, 2;;  Check the number of parameters.;	IF N_PARAMS() LT 4 THEN BEGIN		MESSAGE = 'Syntax:  FXBWRITE, UNIT, DATA, COL, ROW'		IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN			ERRMSG = MESSAGE			RETURN		END ELSE MESSAGE, MESSAGE	ENDIF;;  Find the logical unit number in the FXBINTABLE common block.;	ILUN = WHERE(LUN EQ UNIT,NLUN)	ILUN = ILUN[0]	IF NLUN EQ 0 THEN BEGIN		MESSAGE,'Unit ' + STRTRIM(UNIT,2) +	$			' not opened properly'		IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN			ERRMSG = MESSAGE			RETURN		END ELSE MESSAGE, MESSAGE	ENDIF;;  Check the row and column parameters against the header.;	IF (COL LT 1) OR (COL GT TFIELDS[ILUN]) THEN BEGIN		MESSAGE = 'COL must be between 1 and ' +	$			STRTRIM(TFIELDS[ILUN],2)		IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN			ERRMSG = MESSAGE			RETURN		END ELSE MESSAGE, MESSAGE	END ELSE IF (ROW LT 1) OR (ROW GT NAXIS2[ILUN]) THEN BEGIN		MESSAGE = 'ROW must be between 1 and ' +	$			STRTRIM(NAXIS2[ILUN],2)		IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN			ERRMSG = MESSAGE			RETURN		END ELSE MESSAGE, MESSAGE	ENDIF;;  Calculate the row and column parameters using IDL zero-based indexing.;	IROW = LONG(ROW) - 1	ICOL = LONG(COL) - 1;;  Check the type of the data against that defined for this column.;	SZ = SIZE(DATA)	TYPE = SZ[SZ[0]+1]	IF TYPE NE IDLTYPE[ICOL,ILUN] THEN BEGIN		CASE IDLTYPE[ICOL,ILUN] OF			1: STYPE = 'byte'			2: STYPE = 'short integer'			3: STYPE = 'long integer'			4: STYPE = 'floating point'			5: STYPE = 'double precison'			6: STYPE = 'complex'			7: STYPE = 'string'			9: STYPE = 'double complex'		ENDCASE		MESSAGE = 'Data type should be ' + STYPE		IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN			ERRMSG = MESSAGE			RETURN		END ELSE MESSAGE, MESSAGE	ENDIF;;  Check the number of elements, depending on whether or not the column;  contains variable length arrays.;	IF MAXVAL[ICOL,ILUN] GT 0 THEN BEGIN		IF N_ELEMENTS(DATA) GT MAXVAL[ICOL,ILUN] THEN BEGIN			MESSAGE = 'Data array should have no more than ' + $				STRTRIM(N_ELEM[ICOL,ILUN],2) + ' elements'			IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN				ERRMSG = MESSAGE				RETURN			END ELSE MESSAGE, MESSAGE		ENDIF	END ELSE BEGIN		IF N_ELEMENTS(DATA) NE N_ELEM[ICOL,ILUN] THEN BEGIN			MESSAGE = 'Data array should have ' +	$				STRTRIM(N_ELEM[ICOL,ILUN],2) + ' elements'			IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN				ERRMSG = MESSAGE				RETURN			END ELSE MESSAGE, MESSAGE		ENDIF	ENDELSE;;  Find the position of the first byte of the data array in the file.;	OFFSET = NHEADER[ILUN] + NAXIS1[ILUN]*IROW + BYTOFF[ICOL,ILUN]	POINT_LUN,UNIT,OFFSET;;  If a variable length array, then test to see if the array is of type;  double-precision complex (M) or bit (X).;	IF MAXVAL[ICOL,ILUN] GT 0 THEN BEGIN		N_ELEM0 = N_ELEMENTS(DATA)		IF FORMAT[ICOL,ILUN] EQ "X" THEN BEGIN			IF N_ELEMENTS(BIT) EQ 0 THEN BEGIN				MESSAGE = 'Number of bits not defined'				IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN					ERRMSG = MESSAGE					RETURN				END ELSE MESSAGE, MESSAGE			END ELSE IF N_ELEMENTS(BIT) NE 1 THEN BEGIN				MESSAGE = 'Number of bits must be a scalar'				IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN					ERRMSG = MESSAGE					RETURN				END ELSE MESSAGE, MESSAGE			END ELSE IF LONG((BIT+7)/8) NE N_ELEM0 THEN BEGIN				MESSAGE = 'Number of bits does not match ' + $					'array size'				IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN					ERRMSG = MESSAGE					RETURN				END ELSE MESSAGE, MESSAGE			ENDIF			N_ELEM0 = BIT		ENDIF;;  Write out the number of elements, and the pointer to the variable length;  array.;		POINTER = LONARR(2)		POINTER[0] = N_ELEM0		POINTER[1] = DHEAP[ILUN]		HOST_TO_IEEE,POINTER		WRITEU,UNIT,POINTER		POINT_LUN,UNIT,NHEADER[ILUN] + HEAP[ILUN] + DHEAP[ILUN];;  Update the HEAP pointer.;		CASE TYPE OF			1:  DDHEAP = N_ELEMENTS(DATA)		;Byte			2:  DDHEAP = N_ELEMENTS(DATA) * 2	;Short integer			3:  DDHEAP = N_ELEMENTS(DATA) * 4	;Long integer			4:  DDHEAP = N_ELEMENTS(DATA) * 4	;Float			5:  DDHEAP = N_ELEMENTS(DATA) * 8	;Double			6:  DDHEAP = N_ELEMENTS(DATA) * 8	;Complex			7:  DDHEAP = N_ELEMENTS(DATA)		;String			9:  DDHEAP = N_ELEMENTS(DATA) * 16      ;Dble Complex		ENDCASE		DHEAP[ILUN] = DHEAP[ILUN] + DDHEAP	ENDIF;;  If a byte array, then simply write out the data.;        IF TYPE EQ 1 THEN BEGIN		WRITEU,UNIT,DATA;;  Otherwise, if a character string array, then write out the character strings;  with the correct width, truncating or padding with blanks as necessary.;  However, if a variable length string array, then simply write it out.;	END ELSE IF TYPE EQ 7 THEN BEGIN		IF MAXVAL[ICOL,ILUN] GT 0 THEN BEGIN			WRITEU,UNIT,DATA		END ELSE BEGIN			N_CHAR = N_DIMS[1,ICOL,ILUN]			NEWDATA = REPLICATE(32B,N_CHAR,N_ELEMENTS(DATA))			FOR I=0,N_ELEMENTS(DATA)-1 DO	$				NEWDATA[0,I] = BYTE(STRMID(DATA[I],0,N_CHAR))			WRITEU,UNIT,NEWDATA		ENDELSE;;  Otherwise, if necessary, then byte-swap the data before writing it out.;  Also, replace any values corresponding data dropout with IEEE NaN.;	END ELSE BEGIN		IF (N_ELEMENTS(NANVALUE) EQ 1) AND (TYPE GE 4) AND	$				((TYPE LE 6) OR (TYPE EQ 9)) THEN BEGIN			W = WHERE(DATA EQ NANVALUE, COUNT)			CASE TYPE OF				4:  NAN = FLOAT(  REPLICATE('FF'XB,4),0,1)				5:  NAN = DOUBLE( REPLICATE('FF'XB,8),0,1)				6:  NAN = COMPLEX(REPLICATE('FF'XB,8),0,1)				9:  NAN = DCOMPLEX(REPLICATE('FF'XB,16),0,1)			ENDCASE		END ELSE COUNT = 0;		NEWDATA = DATA		HOST_TO_IEEE, NEWDATA		IF COUNT GT 0 THEN NEWDATA[W] = NAN		WRITEU,UNIT,NEWDATA 	ENDELSE;	IF N_ELEMENTS(ERRMSG) NE 0 THEN ERRMSG = ''	RETURN	END

⌨️ 快捷键说明

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