Cosmological Source Catalog

SOXS provides the make_cosmological_sources_file() function to generate a set of photons from cosmological halos and store them in a SIMPUT catalog.

First, import our modules:

[1]:
import matplotlib

matplotlib.rc("font", size=18)
import soxs

Second, define our parameters, including the location within the catalog where we are pointed via the argument cat_center. To aid in picking a location, see the halo map.

[2]:
exp_time = (200.0, "ks")
fov = 20.0  # in arcmin
sky_center = [30.0, 45.0]  # in degrees
cat_center = [3.1, -1.9]

Now, use make_cosmological_sources_file() to create a SIMPUT catalog made up of photons from the halos. We’ll set a random seed using the prng parameter to make sure we get the same result every time. We will also write the halo properties to an ASCII table for later analysis, using the output_sources parameter:

[3]:
soxs.make_cosmological_sources_file(
    "my_cat.simput",
    "cosmo",
    exp_time,
    fov,
    sky_center,
    cat_center=cat_center,
    prng=33,
    overwrite=True,
)
soxs : [INFO     ] 2025-11-05 22:35:43,216 Creating photons from cosmological sources.
soxs : [INFO     ] 2025-11-05 22:35:43,216 Loading halo data from catalog: /Users/jzuhone/Source/soxs/soxs/files/halo_catalog.h5
soxs : [INFO     ] 2025-11-05 22:35:43,271 Coordinates of the FOV within the catalog are (3.1, -1.9) deg.
soxs : [INFO     ] 2025-11-05 22:35:43,272 Selecting halos in the FOV.
soxs : [INFO     ] 2025-11-05 22:35:43,275 Number of halos in the field of view: 384
soxs : [INFO     ] 2025-11-05 22:35:50,675 Created 5786907 photons from cosmological sources.
soxs : [INFO     ] 2025-11-05 22:35:50,749 Appending source 'cosmo' to my_cat.simput.
[3]:
<soxs.simput.SimputCatalog at 0x108800050>

Next, use the instrument_simulator() to simulate the observation:

[4]:
soxs.instrument_simulator(
    "my_cat.simput",
    "cosmo_cat_evt.fits",
    exp_time,
    "lynx_hdxi",
    sky_center,
    overwrite=True,
)
soxs : [INFO     ] 2025-11-05 22:35:50,973 Simulating events from 1 sources using instrument lynx_hdxi for 200 ks.
soxs : [INFO     ] 2025-11-05 22:35:51,712 Scattering energies with RMF xrs_hdxi.rmf.
soxs : [INFO     ] 2025-11-05 22:35:53,349 Detected 2165946 events in total.
soxs : [INFO     ] 2025-11-05 22:35:53,354 Adding background events.
soxs : [INFO     ] 2025-11-05 22:35:53,412 Adding in point-source background.
soxs : [INFO     ] 2025-11-05 22:36:02,691 Simulating events from 1 sources using instrument lynx_hdxi for 200 ks.
soxs : [INFO     ] 2025-11-05 22:36:05,962 Scattering energies with RMF xrs_hdxi.rmf.
soxs : [INFO     ] 2025-11-05 22:36:08,785 Detected 3782093 events in total.
soxs : [INFO     ] 2025-11-05 22:36:08,799 Generated 3782093 photons from the point-source background.
soxs : [INFO     ] 2025-11-05 22:36:08,799 Adding in astrophysical foreground.
soxs : [INFO     ] 2025-11-05 22:36:15,559 Adding in instrumental background.
soxs : [INFO     ] 2025-11-05 22:36:16,566 Making 33734258 events from the galactic foreground.
soxs : [INFO     ] 2025-11-05 22:36:16,567 Making 523032 events from the instrumental background.
soxs : [INFO     ] 2025-11-05 22:36:20,680 Observation complete.
soxs : [INFO     ] 2025-11-05 22:36:20,682 Writing events to file cosmo_cat_evt.fits.

We can use the write_image() function in SOXS to bin the events into an image and write them to a file, restricting the energies between 0.7 and 7.0 keV:

[5]:
soxs.write_image(
    "cosmo_cat_evt.fits", "cosmo_img.fits", emin=0.7, emax=7.0, overwrite=True
)

We can now show the resulting image:

[6]:
fig, ax = soxs.plot_image(
    "cosmo_img.fits",
    stretch="sqrt",
    cmap="cubehelix",
    vmin=0.0,
    vmax=2.0,
    width=0.33333,
)
../_images/cookbook_Cosmo_Source_Catalog_13_0.png