Set up your Instrument#
The jayrock.Instrument class allows you to define and configure the JWST
instrument and observing mode used for your observation. This setup determines
the specific optics (filters, gratings) and detector settings (exposure time,
readouts) used for the observation.
Choose the instrument#
To begin, you select the instrument (e.g. NIRSpec) and its observing mode (e.g. IFU).
Refer to the pandeia documentation for supported instruments and modes.
import jayrock
inst = jayrock.Instrument("NIRSpec", mode="IFU")
Your instrument is configured with default optical and detector settings.
The complete configuration is stored as a nested dictionary in the inst.config attribute. Use inst.print_config() to view all settings:
>>> inst.print_config()
{
"instrument": {
"aperture": "ifu",
"disperser": "g140m",
"filter": "f100lp",
"instrument": "nirspec",
"mode": "ifu"
},
"detector": {
"nexp": 1,
"ngroup": 10,
"nint": 1,
"readout_pattern": "nrs",
"subarray": "full"
}
}
Configure the optics#
Once the instrument is defined, you can configure the optical components (aperture, disperser (grating), and filter) using the dot notation.
inst.aperture = "ifu"
inst.disperser = "g235m"
inst.filter = "f170lp"
Refer to the pandeia documentation for dispersers and filters per instrument and mode.
Configure the detector#
The detector settings define the number of integrations (= exposure time) and read-out
parameters. You can either define the integration parameters yourself or define
an SNR target and let jayrock determine the required number of groups and
integrations.
Setting exposure parameters#
Directly set integration parameters and read-outs via the inst.detector dictionary.
inst.detector.ngroup = 5 # number of groups per integration
inst.detector.nint = 1 # number of integrations per exposure
inst.detector.nexp = 4 # number of exposures -> number of dithers
inst.detector.readout_pattern = "nirs2rapid"
Setting SNR targets#
Instead of manually setting ngroup and nint,
you can define a target Signal-to-Noise Ratio (SNR) for your observation.
jayrock then determines the minimum ngroup and nint parameters to
reach this SNR via a binary search.
This estimation uses your Target’s spectrum and the selected instrument configuration.
>>> SNR_TARGET = 100
>>> # Get target and observation date
>>> target = jayrock.Target("Pawlowia")
>>> target.compute_ephemeris(cycle=6)
>>> date_obs = target.get_date_obs(at='vmag_min')
>>> # Using the Instrument configuration from above (NIRSpec IFU G235M/F170LP)
>>> inst.set_snr_target(SNR_TARGET, target, date_obs)
INFO [jayrock] Searching for minimum ngroup|nint to reach SNR=100.00 at 2.42μm
INFO [jayrock] nint=1 | ngroup=100 -> SNR=390.4 | Texp=98.2min
INFO [jayrock] nint=1 | ngroup=52 -> SNR=299.5 | Texp=51.5min
INFO [jayrock] nint=1 | ngroup=28 -> SNR=222.2 | Texp=28.2min
INFO [jayrock] nint=1 | ngroup=16 -> SNR=161.1 | Texp=16.5min
INFO [jayrock] nint=1 | ngroup=10 -> SNR=115.3 | Texp=10.7min
INFO [jayrock] nint=1 | ngroup=7 -> SNR=84.1 | Texp=7.8min
INFO [jayrock] nint=1 | ngroup=9 -> SNR=105.7 | Texp=9.7min
INFO [jayrock] nint=1 | ngroup=8 -> SNR=95.3 | Texp=8.8min
INFO [jayrock] Done. Setting ngroup=9, nint=1.
Texp indicates the total exposure time of the observation, accounting for ngroup, nint, and nexp.
By default, the SNR is evaluated at the midpoint wavelength of the selected
aperture/disperser/filter combination (following the online ETC behaviour). You can override this using the wave argument:
>>> inst.set_snr_target(SNR_TARGET, target, date_obs, wave=2.7)
INFO [jayrock] Searching for minimum ngroup|nint to reach SNR=100.00 at 2.70μm
INFO [jayrock] nint=1 | ngroup=100 -> SNR=328.3 | Texp=98.2min
INFO [jayrock] nint=1 | ngroup=52 -> SNR=248.7 | Texp=51.5min
INFO [jayrock] nint=1 | ngroup=28 -> SNR=181.7 | Texp=28.2min
INFO [jayrock] nint=1 | ngroup=16 -> SNR=128.7 | Texp=16.5min
INFO [jayrock] nint=1 | ngroup=10 -> SNR=89.2 | Texp=10.7min
INFO [jayrock] nint=1 | ngroup=13 -> SNR=110.6 | Texp=13.6min
INFO [jayrock] nint=1 | ngroup=12 -> SNR=103.9 | Texp=12.6min
INFO [jayrock] nint=1 | ngroup=11 -> SNR=96.8 | Texp=11.7min
INFO [jayrock] Done. Setting ngroup=12, nint=1.
The minimisation process first varies nint to find a suitable value, and
then runs several simulations varying ngroup (7 in total assuming
ngroup is between 5 and 100, the default) to find the minimum value that
meets the SNR target. This takes a few minutes. To speed up the process, you
can define an SNR range instead of a fixed value by providing a tuple
(SNR_min, SNR_max). This way, the search stops as soon as the SNR falls
within the defined range.
>>> SNR_TARGET_RANGE = (80, 120)
>>> inst.set_snr_target(SNR_TARGET, target, date_obs, wave=2.7)
INFO [jayrock] Searching for minimum ngroup|nint to reach SNR range 80.0-120.0 at 2.70μm
INFO [jayrock] nint=1 | ngroup=5 -> SNR=43.2 | Texp=5.8min
INFO [jayrock] nint=1 | ngroup=100 -> SNR=328.3 | Texp=98.2min
INFO [jayrock] nint=1 | ngroup=52 -> SNR=248.7 | Texp=51.5min
INFO [jayrock] nint=1 | ngroup=28 -> SNR=181.7 | Texp=28.2min
INFO [jayrock] nint=1 | ngroup=16 -> SNR=128.7 | Texp=16.5min
INFO [jayrock] nint=1 | ngroup=10 -> SNR=89.2 | Texp=10.7min
INFO [jayrock] Done. Setting ngroup=10, nint=1.