#COMPILE EXE "FITS-BASIC.exe" DEFSNG A-H,O-Z DEFINT I-N FUNCTION PBMAIN PRINT " ***************************************" PRINT " * *" PRINT " * PROGRAM FOR READING AND WRITING *" PRINT " * FITS FILES USING POWERBASIC CC *" PRINT " * *" PRINT " * Programmed by Steve Maas *" PRINT " * cat-star.org *" PRINT " * Version 1.0 June 2015 *" PRINT " * *" PRINT " ***************************************" PRINT "" PRINT "Enter the name of the input FITS file" PRINT "including path (if not in same directory PRINT "as program) and file extension (.fit)-" INPUT FILIN$ PRINT "" PRINT "Enter a name for the output FITS file" PRINT "including path (if not in same directory PRINT "as program) and file extension (.fit)-" INPUT FILOUT$ OPEN "FITS-LOG.txt" FOR OUTPUT AS #2 PRINT #2, "INPUT FILE: "; FILIN$ PRINT #2, "OUTPUT FILE: "; FILOUT$ PRINT #2, "" '-------------- READ IMAGE HEADER --------------------- OPEN FILIN$ FOR BINARY AS #1 NHEADSIZE = 0 ReadHead: GET$ #1, 2880, A$ NHEADSIZE = NHEADSIZE + 36 FOR II=1 TO 36 ICOUNTR = (II-1)*80 IF MID$(A$,ICOUNTR+1,3) = "END" THEN IF NHEADSIZE = 36 THEN C$ = A$ ELSE C$ = C$ + A$ END IF PRINT #2, "ORIGINAL FILE HEADER:" PRINT #2, C$ GOTO headfinished END IF NEXT II IF NHEADSIZE = 36 THEN C$ = A$ ELSE C$ = C$ + A$ END IF GOTO ReadHead 'read next 2880-byte block of header headfinished: 'Find type of image (from BITPIX in header): ' 8 unsigned 1-byte integer (PB Byte) ' 16 signed 2-byte (16-bit) integer (PB Regular Integer) ' 32 signed 4-byte (32-bit) integet (PB Long Integer) ' -32 4-byte (32-bit) floating point real (PB Regular Real) ' -64 8-byte (64-bit) floating point real (PB Double-precision Real) FOR II=1 TO NHEADSIZE ICOUNTR = (II-1)*80 IF MID$(C$,ICOUNTR+1,6) = "BITPIX" THEN IMGTYPE = VAL( MID$(C$,ICOUNTR+11,20) ) LOCBITPIX = ICOUNTR+1 PRINT #2, "" PRINT #2, "From FITS image header:" PRINT #2, "Image type (BITPIX) = "; IMGTYPE GOTO typefinished END IF NEXT II typefinished: 'Find dimensions of image FOR II=1 TO NHEADSIZE ICOUNTR = (II-1)*80 IF MID$(C$,ICOUNTR+1,6) = "NAXIS1" THEN NCOL = VAL( MID$(C$,ICOUNTR+11,20) ) NROW = VAL( MID$(C$,ICOUNTR+80+11,20) ) PRINT #2, "" PRINT #2, "Columns in image = ";NCOL, " Rows in image = ";NROW GOTO dimfinished END IF NEXT II dimfinished: 'Find scale factors for image data FOR II=1 TO NHEADSIZE ICOUNTR = (II-1)*80 IF MID$(C$,ICOUNTR+1,6) = "BSCALE" THEN BSCALE = VAL( MID$(C$,ICOUNTR+11,20) ) LOCBSCALE = ICOUNTR+1 PRINT #2, "" PRINT #2, "Value of BSCALE = ";BSCALE GOTO scalefinished END IF NEXT II scalefinished: FOR II=1 TO NHEADSIZE ICOUNTR = (II-1)*80 IF MID$(C$,ICOUNTR+1,5) = "BZERO" THEN BZERO = VAL( MID$(C$,ICOUNTR+11,20) ) LOCBZERO = ICOUNTR+1 PRINT #2, "" PRINT #2, "Value of BZERO = ";BZERO GOTO zerofinished END IF NEXT II zerofinished: 'Extract date and time- FOR II=1 TO NHEADSIZE ICOUNTR = (II-1)*80 IF MID$(C$,ICOUNTR+1,8) = "DATE-OBS" THEN DATETIME$ = MID$(C$,ICOUNTR+11,20) IYEAR = VAL( MID$(DATETIME$,2,4) ) IMON = VAL( MID$(DATETIME$,7,2) ) IDAY = VAL( MID$(DATETIME$,10,2) ) IHOUR = VAL( MID$(DATETIME$,13,2) ) IMIN = VAL( MID$(DATETIME$,16,2) ) ISEC = VAL( MID$(DATETIME$,19,2) ) PRINT #2, "" PRINT #2, "Year, month, day = ";IYEAR; IMON; IDAY PRINT #2, "Hour, minutes, seconds = ";IHOUR; IMIN; ISEC GOTO datefinished END IF NEXT II datefinished: '------------- READ IMAGE DATA --------------------- STARTBYTE& = NHEADSIZE*80 + 1 IF IMGTYPE = 16 THEN 'start of 16-bit integer (BITPIX = 16) image data input CLOSE #1 'read (GET) binary data as array of 2-byte strings- DIM PIXDATASTI(1 TO NROW*NCOL) AS STRING * 2 'read in binary data- OPEN FILIN$ FOR BINARY AS #5 GET #5, STARTBYTE&, PIXDATASTI() TO COUNT& PRINT #2, "" PRINT #2, "Number of 2-byte data strings read from file = "; COUNT& 'reverse string bytes and convert to real- DIM PIXDATAI%(1 TO NROW*NCOL) FOR IPIX&=1 TO NROW*NCOL PIXDATAI%(IPIX&) = CVI(STRREVERSE$(PIXDATASTI(IPIX&))) NEXT IPIX& 'load pixel data into 2-D image array 'note- images in AIP4WinV2 start at (0,0) in upper left corner- DIM PIXVAL!(0 TO NCOL-1,0 TO NROW-1) 'row = J, col = I IROW = 0 ICOL = -1 FOR IPIX&=1 TO NROW*NCOL ICOL = ICOL + 1 IF ICOL > NCOL-1 THEN 'start new row IROW = IROW + 1 ICOL = 0 END IF PIXVAL!(ICOL,IROW) = PIXDATAI%(IPIX&)*BSCALE + BZERO NEXT IPIX& GOTO FinishedReading END IF 'end of 16-bit integer (BITPIX = 16) image data input IF IMGTYPE = -32 THEN 'start of 32-bit floating point image data input CLOSE #1 'read (GET) binary data as array of 4-byte strings- DIM PIXDATASTR(1 TO NROW*NCOL) AS STRING * 4 'read in binary data- OPEN FILIN$ FOR BINARY AS #5 GET #5, STARTBYTE&, PIXDATASTR() TO COUNT& PRINT #2, "" PRINT #2, "Number of 4-byte data strings read from file = "; COUNT& 'reverse string bytes and convert to real- DIM PIXDATAR!(1 TO NROW*NCOL) FOR IPIX&=1 TO NROW*NCOL PIXDATAR!(IPIX&) = CVS(STRREVERSE$(PIXDATASTR(IPIX&))) NEXT IPIX& 'load pixel data into 2-D image array 'note- images in AIP4WinV2 start at (0,0) in upper left corner- DIM PIXVAL!(0 TO NCOL-1,0 TO NROW-1) 'row = J, col = I IROW = 0 ICOL = -1 FOR IPIX&=1 TO NROW*NCOL ICOL = ICOL + 1 IF ICOL > NCOL-1 THEN 'start new row IROW = IROW + 1 ICOL = 0 END IF PIXVAL!(ICOL,IROW) = PIXDATAR!(IPIX&)*BSCALE + BZERO NEXT IPIX& GOTO FinishedReading END IF 'end of 32-bit floating point image data input FinishedReading: '----------------- IMAGE PROCESSING ------------------ ' In this section you can put code for processing ' the image data. '------------------ WRITE FILE --------------------- 'data in output file will be written as 32-bit floating point. 'byte order will be re-reversed to big-endian for FITS. 'Change value of BITPIX in header, and change value of BZERO- MID$(C$,LOCBITPIX,32) = "BITPIX = -32 /" MID$(C$,LOCBZERO,32) = "BZERO = 0.00000000000E00 /" PRINT #2, "" PRINT #2, "OUTPUT FILE HEADER:" PRINT #2, C$ ' END 'determine how much padding is required at end of data to 'make up last 2880-byte block NUMBYTESNEEDED& = NCOL*NROW*4 RB = NUMBYTESNEEDED& /2880 EXTRABYTES& = 2880*(INT(RB)+1) - NUMBYTESNEEDED& PRINT #2, "" PRINT #2, "Number of NUL bytes added to end of data (padding) = "; EXTRABYTES& 'create long NUL string for last data block- D$ = NUL$(EXTRABYTES&) 'create long data array for image values- IVALUES& = 0 DIM DATAOUT!(1 TO NCOL*NROW) FOR JJJ=0 TO NROW-1 FOR III=0 TO NCOL-1 IVALUES& = IVALUES& + 1 DATAOUT!(IVALUES&) = PIXVAL!(III,JJJ) NEXT III NEXT JJJ 'convert real values to strings, reverse byte 'order in strings, and convert back to reals- FOR IVALUES&=1 TO NCOL*NROW DATAOUT!(IVALUES&) = CVS(STRREVERSE$(MKS$(DATAOUT!(IVALUES&)))) NEXT IVALUES& 'write (PUT) new FITS file- OPEN FILOUT$ FOR BINARY AS #8 PUT$ #8, C$ 'write header PUT #8, STARTBYTE&, DATAOUT!() 'write image data PUT$ #8, D$ 'write padding CLOSE #8 END END FUNCTION