示例#1
0
def make_regions(filename="OMC1_TSPEC_H2S1_cube.fits"):

    header = fits.getheader(filename)

    with open("outflow_traces_pixels.reg", "w") as f:
        print >> f, 'global color=white dashlist=8 3 width=1 font="helvetica 14 bold roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1'
        print >> f, "image"
        for ii, (ex, ey) in enumerate(outflow_endpoints):
            print >> f, "line(%i,%i,%i,%i)" % (sourceI[0], sourceI[1], ex, ey)
            print >> f, " # text(%f,%f) text={%i}" % (ex, ey, ii)

    w = wcs.WCS(cubes.flatten_header(header))

    with open("outflow_traces_fk5.reg", "w") as f:
        print >> f, 'global color=white dashlist=8 3 width=1 font="helvetica 14 bold roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1'
        print >> f, "fk5"
        raI, decI = w.wcs_pix2world(np.array([sourceI], dtype="float"), 1)[0]
        for ii, (ex, ey) in enumerate(outflow_endpoints):
            ra, dec = w.wcs_pix2world(np.array([[ex, ey]], dtype="float"), 1)[0]
            print >> f, "line(%f,%f,%f,%f)" % (raI, decI, ra, dec)
            print >> f, " # text(%f,%f) text={%i}" % (ra, dec, ii)
                       s.attr[1]['color'] == color])
    F.show_lines([coords.T], color=color)

F.add_scalebar(((10*u.pc)/(5.1*u.kpc)*u.radian).to(u.deg).value)
F.scalebar.set_label("10 pc")
F.scalebar.set_color((0.8,0.3,0.01,0.9))
F.scalebar.set_linewidth(3)

F.save(figpath+'W51_PVDiagrams_PVmap.pdf')

############################
# New stuff added 12/12/2013
############################

co32 = fits.open(datapath+'w51_bieging_13co32.fits')
cohdr = flatten_header(co32[0].header)
co_45to55 = co32[0].data[31:51,:,:].sum(axis=0)
co_55to60 = co32[0].data[51:61,:,:].sum(axis=0)
co_60to65 = co32[0].data[61:71,:,:].sum(axis=0)
co_65to75 = co32[0].data[71:91,:,:].sum(axis=0)

F.show_contour(fits.PrimaryHDU(co_45to55, cohdr), levels=[15,55,85,500],
               filled=True,
               colors=[(0,0.5,0.5,0.3),(0,0.5,0.5,0.4),(0,0.5,0.5,0.5)])
F.save(figpath+'w51_bgpsgrayscale_cooverlay_45to55.png')
for L in F._layers.keys():
    if 'contour' in L:
        F.remove_layer(L)

F.show_contour(fits.PrimaryHDU(co_55to60, cohdr), levels=[15,55,85,500],
               filled=True, colors=[(0,0,1,0.2),(0,0,1,0.3),(0,0,1,0.4)])
def fit_powerspectra(fn,
                     psdsize=32,
                     nanthreshold=0.05,
                     doplot=False,
                     dowait=False,
                     largescalecutoff=250,
                     fwhm=33,
                     subdir='/powerspectra/'):
    data = pyfits.getdata(fn)
    header = pyfits.getheader(fn)
    wcs = pywcs.WCS(cubes.flatten_header(header), )
    savdir = os.path.split(fn)[0] + subdir
    savname = os.path.split(fn)[1]

    if data.shape[0] < psdsize or data.shape[1] < psdsize: return

    lmin, bmin = wcs.wcs_pix2sky(0., 0., 0)
    lmax, bmax = wcs.wcs_pix2sky(data.shape[1], data.shape[0], 0)
    if hasattr(wcs.wcs, 'cd'): cdelt = wcs.wcs.cd[1, 1]
    else: cdelt = wcs.wcs.cdelt[1]

    if lmin > lmax: lmin, lmax = lmax, lmin
    if bmin > bmax: bmin, bmax = bmax, bmin

    lonlength_pix = (lmax - lmin) / cdelt
    latlength_pix = (bmax - bmin) / cdelt

    number_lon = np.floor(lonlength_pix[0] / psdsize)
    number_lat = np.floor(latlength_pix[0] / psdsize)
    modulus_lon = data.shape[1] % psdsize
    modulus_lat = data.shape[0] % psdsize

    powerlaw_fit_grid = np.zeros([number_lat, number_lon])
    angle_grid = np.zeros([3, number_lat, number_lon])
    powerspec_grid = np.zeros(
        [np.round((psdsize - 1.0) / np.sqrt(2)) + 1, number_lat, number_lon])
    anglespec_grid = np.zeros([12, number_lat, number_lon])

    nskips = 0
    for ll in range(number_lon):
        for bb in range(number_lat):
            bcen = bmin + (modulus_lat / 2. + psdsize / 2 +
                           psdsize * bb) * cdelt
            lcen = lmin + (modulus_lon / 2. + psdsize / 2 +
                           psdsize * ll) * cdelt
            lcen_pix, bcen_pix = wcs.wcs_sky2pix(lcen, bcen, 0)
            lcen_pix = np.round(lcen_pix)[0]
            bcen_pix = np.round(bcen_pix)[0]

            subimage = data[bcen_pix - psdsize / 2:bcen_pix + psdsize / 2,
                            lcen_pix - psdsize / 2:lcen_pix + psdsize / 2]

            if (subimage.shape[0] > 0 and subimage.shape[1] > 0):
                subimage2 = np.zeros([psdsize, psdsize]) + np.nan
                subimage2[:subimage.shape[0], :subimage.shape[1]] = subimage
                subimage = subimage2

            if np.isnan(subimage).sum() / float(psdsize**2) > nanthreshold:
                print "Skipping position %f,%f because nan %% = %5.1f" % (
                    lcen, bcen,
                    np.isnan(subimage).sum() / float(psdsize**2) * 100.0)
                nskips += 1
                continue
            if subimage.shape[0] != subimage.shape[1] or subimage.shape[
                    0] == 0 or subimage.shape[1] == 0:
                print "Skipping position %f,%f because image dimensions are asymmetric." % (
                    lcen, bcen)
                nskips += 1
                continue

            #print "Computing PSD.  np.nansum(subimage) = %g" % np.nansum(subimage)
            rr, zz = psds.power_spectrum(subimage)
            rr_as = (cdelt * 3600.) / rr
            OK = rr_as < largescalecutoff

            (scale1, scale2, breakpoint, pow1,
             pow2), mpf = powerfit.brokenpowerfit(rr[OK],
                                                  zz[OK],
                                                  breakpoint=0.23,
                                                  alphaguess1=-2.0,
                                                  alphaguess2=0.0,
                                                  scaleguess=np.median(zz))
            params = mpf.params
            perror = mpf.perror

            rmax = np.min([(rr_as < fwhm).argmax(),
                           (rr > breakpoint).argmax()])
            rmin = np.max([2, (rr_as > largescalecutoff).argmax()])
            az, zaz = psds.power_spectrum(subimage - subimage.mean(),
                                          radial=True,
                                          radbins=np.array([rmin, rmax]),
                                          binsize=30.0)

            mpangle = sinfit(az, zaz)
            angle_grid[:, bb, number_lon - 1 - ll] = mpangle.params
            anglespec_grid[:, bb, number_lon - 1 - ll] = zaz

            powerlaw_fit_grid[bb, number_lon - 1 - ll] = pow1
            powerspec_grid[:, bb, number_lon - 1 - ll] = zz
            print "Position %7.3g,%7.3g has mean %8.2g and fit parameters %8.2g,%8.2g,%8.2g,%8.2g,%8.2g and angles %8.2g,%8.2g,%8.2g" % (
                lcen, bcen, subimage.mean(), scale1, scale2, breakpoint, pow1,
                pow2, mpangle.params[0], mpangle.params[1], mpangle.params[2])
            #print "                                            %5.2g,%5.2g,%5.2g,%5.2g,%5.2g" % (perror[0],perror[0],perror[1],perror[2],perror[3])

            if doplot:
                pylab.figure(1)
                pylab.clf()
                pylab.loglog(rr, zz, 'gray')
                pylab.loglog(rr[OK], zz[OK], 'k')
                pylab.plot(
                    rr,
                    scale1 * rr**pow1 * (rr < breakpoint) + scale2 * rr**pow2 *
                    (rr >= breakpoint))
                pylab.annotate("p1 =    %8.3f" % pow1, [0.75, 0.85],
                               xycoords='figure fraction')
                pylab.annotate("p2 =    %8.3f" % pow2, [0.75, 0.80],
                               xycoords='figure fraction')
                pylab.annotate("break = %8.3f" % breakpoint, [0.75, 0.75],
                               xycoords='figure fraction')
                pylab.draw()
                if dowait: raw_input("WAIT")

    if ll == 0 and bb == 0: return
    if nskips >= number_lat * number_lon: return

    bcen = bmin + (modulus_lat / 2. + psdsize / 2) * cdelt
    lcen = lmin + (modulus_lon / 2. + psdsize / 2) * cdelt
    new_cdelt = cdelt * psdsize
    header.update('CD1_1', -1 * new_cdelt)
    header.update('CD2_2', new_cdelt)
    header.update('CRPIX1', number_lon)
    header.update('CRPIX2', 1.0)
    #lcen,bcen = wcs.wcs_pix2sky(np.floor(number_lon)/2.*psdsize,np.floor(number_lat)/2.*psdsize,1)
    header.update('CRVAL1', lcen[0])
    header.update('CRVAL2', bcen[0])

    newHDU_powerfit = pyfits.PrimaryHDU(powerlaw_fit_grid, header=header)
    newHDU_powerfit.writeto(savdir + savname +
                            "_powerlaw_fit_grid_%i.fits" % psdsize,
                            clobber=True)
    newHDU_powerfit = pyfits.PrimaryHDU(angle_grid, header=header)
    newHDU_powerfit.writeto(savdir + savname +
                            "_angle_fit_grid_%i.fits" % psdsize,
                            clobber=True)

    header.update('CD3_3', np.median(rr[1:] - rr[:-1]))
    header.update('CRVAL3', rr[0])
    header.update('CRPIX3', 1.0)
    header.update('CUNIT3', 'Jy^2')
    header.update('CTYPE3', 'PowerSpec')
    newHDU = pyfits.PrimaryHDU(powerspec_grid, header=header)
    newHDU.writeto(savdir + savname + "_powerspec_grid_%i.fits" % psdsize,
                   clobber=True)

    header.update('CD3_3', np.median(az[1:] - az[:-1]))
    header.update('CRVAL3', az[0])
    header.update('CUNIT3', 'Jy^2')
    header.update('CTYPE3', 'AngularPowerSpec')
    newHDU_powerfit = pyfits.PrimaryHDU(anglespec_grid, header=header)
    newHDU_powerfit.writeto(savdir + savname +
                            "_anglespec_grid_%i.fits" % psdsize,
                            clobber=True)

    fig = pylab.figure(2)
    pylab.clf()
    pylab.spectral()
    ax = pylab.subplot(121)
    pylab.imshow(np.arcsinh(data))
    #pylab.imshow(np.log10(data-np.nanmin(data)+1),vmin=-1,vmax=1)
    ax.xaxis.set_major_locator(OffsetMultipleLocator(psdsize,
                                                     modulus_lon / 2.))
    ax.yaxis.set_major_locator(OffsetMultipleLocator(psdsize,
                                                     modulus_lat / 2.))
    ax.xaxis.grid(True, 'major')
    ax.yaxis.grid(True, 'major')
    pylab.subplot(122)
    pylab.imshow(powerlaw_fit_grid,
                 vmin=-7,
                 vmax=0,
                 extent=[
                     0, powerlaw_fit_grid.shape[1] * psdsize, 0,
                     powerlaw_fit_grid.shape[0] * psdsize
                 ])
    cax = pylab.axes([0.9225, 0.1, 0.020, 0.80], axisbg='w', frameon=False)
    pylab.colorbar(cax=cax)
    pylab.savefig(savdir + savname + "_powerlaw_fit_grid_%i.png" % (psdsize))