Spatial Models in SOXS¶
The SpatialModel class can be used to create RA and Dec positions of photons,
which can be combined with the energies from a Spectrum object to create a
source that can be written to a SIMPUT photon list. Several SpatialModel
derivatives are available, which are documented below.
In general, each SpatialModel takes the following information:
A central RA and Dec for the source
Some prescription for how the photons should be distributed on the sky in terms of parameters and/or a model function
Each SpatialModel can be used to generate sky coordinates for events, as
described below in Generating Event Coordinates from Spatial Models.
PointSourceModel¶
The PointSourceModel generates photon positions for a
point source.
from soxs import PointSourceModel
ra0 = 30.0 # source RA in degrees
dec0 = 45.0 # source Dec in degrees
pt_src = PointSourceModel(ra0, dec0)
Though this model is trivial, it is constructed in the same way as the other models below for consistency.
Radial Models¶
The following classes generate azimuthally symmetric models (though see Ellipticity of Radial Source Models) from functions or lookup tables for a surface brightness profile as a function of radius.
BetaModel¶
The BetaModel generates photon positions for a
\(\beta\)-model profile, often used to model galaxy clusters. The
functional form of the \(\beta\)-model for a surface brightness
profile is:
where \(S_0\) is the central surface brightness, \(\beta\) is the slope parameter, and \(r_c\) is the core radius. To construct one:
from soxs import BetaModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
r_c = 20.0 # the core radius in arc seconds
beta = 2./3. # the beta slope parameter
beta_src = BetaModel(ra0, dec0, r_c, beta)
The normalization of the BetaModel will be determined
by the Spectrum object it is combined with, so the
\(S_0\) parameter is not specified.
DoubleBetaModel¶
The DoubleBetaModel generates photon positions for a
sum of two \(\beta\)-model profiles, often used to model cool-core galaxy
clusters. This sum is parameterized as:
where \(S_{0,1}\) and \(S_{0,2}\) are the central surface brightness
parameters of the two profiles, \(\beta_1\) and \(\beta_2\) are the
slope parameters of the two profiles, and \(r_{c,1}\) and \(r_{c,2}\) are
the core radius parameters. The ratio \(S_{0,2}/S_{0,1}\) is parameterized by
sb_ratio in the example below. To construct a DoubleBetaModel
object:
from soxs import DoubleBetaModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
r_c1 = 20.0 # the inner core radius in arc seconds
beta1 = 2./3. # the inner beta slope parameter
r_c2 = 100.0 # the outer core radius in arc seconds
beta2 = 1. # the outer beta slope parameter
sb_ratio = 0.5 # the ratio of the outer to the inner SB peak value
beta_src = DoubleBetaModel(ra0, dec0, r_c1, beta1, r_c2, beta2,
sb_ratio)
AnnulusModel¶
The AnnulusModel can be used to generate photon
positions for a annulus or disk with uniform surface brightness:
from soxs import AnnulusModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
r_in = 0.0 # inner radius of shell in arcseconds
r_out = 10.0 # outer radius of shell in arcseconds
ann_src = AnnulusModel(ra0, dec0, r_in, r_out)
RadialFunctionModel¶
RadialFunctionModel takes as input a central RA,
Dec, and a Python function or callable object to generate an azimuthally
symmetric distribution of photon positions:
from soxs import RadialFunctionModel
# A simple inverse square-law surface brightness profile.
# There is no need to normalize it properly, since that
# will be taken care of by the accompanying spectral
# model. r is in arcseconds.
def S_r(r):
return 1.0/(r*r)
ra0 = 100.0 # center RA in degrees
dec0 = -30.0 # center Dec in degrees
my_src = RadialFunctionModel(ra0, dec0, S_r)
RadialArrayModel¶
RadialArrayModel takes as input a central RA,
Dec, and two NumPy arrays of radius and surface brightness to generate
an azimuthally symmetric distribution of photon positions:
from soxs import RadialArrayModel
ra0 = 100.0 # center RA in degrees
dec0 = -30.0 # center Dec in degrees
r = np.linspace(0.0, 100.0, 10000) # binned array of radii in arcseconds
r_s = 100.0 # scale radius of arcseconds
S_r = 1.0/((1.0+r/r_s)**2*(r/r_s)) # the surface brightness array
my_src = RadialArrayModel(ra0, dec0, r, S_r)
RadialFileModel¶
RadialFileModel takes as input a central RA, Dec,
and an ASCII table of two columns, radius and surface brightness, to
generate an azimuthally symmetric distribution of photon positions:
from soxs import RadialFileModel
ra0 = 100.0 # center RA in degrees
dec0 = -30.0 # center Dec in degrees
my_src = RadialFileModel(ra0, dec0, "my_profile.dat")
Ellipticity of Radial Source Models¶
Any of the radial source models listed above take two parameters,
ellipticity and theta, which define the ellipticity of the
model and the orientation of the ellipse, respectively. For example,
to make an elliptical annulus source tilted 45 degrees from the horizontal:
from soxs import AnnulusModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
r_in = 10.0 # inner radius of shell in arcseconds
r_out = 30.0 # outer radius of shell in arcseconds
ellipticity = 0.5
theta = 45.0
ann_src = AnnulusModel(ra0, dec0, r_in, r_out, ellipticity=ellipticity)
where ellipticity will shrink the annulus (or other shape) in
the y-direction if < 1 or will expand it in the y-direction if > 1.
RectangleModel¶
The RectangleModel generates photon positions
on the sky which fill a given rectangle shape, which can be optionally
rotated through an angle:
from soxs import RectangleModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
width = 20.0 # width of the rectangle in arcseconds
height = 10.0 # height of the rectangle in arcseconds
theta = 20.0 # rotation angle of the rectangle in degrees
fov_src = RectangleModel(ra0, dec0, fov, theta=theta)
Setting either the width or height parameter to 0.0 creates a line source.
“Field of View” Sources¶
The FillFOVModel generates photon positions on
the sky which fill a given field of view:
from soxs import FillFOVModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
fov = 20.0 # width of the field of view in arcminutes
fov_src = FillFOVModel(ra0, dec0, fov)
This may be useful for creating background-like sources.
Generating Event Coordinates from Spatial Models¶
To generate coordinates from any SpatialModel, the method
generate_coords() is provided. This method takes
the number of events you wish to generate as a required parameter, and a pseudo
random number generator as an optional parameter. It returns two unitful arrays of
RA and Dec coordinates in degrees:
from soxs import BetaModel
ra0 = 30.0 # center RA in degrees
dec0 = 45.0 # center Dec in degrees
r_c = 20.0 # the core radius in arc seconds
beta = 2./3. # the beta slope parameter
beta_src = BetaModel(ra0, dec0, r_c, beta)
# Generate coordinates
prng = 24 # random seed
num_events = 1000000 # number of events to generate
ra, dec = beta_src.generate_coords(num_events, prng=prng)
Normally, generate_coords() will not need to be
called by the end-user but will be used “under the hood” in the generation of
a PhotonList as part of a SimputCatalog.
See SIMPUT for more information.