def make_spectra(dataset, maps, tels=['AP-H201-X202', 'AP-H201-X201']):
    cl = read_class.ClassObject(
        os.path.join(make_apex_cubes.april2014path, dataset) + ".apex")
    for tel in tels:
        for map in maps:
            spectra = cl.get_spectra(sourcere='^' + map, telescope=tel)
            data = np.array([s for s, h in spectra])
            header = spectra[0][1]
            xarr = read_class.make_axis(header)
            sp = pyspeckit.Spectrum(data=data.mean(axis=0),
                                    header=read_class.clean_header(header),
                                    xarr=xarr)
            sp.write(
                paths.dpath('field_spectra/{name}_{window}_{date}.fits'.format(
                    name=sp.specname,
                    window=sp.header['XTEL'],
                    date=Time(sp.header['DOBS'],
                              format='jyear').iso.split()[0])))

            datafflag = fourier_flag_spectra(data)

            header['FTFLGMOD'] = (3, 'Fourier component flagged')
            header['FTFLGFRC'] = (0.05, 'Bad fraction of Fourier component')
            sp = pyspeckit.Spectrum(data=datafflag.mean(axis=0),
                                    header=read_class.clean_header(header),
                                    xarr=xarr)
            sp.write(
                paths.dpath(
                    'field_spectra/{name}_{window}_{date}_fflagged.fits'.
                    format(name=sp.specname,
                           window=sp.header['XTEL'],
                           date=Time(sp.header['DOBS'],
                                     format='jyear').iso.split()[0])))
def make_spectra(dataset, maps, tels=['AP-H201-X202', 'AP-H201-X201']):
    cl = read_class.ClassObject(os.path.join(make_apex_cubes.april2014path, dataset)+".apex")
    for tel in tels:
        for map in maps:
            spectra = cl.get_spectra(sourcere='^'+map, telescope=tel)
            data = np.array([s for s,h in spectra])
            header = spectra[0][1]
            xarr = read_class.make_axis(header)
            sp = pyspeckit.Spectrum(data=data.mean(axis=0),
                                    header=read_class.clean_header(header),
                                    xarr=xarr)
            sp.write(paths.dpath('field_spectra/{name}_{window}_{date}.fits'.format(name=sp.specname,
                                                                                    window=sp.header['XTEL'],
                                                                                    date=Time(sp.header['DOBS'],
                                                                                              format='jyear').iso.split()[0])))
            
            datafflag = fourier_flag_spectra(data)

            header['FTFLGMOD'] = (3, 'Fourier component flagged')
            header['FTFLGFRC'] = (0.05, 'Bad fraction of Fourier component')
            sp = pyspeckit.Spectrum(data=datafflag.mean(axis=0),
                                    header=read_class.clean_header(header),
                                    xarr=xarr)
            sp.write(paths.dpath('field_spectra/{name}_{window}_{date}_fflagged.fits'.format(name=sp.specname,
                                                                                             window=sp.header['XTEL'],
                                                                                             date=Time(sp.header['DOBS'],
                                                                                                       format='jyear').iso.split()[0])))
def do_rrlspectra():
    hcubes = load_rrlcubes()
    order = ['H77$\\alpha$', 'H110$\\alpha$']

    pl.close(1)
    pl.close(2)
    fig = pl.figure(1, figsize=(12,8))
    fig2 = pl.figure(2, figsize=(12,8))

    colors = ['k','r','g','b','m','#11AAAA']

    for regfn in regfiledict:
        regions = pyregion.open(regfn)

        for r in regions:
            spectra = [(c,hcubes[c].get_apspec(r.coord_list,
                                               coordsys=r.coord_format,
                                               wunit='degree'))
                       for c in order]

            fig.clf()
            fig2.clf()

            for ii,(hline,sp) in enumerate(spectra):
                sp.xarr.convert_to_unit('km/s')
                sp.specname = r.attr[1]['text']
                sp.unit = 'K'
                # fit twice: first time, sets the errors
                sp.specfit(fittype='gaussian', guesses=[1,60,5], multifit=True)
                sp.specfit(fittype='gaussian', guesses=[1,60,5], multifit=True)
                pars = sp.specfit.modelpars
                pars[2] /= 5
                sp.plotter(figure=fig, xmin=40, xmax=80, color=colors[ii], clear=False,
                           label=hline)
                ax1 = sp.plotter.axis

                sp.plotter(figure=fig2, xmin=00, xmax=120, color=colors[ii], clear=False,
                           label=hline, linewidth=2)
                ax2 = sp.plotter.axis
                sp.specfit.plot_fit(composite_fit_color=colors[ii+2], annotate=False)
                box = ax2.get_position()
                ax2.set_position([box.x0, box.y0, box.width * 0.9, box.height])
                sp.specfit.annotate(bbox_to_anchor=(1.01,0.95) if '110' in hline else (1.01, 0.75), loc='upper left',
                                    fontsize=14)
                sp.plotter.axis.set_ylabel("$T_A^*$ (K)")
                fig2.savefig(dpath(regfiledict[regfn]+"_wideplot_RRL_aperture_%s.pdf" % sp.specname),
                             bbox_extra_artists=[sp.specfit.fitleg])

                fakespec = pyspeckit.Spectrum(xarr=sp.xarr,
                                              data=sp.specfit.get_model_frompars(sp.xarr,
                                                                                 pars),
                                              header=sp.header)
                fakespec.plotter(axis=ax1, xmin=40, xmax=80,
                                 color=colors[ii], clear=False,
                                 linestyle='steps--')
                rrlid = 'H77a' if '77' in hline else '110'
                sp.write(dpath(regfiledict[regfn]+"_RRL%s_aperture_%s.fits" % (rrlid,sp.specname)))

            sp.plotter.axis.set_ylabel("$T_A^*$ (K)")
            sp.plotter.savefig(dpath(regfiledict[regfn]+"_RRL_aperture_%s.pdf" % sp.specname))
Exemplo n.º 4
0
def make_rgb(
        outname,
        redline='H2CO303_202',
        greenline='H2CO321_220',
        blueline='H2CO322_221',
        fntemplate=paths.dpath(
            'merge/moments/W51_b6_7M_12M.{0}.image.pbcor_medsub_max.fits'),
        suffix="_auto",
        **kwargs):

    print(outname, suffix)
    rgb_cube_fits = outname
    if not os.path.exists(rgb_cube_fits):
        # does not return anything
        aplpy.make_rgb_cube([
            fntemplate.format(redline) if 'fits' not in redline else redline,
            fntemplate.format(greenline)
            if 'fits' not in greenline else greenline,
            fntemplate.format(blueline)
            if 'fits' not in blueline else blueline,
        ], rgb_cube_fits)

    rgb_cube_png = rgb_cube_fits[:-5] + suffix + ".png"
    rgb_im = aplpy.make_rgb_image(data=rgb_cube_fits,
                                  output=rgb_cube_png,
                                  embed_avm_tags=True,
                                  **kwargs)
    return rgb_im
Exemplo n.º 5
0
def make_rgb(
    outname,
    redline="H2CO303_202",
    greenline="H2CO321_220",
    blueline="H2CO322_221",
    fntemplate=paths.dpath("merge/moments/W51_b6_7M_12M.{0}.image.pbcor_medsub_max.fits"),
    suffix="_auto",
    **kwargs
):

    print(outname, suffix)
    rgb_cube_fits = outname
    if not os.path.exists(rgb_cube_fits):
        # does not return anything
        aplpy.make_rgb_cube(
            [
                fntemplate.format(redline) if "fits" not in redline else redline,
                fntemplate.format(greenline) if "fits" not in greenline else greenline,
                fntemplate.format(blueline) if "fits" not in blueline else blueline,
            ],
            rgb_cube_fits,
        )

    rgb_cube_png = rgb_cube_fits[:-5] + suffix + ".png"
    rgb_im = aplpy.make_rgb_image(data=rgb_cube_fits, output=rgb_cube_png, embed_avm_tags=True, **kwargs)
    return rgb_im
def get_cont(header):
    contfn = paths.dpath('W51_te_continuum_best.fits')
    beam = radio_beam.Beam.from_fits_header(contfn)
    cont_Jy = reproject.reproject_interp(input_data=contfn,
                                         output_projection=header)[0]*u.Jy
    cont_K = cont_Jy.to(u.K, u.brightness_temperature(beam,
                                                      continuum_frequency))
    return cont_K
def setup_sims(maxscale=3):
    for scale in range(1,maxscale):
        fh = simulate_grid_for_fitsfile(paths.dpath("w51_te_continuum_best.fits"),
                                        separation=45*scale, amplitude_range=[0.001,0.1],
                                        scale=scale,
                                        random_offset=20)
        fh[0].header['BUNIT'] = 'Jy/beam'
        fh.writeto(paths.simpath("simimage_scale{0}_gaussian.fits".format(scale)),
                   clobber=True)

        fh = simulate_grid_for_fitsfile(paths.dpath("w51_te_continuum_best.fits"),
                                        separation=45*scale, amplitude_range=[0.001,0.1],
                                        kernel=Tophat2DKernel,
                                        scale=scale,
                                        random_offset=20)
        fh[0].header['BUNIT'] = 'Jy/beam'
        fh.writeto(paths.simpath("simimage_scale{0}_tophat.fits".format(scale)),
                   clobber=True)
Exemplo n.º 8
0
def get_mom0(fn,
             vrange=[51, 60] * u.km / u.s,
             exclude_vrange=[40, 75] * u.km / u.s,
             percentile=30,
             iterate=True):
    savename = paths.dpath(
        os.path.join(
            os.path.split(fn)[0], 'moments',
            os.path.split(fn)[1].replace(".fits", "_p30sub.fits")))
    if os.path.exists(savename):
        print("Loading {0} from disk".format(savename))
        fh = fits.open(savename)

        m0 = Projection(
            value=fh[0].data,
            header=fh[0].header,
            wcs=wcs.WCS(fh[0].header),
            unit=u.Unit(fh[0].header['BUNIT']),
        )

    else:
        print("Computing {0} from analysis of {1}".format(savename, fn))
        cube = SpectralCube.read(fn)
        #bm = cube.beams[0]
        #jtok = bm.jtok(cube.wcs.wcs.restfrq*u.Hz)

        slab = cube.spectral_slab(*vrange)
        cube.beam_threshold = 1
        #contguess = cube.spectral_slab(0*u.km/u.s, 40*u.km/u.s).percentile(50, axis=0)
        #contguess = cube.spectral_slab(70*u.km/u.s, 100*u.km/u.s).percentile(50, axis=0)
        mask = (cube.spectral_axis < exclude_vrange[0]) | (cube.spectral_axis >
                                                           exclude_vrange[1])
        masked_cube = cube.with_mask(mask[:, None, None])
        try:
            log.info("Continuum measurement.")
            contguess = masked_cube.percentile(percentile,
                                               axis=0,
                                               iterate_rays=iterate,
                                               progressbar=iterate)
        except ValueError as ex:
            print("skipping {0}".format(fn))
            print(ex)
            raise
        log.info("Subtract the continuum")
        slabsub = (slab - contguess)
        slabsub.beam_threshold = 0.25
        log.info("Compute moment 0")
        m0 = slabsub.moment0()
        log.info("Save results to {0}".format(savename))
        m0.hdu.writeto(savename)

    return m0
def ridiculous_tests():
    for unit in ('Jy/beam', 'Jy/pixel', 'Jy', 'K'):
        fh = simulate_grid_for_fitsfile(paths.dpath("w51_te_continuum_best.fits"),
                                        separation=45*3, amplitude_range=[0.001,0.1],
                                        scale=3,
                                        random_offset=20)
        assert fh[0].data.max() > 0
        fh[0].header['BUNIT'] = unit
        fh.writeto(paths.simpath("stupidtest_{0}.fits".format(unit.replace("/","_"))),
                   clobber=True)
        synthetically_image_fitsfile(paths.simpath("stupidtest_{0}.fits".format(unit.replace("/","_"))),
                                     base_name="casa_stupidtest_{0}".format(unit.replace("/","_")),
                                     cleanup=True
                                    )
def setup_sims(maxscale=3):
    for scale in range(1, maxscale):
        fh = simulate_grid_for_fitsfile(
            paths.dpath("w51_te_continuum_best.fits"),
            separation=45 * scale,
            amplitude_range=[0.001, 0.1],
            scale=scale,
            random_offset=20)
        fh[0].header['BUNIT'] = 'Jy/beam'
        fh.writeto(paths.simpath(
            "simimage_scale{0}_gaussian.fits".format(scale)),
                   clobber=True)

        fh = simulate_grid_for_fitsfile(
            paths.dpath("w51_te_continuum_best.fits"),
            separation=45 * scale,
            amplitude_range=[0.001, 0.1],
            kernel=Tophat2DKernel,
            scale=scale,
            random_offset=20)
        fh[0].header['BUNIT'] = 'Jy/beam'
        fh.writeto(paths.simpath(
            "simimage_scale{0}_tophat.fits".format(scale)),
                   clobber=True)
def ridiculous_tests():
    for unit in ('Jy/beam', 'Jy/pixel', 'Jy', 'K'):
        fh = simulate_grid_for_fitsfile(
            paths.dpath("w51_te_continuum_best.fits"),
            separation=45 * 3,
            amplitude_range=[0.001, 0.1],
            scale=3,
            random_offset=20)
        assert fh[0].data.max() > 0
        fh[0].header['BUNIT'] = unit
        fh.writeto(paths.simpath("stupidtest_{0}.fits".format(
            unit.replace("/", "_"))),
                   clobber=True)
        synthetically_image_fitsfile(
            paths.simpath("stupidtest_{0}.fits".format(unit.replace("/",
                                                                    "_"))),
            base_name="casa_stupidtest_{0}".format(unit.replace("/", "_")),
            cleanup=True)
Exemplo n.º 12
0
def get_mom0(fn, vrange=[51,60]*u.km/u.s, exclude_vrange=[40,75]*u.km/u.s,
             percentile=30, iterate=True):
    savename = paths.dpath(os.path.join(os.path.split(fn)[0], 'moments',
                                        os.path.split(fn)[1].replace(".fits","_p30sub.fits")))
    if os.path.exists(savename):
        print("Loading {0} from disk".format(savename))
        fh = fits.open(savename)

        m0 = Projection(value=fh[0].data, header=fh[0].header,
                        wcs=wcs.WCS(fh[0].header),
                        unit=u.Unit(fh[0].header['BUNIT']),)

    else:
        print("Computing {0} from analysis of {1}".format(savename, fn))
        cube = SpectralCube.read(fn)
        #bm = cube.beams[0]
        #jtok = bm.jtok(cube.wcs.wcs.restfrq*u.Hz)

        slab = cube.spectral_slab(*vrange)
        cube.beam_threshold = 1
        #contguess = cube.spectral_slab(0*u.km/u.s, 40*u.km/u.s).percentile(50, axis=0)
        #contguess = cube.spectral_slab(70*u.km/u.s, 100*u.km/u.s).percentile(50, axis=0)
        mask = (cube.spectral_axis<exclude_vrange[0]) | (cube.spectral_axis > exclude_vrange[1])
        masked_cube = cube.with_mask(mask[:,None,None])
        try:
            log.info("Continuum measurement.")
            contguess = masked_cube.percentile(percentile, axis=0,
                                               iterate_rays=iterate,
                                               progressbar=iterate)
        except ValueError as ex:
            print("skipping {0}".format(fn))
            print(ex)
            raise
        log.info("Subtract the continuum")
        slabsub = (slab-contguess)
        slabsub.beam_threshold = 0.25
        log.info("Compute moment 0")
        m0 = slabsub.moment0()
        log.info("Save results to {0}".format(savename))
        m0.hdu.writeto(savename)

    return m0
def cutout_id_chem_map(yslice=slice(367,467), xslice=slice(114,214),
                       vrange=[51,60]*u.km/u.s, sourcename='e2',
                       filelist=glob.glob(paths.dpath('12m/cutouts/*e2e8*fits')),
                       source=None, radius=None,
                       chem_name='CH3OH',
                       shape=None, # check that shape matches slice
                      ):
    assert filelist

    maps = {}
    map_error = {}
    energies = {}
    degeneracies = {}
    frequencies = {}
    indices = {}

    # sanity check
    #shapes = [fits.getdata(fn).shape for fn in filelist]
    #assert len(set(shapes)) == 1

    for ii,fn in enumerate(ProgressBar(filelist)):
        if chem_name not in fn:
            log.debug("Skipping {0} because it doesn't have {1}".format(fn, chem_name))
            continue
        if 'temperature' in fn or 'column' in fn:
            continue

        if 'moment0' in fn:
            # there is a slight danger of off-by-one-pixel errors with the
            # cropping used here.  Ideally, we'd reproject...
            m0_full = fits.getdata(fn)
            #stddev = fits.getdata(fn.replace("moment0","madstd"))
            header = fits.getheader(fn)
            cutout = Cutout2D(m0_full, source, 2*radius, wcs=wcs.WCS(header))
            m0 = cutout.data
            #cutout_std = Cutout2D(stddev, source, 2*radius, wcs=wcs.WCS(header))
            #stddev = cutout_std.data
            try:
                beam = radio_beam.Beam.from_fits_header(header)
                jtok = beam.jtok(header['RESTFRQ']*u.Hz).value
            except:
                jtok = 222. # approximated 0.32x0.34 at 225 GHz

            m0 = m0 * jtok
            # stddev = error in a single channel... not very accurate
            #stddev = stddev * jtok
            print("stddev for {0}".format(fn)) # this debug statement prevents abort traps
            stddev = mad_std(m0_full[np.isfinite(m0_full)]) * jtok
            header = cutout.wcs.to_header()
        else:
            cube_ = SpectralCube.read(fn)
            if shape:
                # have to have same shapes, otherwise pixel slices don't make sense
                assert cube_.shape == shape
            cube = cube_[:,yslice,xslice]
            bm = cube.beams[0]
            #jtok = bm.jtok(cube.wcs.wcs.restfrq*u.Hz)
            cube = cube.to(u.K, bm.jtok_equiv(cube.wcs.wcs.restfrq*u.Hz))

            slab = cube.spectral_slab(*vrange)
            cube.beam_threshold = 1
            #contguess = cube.spectral_slab(0*u.km/u.s, 40*u.km/u.s).percentile(50, axis=0)
            #contguess = cube.spectral_slab(70*u.km/u.s, 100*u.km/u.s).percentile(50, axis=0)
            mask = (cube.spectral_axis<40*u.km/u.s) | (cube.spectral_axis > 75*u.km/u.s)
            contguess = cube.with_mask(mask[:,None,None]).percentile(30, axis=0)
            stddev = cube.with_mask(mask[:,None,None]).apply_numpy_function(mad_std, axis=0)
            slabsub = (slab-contguess)
            slabsub.beam_threshold = 0.15
            m0 = slabsub.moment0()
            header = m0.hdu.header

        label = linere.search(fn).groups()[0]
        frq = name_to_freq[label]

        closest_ind = np.argmin(np.abs(frqs - frq))
        closest_key = list(rt.keys())[closest_ind]
        closest_rt = rt[closest_key]
        upperstate = ch3oh.data['States'][closest_rt.UpperStateRef]
        upperen = u.Quantity(float(upperstate.StateEnergyValue),
                             unit=upperstate.StateEnergyUnit)

        maps[label] = m0
        map_error[label] = stddev
        energies[label] = upperen
        degeneracies[label] = int(upperstate.TotalStatisticalWeight)
        indices[label] = closest_ind
        frequencies[label] = frq

    # make sure the dict indices don't change order
    energy_to_key = {v:k for k,v in energies.items()}
    order = sorted(energy_to_key.keys())
    keys = [energy_to_key[k] for k in order]

    cube = np.empty((len(maps),)+maps[label].shape)
    ecube = np.empty_like(cube)
    xaxis = u.Quantity([energies[k] for k in keys])
    xaxis = xaxis.to(u.erg, u.spectral()).to(u.K, u.temperature_energy())
    for ii,key in enumerate(keys):
        # divide by degeneracy
        cube[ii,:,:] = maps[key]
        ecube[ii,:,:] = map_error[key]

    frequencies = u.Quantity([frequencies[k] for k in keys])
    indices = [indices[k] for k in keys]
    degeneracies = [degeneracies[k] for k in keys]

    assert xaxis.size == cube.shape[0]

    return xaxis,cube,ecube,maps,map_error,energies,frequencies,indices,degeneracies,header
Exemplo n.º 14
0
    spectra.specfit(fittype='ch3oh',
                    guesses=[55, 4, 200, 5e15],
                    limitedmin=[True] * 4,
                    limitedmax=[True] * 4,
                    limits=[(50, 70), (1, 4), (20, 1000), (1e13, 1e18)])

    ok = slaim['Species'] == 'CH3OHvt=0'
    spectra.xarr.refX = 225 * u.GHz
    spectra.plotter.line_ids(
        line_names=[str(x) for x in slaim['Resolved QNs'][ok]],
        line_xvals=freqs[ok],
        velocity_offset=55.626 * u.km / u.s)

    pixel_regions = pyregion.open(paths.rpath('three_e2_pixels.reg'))
    colmap = fits.open(
        paths.dpath('12m/moments/CH3OH_e2_cutout_columnmap.fits'))
    temmap = fits.open(
        paths.dpath('12m/moments/CH3OH_e2_cutout_temperaturemap.fits'))
    ch3ohwcs = wcs.WCS(colmap[0].header)

    target = 'SelectedPixel{0}'
    for selreg, tem, col, vel, width, ylim in (
        (1, 9999401, 99995.1e18, 55.2, 5.3, (-5, 100)),
        (2, 9999220, 99991.3e18, 55.6, 5.3, (-5, 100)),
        (3, 9999167, 99995.7e17, 53.0, 5.3, (-5, 100)),
        (4, 9999127, 99991.7e17, 54.0, 5.3, (-5, 60)),
        (5, 9999999, 9999999999, 55.8, 7.0, (-5, 110)),
    ):

        # tem, col should be extractd from RTD fits
        reg = [
    guesses = [0.5,50,5,
               1,60,5,
               0.5,70,5]
    limits = [(0.1,3.5),(40,80),(1,15)]*3
    limits[1] = (45,55)
    limits[4] = (55,65)
    limits[7] = (65,75)
    limits[5] = (2,15)
    sp.specfit(fittype='gaussian', multifit=True, guesses=guesses, limits=limits, limited=[(True,True)]*9)
    sp.specfit.plot_fit(show_components=True)
    pars.append(sp.specfit.modelpars)
    spectra.append(sp)

[sp.specfit.plot_fit(show_components=True) for sp in spectra]

parsarr = np.array(pars)
pl.figure(0)
pl.clf()
pl.plot((8*np.log(2))**0.5*parsarr[:,2])
pl.plot((8*np.log(2))**0.5*parsarr[:,5])
pl.plot((8*np.log(2))**0.5*parsarr[:,8])
pl.plot((8*np.log(2))**0.5*(parsarr[:,5]**2+parsarr[:,8]**2)**0.5, '--')
geosum = (parsarr[:,2]**2+parsarr[:,5]**2+parsarr[:,8]**2)**0.5
pl.plot((8*np.log(2))**0.5*geosum, '--')
pl.show()

np.savetxt(paths.dpath('vwidth_vs_r.txt'),
           np.array([aprs, parsarr[:,2], parsarr[:,5], parsarr[:,8], geosum]).T,
           header=" ".join(["{0:>15s}".format(x) for x in ('rad_as','sigma_1','sigma_2','sigma_3','sigma_all')]),
           fmt="  %15i %15f %15f %15f %15f")
Exemplo n.º 16
0
    F.tick_labels.set_yformat('dd:mm:ss.ss')
    F.tick_labels.set_xformat('hh:mm:ss.ss')
    F.ticks.set_xspacing(0.001)
    F.ticks.set_yspacing(0.001)
    F.tick_labels.set_x_full_label_side('left')


#aplpy.make_rgb_cube( ('W51-CBAND-feathered.fits','W51-X-ABCD-S1.VTESS.VTC.DAVID-MEH.fits','W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits'), 'W51_CXU_rgb' )

pl.close(1)
figure = pl.figure(1)
figure.clf()

# clean the header of junk axes
hdu = fits.open(
    dpath('W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits'))
hdu[0].data = hdu[0].data.squeeze()
hdu[0].header = wcs.WCS(hdu[0].header).sub([wcs.WCSSUB_CELESTIAL]).to_header()

F = aplpy.FITSFigure(hdu, convention='calabretta', figure=figure)
#F = aplpy.FITSFigure(dpath+'W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.rot45.fits',convention='calabretta',figure=figure)
F.tick_labels.set_xformat('dd.dd')
F.tick_labels.set_yformat('dd.dd')
F.tick_labels.set_font(size=20)
F.axis_labels.set_font(size=20)
F.show_grayscale(stretch='arcsinh', vmin=-5e-4, vmax=0.011, invert=True)
#e1 = coordinates.ICRS(290.93263,14.50745,unit=('deg','deg'))
#F.recenter(e1.ra.value,e1.dec.value,width=1/60.,height=1/60.)
#F.recenter(290.92633,14.514769,radius=1.4/60.)
F.recenter(290.92345, 14.511772, radius=1.5 / 60.)
from ch3cn_fits import SpectralCube, pyspeckit, fits, u, np
import os
import paths
T=True
F=False

cubefn = paths.dpath('longbaseline/W51northcax.SPW2_ALL_cutout.fits')
cubeKfn = paths.dpath('longbaseline/W51northcax.SPW2_ALL_cutout_medsub_K.fits')
medKfn = paths.dpath('longbaseline/W51northcax.SPW2_ALL_cutout_med_K.fits')
if not os.path.exists(cubeKfn):
    cube = SpectralCube.read(cubefn).minimal_subcube()
    contcubeK = cube.to(u.K, u.brightness_temperature(cube.beam,
                                                      cube.wcs.wcs.restfrq*u.Hz))
    cube.allow_huge_operations = True
    cubeK = cube.to(u.K, u.brightness_temperature(cube.beam,
                                                  cube.wcs.wcs.restfrq*u.Hz))
    med = cubeK.percentile(25, axis=0)
    cubeK.allow_huge_operations=True
    cubeK = cubeK - med
    med.write(medKfn)
    cubeK.write(cubeKfn)
else:
    cubeK = SpectralCube.read(cubeKfn)
    cubeK.allow_huge_operations = True
    med = fits.getdata(medKfn) * u.K
    contcubeK = cubeK + med
    contcubeK.allow_huge_operations = True

# BAD error estimate
err = cubeK.std(axis=0)
err[:] = 5*u.K
Exemplo n.º 18
0
   ):

    regs = regions.read_ds9(paths.rpath('velo_centroid_guesses_{linename}.reg').format(linename=linename))

    guesses = {}

    for reg in regs:
        vel = float(reg.meta['text'].strip("{}"))
        if vel in guesses:
            guesses[vel].append(reg)
        else:
            guesses[vel] = [reg]

    velocities = np.array(sorted(guesses.keys()))*u.km/u.s

    cubefn = paths.dpath('cubes/OrionSourceI_{linename}_robust0.5maskedclarkclean10000_medsub_K.fits'
                         .format(linename=linename))
    basename = os.path.splitext(os.path.basename(cubefn))[0]
    cube = SpectralCube.read(cubefn)

    # hard-coded icrs radecsys assumed
    assert cube.header['RADESYS'] == 'ICRS'

    vdiff = np.abs(np.diff(cube.spectral_axis).mean())
    rms = cube.std()
    weights = np.ones(cube.shape[1:]) * rms.value**2

    try:
        beam = cube.beam
    except AttributeError:
        beam = cube.average_beams(1)
    pixscale = wcs.utils.proj_plane_pixel_area(cube.wcs.celestial)**0.5 * u.deg
import pylab as pl
import matplotlib
matplotlib.rc_file('pubfiguresrc')

from aplpy_figure_maker import FITSFigure
from paths import dpath, fpath

for label in ("","lower","upper"):
    files = [dpath(label+'peak_optdepth_11.fits'),
             dpath(label+'peak_optdepth_22.fits'),
             dpath(label+'peak_optdepth_ratio.fits'),
             dpath(label+'peak_optdepth_11_tex1.0.fits'),
             dpath(label+'peak_optdepth_22_tex1.5.fits'),
             dpath(label+'peak_optdepth_ratio_tex1.0_1.5.fits')]

    for ii in xrange(1,len(files)+1):
        pl.figure(ii)
        pl.clf()

    figs = [FITSFigure(fn, figure=pl.figure(ii+1))
            for ii,fn in enumerate(files)]

    for fig,fn in zip(figs,files):
        if '11' in fn:
            cblabel = (r'$\tau_{1-1}$')
        elif '22' in fn:
            cblabel = (r'$\tau_{2-2}$')
        elif 'ratio' in fn:
            cblabel = (r'$\tau_{1-1} / \tau_{2-2}$')
        else:
            raise ValueError("This is not a file: {0}".format(fn))
Exemplo n.º 20
0
from astropy import units as u
from astropy.io import fits
from spectral_cube import SpectralCube
from paths import dpath
from fnames import cube_names, continua
import radio_beam
import ds9

dd = ds9.ds9()

cubes = {name: SpectralCube.read(dpath(fn)) for name,fn in cube_names.items()}

vcubes = {name: cube.with_spectral_unit(u.km/u.s, velocity_convention='radio')
          for name,cube in cubes.items()}

beams = {name: radio_beam.Beam.from_fits_header(cube.header)
         for name,cube in vcubes.items()}

for cube in vcubes.values():
    cube._unit = u.Jy

vkcubes = {name: cube.with_flux_unit(u.K,
                                     u.brightness_temperature(beams[name],
                                                              cube.wcs.wcs.restfrq*u.Hz))
          for name,cube in vcubes.items()}

for name,vc in vkcubes.items():
    vc._header['OBJECT'] = name
    vc.to_ds9(dd.id, newframe=True)

dd.set('tile yes')
def make_fourier_spectra(dataset, maps, tels=['AP-H201-X202', 'AP-H201-X201']):
    for tel in tels:
        for map in maps:
            sp = pyspeckit.Spectrum(paths.dpath('field_spectra/'
                                                "{name}_{window}_{date}{ff}.fits".format(name=map,
                                                                                         window=tel,
                                                                                         date=dataset[-10:],
                                                                                         ff="")))
            spff = pyspeckit.Spectrum(paths.dpath('field_spectra/'
                                                  "{name}_{window}_{date}{ff}.fits".format(name=map,
                                                                                          window=tel,
                                                                                          date=dataset[-10:],
                                                                                          ff="_fflagged")))

            ft1 = np.fft.fft(sp.data)
            ft2 = np.fft.fft(spff.data)

            ftf = np.fft.fftfreq(sp.data.size)
            vres = float(sp.header['VRES'])
            fvr = ftf.size*vres
            fvelo = fvr/(ftf/ftf[1])/2.

            fig = pl.figure(1)
            fig.clf()
            ax = fig.add_subplot(2,1,1)
            ax2 = ax.twiny()
            def tick_function(X):
                V = abs(fvr/(X/ftf[1])/2.)
                return ["%0.3g" % z for z in V]

            pl.loglog(ftf, np.abs(ft1), 'k', alpha=0.5)
            pl.loglog(ftf, np.abs(ft2), 'r', alpha=0.5)
            pl.loglog(ftf, np.abs(ft1)-np.abs(ft2), 'g', alpha=0.8, linewidth=0.5)

            tick_locs = np.logspace(-np.log10(ftf.size/2.), np.log10(0.5), 7)
            ax2.set_xticks(tick_locs)
            ax2.set_xticklabels(tick_function(tick_locs))
            ax.set_xlabel("Fourier Frequency")
            ax2.set_xlabel("Velocity Scale (km/s)")
            ax.set_ylabel("Fourier Amplitude")

            ax.set_xlim(ftf[1], ftf[ftf.size/2-1])
            ax.set_xscale('log')
            ax.set_xlim(ftf[1], ftf[ftf.size/2-1])
            ax.set_xlim(ftf[1], ftf[ftf.size/2-1])
            ax.set_xlim(ftf[1], ftf[ftf.size/2-1])
            pl.xlim(ftf[1], ftf[ftf.size/2-1])
            assert ax.get_xlim() == (ftf[1], ftf[ftf.size/2-1])

            ax3 = fig.add_subplot(2,1,2)
            diff = sp-spff
            diff.specname = ''
            diff.baseline(order=0)
            stats = diff.stats()
            diff.plotter(axis=ax3, ymin=-stats['std']*5, ymax=stats['std']*5,
                         linestyle='none', marker=',')

            ax2.set_xlabel("{0} Velocity Scale (km/s)".format(sp.specname))

            pl.savefig(paths.dpath('field_spectra/'
                                   "{name}_{window}_{date}_psds.png".format(name=map,
                                                                            window=tel,
                                                                            date=dataset[-10:],)
                                  ),
                       bbox_inches='tight')
Exemplo n.º 22
0
    from spectral_cube.lower_dimensional_structures import Projection

    fh = fits.open(filename)

    return Projection(value=fh[0].data,
                      header=fh[0].header,
                      wcs=wcs.WCS(fh[0].header),
                      unit=u.Unit(fh[0].header['BUNIT']),
                     )


for fn in files:
    fname = os.path.splitext(os.path.basename(fn))[0]
    print(fname)

    m0fn = dpath("moments/{0}_moment0.fits".format(fname))
    m1fn = dpath("moments/{0}_moment1.fits".format(fname))
    m2fn = dpath("moments/{0}_moment2.fits".format(fname))

    if os.path.exists(m0fn):
        m0 = load_projection(m0fn)
        m1 = load_projection(m1fn)
        m2 = load_projection(m2fn)
    else:
        cube = SpectralCube.read(dpath(fn)).minimal_subcube()
        vcube = cube.with_spectral_unit(u.km/u.s, velocity_convention='radio')
        vcube = vcube.spectral_slab(35*u.km/u.s, 75*u.km/u.s)
        try:
            m0 = vcube.with_mask(vcube>0.05*u.Jy).moment0()
            m1 = vcube.with_mask(vcube>0.05*u.Jy).moment1()
            m2 = vcube.with_mask(vcube>0.05*u.Jy).moment2()
import paths
import matplotlib
import reproject
import radio_beam
import dust_emissivity
from astropy.io import fits
import pylab as pl
from astropy import units as u
from astropy import wcs
import image_tools
matplotlib.rc_file('pubfiguresrc')

for source in ('e8','north','e2',):

    matplotlib.pyplot.figure(1).clf()
    F1 = aplpy.FITSFigure(paths.dpath('chemslices/chemical_m0_slabs_{0}_CH3OH1029-936_merge.fits'.format(source)),
                          figure=matplotlib.pyplot.figure(1))
    F1.show_grayscale(invert=True, vmax=1100, vmin=-20)
    F1.show_contour(paths.dpath('W51_te_continuum_best.fits'),
                    colors=['r']*11,
                    levels=[0.015, 0.0256944, 0.0577778, 0.11125, 0.186111,
                            0.282361, 0.4, ])

    F1.add_scalebar((0.025*u.pc / (5400*u.pc)).to(u.deg,u.dimensionless_angles()))
    F1.scalebar.set_label('5000 au / 0.025 pc')
    F1.scalebar.set_color('k')

    F1.save(paths.fpath("{0}_continuum_contours_on_ch3oh1029.png".format(source)))

    matplotlib.pyplot.figure(2).clf()
    F = aplpy.FITSFigure(paths.dpath('W51_te_continuum_best.fits'),
Exemplo n.º 24
0
def cutout_id_chem_map(
    yslice=slice(367, 467),
    xslice=slice(114, 214),
    vrange=[51, 60] * u.km / u.s,
    sourcename='e2',
    filelist=glob.glob(paths.dpath('merge/cutouts/*natural*e2e8*fits')),
    linere=re.compile("W51_b6_7M_12M_natural.(.*).image.pbcor"),
    chem_name='HNCO',
):

    maps = {}
    energies = {}
    degeneracies = {}
    frequencies = {}
    indices = {}

    assert len(filelist) > 1

    for ii, fn in enumerate(ProgressBar(filelist)):
        if chem_name not in fn:
            log.debug("Skipping {0} because it doesn't have {1}".format(
                fn, chem_name))
            continue
        if 'temperature' in fn or 'column' in fn:
            continue

        cube = SpectralCube.read(fn)[:, yslice, xslice]
        print(yslice, xslice)
        print(cube)
        bm = cube.beams[0]
        #jtok = bm.jtok(cube.wcs.wcs.restfrq*u.Hz)
        cube = cube.to(u.K, bm.jtok_equiv(cube.wcs.wcs.restfrq * u.Hz))

        slab = cube.spectral_slab(*vrange)
        cube.beam_threshold = 1
        #contguess = cube.spectral_slab(0*u.km/u.s, 40*u.km/u.s).percentile(50, axis=0)
        #contguess = cube.spectral_slab(70*u.km/u.s, 100*u.km/u.s).percentile(50, axis=0)
        mask = (cube.spectral_axis < 40 * u.km / u.s) | (cube.spectral_axis >
                                                         75 * u.km / u.s)
        contguess = cube.with_mask(mask[:, None, None]).percentile(30, axis=0)
        slabsub = (slab - contguess)
        slabsub.beam_threshold = 0.15
        m0 = slabsub.moment0()

        label = linere.search(fn).groups()[0]
        frq = name_to_freq[label]

        closest_ind = np.argmin(np.abs(frqs - frq))
        closest_key = list(rt.keys())[closest_ind]
        closest_rt = rt[closest_key]
        upperstate = hnco.data['States'][closest_rt.UpperStateRef]
        upperen = u.Quantity(float(upperstate.StateEnergyValue),
                             unit=upperstate.StateEnergyUnit)

        maps[label] = m0
        energies[label] = upperen
        degeneracies[label] = int(upperstate.TotalStatisticalWeight)
        indices[label] = closest_ind
        frequencies[label] = frq

    # make sure the dict indices don't change order
    energy_to_key = {v: k for k, v in energies.items()}
    order = sorted(energy_to_key.keys())
    keys = [energy_to_key[k] for k in order]

    cube = np.empty((len(maps), ) + maps[label].shape)
    xaxis = u.Quantity([energies[k] for k in keys])
    xaxis = xaxis.to(u.erg, u.spectral()).to(u.K, u.temperature_energy())
    for ii, key in enumerate(keys):
        # divide by degeneracy
        cube[ii, :, :] = maps[key]

    frequencies = u.Quantity([frequencies[k] for k in keys])
    indices = [indices[k] for k in keys]
    degeneracies = [degeneracies[k] for k in keys]

    return xaxis, cube, maps, energies, frequencies, indices, degeneracies, m0.hdu.header
from astropy import units as u
from astropy.io import fits
import aplpy
from fnames import fnames, cube_names, continua

distance = 5.1*u.kpc
e1e2 = coordinates.ICRS(290.93268,14.508363,unit=('deg','deg'))

#aplpy.make_rgb_cube( ('W51-CBAND-feathered.fits','W51-X-ABCD-S1.VTESS.VTC.DAVID-MEH.fits','W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits'), 'W51_CXU_rgb' )

pl.close(1)
figure = pl.figure(1)
figure.clf()

# clean the header of junk axes
hdu = fits.open(dpath(continua['11_cont_both_2048']))
for ii in [3,4]:
    for kk in ['CRVAL','CTYPE','CDELT','CRPIX','CUNIT','NAXIS']:
        k = kk+str(ii)
        if k in hdu[0].header:
            del hdu[0].header[k]
hdu[0].header['NAXIS'] = 2
hdu[0].data = hdu[0].data.squeeze()

F = aplpy.FITSFigure(hdu,convention='calabretta',figure=figure)
F.tick_labels.set_xformat('dd.dd')
F.tick_labels.set_yformat('dd.dd')
F.tick_labels.set_font(size=20)
F.axis_labels.set_font(size=20)
F.show_grayscale(stretch='arcsinh',vmin=-5e-4,vmax=0.011)
#e1 = coordinates.ICRS(290.93263,14.50745,unit=('deg','deg'))
import re
import pyspeckit
import glob
import paths
import aplpy
import pyregion
import pylab as pl
from astropy import units as u

pl.figure(1).clf()
pl.figure(2).clf()

# sanity check: are the regions in the right place?
F = aplpy.FITSFigure(
    paths.dpath('longbaseline/W51e2cax.cont.image.pbcor.fits'),
    figure=pl.figure(1))
F.show_grayscale(vmax=0.015)
region_list = pyregion.open(
    paths.rpath("cores_longbaseline_spectralextractionregions.reg"))
F.show_regions(region_list)
F.recenter(290.9332, 14.509589, 0.5 / 3600.)

spectra_se_emission = pyspeckit.Spectra(
    glob.glob(
        paths.dpath('longbaseline/spectra/e2e_se_emission_W51e2_spw*fits')))
spectra_center = pyspeckit.Spectra(
    glob.glob(paths.dpath('longbaseline/spectra/e2e_center_W51e2_spw*fits')))
spectra_left = pyspeckit.Spectra(
    glob.glob(paths.dpath('longbaseline/spectra/e2e_left_W51e2_spw*fits')))
spectra_right = pyspeckit.Spectra(
    glob.glob(paths.dpath('longbaseline/spectra/e2e_right_W51e2_spw*fits')))
import pylab as pl
from astropy.io import fits
from astropy.wcs import WCS
from astropy import wcs
from astropy.nddata import Cutout2D
from spectral_cube import SpectralCube
import numpy as np
from astropy import units as u
from outflow_meta import e2e, between_e2e_and_e8, e8fil, north
import aplpy

from get_m0 import get_mom0

#'CH3OH808-716':'CH$_3$OH $8_{0,8}-7_{1,6}$',

fn = paths.dpath('merge/W51_b6_7M_12M.CH3OH808-716.image.pbcor.fits')
cube = SpectralCube.read(fn)
m0 = get_mom0(fn)

blue_fits_fn = paths.dpath('moments/w51_12co2-1_blue0to45_masked.fits')
red_fits_fn = paths.dpath('moments/w51_12co2-1_red73to130_masked.fits')
red_fits = fits.open(red_fits_fn)
blue_fits = fits.open(blue_fits_fn)

redhead = red_fits[0].header
bluehead = blue_fits[0].header
red_wcs = wcs.WCS(redhead)
blue_wcs = wcs.WCS(bluehead)


#ax = fig1.add_axes([0.15, 0.1, 0.8, 0.8], projection=cube.wcs.celestial)
refval = lonmax

outheader = f3[0].header.copy()
outheader['NAXIS1'] = int(npix)
outheader['CRPIX1'] = refpix
outheader['CRVAL1'] = refval
outheader['EQUINOX'] = 2000
del outheader['CROTA1']
del outheader['CROTA2']
del outheader['CROTA3']

r1 = FITS_tools.cube_regrid.regrid_cube_hdu(f1[0], outheader, order=1)
r2 = FITS_tools.cube_regrid.regrid_cube_hdu(f2[0], outheader, order=1)
r3 = FITS_tools.cube_regrid.regrid_cube_hdu(f3[0], outheader, order=1)

stacked = fits.PrimaryHDU()
# assume ==0 means bad data
# cast out of boolean
addnan = lambda x,y: np.add(np.nan_to_num(x),np.nan_to_num(y),dtype='float')
add = lambda x,y: np.add(x,y,dtype='float')
weights = reduce(add, [((r1.data[212,:,:] != 0) & (np.isfinite(r1.data[212,:,:]))),
                       ((r2.data[212,:,:] != 0) & (np.isfinite(r2.data[212,:,:]))),
                       ((r3.data[212,:,:] != 0) & (np.isfinite(r3.data[212,:,:])))])
stacked.data = reduce(addnan, (r1.data, r2.data, r3.data))/weights
stacked.header = outheader
stacked.writeto(paths.dpath2('grs_48and50_cube.fits'), clobber=True)

outhead2 = fits.getheader(paths.dpath('W51_H2CO11_cube_supersampled.fits'))
stacked_reproj = FITS_tools.cube_regrid.regrid_cube_hdu(stacked, outhead2, order=1)
stacked_reproj.writeto(paths.dpath2('grs_48and50_cube_supersampledh2cogrid.fits'), clobber=True)
import numpy as np
from astropy import units as u
import os
import pylab as pl
import aplpy
import paths
from astropy.io import fits
from astropy.nddata import Cutout2D
from astropy import wcs
import paths
from outflow_meta import e2e, e2e_reference_vector, e8fil, north
from spectral_cube import SpectralCube
from astropy.visualization import SqrtStretch,AsinhStretch
from astropy.visualization.mpl_normalize import ImageNormalize

co21fn = paths.dpath('12m/w51_12CO_21_contsub_hires.image.pbcor.fits')
so65fn = paths.dpath('12m/w51_SO_65-54_contsub.fits')


# I manually did this, which was pointless, but 7 km/s slices look best
slabs = [#(-55,-48),
         (-48,-41),
         (-41,-34),
         (-34,-27),
         (-27,-24),
         (-20,-13),
         (-13,-6),
         (-6,1),
         (1,8),
         (8,15),
         (15,22),
Exemplo n.º 30
0
pl.matplotlib.rc_file('pubfiguresrc')

h77a_freq = pyspeckit.spectrum.models.hydrogen.rrl(77)*u.GHz
he77a_freq = pyspeckit.spectrum.models.hydrogen.rrl(77, amu=4)*u.GHz
c77a_freq = pyspeckit.spectrum.models.hydrogen.rrl(77, amu=12)*u.GHz

# Read in all spectra extracted to the h77a directory matching the "best" h77a file
# May 18, 2015: I think H77a big2 is best, but I haven't inspected.  EDIT: big2 is in velocity.
# September 9, 2015: I think I deleted big2
# Exclude "mol" files since they are molecular and should be extracted from the molecular cubes
# Exclude "?" files since they are misnamed and use the obsolete scheme from
# before I decided upon e9/e10
sp = [pyspeckit.Spectrum(x) for x in
      ProgressBar(
          glob.glob(
              paths.dpath(
                  "spectra_h77/H77a_BDarray_speccube_uniform_contsub_cvel_big2*e[0-9]*.fits")))
      if 'mol' not in x and '?' not in x
     ]
spectra = sp
# Also fit, but don't include in the table, the IRS 1 / IRS 2 / Lacy Jet spectra
# (important for inspecting for CRRLs)
sp_other = [pyspeckit.Spectrum(x) for x in
            ProgressBar(
                glob.glob(
                    paths.dpath(
                        "spectra_h77/H77a_BDarray_speccube_uniform_contsub_cvel_big_[ilr]*.fits")))
            if 'mol' not in x and '?' not in x
           ]

# My manual inspection: which are detected?
# weakdetections are those that are not clearly believable
import pylab as pl
from astropy.io import fits
import paths
import numpy as np

ftemplate = '{line}_cube_smooth_bl_{ttype}.fits'

d322 = {'ttype':'wtdmeantemperature',
        'line':'H2CO_322221_to_303202'}
t322 = fits.getdata(paths.dpath(ftemplate.format(**d322)))

d321 = {'ttype':'wtdmeantemperature',
        'line':'H2CO_321220_to_303202'}
t321 = fits.getdata(paths.dpath(ftemplate.format(**d321)))

fig = pl.figure(1)
fig.clf()

histo321 = np.sort(t321, axis=0)
ax = fig.add_subplot(2,1,1)
im = ax.imshow(histo321, cmap='RdYlBu_r', vmin=20, vmax=120)
fig.colorbar(im)

histo322 = np.sort(t322, axis=0)
ax = fig.add_subplot(2,1,2)
im = ax.imshow(histo322, cmap='RdYlBu_r', vmin=20, vmax=120)
fig.colorbar(im)

fig2 = pl.figure(2)
#for threshold, sign, color in zip([20,30,40,50,50,80,100,120],
#                                 [-1,-1,-1,-1, 1, 1,  1,  1],
    fig5.savefig(paths.fpath("cont_max_slab_{0}{1}.{2}"
                             .format(sourcename, suffix, filetype)),
                 bbox_inches='tight', dpi=300)




if __name__ == "__main__":

    linere = re.compile("W51_b6_12M.(.*).image.pbcor")

    chem_plot_single(linere, yslice=slice(357,477), xslice=slice(104,224),
                     vrange=[51,60]*u.km/u.s, sourcename='e2', vmax_max=200,
                     contourlevels=[150,200,250,300],
                     filelist=glob.glob(paths.dpath('12m/cutouts/W51_b6_12M.*e2e8*fits')))


    chem_plot_single(linere, yslice=slice(227,347), xslice=slice(119,239),
                     vrange=[52,63]*u.km/u.s, sourcename='e8', vmax_max=200,
                     contourlevels=[150,200,250,300],
                     filelist=glob.glob(paths.dpath('12m/cutouts/W51_b6_12M.*e2e8*fits')))


    chem_plot_single(linere, yslice=slice(31,231), xslice=slice(152,350),
                     vrange=[54,64]*u.km/u.s, sourcename='north', vmax_max=200,
                     contourlevels=[150,200,250,300],
                     filelist=glob.glob(paths.dpath('12m/cutouts/W51_b6_12M.*north*fits')))

    chem_plot_single(linere, yslice=slice(50,150), xslice=slice(80,180),
                     vrange=[58,67]*u.km/u.s, sourcename='ALMAmm14',
    fpath = lambda x: os.path.join('moments',x)

for cubefn in glob.glob("full*fits"):
    for (linename, freq_, dv, spw) in line_to_image_list:
        freq = u.Quantity(float(freq_.strip('GHz')), unit=u.GHz)

        try:
            cube = SpectralCube.read(cubefn)
        except Exception as ex:
            print(cubefn, ex)
            raise ex
            continue

        outfn = "{0}_{1}".format(linename, cubefn)

        m0fn = paths.dpath("moments/{0}_medsub_moment0.fits".format(outfn))
        m1fn = paths.dpath("moments/{0}_medsub_moment1.fits".format(outfn))
        m2fn = paths.dpath("moments/{0}_medsub_moment2.fits".format(outfn))
        maxfn = paths.dpath("moments/{0}_medsub_max.fits".format(outfn))

        vcube = cube.with_spectral_unit(u.km/u.s, velocity_convention='radio',
                                        rest_value=freq).spectral_slab(20*u.km/u.s,
                                                                       95*u.km/u.s)

        if vcube.shape[0] < 10:
            print("Skipping {0} for line {1} because it's not in the cube".format(cubefn, linename))
            continue
        if hasattr(vcube, 'beams') and not any([bm.isfinite for bm in vcube.beams]):
            print("Skipping {0} for line {1} because of bad beams".format(cubefn, linename))
            continue
def chem_plot_single(linere, yslice=slice(367,467), xslice=slice(114,214),
                     vrange=[51,60]*u.km/u.s, sourcename='e2',
                     filelist=glob.glob(paths.dpath('12m/cutouts/*e2e8*fits')),
                     # 5,8 -> 12.8,8
                     # 6,8 -> 12.0,8.6
                     # 5,9 -> 15.0,8.0
                     # 6,9 -> 15,9.6
                     #plotgrid=(6,9), figsize=(15.0, 9.6),
                     figsize=(12.0, 8.6),
                     suffix="",
                     vmax_m0=5.0,
                     vmax_max=150,
                     maxbeam=0.5*u.arcsec,
                     contourlevels=None,
                     filetype='pdf',
                    ):

    text_fontsize = 4.5 if filetype=='png' else 9

    for ii in range(1,7):
        if not all(pl.figure(ii, figsize=figsize).get_size_inches() == figsize):
            pl.close(ii)

    fig1 = pl.figure(1, figsize=figsize)
    fig1.clf()

    fig2 = pl.figure(2, figsize=figsize)
    fig2.clf()

    fig3 = pl.figure(3, figsize=figsize)
    fig3.clf()

    fig4 = pl.figure(4, figsize=figsize)
    fig4.clf()

    fig5 = pl.figure(5, figsize=figsize)
    fig5.clf()

    fig6 = pl.figure(6, figsize=figsize)
    fig6.clf()

    figcounter = 0

    for ii,fn in enumerate(ProgressBar(filelist)):

        linename = linere.search(fn).groups()[0]
        if linename not in labeldict:
            print()
            print("Skipping {0} because it's not in the label dict".format(linename))
            continue
        label = labeldict[linename]

        # cache the results for use in other work, later use, ...
        m0fitsfn = paths.dpath("chemslices/chemical_m0_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        m1fitsfn = paths.dpath("chemslices/chemical_m1_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        m2fitsfn = paths.dpath("chemslices/chemical_m2_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        maxfitsfn = paths.dpath("chemslices/chemical_max_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        maxsubfitsfn = paths.dpath("chemslices/chemical_max_sub_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        madstdfitsfn = paths.dpath("chemslices/chemical_madstd_slabs_{0}_{1}{2}.fits".format(sourcename, linename, suffix))
        if not (os.path.exists(m0fitsfn) and
                os.path.exists(m2fitsfn) and
                os.path.exists(maxfitsfn) and
                os.path.exists(madstdfitsfn)):
            print()
            print("Extracting max/m0/m1/m2 for {0}".format(fn))
            cube = SpectralCube.read(fn)[:,yslice,xslice]
            goodbeams = np.array([bm.major < maxbeam for bm in cube.beams], dtype='bool')
            if np.count_nonzero(goodbeams) < 5:
                print()
                print("Skipping {0} because it has too few good beams.".format(fn))
                continue

            cube = cube.with_mask(goodbeams[:,None,None])
            cube = cube.minimal_subcube()


            if cube.shape[0] == 0:
                print()
                print("Skipping {0} because it was masked out".format(fn))
                continue

            bm = cube.beams[0]
            restfreq = cube.wcs.wcs.restfrq
            cube = cube.to(u.K, bm.jtok_equiv(restfreq*u.Hz))

            slab = cube.spectral_slab(*vrange)
            cube.beam_threshold = 1
            #contguess = cube.spectral_slab(0*u.km/u.s, 40*u.km/u.s).percentile(50, axis=0)
            #contguess = cube.spectral_slab(70*u.km/u.s, 100*u.km/u.s).percentile(50, axis=0)
            mask = (cube.spectral_axis<40*u.km/u.s) | (cube.spectral_axis > 75*u.km/u.s)
            try:
                contguess = cube.with_mask(mask[:,None,None]).percentile(30, axis=0)
            except ValueError as ex:
                print()
                print("skipping {0}".format(fn))
                print(ex)
                continue
            slabsub = (slab-contguess)
            slab.beam_threshold = 0.25
            slabsub.beam_threshold = 0.25
            m0 = slabsub.moment0()
            m1 = slabsub.moment1()
            m2 = slabsub.moment2()
            max_sub = slabsub.max(axis=0)
            max = slab.max(axis=0)
            madstd = cube.with_mask(mask[:,None,None]).apply_function(mad_std,
                                                                      axis=0,
                                                                      projection=True,
                                                                      progressbar=True,
                                                                      unit=cube.unit,)

            m0.write(m0fitsfn, overwrite=True)
            m1.write(m1fitsfn, overwrite=True)
            m2.write(m2fitsfn, overwrite=True)
            max.write(maxfitsfn, overwrite=True)
            max_sub.write(maxsubfitsfn, overwrite=True)
            madstd.write(madstdfitsfn, overwrite=True)
            maxfh = max.hdu
        else:
            m0fh = fits.open(m0fitsfn)
            m1fh = fits.open(m1fitsfn)
            m2fh = fits.open(m2fitsfn)
            maxfh = fits.open(maxfitsfn)[0]
            maxsubfh = fits.open(maxsubfitsfn)
            madstdfh = fits.open(madstdfitsfn)

            m0 = Projection(value=m0fh[0].data, header=m0fh[0].header,
                            wcs=wcs.WCS(m0fh[0].header),
                            unit=u.Unit(m0fh[0].header['BUNIT']),)
            m1 = Projection(value=m1fh[0].data, header=m1fh[0].header,
                            wcs=wcs.WCS(m1fh[0].header),
                            unit=u.Unit(m1fh[0].header['BUNIT']),)
            m2 = Projection(value=m2fh[0].data, header=m2fh[0].header,
                            wcs=wcs.WCS(m2fh[0].header),
                            unit=u.Unit(m2fh[0].header['BUNIT']),)
            max = Projection(value=maxfh.data, header=maxfh.header,
                             wcs=wcs.WCS(maxfh.header),
                             unit=u.Unit(maxfh.header['BUNIT']),)
            max_sub = Projection(value=maxsubfh[0].data,
                                 header=maxsubfh[0].header,
                                 wcs=wcs.WCS(maxsubfh[0].header),
                                 unit=u.Unit(maxsubfh[0].header['BUNIT']),)
            madstd = Projection(value=madstdfh[0].data,
                                header=madstdfh[0].header,
                                wcs=wcs.WCS(madstdfh[0].header),
                                unit=u.Unit(madstdfh[0].header['BUNIT']),)

            bm = radio_beam.Beam.from_fits_header(m0fh[0].header)
            restfreq = m0fh[0].header['RESTFRQ']

        jtok = bm.jtok(restfreq*u.Hz)


        fig1 = pl.figure(1, figsize=figsize)
        fig1.clf()
        ax1 = fig1.gca()

        im1 = ax1.imshow(m0.value, vmin=-1.25*jtok.value, vmax=vmax_m0*jtok.value,
                         cmap=pl.cm.bone_r, interpolation='nearest', origin='lower')
        ax1.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize)
        ax1.set_xticklabels([])
        ax1.set_yticklabels([])
        ax1.set_xticks([])
        ax1.set_yticks([])
        ax1.set_aspect('equal')
        cb = pl.colorbar(mappable=im1)

        cb.set_label("Flux Density (K km s$^{-1}$)", fontsize=12)
        fig1.savefig(paths.fpath("chemical_slabs/{3}_chemical_m0_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)


        fig2 = pl.figure(2, figsize=figsize)
        fig2.clf()
        ax2 = fig2.gca()

        im2 = ax2.imshow(m1.value, vmin=vrange[0].value, vmax=vrange[1].value,
                         cmap='seismic', interpolation='nearest', origin='lower')
        ax2.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize, color='g')
        ax2.set_xticklabels([])
        ax2.set_yticklabels([])
        ax2.set_xticks([])
        ax2.set_yticks([])
        ax2.set_aspect('equal')
        cb = pl.colorbar(mappable=im2)

        cb.set_label("Velocity (km s$^{-1}$)", fontsize=12)
        fig2.savefig(paths.fpath("chemical_slabs/{3}_chemical_m1_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)

        fig3 = pl.figure(3, figsize=figsize)
        fig3.clf()
        ax3 = fig3.gca()

        im3 = ax3.imshow(max_sub.value, vmin=-10, vmax=vmax_max,
                         cmap=pl.cm.bone_r, interpolation='nearest', origin='lower')
        # add a contour to show the regions that are "saturated" above T_max
        if contourlevels is None:
            contourlevels = [vmax_max, 300, 400, 500]
        qcs = ax3.contour(max_sub.value, levels=contourlevels, colors=['r','g','b','y'])
        #print("levels: {0} = {1}".format(qcs.levels, contourlevels))
        ax3.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize, color='r')
        ax3.set_xticklabels([])
        ax3.set_yticklabels([])
        ax3.set_xticks([])
        ax3.set_yticks([])
        ax3.set_aspect('equal')
        cb = pl.colorbar(mappable=im3)

        cb.set_label("Peak Brightness (K)", fontsize=12)
        fig3.savefig(paths.fpath("chemical_slabs/{3}_chemical_max_contsub_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)

        fig5 = pl.figure(5, figsize=figsize)
        fig5.clf()
        ax5 = fig5.gca()

        im5 = ax5.imshow(max.value, vmin=-10, vmax=vmax_max,
                         cmap=pl.cm.bone_r, interpolation='nearest', origin='lower')
        # add a contour to show the regions that are "saturated" above T_max
        qcs = ax5.contour(max.value, levels=contourlevels, colors=['r','g','b','y'])
        if False: # debug
            print("levels: {0} = {1}".format(qcs.levels, contourlevels))
        ax5.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize, color='r')
        ax5.set_xticklabels([])
        ax5.set_yticklabels([])
        ax5.set_xticks([])
        ax5.set_yticks([])
        ax5.set_aspect('equal')
        cb = pl.colorbar(mappable=im5)

        cb.set_label("Peak Brightness (K)", fontsize=12)
        fig5.savefig(paths.fpath("chemical_slabs/{3}_chemical_max_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)

        fig4 = pl.figure(4, figsize=figsize)
        fig4.clf()
        ax4 = fig4.gca()

        im4 = ax4.imshow(madstd.value,
                         cmap=pl.cm.bone_r, interpolation='nearest', origin='lower')
        ax4.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize, color='r')
        ax4.set_xticklabels([])
        ax4.set_yticklabels([])
        ax4.set_xticks([])
        ax4.set_yticks([])
        ax4.set_aspect('equal')
        cb = pl.colorbar(mappable=im4)

        cb.set_label("MAD StdDev (K)", fontsize=12)
        fig4.savefig(paths.fpath("chemical_slabs/{3}_chemical_madstd_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)

        fig6 = pl.figure(6, figsize=figsize)
        fig6.clf()
        ax6 = fig6.gca()

        im6 = ax6.imshow((m2**0.5).to(u.km/u.s).value * SIGMA2FWHM, vmin=0, vmax=15,
                         cmap='viridis', interpolation='nearest', origin='lower')
        ax6.text(3, 0.87*m0.shape[0], label, fontsize=text_fontsize, color='k')
        ax6.set_xticklabels([])
        ax6.set_yticklabels([])
        ax6.set_xticks([])
        ax6.set_yticks([])
        ax6.set_aspect('equal')
        cb = pl.colorbar(mappable=im6)

        cb.set_label("Velocity Dispersion (km s$^{-1}$)", fontsize=12)
        fig6.savefig(paths.fpath("chemical_slabs/{3}_chemical_m2_slab_{0}{1}.{2}"
                                 .format(sourcename, suffix, filetype,
                                         linename)),
                     bbox_inches='tight', dpi=300)

        figcounter += 1


    ax5 = fig5.gca()
    ax5.cla()

    cont = get_cont(maxfh.header)

    im5 = ax5.imshow(cont.value, vmin=-10, vmax=vmax_max,
                     cmap=pl.cm.bone_r, interpolation='nearest', origin='lower')
    # add a contour to show the regions that are "saturated" above T_max
    ax5.contour(cont.value, levels=contourlevels, colors=['r','g','b','y'])
    ax5.text(3, 0.87*m0.shape[0], 'Continuum', fontsize=text_fontsize, color='r')
    ax5.set_xticklabels([])
    ax5.set_yticklabels([])
    ax5.set_aspect('equal')

    fig5.savefig(paths.fpath("cont_max_slab_{0}{1}.{2}"
                             .format(sourcename, suffix, filetype)),
                 bbox_inches='tight', dpi=300)
Exemplo n.º 35
0
import paths
from astropy.io import fits
from astropy.table import Column
import radio_beam
import astrodendro
from astropy import wcs
import masscalc
import photutils
from astropy.nddata.utils import Cutout2D
from astropy import coordinates


#contfile = fits.open(paths.dpath('selfcal_spw3_selfcal_4ampphase_mfs_tclean_deeper_10mJy.image.pbcor.fits'))
#ln selfcal_allspw_selfcal_4ampphase_mfs_tclean_deeper_5mJy.image.pbcor.fits W51_te_continuum_best.fits
#ln selfcal_allspw_selfcal_4ampphase_mfs_tclean_deeper_5mJy.residual.fits W51_te_continuum_best_residual.fits
contfile = fits.open(paths.dpath('W51_te_continuum_best.fits'))
data = contfile[0].data

radiofilename = os.path.join(paths.vlapath,
                             'data/W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits')
radio_image = fits.open(radiofilename)

# estimate the noise from the local standard deviation of the residuals
residfile = fits.open(paths.dpath('12m/continuum/W51_te_continuum_best_residual.fits'))
resid = residfile[0].data
smresid = convolve_fft(np.nan_to_num(resid), Gaussian2DKernel(30))
resid[np.isnan(resid)] = 0.01 # make the noise outside very high
# NOT CORRECT noise = convolve_fft(np.abs(resid-smresid),  Gaussian2DKernel(30))
noise = convolve_fft((resid-smresid)**2,  Gaussian2DKernel(30))**0.5
residfile[0].data = noise
residfile.writeto(paths.dpath('W51_te_continuum_best_noise.fits'), clobber=True)
Exemplo n.º 36
0
def freq(row):
    return u.Quantity(row['Freq'], u.GHz)

linenames = [linename(row) for tbl in tables for row in tbl]
linetexnames = [linename(row) for tbl in tables for row in tbl] + ided_linetexnames
linefreqs = np.hstack([u.Quantity([freq(row) for tbl in tables for row in tbl], u.GHz).value,
                       ided_linefreqs.value])
linefreqs = u.Quantity(linefreqs, u.GHz)

detection_table = table.Table.read(paths.tpath('salts_in_band.ipac'), format='ascii.ipac')
nondetections = (detection_table['Flag'] == '-n') | (detection_table['Flag'] == 'cn')
detection_table = detection_table[~nondetections]



flist = [fn] if 'fn' in locals() else glob.glob(paths.dpath('stacked_spectra/OrionSourceI_*robust0.5.fits'))
for fn in flist:
    print(fn)

    sp_st = pyspeckit.Spectrum(fn)

    pl.figure(0, figsize=(16,6)).clf()
    sp_st.plotter(figure=pl.figure(0, figsize=(16,6)), clear=True)

    basefn = os.path.split(fn)[-1]

    sp_st.plotter(ymin=-0.0025, ymax=0.01)
    sp_st.plotter.line_ids(linetexnames, linefreqs, velocity_offset=-vcen,
                           label1_size=16,
                           auto_yloc_fraction=0.75)
    for txt in sp_st.plotter.axis.texts:
Exemplo n.º 37
0
import paths
from common_constants import distance
import FITS_tools

pl.close(1)
figure = pl.figure(1)
figure.clf()

def set_tight_ticks(F):
    F.tick_labels.set_yformat('dd:mm:ss.ss')
    F.tick_labels.set_xformat('hh:mm:ss.ss')
    F.ticks.set_xspacing(0.002)
    F.ticks.set_yspacing(0.002)
    F.tick_labels.set_x_full_label_side('left')

hdu = fits.open(paths.dpath('naco_Kband_W51.fits'))
w = wcs.WCS(hdu[0].header)

F = aplpy.FITSFigure(hdu,convention='calabretta',figure=figure)
F.set_auto_refresh(False)
#F = aplpy.FITSFigure(dpath+'W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.rot45.fits',convention='calabretta',figure=figure)
#F.tick_labels.set_xformat('dd.ddd')
#F.tick_labels.set_yformat('dd.ddd')
F.tick_labels.set_font(size=20)
F.axis_labels.set_font(size=20)
F.show_grayscale(stretch='log',vmin=-1,vmid=-1.5,vmax=1e2,invert=True)
#e1 = coordinates.ICRS(290.93263,14.50745,unit=('deg','deg'))
#F.recenter(e1.ra.value,e1.dec.value,width=1/60.,height=1/60.)
#F.recenter(290.92633,14.514769,radius=1.4/60.)

F.add_scalebar(length=((0.5 * u.pc)/distance*u.radian).to(u.degree).value)
               'north': detection_threshold_jykms*approximate_jytok,
               'ALMAmm14': 0.001*approximate_jytok, # not real, just for better fits..
              }

    # use precomputed moments from medsub_moments
    for sourcename, region in (('e2','e2e8'), ('e8','e2e8'), ('north','north'),
                               ('ALMAmm14','ALMAmm14'),):

        # use 3-sigma instead of arbitrary
        # replace_bad = dthresh[sourcename]
        replace_bad = False
                                
        _ = cutout_id_chem_map(source=sources[sourcename],
                               radius=radii[sourcename],
                               sourcename=sourcename,
                               filelist=glob.glob(paths.dpath('12m/moments/*medsub_moment0.fits')),
                               chem_name='.CH3OH', # use dot to exclude 13CH3OH
                              )
        xaxis,cube,ecube,maps,map_error,energies,cubefrequencies,indices,degeneracies,header = _

        pl.figure(2, figsize=(12,12)).clf()
        sample_pos = np.linspace(0,1,7)[1:-1]
        nx = len(sample_pos)
        ny = len(sample_pos)
        for ii,(spy,spx) in enumerate(itertools.product(sample_pos,sample_pos)):
            rdx = int(spx*cube.shape[2])
            rdy = int(spy*cube.shape[1])
            plotnum = (nx*ny-(2*(ii//ny)*ny)+ii-ny)+1
            pl.subplot(nx,ny,plotnum)

            #uplims = nupper_of_kkms(replace_bad, cubefrequencies,
Exemplo n.º 39
0
        (nsio / cosmic_si_abundance * beam_area * u.Da / 0.739).to(u.M_sun),
        (nsio / xsio * beam_area * 2.8 * u.Da).to(u.M_sun)))

    peak_velocity = 115 * u.km / u.s
    # assume ~2 beams...
    distance = (0.07 * u.arcsec * dw51).to(u.km, u.dimensionless_angles())

    timescale = distance / peak_velocity

    print("north Mass rate = {0:0.3g} to {1:0.3g}".format(
        (nsio / cosmic_si_abundance * beam_area * u.Da / 0.739).to(u.M_sun) /
        timescale.to(u.yr),
        (nsio / xsio * beam_area * 2.8 * u.Da).to(u.M_sun) /
        timescale.to(u.yr)))

    north_ds = paths.dpath('longbaseline/W51north_siocube_downsampled.fits')
    if os.path.exists(north_ds):
        sm_sio_cube_north = sm_sio_cube = SpectralCube.read(north_ds)
    else:
        siocube = (SpectralCube.read(
            paths.dpath(
                'longbaseline/linked/W51northcax.SPW0_ALL_medsub_cutout.fits')
        ).with_spectral_unit(u.km / u.s,
                             rest_value=ref_freq,
                             velocity_convention='radio').spectral_slab(
                                 -140 * u.km / u.s, 260 * u.km / u.s))
        fwhm_factor = np.sqrt(8 * np.log(2))
        hanning_factor = 1129 / 977
        current_resolution = np.mean(np.diff(
            siocube.spectral_axis)) * hanning_factor
        target_resolution = 10.0 * u.km / u.s
Exemplo n.º 40
0
            (100, 80),
            (75, 80),
        ]),
        ('ALMAmm14', 'ALMAmm14', (80, 180), (50, 150), (58, 67), [
            (65, 40),
            (45, 40),
        ]),
    ):

        _ = cutout_id_chem_map(
            yslice=slice(*yslice),
            xslice=slice(*xslice),
            vrange=vrange * u.km / u.s,
            sourcename=sourcename,
            filelist=glob.glob(
                paths.dpath(
                    'merge/cutouts/W51_b6_7M_12M.*{0}*fits'.format(region))),
            linere=re.compile("W51_b6_7M_12M.(.*).image.pbcor"),
            chem_name='HNCO',
        )
        xaxis, cube, maps, energies, cubefrequencies, indices, degeneracies, header = _

        import pylab as pl
        pl.matplotlib.rc_file('pubfiguresrc')

        pl.figure(2).clf()
        for rdx, rdy in rdposns:
            fit_tex(xaxis,
                    nupper_of_kkms(cube[:, rdy, rdx], cubefrequencies,
                                   einsteinAij[indices], degeneracies).value,
                    plot=True)
        pl.ylabel("log($N_u / g_u$)")
Exemplo n.º 41
0
from astropy.io import fits
from astropy import units as u
from h2co_modeling import lte_model
from constants import distance
import numpy as np
import paths
import reproject
import pylab as pl
import aplpy
import matplotlib
cm = matplotlib.cm.RdYlBu_r
cm.set_bad('#888888')


fn303merge = paths.dpath('merge/moments/W51_b6_7M_12M.H2CO303_202.image.pbcor_medsub_max.fits')
fn321merge = paths.dpath('merge/moments/W51_b6_7M_12M.H2CO321_220.image.pbcor_medsub_max.fits')
fn322merge = paths.dpath('merge/moments/W51_b6_7M_12M.H2CO322_221.image.pbcor_medsub_max.fits')
fn303_12m = paths.dpath('12m/moments/W51_b6_12M.H2CO303_202.image.pbcor_medsub_max.fits')
fn321_12m = paths.dpath('12m/moments/W51_b6_12M.H2CO321_220.image.pbcor_medsub_max.fits')
fn322_12m = paths.dpath('12m/moments/W51_b6_12M.H2CO322_221.image.pbcor_medsub_max.fits')

fh321merge = fits.open(fn321merge)
fh322merge = fits.open(fn322merge)
fh303merge = fits.open(fn303merge)

reproj321merge = reproject.reproject_interp(fh321merge[0], fh303merge[0].header)
ratio321merge_fh = fits.PrimaryHDU(data=reproj321merge[0]/fh303merge[0].data, header=fh303merge[0].header)
ratio321merge_fh.data[fh303merge[0].data < 0.02] = np.nan
ratio321merge_fh.data[ratio321merge_fh.data < 0.01] = np.nan
ratio321merge_fh.writeto(paths.dpath('merge/moments/H2CO_321_to_303_max_ratio.fits'), clobber=True)
Exemplo n.º 42
0
import numpy as np
import os
import spectral_cube.analysis_utilities
from spectral_cube import SpectralCube
from astropy import units as u
from astropy.io import fits
import paths
from paths import fcp
import pylab as pl
import regions
import reproject

# step 1: create a velocity map

vmap_name = paths.dpath('disk_velocity_map.fits')
if not os.path.exists(vmap_name):
    cube = SpectralCube.read(
        paths.dpath(
            'cubes/OrionSourceI_Unknown_4_robust0.5.maskedclarkclean10000_medsub_K.fits'
        ))
    cube = SpectralCube.read(
        paths.dpath(
            'cubes/OrionSourceI_Unknown_4_robust0.5maskedclarkclean10000_medsub_K.fits'
        ))
    m1 = cube.moment1()
    m0 = cube.moment0()
    mask = m0.value > 300

    vmap = m1
    vmap[~mask] = np.nan
import numpy as np
from astropy import coordinates
from astropy import units as u
from astropy.io import fits
from astropy import wcs
import pyregion
import paths

fh = fits.open(paths.dpath('longbaseline/W51e2cax.cont.image.pbcor.fits'))
mywcs = wcs.WCS(fh[0].header).sub([wcs.WCSSUB_CELESTIAL])
pixscale = (mywcs.pixel_scale_matrix**2).sum()**0.5
reg = pyregion.open(
    paths.rpath('cores_longbaseline_spectralextractionregions_pix.reg'))

with open(paths.rpath('cores_longbaseline_spectralextractionregions.reg'),
          'w') as rfh:
    rfh.write("global color=red\n")
    rfh.write("fk5\n")

    for rr in reg:
        if rr.name == 'circle':
            x, y = mywcs.wcs_pix2world(rr.coord_list[0], rr.coord_list[1], 1)
            r = pixscale * rr.coord_list[2]
            rfh.write("circle({0}, {1}, {2}) # text={{{3}}}\n".format(
                x, y, r, rr.attr[1]['text']))
        elif rr.name == 'ellipse':
            x, y = mywcs.wcs_pix2world(rr.coord_list[0], rr.coord_list[1], 1)
            maj, min = pixscale * np.array(rr.coord_list[2:4])
            pa = rr.coord_list[4]
            rfh.write(
                "ellipse({0}, {1}, {2}, {3}, {4}) # text={{{5}}}\n".format(
from astropy import convolution
from astropy import units as u
from astropy import wcs
from astropy.io import fits
from astropy import stats
import paths
import pylab as pl
from scipy.ndimage import map_coordinates
import scipy.signal
import reproject

from files import b3_hires_cont, b6_hires_cont, b7_hires_cont
from constants import source, extraction_path, origin, central_freqs

# vmap produced by stacked_line_search.py
vmap_name = paths.dpath('disk_velocity_map.fits')
hdu = fits.open(vmap_name)[0]
vmap = Projection.from_hdu(hdu)

b3beam = radio_beam.Beam.from_fits_header(
    fits.getheader(paths.dpath(b3_hires_cont)))

print("per-band continuum measurements in the spectral extraction aperture: ")
for ii, contfn in enumerate((b3_hires_cont, b6_hires_cont, b7_hires_cont)):
    band = contfn[14:16]

    conthdu = fits.open(paths.dpath(contfn))[0]

    ww = wcs.WCS(conthdu.header)

    #vmap_proj,_ = reproject.reproject_interp(vmap.hdu,
            #"Orion_SourceI_B6_continuum_r-2_automultithresh_1mJy.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r0.5.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean5mJy.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean4mJy.selfcal.phase0.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean3mJy.selfcal.phase1.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean2mJy.selfcal.phase2.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean1mJy.selfcal.phase3.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean0.5mJy.selfcal.phase4.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean5mJy.automultithresh.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean4mJy.automultithresh.selfcal.phase0.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean3mJy.automultithresh.selfcal.phase1.image.tt0.pbcor.fits",
            #"Orion_SourceI_B6_continuum_r-2.clean2mJy.automultithresh.selfcal.phase2.image.tt0.pbcor.fits",
            "Orion_SourceI_B6_continuum_r-2.clean0.1mJy.selfcal.ampphase5.deepmask.image.tt0.pbcor.fits",
            "Orion_SourceI_B3_continuum_r-2.clean0.25mJy.image.tt0.pbcor.fits",
    ):
        figure = inset_overlays(paths.dpath(fn),
                                zoomregions=zoomregions,
                                psffn=paths.dpath(
                                    fn.replace("image.tt0.pbcor", "psf.tt0")),
                                vmin=-0.0005,
                                vmax=0.005)
        figure.savefig(paths.fpath('fullfield_zooms/' + fn).replace(
            ".fits", "_inset.pdf"),
                       bbox_inches='tight',
                       dpi=300)

    zoomregions['SourceI']['min'] = -0.001
    zoomregions['SourceI']['max'] = 0.004
    #zoomregions['BN']['min'] = -0.001
    #zoomregions['BN']['max'] = 0.004
    #zoomregions['WMJ053514.797-052230.557']['min'] = -0.001
from astropy.io import fits
from astropy import units as u
import numpy as np
from paths import dpath

#f = fits.open('H2CO_11_speccube.fits')
f = fits.open(dpath('H2CO_11_speccube_contsub17_big_uniform.image.fits'))

beam = (np.pi*f[0].header['BMAJ']*f[0].header['BMAJ']*u.deg**2)
cont_offset = (2.7315*u.K).to(u.Jy,u.brightness_temperature(beam, 4.82966*u.GHz))

# try to fix NANs.... this definitely makes everything technically wrong, but more aesthetically useful
extra_cont_offset = 0.10

# 0.05 arbitrarily selected to get a decent match...
#cont = (f[0].data[0,100:300,:,:].sum(axis=0) + f[0].data[0,600:900,:,:].sum(axis=0)) / 500. + 0.05
cont = fits.getdata(dpath('H2CO_11_speccube_cont_16_18_big_uniform.image.fits')).squeeze() + cont_offset.value + extra_cont_offset

cspec = f[0].data[:70,:,:]
cspec[cspec > 0] = 0
spec = cspec + cont
# try to "subtract out" the negative continuum...
spec[:,cont<0] -= cont[cont<0]
cont[cont<0] = cont_offset.value + extra_cont_offset

# avoid huge NAN splotches
#spec[spec<0] = cont_offset.value

tau = -np.log((spec/cont))
tau[0,:,:] = cont # just so we have it... that first channel sucked anyway
Exemplo n.º 47
0
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.90023, 14.523703), (290.89873, 14.525156)], (2e-2, 0.3), 'd3', AsinhStretch()),
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.93729, 14.485868), (290.93594, 14.487230)], (-2e-2, 0.3), 'e7', AsinhStretch()),
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.93283, 14.506909), (290.93200, 14.507676)], (6e-2, 9), 'e1', AsinhStretch()),
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.92402, 14.513314), (290.90971, 14.525246)], (-6e-2, 5), 'irs2_C_low', AsinhStretch()),
     ("W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits", 'Ku', [ (290.92402, 14.513314), (290.90971, 14.525246)], (-6e-2, 5), 'irs2_Ku_low', AsinhStretch()),
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.92402, 14.513314), (290.90971, 14.525246)], (0, 13), 'irs2_C_high', AsinhStretch()),
     ("W51C_ACarray_continuum_4096_both_uniform_contsplit.clean.image.fits", 'C', [ (290.93024, 14.506951), (290.92676, 14.509907)], (-0.02, 1), 'peak_cluster_C_high', LinearStretch()),
     ("W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits", 'Ku', [ (290.92402, 14.513314), (290.90971, 14.525246)], (0, 52), 'irs2_Ku_high', AsinhStretch()),
     ("Cband_Epoch3sm-Epoch3.fits", 'C', [ (290.9304, 14.5083), (290.9194, 14.5189)], (-0.2, 1), 'w51main_peak_diff', LinearStretch()),
     ("Cband_Epoch3sm-Epoch3.fits", 'C', [ (290.92402, 14.513314), (290.90971, 14.525246)], (-0.2, 1.0), 'irs2_C_diff', LinearStretch()),
     ("Cband_Epoch3sm-Epoch3.fits", 'C', [ (290.93024, 14.506951), (290.92676, 14.509907)], (-0.02, 0.5), 'peak_cluster_C_diff', LinearStretch()),
    ):

    log.info("file {0} name {1}".format(fn, name))

    hdu = fits.open(paths.dpath(fn))[0]
    mywcs = wcs.WCS(hdu.header).sub([wcs.WCSSUB_CELESTIAL])
    wcsaxes = WCSaxes(mywcs.to_header())


    fig = pl.figure(1, figsize=(10,10))
    fig.clf()

    F = aplpy.FITSFigure(hdu, subplot=[0.15, 0.1, 0.8, 0.8], figure=fig)

    F.show_grayscale(invert=True, vmin=vmin/1e3, vmax=vmax/1e3, stretch='linear' if
                     stretch == LinearStretch() else 'arcsinh')

    cx = (coord_limits[0][0] + coord_limits[1][0])/2.
    cy = (coord_limits[0][1] + coord_limits[1][1])/2.
    # radius = diamater / 2.
from astropy import units as u
from sdpy import makecube
from paths import dpath

flat_vrange = [45,75]

cubename_lores_supersampled = dpath('W51_H2CO22_pyproc_cube_lores_supersampled')
linefreq = 14.488479e9
makecube.make_taucube(cubename_lores_supersampled,
                      cubename_lores_supersampled+"_continuum.fits",
                      etamb=0.886, linefreq=linefreq*u.Hz, tex=0)
makecube.make_flats(cubename_lores_supersampled.replace("cube","taucube"),
                    vrange=flat_vrange,noisevrange=[-50,-1],suffix='.fits')
makecube.make_flats(cubename_lores_supersampled, vrange=[45,75],
                    noisevrange=[-15,30])


linefreq = 4.8296594e9
cubename_supersampled = dpath('W51_H2CO11_cube_supersampled')
makecube.make_taucube(cubename_supersampled,
                      continuum=cubename_supersampled+"_continuum.fits",
                      linefreq=linefreq, tex=0) # etamb accounted for already , etamb=0.51)
makecube.make_flats(cubename_supersampled.replace("cube","taucube"),
                    vrange=flat_vrange,noisevrange=[-50,-1],suffix='.fits')
Exemplo n.º 49
0
from paths import dpath
from spectral_cube import SpectralCube
from astropy import units as u
from fnames import cube_names,rrl_cube_names
from astropy.table import Table,Column
from latex_info import latexdict, format_float

cube_names.update(rrl_cube_names)

errors = {}
cubes = {}
beams = {}
dv = {}

for name, fn in cube_names.items():
    cube = SpectralCube.read(dpath(fn)).with_spectral_unit(u.km/u.s,
                                                           velocity_convention='radio')
    print(cube)
    err = cube.std().to(u.mJy)
    print("{0} std: {1}".format(name, err))
    errors[name] = err
    cubes[name] = cube
    beams[name] = cube.beam
    dv[name] = np.diff(cube.spectral_axis).mean()

name_mapping = {'11_natural': '1-1 Natural', '11_uniform': '1-1 Uniform',
                '22_briggs0': '2-2 Briggs 0', '22_natural': '2-2 Natural',
                'H77a': 'H$77\\alpha$ Briggs 0'}

tbl = Table([Column(data=[name_mapping[name] for name in cube_names],
                    name="Cube ID"),
Exemplo n.º 50
0
annotate_kwargs = {'color': 'r'}
pl.close(1)

velo = {
    'ALMAmm24_W51n': 60 * u.km / u.s,
    'd2_W51n': 60 * u.km / u.s,
    'e2e_W51e2': 60 * u.km / u.s,
    'e2nw_W51e2': 60 * u.km / u.s,
    'e2w_W51e2': 60 * u.km / u.s,
    'e8_W51e2': 60 * u.km / u.s,
    'north_W51n': 60 * u.km / u.s,
}

for target in velo:
    files = glob.glob(
        paths.dpath("longbaseline/spectra/{0}*.fits".format(target)))
    for fn in files:
        sp = pyspeckit.Spectrum(fn)
        sp.xarr.convert_to_unit(u.GHz)
        print(fn, sp.xarr.min(), sp.xarr.max())

        fpre = os.path.splitext(os.path.split(fn)[-1])[0]

        species_names = [x[0] for x in line_to_image_list]
        frequencies = u.Quantity(
            [float(x[1].strip("GHz")) for x in line_to_image_list], unit=u.GHz)

        splat = Splatalogue.query_lines(sp.xarr.min(),
                                        sp.xarr.max(),
                                        chemical_name='NaCl|KCl',
                                        line_lists=['CDMS'])
Exemplo n.º 51
0
import FITS_tools
from astropy.io import fits
import paths

neiir = FITS_tools.regrid_cube_hdu(fits.open(paths.dpath('w51.neii.fits'))[0], outheader=fits.Header.fromtextfile(paths.dpath('w51.neii.square.hdr')))
neiir.writeto(paths.dpath('w51.neii.square.fits'))

sivr = FITS_tools.regrid_cube_hdu(fits.open(paths.dpath('w51.siv.fits'))[0], outheader=fits.Header.fromtextfile(paths.dpath('w51.siv.square.hdr')))
sivr.writeto(paths.dpath('w51.siv.square.fits'))
Exemplo n.º 52
0
import aplpy
from astropy import units as u
from astropy import coordinates
import paths
import pylab as pl
pl.matplotlib.rc_file('pubfiguresrc')

center = coordinates.SkyCoord('19:23:41.849 +14:30:56.70', frame='fk5', unit=(u.hour, u.deg))

ku_fn = '/Users/adam/work/w51/paper_w51_evla/data/W51Ku_BDarray_continuum_2048_both_uniform.hires.clean.image.fits'

fig = pl.figure(1)
fig.clf()
FF = aplpy.FITSFigure(paths.dpath('12m/continuum/selfcal_allspw_selfcal_3_mfs_deeper_r0.0.image.pbcor.fits'),
                      figure=fig)
FF.show_colorscale(cmap='bone_r', vmin=-0.005, vmax=0.025, stretch='log', vmid=-0.006)
FF.recenter(center.ra.deg, center.dec.deg, radius=0.0025)
FF.show_colorbar()
FF.add_scalebar((0.1*u.pc / (5400*u.pc)).to(u.deg,u.dimensionless_angles()))
FF.scalebar.set_color('w')
FF.scalebar.set_linewidth(4)
FF.scalebar.set_label("0.1 pc")
FF.scalebar.set_font_size(20)
FF.add_beam()
FF.beam.set_facecolor('none')
FF.beam.set_linewidth(2)
FF.beam.set_edgecolor('w')
FF.save(paths.fpath("e5_bubble.png"))

fig = pl.figure(1)
fig.clf()
import numpy as np
import pyregion
import paths
from astropy.io import fits
import radio_beam
from astropy import constants
from astropy import units as u
from astropy import wcs
import masscalc

fh = fits.open(paths.dpath('12m/continuum/selfcal_allspw_selfcal_3_mfs_deeper_r2.0.image.pbcor.fits'))

mywcs = wcs.WCS(fh[0].header)

beam = radio_beam.Beam.from_fits_header(fh[0].header)

pixscale = (mywcs.pixel_scale_matrix.diagonal()**2).sum()**0.5
ppbeam = (beam.sr/(pixscale**2*u.deg**2)).decompose().value / u.beam


for rpath in ('e5bubble_inclusive.reg', 'e5bubble_dustonly.reg'):
    print(rpath)
    reg = pyregion.open(paths.rpath(rpath))

    mask = reg.get_mask(fh[0])
    cutout = fh[0].data*mask

    limits = [0.005, 0.015]

    total_flux_perbeam = cutout[(cutout > limits[0]) & (cutout < limits[1])].sum()
    total_flux = total_flux_perbeam / ppbeam.value
fig3.savefig(paths.fpath('coreplots/peakTB_vs_continuum.png'),
             bbox_inches='tight')

fig4 = pl.figure(4)
fig4.clf()
ax5 = fig4.gca()
ax5.plot(cores_merge['peak_mass'], cores_merge['T_corrected_peakmass'], 's')
ylims = ax5.get_ylim()
ax5.plot([0, 250], [0, 250], 'k--')
ax5.set_ylim(ylims)
ax5.set_xlabel("Mass at 20K [M$_\\odot$]")
ax5.set_ylabel("Mass at peak $T_B$ [M$_\\odot$]")
fig4.savefig(paths.fpath('coreplots/mass20K_vs_massTB.png'),
             bbox_inches='tight')

ffile = fits.open(paths.dpath('w51_te_continuum_best.fits'))
mywcs = wcs.WCS(ffile[0].header)
img = np.isfinite(ffile[0].data)
x, y = img.max(axis=0), img.max(axis=1)
xlim = np.where(x)[0].min(), np.where(x)[0].max()
ylim = np.where(y)[0].min(), np.where(y)[0].max()

ppbeam = cores_merge['beam_area'].to(u.deg**2) / np.abs(
    np.product(mywcs.pixel_scale_matrix.diagonal()) * u.deg**2)
cores_merge['integrated'] = cores_merge['sum'] / ppbeam

fig2 = pl.figure(2)
fig2.clf()
ax2 = fig2.gca()

print()
    both.plot_spectrum(x,y)
both.specfit(fittype='formaldehyde_radex',guesses=[4,13,-3,20,65,1,
                                                   cont11[y,x],
                                                   cont22[y,x]]*2,
             fixed=[F,F,T,T,F,F,T,T]*2,
             multifit=True,quiet=False,verbose=True,
             use_window_limits=False,
             fit_plotted_area=False)
if plot:
    both.plot_spectrum(x,y, errstyle='fill', residfignum=5)
#both.specfit.add_sliders()

doextra=False

# Added 5/23/2014
mask = fits.getdata(paths.dpath('mask_h2co_signal.fits')).astype('bool')
both.maskmap = mask

twopar = True
if True:
    warnings.warn("This code takes ~24.5 hours to run on a modern 4-core laptop.")
    warnings.warn("The progressbar does not report accurately when run in parallel.")
    warnings.warn("The last 3 lines I saw when running this:"
                  """
                  Finished fit   3948 of  63140 at (  77,  89) s/n=  8.4. Elapsed time is 88106.2 seconds.  %6
                  Finished final fit 63139.  Elapsed time was 88119.7 seconds
                  Overwriting existing file '/Users/adam/work/w51/h2co_singledish/W51_taucube_fit_parcube_try11.fits'.
                  """
                 )

    #fith2co.plotter_override(sp,vrange=[-50,10],fignum=5,reset_xlimits=True)
Exemplo n.º 56
0
region_names = {'e2': 'e2_exclude_e2w.reg'}

for regfn, region, fignum, imtype, suffix in (
    ('e2_exclude_e2w.reg', 'e2', 1, 'm0', ''),
    ('e2_exclude_e2w.reg', 'e2', 2, 'm0', '_merge'),
    ('e2_exclude_e2w.reg', 'e2', 3, 'm0', '_merge_natural'),
    ('e2_exclude_e2w.reg', 'e2', 1, 'max', ''),
    ('e2_exclude_e2w.reg', 'e2', 2, 'max', '_merge'),
    ('e2_exclude_e2w.reg', 'e2', 3, 'max', '_merge_natural'),
):

    reg = pyregion.open(paths.rpath(regfn))

    path_template = paths.dpath(
        "chemslices/chemical_{2}_slabs*_{0}*{1}.fits".format(
            region, suffix, imtype))

    files = glob.glob(path_template)

    linestyles = {
        name: itertools.cycle(['-'] + ['--'] + [':'] + ['-.'])
        for name in region_names
    }

    linere = re.compile(
        "chemical_{0}_slabs_[^_]*_(.*?)(_merge.fits|.fits)".format(imtype))

    # start with continuum
    files = [paths.dpath('W51_te_continuum_best.fits')] + files
F.show_rgb(paths.pdpath('W51_4096sq_WISE_bolo_mosaic_rotated_blackbg.png'),
           wcs=hwcs)

#F.show_regions(paths.rpath('large_scale_regions.reg'))
regions = pyregion.open(paths.rpath('large_scale_regions.reg'))
#text = re.compile("text={([^}]*)}")
for reg in regions:
    #t = text.search(reg.comment).groups()[0]
    t = reg.attr[1]['text']
    F.add_label(reg.coord_list[0], reg.coord_list[1], t, color='white',
                size=16, weight='bold')
F.set_tick_labels_xformat('dd.d')
F.set_tick_labels_yformat('dd.d')
F.recenter(49.27, -0.32, width=0.9, height=0.4)
F.save(paths.fpath('W51_wisecolor_largescale_labeled.pdf'), dpi=72)
F.show_rgb(paths.dpath("make_pretty_picture/W51_modified.png",paths.datapath_w51),
           wcs=hwcs)
F.save(paths.fpath('W51_wisecolor_modified_largescale_labeled.pdf'), dpi=72)

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_font_size(18)
F.scalebar.set_font_weight('bold')
F.scalebar.set_color('w')
F.scalebar.set_linewidth(3)
F.save(paths.fpath('W51_wisecolor_modified_largescale_labeled_scalebar.pdf'), dpi=150)
F.scalebar.hide()

for L in list(F._layers.keys()):
    if L in F._layers:
        F.remove_layer(L)
Exemplo n.º 58
0
                        log.exception(
                            "Skipping {0} because of a bad coordinate system.".
                            format(fn))
                        continue
                    # cube.allow_huge_operations=True
                    cube.beam_threshold = 5000
                    log.info("Calculating 25th percentile")
                    med = cube.percentile(25, axis=0)
                    medsub = cube - med
                    medsub.write(medsubfn)

                # create full-scale PV diagram (all freqs)
                outfn = paths.dpath(
                    os.path.join(
                        'pv',
                        os.path.split(
                            fn.replace(
                                ".image.pbcor.fits",
                                "_medsub_diskpv_{0}.fits".format(width)))[-1]))
                if not os.path.exists(outfn):
                    # width = 0.05 arcsec encompasses the disk; however, most
                    # of the actual line emission comes from just above/below...
                    #extraction_path = pvextractor.Path(diskycoords, width=0.05*u.arcsec)
                    extraction_path = pvextractor.Path(diskycoords,
                                                       width=width * u.arcsec)
                    log.info(
                        "Beginning extraction of path with width {0} for {1}".
                        format(extraction_path.width, outfn))
                    extracted = pvextractor.extract_pv_slice(
                        medsub, extraction_path)
                    log.info("Writing to {0}".format(outfn))
# see also: total_mass_analysis
import numpy as np
import pyregion
import dust_emissivity
from astropy import wcs
import paths
import radio_beam
from astropy.io import fits
from astropy import units as u
from astropy import constants
from masscalc import distance, centerfreq as freq

im = fits.getdata(paths.dpath('W51_te_continuum_best.fits'))
hd = fits.getheader(paths.dpath('W51_te_continuum_best.fits'))
beam = radio_beam.Beam.from_fits_header(hd)

e2e_peak_flux = im[1350:1400, 850:867].max() * u.Jy
e2e_peak_tb = e2e_peak_flux.to(u.K, beam.jtok_equiv(freq))
print("e2e peak brightness: {0}".format(e2e_peak_tb))

e2e_luminosity = (constants.sigma_sb * (e2e_peak_tb)**4 *
                  (4 * np.pi * (beam.major * distance) *
                   (beam.minor * distance) / (8 * np.log(2)))).to(
                       u.L_sun, u.dimensionless_angles())
print("e2e luminosity: {0}".format(e2e_luminosity))

e2e_dustmass = dust_emissivity.dust.massofsnu(freq,
                                              e2e_peak_flux,
                                              distance=distance,
                                              temperature=e2e_peak_tb)
print("e2e dust mass: {0}".format(e2e_dustmass))