def test_wcsndmap_sum_over_axes(npix, binsz, frame, proj, skydir, axes, keepdims): geom = WcsGeom.create(npix=npix, binsz=binsz, proj=proj, frame=frame, axes=axes) m = WcsNDMap(geom) coords = m.geom.get_coord() m.fill_by_coord(coords, coords[0].value) msum = m.sum_over_axes(keepdims=keepdims) if m.geom.is_regular: assert_allclose(np.nansum(m.data), np.nansum(msum.data))
npred.sum_over_axes().plot(add_cbar=True) # In[ ]: # This one line is the core of how to simulate data when # using binned simulation / analysis: you Poisson fluctuate # npred to obtain simulated observed counts. # Compute counts as a Poisson fluctuation rng = np.random.RandomState(seed=42) counts = rng.poisson(npred.data) counts_map = WcsNDMap(geom, counts) # In[ ]: counts_map.sum_over_axes().plot() # ## Fit # # Now let's analyse the simulated data. # Here we just fit it again with the same model we had before, but you could do any analysis you like here, e.g. fit a different model, or do a region-based analysis, ... # In[ ]: # Define sky model to fit the data spatial_model = SkyGaussian(lon_0="0.1 deg", lat_0="0.1 deg", sigma="0.5 deg") spectral_model = PowerLaw(index=2, amplitude="1e-11 cm-2 s-1 TeV-1", reference="1 TeV") model = SkyModel(spatial_model=spatial_model, spectral_model=spectral_model) print(model)
# Define some observation parameters # we are not simulating many pointings / observations pointing = SkyCoord(0.2, 0.5, unit="deg", frame="galactic") livetime = 20 * u.hour exposure_map = make_map_exposure_true_energy( pointing=pointing, livetime=livetime, aeff=aeff, geom=geom ) evaluator = MapEvaluator(model=compound_model, exposure=exposure_map) npred = evaluator.compute_npred() npred_map = WcsNDMap(geom, npred) fig, ax, cbar = npred_map.sum_over_axes().plot(add_cbar=True) ax.scatter( [lon_0_1, lon_0_2, pointing.galactic.l.degree], [lat_0_1, lat_0_2, pointing.galactic.b.degree], transform=ax.get_transform("galactic"), marker="+", color="cyan", ) # plt.show() plt.clf() rng = get_random_state(42) counts = rng.poisson(npred) counts_map = WcsNDMap(geom, counts) counts_map.sum_over_axes().plot()
# Define some observation parameters # we are not simulating many pointings / observations pointing = SkyCoord(0.2, 0.5, unit="deg", frame="galactic") livetime = 20 * u.hour exposure_map = make_map_exposure_true_energy( pointing=pointing, livetime=livetime, aeff=aeff, geom=geom ) evaluator = MapEvaluator(model=models, exposure=exposure_map) npred = evaluator.compute_npred() npred_map = WcsNDMap(geom, npred) fig, ax, cbar = npred_map.sum_over_axes().plot(add_cbar=True) ax.scatter( [lon_0_1, lon_0_2, pointing.galactic.l.degree], [lat_0_1, lat_0_2, pointing.galactic.b.degree], transform=ax.get_transform("galactic"), marker="+", color="cyan", ) # plt.show() plt.clf() rng = get_random_state(42) counts = rng.poisson(npred) counts_map = WcsNDMap(geom, counts) counts_map.sum_over_axes().plot()
{ "skycoord": coord.skycoord, "energy": coord["energy"] * maps["counts"].geom.get_axis_by_name("energy").unit, }, interp=3, ) diffuse_galactic = WcsNDMap(maps["counts"].geom, data) print("Before: \n", diffuse_gal.geom) print("Now (same as maps): \n", diffuse_galactic.geom) # In[ ]: # diffuse_galactic.slice_by_idx({"energy": 0}).plot(add_cbar=True); # this can be used to check image at different energy bins diffuse = diffuse_galactic.sum_over_axes() diffuse.smooth(5).plot(stretch="sqrt", add_cbar=True) print(diffuse) # We now multiply the exposure for this diffuse emission to subtract the result from the counts along with the background. # In[ ]: combination = diffuse * exposure combination.unit = "" combination.smooth(5).plot(stretch="sqrt", add_cbar=True) # We can plot then the excess image subtracting now the effect of the diffuse galactic emission. # In[ ]:
'time', '', '# The idea is that we have this class that can compute `npred`\n# maps, i.e. "predicted counts per pixel" given the model and\n# the observation infos: exposure, background, PSF and EDISP\nevaluator = MapEvaluator(\n model=sky_model, exposure=exposure, background=background, psf=psf_kernel\n)' ) # In[ ]: # Accessing and saving a lot of the following maps is for debugging. # Just for a simulation one doesn't need to store all these things. # dnde = evaluator.compute_dnde() # flux = evaluator.compute_flux() npred = evaluator.compute_npred() npred_map = WcsNDMap(geom, npred) # In[ ]: npred_map.sum_over_axes().plot(add_cbar=True) # In[ ]: # This one line is the core of how to simulate data when # using binned simulation / analysis: you Poisson fluctuate # npred to obtain simulated observed counts. # Compute counts as a Poisson fluctuation rng = np.random.RandomState(seed=42) counts = rng.poisson(npred) counts_map = WcsNDMap(geom, counts) # In[ ]: counts_map.sum_over_axes().plot()