Generating Spectra from Data Objects

If you have a yt data object (such as a sphere, box, disk) and a source model of any sort, then you can also generate spectra from the entire object. This can be done in two modes–either in the rest frame of the source, in which case the spectrum will be a “count rate” spectrum in units of \(\rm{counts}~\rm{s}^{-1}~\rm{keV}^{-1}\), or in an observer frame at some distance in which case the spectrum will be in units of \(\rm{counts}~\rm{cm}^{-2}~\rm{s}^{-1}~\rm{keV}^{-1}\).

Assuming one has a dataset and (say) a sphere object, you can generate spectra like this:

# Here's a power-law source model, but any source model will do

emin = 0.5
emax = 40.0
e0 = 1.0
alpha
norm_field = ("gas", "power_law_emission")

plaw_model = pyxsim.PowerLawSourceModel(e0, emin, emax, norm_field, alpha)

# Make a count rate spectrum in the source frame

nbins = 1000

spec_src = plaw_model.make_spectrum(sp, emin, emax, nbins)

The resulting spectrum spec_src is a CountRateSpectrum object, which has a number of methods in SOXS that can be used to analyze and visualize it.

If we instead want to find a spectrum of a source measured by an observer at a specific distance, then we can specify either a redshift and a cosmology (which uniquely specifies a distance) or we can set a distance explicitly for a local source.

Here’s an example where only a redshift is specified. In this case, a cosmology is assumed by default from yt, usually the one associated with the dataset:

# Make a flux spectrum in the observer frame at some redshift

emin_obs = 2.0
emax_obs = 20.0
redshift = 0.1

spec_obs = plaw_model.make_spectrum(sp, emin, emax, nbins, redshift=redshift)

The resulting spectrum spec_obs is a Spectrum object, which has a number of methods in SOXS that can be used to analyze and visualize it.

If you want to choose a different cosmology, specify a yt Cosmology object:

# Make a flux spectrum in the observer frame at some redshift
# at a specified cosmology

from yt.utilities.cosmology import Cosmology

cosmo = Cosmology(hubble_constant=0.704, omega_matter=1.0-0.728)

emin_obs = 2.0
emax_obs = 20.0
redshift = 0.1

spec_obs = plaw_model.make_spectrum(sp, emin, emax, nbins, redshift=redshift,
                                    cosmology=cosmo)

You can also simply specify a distance in the dist keyword argument, if the source is local (but note that in this case you cannot specify a redshift at the same time):

# Make a flux spectrum in the observer frame at some local distance

emin_obs = 2.0
emax_obs = 20.0

spec_obs = plaw_model.make_spectrum(sp, emin, emax, nbins, dist=(8.0, "kpc"))

Note

At this time, Doppler-shifting of photon energies by motions of the emitting material is not available for the creation of spectra in this mode, but it will be available in a future release.