Source code for FITS_tools.fits_overlap
import numpy as np
try:
import astropy.io.fits as pyfits
import astropy.wcs as pywcs
except ImportError:
import pyfits
import pywcs
[docs]def fits_overlap(file1,file2,**kwargs):
"""
Create a header containing the exact overlap region between two .fits files
Does NOT check to make sure the FITS files are in the same coordinate system!
Parameters
----------
file1,file2 : str,str
files from which to extract header strings
"""
hdr1 = pyfits.getheader(file1)
hdr2 = pyfits.getheader(file2)
return header_overlap(hdr1,hdr2,**kwargs)
[docs]def header_overlap(hdr1,hdr2,max_separation=180,overlap="union"):
"""
Create a header containing the exact overlap region between two .fits files
Does NOT check to make sure the FITS files are in the same coordinate system!
Parameters
----------
hdr1,hdr2 : `~astropy.io.fits.Header`
Two pyfits headers to compare
max_separation : int
Maximum number of degrees between two headers to consider before flipping
signs on one of them (this to deal with the longitude=0 region)
overlap : 'union' or 'intersection'
Which merger to do
"""
wcs1 = pywcs.WCS(hdr1).sub([pywcs.WCSSUB_CELESTIAL])
wcs2 = pywcs.WCS(hdr2).sub([pywcs.WCSSUB_CELESTIAL])
((xmax1,ymax1),) = wcs1.wcs_pix2world([[hdr1['NAXIS1'],hdr1['NAXIS2']]],1)
((xmax2,ymax2),) = wcs2.wcs_pix2world([[hdr2['NAXIS1'],hdr2['NAXIS2']]],1)
((xmin1,ymin1),) = wcs1.wcs_pix2world([[1,1]],1)
((xmin2,ymin2),) = wcs2.wcs_pix2world([[1,1]],1)
# make sure the edges are all in the same quadrant-ish
xmlist = [xm - 360 if xm > max_separation else
xm + 360 if xm < -max_separation else xm
for xm in (xmin1,xmax1,xmin2,xmax2)]
xmin1,xmax1,xmin2,xmax2 = xmlist
# check signs
if xmin2 > xmax2:
xmax2,xmin2 = xmin2,xmax2
if xmin1 > xmax1:
xmax1,xmin1 = xmin1,xmax1
if ymin2 > ymax2:
ymax2,ymin2 = ymin2,ymax2
if ymin1 > ymax1:
ymax1,ymin1 = ymin1,ymax1
if overlap=='union':
xmin = min(xmin1,xmin2)
xmax = max(xmax1,xmax2)
ymin = min(ymin1,ymin2)
ymax = max(ymax1,ymax2)
elif overlap=='intersection':
xmin = max(xmin1,xmin2)
xmax = min(xmax1,xmax2)
ymin = max(ymin1,ymin2)
ymax = min(ymax1,ymax2)
else:
raise ValueError("Overlap must be 'union' or 'intersection'")
try:
cdelt1,cdelt2 = np.abs(np.vstack([wcs1.wcs.cd.diagonal(), wcs2.wcs.cd.diagonal()])).min(axis=0) * np.sign(wcs1.wcs.cd).diagonal()
except AttributeError:
cdelt1,cdelt2 = np.abs(np.vstack([wcs1.wcs.cdelt, wcs2.wcs.cdelt])).min(axis=0) * np.sign(wcs1.wcs.cdelt)
# no overlap at all
if ((xmin1 > xmax2) or (xmin2 > xmax1)):
naxis1 = 0
else:
naxis1 = int(np.ceil(np.abs((xmax-xmin)/cdelt1)))
if ymin1 > ymax2 or ymin2 > ymax1:
naxis2 = 0
else:
naxis2 = int(np.ceil(np.abs((ymax-ymin)/cdelt2)))
crval1 = (xmin+xmax)/2.
crval2 = (ymin+ymax)/2.
crpix1 = naxis1/2.
crpix2 = naxis2/2.
# may want to change this later...
new_header = hdr1.copy()
new_header['CRVAL1'] = crval1
new_header['CRVAL2'] = crval2
new_header['CDELT1'] = cdelt1
new_header['CDELT2'] = cdelt2
for i,j in [(1, 1), (1, 2), (2, 1), (2, 2)]:
k = 'CD%i_%i' % (i,j)
if k in new_header:
del new_header[k]
new_header['NAXIS1'] = naxis1
new_header['NAXIS2'] = naxis2
new_header['CRPIX1'] = crpix1
new_header['CRPIX2'] = crpix2
return new_header