def coordinate_images(infile, outfile, make_coordinate_maps, make_distance_map, overwrite): """Make maps that can be used to create profiles. The following images can be created: * LON -- Longitude coordinate * LAT -- Latitude coordinate * DIST -- Distance to mask * SOLID_ANGLE -- Solid angle """ import logging logging.basicConfig(level=logging.DEBUG, format='%(levelname)s - %(message)s') from astropy.io import fits from gammapy.utils.fits import get_hdu logging.info('Reading {0}'.format(infile)) hdu = get_hdu(infile) out_hdus = fits.HDUList() if make_coordinate_maps: from gammapy.image import coordinates logging.info('Computing LON and LAT maps') lon, lat = coordinates(hdu) out_hdus.append(fits.ImageHDU(lon, hdu.header, 'LON')) out_hdus.append(fits.ImageHDU(lat, hdu.header, 'LAT')) if make_distance_map: from gammapy.image import exclusion_distance logging.info('Computing DIST map') dist = exclusion_distance(hdu.data) out_hdus.append(fits.ImageHDU(dist, hdu.header, 'DIST')) logging.info('Writing {0}'.format(outfile)) out_hdus.writeto(outfile, clobber=overwrite)
def make_model_image(psf='Fermi', resolution=0.1, center=[0, 0], lat_range=[0, 180], lon_range=[0, 360], catalog='1FHL', total_flux='False', filename='1fhl_fermi_psf.fits'): from gammapy.image import coordinates from astropy.convolution import convolve from astropy.modeling.models import Gaussian2D, Disk2D from gammapy.image import images_to_cube from gammapy.image import paste_cutout_into_image from gammapy.image.utils import solid_angle reference = make_reference_survey_image(resolution, lat_range, lon_range, center, units='ph/cm2/s/sr') #Check these units! lons, lats = coordinates(reference) source_table = fits.open('simulated_galaxy_1.fits')[1].data sources = np.arange(len(source_table['flux'])).astype(int) if psf == 'None': # If there is no PSF defined, sources will be modelled as Gaussians source_kernel = Gaussian2D(0, 0, 0, 0.1, 0.1) new_image = im_1 = im_2 = im_3 = source_kernel(lats, lons) else: # Otherwise, all of the flux will be placed into the reference pixel to be later PSF convolved with the defined PSF # Hence original reference empty image is called new_image = im_1 = im_2 = im_3 = reference.data from gammapy.image import wcs_histogram2d header = reference.header lon = source_table['GLON'] lat = source_table['GLAT'] flux = source_table['flux'] total_point_image = wcs_histogram2d(header, lon, lat, weights=flux) new_image = total_point_image.data #import IPython; IPython.embed(); 1 /0 """ print len(sources) total_point_image = fits.ImageHDU(header=reference.header, data=new_image) from astropy.wcs import WCS wcs = WCS(total_point_image.header) new_image = np.zeros_like(total_point_image.data, dtype=np.float64) for source in sources: source_type = 'PointSource'#source_table['Source_Type'][source] print source if source_type == 'ExtendedSource': raise NotImplementedError # This needs more work... #image = source_table['Image'][source] #image.data = (image.data * solid_angle(image).value.mean()) / 1000000000000 # TODO: fix this hack... units??? #resample_factor1 = np.round(reference.header['CDELT1'] / image.header['CDELT1']) #resample_factor2 = np.round(reference.header['CDELT2'] / image.header['CDELT2']) #block_factors = np.array([resample_factor1, resample_factor2]) # TODO: fix this approximation... kapteyn image utils reprojectto? #resampled_image = block_reduce_hdu(image, block_factors, np.sum) #paste_cutout_into_image(total_point_image, resampled_image) elif source_type == 'PointSource': lon = source_table['GLON'][source] lat = source_table['GLAT'][source] flux = source_table['flux'][source] precise = False if precise: raise NotImplementedError else: #print(lon, lat) #import IPython; IPython.embed() print lon, lat x, y = wcs.wcs_world2pix(lon, lat, 0) print x, y # TODO: check if this is 0.5 or 1 pix off xi, yi = x.astype(int), y.astype(int) new_image[yi, xi] += flux total_point_image = fits.ImageHDU(header=reference.header, data=new_image) """ # Ensure flux or counts remain the same if total_flux == 'True': factor = source_table['Flux'].sum() else: factor = total_flux if psf == 'None': new_image = (new_image/new_image.sum()) * factor elif psf == 'Gaussian': new_image = correlate_gauss((new_image/new_image.sum()), 2) elif psf == 'Disk': new_image = disk_correlate((new_image/new_image.sum()), 2) elif psf == 'Fermi': print "Original Flux" print new_image.sum() new_image = correlate_fermi_psf(new_image, 5) print "PSF Convolved Flux" print new_image.sum() header = reference.header image = fits.ImageHDU(data=new_image, header=header) image.writeto(filename, clobber=True)
energy_exp = Quantity([10000, 500000], 'MeV') exposure_data = Quantity(exposure_hdu.data, '') exposure_spec_cube = SpectralCube(data=exposure_data, wcs=exposure_wcs, energy=energy_exp) exposure_spec_cube = exposure_spec_cube.reproject_to(flux_spec_cube) counts_data = flux_spec_cube.data * exposure_spec_cube.data counts = fits.ImageHDU(data=counts_data[0], header=flux_hdu.header) binsz=input('Bin size: ') label1='Total Flux' filename1 = flux_file smooth = 0.1 hdu = fits.open(filename1)[1] lons, lats = coordinates(hdu) lat_profile = image_profile(profile_axis='lat', image=hdu, lats=[-10, 10], lons=[-100, 100], binsz=binsz, errors=True, standard_error=0.1, counts=counts) plt.figure(figsize=(5,4)) plt.rc('text', usetex=True) plt.rc('font', family='serif') flux = np.float64(lat_profile['BIN_VALUE']) lats = lat_profile['GLAT_MIN'] profile1 = np.histogram(lats, bins=np.sort(lats), weights=np.float64(flux)) xstep=binsz y_smooth_1 = gaussian_filter(profile1[0], smooth / xstep) lats_x = lat_profile['GLAT_MIN'][1:] - 0.5 * binsz plt.plot(lats_x, y_smooth_1, label='{0}'.format(label1)) plt.hlines(0, -5, 5) plt.xlabel(r'Galactic Latitude/$deg$', fontsize=10) plt.ylabel(r'Flux/ph cm$^{-2}$ s$^{-1}$', fontsize=10) plt.xlim([-5, 5])
energy_exp = Quantity([10000, 500000], 'MeV') exposure_data = Quantity(exposure_hdu.data, '') exposure_spec_cube = SpectralCube(data=exposure_data, wcs=exposure_wcs, energy=energy_exp) exposure_spec_cube = exposure_spec_cube.reproject_to(flux_spec_cube) counts_data = flux_spec_cube.data * exposure_spec_cube.data counts = fits.ImageHDU(data=counts_data[0], header=flux_hdu.header) binsz = input('Bin size: ') label1 = 'Total Flux' filename1 = flux_file smooth = 0.1 hdu = fits.open(filename1)[1] lons, lats = coordinates(hdu) lat_profile = image_profile(profile_axis='lat', image=hdu, lats=[-10, 10], lons=[-100, 100], binsz=binsz, errors=True, standard_error=0.1, counts=counts) plt.figure(figsize=(5, 4)) plt.rc('text', usetex=True) plt.rc('font', family='serif') flux = np.float64(lat_profile['BIN_VALUE']) lats = lat_profile['GLAT_MIN'] profile1 = np.histogram(lats, bins=np.sort(lats), weights=np.float64(flux)) xstep = binsz
exposure_wcs = WCS(exposure_hdu.header) energy_exp = Quantity([10000, 500000], 'MeV') exposure_data = Quantity(exposure_hdu.data, '') exposure_spec_cube = SpectralCube(data=exposure_data, wcs=exposure_wcs, energy=energy_exp) exposure_spec_cube = exposure_spec_cube.reproject_to(counts_spec_cube) flux_data = counts_spec_cube.data / exposure_spec_cube.data flux = fits.ImageHDU(data=flux_data[0], header=counts_hdu.header) binsz=input('Bin size: ') label1='Total Flux' smooth = 0.2 lons, lats = coordinates(flux) lat_profile_total = image_profile(profile_axis='lat', image=flux, lats=[-10, 10], lons=[-100, 100], binsz=binsz, errors=True, counts=counts_hdu) label2='Separated Background' background = fits.open(background_file)[1] lat_profile_background = image_profile(profile_axis='lat', image=background, lats=[-10, 10], lons=[-100, 100], binsz=binsz, errors=True, counts=counts_hdu) label3='Fermi Diffuse Model' diffuse = fits.open('diffuse_correct.fits')[1] lat_profile_diffuse = image_profile(profile_axis='lat', image=diffuse, lats=[-10, 10], lons=[-100, 100], binsz=binsz, errors=False) plt.clf() plt.figure(figsize=(7, 6)) plt.rc('text', usetex=True) plt.rc('font', family='serif') flux = np.float64(lat_profile_total['BIN_VALUE']) background = np.float64(lat_profile_background['BIN_VALUE'])
exposure_wcs = WCS(exposure_hdu.header) energy_exp = Quantity([10000, 500000], 'MeV') exposure_data = Quantity(exposure_hdu.data, '') exposure_spec_cube = SpectralCube(data=exposure_data, wcs=exposure_wcs, energy=energy_exp) exposure_spec_cube = exposure_spec_cube.reproject_to(counts_spec_cube) flux_data = counts_spec_cube.data / exposure_spec_cube.data flux = fits.ImageHDU(data=flux_data[0], header=counts_hdu.header) binsz = input('Bin size: ') label1 = 'Total Flux' smooth = 0.2 lons, lats = coordinates(flux) lon_profile_total = image_profile(profile_axis='lon', image=flux, lats=[-5, 5], lons=[-101, 101], binsz=binsz, errors=True, counts=counts_hdu) label2 = 'Separated Background' background = fits.open(background_file)[1] lon_profile_background = image_profile(profile_axis='lon', image=background, lats=[-5, 5], lons=[-101, 101], binsz=binsz,
def make_model_image(psf='Fermi', resolution=0.1, center=[0, 0], lat_range=[0, 180], lon_range=[0, 360], catalog='1FHL', total_flux='False', filename='1fhl_fermi_psf.fits'): from gammapy.image import coordinates from astropy.convolution import convolve from astropy.modeling.models import Gaussian2D, Disk2D from gammapy.image import images_to_cube from gammapy.image import paste_cutout_into_image from gammapy.image.utils import solid_angle reference = make_reference_survey_image( resolution, lat_range, lon_range, center, units='ph/cm2/s/sr') #Check these units! lons, lats = coordinates(reference) source_table = fits.open('simulated_galaxy_1.fits')[1].data sources = np.arange(len(source_table['flux'])).astype(int) if psf == 'None': # If there is no PSF defined, sources will be modelled as Gaussians source_kernel = Gaussian2D(0, 0, 0, 0.1, 0.1) new_image = im_1 = im_2 = im_3 = source_kernel(lats, lons) else: # Otherwise, all of the flux will be placed into the reference pixel to be later PSF convolved with the defined PSF # Hence original reference empty image is called new_image = im_1 = im_2 = im_3 = reference.data from gammapy.image import wcs_histogram2d header = reference.header lon = source_table['GLON'] lat = source_table['GLAT'] flux = source_table['flux'] total_point_image = wcs_histogram2d(header, lon, lat, weights=flux) new_image = total_point_image.data #import IPython; IPython.embed(); 1 /0 """ print len(sources) total_point_image = fits.ImageHDU(header=reference.header, data=new_image) from astropy.wcs import WCS wcs = WCS(total_point_image.header) new_image = np.zeros_like(total_point_image.data, dtype=np.float64) for source in sources: source_type = 'PointSource'#source_table['Source_Type'][source] print source if source_type == 'ExtendedSource': raise NotImplementedError # This needs more work... #image = source_table['Image'][source] #image.data = (image.data * solid_angle(image).value.mean()) / 1000000000000 # TODO: fix this hack... units??? #resample_factor1 = np.round(reference.header['CDELT1'] / image.header['CDELT1']) #resample_factor2 = np.round(reference.header['CDELT2'] / image.header['CDELT2']) #block_factors = np.array([resample_factor1, resample_factor2]) # TODO: fix this approximation... kapteyn image utils reprojectto? #resampled_image = block_reduce_hdu(image, block_factors, np.sum) #paste_cutout_into_image(total_point_image, resampled_image) elif source_type == 'PointSource': lon = source_table['GLON'][source] lat = source_table['GLAT'][source] flux = source_table['flux'][source] precise = False if precise: raise NotImplementedError else: #print(lon, lat) #import IPython; IPython.embed() print lon, lat x, y = wcs.wcs_world2pix(lon, lat, 0) print x, y # TODO: check if this is 0.5 or 1 pix off xi, yi = x.astype(int), y.astype(int) new_image[yi, xi] += flux total_point_image = fits.ImageHDU(header=reference.header, data=new_image) """ # Ensure flux or counts remain the same if total_flux == 'True': factor = source_table['Flux'].sum() else: factor = total_flux if psf == 'None': new_image = (new_image / new_image.sum()) * factor elif psf == 'Gaussian': new_image = correlate_gauss((new_image / new_image.sum()), 2) elif psf == 'Disk': new_image = disk_correlate((new_image / new_image.sum()), 2) elif psf == 'Fermi': print "Original Flux" print new_image.sum() new_image = correlate_fermi_psf(new_image, 5) print "PSF Convolved Flux" print new_image.sum() header = reference.header image = fits.ImageHDU(data=new_image, header=header) image.writeto(filename, clobber=True)