Configuration

This section describes how a simulation is configured using information read from files and command-line options. For an overview of how a simulation is performed and what parameters it requires see the User’s Guide. Configuration options specify the instrument, atmosphere and source to simulate, and how the simulation should be performed.

This package originated as a DESI-specific simulation tool but, as of v0.3, has no code dependencies on DESI software and makes no hardcoded assumptions that are specific to DESI. Instead, any fiber spectrograph and observing conditions can be configured. Several configurations are included with the code distribution (under specsim/data/config/) and described below. New configurations are straightforward to create using these examples as templates.

This document provides a user-oriented view of configuration, and focuses on the tasks of interpreting end editing configuration files. For a developer-oriented view, see the API documentation.

Configuration File

The top-level configuration is specified by a single YAML file with four main sections: atmosphere, instrument, source, and simulator. This top-level file refers to additional files containing tabulated data, which are generally large and packaged separately. For example, the DESI configuration refers to files in the desimodel package.

Most of the configuration is used to initialize the independent models of the atmosphere, instrument and source that come together in the simulator. However, there are also a few global configuration options that you should be familiar with:

name: DESI QuickSim

# Be verbose during the simulation?
verbose: no

# The base path is pre-pended to all non-absolute path values below.
# {...} will be expanded using environment variables.
base_path: '{DESIMODEL}/data'

# Specify the wavelength grid to use for simulation.
wavelength_grid:
    unit: Angstrom
    min: 3500.3
    max: 9999.7
    step: 0.1

The first two parameters are self explanatory. The base_path option establishes the link between a configuration file and a directory tree containing the tabulated data that it refers to. The wavelength_grid options specify the equally spaced wavelength grid used internally by the simulation, which should be chosen to cover the instrument throughput and should sample the instrument’s wavelength resolution sufficiently for a binned model of resolution effects. This wavelength grid is downsampled to the simulation output grid according to the simulator.downsampling parameter.

A valid configuration file is a YAML file whose hierarchy is specified using only mappings (dictionaries), with no sequences (lists). All mapping keys must be valid python identifiers, and custom objects are not supported.

The various configuration sections share some common syntax for specifying physical constants and tabular data, as described in the following sections.

Constants

Physical constants are grouped within a constants node and consists of a list of name-value pairs, for example:

constants:
    read_noise: 2.9 electron
    dark_current: 2.0 electron/(hour pixel**2)
    gain: 1.0 electron/adu

Units are required, except for dimensionless quantities, and must be separated from the value with some white space. Units are interpreted by the astropy.units module. Note that pixel is interpreted as a linear unit in this package, so that dark current is expressed in units of pixel**2.

Tabulated Data

Tabulated data is read using astropy.table.Table.read() so is very flexible. A simple table node to specify a function of wavelength might look like:

table:
    path: throughput.csv
    columns:
        wavelength: { index: 0, unit: Angstrom }
        throughput: { index: 1 }

In this example, the file format is automatically determined by the filename extension and the required columns are identified by their indices (0, 1) in the file. Tabulated data generally requires units, but these can be specified in the configuration file instead of the data file, for more flexibility.

Here is a more complex example of reading data from a binary table within a multi-HDU FITS file:

table:
    path: throughput.fits
    hdu: THRU
    wavelength: { name: wave }
    throughput: { name: thru }

In this case the HDU and columns are identified by their names in the FITS file.

Finally, some tabulated data uses different files to represent different options. For example, sky surface brightness tables under different conditions are specified by replacing the path node with a paths node as follows:

paths:
    dark: dark-sky.csv
    grey: grey-sky.csv
    bright: bright-sky.csv

For additional examples of specifying tabular data, refer to the configurations included with this package and described below.

DESI Configuration

The DESI configuration refers to data files maintained in the desimodel package, which the user must separately install. The linkage is established via the DESIMODEL environment variable via the following line in desi.yaml:

base_path: '{DESIMODEL}/data'

The DESI configuration reads tabulated data files directly from desimodel so any changes there propagate automatically to the simulation. Note, however, that the specsim DESI configuration does not read constants directly from desimodel/desi.yaml. Instead, the following values are copied from that file into this package’s DESI configuration file (also called desi.yaml), in order to achieve a unified and consistent configuration scheme:

desimodel name specsim name
area.M1_diameter instrument.constants.primary_mirror_diameter
fibers.diameter_um instrument.constants.fiber_diameter
area.obscuration_diameter instrument.constants.obscuration_diameter
area.M2_support_width instrument.constants.support_width
ccd.*.readnoise instrument.cameras.*.constants.read_noise
ccd.*.darkcurrent instrument.cameras.*.constants.dark_current
ccd.*.gain instrument.cameras.*.constants.gain
exptime observation.constants.exposure_time

In addition to name mappings above, the specsim configuration values all have machine-readable units attached in a constants section (unlike the corresponding desimodel values, where units are specified in comments).

Atmosphere

The following plot summarizes the default DESI atmosphere used for simulations, and was created using:

config = specsim.config.load_config('desi')
specsim.atmosphere.initialize(config).plot()
DESI default atmosphere configuration

The default atmosphere has the moon below the horizon. To simulate grey or bright conditions, add scattered moon light by modifying the relevant parameters in the configuration, or else by changing attributes of the initialized atmosphere model. For example:

atm = specsim.atmosphere.initialize(config)
atm.airmass = 1.3
atm.moon.moon_zenith = 60 * u.deg
atm.moon.separation_angle = 50 * u.deg
atm.moon.moon_phase = 0.25
atm.plot()
DESI bright atmosphere configuration

Note how total sky emission has increased significantly and is dominated by scattered moon at the blue end. To explore the dependence of the scattered moon brightness on the observed field, use specsim.atmosphere.plot_lunar_brightness(). For example:

specsim.atmosphere.plot_lunar_brightness(
    moon_zenith=60*u.deg, moon_azimuth=90*u.deg, moon_phase=0.25)
DESI scattered moon brightness

Instrument

The following plot summarizes the default DESI instrument configuration, and was created using:

config = specsim.config.load_config('desi')
specsim.instrument.initialize(config).plot()
DESI default instrument configuration

Test Configuration

The test configuration is intended for self-contained tests and demonstrations of this packages capabilities and only refers to small tabulated data files that are distributed with this package. As a result, the test configuration is deliberately over-simplified and should only be used for testing purposes.

Atmosphere

The following plot summarizes the default test atmosphere used for simulations, and was created using:

config = specsim.config.load_config('test')
specsim.atmosphere.initialize(config).plot()
Test default atmosphere configuration

Note that the test atmosphere has the moon above the horizon by default.

Instrument

The following plot summarizes the default test instrument configuration, and was created using:

config = specsim.config.load_config('test')
specsim.instrument.initialize(config).plot()
Test default instrument configuration