def plot_cutout(img_path, coord, size, savefile):
    fl = fits.open(img_path)
    img = fl[0].data
    wcs = WCS(fl[0].header).celestial
    cutout = Cutout2D(img, coord, size, wcs)

    fig = plt.figure(figsize=(10, 10))
    ax = fig.add_axes([0.15, 0.1, 0.8, 0.8], projection=wcs)
    ra = ax.coords['ra']
    ra.set_major_formatter('hh:mm:ss.s')
    dec = ax.coords['dec']
    dec.set_major_formatter('dd:mm:ss.s')
    ra.ticklabels.set_fontsize(18)
    dec.ticklabels.set_fontsize(18)

    plt.imshow(cutout.data,
               transform=ax.get_transform(wcs),
               norm=asinh_norm.AsinhNorm())
    plt.colorbar()

    plt.savefig(f'/home/jotter/nrao/plots/IR_cutouts/{savefile}', dpi=400)
    plt.close()
def inset_overlays(fn,
                   zoomregions,
                   fignum=1,
                   psffn=None,
                   vmin=-0.001,
                   vmax=0.01,
                   bottomleft=coordinates.SkyCoord(83.81108398,
                                                   -5.375862222,
                                                   unit=(u.deg, u.deg),
                                                   frame='fk5'),
                   topright=coordinates.SkyCoord(83.81019142,
                                                 -5.374623875,
                                                 unit=(u.deg, u.deg),
                                                 frame='fk5'),
                   tick_fontsize=pl.rcParams['axes.labelsize']):

    print(fn)
    hdu = fits.open(fn)[0]

    mywcs = wcs.WCS(hdu.header).celestial

    figure = pl.figure(fignum)
    figure.clf()
    ax = figure.add_axes([0.15, 0.1, 0.8, 0.8], projection=mywcs)

    ra = ax.coords['ra']
    ra.set_major_formatter('hh:mm:ss.s')
    dec = ax.coords['dec']
    ra.set_axislabel("RA (ICRS)", fontsize=pl.rcParams['axes.labelsize'])
    dec.set_axislabel("Dec (ICRS)",
                      fontsize=pl.rcParams['axes.labelsize'],
                      minpad=0.0)
    ra.ticklabels.set_fontsize(tick_fontsize)
    ra.set_ticks(exclude_overlapping=True)
    dec.ticklabels.set_fontsize(tick_fontsize)
    dec.set_ticks(exclude_overlapping=True)

    im = ax.imshow(hdu.data.squeeze() * 1e3,
                   transform=ax.get_transform(mywcs),
                   vmin=vmin * 1e3,
                   vmax=vmax * 1e3,
                   cmap=pl.cm.gray_r,
                   interpolation='nearest',
                   origin='lower',
                   norm=asinh_norm.AsinhNorm())

    (x1, y1), (x2, y2) = (mywcs.wcs_world2pix(
        [[bottomleft.icrs.ra.deg, bottomleft.icrs.dec.deg]], 0)[0],
                          mywcs.wcs_world2pix(
                              [[topright.icrs.ra.deg, topright.icrs.dec.deg]],
                              0)[0])

    # we'll want this later
    #make_scalebar(ax, scalebarpos,
    #              length=(0.5*u.pc / distance).to(u.arcsec,
    #                                              u.dimensionless_angles()),
    #              color='k',
    #              label='0.5 pc',
    #              text_offset=1.0*u.arcsec,
    #             )

    ax.set_aspect(1)
    ax.axis([x1, x2, y1, y2])

    for zoomregion in zoomregions:

        ZR = zoomregions[zoomregion]

        parent_ax = zoomregions[
            ZR['inset_axes']]['axins'] if 'inset_axes' in ZR else ax

        bl, tr = ZR['bottomleft'], ZR['topright'],
        (zx1, zy1), (zx2,
                     zy2) = (mywcs.wcs_world2pix([[bl.ra.deg, bl.dec.deg]],
                                                 0)[0],
                             mywcs.wcs_world2pix([[tr.ra.deg, tr.dec.deg]],
                                                 0)[0])
        print(zoomregion, zx1, zy1, zx2, zy2)

        inset_data = hdu.data.squeeze()[int(zy1):int(zy2), int(zx1):int(zx2)]
        #inset_data = hdu.data.squeeze()
        inset_wcs = mywcs.celestial[int(zy1):int(zy2), int(zx1):int(zx2)]
        #inset_wcs = mywcs

        axins = zoomed_inset_axes(
            parent_ax,
            zoom=ZR['zoom'],
            loc=ZR['loc'],
            bbox_to_anchor=ZR['bbox'],
            bbox_transform=figure.transFigure,
            axes_class=astropy.visualization.wcsaxes.core.WCSAxes,
            axes_kwargs=dict(wcs=inset_wcs))
        ZR['axins'] = axins
        imz = axins.imshow(
            inset_data,
            #transform=parent_ax.get_transform(inset_wcs),
            extent=[int(zx1), int(zx2), int(zy1),
                    int(zy2)],
            vmin=ZR['min'],
            vmax=ZR['max'],
            cmap=pl.cm.gray_r,
            interpolation='nearest',
            origin='lower',
            norm=asinh_norm.AsinhNorm())

        ax.axis([x1, x2, y1, y2])
        #axins.axis([zx1,zx2,zy1,zy2])
        #print(axins.axis())

        axins.set_xticklabels([])
        axins.set_yticklabels([])

        lon = axins.coords['ra']
        lat = axins.coords['dec']
        lon.set_ticklabel_visible(False)
        lat.set_ticklabel_visible(False)
        lon.set_ticks_visible(False)
        lat.set_ticks_visible(False)

        # draw a bbox of the region of the inset axes in the parent axes and
        # connecting lines between the bbox and the inset axes area
        mark_inset(parent_axes=parent_ax,
                   inset_axes=axins,
                   loc1=ZR['l1'],
                   loc2=ZR['l2'],
                   fc="none",
                   ec="0.5",
                   lw=0.5)

        figure.canvas.draw()
        assert np.abs(ax.bbox._bbox.x1 - 0.95) > 1e-4

    cax = figure.add_axes([
        ax.bbox._bbox.x1 + 0.01, ax.bbox._bbox.y0, 0.02,
        ax.bbox._bbox.y1 - ax.bbox._bbox.y0
    ])
    cb = figure.colorbar(mappable=im, cax=cax)
    #print("1. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))
    cb.set_label("$S_{1 mm}$ [mJy beam$^{-1}$]")
    #print("2. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))
    cb.formatter.format = "%3.1f"
    #print("3. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))
    cb.set_ticks(cb.formatter.locs)
    #print("4. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))
    cb.set_ticklabels(["{0:3.1f}".format(float(x)) for x in cb.formatter.locs])
    #print("5. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))
    cb.ax.set_yticklabels([
        "{0:3.1f}".format(float(x.get_text()))
        for x in cb.ax.get_yticklabels()
    ])
    #print("6. cb labels: {0}".format([x.get_text() for x in cb.ax.get_yticklabels()]))

    if psffn is not None:
        psf = fits.open(psffn)
        psfwcs = wcs.WCS(psf[0].header)
        cx, cy = psfwcs.celestial.wcs_world2pix(psf_center.ra.deg,
                                                psf_center.dec.deg, 0)
        cx = int(cx)
        cy = int(cy)

        dpix = 50 if 'B6' in psffn else 25

        zy1 = cy - dpix
        zy2 = cy + dpix
        zx1 = cx - dpix
        zx2 = cx + dpix

        inset_wcs = psfwcs.celestial[zy1:zy2, zx1:zx2]
        inset_data = psf[0].data[cy - dpix:cy + dpix, cx - dpix:cx + dpix]

        axins = zoomed_inset_axes(
            parent_ax,
            zoom=zoom,
            loc=3,  # 3: lower left
            bbox_to_anchor=(0.08, 0.00),
            bbox_transform=figure.transFigure,
            axes_class=astropy.visualization.wcsaxes.core.WCSAxes,
            axes_kwargs=dict(wcs=inset_wcs),
        )
        imz = axins.imshow(inset_data,
                           extent=[int(zx1),
                                   int(zx2),
                                   int(zy1),
                                   int(zy2)],
                           vmin=0,
                           vmax=1,
                           cmap=pl.cm.gray_r,
                           interpolation='nearest',
                           origin='lower',
                           norm=asinh_norm.AsinhNorm())
        axins.contour(
            np.linspace(zx1, zx2, inset_data.shape[1]),
            np.linspace(zy1, zy2, inset_data.shape[0]),
            inset_data,
            levels=[0.05, 0.1, 0.2, 0.3],
            linewidths=[0.3] * 10,
            alpha=0.75,
            #colors=['r']*10,
        )
        axins.set_xticks([])
        axins.set_yticks([])
        axins.set_xticklabels([])
        axins.set_yticklabels([])
        lon = axins.coords['ra']
        lat = axins.coords['dec']
        lon.set_ticklabel_visible(False)
        lat.set_ticklabel_visible(False)
        lon.set_ticks_visible(False)
        lat.set_ticks_visible(False)

    return figure
        dec.set_axislabel("Dec (J2000)",
                          fontsize=pl.rcParams['axes.labelsize'],
                          minpad=0.0)
        ra.ticklabels.set_fontsize(tick_fontsize)
        ra.set_ticks(exclude_overlapping=True)
        dec.ticklabels.set_fontsize(tick_fontsize)
        dec.set_ticks(exclude_overlapping=True)

        im = ax.imshow(hdu_line.data.squeeze() * 1e3,
                       transform=ax.get_transform(toplevel_wcs),
                       vmin=vmin_hi[line],
                       vmax=vmax_hi[line],
                       cmap=pl.cm.gray_r,
                       interpolation='nearest',
                       origin='lower',
                       norm=asinh_norm.AsinhNorm())
        tr_fk5 = ax.get_transform("fk5")
        #(x1,y1),(x2,y2) = (1200,434),(2142,1743)
        # wrong (x1,y1),(x2,y2) = tr_fk5.transform_point([bottomleft.ra.deg, bottomleft.dec.deg]),tr_fk5.transform_point([topright.ra.deg, topright.dec.deg])
        (x1, y1), (x2, y2) = (toplevel_wcs.wcs_world2pix(
            [[bottomleft.ra.deg, bottomleft.dec.deg]], 0)[0],
                              toplevel_wcs.wcs_world2pix(
                                  [[topright.ra.deg, topright.dec.deg]], 0)[0])

        make_scalebar(
            ax,
            scalebarpos,
            length=(0.5 * u.pc / distance).to(u.arcsec,
                                              u.dimensionless_angles()),
            color='k',
            label='0.5 pc',
    ra.set_ticks(exclude_overlapping=True)
    dec.ticklabels.set_fontsize(tick_fontsize)
    dec.set_ticks(exclude_overlapping=True)

    # manual normalization...
    data = hdu.data.squeeze()*1e3
    #data[data<1.5] = 0
    #data[data>4000] = 4000
    #ldata = np.log10(data)

    im = ax.imshow(data,
                   transform=ax.get_transform(mywcs),
                   cmap=pl.cm.gray_r,
                   origin='lower',
                   interpolation='nearest',
                   vmin=vmin, vmax=vmax, norm=asinh_norm.AsinhNorm(),
                   #matplotlib.colors.LogNorm(),
                  )
    cont = ax.contour(data, transform=ax.get_transform(mywcs),
                      colors=['w']*10,
                      levels=np.linspace(vmax, truemax, 5),
                     )
    tr_fk5 = ax.get_transform("fk5")
    #(x1,y1),(x2,y2) = (1200,434),(2142,1743)
    # wrong (x1,y1),(x2,y2) = tr_fk5.transform_point([bottomleft.ra.deg, bottomleft.dec.deg]),tr_fk5.transform_point([topright.ra.deg, topright.dec.deg])
    bottomleft = coordinates.SkyCoord("17:47:36.2", "-28:27:00.0", unit=(u.h, u.deg), frame='fk5')
    topright = coordinates.SkyCoord("17:47:03.1", "-28:20:00.0", unit=(u.h, u.deg), frame='fk5')
    (x1,y1),(x2,y2) = (mywcs.wcs_world2pix([[bottomleft.ra.deg,
                                             bottomleft.dec.deg]],0)[0],
                       mywcs.wcs_world2pix([[topright.ra.deg,
                                             topright.dec.deg]],0)[0]
示例#5
0
# define field zoom region for the large-scale field
field_corners = {'fullfield':
                 {'bottomleft': coordinates.SkyCoord("5:38:48.102",
                                                     "-7:10:34.015",
                                                     unit=(u.h, u.deg),
                                                     frame='fk5'),
                  'topright': coordinates.SkyCoord("5:33:12.020",
                                                   "-4:49:59.662",
                                                   unit=(u.h, u.deg),
                                                   frame='fk5'),
                 }
                }

# define colormaps & norms
cmaps = {'fullfield': pl.cm.gray_r}
norms = {'fullfield': asinh_norm.AsinhNorm()}

# define colorbar labels (i.e., units)
cb_labels = {'12CO': "$T_B$ [K]"}
             # or something like: "$S_{3 mm}$ [mJy beam$^{-1}$]"}


# Loop over the large-scale regions, one figure per region
for regionname in ('fullfield', ):

    legloc = leglocs[regionname]
    leg_bbox = legbboxes[regionname]

    for line in ("12CO",):

        hdu_line = fits.open(filenames[line])[0]
TR_pix = mywcs.all_world2pix(83.805*u.degree, -5.3715*u.degree, 0)
cut_img = img[:int(TR_pix[1]), :int(TR_pix[0])]

fig = plt.figure(figsize=(10,10))
ax = fig.add_axes([0.15,0.1,0.8,0.8],projection=mywcs)
ra = ax.coords['ra']
ra.set_major_formatter('hh:mm:ss.s')
#ra.set_major_formatter('d.ddd')
dec = ax.coords['dec']
dec.set_major_formatter('dd:mm:ss.s')
#dec.set_major_formatter('d.ddd')
ra.ticklabels.set_fontsize(18)
dec.ticklabels.set_fontsize(18)

ax.imshow(cut_img, origin='lower', transform=ax.get_transform(mywcs), norm=asinh_norm.AsinhNorm(), vmin=-0.001, vmax=0.005)

E18_pix = mywcs.all_world2pix(E18_table['RA']*u.degree, E18_table['DEC']*u.degree, 0)
B3_pix = mywcs.all_world2pix(B3_table['RA_B3']*u.degree, B3_table['DEC_B3']*u.degree, 0)

for ind in range(len(B3_pix[0])):
    if B3_pix[0][ind] < TR_pix[0] and B3_pix[1][ind] < TR_pix[1]:
        circ = Circle((B3_pix[0][ind], B3_pix[1][ind]), radius=100, fill=False, color='red')
        ax.add_patch(circ)
        #ax.text(B3_pix[0][ind]-1, B3_pix[1][ind]+3, B3_table['D_ID'][ind], color='red')

for ind in range(len(E18_pix[0])):
    circ = Circle((E18_pix[0][ind], E18_pix[1][ind]), radius=110, fill=False, color='orange')
    ax.add_patch(circ)

#ax.axis([0,len(img),0,len(img)])