Program dat2fits_binary call go end subroutine usage implicit none print *, & 'Converts a CMBfast test file (or mangle healpix_weight file)', & ' into a fits file' c print *, 'COMPILE: a f 'f77 dat2fits_binary.f -o dat2fits_binary.x libcfitsio.a' print *, & 'USAGE: call dat2fits_binary.x ' print *, & 'EXAMPLE: call dat2fits_binary.x 1 512 qaz_map_data.dat', & ' mytest.fits' return end !======================================================================= subroutine go !======================================================================= implicit none integer polar_type, nmap, nside, npix, nnpix integer nlheader, i, j parameter(nnpix=12*1024**2, nlheader=80) real map(0:nnpix,4) character*80 header(nlheader), infile, outfile, card c ---------------------------------------------------------------- c get the arguments c ---------------------------------------------------------------- open (2,file='args.dat',status='old',err=777) read (2,*,err=777,end=777) polar_type, nside, infile, outfile close(2) npix = 12*nside**2 if (npix.gt.nnpix) pause 'npix TOO LARGE' if (polar_type.eq.1) then nmap = 1 else nmap = 4 endif write(*,*) 'Polar_Type____', polar_type write(*,*) 'nmap__________', nmap write(*,*) 'Nside_________', nside write(*,*) 'Npix__________', npix write(*,*) 'Infile________', infile (1:lnblnk( infile)) write(*,*) 'Outfile_______', outfile(1:lnblnk(outfile)) c ---------------------------------------------------------------- c loading the ascii file c ---------------------------------------------------------------- print *, 'Loading ', infile(1:lnblnk(infile)) open (2,file=infile) do i=0,npix-1 read (2,*) (map(i,j),j=1,nmap) enddo close(2) c ---------------------------------------------------------------- c writing the header c ---------------------------------------------------------------- do i=1,nlheader header(i) = ' ' enddo call a_add_card(header,'COMMENT','---------------------','') call a_add_card(header,'COMMENT',' Sky Map Keywords ','') call a_add_card(header,'COMMENT','---------------------','') call a_add_card & (header,'PIXTYPE' ,'HEALPIX','HEALPIX Pixelisation' ) call a_add_card & (header,'ORDERING','NESTED' ,'Pixel ordering scheme' ) call i_add_card & (header,'NSIDE' ,nside ,'Resolution for HEALPIX' ) call i_add_card & (header,'FIRSTPIX',0 ,'First pixel # (0 based)') call i_add_card & (header,'LASTPIX' ,npix-1 ,'Last pixel # (0 based)') call v_add_card(header) call a_add_card(header,'COMMENT','----------------','') call a_add_card(header,'COMMENT',' Data Keywords ','') call a_add_card(header,'COMMENT','----------------','') call a_add_card & (header,'TTYPE1', 'TEMPERATURE','Temperature map') call a_add_card(header,'TUNIT1', 'unknown','map unit') call v_add_card(header) if (polar_type.ne.1) then call a_add_card & (header,'TTYPE2', 'Q-POLARIZATION','Q Polar map') call a_add_card & (header,'TUNIT2', 'unknown','map unit') call v_add_card(header) call a_add_card & (header,'TTYPE3', 'U-POLARIZATION','U Polar map') call a_add_card & (header,'TUNIT3', 'unknown','map unit') call v_add_card(header) endif c nlheader = SIZE(header) c print *, 'Writing Header' c call headerLine('COMMENT ------------------',hd(1)) c call headerLine('COMMENT = Healpix' ,hd(2)) c call headerLine('COMMENT ------------------',hd(3)) c call headerLine('PIXTYPE = HEALPIX',hd(4)) c call headerLine('ORDERING = NESTED' ,hd(5)) c call headerLine(card,hd(6)) c write (card,'("NSIDE",i8," /Resolution for HEALPIX")') nside c call headerLine(card,hd(7)) c write (card,'("FIRSTPIX",i8," /First pixel")') 0 c call headerLine(card,hd(8)) c write (card,'("LASTPIX" ,i16," /Last pixel")') npix-1 c call headerLine('COMMENT ------------------',hd(9)) c call headerLine('COMMENT = Data Description',hd(10)) c call headerLine('COMMENT ------------------',hd(11)) c call headerLine('TTYPE1 = TEMPERATURE',hd(12)) c call headerLine('TUNIT1 = unknown' ,hd(13)) c nh = 13 c if (polar_type.ne.1) then c call headerLine('TTYPE2 = Q-POLARIZATION',hd(14)) c call headerLine('TUNIT2 = unknown' ,hd(15)) c call headerLine('TTYPE3 = U-POLARIZATION',hd(16)) c call headerLine('TUNIT3 = unknown' ,hd(17)) c nh = 17 c endif do i=1,nlheader print *, header(i) enddo print *, 'Saving file' call write_bintab (map,npix,nmap,header,nlheader,outfile) return 777 call usage end SUBROUTINE a_add_card(header, kwd, value, comment) ! character CHARACTER*(*) value CHARACTER*80 header CHARACTER*(*) kwd CHARACTER*(*) comment CHARACTER*240 st_value, st_comment st_value = '' st_comment = '' write(st_value, '(a)') value write(st_comment,'(a)') comment call write_hl(header, kwd, st_value, st_comment) RETURN END SUBROUTINE v_add_card(header) ! blank line CHARACTER*80 header call write_hl(header, 'COMMENT', ' ', ' ') END SUBROUTINE i_add_card(header, kwd, value, comment) ! integer (i*4) INTEGER value CHARACTER*80 header CHARACTER*(*) kwd CHARACTER*(*) comment CHARACTER*20 st_value write(st_value,'(i20)') value call write_hl(header, kwd, st_value, comment) RETURN END SUBROUTINE write_hl(header, kwd, st_value, comment) IMPLICIT none CHARACTER*80 header(80) CHARACTER*(*) kwd CHARACTER*(*) comment CHARACTER*(*) st_value INTEGER hdtype, status INTEGER iw, lnblnk CHARACTER*240 headerline CHARACTER*80 buffheader CHARACTER*10 pad10 iw = 1 do while(header(iw) /= '') iw = iw + 1 enddo pad10='' buffheader ='' headerline = kwd (1:lnblnk(kwd)) //' '// & st_value(1:lnblnk(st_value))//' '// & comment (1:lnblnk(comment)) if (headerline .eq. 'COMMENT') then ! COMMENT alone header(iw) = 'COMMENT' iw = iw + 1 RETURN endif hdtype = 0 status = 0 CALL ftgthd(headerline(1:79), buffheader, hdtype, status) header(iw) = buffheader if (len_trim(headerline) > 79) then status = 0 CALL ftgthd(pad10//headerline(80:149), & buffheader, hdtype, status) iw = iw + 1 header(iw) = buffheader endif if (len_trim(headerline) > 149) then status = 0 CALL ftgthd(pad10//headerline(150:219), & buffheader, hdtype, status) iw = iw + 1 header(iw) = buffheader endif if (len_trim(headerline) > 219) then status = 0 CALL ftgthd(pad10//headerline(220:240), & buffheader, hdtype, status) iw = iw + 1 header(iw) = buffheader endif iw = iw + 1 RETURN END !======================================================================= subroutine write_bintab (map,npix,nmap,header,nlheader,filename) !======================================================================= ! Create a FITS file containing a binary table extension with ! the temperature map in the first column ! written by EH from writeimage and writebintable ! (fitsio cookbook package) ! ! slightly modified to deal with vector column (ie TFORMi = '1024E') ! in binary table EH/IAP/Jan-98 ! ! simplified the calling sequence, the header sould be filled in ! before calling the routine !======================================================================= IMPLICIT none INTEGER npix, nmap, nlheader REAL map(0:npix-1,1:nmap) CHARACTER*80 header(1:nlheader) CHARACTER*(*) filename INTEGER status,unit,blocksize,bitpix,naxis,naxes(1) INTEGER group,fpixel,nelements,i LOGICAL simple,extend CHARACTER*80 svalue, comment REAL*8 bscale,bzero INTEGER maxdim !number of columns in the extension PARAMETER (maxdim = 20) INTEGER nrows, tfields, varidat INTEGER frow, felem, colnum CHARACTER*20 ttype(maxdim), tform(maxdim), tunit(maxdim), extname CHARACTER*8 date CHARACTER*10 fulldate CHARACTER*10 card CHARACTER*2 stn INTEGER itn !----------------------------------------------------------------------- status= 0 unit = 100 ! ---------------------- ! create the new empty FITS file ! ---------------------- blocksize=1 call ftinit(unit,filename,blocksize,status) ! ---------------------- ! initialize parameters about the FITS image ! ---------------------- simple =.true. bitpix =32 ! integer*4 naxis =0 ! no image naxes(1)=0 extend =.true. ! there is an extension ! ---------------------- ! primary header ! ---------------------- ! write the required header keywords call ftphpr &(unit,simple,bitpix,naxis,naxes,0,1,extend,status) ! writes supplementary keywords : none ! write the current date call ftpdat(unit,status) ! format (dd/mm/yy) ! update the date (format ccyy-mm-dd) call date_and_time(date) fulldate = date(1:4)//'-'//date(5:6)//'-'//date(7:8) comment = 'FITS file creation date ccyy-mm-dd' call ftukys(unit,'DATE',fulldate,comment,status) ! ---------------------- ! image : none ! ---------------------- ! ---------------------- ! extension ! ---------------------- ! creates an extension call ftcrhd(unit, status) ! writes required keywords nrows = npix / 1024 ! naxis1 tfields = nmap do i=1,nmap tform(i) = '1024E' if (npix .lt. 1024) then ! for nside <= 8 nrows = npix tform(i) = '1E' endif ttype(i) = 'simulation' ! will be updated tunit(i) = '' ! optional, will not appear enddo extname = '' ! optional, will not appear varidat = 0 call ftphbn &(unit,nrows,tfields,ttype,tform,tunit,extname,varidat,status) ! write the header literally, putting TFORM1 at the desired place do i=1,nlheader card = header(i) if (card(1:5) == 'TTYPE') then ! if TTYPE1 is explicitely given stn = card(6:6) read(stn,'(i1)') itn ! discard at their original location: call ftmcrd(unit,'TTYPE'//stn,'COMMENT',status) ! old TTYPEi and call ftmcrd(unit,'TFORM'//stn,'COMMENT',status) ! TFORMi call ftprec(unit,header(i), status) ! write new TTYPE1 comment = 'data format of field: 4-byte REAL' call ftpkys(unit,'TFORM'//stn,tform(1),comment,status) ! and write new TFORM1 right after elseif (header(i).NE.' ') then call ftprec(unit,header(i), status) endif 10 continue enddo ! write the extension one column by one column frow = 1 ! starting position (row) felem = 1 ! starting position (element) do colnum = 1, nmap call ftpcle & (unit,colnum,frow,felem,npix,map(0,colnum),status) enddo ! ---------------------- ! close and exit ! ---------------------- call ftclos(unit, status) ! ---------------------- ! check for any error, and if so print out error messages ! ---------------------- if (status .gt. 0) call printerror(status) return end subroutine printerror(status) !======================================================================= ! Print out the FITSIO error messages to the user !======================================================================= implicit none INTEGER status CHARACTER*30 errtext CHARACTER*80 errmessage !----------------------------------------------------------------------- ! check if status is OK (no error); if so, simply return if (status .le. 0)return ! get the text string which describes the error call ftgerr(status,errtext) print *,'FITSIO Error Status =',status,': ',errtext ! read and print out all the error messages on the FITSIO stack call ftgmsg(errmessage) do while (errmessage .ne. ' ') print *,errmessage call ftgmsg(errmessage) end do open(unit = 20, file = "dat2fitserr.temp") write(20,*) status close(20) return end c -------------------------------------------------------------------- c return formatted header line c -------------------------------------------------------------------- subroutine headerLine(line,hdLine) implicit none integer hdtype,status character*(*) line character*80 hdLine hdtype=0 status=0 call ftgthd(line,hdLine,hdtype,status) if (status.gt.0) call errorMessage(status) end c -------------------------------------------------------------------- c print error message and stop c -------------------------------------------------------------------- subroutine errorMessage(status) implicit none integer status character*30 errmsg call ftgerr(status,errmsg) print '("FITS error ",i3,": ",a)', status,errmsg stop end