예제 #1
0
def make_test_psfmap(size, shape="gauss"):
    psf = fake_psf3d(size, shape)
    aeff2d = fake_aeff2d()

    pointing = SkyCoord(0, 0, unit="deg")
    energy_axis = MapAxis(nodes=[0.2, 0.7, 1.5, 2.0, 10.0],
                          unit="TeV",
                          name="energy")
    rad_axis = MapAxis.from_nodes(nodes=np.linspace(0.0, 0.6, 50),
                                  unit="deg",
                                  name="theta")

    geom = WcsGeom.create(skydir=pointing,
                          binsz=0.2,
                          width=5,
                          axes=[rad_axis, energy_axis])

    exposure_geom = WcsGeom.create(skydir=pointing,
                                   binsz=0.2,
                                   width=5,
                                   axes=[energy_axis])

    exposure_map = make_map_exposure_true_energy(pointing, "1 h", aeff2d,
                                                 exposure_geom)

    return make_psf_map(psf, pointing, geom, 3 * u.deg, exposure_map)
예제 #2
0
def make_edisp_map_test():
    etrue = [0.2, 0.7, 1.5, 2.0, 10.0] * u.TeV
    migra = np.linspace(0.0, 3.0, 51)
    offsets = np.array((0.0, 1.0, 2.0, 3.0)) * u.deg

    pointing = SkyCoord(0, 0, unit="deg")
    energy_axis = MapAxis(
        nodes=[0.2, 0.7, 1.5, 2.0, 10.0],
        unit="TeV",
        name="energy",
        node_type="edges",
        interp="log",
    )
    migra_axis = MapAxis(nodes=np.linspace(0.0, 3.0, 51),
                         unit="",
                         name="migra")

    edisp2d = EnergyDispersion2D.from_gauss(etrue, migra, 0.0, 0.2, offsets)

    geom = WcsGeom.create(skydir=pointing,
                          binsz=1.0,
                          width=5.0,
                          axes=[migra_axis, energy_axis])

    aeff2d = fake_aeff2d()
    exposure_geom = geom.squash(axis="migra")
    exposure_map = make_map_exposure_true_energy(pointing, "1 h", aeff2d,
                                                 exposure_geom)

    return make_edisp_map(edisp2d, pointing, geom, exposure_map)
예제 #3
0
def make_psf_map_obs(geom, obs):
    exposure_map = make_map_exposure_true_energy(
        geom=geom.squash(axis="theta"),
        pointing=obs.pointing_radec,
        aeff=obs.aeff,
        livetime=obs.observation_live_time_duration)

    psf_map = make_psf_map(geom=geom,
                           psf=obs.psf,
                           pointing=obs.pointing_radec,
                           exposure_map=exposure_map)
    return psf_map
예제 #4
0
파일: test_fit.py 프로젝트: gfiusa/gammapy
def get_exposure(geom_etrue):
    filename = (
        "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits"
    )
    aeff = EffectiveAreaTable2D.read(filename, hdu="EFFECTIVE AREA")

    exposure_map = make_map_exposure_true_energy(
        pointing=SkyCoord(1, 0.5, unit="deg", frame="galactic"),
        livetime="1 hour",
        aeff=aeff,
        geom=geom_etrue,
    )
    return exposure_map
예제 #5
0
def main():
    # Define some parameters
    pointing = SkyCoord(1, 0.5, unit='deg', frame='galactic')
    livetime = 1 * u.hour
    offset_max = 3 * u.deg
    offset = Angle('2 deg')

    irfs = get_irfs()
    geom = get_geom()
    sky_model = get_sky_model()

    # Let's get started ...
    exposure_map = make_map_exposure_true_energy(
        pointing=pointing, livetime=livetime, aeff=irfs['aeff'],
        ref_geom=geom, offset_max=offset_max,
    )
    exposure_map.write('exposure.fits')

    evaluator = SkyModelMapEvaluator(sky_model, exposure_map)

    # 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()
    WcsNDMap(geom, dnde).write('dnde.fits')

    flux = evaluator.compute_flux()
    WcsNDMap(geom, flux).write('flux.fits')

    npred = evaluator.compute_npred()
    WcsNDMap(geom, npred).write('npred.fits')

    # TODO: Apply PSF convolution
    psf = irfs['psf'].to_energy_dependent_table_psf(theta=offset)

    # kernels = irfs['psf'].kernels(npred_cube_simple)
    # npred_cube_convolved = npred_cube_simple.convolve(kernels)

    # TODO: optionally apply EDISP
    edisp = irfs['edisp'].to_energy_dispersion(offset=offset)

    # TODO: add background

    # Compute counts as a Poisson fluctuation
    counts = np.random.poisson(npred)
    WcsNDMap(geom, counts).write('counts.fits')
예제 #6
0
# In[ ]:

# Define some observation parameters
# We read in the pointing info from one of the 1dc event list files as an example
pointing = FixedPointingInfo.read(
    "$GAMMAPY_DATA/cta-1dc/data/baseline/gps/gps_baseline_110380.fits")

livetime = 1 * u.hour
offset_max = 2 * u.deg
offset = Angle("2 deg")

# In[ ]:

exposure = make_map_exposure_true_energy(pointing=pointing.radec,
                                         livetime=livetime,
                                         aeff=irfs["aeff"],
                                         geom=geom)
exposure.slice_by_idx({
    "energy": 3
}).plot(add_cbar=True)

# In[ ]:

background = make_map_background_irf(pointing=pointing,
                                     ontime=livetime,
                                     bkg=irfs["bkg"],
                                     geom=geom)
background.slice_by_idx({
    "energy": 3
}).plot(add_cbar=True)
예제 #7
0
def simulate_dataset(
    skymodel,
    geom,
    pointing,
    irfs,
    livetime=1 * u.h,
    offset=0 * u.deg,
    max_radius=0.8 * u.deg,
    random_state="random-seed",
):
    """Simulate a 3D dataset.

    Simulate a source defined with a sky model for a given pointing,
    geometry and irfs for a given exposure time.
    This will return a dataset object which includes the counts cube,
    the exposure cube, the psf cube, the background model and the sky model.

    Parameters
    ----------
    skymodel : `~gammapy.modeling.models.SkyModel`
        Background model map
    geom : `~gammapy.maps.WcsGeom`
        Geometry object for the observation
    pointing : `~astropy.coordinates.SkyCoord`
        Pointing position
    irfs : dict
        Irfs used for simulating the observation
    livetime : `~astropy.units.Quantity`
        Livetime exposure of the simulated observation
    offset : `~astropy.units.Quantity`
        Offset from the center of the pointing position.
        This is used for the PSF and Edisp estimation
    max_radius : `~astropy.coordinates.Angle`
        The maximum radius of the PSF kernel.
    random_state: {int, 'random-seed', 'global-rng', `~numpy.random.RandomState`}
        Defines random number generator initialisation.

    Returns
    -------
    dataset : `~gammapy.cube.MapDataset`
        A dataset of the simulated observation.
    """
    background = make_map_background_irf(
        pointing=pointing, ontime=livetime, bkg=irfs["bkg"], geom=geom
    )

    background_model = BackgroundModel(background)

    psf = irfs["psf"].to_energy_dependent_table_psf(theta=offset)
    psf_kernel = PSFKernel.from_table_psf(psf, geom, max_radius=max_radius)

    exposure = make_map_exposure_true_energy(
        pointing=pointing, livetime=livetime, aeff=irfs["aeff"], geom=geom
    )

    if "edisp" in irfs:
        energy = geom.axes[0].edges
        edisp = irfs["edisp"].to_energy_dispersion(offset, e_reco=energy, e_true=energy)
    else:
        edisp = None

    dataset = MapDataset(
        model=skymodel,
        exposure=exposure,
        background_model=background_model,
        psf=psf_kernel,
        edisp=edisp,
    )

    npred_map = dataset.npred()
    rng = get_random_state(random_state)
    counts = rng.poisson(npred_map.data)
    dataset.counts = WcsNDMap(geom, counts)

    return dataset
예제 #8
0
compound_model = sky_model_1 + sky_model_2

# Define map geometry
axis = MapAxis.from_edges(np.logspace(-1.0, 1.0, 10), unit="TeV")
geom = WcsGeom.create(
    skydir=(0, 0), binsz=0.02, width=(2, 2), coordsys="GAL", axes=[axis]
)


# 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",
예제 #9
0
models = sky_model_1 + sky_model_2

# Define map geometry
axis = MapAxis.from_edges(np.logspace(-1.0, 1.0, 10), unit="TeV")
geom = WcsGeom.create(
    skydir=(0, 0), binsz=0.02, width=(2, 2), coordsys="GAL", axes=[axis]
)


# 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",