diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/tbtables/cfitsio/testf77.f | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/tbtables/cfitsio/testf77.f')
-rw-r--r-- | pkg/tbtables/cfitsio/testf77.f | 2488 |
1 files changed, 2488 insertions, 0 deletions
diff --git a/pkg/tbtables/cfitsio/testf77.f b/pkg/tbtables/cfitsio/testf77.f new file mode 100644 index 00000000..ac3bc217 --- /dev/null +++ b/pkg/tbtables/cfitsio/testf77.f @@ -0,0 +1,2488 @@ +C This is a big and complicated program that tests most of +C the fitsio routines. This code does not represent +C the most efficient method of reading or writing FITS files +C because this code is primarily designed to stress the fitsio +C library routines. + + character asciisum*17 + character*3 cval + character*1 xinarray(21), binarray(21), boutarray(21), bnul + character colname*70, tdisp*40, nulstr*40 + character oskey*15 + character iskey*21 + character lstr*200 + character comm*73 + character*30 inskey(21) + character*30 onskey(3) + character filename*40, card*78, card2*78 + character keyword*8 + character value*68, comment*72 + character uchars*78 + character*15 ttype(10), tform(10), tunit(10) + character*15 tblname + character*15 binname + character errmsg*75 + character*8 inclist(2),exclist(2) + character*8 xctype,yctype,ctype + character*18 kunit + + logical simple,extend,larray(42), larray2(42) + logical olkey, ilkey, onlkey(3), inlkey(3), anynull + + integer*2 imgarray(19,30), imgarray2(10,20) + integer*2 iinarray(21), ioutarray(21), inul + + integer naxes(3), pcount, gcount, npixels, nrows, rowlen + integer existkeys, morekeys, keynum + integer datastatus, hdustatus + integer status, bitpix, naxis, block + integer ii, jj, jjj, hdutype, hdunum, tfields + integer nkeys, nfound, colnum, typecode, signval,nmsg + integer repeat, offset, width, jnulval + integer kinarray(21), koutarray(21), knul + integer jinarray(21), joutarray(21), jnul + integer ojkey, ijkey, otint + integer onjkey(3), injkey(3) + integer tbcol(5) + integer iunit, tmpunit + integer fpixels(2), lpixels(2), inc(2) + + real estatus, vers + real einarray(21), eoutarray(21), enul, cinarray(42) + real ofkey, oekey, iekey, onfkey(3),onekey(3), inekey(3) + + double precision dinarray(21),doutarray(21),dnul, minarray(42) + double precision scale, zero + double precision ogkey, odkey, idkey, otfrac, ongkey(3) + double precision ondkey(3), indkey(3) + double precision checksum, datsum + double precision xrval,yrval,xrpix,yrpix,xinc,yinc,rot + double precision xpos,ypos,xpix,ypix + + tblname = 'Test-ASCII' + binname = 'Test-BINTABLE' + onskey(1) = 'first string' + onskey(2) = 'second string' + onskey(3) = ' ' + oskey = 'value_string' + inclist(1)='key*' + inclist(2)='newikys' + exclist(1)='key_pr*' + exclist(2)='key_pkls' + xctype='RA---TAN' + yctype='DEC--TAN' + + olkey = .true. + ojkey = 11 + otint = 12345678 + ofkey = 12.121212 + oekey = 13.131313 + ogkey = 14.1414141414141414D+00 + odkey = 15.1515151515151515D+00 + otfrac = .1234567890123456D+00 + onlkey(1) = .true. + onlkey(2) = .false. + onlkey(3) = .true. + onjkey(1) = 11 + onjkey(2) = 12 + onjkey(3) = 13 + onfkey(1) = 12.121212 + onfkey(2) = 13.131313 + onfkey(3) = 14.141414 + onekey(1) = 13.131313 + onekey(2) = 14.141414 + onekey(3) = 15.151515 + ongkey(1) = 14.1414141414141414D+00 + ongkey(2) = 15.1515151515151515D+00 + ongkey(3) = 16.1616161616161616D+00 + ondkey(1) = 15.1515151515151515D+00 + ondkey(2) = 16.1616161616161616D+00 + ondkey(3) = 17.1717171717171717D+00 + + tbcol(1) = 1 + tbcol(2) = 17 + tbcol(3) = 28 + tbcol(4) = 43 + tbcol(5) = 56 + status = 0 + + call ftvers(vers) + write(*,'(1x,A,F7.3)') 'FITSIO TESTPROG, v', vers + write(*, '(1x,A)')' ' + + iunit = 15 + tmpunit = 16 + + write(*,'(1x,A)') 'Try opening then closing a nonexistent file: ' + call ftopen(iunit, 'tq123x.kjl', 1, block, status) + write(*,'(1x,A,2i4)')' ftopen iunit, status (expect an error) =' + & ,iunit, status + call ftclos(iunit, status) + write(*,'(1x,A,i4)')' ftclos status = ', status + write(*,'(1x,A)')' ' + + call ftcmsg + status = 0 + + filename = 'testf77.fit' + +C delete previous version of the file, if it exists + + call ftopen(iunit, filename, 1, block, status) + if (status .eq. 0)then + call ftdelt(iunit, status) + else +C clear the error message stack + call ftcmsg + end if + + status = 0 + +C +C ##################### +C # create FITS file # +C ##################### + + + call ftinit(iunit, filename, 1, status) + write(*,'(1x,A,i4)')'ftinit create new file status = ', status + write(*,'(1x,A)')' ' + + if (status .ne. 0)go to 999 + + simple = .true. + bitpix = 32 + naxis = 2 + naxes(1) = 10 + naxes(2) = 2 + npixels = 20 + pcount = 0 + gcount = 1 + extend = .true. + +C ############################ +C # write single keywords # +C ############################ + + call ftphpr(iunit,simple, bitpix, naxis, naxes, + & 0,1,extend,status) + + call ftprec(iunit, + &'key_prec= ''This keyword was written by fxprec'' / '// + & 'comment goes here', status) + + write(*,'(1x,A)') 'test writing of long string keywords: ' + card = '1234567890123456789012345678901234567890'// + & '12345678901234567890123456789012345' + call ftpkys(iunit, 'card1', card, ' ', status) + call ftgkey(iunit, 'card1', card2, comment, status) + + write(*,'(1x,A)') card + write(*,'(1x,A)') card2 + + card = '1234567890123456789012345678901234567890'// + & '123456789012345678901234''6789012345' + call ftpkys(iunit, 'card2', card, ' ', status) + call ftgkey(iunit, 'card2', card2, comment, status) + write(*,'(1x,A)') card + write(*,'(1x,A)') card2 + + card = '1234567890123456789012345678901234567890'// + & '123456789012345678901234''''789012345' + call ftpkys(iunit, 'card3', card, ' ', status) + call ftgkey(iunit, 'card3', card2, comment, status) + write(*,'(1x,A)') card + write(*,'(1x,A)') card2 + + card = '1234567890123456789012345678901234567890'// + & '123456789012345678901234567''9012345' + call ftpkys(iunit, 'card4', card, ' ', status) + call ftgkey(iunit, 'card4', card2, comment, status) + write(*,'(1x,A)') card + write(*,'(1x,A)') card2 + + call ftpkys(iunit, 'key_pkys', oskey, 'fxpkys comment', status) + call ftpkyl(iunit, 'key_pkyl', olkey, 'fxpkyl comment', status) + call ftpkyj(iunit, 'key_pkyj', ojkey, 'fxpkyj comment', status) + call ftpkyf(iunit,'key_pkyf',ofkey,5, 'fxpkyf comment', status) + call ftpkye(iunit,'key_pkye',oekey,6, 'fxpkye comment', status) + call ftpkyg(iunit,'key_pkyg',ogkey,14, 'fxpkyg comment',status) + call ftpkyd(iunit,'key_pkyd',odkey,14, 'fxpkyd comment',status) + + lstr='This is a very long string '// + & 'value that is continued over more than one keyword.' + + call ftpkls(iunit,'key_pkls',lstr,'fxpkls comment',status) + + call ftplsw(iunit, status) + call ftpkyt(iunit,'key_pkyt',otint,otfrac,'fxpkyt comment', + & status) + call ftpcom(iunit, 'This keyword was written by fxpcom.', + & status) + call ftphis(iunit, + &' This keyword written by fxphis (w/ 2 leading spaces).', + & status) + + call ftpdat(iunit, status) + + if (status .gt. 0)go to 999 + +C +C ############################### +C # write arrays of keywords # +C ############################### + + nkeys = 3 + + comm = 'fxpkns comment&' + call ftpkns(iunit, 'ky_pkns', 1, nkeys, onskey, comm, status) + comm = 'fxpknl comment&' + call ftpknl(iunit, 'ky_pknl', 1, nkeys, onlkey, comm, status) + + comm = 'fxpknj comment&' + call ftpknj(iunit, 'ky_pknj', 1, nkeys, onjkey, comm, status) + + comm = 'fxpknf comment&' + call ftpknf(iunit, 'ky_pknf', 1, nkeys, onfkey,5,comm,status) + + comm = 'fxpkne comment&' + call ftpkne(iunit, 'ky_pkne', 1, nkeys, onekey,6,comm,status) + + comm = 'fxpkng comment&' + call ftpkng(iunit, 'ky_pkng', 1, nkeys, ongkey,13,comm,status) + + comm = 'fxpknd comment&' + call ftpknd(iunit, 'ky_pknd', 1, nkeys, ondkey,14,comm,status) + + if (status .gt. 0)go to 999 + +C ############################ +C # write generic keywords # +C ############################ + + + oskey = '1' + call ftpkys(iunit, 'tstring', oskey, 'tstring comment',status) + + olkey = .true. + call ftpkyl(iunit, 'tlogical', olkey, 'tlogical comment', + & status) + + ojkey = 11 + call ftpkyj(iunit, 'tbyte', ojkey, 'tbyte comment', status) + + ojkey = 21 + call ftpkyj(iunit, 'tshort', ojkey, 'tshort comment', status) + + ojkey = 31 + call ftpkyj(iunit, 'tint', ojkey, 'tint comment', status) + + ojkey = 41 + call ftpkyj(iunit, 'tlong', ojkey, 'tlong comment', status) + + oekey = 42 + call ftpkye(iunit, 'tfloat', oekey, 6,'tfloat comment', status) + + odkey = 82.D+00 + call ftpkyd(iunit, 'tdouble', odkey, 14, 'tdouble comment', + & status) + + if (status .gt. 0)go to 999 + write(*,'(1x,A)') 'Wrote all Keywords successfully ' + + +C ############################ +C # write data # +C ############################ + + +C define the null value (must do this before writing any data) + call ftpkyj(iunit,'BLANK',-99, + & 'value to use for undefined pixels', status) + +C initialize arrays of values to write to primary array + do ii = 1, npixels + boutarray(ii) = char(ii) + ioutarray(ii) = ii + joutarray(ii) = ii + eoutarray(ii) = ii + doutarray(ii) = ii + end do + +C write a few pixels with each datatype +C set the last value in each group of 4 as undefined + call ftpprb(iunit, 1, 1, 2, boutarray(1), status) + call ftppri(iunit, 1, 5, 2, ioutarray(5), status) + call ftpprj(iunit, 1, 9, 2, joutarray(9), status) + call ftppre(iunit, 1, 13, 2, eoutarray(13), status) + call ftpprd(iunit, 1, 17, 2, doutarray(17), status) + bnul = char(4) + call ftppnb(iunit, 1, 3, 2, boutarray(3), bnul, status) + inul = 8 + call ftppni(iunit, 1, 7, 2, ioutarray(7), inul, status) + call ftppnj(iunit, 1, 11, 2, joutarray(11), 12, status) + call ftppne(iunit, 1, 15, 2, eoutarray(15), 16., status) + dnul = 20. + call ftppnd(iunit, 1, 19, 2, doutarray(19), dnul, status) + call ftppru(iunit, 1, 1, 1, status) + + if (status .gt. 0)then + write(*,'(1x,A,I4)')'ftppnx status = ', status + goto 999 + end if + + call ftflus(iunit, status) +C flush all data to the disk file + write(*,'(1x,A,I4)')'ftflus status = ', status + write(*,'(1x,A)')' ' + + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)')'HDU number = ', hdunum + +C ############################ +C # read data # +C ############################ + + +C read back the data, setting null values = 99 + write(*,'(1x,A)') + & 'Values read back from primary array (99 = null pixel)' + write(*,'(1x,A)') + & 'The 1st, and every 4th pixel should be undefined: ' + + anynull = .false. + bnul = char(99) + call ftgpvb(iunit, 1, 1, 10, bnul, binarray, anynull, status) + call ftgpvb(iunit, 1, 11, 10, bnul, binarray(11),anynull,status) + + do ii = 1,npixels + iinarray(ii) = ichar(binarray(ii)) + end do + + write(*,1101) (iinarray(ii), ii = 1, npixels), anynull, + & ' (ftgpvb) ' +1101 format(1x,20i3,l3,a) + + inul = 99 + call ftgpvi(iunit, 1, 1, npixels, inul, iinarray,anynull,status) + + write(*,1101) (iinarray(ii), ii = 1, npixels), anynull, + & ' (ftgpvi) ' + + call ftgpvj(iunit, 1, 1, npixels, 99, jinarray,anynull,status) + + write(*,1101) (jinarray(ii), ii = 1, npixels), anynull, + & ' (ftgpvj) ' + + call ftgpve(iunit, 1, 1, npixels, 99., einarray,anynull,status) + + write(*,1102) (einarray(ii), ii = 1, npixels), anynull, + & ' (ftgpve) ' + +1102 format(2x,20f3.0,l2,a) + + dnul = 99. + call ftgpvd(iunit, 1, 1, 10, dnul, dinarray, anynull, status) + call ftgpvd(iunit, 1, 11, 10, dnul,dinarray(11),anynull,status) + + write(*,1102) (dinarray(ii), ii = 1, npixels), anynull, + & ' (ftgpvd) ' + + if (status .gt. 0)then + write(*,'(1x,A,I4)')'ERROR: ftgpv_ status = ', status + goto 999 + end if + + if (.not. anynull)then + write(*,'(1x,A)') 'ERROR: ftgpv_ did not detect null values ' + go to 999 + end if + +C reset the output null value to the expected input value + + do ii = 4, npixels, 4 + boutarray(ii) = char(99) + ioutarray(ii) = 99 + joutarray(ii) = 99 + eoutarray(ii) = 99. + doutarray(ii) = 99. + end do + + ii = 1 + boutarray(ii) = char(99) + ioutarray(ii) = 99 + joutarray(ii) = 99 + eoutarray(ii) = 99. + doutarray(ii) = 99. + + +C compare the output with the input flag any differences + do ii = 1, npixels + + if (boutarray(ii) .ne. binarray(ii))then + write(*,'(1x,A,2A2)') 'bout != bin ', boutarray(ii), + & binarray(ii) + end if + + if (ioutarray(ii) .ne. iinarray(ii))then + write(*,'(1x,A,2I8)') 'bout != bin ', ioutarray(ii), + & iinarray(ii) + end if + + if (joutarray(ii) .ne. jinarray(ii))then + write(*,'(1x,A,2I12)') 'bout != bin ', joutarray(ii), + & jinarray(ii) + end if + + if (eoutarray(ii) .ne. einarray(ii))then + write(*,'(1x,A,2E15.3)') 'bout != bin ', eoutarray(ii), + & einarray(ii) + end if + + if (doutarray(ii) .ne. dinarray(ii))then + write(*,'(1x,A,2D20.6)') 'bout != bin ', doutarray(ii), + & dinarray(ii) + end if + end do + + do ii = 1, npixels + binarray(ii) = char(0) + iinarray(ii) = 0 + jinarray(ii) = 0 + einarray(ii) = 0. + dinarray(ii) = 0. + end do + + anynull = .false. + call ftgpfb(iunit, 1, 1, 10, binarray, larray, anynull,status) + call ftgpfb(iunit, 1, 11, 10, binarray(11), larray(11), + & anynull, status) + + do ii = 1, npixels + if (larray(ii))binarray(ii) = char(0) + end do + + do ii = 1,npixels + iinarray(ii) = ichar(binarray(ii)) + end do + + write(*,1101)(iinarray(ii),ii = 1,npixels),anynull,' (ftgpfb)' + + call ftgpfi(iunit, 1, 1, npixels, iinarray, larray, anynull, + & status) + + do ii = 1, npixels + if (larray(ii))iinarray(ii) = 0 + end do + + write(*,1101)(iinarray(ii),ii = 1,npixels),anynull,' (ftgpfi)' + + call ftgpfj(iunit, 1, 1, npixels, jinarray, larray, anynull, + & status) + + do ii = 1, npixels + if (larray(ii))jinarray(ii) = 0 + end do + + write(*,1101)(jinarray(ii),ii = 1,npixels),anynull,' (ftgpfj)' + + call ftgpfe(iunit, 1, 1, npixels, einarray, larray, anynull, + & status) + + do ii = 1, npixels + if (larray(ii))einarray(ii) = 0. + end do + + write(*,1102)(einarray(ii),ii = 1,npixels),anynull,' (ftgpfe)' + + call ftgpfd(iunit, 1, 1, 10, dinarray, larray, anynull,status) + call ftgpfd(iunit, 1, 11, 10, dinarray(11), larray(11), + & anynull, status) + + do ii = 1, npixels + if (larray(ii))dinarray(ii) = 0. + end do + + write(*,1102)(dinarray(ii),ii = 1,npixels),anynull,' (ftgpfd)' + + if (status .gt. 0)then + write(*,'(1x,A,I4)')'ERROR: ftgpf_ status = ', status + go to 999 + end if + + if (.not. anynull)then + write(*,'(1x,A)') 'ERROR: ftgpf_ did not detect null values' + go to 999 + end if + + +C ########################################## +C # close and reopen file multiple times # +C ########################################## + + + do ii = 1, 10 + call ftclos(iunit, status) + + if (status .gt. 0)then + write(*,'(1x,A,I4)')'ERROR in ftclos (1) = ', status + go to 999 + end if + + call ftopen(iunit, filename, 1, block, status) + + if (status .gt. 0)then + write(*,'(1x,A,I4)')'ERROR: ftopen open file status = ', + & status + go to 999 + end if + end do + + write(*,'(1x,A)') ' ' + write(*,'(1x,A)') 'Closed then reopened the FITS file 10 times.' + write(*,'(1x,A)')' ' + + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)')'HDU number = ', hdunum + + +C ############################ +C # read single keywords # +C ############################ + + + simple = .false. + bitpix = 0 + naxis = 0 + naxes(1) = 0 + naxes(2) = 0 + pcount = -99 + gcount = -99 + extend = .false. + write(*,'(1x,A)') 'Read back keywords: ' + call ftghpr(iunit, 3, simple, bitpix, naxis, naxes, pcount, + & gcount, extend, status) + write(*,'(1x,A,L4,4I4)')'simple, bitpix, naxis, naxes = ', + & simple, bitpix, naxis, naxes(1), naxes(2) + write(*,'(1x,A,2I4,L4)')' pcount, gcount, extend = ', + & pcount, gcount, extend + + call ftgrec(iunit, 9, card, status) + write(*,'(1x,A)') card + if (card(1:15) .ne. 'KEY_PREC= ''This') + & write(*,'(1x,A)') 'ERROR in ftgrec ' + + call ftgkyn(iunit, 9, keyword, value, comment, status) + write(*,'(1x,5A)') keyword,' ', value(1:35),' ', comment(1:20) + + if (keyword(1:8) .ne. 'KEY_PREC' ) + & write(*,'(1x,2A)') 'ERROR in ftgkyn: ', keyword + + call ftgcrd(iunit, keyword, card, status) + write(*,'(1x,A)') card + + if (keyword(1:8) .ne. card(1:8) ) + & write(*,'(1x,2A)') 'ERROR in ftgcrd: ', keyword + + call ftgkey(iunit, 'KY_PKNS1', value, comment, status) + write(*,'(1x,5A)') 'KY_PKNS1 ',':', value(1:15),':', comment(1:16) + + if (value(1:14) .ne. '''first string''') + & write(*,'(1x,2A)') 'ERROR in ftgkey: ', value + + call ftgkys(iunit, 'key_pkys', iskey, comment, status) + write(*,'(1x,5A,I4)')'KEY_PKYS ',':',iskey,':',comment(1:16), + & status + + call ftgkyl(iunit, 'key_pkyl', ilkey, comment, status) + write(*,'(1x,2A,L4,2A,I4)') 'KEY_PKYL ',':', ilkey,':', + &comment(1:16), status + + call ftgkyj(iunit, 'KEY_PKYJ', ijkey, comment, status) + write(*,'(1x,2A,I4,2A,I4)') 'KEY_PKYJ ',':',ijkey,':', + & comment(1:16), status + + call ftgkye(iunit, 'KEY_PKYJ', iekey, comment, status) + write(*,'(1x,2A,f12.5,2A,I4)') 'KEY_PKYE ',':',iekey,':', + & comment(1:16), status + + call ftgkyd(iunit, 'KEY_PKYJ', idkey, comment, status) + write(*,'(1x,2A,F12.5,2A,I4)') 'KEY_PKYD ',':',idkey,':', + & comment(1:16), status + + if (ijkey .ne. 11 .or. iekey .ne. 11. .or. idkey .ne. 11.) + & write(*,'(1x,A,I4,2F5.1)') 'ERROR in ftgky(jed): ', + & ijkey, iekey, idkey + + iskey= ' ' + call ftgkys(iunit, 'key_pkys', iskey, comment, status) + write(*,'(1x,5A,I4)') 'KEY_PKYS ',':', iskey,':', comment(1:16), + & status + + ilkey = .false. + call ftgkyl(iunit, 'key_pkyl', ilkey, comment, status) + write(*,'(1x,2A,L4,2A,I4)') 'KEY_PKYL ',':', ilkey,':', + & comment(1:16), status + + ijkey = 0 + call ftgkyj(iunit, 'KEY_PKYJ', ijkey, comment, status) + write(*,'(1x,2A,I4,2A,I4)') 'KEY_PKYJ ',':',ijkey,':', + & comment(1:16), status + + iekey = 0 + call ftgkye(iunit, 'KEY_PKYE', iekey, comment, status) + write(*,'(1x,2A,f12.5,2A,I4)') 'KEY_PKYE ',':',iekey,':', + & comment(1:16), status + + idkey = 0 + call ftgkyd(iunit, 'KEY_PKYD', idkey, comment, status) + write(*,'(1x,2A,F12.5,2A,I4)') 'KEY_PKYD ',':',idkey,':', + & comment(1:16), status + + iekey = 0 + call ftgkye(iunit, 'KEY_PKYF', iekey, comment, status) + write(*,'(1x,2A,f12.5,2A,I4)') 'KEY_PKYF ',':',iekey,':', + & comment(1:16), status + + iekey = 0 + call ftgkye(iunit, 'KEY_PKYE', iekey, comment, status) + write(*,'(1x,2A,f12.5,2A,I4)') 'KEY_PKYE ',':',iekey,':', + & comment(1:16), status + + idkey = 0 + call ftgkyd(iunit, 'KEY_PKYG', idkey, comment, status) + write(*,'(1x,2A,f16.12,2A,I4)') 'KEY_PKYG ',':',idkey,':', + & comment(1:16), status + + idkey = 0 + call ftgkyd(iunit, 'KEY_PKYD', idkey, comment, status) + write(*,'(1x,2A,f16.12,2A,I4)') 'KEY_PKYD ',':',idkey,':', + & comment(1:16), status + + call ftgkyt(iunit, 'KEY_PKYT', ijkey, idkey, comment, status) + write(*,'(1x,2A,i10,A,f16.14,A,I4)') 'KEY_PKYT ',':', + & ijkey,':', idkey, comment(1:16), status + + call ftpunt(iunit, 'KEY_PKYJ', 'km/s/Mpc', status) + ijkey = 0 + call ftgkyj(iunit, 'KEY_PKYJ', ijkey, comment, status) + write(*,'(1x,2A,I4,2A,I4)') 'KEY_PKYJ ',':',ijkey,':', + & comment(1:38), status + call ftgunt(iunit,'KEY_PKYJ',kunit,status) + write(*,'(1x,2A)') 'keyword unit=', kunit + + call ftpunt(iunit, 'KEY_PKYJ', ' ', status) + ijkey = 0 + call ftgkyj(iunit, 'KEY_PKYJ', ijkey, comment, status) + write(*,'(1x,2A,I4,2A,I4)') 'KEY_PKYJ ',':',ijkey,':', + & comment(1:38), status + call ftgunt(iunit,'KEY_PKYJ',kunit,status) + write(*,'(1x,2A)') 'keyword unit=', kunit + + call ftpunt(iunit, 'KEY_PKYJ', 'feet/second/second', status) + ijkey = 0 + call ftgkyj(iunit, 'KEY_PKYJ', ijkey, comment, status) + write(*,'(1x,2A,I4,2A,I4)') 'KEY_PKYJ ',':',ijkey,':', + & comment(1:38), status + call ftgunt(iunit,'KEY_PKYJ',kunit,status) + write(*,'(1x,2A)') 'keyword unit=', kunit + + call ftgkys(iunit, 'key_pkls', lstr, comment, status) + write(*,'(1x,2A)') 'KEY_PKLS long string value = ', lstr(1:50) + write(*,'(1x,A)')lstr(51:120) + +C get size and position in header + call ftghps(iunit, existkeys, keynum, status) + write(*,'(1x,A,I4,A,I4)') 'header contains ', existkeys, + & ' keywords; located at keyword ', keynum + +C ############################ +C # read array keywords # +C ############################ + + call ftgkns(iunit, 'ky_pkns', 1, 3, inskey, nfound, status) + write(*,'(1x,4A)') 'ftgkns: ', inskey(1)(1:14), inskey(2)(1:14), + & inskey(3)(1:14) + if (nfound .ne. 3 .or. status .gt. 0) + & write(*,'(1x,A,2I4)') ' ERROR in ftgkns ', nfound, status + + call ftgknl(iunit, 'ky_pknl', 1, 3, inlkey, nfound, status) + write(*,'(1x,A,3L4)') 'ftgknl: ', inlkey(1), inlkey(2), inlkey(3) + if (nfound .ne. 3 .or. status .gt. 0) + & write(*,'(1x,A,2I4)') ' ERROR in ftgknl ', nfound, status + + call ftgknj(iunit, 'ky_pknj', 1, 3, injkey, nfound, status) + write(*,'(1x,A,3I4)') 'ftgknj: ', injkey(1), injkey(2), injkey(3) + if (nfound .ne. 3 .or. status .gt. 0) + & write(*,'(1x,A,2I4)') ' ERROR in ftgknj ', nfound, status + + call ftgkne(iunit, 'ky_pkne', 1, 3, inekey, nfound, status) + write(*,'(1x,A,3F10.5)') 'ftgkne: ',inekey(1),inekey(2),inekey(3) + if (nfound .ne. 3 .or. status .gt. 0) + & write(*,'(1x,A,2I4)') ' ERROR in ftgkne ', nfound, status + + call ftgknd(iunit, 'ky_pknd', 1, 3, indkey, nfound, status) + write(*,'(1x,A,3F10.5)') 'ftgknd: ',indkey(1),indkey(2),indkey(3) + if (nfound .ne. 3 .or. status .gt. 0) + & write(*,'(1x,A,2I4)') ' ERROR in ftgknd ', nfound, status + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') + & 'Before deleting the HISTORY and DATE keywords...' + do ii = 29, 32 + call ftgrec(iunit, ii, card, status) + write(*,'(1x,A)') card(1:8) + end do + +C don't print date value, so that +C the output will always be the same + + +C ############################ +C # delete keywords # +C ############################ + + + call ftdrec(iunit, 30, status) + call ftdkey(iunit, 'DATE', status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'After deleting the keywords... ' + do ii = 29, 30 + call ftgrec(iunit, ii, card, status) + write(*,'(1x,A)') card + end do + + if (status .gt. 0) + & write(*,'(1x,A)') ' ERROR deleting keywords ' + + +C ############################ +C # insert keywords # +C ############################ + + call ftirec(iunit,26, + & 'KY_IREC = ''This keyword inserted by fxirec''', + & status) + call ftikys(iunit, 'KY_IKYS', 'insert_value_string', + & 'ikys comment', status) + call ftikyj(iunit, 'KY_IKYJ', 49, 'ikyj comment', status) + call ftikyl(iunit, 'KY_IKYL', .true., 'ikyl comment', status) + call ftikye(iunit, 'KY_IKYE',12.3456,4,'ikye comment',status) + odkey = 12.345678901234567D+00 + call ftikyd(iunit, 'KY_IKYD', odkey, 14, + & 'ikyd comment', status) + call ftikyf(iunit, 'KY_IKYF', 12.3456, 4, 'ikyf comment', + & status) + call ftikyg(iunit, 'KY_IKYG', odkey, 13, + & 'ikyg comment', status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'After inserting the keywords... ' + do ii = 25, 34 + call ftgrec(iunit, ii, card, status) + write(*,'(1x,A)') card + end do + + if (status .gt. 0) + & write(*,'(1x,A)') ' ERROR inserting keywords ' + + +C ############################ +C # modify keywords # +C ############################ + + call ftmrec(iunit, 25, + & 'COMMENT This keyword was modified by fxmrec', status) + call ftmcrd(iunit, 'KY_IREC', + & 'KY_MREC = ''This keyword was modified by fxmcrd''', status) + call ftmnam(iunit, 'KY_IKYS', 'NEWIKYS', status) + + call ftmcom(iunit,'KY_IKYJ','This is a modified comment', + & status) + call ftmkyj(iunit, 'KY_IKYJ', 50, '&', status) + call ftmkyl(iunit, 'KY_IKYL', .false., '&', status) + call ftmkys(iunit, 'NEWIKYS', 'modified_string', '&', status) + call ftmkye(iunit, 'KY_IKYE', -12.3456, 4, '&', status) + odkey = -12.345678901234567D+00 + + call ftmkyd(iunit, 'KY_IKYD', odkey, 14, + & 'modified comment', status) + call ftmkyf(iunit, 'KY_IKYF', -12.3456, 4, '&', status) + call ftmkyg(iunit,'KY_IKYG', odkey,13,'&',status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'After modifying the keywords... ' + do ii = 25, 34 + call ftgrec(iunit, ii, card, status) + write(*,'(1x,A)') card + end do + + if (status .gt. 0)then + write(*,'(1x,A)') ' ERROR modifying keywords ' + go to 999 + end if + +C ############################ +C # update keywords # +C ############################ + + call ftucrd(iunit, 'KY_MREC', + & 'KY_UCRD = ''This keyword was updated by fxucrd''', + & status) + + call ftukyj(iunit, 'KY_IKYJ', 51, '&', status) + call ftukyl(iunit, 'KY_IKYL', .true., '&', status) + call ftukys(iunit, 'NEWIKYS', 'updated_string', '&', status) + call ftukye(iunit, 'KY_IKYE', -13.3456, 4, '&', status) + odkey = -13.345678901234567D+00 + + call ftukyd(iunit, 'KY_IKYD',odkey , 14, + & 'modified comment', status) + call ftukyf(iunit, 'KY_IKYF', -13.3456, 4, '&', status) + call ftukyg(iunit, 'KY_IKYG', odkey, 13, '&', status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'After updating the keywords... ' + do ii = 25, 34 + call ftgrec(iunit, ii, card, status) + write(*,'(1x,A)') card + end do + + if (status .gt. 0)then + write(*,'(1x,A)') ' ERROR modifying keywords ' + go to 999 + end if + +C move to top of header and find keywords using wild cards + call ftgrec(iunit, 0, card, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') + & 'Keywords found using wildcard search (should be 9)...' + nfound = -1 +91 nfound = nfound +1 + call ftgnxk(iunit, inclist, 2, exclist, 2, card, status) + if (status .eq. 0)then + write(*,'(1x,A)') card + go to 91 + end if + + if (nfound .ne. 9)then + write(*,'(1x,A)') + & 'ERROR reading keywords using wildcards (ftgnxk)' + go to 999 + end if + status = 0 + +C ############################ +C # create binary table # +C ############################ + + tform(1) = '15A' + tform(2) = '1L' + tform(3) = '16X' + tform(4) = '1B' + tform(5) = '1I' + tform(6) = '1J' + tform(7) = '1E' + tform(8) = '1D' + tform(9) = '1C' + tform(10)= '1M' + + ttype(1) = 'Avalue' + ttype(2) = 'Lvalue' + ttype(3) = 'Xvalue' + ttype(4) = 'Bvalue' + ttype(5) = 'Ivalue' + ttype(6) = 'Jvalue' + ttype(7) = 'Evalue' + ttype(8) = 'Dvalue' + ttype(9) = 'Cvalue' + ttype(10)= 'Mvalue' + + tunit(1) = ' ' + tunit(2) = 'm**2' + tunit(3) = 'cm' + tunit(4) = 'erg/s' + tunit(5) = 'km/s' + tunit(6) = ' ' + tunit(7) = ' ' + tunit(8) = ' ' + tunit(9) = ' ' + tunit(10)= ' ' + + nrows = 21 + tfields = 10 + pcount = 0 + + call ftibin(iunit, nrows, tfields, ttype, tform, tunit, + & binname, pcount, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)') 'ftibin status = ', status + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + +C get size and position in header, and reserve space for more keywords + call ftghps(iunit, existkeys, keynum, status) + write(*,'(1x,A,I4,A,I4)') 'header contains ',existkeys, + & ' keywords located at keyword ', keynum + + morekeys = 40 + call fthdef(iunit, morekeys, status) + call ftghsp(iunit, existkeys, morekeys, status) + write(*,'(1x,A,I4,A,I4,A)') 'header contains ', existkeys, + &' keywords with room for ', morekeys,' more' + +C define null value for int cols + call fttnul(iunit, 4, 99, status) + call fttnul(iunit, 5, 99, status) + call fttnul(iunit, 6, 99, status) + + call ftpkyj(iunit, 'TNULL4', 99, 'value for undefined pixels', + & status) + call ftpkyj(iunit, 'TNULL5', 99, 'value for undefined pixels', + & status) + call ftpkyj(iunit, 'TNULL6', 99, 'value for undefined pixels', + & status) + + naxis = 3 + naxes(1) = 1 + naxes(2) = 2 + naxes(3) = 8 + call ftptdm(iunit, 3, naxis, naxes, status) + + naxis = 0 + naxes(1) = 0 + naxes(2) = 0 + naxes(3) = 0 + call ftgtdm(iunit, 3, 3, naxis, naxes, status) + call ftgkys(iunit, 'TDIM3', iskey, comment, status) + write(*,'(1x,2A,4I4)') 'TDIM3 = ', iskey, naxis, naxes(1), + & naxes(2), naxes(3) + +C force header to be scanned (not required) + call ftrdef(iunit, status) + +C ############################ +C # write data to columns # +C ############################ + +C initialize arrays of values to write to table + signval = -1 + do ii = 1, 21 + signval = signval * (-1) + boutarray(ii) = char(ii) + ioutarray(ii) = (ii) * signval + joutarray(ii) = (ii) * signval + koutarray(ii) = (ii) * signval + eoutarray(ii) = (ii) * signval + doutarray(ii) = (ii) * signval + end do + + call ftpcls(iunit, 1, 1, 1, 3, onskey, status) +C write string values + call ftpclu(iunit, 1, 4, 1, 1, status) +C write null value + + larray(1) = .false. + larray(2) =.true. + larray(3) = .false. + larray(4) = .false. + larray(5) =.true. + larray(6) =.true. + larray(7) = .false. + larray(8) = .false. + larray(9) = .false. + larray(10) =.true. + larray(11) =.true. + larray(12) = .true. + larray(13) = .false. + larray(14) = .false. + larray(15) =.false. + larray(16) =.false. + larray(17) = .true. + larray(18) = .true. + larray(19) = .true. + larray(20) = .true. + larray(21) =.false. + larray(22) =.false. + larray(23) =.false. + larray(24) =.false. + larray(25) =.false. + larray(26) = .true. + larray(27) = .true. + larray(28) = .true. + larray(29) = .true. + larray(30) = .true. + larray(31) =.false. + larray(32) =.false. + larray(33) =.false. + larray(34) =.false. + larray(35) =.false. + larray(36) =.false. + +C write bits + call ftpclx(iunit, 3, 1, 1, 36, larray, status) + +C loop over cols 4 - 8 + do ii = 4, 8 + call ftpclb(iunit, ii, 1, 1, 2, boutarray, status) + if (status .eq. 412) status = 0 + + call ftpcli(iunit, ii, 3, 1, 2, ioutarray(3), status) + if (status .eq. 412) status = 0 + + call ftpclj(iunit, ii, 5, 1, 2, koutarray(5), status) + if (status .eq. 412) status = 0 + + call ftpcle(iunit, ii, 7, 1, 2, eoutarray(7), status) + if (status .eq. 412)status = 0 + + call ftpcld(iunit, ii, 9, 1, 2, doutarray(9), status) + if (status .eq. 412)status = 0 + +C write null value + call ftpclu(iunit, ii, 11, 1, 1, status) + end do + + call ftpclc(iunit, 9, 1, 1, 10, eoutarray, status) + call ftpclm(iunit, 10, 1, 1, 10, doutarray, status) + +C loop over cols 4 - 8 + do ii = 4, 8 + bnul = char(13) + call ftpcnb(iunit, ii, 12, 1, 2, boutarray(12),bnul,status) + if (status .eq. 412) status = 0 + inul=15 + call ftpcni(iunit, ii, 14, 1, 2, ioutarray(14),inul,status) + if (status .eq. 412) status = 0 + call ftpcnj(iunit, ii, 16, 1, 2, koutarray(16), 17, status) + if (status .eq. 412) status = 0 + call ftpcne(iunit, ii, 18, 1, 2, eoutarray(18), 19.,status) + if (status .eq. 412) status = 0 + dnul = 21. + call ftpcnd(iunit, ii, 20, 1, 2, doutarray(20),dnul,status) + if (status .eq. 412) status = 0 + end do + +C write logicals + call ftpcll(iunit, 2, 1, 1, 21, larray, status) +C write null value + call ftpclu(iunit, 2, 11, 1, 1, status) + write(*,'(1x,A,I4)') 'ftpcl_ status = ', status + if (status .gt. 0)go to 999 + +C ######################################### +C # get information about the columns # +C ######################################### + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') + & 'Find the column numbers a returned status value'// + & ' of 237 is' + write(*,'(1x,A)') + & 'expected and indicates that more than one column'// + & ' name matches' + write(*,'(1x,A)')'the input column name template.'// + & ' Status = 219 indicates that' + write(*,'(1x,A)') 'there was no matching column name.' + + call ftgcno(iunit, 0, 'Xvalue', colnum, status) + write(*,'(1x,A,I4,A,I4)') 'Column Xvalue is number', colnum, + &' status =',status + +219 continue + if (status .ne. 219)then + call ftgcnn(iunit, 1, '*ue', colname, colnum, status) + write(*,'(1x,3A,I4,A,I4)') 'Column ',colname(1:6),' is number', + & colnum,' status = ', status + go to 219 + end if + + status = 0 + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Information about each column: ' + + do ii = 1, tfields + call ftgtcl(iunit, ii, typecode, repeat, width, status) + call ftgbcl(iunit,ii,ttype,tunit,cval,repeat,scale, + & zero, jnulval, tdisp, status) + + write(*,'(1x,A,3I4,5A,2F8.2,I12,A)') + & tform(ii)(1:3), typecode, repeat, width,' ', + & ttype(1)(1:6),' ',tunit(1)(1:6), cval, scale, zero, jnulval, + & tdisp(1:8) + end do + + write(*,'(1x,A)') ' ' + +C ############################################### +C # insert ASCII table before the binary table # +C ############################################### + + call ftmrhd(iunit, -1, hdutype, status) + if (status .gt. 0)goto 999 + + tform(1) = 'A15' + tform(2) = 'I10' + tform(3) = 'F14.6' + tform(4) = 'E12.5' + tform(5) = 'D21.14' + + ttype(1) = 'Name' + ttype(2) = 'Ivalue' + ttype(3) = 'Fvalue' + ttype(4) = 'Evalue' + ttype(5) = 'Dvalue' + + tunit(1) = ' ' + tunit(2) = 'm**2' + tunit(3) = 'cm' + tunit(4) = 'erg/s' + tunit(5) = 'km/s' + + rowlen = 76 + nrows = 11 + tfields = 5 + + call ftitab(iunit, rowlen, nrows, tfields, ttype, tbcol, + & tform, tunit, tblname, status) + write(*,'(1x,A,I4)') 'ftitab status = ', status + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + +C define null value for int cols + call ftsnul(iunit, 1, 'null1', status) + call ftsnul(iunit, 2, 'null2', status) + call ftsnul(iunit, 3, 'null3', status) + call ftsnul(iunit, 4, 'null4', status) + call ftsnul(iunit, 5, 'null5', status) + + call ftpkys(iunit, 'TNULL1', 'null1', + & 'value for undefined pixels', status) + call ftpkys(iunit, 'TNULL2', 'null2', + & 'value for undefined pixels', status) + call ftpkys(iunit, 'TNULL3', 'null3', + & 'value for undefined pixels', status) + call ftpkys(iunit, 'TNULL4', 'null4', + & 'value for undefined pixels', status) + call ftpkys(iunit, 'TNULL5', 'null5', + & 'value for undefined pixels', status) + + if (status .gt. 0) goto 999 + +C ############################ +C # write data to columns # +C ############################ + +C initialize arrays of values to write to table + do ii = 1,21 + boutarray(ii) = char(ii) + ioutarray(ii) = ii + joutarray(ii) = ii + eoutarray(ii) = ii + doutarray(ii) = ii + end do + +C write string values + call ftpcls(iunit, 1, 1, 1, 3, onskey, status) +C write null value + call ftpclu(iunit, 1, 4, 1, 1, status) + + do ii = 2,5 +C loop over cols 2 - 5 + call ftpclb(iunit, ii, 1, 1, 2, boutarray, status) +C char array + if (status .eq. 412) status = 0 + + call ftpcli(iunit, ii, 3, 1, 2, ioutarray(3), status) +C short array + if (status .eq. 412) status = 0 + + call ftpclj(iunit, ii, 5, 1, 2, joutarray(5), status) +C long array + if (status .eq. 412)status = 0 + + call ftpcle(iunit, ii, 7, 1, 2, eoutarray(7), status) +C float array + if (status .eq. 412) status = 0 + + call ftpcld(iunit, ii, 9, 1, 2, doutarray(9), status) +C double array + if (status .eq. 412) status = 0 + + call ftpclu(iunit, ii, 11, 1, 1, status) +C write null value + end do + write(*,'(1x,A,I4)') 'ftpcl_ status = ', status + write(*,'(1x,A)')' ' + +C ################################ +C # read data from ASCII table # +C ################################ + + call ftghtb(iunit, 99, rowlen, nrows, tfields, ttype, tbcol, + & tform, tunit, tblname, status) + + write(*,'(1x,A,3I3,2A)') + & 'ASCII table: rowlen, nrows, tfields, extname:', + & rowlen, nrows, tfields,' ',tblname + + do ii = 1,tfields + write(*,'(1x,A,I4,3A)') + & ttype(ii)(1:7), tbcol(ii),' ',tform(ii)(1:7), tunit(ii)(1:7) + end do + + nrows = 11 + call ftgcvs(iunit, 1, 1, 1, nrows, 'UNDEFINED', inskey, + & anynull, status) + bnul = char(99) + call ftgcvb(iunit, 2, 1, 1, nrows, bnul, binarray, + & anynull, status) + inul = 99 + call ftgcvi(iunit, 2, 1, 1, nrows, inul, iinarray, + & anynull, status) + call ftgcvj(iunit, 3, 1, 1, nrows, 99, jinarray, + & anynull, status) + call ftgcve(iunit, 4, 1, 1, nrows, 99., einarray, + & anynull, status) + dnul = 99. + call ftgcvd(iunit, 5, 1, 1, nrows, dnul, dinarray, + & anynull, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values read from ASCII table: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1011) inskey(ii), jj, + & iinarray(ii), jinarray(ii), einarray(ii), dinarray(ii) +1011 format(1x,a15,3i3,1x,2f3.0) + end do + + call ftgtbs(iunit, 1, 20, 78, uchars, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A)') uchars + call ftptbs(iunit, 1, 20, 78, uchars, status) + +C ######################################### +C # get information about the columns # +C ######################################### + + call ftgcno(iunit, 0, 'name', colnum, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4,A,I4)') + & 'Column name is number',colnum,' status = ', status + +2190 continue + if (status .ne. 219)then + if (status .gt. 0 .and. status .ne. 237)go to 999 + + call ftgcnn(iunit, 1, '*ue', colname, colnum, status) + write(*,'(1x,3A,I4,A,I4)') + & 'Column ',colname(1:6),' is number',colnum,' status = ',status + go to 2190 + end if + + status = 0 + + do ii = 1, tfields + call ftgtcl(iunit, ii, typecode, repeat, width, status) + call ftgacl(iunit, ii, ttype, tbcol,tunit,tform, + & scale,zero, nulstr, tdisp, status) + + write(*,'(1x,A,3I4,2A,I4,2A,2F10.2,3A)') + & tform(ii)(1:7), typecode, repeat, width,' ', + & ttype(1)(1:6), tbcol(1), ' ',tunit(1)(1:5), + & scale, zero, ' ', nulstr(1:6), tdisp(1:2) + + end do + + write(*,'(1x,A)') ' ' + +C ############################################### +C # test the insert/delete row/column routines # +C ############################################### + + call ftirow(iunit, 2, 3, status) + if (status .gt. 0) goto 999 + + nrows = 14 + call ftgcvs(iunit, 1, 1, 1, nrows, 'UNDEFINED', + & inskey, anynull, status) + call ftgcvb(iunit, 2, 1, 1, nrows, bnul, binarray, + & anynull, status) + call ftgcvi(iunit, 2, 1, 1, nrows, inul, iinarray, + & anynull, status) + call ftgcvj(iunit, 3, 1, 1, nrows, 99, jinarray, + & anynull, status) + call ftgcve(iunit, 4, 1, 1, nrows, 99., einarray, + & anynull, status) + call ftgcvd(iunit, 5, 1, 1, nrows, dnul, dinarray, + & anynull, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)')'Data values after inserting 3 rows after row 2:' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1011) inskey(ii), jj, + & iinarray(ii), jinarray(ii), einarray(ii), dinarray(ii) + end do + + call ftdrow(iunit, 10, 2, status) + + nrows = 12 + call ftgcvs(iunit, 1, 1, 1, nrows, 'UNDEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 2, 1, 1, nrows, bnul, binarray, anynull, + & status) + call ftgcvi(iunit, 2, 1, 1, nrows, inul, iinarray, anynull, + & status) + call ftgcvj(iunit, 3, 1, 1, nrows, 99, jinarray, anynull, + & status) + call ftgcve(iunit, 4, 1, 1, nrows, 99., einarray, anynull, + & status) + call ftgcvd(iunit, 5, 1, 1, nrows, dnul, dinarray, anynull, + & status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values after deleting 2 rows at row 10: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1011) inskey(ii), jj, + & iinarray(ii), jinarray(ii), einarray(ii), dinarray(ii) + end do + call ftdcol(iunit, 3, status) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'UNDEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 2, 1, 1, nrows, bnul, binarray, anynull, + & status) + call ftgcvi(iunit, 2, 1, 1, nrows, inul, iinarray, anynull, + & status) + call ftgcve(iunit, 3, 1, 1, nrows, 99., einarray, anynull, + & status) + call ftgcvd(iunit, 4, 1, 1, nrows, dnul, dinarray, anynull, + & status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values after deleting column 3: ' + do ii = 1,nrows + jj = ichar(binarray(ii)) + write(*,1012) inskey(ii), jj, + & iinarray(ii), einarray(ii), dinarray(ii) +1012 format(1x,a15,2i3,1x,2f3.0) + + end do + + call fticol(iunit, 5, 'INSERT_COL', 'F14.6', status) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'UNDEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 2, 1, 1, nrows, bnul, binarray, anynull, + & status) + call ftgcvi(iunit, 2, 1, 1, nrows, inul, iinarray, anynull, + & status) + call ftgcve(iunit, 3, 1, 1, nrows, 99., einarray, anynull, + & status) + call ftgcvd(iunit, 4, 1, 1, nrows, dnul, dinarray, anynull, + & status) + call ftgcvj(iunit, 5, 1, 1, nrows, 99, jinarray, anynull, + & status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') ' Data values after inserting column 5: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1013) inskey(ii), jj, + & iinarray(ii), einarray(ii), dinarray(ii) , jinarray(ii) +1013 format(1x,a15,2i3,1x,2f3.0,i2) + + end do + +C ################################ +C # read data from binary table # +C ################################ + + + call ftmrhd(iunit, 1, hdutype, status) + if (status .gt. 0)go to 999 + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + call ftghsp(iunit, existkeys, morekeys, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A)')'Moved to binary table' + write(*,'(1x,A,I4,A,I4,A)') 'header contains ',existkeys, + & ' keywords with room for ',morekeys,' more ' + + call ftghbn(iunit, 99, nrows, tfields, ttype, + & tform, tunit, binname, pcount, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A,2I4,A,I4)') + & 'Binary table: nrows, tfields, extname, pcount:', + & nrows, tfields, binname, pcount + + do ii = 1,tfields + write(*,'(1x,3A)') ttype(ii), tform(ii), tunit(ii) + end do + + do ii = 1, 40 + larray(ii) = .false. + end do + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values read from binary table: ' + write(*,'(1x,A)') ' Bit column (X) data values: ' + + call ftgcx(iunit, 3, 1, 1, 36, larray, status) + write(*,1014) (larray(ii), ii = 1,40) +1014 format(1x,8l1,' ',8l1,' ',8l1,' ',8l1,' ',8l1) + + nrows = 21 + do ii = 1, nrows + larray(ii) = .false. + xinarray(ii) = ' ' + binarray(ii) = ' ' + iinarray(ii) = 0 + kinarray(ii) = 0 + einarray(ii) = 0. + dinarray(ii) = 0. + cinarray(ii * 2 -1) = 0. + minarray(ii * 2 -1) = 0. + cinarray(ii * 2 ) = 0. + minarray(ii * 2 ) = 0. + end do + + write(*,'(1x,A)') ' ' + call ftgcvs(iunit, 1, 4, 1, 1, ' ', inskey, anynull,status) + if (ichar(inskey(1)(1:1)) .eq. 0)inskey(1)=' ' + write(*,'(1x,2A)') 'null string column value (should be blank):', + & inskey(1) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcl( iunit, 2, 1, 1, nrows, larray, status) + bnul = char(98) + call ftgcvb(iunit, 3, 1, 1,nrows,bnul, xinarray,anynull,status) + call ftgcvb(iunit, 4, 1, 1,nrows,bnul, binarray,anynull,status) + inul = 98 + call ftgcvi(iunit, 5, 1, 1,nrows,inul, iinarray,anynull,status) + call ftgcvj(iunit, 6, 1, 1, nrows, 98, kinarray,anynull,status) + call ftgcve(iunit, 7, 1, 1, nrows, 98.,einarray,anynull,status) + dnul = 98. + call ftgcvd(iunit, 8, 1, 1, nrows,dnul,dinarray,anynull,status) + call ftgcvc(iunit, 9, 1, 1, nrows, 98.,cinarray,anynull,status) + call ftgcvm(iunit,10, 1, 1, nrows,dnul,minarray,anynull,status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Read columns with ftgcv_: ' + do ii = 1,nrows + jj = ichar(xinarray(ii)) + jjj = ichar(binarray(ii)) + write(*,1201)inskey(ii),larray(ii),jj,jjj,iinarray(ii), + & kinarray(ii), einarray(ii), dinarray(ii), cinarray(ii * 2 -1), + &cinarray(ii * 2 ), minarray(ii * 2 -1), minarray(ii * 2 ) + end do +1201 format(1x,a14,l4,4i4,6f5.0) + + do ii = 1, nrows + larray(ii) = .false. + xinarray(ii) = ' ' + binarray(ii) = ' ' + iinarray(ii) = 0 + kinarray(ii) = 0 + einarray(ii) = 0. + dinarray(ii) = 0. + cinarray(ii * 2 -1) = 0. + minarray(ii * 2 -1) = 0. + cinarray(ii * 2 ) = 0. + minarray(ii * 2 ) = 0. + end do + + call ftgcfs(iunit, 1, 1, 1, nrows, inskey, larray2, anynull, + & status) +C put blanks in strings if they are undefined. (contain nulls) + do ii = 1, nrows + if (larray2(ii))inskey(ii) = ' ' + end do + + call ftgcfl(iunit, 2, 1, 1, nrows, larray, larray2, anynull, + & status) + call ftgcfb(iunit, 3, 1, 1, nrows, xinarray, larray2, anynull, + & status) + call ftgcfb(iunit, 4, 1, 1, nrows, binarray, larray2, anynull, + & status) + call ftgcfi(iunit, 5, 1, 1, nrows, iinarray, larray2, anynull, + & status) + call ftgcfj(iunit, 6, 1, 1, nrows, kinarray, larray2, anynull, + & status) + call ftgcfe(iunit, 7, 1, 1, nrows, einarray, larray2, anynull, + & status) + call ftgcfd(iunit, 8, 1, 1, nrows, dinarray, larray2, anynull, + & status) + call ftgcfc(iunit, 9, 1, 1, nrows, cinarray, larray2, anynull, + & status) + call ftgcfm(iunit, 10,1, 1, nrows, minarray, larray2, anynull, + & status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') ' Read columns with ftgcf_: ' + do ii = 1, 10 + jj = ichar(xinarray(ii)) + jjj = ichar(binarray(ii)) + write(*,1201) + & inskey(ii),larray(ii),jj,jjj,iinarray(ii), + & kinarray(ii), einarray(ii), dinarray(ii), cinarray(ii * 2 -1), + & cinarray(ii * 2 ), minarray(ii * 2 -1), minarray(ii * 2) + end do + + do ii = 11, 21 +C don't try to print the NaN values + jj = ichar(xinarray(ii)) + jjj = ichar(binarray(ii)) + write(*,1201) inskey(ii), larray(ii), jj, + & jjj, iinarray(ii) + end do + + call ftprec(iunit,'key_prec= '// + &'''This keyword was written by f_prec'' / comment here', + & status) + +C ############################################### +C # test the insert/delete row/column routines # +C ############################################### + + call ftirow(iunit, 2, 3, status) + if (status .gt. 0) go to 999 + + nrows = 14 + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 4, 1, 1, nrows,bnul,binarray,anynull,status) + call ftgcvi(iunit, 5, 1, 1, nrows,inul,iinarray,anynull,status) + call ftgcvj(iunit, 6, 1, 1, nrows, 98, jinarray,anynull,status) + call ftgcve(iunit, 7, 1, 1, nrows, 98.,einarray,anynull,status) + call ftgcvd(iunit, 8, 1, 1, nrows,dnul,dinarray,anynull,status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)')'Data values after inserting 3 rows after row 2:' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1202) inskey(ii), jj, + & iinarray(ii), jinarray(ii), einarray(ii), dinarray(ii) + end do +1202 format(1x,a14,3i4,2f5.0) + + call ftdrow(iunit, 10, 2, status) + if (status .gt. 0)goto 999 + + nrows = 12 + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 4, 1, 1, nrows,bnul,binarray,anynull,status) + call ftgcvi(iunit, 5, 1, 1, nrows,inul,iinarray,anynull,status) + call ftgcvj(iunit, 6, 1, 1, nrows, 98,jinarray,anynull,status) + call ftgcve(iunit, 7, 1, 1, nrows, 98.,einarray,anynull,status) + call ftgcvd(iunit, 8, 1, 1, nrows,dnul,dinarray,anynull,status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values after deleting 2 rows at row 10: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1202) inskey(ii), jj, + & iinarray(ii), jinarray(ii), einarray(ii), dinarray(ii) + end do + + call ftdcol(iunit, 6, status) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 4, 1, 1, nrows,bnul,binarray,anynull,status) + call ftgcvi(iunit, 5, 1, 1, nrows,inul,iinarray,anynull,status) + call ftgcve(iunit, 6, 1, 1, nrows, 98.,einarray,anynull,status) + call ftgcvd(iunit, 7, 1, 1, nrows,dnul,dinarray,anynull,status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values after deleting column 6: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1203) inskey(ii), jj, + & iinarray(ii), einarray(ii), dinarray(ii) +1203 format(1x,a14,2i4,2f5.0) + + end do + call fticol(iunit, 8, 'INSERT_COL', '1E', status) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 4, 1, 1, nrows,bnul,binarray,anynull,status) + call ftgcvi(iunit, 5, 1, 1, nrows,inul,iinarray,anynull,status) + call ftgcve(iunit, 6, 1, 1, nrows, 98.,einarray,anynull,status) + call ftgcvd(iunit, 7, 1, 1, nrows,dnul,dinarray,anynull,status) + call ftgcvj(iunit, 8, 1, 1, nrows, 98,jinarray,anynull,status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') 'Data values after inserting column 8: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1204) inskey(ii), jj, + & iinarray(ii), einarray(ii), dinarray(ii) , jinarray(ii) +1204 format(1x,a14,2i4,2f5.0,i3) + end do + call ftpclu(iunit, 8, 1, 1, 10, status) + + call ftgcvs(iunit, 1, 1, 1, nrows, 'NOT DEFINED', inskey, + & anynull, status) + call ftgcvb(iunit, 4,1,1,nrows,bnul,binarray,anynull,status) + call ftgcvi(iunit, 5,1,1,nrows,inul,iinarray,anynull,status) + call ftgcve(iunit, 6,1,1,nrows,98., einarray,anynull,status) + call ftgcvd(iunit, 7,1,1,nrows,dnul, dinarray,anynull,status) + call ftgcvj(iunit, 8,1,1,nrows,98, jinarray,anynull, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') + & 'Values after setting 1st 10 elements in column 8 = null: ' + do ii = 1, nrows + jj = ichar(binarray(ii)) + write(*,1204) inskey(ii), jj, + & iinarray(ii), einarray(ii), dinarray(ii) , jinarray(ii) + end do + +C #################################################### +C # insert binary table following the primary array # +C #################################################### + + call ftmahd(iunit, 1, hdutype, status) + + tform(1) = '15A' + tform(2) = '1L' + tform(3) = '16X' + tform(4) = '1B' + tform(5) = '1I' + tform(6) = '1J' + tform(7) = '1E' + tform(8) = '1D' + tform(9) = '1C' + tform(10)= '1M' + + ttype(1) = 'Avalue' + ttype(2) = 'Lvalue' + ttype(3) = 'Xvalue' + ttype(4) = 'Bvalue' + ttype(5) = 'Ivalue' + ttype(6) = 'Jvalue' + ttype(7) = 'Evalue' + ttype(8) = 'Dvalue' + ttype(9) = 'Cvalue' + ttype(10)= 'Mvalue' + + tunit(1)= ' ' + tunit(2)= 'm**2' + tunit(3)= 'cm' + tunit(4)= 'erg/s' + tunit(5)= 'km/s' + tunit(6)= ' ' + tunit(7)= ' ' + tunit(8)= ' ' + tunit(9)= ' ' + tunit(10)= ' ' + + nrows = 20 + tfields = 10 + pcount = 0 + + call ftibin(iunit, nrows, tfields, ttype, tform, tunit, + & binname, pcount, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)') 'ftibin status = ', status + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + call ftpkyj(iunit, 'TNULL4', 77, + & 'value for undefined pixels', status) + call ftpkyj(iunit, 'TNULL5', 77, + & 'value for undefined pixels', status) + call ftpkyj(iunit, 'TNULL6', 77, + & 'value for undefined pixels', status) + + call ftpkyj(iunit, 'TSCAL4', 1000, 'scaling factor', status) + call ftpkyj(iunit, 'TSCAL5', 1, 'scaling factor', status) + call ftpkyj(iunit, 'TSCAL6', 100, 'scaling factor', status) + + call ftpkyj(iunit, 'TZERO4', 0, 'scaling offset', status) + call ftpkyj(iunit, 'TZERO5', 32768, 'scaling offset', status) + call ftpkyj(iunit, 'TZERO6', 100, 'scaling offset', status) + + call fttnul(iunit, 4, 77, status) +C define null value for int cols + call fttnul(iunit, 5, 77, status) + call fttnul(iunit, 6, 77, status) + +C set scaling + scale=1000. + zero = 0. + call fttscl(iunit, 4, scale, zero, status) + scale=1. + zero = 32768. + call fttscl(iunit, 5, scale, zero, status) + scale=100. + zero = 100. + call fttscl(iunit, 6, scale, zero, status) + +C for some reason, it is still necessary to call ftrdef at this point + call ftrdef(iunit,status) + +C ############################ +C # write data to columns # +C ############################ + +C initialize arrays of values to write to table + + joutarray(1) = 0 + joutarray(2) = 1000 + joutarray(3) = 10000 + joutarray(4) = 32768 + joutarray(5) = 65535 + + + do ii = 4,6 + + call ftpclj(iunit, ii, 1, 1, 5, joutarray, status) + if (status .eq. 412)then + write(*,'(1x,A,I4)') 'Overflow writing to column ', ii + status = 0 + end if + + call ftpclu(iunit, ii, 6, 1, 1, status) +C write null value + end do + + do jj = 4,6 + call ftgcvj(iunit, jj, 1,1,6, -999,jinarray,anynull,status) + write(*,'(1x,6I6)') (jinarray(ii), ii=1,6) + end do + + write(*,'(1x,A)') ' ' + +C turn off scaling, and read the unscaled values + scale = 1. + zero = 0. + call fttscl(iunit, 4, scale, zero, status) + call fttscl(iunit, 5, scale, zero, status) + call fttscl(iunit, 6, scale, zero, status) + + do jj = 4,6 + call ftgcvj(iunit, jj,1,1,6,-999,jinarray,anynull,status) + write(*,'(1x,6I6)') (jinarray(ii), ii = 1,6) + end do + + if (status .gt. 0)go to 999 + +C ###################################################### +C # insert image extension following the binary table # +C ###################################################### + + bitpix = -32 + naxis = 2 + naxes(1) = 15 + naxes(2) = 25 + call ftiimg(iunit, bitpix, naxis, naxes, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)') + & ' Create image extension: ftiimg status = ', status + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + do jj = 0,29 + do ii = 0,18 + imgarray(ii+1,jj+1) = (jj * 10) + ii + end do + end do + + call ftp2di(iunit, 1, 19, naxes(1),naxes(2),imgarray,status) + write(*,'(1x,A)') ' ' + write(*,'(1x,A,I4)')'Wrote whole 2D array: ftp2di status =', + & status + + do jj =1, 30 + do ii = 1, 19 + imgarray(ii,jj) = 0 + end do + end do + + call ftg2di(iunit,1,0,19,naxes(1),naxes(2),imgarray,anynull, + & status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)')'Read whole 2D array: ftg2di status =',status + + do jj =1, 30 + write (*,1301)(imgarray(ii,jj),ii=1,19) +1301 format(1x,19I4) + end do + + write(*,'(1x,A)') ' ' + + + do jj =1, 30 + do ii = 1, 19 + imgarray(ii,jj) = 0 + end do + end do + + do jj =0, 19 + do ii = 0, 9 + imgarray2(ii+1,jj+1) = (jj * (-10)) - ii + end do + end do + + fpixels(1) = 5 + fpixels(2) = 5 + lpixels(1) = 14 + lpixels(2) = 14 + call ftpssi(iunit, 1, naxis, naxes, fpixels, lpixels, + & imgarray2, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)')'Wrote subset 2D array: ftpssi status =', + & status + + call ftg2di(iunit,1,0,19,naxes(1), naxes(2),imgarray,anynull, + & status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)')'Read whole 2D array: ftg2di status =',status + + do jj =1, 30 + write (*,1301)(imgarray(ii,jj),ii=1,19) + end do + write(*,'(1x,A)') ' ' + + + fpixels(1) = 2 + fpixels(2) = 5 + lpixels(1) = 10 + lpixels(2) = 8 + inc(1) = 2 + inc(2) = 3 + + do jj = 1,30 + do ii = 1, 19 + imgarray(ii,jj) = 0 + end do + end do + + call ftgsvi(iunit, 1, naxis, naxes, fpixels, lpixels, inc, 0, + & imgarray, anynull, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)') + & 'Read subset of 2D array: ftgsvi status = ',status + + write(*,'(1x,10I5)')(imgarray(ii,1),ii = 1,10) + + +C ########################################################### +C # insert another image extension # +C # copy the image extension to primary array of tmp file. # +C # then delete the tmp file, and the image extension # +C ########################################################### + + bitpix = 16 + naxis = 2 + naxes(1) = 15 + naxes(2) = 25 + call ftiimg(iunit, bitpix, naxis, naxes, status) + write(*,'(1x,A)') ' ' + write(*,'(1x,A,I4)')'Create image extension: ftiimg status =', + & status + call ftrdef(iunit, status) + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + + filename = 't1q2s3v4.tmp' + call ftinit(tmpunit, filename, 1, status) + write(*,'(1x,A,I4)')'Create temporary file: ftinit status = ', + & status + + call ftcopy(iunit, tmpunit, 0, status) + write(*,'(1x,A)') + & 'Copy image extension to primary array of tmp file.' + write(*,'(1x,A,I4)')'ftcopy status = ',status + + + call ftgrec(tmpunit, 1, card, status) + write(*,'(1x,A)') card + call ftgrec(tmpunit, 2, card, status) + write(*,'(1x,A)') card + call ftgrec(tmpunit, 3, card, status) + write(*,'(1x,A)') card + call ftgrec(tmpunit, 4, card, status) + write(*,'(1x,A)') card + call ftgrec(tmpunit, 5, card, status) + write(*,'(1x,A)') card + call ftgrec(tmpunit, 6, card, status) + write(*,'(1x,A)') card + + call ftdelt(tmpunit, status) + write(*,'(1x,A,I4)')'Delete the tmp file: ftdelt status =',status + call ftdhdu(iunit, hdutype, status) + write(*,'(1x,A,2I4)') + & 'Delete the image extension hdutype, status =', + & hdutype, status + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + +C ########################################################### +C # append bintable extension with variable length columns # +C ########################################################### + + call ftcrhd(iunit, status) + write(*,'(1x,A,I4)') 'ftcrhd status = ', status + + tform(1)= '1PA' + tform(2)= '1PL' + tform(3)= '1PB' +C Fortran FITSIO doesn't support 1PX + tform(4)= '1PB' + tform(5)= '1PI' + tform(6)= '1PJ' + tform(7)= '1PE' + tform(8)= '1PD' + tform(9)= '1PC' + tform(10)= '1PM' + + ttype(1)= 'Avalue' + ttype(2)= 'Lvalue' + ttype(3)= 'Xvalue' + ttype(4)= 'Bvalue' + ttype(5)= 'Ivalue' + ttype(6)= 'Jvalue' + ttype(7)= 'Evalue' + ttype(8)= 'Dvalue' + ttype(9)= 'Cvalue' + ttype(10)= 'Mvalue' + + tunit(1)= ' ' + tunit(2)= 'm**2' + tunit(3)= 'cm' + tunit(4)= 'erg/s' + tunit(5)= 'km/s' + tunit(6)= ' ' + tunit(7)= ' ' + tunit(8)= ' ' + tunit(9)= ' ' + tunit(10)= ' ' + + nrows = 20 + tfields = 10 + pcount = 0 + + call ftphbn(iunit, nrows, tfields, ttype, tform, + & tunit, binname, pcount, status) + write(*,'(1x,A,I4)')'Variable length arrays: ftphbn status =', + & status + call ftpkyj(iunit, 'TNULL4', 88, 'value for undefined pixels', + & status) + call ftpkyj(iunit, 'TNULL5', 88, 'value for undefined pixels', + & status) + call ftpkyj(iunit, 'TNULL6', 88, 'value for undefined pixels', + & status) + +C ############################ +C # write data to columns # +C ############################ + +C initialize arrays of values to write to table + iskey='abcdefghijklmnopqrst' + + do ii = 1, 20 + + boutarray(ii) = char(ii) + ioutarray(ii) = ii + joutarray(ii) = ii + eoutarray(ii) = ii + doutarray(ii) = ii + end do + + larray(1) = .false. + larray(2) = .true. + larray(3) = .false. + larray(4) = .false. + larray(5) = .true. + larray(6) = .true. + larray(7) = .false. + larray(8) = .false. + larray(9) = .false. + larray(10) = .true. + larray(11) = .true. + larray(12) = .true. + larray(13) = .false. + larray(14) = .false. + larray(15) = .false. + larray(16) = .false. + larray(17) = .true. + larray(18) = .true. + larray(19) = .true. + larray(20) = .true. + +C inskey(1) = iskey(1:1) + inskey(1) = ' ' + + call ftpcls(iunit, 1, 1, 1, 1, inskey, status) +C write string values + call ftpcll(iunit, 2, 1, 1, 1, larray, status) +C write logicals + call ftpclx(iunit, 3, 1, 1, 1, larray, status) +C write bits + call ftpclb(iunit, 4, 1, 1, 1, boutarray, status) + call ftpcli(iunit, 5, 1, 1, 1, ioutarray, status) + call ftpclj(iunit, 6, 1, 1, 1, joutarray, status) + call ftpcle(iunit, 7, 1, 1, 1, eoutarray, status) + call ftpcld(iunit, 8, 1, 1, 1, doutarray, status) + + do ii = 2, 20 +C loop over rows 1 - 20 + + inskey(1) = iskey(1:ii) + call ftpcls(iunit, 1, ii, 1, ii, inskey, status) +C write string values + + call ftpcll(iunit, 2, ii, 1, ii, larray, status) +C write logicals + call ftpclu(iunit, 2, ii, ii-1, 1, status) + + call ftpclx(iunit, 3, ii, 1, ii, larray, status) +C write bits + + call ftpclb(iunit, 4, ii, 1, ii, boutarray, status) + call ftpclu(iunit, 4, ii, ii-1, 1, status) + + call ftpcli(iunit, 5, ii, 1, ii, ioutarray, status) + call ftpclu(iunit, 5, ii, ii-1, 1, status) + + call ftpclj(iunit, 6, ii, 1, ii, joutarray, status) + call ftpclu(iunit, 6, ii, ii-1, 1, status) + + call ftpcle(iunit, 7, ii, 1, ii, eoutarray, status) + call ftpclu(iunit, 7, ii, ii-1, 1, status) + + call ftpcld(iunit, 8, ii, 1, ii, doutarray, status) + call ftpclu(iunit, 8, ii, ii-1, 1, status) + end do + +C it is no longer necessary to update the PCOUNT keyword; +C FITSIO now does this automatically when the HDU is closed. +C call ftmkyj(iunit,'PCOUNT',4446, '&',status) + write(*,'(1x,A,I4)') 'ftpcl_ status = ', status + +C ################################# +C # close then reopen this HDU # +C ################################# + + call ftmrhd(iunit, -1, hdutype, status) + call ftmrhd(iunit, 1, hdutype, status) + +C ############################# +C # read data from columns # +C ############################# + + + call ftgkyj(iunit, 'PCOUNT', pcount, comm, status) + write(*,'(1x,A,I4)') 'PCOUNT = ', pcount + +C initialize the variables to be read + inskey(1) =' ' + iskey = ' ' + + do jj = 1, ii + larray(jj) = .false. + boutarray(jj) = char(0) + ioutarray(jj) = 0 + joutarray(jj) = 0 + eoutarray(jj) = 0 + doutarray(jj) = 0 + end do + + call ftghdn(iunit, hdunum) + write(*,'(1x,A,I4)') 'HDU number = ', hdunum + + do ii = 1, 20 +C loop over rows 1 - 20 + + do jj = 1, ii + larray(jj) = .false. + boutarray(jj) = char(0) + ioutarray(jj) = 0 + joutarray(jj) = 0 + eoutarray(jj) = 0 + doutarray(jj) = 0 + end do + + call ftgcvs(iunit, 1, ii, 1,1,iskey,inskey,anynull,status) + write(*,'(1x,2A,I4)') 'A ', inskey(1), status + + call ftgcl( iunit, 2, ii, 1, ii, larray, status) + write(*,1400)'L',status,(larray(jj),jj=1,ii) +1400 format(1x,a1,i3,20l3) +1401 format(1x,a1,21i3) + + call ftgcx(iunit, 3, ii, 1, ii, larray, status) + write(*,1400)'X',status,(larray(jj),jj=1,ii) + + bnul = char(99) + call ftgcvb(iunit, 4, ii, 1,ii,bnul,boutarray,anynull,status) + do jj = 1,ii + jinarray(jj) = ichar(boutarray(jj)) + end do + write(*,1401)'B',(jinarray(jj),jj=1,ii),status + + inul = 99 + call ftgcvi(iunit, 5, ii, 1,ii,inul,ioutarray,anynull,status) + write(*,1401)'I',(ioutarray(jj),jj=1,ii),status + + call ftgcvj(iunit, 6, ii, 1, ii,99,joutarray,anynull,status) + write(*,1401)'J',(joutarray(jj),jj=1,ii),status + + call ftgcve(iunit, 7, ii, 1,ii,99.,eoutarray,anynull,status) + estatus=status + write(*,1402)'E',(eoutarray(jj),jj=1,ii),estatus +1402 format(1x,a1,1x,21f3.0) + + dnul = 99. + call ftgcvd(iunit, 8, ii,1,ii,dnul,doutarray,anynull,status) + estatus=status + write(*,1402)'D',(doutarray(jj),jj=1,ii),estatus + + call ftgdes(iunit, 8, ii, repeat, offset, status) + write(*,'(1x,A,2I5)')'Column 8 repeat and offset =', + & repeat,offset + end do + +C ##################################### +C # create another image extension # +C ##################################### + + + bitpix = 32 + naxis = 2 + naxes(1) = 10 + naxes(2) = 2 + npixels = 20 + + call ftiimg(iunit, bitpix, naxis, naxes, status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)')'Create image extension: ftiimg status =', + & status + +C initialize arrays of values to write to primary array + do ii = 1, npixels + boutarray(ii) = char(ii * 2 -2) + ioutarray(ii) = ii * 2 -2 + joutarray(ii) = ii * 2 -2 + koutarray(ii) = ii * 2 -2 + eoutarray(ii) = ii * 2 -2 + doutarray(ii) = ii * 2 -2 + end do + +C write a few pixels with each datatype + call ftpprb(iunit, 1, 1, 2, boutarray(1), status) + call ftppri(iunit, 1, 3, 2, ioutarray(3), status) + call ftpprj(iunit, 1, 5, 2, koutarray(5), status) + call ftppri(iunit, 1, 7, 2, ioutarray(7), status) + call ftpprj(iunit, 1, 9, 2, joutarray(9), status) + call ftppre(iunit, 1, 11, 2, eoutarray(11), status) + call ftpprd(iunit, 1, 13, 2, doutarray(13), status) + write(*,'(1x,A,I4)') 'ftppr status = ', status + + +C read back the pixels with each datatype + bnul = char(0) + inul = 0 + knul = 0 + jnul = 0 + enul = 0. + dnul = 0. + + call ftgpvb(iunit, 1, 1, 14, bnul, binarray, anynull, status) + call ftgpvi(iunit, 1, 1, 14, inul, iinarray, anynull, status) + call ftgpvj(iunit, 1, 1, 14, knul, kinarray, anynull, status) + call ftgpvj(iunit, 1, 1, 14, jnul, jinarray, anynull, status) + call ftgpve(iunit, 1, 1, 14, enul, einarray, anynull, status) + call ftgpvd(iunit, 1, 1, 14, dnul, dinarray, anynull, status) + + write(*,'(1x,A)')' ' + write(*,'(1x,A)') + & 'Image values written with ftppr and read with ftgpv:' + npixels = 14 + do jj = 1,ii + joutarray(jj) = ichar(binarray(jj)) + end do + + write(*,1501)(joutarray(ii),ii=1,npixels),anynull,'(byte)' +1501 format(1x,14i3,l3,1x,a) + write(*,1501)(iinarray(ii),ii=1,npixels),anynull,'(short)' + write(*,1501)(kinarray(ii),ii=1,npixels),anynull,'(int)' + write(*,1501)(jinarray(ii),ii=1,npixels),anynull,'(long)' + write(*,1502)(einarray(ii),ii=1,npixels),anynull,'(float)' + write(*,1502)(dinarray(ii),ii=1,npixels),anynull,'(double)' +1502 format(2x,14f3.0,l2,1x,a) + +C ########################################## +C # test world coordinate system routines # +C ########################################## + + xrval = 45.83D+00 + yrval = 63.57D+00 + xrpix = 256.D+00 + yrpix = 257.D+00 + xinc = -.00277777D+00 + yinc = .00277777D+00 + +C write the WCS keywords +C use example values from the latest WCS document + call ftpkyd(iunit, 'CRVAL1', xrval, 10, 'comment', status) + call ftpkyd(iunit, 'CRVAL2', yrval, 10, 'comment', status) + call ftpkyd(iunit, 'CRPIX1', xrpix, 10, 'comment', status) + call ftpkyd(iunit, 'CRPIX2', yrpix, 10, 'comment', status) + call ftpkyd(iunit, 'CDELT1', xinc, 10, 'comment', status) + call ftpkyd(iunit, 'CDELT2', yinc, 10, 'comment', status) +C call ftpkyd(iunit, 'CROTA2', rot, 10, 'comment', status) + call ftpkys(iunit, 'CTYPE1', xctype, 'comment', status) + call ftpkys(iunit, 'CTYPE2', yctype, 'comment', status) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4)')'Wrote WCS keywords status =', status + +C reset value, to make sure they are reread correctly + xrval = 0.D+00 + yrval = 0.D+00 + xrpix = 0.D+00 + yrpix = 0.D+00 + xinc = 0.D+00 + yinc = 0.D+00 + rot = 67.D+00 + + call ftgics(iunit, xrval, yrval, xrpix, + & yrpix, xinc, yinc, rot, ctype, status) + write(*,'(1x,A,I4)')'Read WCS keywords with ftgics status =', + & status + + xpix = 0.5D+00 + ypix = 0.5D+00 + + call ftwldp(xpix,ypix,xrval,yrval,xrpix,yrpix,xinc,yinc, + & rot,ctype, xpos, ypos,status) + + write(*,'(1x,A,2f8.3)')' CRVAL1, CRVAL2 =', xrval,yrval + write(*,'(1x,A,2f8.3)')' CRPIX1, CRPIX2 =', xrpix,yrpix + write(*,'(1x,A,2f12.8)')' CDELT1, CDELT2 =', xinc,yinc + write(*,'(1x,A,f8.3,2A)')' Rotation =',rot,' CTYPE =',ctype + write(*,'(1x,A,I4)')'Calculated sky coord. with ftwldp status =', + & status + write(*,6501)xpix,ypix,xpos,ypos +6501 format(' Pixels (',f10.6,f10.6,') --> (',f10.6,f10.6,') Sky') + + call ftxypx(xpos,ypos,xrval,yrval,xrpix,yrpix,xinc,yinc, + & rot,ctype, xpix, ypix,status) + write(*,'(1x,A,I4)') + & 'Calculated pixel coord. with ftxypx status =', status + write(*,6502)xpos,ypos,xpix,ypix +6502 format(' Sky (',f10.6,f10.6,') --> (',f10.6,f10.6,') Pixels') + + +C ###################################### +C # append another ASCII table # +C ###################################### + + + tform(1)= 'A15' + tform(2)= 'I11' + tform(3)= 'F15.6' + tform(4)= 'E13.5' + tform(5)= 'D22.14' + + tbcol(1)= 1 + tbcol(2)= 17 + tbcol(3)= 29 + tbcol(4)= 45 + tbcol(5)= 59 + rowlen = 80 + + ttype(1)= 'Name' + ttype(2)= 'Ivalue' + ttype(3)= 'Fvalue' + ttype(4)= 'Evalue' + ttype(5)= 'Dvalue' + + tunit(1)= ' ' + tunit(2)= 'm**2' + tunit(3)= 'cm' + tunit(4)= 'erg/s' + tunit(5)= 'km/s' + + nrows = 11 + tfields = 5 + tblname = 'new_table' + + call ftitab(iunit, rowlen, nrows, tfields, ttype, tbcol, + & tform, tunit, tblname, status) + write(*,'(1x,A)') ' ' + write(*,'(1x,A,I4)') 'ftitab status = ', status + + call ftpcls(iunit, 1, 1, 1, 3, onskey, status) +C write string values + +C initialize arrays of values to write to primary array + + do ii = 1,npixels + boutarray(ii) = char(ii * 3 -3) + ioutarray(ii) = ii * 3 -3 + joutarray(ii) = ii * 3 -3 + koutarray(ii) = ii * 3 -3 + eoutarray(ii) = ii * 3 -3 + doutarray(ii) = ii * 3 -3 + end do + + do ii = 2,5 +C loop over cols 2 - 5 + + call ftpclb(iunit, ii, 1, 1, 2, boutarray, status) + call ftpcli(iunit, ii, 3, 1, 2,ioutarray(3),status) + call ftpclj(iunit, ii, 5, 1, 2,joutarray(5),status) + call ftpcle(iunit, ii, 7, 1, 2,eoutarray(7),status) + call ftpcld(iunit, ii, 9, 1, 2,doutarray(9),status) + end do + write(*,'(1x,A,I4)') 'ftpcl status = ', status + +C read back the pixels with each datatype + call ftgcvb(iunit, 2, 1, 1, 10, bnul, binarray,anynull, + & status) + call ftgcvi(iunit, 2, 1, 1, 10, inul, iinarray,anynull, + & status) + call ftgcvj(iunit, 3, 1, 1, 10, knul, kinarray,anynull, + & status) + call ftgcvj(iunit, 3, 1, 1, 10, jnul, jinarray,anynull, + & status) + call ftgcve(iunit, 4, 1, 1, 10, enul, einarray,anynull, + & status) + call ftgcvd(iunit, 5, 1, 1, 10, dnul, dinarray,anynull, + & status) + + write(*,'(1x,A)') + &'Column values written with ftpcl and read with ftgcl: ' + npixels = 10 + do ii = 1,npixels + joutarray(ii) = ichar(binarray(ii)) + end do + write(*,1601)(joutarray(ii),ii = 1, npixels),anynull,'(byte) ' + write(*,1601)(iinarray(ii),ii = 1, npixels),anynull,'(short) ' + write(*,1601)(kinarray(ii),ii = 1, npixels),anynull,'(int) ' + write(*,1601)(jinarray(ii),ii = 1, npixels),anynull,'(long) ' + write(*,1602)(einarray(ii),ii = 1, npixels),anynull,'(float) ' + write(*,1602)(dinarray(ii),ii = 1, npixels),anynull,'(double) ' +1601 format(1x,10i3,l3,1x,a) +1602 format(2x,10f3.0,l2,1x,a) + +C ########################################################### +C # perform stress test by cycling thru all the extensions # +C ########################################################### + write(*,'(1x,A)')' ' + write(*,'(1x,A)')'Repeatedly move to the 1st 4 HDUs of the file: ' + + do ii = 1,10 + call ftmahd(iunit, 1, hdutype, status) + call ftghdn(iunit, hdunum) + call ftmrhd(iunit, 1, hdutype, status) + call ftghdn(iunit, hdunum) + call ftmrhd(iunit, 1, hdutype, status) + call ftghdn(iunit, hdunum) + call ftmrhd(iunit, 1, hdutype, status) + call ftghdn(iunit, hdunum) + call ftmrhd(iunit, -1, hdutype, status) + call ftghdn(iunit, hdunum) + if (status .gt. 0) go to 999 + end do + + write(*,'(1x,A)') ' ' + + checksum = 1234567890.D+00 + call ftesum(checksum, .false., asciisum) + write(*,'(1x,A,F13.1,2A)')'Encode checksum: ',checksum,' -> ', + & asciisum + checksum = 0 + call ftdsum(asciisum, 0, checksum) + write(*,'(1x,3A,F13.1)') 'Decode checksum: ',asciisum,' -> ', + & checksum + + call ftpcks(iunit, status) + +C don't print the CHECKSUM value because it is different every day +C because the current date is in the comment field. + + call ftgcrd(iunit, 'CHECKSUM', card, status) +C write(*,'(1x,A)') card + + call ftgcrd(iunit, 'DATASUM', card, status) + write(*,'(1x,A)') card(1:22) + + call ftgcks(iunit, datsum, checksum, status) + write(*,'(1x,A,F13.1,I4)') 'ftgcks data checksum, status = ', + & datsum, status + + call ftvcks(iunit, datastatus, hdustatus, status) + write(*,'(1x,A,3I4)')'ftvcks datastatus, hdustatus, status = ', + & datastatus, hdustatus, status + + call ftprec(iunit, + & 'new_key = ''written by fxprec'' / to change checksum',status) + call ftucks(iunit, status) + write(*,'(1x,A,I4)') 'ftupck status = ', status + + call ftgcrd(iunit, 'DATASUM', card, status) + write(*,'(1x,A)') card(1:22) + call ftvcks(iunit, datastatus, hdustatus, status) + write(*,'(1x,A,3I4)') 'ftvcks datastatus, hdustatus, status = ', + & datastatus, hdustatus, status + +C delete the checksum keywords, so that the FITS file is always +C the same, regardless of the date of when testprog is run. + + call ftdkey(iunit, 'CHECKSUM', status) + call ftdkey(iunit, 'DATASUM', status) + + +C ############################ +C # close file and quit # +C ############################ + + +999 continue +C jump here on error + + call ftclos(iunit, status) + write(*,'(1x,A,I4)') 'ftclos status = ', status + write(*,'(1x,A)')' ' + + write(*,'(1x,A)') + & 'Normally, there should be 8 error messages on the' + write(*,'(1x,A)') 'stack all regarding ''numerical overflows'':' + + call ftgmsg(errmsg) + nmsg = 0 + +998 continue + if (errmsg .ne. ' ')then + write(*,'(1x,A)') errmsg + nmsg = nmsg + 1 + call ftgmsg(errmsg) + go to 998 + end if + + if (nmsg .ne. 8)write(*,'(1x,A)') + & ' WARNING: Did not find the expected 8 error messages!' + + call ftgerr(status, errmsg) + write(*,'(1x,A)')' ' + write(*,'(1x,A,I4,2A)') 'Status =', status,': ', errmsg(1:50) + end |