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))