def render_chem(yth2co321=yth2co321, yth2co303=yth2co303, ytsio=ytsio, outdir='yt_renders_chem3', size=512, scale=1100., nframes=60, north_vector=[1,0,0], rot_vector=[1,0,0], movie=True, camera_angle=[-0.6, 0.4, 0.6]): if not os.path.exists(paths.mpath(outdir)): os.makedirs(paths.mpath(outdir)) tf1 = yt.ColorTransferFunction([0.1,2], grey_opacity=True) #tf1.add_gaussian(0.1,0.05, [1,0,0,1]) #tf1.map_to_colormap(0, 0.5, scale=1, colormap='Reds') tf1.add_gaussian(0.25, 0.01, [1,0,0,1]) tf1.add_step(0.25,0.5,[1,0,0,1]) #tf1.add_step(1,2,[1,1,1,1]) tf1.map_to_colormap(0.5,2,scale=1,colormap=red) tf2 = yt.ColorTransferFunction([0.1,2], grey_opacity=True) #tf2.add_gaussian(0.1,0.05, [0,1,0,1]) #tf2.map_to_colormap(0, 0.5, scale=1, colormap='Greens') tf2.add_gaussian(0.25, 0.01, [0,1,0,1]) tf2.add_step(0.25,0.5,[0,1,0,1]) tf2.map_to_colormap(0.5,2,scale=1,colormap=green) tf3 = yt.ColorTransferFunction([0.1,2], grey_opacity=True) #tf3.add_gaussian(0.1,0.05, [0,0,1,1]) #tf3.map_to_colormap(0, 0.5, scale=1, colormap='Blues') tf3.add_gaussian(0.25, 0.01, [0,0,1,1]) tf3.add_step(0.25,0.5,[0,0,1,1]) tf3.map_to_colormap(0.5,2,scale=1,colormap=blue) center = yth2co303.dataset.domain_dimensions /2. camh2co303 = yth2co303.dataset.h.camera(center, camera_angle, scale, size, tf3, north_vector=north_vector, fields='flux') camh2co321 = yth2co321.dataset.h.camera(center, camera_angle, scale, size, tf2, north_vector=north_vector, fields='flux') camsio = ytsio.dataset.h.camera(center, camera_angle, scale, size, tf1, north_vector=north_vector, fields='flux') imh2co303 = camh2co303.snapshot() imh2co321 = camh2co321.snapshot() imsio = camsio.snapshot() pl.figure(1) pl.clf() pl.imshow(imh2co303+imh2co321+imsio) pl.figure(2) pl.clf() pl.imshow(imh2co303[:,:,:3]+imh2co321[:,:,:3]+imsio[:,:,:3]) if movie: images_h2co303 = [imh2co303] images_h2co321 = [imh2co321] images_sio = [imsio] r1 = camh2co303.rotation(2 * np.pi, nframes, rot_vector=rot_vector) r2 = camh2co321.rotation(2 * np.pi, nframes, rot_vector=rot_vector) r3 = camsio.rotation(2 * np.pi, nframes, rot_vector=rot_vector) pb = ProgressBar(nframes * 3) for (ii,(imh2co303,imh2co321,imsio)) in enumerate(izip(r1, r2, r3)): images_h2co303.append(imh2co303) images_h2co321.append(imh2co321) images_sio.append(imsio) imh2co303=imh2co303.swapaxes(0,1) imh2co303.write_png(paths.mpath(os.path.join(outdir,"h2co303_%04i.png" % (ii))), rescale=False) pb.update(ii*3) imsio=imsio.swapaxes(0,1) imsio.write_png(paths.mpath(os.path.join(outdir,"sio_%04i.png" % (ii))), rescale=False) pb.update(ii*3+1) imh2co321=imh2co321.swapaxes(0,1) imh2co321.write_png(paths.mpath(os.path.join(outdir,"h2co321_%04i.png" % (ii))), rescale=False) pb.update(ii*3+2) pb.next() save_images([i1+i2+i3 for i1,i2,i3 in izip(images_h2co303, images_h2co321, images_sio)], paths.mpath(outdir)) make_movie(paths.mpath(outdir)) return images_h2co303,images_h2co321,images_sio else: return imh2co303,imh2co321,imsio
import os red = pl.mpl.colors.LinearSegmentedColormap('red', {'red':[(0,1,1),(1,1,1)], 'green':[(0,0,0),(1,1,1)], 'blue':[(0,0,0),(1,1,1)]}) green = pl.mpl.colors.LinearSegmentedColormap('green', {'red':[(0,0,0),(1,1,1)], 'green':[(0,1,1),(1,1,1)], 'blue':[(0,0,0),(1,1,1)]}) blue = pl.mpl.colors.LinearSegmentedColormap('blue', {'red':[(0,0,0),(1,1,1)], 'green':[(0,0,0),(1,1,1)], 'blue':[(0,1,1),(1,1,1)]}) if 'yt13co' not in locals(): cube13co = spectral_cube.SpectralCube.read(paths.mpath('APEX_13CO_2014_merge.fits')) yt13co = cube13co.with_mask(cube13co>0.1).to_yt() mask = cube13co>0.2 if 'cube_h2co303' not in locals(): cube_sio = SpectralCube.read(paths.molpath('APEX_SiO_54_bl.fits')) # HACK: mask._wcs = cube_sio.wcs ytsio = cube_sio.with_mask(mask).to_yt() cube_h2co303 = SpectralCube.read(paths.molpath('APEX_H2CO_303_202_bl.fits')) mask._wcs = cube_h2co303.wcs yth2co303 = cube_h2co303.with_mask(mask).to_yt() cube_h2co321 = SpectralCube.read(paths.molpath('APEX_H2CO_321_220_bl.fits')) mask._wcs = cube_h2co321.wcs yth2co321 = cube_h2co321.with_mask(mask).to_yt()
def render_13co(ytcube=yt13co, outdir='yt_renders_13CO', size=512, scale=1200., nframes=180, movie=True, camera_angle=[0, 0, 1], north_vector = [1, 0, 0], rot_vector1=[1,0,0], rot_vector2=[0.5,0.5,0.0], rot_vector3=[0.0,0.5,0.5], ): if not os.path.exists(paths.mpath(outdir)): os.makedirs(paths.mpath(outdir)) tf = yt.ColorTransferFunction([0,30], grey_opacity=True) #tf.map_to_colormap(0.1,5,colormap='Reds') tf.add_gaussian(2, 1, [1.0, 0.8, 0.0, 1.0]) tf.add_gaussian(3, 2, [1.0, 0.5, 0.0, 1.0]) tf.add_gaussian(5, 3, [1.0, 0.0, 0.0, 1.0]) tf.add_gaussian(10, 5, [1.0, 0.0, 0.0, 0.5]) tf.map_to_colormap(10, 30, colormap=red, scale=1) center = ytcube.dataset.domain_dimensions /2. cam = ytcube.dataset.h.camera(center, camera_angle, scale, size, tf, north_vector=north_vector, fields='flux') im = cam.snapshot() #images = [im] if movie: pb = ProgressBar(nframes*2+30) for ii,im in enumerate(cam.rotation(2 * np.pi, nframes/3, rot_vector=rot_vector1)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii))), rescale=False) pb.update(ii) for jj,im in enumerate(cam.rotation(2 * np.pi, nframes/3, rot_vector=rot_vector2)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii+jj))), rescale=False) pb.update(ii+jj) for kk,im in enumerate(cam.rotation(2 * np.pi, nframes/3, rot_vector=rot_vector3)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii+jj+kk))), rescale=False) pb.update(ii+jj+kk) TheBrick = ytcube.world2yt([0.253, 0.016, 35]) for LL, snapshot in enumerate(cam.move_to(TheBrick, 15)): #images.append(snapshot) snapshot.write_png(paths.mpath(os.path.join(outdir,'%04i.png' % (ii+jj+kk+LL))), rescale=False) pb.update(ii+jj+kk+LL) for mm, snapshot in enumerate(cam.zoomin(5, 15)): #images.append(snapshot) snapshot.write_png(paths.mpath(os.path.join(outdir,'%04i.png' % (ii+jj+kk+LL+mm))), rescale=False) pb.update(ii+jj+kk+LL+mm) for nn,im in enumerate(cam.rotation(2*np.pi, nframes/3, rot_vector=rot_vector1)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii+jj+kk+LL+mm+nn))), rescale=False) pb.update(ii+jj+kk+LL+mm+nn) for oo,im in enumerate(cam.rotation(2 * np.pi, nframes/3, rot_vector=rot_vector2)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii+jj+kk+LL+mm+nn+oo))), rescale=False) pb.update(ii+jj+kk+LL+mm+nn+oo) for pp,im in enumerate(cam.rotation(2 * np.pi, nframes/3, rot_vector=rot_vector3)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir,"%04i.png" % (ii+jj+kk+LL+mm+nn+oo+pp))), rescale=False) pb.update(ii+jj+kk+LL+mm+nn+oo+pp) #save_images(images, paths.mpath(outdir)) pipe = make_movie(paths.mpath(outdir)) return images else: return im
from astropy.io import fits from matplotlib import cm import aplpy import paths # create "coverage" mask map covgf = fits.open(paths.mpath('APEX_H2CO_merge_high_nhits.fits')) covgf[0].data = (covgf[0].data > 0.05).astype('int') covgf.writeto(paths.mpath('coverage_bool.fits'),clobber=True) F = aplpy.FITSFigure('/Users/adam/Dropbox/SMA_CMZ_FITS_files/gcmosaic_column_conv25.fits',convention='calabretta') F.show_colorscale(cmap=cm.hot_r,vmax=100,vmin=0, vmid=-2.5, stretch='log') F.recenter(0.6,-0.1,height=0.5,width=2.6) F.show_contour(paths.mpath('coverage_bool.fits'),levels=[0.5], colors=['b'], convention='calabretta') F.set_tick_labels_xformat('d.dd') F.set_tick_labels_yformat('d.dd') F.save(paths.fpath('coverage_on_herschel.png'),dpi=150) F.save(paths.fpath('coverage_on_herschel.pdf'),dpi=150) F.remove_layer('contour_set_1') F.show_contour(paths.molpath('APEX_H2CO_303_202_smooth_bl_mask_integ.fits'), levels=[5,10,20,50], colors=['b'], convention='calabretta') F.save(paths.fpath('H2CO_on_herschel.png'),dpi=150) F.save(paths.fpath('H2CO_on_herschel.pdf'),dpi=150) F.remove_layer('contour_set_2') F.show_contour(paths.molpath('APEX_SiO_54_smooth_mask_integ.fits'), levels=[2,5,10], colors=['g'], convention='calabretta') F.save(paths.fpath('SiO_on_herschel.png'),dpi=150) F.save(paths.fpath('SiO_on_herschel.pdf'),dpi=150) F.remove_layer('contour_set_3') F.show_contour(paths.molpath('APEX_13CO_smooth_mask_integ.fits'),
from astropy.io import fits from matplotlib import cm import aplpy import paths # create "coverage" mask map covgf = fits.open(paths.mpath('APEX_H2CO_merge_high_nhits.fits')) covgf[0].data = (covgf[0].data > 0.05).astype('int') covgf.writeto(paths.mpath('coverage_bool.fits'), clobber=True) F = aplpy.FITSFigure( '/Users/adam/Dropbox/SMA_CMZ_FITS_files/gcmosaic_column_conv25.fits', convention='calabretta') F.show_colorscale(cmap=cm.hot_r, vmax=100, vmin=0, vmid=-2.5, stretch='log') F.recenter(0.6, -0.1, height=0.5, width=2.6) F.show_contour(paths.mpath('coverage_bool.fits'), levels=[0.5], colors=['b'], convention='calabretta') F.set_tick_labels_xformat('d.dd') F.set_tick_labels_yformat('d.dd') F.save(paths.fpath('coverage_on_herschel.png'), dpi=150) F.save(paths.fpath('coverage_on_herschel.pdf'), dpi=150) F.remove_layer('contour_set_1') F.show_contour(paths.molpath('APEX_H2CO_303_202_smooth_bl_mask_integ.fits'), levels=[5, 10, 20, 50], colors=['b'], convention='calabretta') F.save(paths.fpath('H2CO_on_herschel.png'), dpi=150) F.save(paths.fpath('H2CO_on_herschel.pdf'), dpi=150) F.remove_layer('contour_set_2')
def render_chem(yth2co321=yth2co321, yth2co303=yth2co303, ytsio=ytsio, outdir='yt_renders_chem3', size=512, scale=1100., nframes=60, north_vector=[1, 0, 0], rot_vector=[1, 0, 0], movie=True, camera_angle=[-0.6, 0.4, 0.6]): if not os.path.exists(paths.mpath(outdir)): os.makedirs(paths.mpath(outdir)) tf1 = yt.ColorTransferFunction([0.1, 2], grey_opacity=True) #tf1.add_gaussian(0.1,0.05, [1,0,0,1]) #tf1.map_to_colormap(0, 0.5, scale=1, colormap='Reds') tf1.add_gaussian(0.25, 0.01, [1, 0, 0, 1]) tf1.add_step(0.25, 0.5, [1, 0, 0, 1]) #tf1.add_step(1,2,[1,1,1,1]) tf1.map_to_colormap(0.5, 2, scale=1, colormap=red) tf2 = yt.ColorTransferFunction([0.1, 2], grey_opacity=True) #tf2.add_gaussian(0.1,0.05, [0,1,0,1]) #tf2.map_to_colormap(0, 0.5, scale=1, colormap='Greens') tf2.add_gaussian(0.25, 0.01, [0, 1, 0, 1]) tf2.add_step(0.25, 0.5, [0, 1, 0, 1]) tf2.map_to_colormap(0.5, 2, scale=1, colormap=green) tf3 = yt.ColorTransferFunction([0.1, 2], grey_opacity=True) #tf3.add_gaussian(0.1,0.05, [0,0,1,1]) #tf3.map_to_colormap(0, 0.5, scale=1, colormap='Blues') tf3.add_gaussian(0.25, 0.01, [0, 0, 1, 1]) tf3.add_step(0.25, 0.5, [0, 0, 1, 1]) tf3.map_to_colormap(0.5, 2, scale=1, colormap=blue) center = yth2co303.dataset.domain_dimensions / 2. camh2co303 = yth2co303.dataset.h.camera(center, camera_angle, scale, size, tf3, north_vector=north_vector, fields='flux') camh2co321 = yth2co321.dataset.h.camera(center, camera_angle, scale, size, tf2, north_vector=north_vector, fields='flux') camsio = ytsio.dataset.h.camera(center, camera_angle, scale, size, tf1, north_vector=north_vector, fields='flux') imh2co303 = camh2co303.snapshot() imh2co321 = camh2co321.snapshot() imsio = camsio.snapshot() pl.figure(1) pl.clf() pl.imshow(imh2co303 + imh2co321 + imsio) pl.figure(2) pl.clf() pl.imshow(imh2co303[:, :, :3] + imh2co321[:, :, :3] + imsio[:, :, :3]) if movie: images_h2co303 = [imh2co303] images_h2co321 = [imh2co321] images_sio = [imsio] r1 = camh2co303.rotation(2 * np.pi, nframes, rot_vector=rot_vector) r2 = camh2co321.rotation(2 * np.pi, nframes, rot_vector=rot_vector) r3 = camsio.rotation(2 * np.pi, nframes, rot_vector=rot_vector) pb = ProgressBar(nframes * 3) for (ii, (imh2co303, imh2co321, imsio)) in enumerate(izip(r1, r2, r3)): images_h2co303.append(imh2co303) images_h2co321.append(imh2co321) images_sio.append(imsio) imh2co303 = imh2co303.swapaxes(0, 1) imh2co303.write_png(paths.mpath( os.path.join(outdir, "h2co303_%04i.png" % (ii))), rescale=False) pb.update(ii * 3) imsio = imsio.swapaxes(0, 1) imsio.write_png(paths.mpath( os.path.join(outdir, "sio_%04i.png" % (ii))), rescale=False) pb.update(ii * 3 + 1) imh2co321 = imh2co321.swapaxes(0, 1) imh2co321.write_png(paths.mpath( os.path.join(outdir, "h2co321_%04i.png" % (ii))), rescale=False) pb.update(ii * 3 + 2) pb.next() save_images([ i1 + i2 + i3 for i1, i2, i3 in izip(images_h2co303, images_h2co321, images_sio) ], paths.mpath(outdir)) make_movie(paths.mpath(outdir)) return images_h2co303, images_h2co321, images_sio else: return imh2co303, imh2co321, imsio
from make_apex_cubes import all_lines from spectral_cube import SpectralCube,BooleanArrayMask import pyspeckit from astropy.io import fits from numpy.lib.stride_tricks import as_strided from paths import mpath import numpy as np import time from astropy import log from astropy import constants from astropy import units as u cube_merge_high = SpectralCube.read(mpath('APEX_H2CO_merge_high_plait_all.fits')) noise = fits.getdata(mpath('APEX_H2CO_merge_high_plait_all_noise.fits')) nhits = fits.getdata(mpath('APEX_H2CO_merge_high_nhits.fits')) noise[nhits<5] = np.nan noise_cube = as_strided(noise, shape=cube_merge_high.shape, strides=(0,)+noise.strides) noise_spcube = SpectralCube(data=noise_cube, wcs=cube_merge_high.wcs) cube_merge_high_sm = SpectralCube.read(mpath('APEX_H2CO_merge_high_plait_all_smooth.fits')) noise_sm = fits.getdata(mpath('APEX_H2CO_merge_high_plait_all_smooth_noise.fits')) noise_cube_sm = as_strided(noise_sm, shape=cube_merge_high_sm.shape, strides=(0,)+noise_sm.strides) noise_spcube_sm = SpectralCube(data=noise_cube_sm, wcs=cube_merge_high_sm.wcs) # Create a cutout of the cube covering the H2CO lines # it's barely worth it; cuts off 10% of pixels f1 = all_lines['H2CO_303_202']*u.GHz f2 = all_lines['H2CO_321_220']*u.GHz h2co_cube_merge_high = cube_merge_high.spectral_slab(f1*(1-(150*u.km/u.s/constants.c)),
and all_lines[line]*u.GHz < fullcube.spectral_axis.max()/1.0005 } spectra = {line: pyspeckit.Spectrum(data=cube.apply_numpy_function(np.nanmean, axis=(1,2)), xarr=pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_units='Hz'), header=cube.wcs.to_header()) for line,cube in cubes.iteritems()} return cubes,spectra for lh in ('low','high'): # reject < 217 GHz cube = SpectralCube.read(mpath(ftemplate.format(lh))).spectral_slab(217*u.GHz, 250*u.GHz) noisehdu = cube.std(axis=0).hdu noisehdr = noisehdu.header noise = noisehdu.data noiseokmask = np.isfinite(noise) xarr = pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_units='Hz') spectra = {} for region_number,reg in enumerate(regs): name = reg.attr[1]['text'] print name if name not in spectra:
import numpy as np from astropy import units as u from astropy import constants from astropy.table import Table import paths import pyspeckit import glob import matplotlib matplotlib.use('Qt4Agg') import os import pylab as pl tbl = Table.read(paths.mpath('diffuse_lines_mainonly.ipac'), format='ascii.ipac') rfreq = tbl['FreqGHz'] rfreq[rfreq.mask] = tbl['MeasFreqGHz'][rfreq.mask] freq = rfreq * (1-65*u.km/u.s/constants.c) for fn in glob.glob(paths.spath("*.fits")): sp = pyspeckit.Spectrum(fn) sp.xarr.convert_to_unit('GHz') sp.plotter(figure=pl.figure(1), clear=True) sp.plotter.line_ids(tbl['Species'], freq*u.GHz, unit='GHz') outname = os.path.splitext(os.path.split(fn)[1])[0] sp.plotter.savefig(paths.sppath("{0}.png".format(outname))) """ import paths import pyspeckit
with open(regpath + 'spectral_ncomp.txt') as f: pars = eval(f.read()) ftemplate = 'APEX_H2CO_2014_merge_{0}.fits' # Nice idea, but Splatalogue doesn't know what lines are really there #line_table = Splatalogue.query_lines(216.9*u.GHz, # 221*u.GHz, top20='top20', # energy_max=150, energy_type='eu_k', # line_lists=['SLAIM']) #names = np.array(['{0}_{1}'.format(a,b) for a,b in zip(line_table['Species'], # line_table['Resolved QNs'])]) #lfreq = line_table['Freq-GHz'] for lh in ('low', 'high'): cube = SpectralCube.read(mpath(ftemplate.format(lh))) noisehdu = cube.std(axis=0).hdu noisehdr = noisehdu.header noise = noisehdu.data noiseokmask = np.isfinite(noise) xarr = pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_unit='Hz') spectra = {} for region_number, reg in enumerate(regs): name = reg.attr[1]['text'] print name if name not in spectra:
from paths import rpath,mpath,opath,fpath from astropy.io import fits import pyregion import numpy as np from astropy import table import paths import matplotlib matplotlib.rc_file(paths.pcpath('pubfiguresrc')) noise_img = fits.open(mpath('APEX_H2CO_merge_high_plait_all_noise.fits'))[0] nhits_img = fits.open(mpath('APEX_H2CO_merge_high_plait_all_nhits.fits'))[0] map_regions = pyregion.open(rpath('target_fields_8x8.reg')) nhits = {} noise = {} for reg in map_regions: regs = pyregion.ShapeList([reg]) mask = (regs.get_mask(hdu=noise_img) & np.isfinite(noise_img.data) & np.isfinite(nhits_img.data)) name = reg.attr[1]['text'].split()[0] noise[name] = {'mean':noise_img.data[mask].mean(), 'median':np.median(noise_img.data[mask]), 'std':noise_img.data[mask].std()} nhits[name] = {'mean':nhits_img.data[mask].mean(), 'median':np.median(nhits_img.data[mask]), 'std':nhits_img.data[mask].std()}
and all_lines[line]*u.GHz < fullcube.spectral_axis.max()/1.0005 } spectra = {line: pyspeckit.Spectrum(data=cube.apply_numpy_function(np.nanmean, axis=(1,2)), xarr=pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_unit='Hz'), header=cube.wcs.to_header()) for line,cube in cubes.items()} return cubes,spectra for lh in ('low','high'): # reject < 217 GHz cube = SpectralCube.read(mpath(ftemplate.format(lh))).spectral_slab(217*u.GHz, 250*u.GHz) noisehdu = cube.std(axis=0).hdu noisehdr = noisehdu.header noise = noisehdu.data noiseokmask = np.isfinite(noise) xarr = pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_unit='Hz') spectra = {} for region_number,reg in enumerate(regs): name = reg.attr[1]['text'] print name if name not in spectra:
def fit_a_spectrum(sp, radexfit=False, write=True, vlimits=(-105, 125), pars=pars): sp.plotter.autorefresh = False sp.plotter(figure=1) ncomp = pars[sp.specname]['ncomp'] if ncomp == 0: log.info( "Skipping {0} - no velocity components detected.".format(ncomp)) return returns = [ncomp] velos = pars[sp.specname]['velo'] spname = sp.specname.replace(" ", "_") width_min = 1 if 'width_max' in pars[sp.specname]: width_max = pars[sp.specname]['width_max'] elif 'Map' in sp.specname or 'box' in sp.specname: width_max = 40 else: width_max = 15 sp.specfit.Registry.add_fitter('h2co_simple', simple_fitter2, 6, multisingle='multi') guesses_simple = [ x for ii in range(ncomp) for x in (sp.data.max(), velos[ii], 5, 0.5, 1.0, sp.data.max()) ] if not (min(velos) > vlimits[0] and max(velos) < vlimits[1]): log.warn("A velocity guess {0} is outside limits {1}.".format( velos, vlimits)) vlimits = (min(velos) - 25, max(velos) + 25) log.warn("Changing limits to {0}".format(vlimits)) sp.specfit( fittype='h2co_simple', multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 20), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) sp.baseline(excludefit=True, subtract=True, highlight_fitregion=True, order=1) sp.plotter(clear=True) sp.specfit( fittype='h2co_simple', multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 20), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) returns.append(copy.copy(sp.specfit.parinfo)) err = sp.error.mean() sp.plotter() sp.specfit.plot_fit(show_components=True) sp.specfit.annotate(fontsize=font_sizes[ncomp]) sp.specfit.plotresiduals(axis=sp.plotter.axis, yoffset=-err * 5, clear=False, color='#444444', label=False) sp.plotter.axis.set_ylim(sp.plotter.ymin - err * 5, sp.plotter.ymax) sp.plotter.savefig( os.path.join(figurepath, "simple/{0}_fit_4_lines_simple.pdf".format(spname))) if write: sp.write(mpath("spectra/{0}_spectrum.fits".format(spname))) # This will mess things up for the radexfit (maybe in a good way) but *cannot* # be done after the radexfit # Set the spectrum to be the fit residuals. The linear baseline has # already been subtracted from both the data and the residuals linear_baseline = sp.baseline.basespec sp.baseline.unsubtract() fitted_residuals = sp.baseline.spectofit = sp.specfit.residuals sp.baseline.includemask[:] = True # Select ALL residuals sp.baseline.fit(spline=True, order=3, spline_sampling=50) spline_baseline = sp.baseline.basespec sp.data -= spline_baseline + linear_baseline sp.baseline.subtracted = True sp.error[:] = sp.stats((218.5e9, 218.65e9))['std'] sp.specfit( fittype='h2co_simple', multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 1e5), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) sp.plotter() sp.plotter.axis.plot(sp.xarr, spline_baseline - err * 5, color='orange', alpha=0.75, zorder=-1, linewidth=2) sp.specfit.plot_fit(show_components=True) sp.specfit.annotate(fontsize=font_sizes[ncomp]) sp.plotter.axis.plot(sp.xarr, fitted_residuals - err * 5, color="#444444", linewidth=0.5, drawstyle='steps-mid') #sp.specfit.plotresiduals(axis=sp.plotter.axis, yoffset=-err*5, clear=False, # color='#444444', label=False) sp.plotter.axis.set_ylim(sp.plotter.ymin - err * 5, sp.plotter.ymax) sp.plotter.savefig( os.path.join( figurepath, "simple/{0}_fit_4_lines_simple_splinebaselined.pdf".format( spname))) returns.append(copy.copy(sp.specfit.parinfo)) if write: sp.write(mpath("spectra/{0}_spectrum_basesplined.fits".format(spname))) if radexfit: guesses = [ x for ii in range(ncomp) for x in (100, 14, 4.5, sp.specfit.parinfo['VELOCITY{0}'.format(ii)].value, (sp.specfit.parinfo['WIDTH{0}'.format(ii)].value if (sp.specfit.parinfo['WIDTH{0}'.format(ii)].value < width_max and sp.specfit.parinfo['WIDTH{0}'.format(ii)].value > width_min ) else 5)) ] sp.specfit.Registry.add_fitter('h2co_mm_radex', h2co_radex_fitter, 5, multisingle='multi') sp.specfit( fittype='h2co_mm_radex', multifit=True, guesses=guesses, limits=[(10, 300), (11, 15), (3, 5.5), (-105, 125), (width_min, width_max)] * ncomp, limited=[(True, True)] * 5 * ncomp, fixed=[False, False, False, True, True] * ncomp, quiet=False, ) sp.plotter.savefig( os.path.join(figurepath, "radex/{0}_fit_h2co_mm_radex.pdf".format(spname))) returns.append(copy.copy(sp.specfit.parinfo)) return returns
def fit_a_spectrum(sp, radexfit=False, write=True, vlimits=(-105, 125), pars=pars): sp.plotter.autorefresh = False sp.plotter(figure=1) ncomp = pars[sp.specname]["ncomp"] if ncomp == 0: log.info("Skipping {0} - no velocity components detected.".format(ncomp)) return returns = [ncomp] velos = pars[sp.specname]["velo"] spname = sp.specname.replace(" ", "_") width_min = 1 if "width_max" in pars[sp.specname]: width_max = pars[sp.specname]["width_max"] elif "Map" in sp.specname or "box" in sp.specname: width_max = 40 else: width_max = 15 sp.specfit.Registry.add_fitter("h2co_simple", simple_fitter2, 6, multisingle="multi") guesses_simple = [x for ii in range(ncomp) for x in (sp.data.max(), velos[ii], 5, 0.5, 1.0, sp.data.max())] if not (min(velos) > vlimits[0] and max(velos) < vlimits[1]): log.warn("A velocity guess {0} is outside limits {1}.".format(velos, vlimits)) vlimits = (min(velos) - 25, max(velos) + 25) log.warn("Changing limits to {0}".format(vlimits)) sp.specfit( fittype="h2co_simple", multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 20), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) sp.baseline(excludefit=True, subtract=True, highlight_fitregion=True, order=1) sp.plotter(clear=True) sp.specfit( fittype="h2co_simple", multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 20), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) returns.append(copy.copy(sp.specfit.parinfo)) err = sp.error.mean() sp.plotter() sp.specfit.plot_fit(show_components=True) sp.specfit.annotate(fontsize=font_sizes[ncomp]) sp.specfit.plotresiduals(axis=sp.plotter.axis, yoffset=-err * 5, clear=False, color="#444444", label=False) sp.plotter.axis.set_ylim(sp.plotter.ymin - err * 5, sp.plotter.ymax) sp.plotter.savefig(os.path.join(figurepath, "simple/{0}_fit_4_lines_simple.pdf".format(spname))) if write: sp.write(mpath("spectra/{0}_spectrum.fits".format(spname))) # This will mess things up for the radexfit (maybe in a good way) but *cannot* # be done after the radexfit # Set the spectrum to be the fit residuals. The linear baseline has # already been subtracted from both the data and the residuals linear_baseline = sp.baseline.basespec sp.baseline.unsubtract() fitted_residuals = sp.baseline.spectofit = sp.specfit.residuals sp.baseline.includemask[:] = True # Select ALL residuals sp.baseline.fit(spline=True, order=3, spline_sampling=50) spline_baseline = sp.baseline.basespec sp.data -= spline_baseline + linear_baseline sp.baseline.subtracted = True sp.error[:] = sp.stats((218.5e9, 218.65e9))["std"] sp.specfit( fittype="h2co_simple", multifit=True, guesses=guesses_simple, limited=[(True, True)] * 6, limits=[(0, 1e5), vlimits, (width_min, width_max), (0, 1), (0.3, 1.1), (0, 1e5)], ) sp.plotter() sp.plotter.axis.plot(sp.xarr, spline_baseline - err * 5, color="orange", alpha=0.75, zorder=-1, linewidth=2) sp.specfit.plot_fit(show_components=True) sp.specfit.annotate(fontsize=font_sizes[ncomp]) sp.plotter.axis.plot(sp.xarr, fitted_residuals - err * 5, color="#444444", linewidth=0.5, drawstyle="steps-mid") # sp.specfit.plotresiduals(axis=sp.plotter.axis, yoffset=-err*5, clear=False, # color='#444444', label=False) sp.plotter.axis.set_ylim(sp.plotter.ymin - err * 5, sp.plotter.ymax) sp.plotter.savefig(os.path.join(figurepath, "simple/{0}_fit_4_lines_simple_splinebaselined.pdf".format(spname))) returns.append(copy.copy(sp.specfit.parinfo)) if write: sp.write(mpath("spectra/{0}_spectrum_basesplined.fits".format(spname))) if radexfit: guesses = [ x for ii in range(ncomp) for x in ( 100, 14, 4.5, sp.specfit.parinfo["VELOCITY{0}".format(ii)].value, ( sp.specfit.parinfo["WIDTH{0}".format(ii)].value if ( sp.specfit.parinfo["WIDTH{0}".format(ii)].value < width_max and sp.specfit.parinfo["WIDTH{0}".format(ii)].value > width_min ) else 5 ), ) ] sp.specfit.Registry.add_fitter("h2co_mm_radex", h2co_radex_fitter, 5, multisingle="multi") sp.specfit( fittype="h2co_mm_radex", multifit=True, guesses=guesses, limits=[(10, 300), (11, 15), (3, 5.5), (-105, 125), (width_min, width_max)] * ncomp, limited=[(True, True)] * 5 * ncomp, fixed=[False, False, False, True, True] * ncomp, quiet=False, ) sp.plotter.savefig(os.path.join(figurepath, "radex/{0}_fit_h2co_mm_radex.pdf".format(spname))) returns.append(copy.copy(sp.specfit.parinfo)) return returns
green = pl.mpl.colors.LinearSegmentedColormap( 'green', { 'red': [(0, 0, 0), (1, 1, 1)], 'green': [(0, 1, 1), (1, 1, 1)], 'blue': [(0, 0, 0), (1, 1, 1)] }) blue = pl.mpl.colors.LinearSegmentedColormap( 'blue', { 'red': [(0, 0, 0), (1, 1, 1)], 'green': [(0, 0, 0), (1, 1, 1)], 'blue': [(0, 1, 1), (1, 1, 1)] }) if 'yt13co' not in locals(): cube13co = spectral_cube.SpectralCube.read( paths.mpath('APEX_13CO_2014_merge.fits')) yt13co = cube13co.with_mask(cube13co > 0.1).to_yt() mask = cube13co > 0.2 if 'cube_h2co303' not in locals(): cube_sio = SpectralCube.read(paths.molpath('APEX_SiO_54_bl.fits')) # HACK: mask._wcs = cube_sio.wcs ytsio = cube_sio.with_mask(mask).to_yt() cube_h2co303 = SpectralCube.read( paths.molpath('APEX_H2CO_303_202_bl.fits')) mask._wcs = cube_h2co303.wcs yth2co303 = cube_h2co303.with_mask(mask).to_yt() cube_h2co321 = SpectralCube.read( paths.molpath('APEX_H2CO_321_220_bl.fits'))
"pv_H2CO_321220_to_303202_bl_integ_masked_weighted_temperature_dens3e4.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e4.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e4_abund1e-10.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e4_abund1e-8.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e5.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens3e4.fits", ) ] cubes = [hpath(x) for x in ("H2CO_321220_to_303202_cube_bl.fits", "H2CO_321220_to_303202_cube_smooth_bl.fits", "APEX_H2CO_303_202_bl.fits", "APEX_H2CO_321_220_bl.fits", "APEX_H2CO_322_221_bl.fits", ) ] + [mpath(x) for x in ("APEX_13CO_2014_merge.fits", "APEX_C18O_2014_merge.fits", "APEX_H2CO_merge_high_plait_all.fits", ) ] + [molpath(x) for x in ("APEX_SiO_54_bl.fits",) ] dendrograms = [hpath(x) for x in ("DendroMask_H2CO303202.hdf5",) ] + [tpath(x) for x in ("fitted_line_parameters_Chi2Constraints.ipac", "PPV_H2CO_Temperature.ipac",
def render_13co( ytcube=yt13co, outdir='yt_renders_13CO', size=512, scale=1200., nframes=180, movie=True, camera_angle=[0, 0, 1], north_vector=[1, 0, 0], rot_vector1=[1, 0, 0], rot_vector2=[0.5, 0.5, 0.0], rot_vector3=[0.0, 0.5, 0.5], ): if not os.path.exists(paths.mpath(outdir)): os.makedirs(paths.mpath(outdir)) tf = yt.ColorTransferFunction([0, 30], grey_opacity=True) #tf.map_to_colormap(0.1,5,colormap='Reds') tf.add_gaussian(2, 1, [1.0, 0.8, 0.0, 1.0]) tf.add_gaussian(3, 2, [1.0, 0.5, 0.0, 1.0]) tf.add_gaussian(5, 3, [1.0, 0.0, 0.0, 1.0]) tf.add_gaussian(10, 5, [1.0, 0.0, 0.0, 0.5]) tf.map_to_colormap(10, 30, colormap=red, scale=1) center = ytcube.dataset.domain_dimensions / 2. cam = ytcube.dataset.h.camera(center, camera_angle, scale, size, tf, north_vector=north_vector, fields='flux') im = cam.snapshot() #images = [im] if movie: pb = ProgressBar(nframes * 2 + 30) for ii, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector1)): #images.append(im) im.write_png(paths.mpath(os.path.join(outdir, "%04i.png" % (ii))), rescale=False) pb.update(ii) for jj, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector2)): #images.append(im) im.write_png(paths.mpath( os.path.join(outdir, "%04i.png" % (ii + jj))), rescale=False) pb.update(ii + jj) for kk, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector3)): #images.append(im) im.write_png(paths.mpath( os.path.join(outdir, "%04i.png" % (ii + jj + kk))), rescale=False) pb.update(ii + jj + kk) TheBrick = ytcube.world2yt([0.253, 0.016, 35]) for LL, snapshot in enumerate(cam.move_to(TheBrick, 15)): #images.append(snapshot) snapshot.write_png(paths.mpath( os.path.join(outdir, '%04i.png' % (ii + jj + kk + LL))), rescale=False) pb.update(ii + jj + kk + LL) for mm, snapshot in enumerate(cam.zoomin(5, 15)): #images.append(snapshot) snapshot.write_png(paths.mpath( os.path.join(outdir, '%04i.png' % (ii + jj + kk + LL + mm))), rescale=False) pb.update(ii + jj + kk + LL + mm) for nn, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector1)): #images.append(im) im.write_png(paths.mpath( os.path.join(outdir, "%04i.png" % (ii + jj + kk + LL + mm + nn))), rescale=False) pb.update(ii + jj + kk + LL + mm + nn) for oo, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector2)): #images.append(im) im.write_png(paths.mpath( os.path.join(outdir, "%04i.png" % (ii + jj + kk + LL + mm + nn + oo))), rescale=False) pb.update(ii + jj + kk + LL + mm + nn + oo) for pp, im in enumerate( cam.rotation(2 * np.pi, nframes / 3, rot_vector=rot_vector3)): #images.append(im) im.write_png(paths.mpath( os.path.join( outdir, "%04i.png" % (ii + jj + kk + LL + mm + nn + oo + pp))), rescale=False) pb.update(ii + jj + kk + LL + mm + nn + oo + pp) #save_images(images, paths.mpath(outdir)) pipe = make_movie(paths.mpath(outdir)) return images else: return im
from masked_cubes import (cube303, cube303sm, cube303m, cube321m, cube303msm, cube321msm, cube321, cube321sm) from spectral_cube import SpectralCube, BooleanArrayMask from astropy.io import fits from numpy.lib.stride_tricks import as_strided from paths import mpath import numpy as np import time from astropy import log t0 = time.time() noise_fn = mpath('APEX_H2CO_merge_high_plait_all_noise.fits') noise = fits.getdata(noise_fn) nhits = fits.getdata(mpath('APEX_H2CO_merge_high_nhits.fits')) noise[nhits < 20] = np.nan noise_cube = as_strided(noise, shape=cube303m.shape, strides=(0, ) + noise.strides) noisehdr = fits.getheader(noise_fn) sm_noise = fits.getdata( mpath('APEX_H2CO_merge_high_plait_all_smooth_noise.fits')) sm_noise[nhits < 20] = np.nan sm_noise_cube = as_strided(sm_noise, shape=cube303msm.shape, strides=(0, ) + sm_noise.strides) # Cubes masked with noise cube == OK # (can I make this lazier?)
with open(regpath+'spectral_ncomp.txt') as f: pars = eval(f.read()) ftemplate = 'APEX_H2CO_2014_merge_{0}.fits' # Nice idea, but Splatalogue doesn't know what lines are really there #line_table = Splatalogue.query_lines(216.9*u.GHz, # 221*u.GHz, top20='top20', # energy_max=150, energy_type='eu_k', # line_lists=['SLAIM']) #names = np.array(['{0}_{1}'.format(a,b) for a,b in zip(line_table['Species'], # line_table['Resolved QNs'])]) #lfreq = line_table['Freq-GHz'] for lh in ('low','high'): cube = SpectralCube.read(mpath(ftemplate.format(lh))) noisehdu = cube.std(axis=0).hdu noisehdr = noisehdu.header noise = noisehdu.data noiseokmask = np.isfinite(noise) xarr = pyspeckit.units.SpectroscopicAxis(cube.spectral_axis.value, unit=str(cube.spectral_axis.unit), refX=cube.wcs.wcs.restfrq, refX_units='Hz') spectra = {} for region_number,reg in enumerate(regs): name = reg.attr[1]['text'] print name if name not in spectra:
from masked_cubes import (cube303, cube303sm, cube303m, cube321m, cube303msm, cube321msm, cube321, cube321sm) from spectral_cube import SpectralCube,BooleanArrayMask from astropy.io import fits from numpy.lib.stride_tricks import as_strided from paths import mpath import numpy as np import time from astropy import log t0 = time.time() noise_fn = mpath('APEX_H2CO_merge_high_plait_all_noise.fits') noise = fits.getdata(noise_fn) nhits = fits.getdata(mpath('APEX_H2CO_merge_high_nhits.fits')) noise[nhits<20] = np.nan noise_cube = as_strided(noise, shape=cube303m.shape, strides=(0,)+noise.strides) noisehdr = fits.getheader(noise_fn) sm_noise = fits.getdata(mpath('APEX_H2CO_merge_high_plait_all_smooth_noise.fits')) sm_noise[nhits<20] = np.nan sm_noise_cube = as_strided(sm_noise, shape=cube303msm.shape, strides=(0,)+sm_noise.strides) # Cubes masked with noise cube == OK # (can I make this lazier?) noisefinite = np.isfinite(noise) # stride length changes for bools? sm_noisefinite = np.isfinite(sm_noise) cube303nm = cube303.with_mask(BooleanArrayMask(as_strided(noisefinite, shape=cube303.shape,
"pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e4_abund1e-10.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e4_abund1e-8.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens1e5.fits", "pv_H2CO_321220_to_303202_bl_integ_weighted_temperature_dens3e4.fits", ) ] cubes = [ hpath(x) for x in ( "H2CO_321220_to_303202_cube_bl.fits", "H2CO_321220_to_303202_cube_smooth_bl.fits", "APEX_H2CO_303_202_bl.fits", "APEX_H2CO_321_220_bl.fits", "APEX_H2CO_322_221_bl.fits", ) ] + [ mpath(x) for x in ( "APEX_13CO_2014_merge.fits", "APEX_C18O_2014_merge.fits", "APEX_H2CO_merge_high_plait_all.fits", ) ] + [molpath(x) for x in ("APEX_SiO_54_bl.fits", )] dendrograms = [hpath(x) for x in ("DendroMask_H2CO303202.hdf5", )] + [ tpath(x) for x in ( "fitted_line_parameters_Chi2Constraints.ipac", "PPV_H2CO_Temperature.ipac", ) ] if not os.path.isdir('cds'): os.mkdir('cds')
import numpy as np from astropy import units as u from astropy import constants from astropy.table import Table import paths import pyspeckit import glob import matplotlib matplotlib.use('Qt4Agg') import os import pylab as pl tbl = Table.read(paths.mpath('diffuse_lines_mainonly.ipac'), format='ascii.ipac') rfreq = tbl['FreqGHz'] rfreq[rfreq.mask] = tbl['MeasFreqGHz'][rfreq.mask] freq = rfreq * (1 - 65 * u.km / u.s / constants.c) for fn in glob.glob(paths.spath("*.fits")): sp = pyspeckit.Spectrum(fn) sp.xarr.convert_to_unit('GHz') sp.plotter(figure=pl.figure(1), clear=True) sp.plotter.line_ids(tbl['Species'], freq * u.GHz, unit='GHz') outname = os.path.splitext(os.path.split(fn)[1])[0] sp.plotter.savefig(paths.sppath("{0}.png".format(outname))) """ import paths import pyspeckit import numpy as np import glob