.. _cmd-spatial:

Command Line Scripts for Spatial Models
=======================================

These are scripts that create photon lists for SIMPUT catalogs that can serve
as inputs to the instrument simulator. For details on what's going on under the
hood, see :ref:`spatial`, :ref:`spectra`, and :ref:`simput`.

Each of these scripts accepts a ``specfile`` argument, which is a two-column ASCII
table of energy (keV) and specific flux (:math:`\rm{photons~s^{-1}~cm^{-2}~keV^{-1}}`)
which can be written using the spectra command-line scripts (see :ref:`cmd-spectra`),
the Python method :meth:`~soxs.spectra.Spectrum.write_file` (see :ref:`spectra`),
or can be created by hand.

.. _cmd-make-point-source:

``make_point_source``
---------------------

This script creates a SIMPUT source of a point source from a spectrum supplied in a
file.

.. code-block:: text

    usage: make_point_source [-h] [--src_filename SRC_FILENAME] [--append] [--overwrite] filename name ra0 dec0 specfile

    Create a SIMPUT source of a point from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source in degrees.
      dec0                  The declination of the source in degrees.
      specfile              The file containing the spectrum to be used.

    optional arguments:
      -h, --help            show this help message and exit
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for a point source.

.. code-block:: bash

    [~]$ make_point_source pt_src.simput src1 20.0 -32.0 pt_src_spectrum.dat --overwrite

Add a new point source to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_point_source pt_src.simput src2 19.0 -31.0 pt_src_spectrum.dat --append --overwrite

Make a brand-new SIMPUT catalog for a point source, but write the source to a different file.

.. code-block:: bash

    [~]$ make_point_source pt_src.simput src2 19.0 -31.0 pt_src_spectrum.dat --src_filename=pt.fits --overwrite

.. _cmd-make-beta-model-source:

``make_beta_model_source``
--------------------------

This script creates a SIMPUT source of a :math:`\beta`-model from a spectrum supplied in a
file. The functional form of the :math:`\beta`-model for a surface brightness profile is:

.. math::

    S(r) = S_0\left[1+\left(\frac{r}{r_c}\right)^2\right]^{(-3\beta+1/2)}

.. code-block:: text

    usage: make_beta_model_source [-h] [--theta THETA] [--ellipticity ELLIPTICITY] [--src_filename SRC_FILENAME] [--append] [--overwrite]
                                  filename name ra0 dec0 r_c beta specfile image_width nx

    Create a SIMPUT source of a beta-model from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source center in degrees.
      dec0                  The declination of the source center in degrees.
      r_c                   The core radius in arcseconds.
      beta                  The beta parameter.
      specfile              The file containing the spectrum to be used.
      image_width           The width of the image in arcminutes.
      nx                    The resolution of the image.

    optional arguments:
      -h, --help            show this help message and exit
      --theta THETA         The angle through which to rotate the beta model in degrees. Only makes sense if ellipticity is added. Default:
                            0.0
      --ellipticity ELLIPTICITY
                            The ellipticity of the radial profile, expressed as the ratio between the length scales of the x and y
                            coordinates. The value of this parameter will shrink or expand the profile in the direction of the "y"
                            coordinate, so you may need to rotate to get the shape you want. Default: 1.0
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for a :math:`\beta`-model source.

.. code-block:: bash

    [~]$ make_beta_model_source my_srcs.simput beta_src1 20.0 -32.0 10.0 1.0 my_spectrum.dat 30.0 2000 --overwrite

Add a new :math:`\beta`-model to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_beta_model_source my_srcs.simput beta_src2 19.0 -31.0 10.0 1.0 my_spectrum.dat 30.0 2000 --append --overwrite

Make a brand-new SIMPUT catalog for a :math:`\beta`-model source, but write the source to a different file.

.. code-block:: bash

    [~]$ make_beta_model_source my_srcs.simput src2 19.0 -31.0 10.0 1.0 my_spectrum.dat 30.0 2000 --src_filename=beta.fits --overwrite

Add a new :math:`\beta`-model to an existing SIMPUT catalog, but write the source to
a different file.

.. code-block:: bash

    [~]$ make_beta_model_source my_srcs.simput beta_src2 19.0 -31.0 10.0 1.0 my_spectrum.dat 30.0 2000 --append --overwrite --src_filename=pt.fits

Add ellipticity and tilt the model:

.. code-block:: bash

    [~]$ make_beta_model_source my_srcs.simput beta_src1 20.0 -32.0 10.0 1.0 my_spectrum.dat 30.0 2000 --ellipticity=0.5 --theta=45.0 --overwrite

.. _cmd-make-double-beta-model-source:

``make_double_beta_model_source``
---------------------------------

This script creates a SIMPUT source of a double-:math:`\beta`-model from a spectrum
supplied in a file. The functional form of the double-:math:`\beta`-model for a
surface brightness profile is:

.. math::

    S(r) = S_{0,1}\left\{\left[1+\left(\frac{r}{r_{c,1}}\right)^2\right]^{(-3\beta_1+1/2)} +
           \frac{S_{0,2}}{S_{0,1}}\left[1+\left(\frac{r}{r_{c,2}}\right)^2\right]^{(-3\beta_2+1/2)}\right\}

.. code-block:: text

    usage: make_double_beta_model_source [-h] [--theta THETA] [--ellipticity ELLIPTICITY] [--src_filename SRC_FILENAME] [--append] [--overwrite]
                                         filename name ra0 dec0 r_c1 beta1 r_c2 beta2 sb_ratio specfile image_width nx

    Create a SIMPUT source of a double-beta-model from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source center in degrees.
      dec0                  The declination of the source center in degrees.
      r_c1                  The inner core radius in arcseconds.
      beta1                 The inner beta parameter.
      r_c2                  The outer core radius in arcseconds.
      beta2                 The outer beta parameter.
      sb_ratio              The ratio of the outer to the inner SB peak value.
      specfile              The file containing the spectrum to be used.
      image_width           The width of the image in arcminutes.
      nx                    The resolution of the image.

    optional arguments:
      -h, --help            show this help message and exit
      --theta THETA         The angle through which to rotate the beta model in degrees. Only makes sense if ellipticity is added. Default:
                            0.0
      --ellipticity ELLIPTICITY
                            The ellipticity of the radial profile, expressed as the ratio between the length scales of the x and y
                            coordinates. The value of this parameter will shrink or expand the profile in the direction of the "y"
                            coordinate, so you may need to rotate to get the shape you want. Default: 1.0
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for a double-:math:`\beta`-model source.

.. code-block:: bash

    [~]$ make_double_beta_model_source my_srcs.simput beta_src1 20.0 -32.0 10.0 1.0 30.0 0.6666 0.5 my_spectrum.dat 30.0 2000 --overwrite

Add a new double-:math:`\beta`-model to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_double_beta_model_source my_srcs.simput beta_src2 19.0 -31.0 10.0 1.0 30.0 0.6666 0.5 my_spectrum.dat 30.0 2000 --append --overwrite

Make a brand-new SIMPUT catalog for a double-:math:`\beta`-model, but write the source to a different file.

.. code-block:: bash

    [~]$ make_double_beta_model_source my_srcs.simput src2 19.0 -31.0 10.0 1.0 30.0 0.6666 0.5 my_spectrum.dat 30.0 2000 --src_filename=pt.fits --overwrite

Add a new double-:math:`\beta`-model to an existing SIMPUT catalog, but write the source to
a different file.

.. code-block:: bash

    [~]$ make_double_beta_model_source my_srcs.simput beta_src2 19.0 -31.0 10.0 1.0 30.0 0.6666 0.5 my_spectrum.dat 30.0 2000 --append --overwrite --src_filename=pt.fits

Add ellipticity and tilt the model:

.. code-block:: bash

    [~]$ make_double_beta_model_source my_srcs.simput beta_src1 20.0 -32.0 10.0 1.0 30.0 0.6666 0.5 my_spectrum.dat 30.0 2000 --ellipticity=0.5 --theta=45.0 --overwrite

.. _cmd-make-annulus-source:

``make_annulus_source``
-----------------------

This script creates a SIMPUT source of an annulus or disk with constant surface brightness
from a spectrum supplied in a file.

.. code-block:: text

    usage: make_annulus_source [-h] [--theta THETA] [--ellipticity ELLIPTICITY] [--src_filename SRC_FILENAME] [--append] [--overwrite]
                               filename name ra0 dec0 r_in r_out specfile image_width nx

    Create a SIMPUT source of an annulus with uniform surface brightness from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source center in degrees.
      dec0                  The declination of the source center in degrees.
      r_in                  The inner annulus of the source center in arcseconds.
      r_out                 The outer annulus of the source center in arcseconds.
      specfile              The file containing the spectrum to be used.
      image_width           The width of the image in arcminutes.
      nx                    The resolution of the image.

    optional arguments:
      -h, --help            show this help message and exit
      --theta THETA         The angle through which to rotate the beta model in degrees. Only makes sense if ellipticity is added. Default:
                            0.0
      --ellipticity ELLIPTICITY
                            The ellipticity of the radial profile, expressed as the ratio between the length scales of the x and y
                            coordinates. The value of this parameter will shrink or expand the profile in the direction of the "y"
                            coordinate, so you may need to rotate to get the shape you want. Default: 1.0
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for an annulus source.

.. code-block:: bash

    [~]$ make_annulus_source my_srcs.simput ann_src1 20.0 -32.0 0.0 30.0 my_spectrum.dat 30.0 2000 --overwrite

Add a new annulus model to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_annulus_source my_srcs.simput ann_src2 19.0 -31.0 0.0 30.0 my_spectrum.dat 30.0 2000 --append --overwrite

Add ellipticity and tilt the model:

.. code-block:: bash

    [~]$ make_annulus_source my_srcs.simput ann_src1 20.0 -32.0 0.0 30.0 my_spectrum.dat 30.0 2000 --ellipticity=2.0 --theta=30.0 --overwrite

.. _cmd-make-rectangle-source:

``make_rectangle_source``
-------------------------

This script creates a SIMPUT source of a rectangle shape with constant surface brightness
from a spectrum supplied in a file.

.. code-block:: text

    usage: make_rectangle_source [-h] [--theta THETA] [--src_filename SRC_FILENAME] [--append] [--overwrite]
                                 filename name ra0 dec0 width height specfile image_width nx

    Create a SIMPUT source of a uniformly filled rectangle from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source center in degrees.
      dec0                  The declination of the source center in degrees.
      width                 The width of the rectangle in arcseconds.
      height                The width of the rectangle in arcseconds.
      specfile              The file containing the spectrum to be used.
      image_width           The width of the image in arcminutes.
      nx                    The resolution of the image.

    optional arguments:
      -h, --help            show this help message and exit
      --theta THETA         The angle through which to rotate the rectangle in degrees. Default: 0.0
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for a rectangle source.

.. code-block:: bash

    [~]$ make_rectangle_source my_srcs.simput rect_src1 20.0 -32.0 20.0 10.0 my_spectrum.dat 30.0 2000 --overwrite

Make the same rectangle, but rotate it by 30.0 degrees.

.. code-block:: bash

    [~]$ make_rectangle_source my_srcs.simput rect_src1 20.0 -32.0 20.0 10.0 my_spectrum.dat 30.0 2000 --theta=30.0 --overwrite

Create a line source with the same width and rotation angle.

.. code-block:: bash

    [~]$ make_rectangle_source my_srcs.simput rect_src1 20.0 -32.0 20.0 0.0 my_spectrum.dat 30.0 2000 --theta=30.0 --overwrite

Add a new rectangle model to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_rectangle_source my_srcs.simput rect_src2 19.0 -31.0 20.0 10.0 my_spectrum.dat 30.0 2000 --append --overwrite

.. _cmd-make-fov-source:

``make_fov_source``
-------------------

This script creates a SIMPUT source of a field of view with constant surface brightness
from a spectrum supplied in a file.

.. code-block:: text

    usage: make_fov_source [-h] [--src_filename SRC_FILENAME] [--append] [--overwrite] filename name ra0 dec0 fov specfile image_width nx

    Create a SIMPUT source of a uniformly filled field of view from a spectrum supplied in a file.

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      ra0                   The right ascension of the source center in degrees.
      dec0                  The declination of the source center in degrees.
      fov                   The field of view on a side in arcminutes.
      specfile              The file containing the spectrum to be used.
      image_width           The width of the image in arcminutes.
      nx                    The resolution of the image.

    optional arguments:
      -h, --help            show this help message and exit
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Make a brand-new SIMPUT catalog for a field-of-view source.

.. code-block:: bash

    [~]$ make_fov_source my_srcs.simput fov_src1 20.0 -32.0 20.0 my_spectrum.dat 30.0 2000 --overwrite

Add a new field-of-view model to an existing SIMPUT catalog.

.. code-block:: bash

    [~]$ make_fov_source my_srcs.simput fov_src2 19.0 -31.0 20.0 my_spectrum.dat 30.0 2000 --append --overwrite

``make_phlist_from_ascii``
--------------------------

This script takes a table of photon RA, Dec, and energies from an ASCII-formatted table and writes them
to a new SIMPUT catalog with a photon list.

.. code-block:: text

    usage: make_phlist_from_ascii [-h] [--src_filename SRC_FILENAME] [--append] [--overwrite] name filename infile

    Create a SIMPUT source from an ASCII table of positions and energies. The file must contain the total source flux in erg/s/cm**2 on the first line, commented with #, and must have three columns of RA (degrees), Dec (degrees), and energy (keV) for each event.

    Example:

    # 1.194e-15
    30.1  45.5  2.71
    29.67 44.95 0.31
    31.25 45.03 10.01
    29.75 44.44 7.34
    30.05 44.01 12.01
    31.99 45.21 0.05
    ...

    positional arguments:
      filename              The filename of the SIMPUT catalog to write or to append to.
      name                  The name of the source in the SIMPUT catalog.
      infile                The file containing the flux and positions and energies.

    optional arguments:
      -h, --help            show this help message and exit
      --src_filename SRC_FILENAME
                            An optional filename to store the source instead of the SIMPUT catalog file.
      --append              If set, append a new source an existing SIMPUT catalog.
      --overwrite           Overwrite an existing file with the same name.

Examples
++++++++

Read photons from a file and write to a new SIMPUT catalog file.

.. code-block:: bash

    [~]$ make_phlist_from_ascii my_cat.simput photons events.txt --overwrite

Read photons from a file and write to a new SIMPUT catalog file, but write the photons to a new file.

.. code-block:: bash

    [~]$ make_phlist_from_ascii my_cat.simput photons events.txt --src_filename=photons.fits

Read photons from a file and append to an existing SIMPUT catalog file.

.. code-block:: bash

    [~]$ make_phlist_from_ascii my_cat.simput photons events.txt --append