773 lines
30 KiB
Fortran
773 lines
30 KiB
Fortran
program main
|
|
|
|
C This is the FITSIO cookbook program that contains an annotated listing of
|
|
C various computer programs that read and write files in FITS format
|
|
C using the FITSIO subroutine interface. These examples are
|
|
C working programs which users may adapt and modify for their own
|
|
C purposes. This Cookbook serves as a companion to the FITSIO User's
|
|
C Guide that provides more complete documentation on all the
|
|
C available FITSIO subroutines.
|
|
|
|
C Call each subroutine in turn:
|
|
|
|
call writeimage
|
|
call writeascii
|
|
call writebintable
|
|
call copyhdu
|
|
call selectrows
|
|
call readheader
|
|
call readimage
|
|
call readtable
|
|
print *
|
|
print *,"All the fitsio cookbook routines ran successfully."
|
|
|
|
end
|
|
C *************************************************************************
|
|
subroutine writeimage
|
|
|
|
C Create a FITS primary array containing a 2-D image
|
|
|
|
integer status,unit,blocksize,bitpix,naxis,naxes(2)
|
|
integer i,j,group,fpixel,nelements,array(300,200)
|
|
character filename*80
|
|
logical simple,extend
|
|
|
|
C The STATUS parameter must be initialized before using FITSIO. A
|
|
C positive value of STATUS is returned whenever a serious error occurs.
|
|
C FITSIO uses an `inherited status' convention, which means that if a
|
|
C subroutine is called with a positive input value of STATUS, then the
|
|
C subroutine will exit immediately, preserving the status value. For
|
|
C simplicity, this program only checks the status value at the end of
|
|
C the program, but it is usually better practice to check the status
|
|
C value more frequently.
|
|
|
|
status=0
|
|
|
|
C Name of the FITS file to be created:
|
|
filename='ATESTFILEZ.FITS'
|
|
|
|
C Delete the file if it already exists, so we can then recreate it.
|
|
C The deletefile subroutine is listed at the end of this file.
|
|
call deletefile(filename,status)
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
C This routine is not required; programmers can choose any unused
|
|
C unit number to open the file.
|
|
call ftgiou(unit,status)
|
|
|
|
C Create the new empty FITS file. The blocksize parameter is a
|
|
C historical artifact and the value is ignored by FITSIO.
|
|
blocksize=1
|
|
call ftinit(unit,filename,blocksize,status)
|
|
|
|
C Initialize parameters about the FITS image.
|
|
C BITPIX = 16 means that the image pixels will consist of 16-bit
|
|
C integers. The size of the image is given by the NAXES values.
|
|
C The EXTEND = TRUE parameter indicates that the FITS file
|
|
C may contain extensions following the primary array.
|
|
simple=.true.
|
|
bitpix=16
|
|
naxis=2
|
|
naxes(1)=300
|
|
naxes(2)=200
|
|
extend=.true.
|
|
|
|
C Write the required header keywords to the file
|
|
call ftphpr(unit,simple,bitpix,naxis,naxes,0,1,extend,status)
|
|
|
|
C Initialize the values in the image with a linear ramp function
|
|
do j=1,naxes(2)
|
|
do i=1,naxes(1)
|
|
array(i,j)=i - 1 +j - 1
|
|
end do
|
|
end do
|
|
|
|
C Write the array to the FITS file.
|
|
C The last letter of the subroutine name defines the datatype of the
|
|
C array argument; in this case the 'J' indicates that the array has an
|
|
C integer*4 datatype. ('I' = I*2, 'E' = Real*4, 'D' = Real*8).
|
|
C The 2D array is treated as a single 1-D array with NAXIS1 * NAXIS2
|
|
C total number of pixels. GROUP is seldom used parameter that should
|
|
C almost always be set = 1.
|
|
group=1
|
|
fpixel=1
|
|
nelements=naxes(1)*naxes(2)
|
|
call ftpprj(unit,group,fpixel,nelements,array,status)
|
|
|
|
C Write another optional keyword to the header
|
|
C The keyword record will look like this in the FITS file:
|
|
C
|
|
C EXPOSURE= 1500 / Total Exposure Time
|
|
C
|
|
call ftpkyj(unit,'EXPOSURE',1500,'Total Exposure Time',status)
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any errors, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine writeascii
|
|
|
|
C Create an ASCII table containing 3 columns and 6 rows. For convenience,
|
|
C the ASCII table extension is appended to the FITS image file created
|
|
C previously by the WRITEIMAGE subroutine.
|
|
|
|
integer status,unit,readwrite,blocksize,tfields,nrows,rowlen
|
|
integer nspace,tbcol(3),diameter(6), colnum,frow,felem
|
|
real density(6)
|
|
character filename*40,extname*16
|
|
character*16 ttype(3),tform(3),tunit(3),name(6)
|
|
data ttype/'Planet','Diameter','Density'/
|
|
data tform/'A8','I6','F4.2'/
|
|
data tunit/' ','km','g/cm'/
|
|
data name/'Mercury','Venus','Earth','Mars','Jupiter','Saturn'/
|
|
data diameter/4880,12112,12742,6800,143000,121000/
|
|
data density/5.1,5.3,5.52,3.94,1.33,0.69/
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Name of the FITS file to append the ASCII table to:
|
|
filename='ATESTFILEZ.FITS'
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
call ftgiou(unit,status)
|
|
|
|
C Open the FITS file with write access.
|
|
C (readwrite = 0 would open the file with readonly access).
|
|
readwrite=1
|
|
call ftopen(unit,filename,readwrite,blocksize,status)
|
|
|
|
C FTCRHD creates a new empty FITS extension following the current
|
|
C extension and moves to it. In this case, FITSIO was initially
|
|
C positioned on the primary array when the FITS file was first opened, so
|
|
C FTCRHD appends an empty extension and moves to it. All future FITSIO
|
|
C calls then operate on the new extension (which will be an ASCII
|
|
C table).
|
|
call ftcrhd(unit,status)
|
|
|
|
C define parameters for the ASCII table (see the above data statements)
|
|
tfields=3
|
|
nrows=6
|
|
extname='PLANETS_ASCII'
|
|
|
|
C FTGABC is a convenient subroutine for calculating the total width of
|
|
C the table and the starting position of each column in an ASCII table.
|
|
C Any number of blank spaces (including zero) may be inserted between
|
|
C each column of the table, as specified by the NSPACE parameter.
|
|
nspace=1
|
|
call ftgabc(tfields,tform,nspace,rowlen,tbcol,status)
|
|
|
|
C FTPHTB writes all the required header keywords which define the
|
|
C structure of the ASCII table. NROWS and TFIELDS give the number of
|
|
C rows and columns in the table, and the TTYPE, TBCOL, TFORM, and TUNIT
|
|
C arrays give the column name, starting position, format, and units,
|
|
C respectively of each column. The values of the ROWLEN and TBCOL parameters
|
|
C were previously calculated by the FTGABC routine.
|
|
call ftphtb(unit,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,
|
|
& extname,status)
|
|
|
|
C Write names to the first column, diameters to 2nd col., and density to 3rd
|
|
C FTPCLS writes the string values to the NAME column (column 1) of the
|
|
C table. The FTPCLJ and FTPCLE routines write the diameter (integer) and
|
|
C density (real) value to the 2nd and 3rd columns. The FITSIO routines
|
|
C are column oriented, so it is usually easier to read or write data in a
|
|
C table in a column by column order rather than row by row.
|
|
frow=1
|
|
felem=1
|
|
colnum=1
|
|
call ftpcls(unit,colnum,frow,felem,nrows,name,status)
|
|
colnum=2
|
|
call ftpclj(unit,colnum,frow,felem,nrows,diameter,status)
|
|
colnum=3
|
|
call ftpcle(unit,colnum,frow,felem,nrows,density,status)
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine writebintable
|
|
|
|
C This routine creates a FITS binary table, or BINTABLE, containing
|
|
C 3 columns and 6 rows. This routine is nearly identical to the
|
|
C previous WRITEASCII routine, except that the call to FTGABC is not
|
|
C needed, and FTPHBN is called rather than FTPHTB to write the
|
|
C required header keywords.
|
|
|
|
integer status,unit,readwrite,blocksize,hdutype,tfields,nrows
|
|
integer varidat,diameter(6), colnum,frow,felem
|
|
real density(6)
|
|
character filename*40,extname*16
|
|
character*16 ttype(3),tform(3),tunit(3),name(6)
|
|
data ttype/'Planet','Diameter','Density'/
|
|
data tform/'8A','1J','1E'/
|
|
data tunit/' ','km','g/cm'/
|
|
data name/'Mercury','Venus','Earth','Mars','Jupiter','Saturn'/
|
|
data diameter/4880,12112,12742,6800,143000,121000/
|
|
data density/5.1,5.3,5.52,3.94,1.33,0.69/
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Name of the FITS file to append the ASCII table to:
|
|
filename='ATESTFILEZ.FITS'
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
call ftgiou(unit,status)
|
|
|
|
C Open the FITS file, with write access.
|
|
readwrite=1
|
|
call ftopen(unit,filename,readwrite,blocksize,status)
|
|
|
|
C Move to the last (2nd) HDU in the file (the ASCII table).
|
|
call ftmahd(unit,2,hdutype,status)
|
|
|
|
C Append/create a new empty HDU onto the end of the file and move to it.
|
|
call ftcrhd(unit,status)
|
|
|
|
C Define parameters for the binary table (see the above data statements)
|
|
tfields=3
|
|
nrows=6
|
|
extname='PLANETS_BINARY'
|
|
varidat=0
|
|
|
|
C FTPHBN writes all the required header keywords which define the
|
|
C structure of the binary table. NROWS and TFIELDS gives the number of
|
|
C rows and columns in the table, and the TTYPE, TFORM, and TUNIT arrays
|
|
C give the column name, format, and units, respectively of each column.
|
|
call ftphbn(unit,nrows,tfields,ttype,tform,tunit,
|
|
& extname,varidat,status)
|
|
|
|
C Write names to the first column, diameters to 2nd col., and density to 3rd
|
|
C FTPCLS writes the string values to the NAME column (column 1) of the
|
|
C table. The FTPCLJ and FTPCLE routines write the diameter (integer) and
|
|
C density (real) value to the 2nd and 3rd columns. The FITSIO routines
|
|
C are column oriented, so it is usually easier to read or write data in a
|
|
C table in a column by column order rather than row by row. Note that
|
|
C the identical subroutine calls are used to write to either ASCII or
|
|
C binary FITS tables.
|
|
frow=1
|
|
felem=1
|
|
colnum=1
|
|
call ftpcls(unit,colnum,frow,felem,nrows,name,status)
|
|
colnum=2
|
|
call ftpclj(unit,colnum,frow,felem,nrows,diameter,status)
|
|
colnum=3
|
|
call ftpcle(unit,colnum,frow,felem,nrows,density,status)
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine copyhdu
|
|
|
|
C Copy the 1st and 3rd HDUs from the input file to a new FITS file
|
|
|
|
integer status,inunit,outunit,readwrite,blocksize,morekeys,hdutype
|
|
character infilename*40,outfilename*40
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Name of the FITS files:
|
|
infilename='ATESTFILEZ.FITS'
|
|
outfilename='BTESTFILEZ.FITS'
|
|
|
|
C Delete the file if it already exists, so we can then recreate it
|
|
C The deletefile subroutine is listed at the end of this file.
|
|
call deletefile(outfilename,status)
|
|
|
|
C Get unused Logical Unit Numbers to use to open the FITS files.
|
|
call ftgiou(inunit,status)
|
|
call ftgiou(outunit,status)
|
|
|
|
C Open the input FITS file, with readonly access
|
|
readwrite=0
|
|
call ftopen(inunit,infilename,readwrite,blocksize,status)
|
|
|
|
C Create the new empty FITS file (value of blocksize is ignored)
|
|
blocksize=1
|
|
call ftinit(outunit,outfilename,blocksize,status)
|
|
|
|
C FTCOPY copies the current HDU from the input FITS file to the output
|
|
C file. The MOREKEY parameter allows one to reserve space for additional
|
|
C header keywords when the HDU is created. FITSIO will automatically
|
|
C insert more header space if required, so programmers do not have to
|
|
C reserve space ahead of time, although it is more efficient to do so if
|
|
C it is known that more keywords will be appended to the header.
|
|
morekeys=0
|
|
call ftcopy(inunit,outunit,morekeys,status)
|
|
|
|
C Append/create a new empty extension on the end of the output file
|
|
call ftcrhd(outunit,status)
|
|
|
|
C Skip to the 3rd extension in the input file which in this case
|
|
C is the binary table created by the previous WRITEBINARY routine.
|
|
call ftmahd(inunit,3,hdutype,status)
|
|
|
|
C FTCOPY now copies the binary table from the input FITS file
|
|
C to the output file.
|
|
call ftcopy(inunit,outunit,morekeys,status)
|
|
|
|
C The FITS files must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
C Giving -1 for the value of the first argument causes all previously
|
|
C allocated unit numbers to be released.
|
|
|
|
call ftclos(inunit, status)
|
|
call ftclos(outunit, status)
|
|
call ftfiou(-1, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine selectrows
|
|
|
|
C This routine copies selected rows from an input table into a new output
|
|
C FITS table. In this example all the rows in the input table that have
|
|
C a value of the DENSITY column less that 3.0 are copied to the output
|
|
C table. This program illustrates several generally useful techniques,
|
|
C including:
|
|
C how to locate the end of a FITS file
|
|
C how to create a table when the total number of rows in the table
|
|
C is not known until the table is completed
|
|
C how to efficiently copy entire rows from one table to another.
|
|
|
|
integer status,inunit,outunit,readwrite,blocksize,hdutype
|
|
integer nkeys,nspace,naxes(2),nfound,colnum,frow,felem
|
|
integer noutrows,irow,temp(100),i
|
|
real nullval,density(6)
|
|
character infilename*40,outfilename*40,record*80
|
|
logical exact,anynulls
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Names of the FITS files:
|
|
infilename='ATESTFILEZ.FITS'
|
|
outfilename='BTESTFILEZ.FITS'
|
|
|
|
C Get unused Logical Unit Numbers to use to open the FITS files.
|
|
call ftgiou(inunit,status)
|
|
call ftgiou(outunit,status)
|
|
|
|
C The input FITS file is opened with READONLY access, and the output
|
|
C FITS file is opened with WRITE access.
|
|
readwrite=0
|
|
call ftopen(inunit,infilename,readwrite,blocksize,status)
|
|
readwrite=1
|
|
call ftopen(outunit,outfilename,readwrite,blocksize,status)
|
|
|
|
C move to the 3rd HDU in the input file (a binary table in this case)
|
|
call ftmahd(inunit,3,hdutype,status)
|
|
|
|
C This do-loop illustrates how to move to the last extension in any FITS
|
|
C file. The call to FTMRHD moves one extension at a time through the
|
|
C FITS file until an `End-of-file' status value (= 107) is returned.
|
|
do while (status .eq. 0)
|
|
call ftmrhd(outunit,1,hdutype,status)
|
|
end do
|
|
|
|
C After locating the end of the FITS file, it is necessary to reset the
|
|
C status value to zero and also clear the internal error message stack
|
|
C in FITSIO. The previous `End-of-file' error will have produced
|
|
C an unimportant message on the error stack which can be cleared with
|
|
C the call to the FTCMSG routine (which has no arguments).
|
|
|
|
if (status .eq. 107)then
|
|
status=0
|
|
call ftcmsg
|
|
end if
|
|
|
|
C Create a new empty extension in the output file.
|
|
call ftcrhd(outunit,status)
|
|
|
|
C Find the number of keywords in the input table header.
|
|
call ftghsp(inunit,nkeys,nspace,status)
|
|
|
|
C This do-loop of calls to FTGREC and FTPREC copies all the keywords from
|
|
C the input to the output FITS file. Notice that the specified number
|
|
C of rows in the output table, as given by the NAXIS2 keyword, will be
|
|
C incorrect. This value will be modified later after it is known how many
|
|
C rows will be in the table, so it does not matter how many rows are specified
|
|
C initially.
|
|
do i=1,nkeys
|
|
call ftgrec(inunit,i,record,status)
|
|
call ftprec(outunit,record,status)
|
|
end do
|
|
|
|
C FTGKNJ is used to get the value of the NAXIS1 and NAXIS2 keywords,
|
|
C which define the width of the table in bytes, and the number of
|
|
C rows in the table.
|
|
call ftgknj(inunit,'NAXIS',1,2,naxes,nfound,status)
|
|
|
|
C FTGCNO gets the column number of the `DENSITY' column; the column
|
|
C number is needed when reading the data in the column. The EXACT
|
|
C parameter determines whether or not the match to the column names
|
|
C will be case sensitive.
|
|
exact=.false.
|
|
call ftgcno(inunit,exact,'DENSITY',colnum,status)
|
|
|
|
C FTGCVE reads all 6 rows of data in the `DENSITY' column. The number
|
|
C of rows in the table is given by NAXES(2). Any null values in the
|
|
C table will be returned with the corresponding value set to -99
|
|
C (= the value of NULLVAL). The ANYNULLS parameter will be set to TRUE
|
|
C if any null values were found while reading the data values in the table.
|
|
frow=1
|
|
felem=1
|
|
nullval=-99.
|
|
call ftgcve(inunit,colnum,frow,felem,naxes(2),nullval,
|
|
& density,anynulls,status)
|
|
|
|
C If the density is less than 3.0, copy the row to the output table.
|
|
C FTGTBB and FTPTBB are low-level routines to read and write, respectively,
|
|
C a specified number of bytes in the table, starting at the specified
|
|
C row number and beginning byte within the row. These routines do
|
|
C not do any interpretation of the bytes, and simply pass them to or
|
|
C from the FITS file without any modification. This is a faster
|
|
C way of transferring large chunks of data from one FITS file to another,
|
|
C than reading and then writing each column of data individually.
|
|
C In this case an entire row of bytes (the row length is specified
|
|
C by the naxes(1) parameter) is transferred. The datatype of the
|
|
C buffer array (TEMP in this case) is immaterial so long as it is
|
|
C declared large enough to hold the required number of bytes.
|
|
noutrows=0
|
|
do irow=1,naxes(2)
|
|
if (density(irow) .lt. 3.0)then
|
|
noutrows=noutrows+1
|
|
call ftgtbb(inunit,irow,1,naxes(1),temp,status)
|
|
call ftptbb(outunit,noutrows,1,naxes(1),temp,status)
|
|
end if
|
|
end do
|
|
|
|
C Update the NAXIS2 keyword with the correct no. of rows in the output file.
|
|
C After all the rows have been written to the output table, the
|
|
C FTMKYJ routine is used to overwrite the NAXIS2 keyword value with
|
|
C the correct number of rows. Specifying `\&' for the comment string
|
|
C tells FITSIO to keep the current comment string in the keyword and
|
|
C only modify the value. Because the total number of rows in the table
|
|
C was unknown when the table was first created, any value (including 0)
|
|
C could have been used for the initial NAXIS2 keyword value.
|
|
call ftmkyj(outunit,'NAXIS2',noutrows,'&',status)
|
|
|
|
C The FITS files must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(inunit, status)
|
|
call ftclos(outunit, status)
|
|
call ftfiou(-1, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine readheader
|
|
|
|
C Print out all the header keywords in all extensions of a FITS file
|
|
|
|
integer status,unit,readwrite,blocksize,nkeys,nspace,hdutype,i,j
|
|
character filename*80,record*80
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
call ftgiou(unit,status)
|
|
|
|
C name of FITS file
|
|
filename='ATESTFILEZ.FITS'
|
|
|
|
C open the FITS file, with read-only access. The returned BLOCKSIZE
|
|
C parameter is obsolete and should be ignored.
|
|
readwrite=0
|
|
call ftopen(unit,filename,readwrite,blocksize,status)
|
|
|
|
j = 0
|
|
100 continue
|
|
j = j + 1
|
|
|
|
print *,'Header listing for HDU', j
|
|
|
|
C The FTGHSP subroutine returns the number of existing keywords in the
|
|
C current header data unit (CHDU), not counting the required END keyword,
|
|
call ftghsp(unit,nkeys,nspace,status)
|
|
|
|
C Read each 80-character keyword record, and print it out.
|
|
do i = 1, nkeys
|
|
call ftgrec(unit,i,record,status)
|
|
print *,record
|
|
end do
|
|
|
|
C Print out an END record, and a blank line to mark the end of the header.
|
|
if (status .eq. 0)then
|
|
print *,'END'
|
|
print *,' '
|
|
end if
|
|
|
|
C Try moving to the next extension in the FITS file, if it exists.
|
|
C The FTMRHD subroutine attempts to move to the next HDU, as specified by
|
|
C the second parameter. This subroutine moves by a relative number of
|
|
C HDUs from the current HDU. The related FTMAHD routine may be used to
|
|
C move to an absolute HDU number in the FITS file. If the end-of-file is
|
|
C encountered when trying to move to the specified extension, then a
|
|
C status = 107 is returned.
|
|
call ftmrhd(unit,1,hdutype,status)
|
|
|
|
if (status .eq. 0)then
|
|
C success, so jump back and print out keywords in this extension
|
|
go to 100
|
|
|
|
else if (status .eq. 107)then
|
|
C hit end of file, so quit
|
|
status=0
|
|
end if
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine readimage
|
|
|
|
C Read a FITS image and determine the minimum and maximum pixel value.
|
|
C Rather than reading the entire image in
|
|
C at once (which could require a very large array), the image is read
|
|
C in pieces, 100 pixels at a time.
|
|
|
|
integer status,unit,readwrite,blocksize,naxes(2),nfound
|
|
integer group,firstpix,nbuffer,npixels,i
|
|
real datamin,datamax,nullval,buffer(100)
|
|
logical anynull
|
|
character filename*80
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
call ftgiou(unit,status)
|
|
|
|
C Open the FITS file previously created by WRITEIMAGE
|
|
filename='ATESTFILEZ.FITS'
|
|
readwrite=0
|
|
call ftopen(unit,filename,readwrite,blocksize,status)
|
|
|
|
C Determine the size of the image.
|
|
call ftgknj(unit,'NAXIS',1,2,naxes,nfound,status)
|
|
|
|
C Check that it found both NAXIS1 and NAXIS2 keywords.
|
|
if (nfound .ne. 2)then
|
|
print *,'READIMAGE failed to read the NAXISn keywords.'
|
|
return
|
|
end if
|
|
|
|
C Initialize variables
|
|
npixels=naxes(1)*naxes(2)
|
|
group=1
|
|
firstpix=1
|
|
nullval=-999
|
|
datamin=1.0E30
|
|
datamax=-1.0E30
|
|
|
|
do while (npixels .gt. 0)
|
|
C read up to 100 pixels at a time
|
|
nbuffer=min(100,npixels)
|
|
|
|
call ftgpve(unit,group,firstpix,nbuffer,nullval,
|
|
& buffer,anynull,status)
|
|
|
|
C find the min and max values
|
|
do i=1,nbuffer
|
|
datamin=min(datamin,buffer(i))
|
|
datamax=max(datamax,buffer(i))
|
|
end do
|
|
|
|
C increment pointers and loop back to read the next group of pixels
|
|
npixels=npixels-nbuffer
|
|
firstpix=firstpix+nbuffer
|
|
end do
|
|
|
|
print *
|
|
print *,'Min and max image pixels = ',datamin,datamax
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine readtable
|
|
|
|
C Read and print data values from an ASCII or binary table
|
|
C This example reads and prints out all the data in the ASCII and
|
|
C the binary tables that were previously created by WRITEASCII and
|
|
C WRITEBINTABLE. Note that the exact same FITSIO routines are
|
|
C used to read both types of tables.
|
|
|
|
integer status,unit,readwrite,blocksize,hdutype,ntable
|
|
integer felem,nelems,nullj,diameter,nfound,irow,colnum
|
|
real nulle,density
|
|
character filename*40,nullstr*1,name*8,ttype(3)*10
|
|
logical anynull
|
|
|
|
C The STATUS parameter must always be initialized.
|
|
status=0
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file.
|
|
call ftgiou(unit,status)
|
|
|
|
C Open the FITS file previously created by WRITEIMAGE
|
|
filename='ATESTFILEZ.FITS'
|
|
readwrite=0
|
|
call ftopen(unit,filename,readwrite,blocksize,status)
|
|
|
|
C Loop twice, first reading the ASCII table, then the binary table
|
|
do ntable=2,3
|
|
|
|
C Move to the next extension
|
|
call ftmahd(unit,ntable,hdutype,status)
|
|
|
|
print *,' '
|
|
if (hdutype .eq. 1)then
|
|
print *,'Reading ASCII table in HDU ',ntable
|
|
else if (hdutype .eq. 2)then
|
|
print *,'Reading binary table in HDU ',ntable
|
|
end if
|
|
|
|
C Read the TTYPEn keywords, which give the names of the columns
|
|
call ftgkns(unit,'TTYPE',1,3,ttype,nfound,status)
|
|
write(*,2000)ttype
|
|
2000 format(2x,"Row ",3a10)
|
|
|
|
C Read the data, one row at a time, and print them out
|
|
felem=1
|
|
nelems=1
|
|
nullstr=' '
|
|
nullj=0
|
|
nulle=0.
|
|
do irow=1,6
|
|
C FTGCVS reads the NAMES from the first column of the table.
|
|
colnum=1
|
|
call ftgcvs(unit,colnum,irow,felem,nelems,nullstr,name,
|
|
& anynull,status)
|
|
|
|
C FTGCVJ reads the DIAMETER values from the second column.
|
|
colnum=2
|
|
call ftgcvj(unit,colnum,irow,felem,nelems,nullj,diameter,
|
|
& anynull,status)
|
|
|
|
C FTGCVE reads the DENSITY values from the third column.
|
|
colnum=3
|
|
call ftgcve(unit,colnum,irow,felem,nelems,nulle,density,
|
|
& anynull,status)
|
|
write(*,2001)irow,name,diameter,density
|
|
2001 format(i5,a10,i10,f10.2)
|
|
end do
|
|
end do
|
|
|
|
C The FITS file must always be closed before exiting the program.
|
|
C Any unit numbers allocated with FTGIOU must be freed with FTFIOU.
|
|
call ftclos(unit, status)
|
|
call ftfiou(unit, status)
|
|
|
|
C Check for any error, and if so print out error messages.
|
|
C The PRINTERROR subroutine is listed near the end of this file.
|
|
if (status .gt. 0)call printerror(status)
|
|
end
|
|
C *************************************************************************
|
|
subroutine printerror(status)
|
|
|
|
C This subroutine prints out the descriptive text corresponding to the
|
|
C error status value and prints out the contents of the internal
|
|
C error message stack generated by FITSIO whenever an error occurs.
|
|
|
|
integer status
|
|
character errtext*30,errmessage*80
|
|
|
|
C Check if status is OK (no error); if so, simply return
|
|
if (status .le. 0)return
|
|
|
|
C The FTGERR subroutine returns a descriptive 30-character text string that
|
|
C corresponds to the integer error status number. A complete list of all
|
|
C the error numbers can be found in the back of the FITSIO User's Guide.
|
|
call ftgerr(status,errtext)
|
|
print *,'FITSIO Error Status =',status,': ',errtext
|
|
|
|
C FITSIO usually generates an internal stack of error messages whenever
|
|
C an error occurs. These messages provide much more information on the
|
|
C cause of the problem than can be provided by the single integer error
|
|
C status value. The FTGMSG subroutine retrieves the oldest message from
|
|
C the stack and shifts any remaining messages on the stack down one
|
|
C position. FTGMSG is called repeatedly until a blank message is
|
|
C returned, which indicates that the stack is empty. Each error message
|
|
C may be up to 80 characters in length. Another subroutine, called
|
|
C FTCMSG, is available to simply clear the whole error message stack in
|
|
C cases where one is not interested in the contents.
|
|
call ftgmsg(errmessage)
|
|
do while (errmessage .ne. ' ')
|
|
print *,errmessage
|
|
call ftgmsg(errmessage)
|
|
end do
|
|
end
|
|
C *************************************************************************
|
|
subroutine deletefile(filename,status)
|
|
|
|
C A simple little routine to delete a FITS file
|
|
|
|
integer status,unit,blocksize
|
|
character*(*) filename
|
|
|
|
C Simply return if status is greater than zero
|
|
if (status .gt. 0)return
|
|
|
|
C Get an unused Logical Unit Number to use to open the FITS file
|
|
call ftgiou(unit,status)
|
|
|
|
C Try to open the file, to see if it exists
|
|
call ftopen(unit,filename,1,blocksize,status)
|
|
|
|
if (status .eq. 0)then
|
|
C file was opened; so now delete it
|
|
call ftdelt(unit,status)
|
|
else if (status .eq. 103)then
|
|
C file doesn't exist, so just reset status to zero and clear errors
|
|
status=0
|
|
call ftcmsg
|
|
else
|
|
C there was some other error opening the file; delete the file anyway
|
|
status=0
|
|
call ftcmsg
|
|
call ftdelt(unit,status)
|
|
end if
|
|
|
|
C Free the unit number for later reuse
|
|
call ftfiou(unit, status)
|
|
end
|