def save(self, filepath, filetype="auto", **kwargs): """Saves the SunPy Map object to a file. Currently SunPy can only save files in the FITS format. In the future support will be added for saving to other formats. Parameters ---------- filepath : string Location to save file to. filetype : string 'auto' or any supported file extension """ io.write_file(filepath, self.data, self.meta, filetype=filetype, **kwargs)
def save(self, filepath, filetype='auto', **kwargs): """Saves the SunPy Map object to a file. Currently SunPy can only save files in the FITS format. In the future support will be added for saving to other formats. Parameters ---------- filepath : string Location to save file to. filetype : string 'auto' or any supported file extension """ io.write_file(filepath, self.data, self.meta, filetype=filetype, **kwargs)
def image_adddisk(eofile, diskinfo, edgeconvmode='frommergeddisk', caltbonly=False): ''' :param eofile: :param diskxmlfile: :param edgeconvmode: available mode: frommergeddisk,frombeam :return: ''' from sunpy import map as smap from suncasa.utils import plot_mapX as pmX from scipy import constants import astropy.units as u from sunpy import io as sio dsize = diskinfo['disk_size'] fdens = diskinfo['flux_dens'] freqs = diskinfo['freq'] eomap = smap.Map(eofile) eomap_ = pmX.Sunmap(eomap) header = eomap.meta bmaj = header['bmaj'] * 3600 * u.arcsec bmin = header['bmin'] * 3600 * u.arcsec cell = (header['cdelt1'] * u.Unit(header['cunit1']) + header['cdelt2'] * u.Unit(header['cunit2'])) / 2.0 bmsize = (bmaj + bmin) / 2.0 data = eomap.data # remember the data order is reversed due to the FITS convension keys = header.keys() values = header.values() mapx, mapy = eomap_.map2wcsgrids(cell=False) mapx = mapx[:-1, :-1] mapy = mapy[:-1, :-1] rdisk = np.sqrt(mapx ** 2 + mapy ** 2) k_b = constants.k c_l = constants.c const = 2. * k_b / c_l ** 2 pix_area = (cell.to(u.rad).value) ** 2 jy_to_si = 1e-26 factor2 = 1. faxis = keys[values.index('FREQ')][-1] if caltbonly: edgeconvmode = '' if edgeconvmode == 'frommergeddisk': nul = header['CRVAL' + faxis] + header['CDELT' + faxis] * (1 - header['CRPIX' + faxis]) nuh = header['CRVAL' + faxis] + header['CDELT' + faxis] * (header['NAXIS' + faxis] - header['CRPIX' + faxis]) ## get the frequency range of the image nu_bound = (np.array([nul, nuh]) + 0.5 * np.array([-1, 1]) * header['CDELT' + faxis]) * u.Unit( header['cunit' + faxis]) nu_bound = nu_bound.to(u.GHz) ## get the frequencies of the disk models fidxs = np.logical_and(freqs > nu_bound[0], freqs < nu_bound[1]) ny, nx = rdisk.shape freqs_ = freqs[fidxs] fdens_ = fdens[fidxs] / 2.0 # divide by 2 because fdens is 2x solar flux density dsize_ = dsize[fidxs] fdisk_ = np.empty((len(freqs_), ny, nx)) fdisk_[:] = np.nan for fidx, freq in enumerate(freqs_): fdisk_[fidx, ...][rdisk <= dsize_[fidx].value] = 1.0 # nu = header['CRVAL' + faxis] + header['CDELT' + faxis] * (1 - header['CRPIX' + faxis]) factor = const * freq.to(u.Hz).value ** 2 # SI unit jy2tb = jy_to_si / pix_area / factor * factor2 fdisk_[fidx, ...] = fdisk_[fidx, ...] / np.nansum(fdisk_[fidx, ...]) * fdens_[fidx].value fdisk_[fidx, ...] = fdisk_[fidx, ...] * jy2tb # # fdisk_[np.isnan(fdisk_)] = 0.0 tbdisk = np.nanmean(fdisk_, axis=0) tbdisk[np.isnan(tbdisk)] = 0.0 sig2fwhm = 2.0 * np.sqrt(2 * np.log(2)) x0, y0 = 0, 0 sigx, sigy = bmaj.value / sig2fwhm, bmin.value / sig2fwhm theta = -(90.0 - header['bpa']) * u.deg x = (np.arange(31) - 15) * cell.value y = (np.arange(31) - 15) * cell.value x, y = np.meshgrid(x, y) kernel = gaussian2d(x, y, 1.0, x0, y0, sigx, sigy, theta.to(u.radian).value) kernel = kernel / np.nansum(kernel) from scipy import signal tbdisk = signal.fftconvolve(tbdisk, kernel, mode='same') else: nu = header['CRVAL' + faxis] + header['CDELT' + faxis] * (1 - header['CRPIX' + faxis]) freqghz = nu / 1.0e9 factor = const * nu ** 2 # SI unit jy2tb = jy_to_si / pix_area / factor * factor2 p_dsize = np.poly1d(np.polyfit(freqs.value, dsize.value, 15)) p_fdens = np.poly1d( np.polyfit(freqs.value, fdens.value, 15)) / 2. # divide by 2 because fdens is 2x solar flux density if edgeconvmode == 'frombeam': from scipy.special import erfc factor_erfc = 2.0 ## erfc function ranges from 0 to 2 fdisk = erfc((rdisk - p_dsize(freqghz)) / bmsize.value) / factor_erfc else: fdisk = np.zeros_like(rdisk) fdisk[rdisk <= p_dsize(freqghz)] = 1.0 fdisk = fdisk / np.nansum(fdisk) * p_fdens(freqghz) tbdisk = fdisk * jy2tb tb_disk = np.nanmax(tbdisk) if caltbonly: return tb_disk else: datanew = data + tbdisk # datanew[np.isnan(data)] = 0.0 header['TBDISK'] = tb_disk header['TBUNIT'] = 'K' eomap_disk = smap.Map(datanew, header) nametmp = eofile.split('.') nametmp.insert(-1, 'disk') outfits = '.'.join(nametmp) datanew = datanew.astype(np.float32) if os.path.exists(outfits): os.system('rm -rf {}'.format(outfits)) sio.write_file(outfits, datanew, header) return eomap_disk, tb_disk, outfits