pypeit.spectrographs.keck_kcwi module

Implements KCWI-specific functions.

class pypeit.spectrographs.keck_kcwi.KeckKCRMSpectrograph[source]

Bases: KeckKCWIKCRMSpectrograph

Child to handle Keck/KCRM specific code

camera = 'KCRM'

Name of the spectrograph camera or arm. This is used by specdb, so use that naming convention

comment = 'Supported setups: RL, RM1, RM2, RH3; see :doc:`keck_kcwi`'

A brief comment or description regarding PypeIt usage with this spectrograph.

classmethod default_pypeit_par()[source]

Return the default parameters to use for this instrument.

Returns:

Parameters required by all of PypeIt methods.

Return type:

PypeItPar

get_amplifiers(numamps)[source]

Obtain a list of the amplifier ID numbers

Parameters:

numamps (int) – Number of amplifiers used for readout

Returns:

A list (of length numamps) containing the ID number of the amplifiers used for readout

Return type:

list

get_detector_par(det, hdu=None)[source]

Return metadata for the selected detector.

Warning

Many of the necessary detector parameters are read from the file header, meaning the hdu argument is effectively required for KCRM. The optional use of hdu is only viable for automatically generated documentation.

Parameters:
  • det (int) – 1-indexed detector number.

  • hdu (astropy.io.fits.HDUList, optional) – The open fits file with the raw image of interest.

Returns:

Object with the detector metadata.

Return type:

DetectorContainer

get_rawimage(raw_file, det)[source]

Read a raw KCRM data frame

Parameters:
  • raw_file (str) – File to read

  • det (int) – 1-indexed detector to read

Returns:

  • detector_par (pypeit.images.detector_container.DetectorContainer) – Detector metadata parameters.

  • raw_img (numpy.ndarray) – Raw image for this detector.

  • hdu (astropy.io.fits.HDUList) – Opened fits file

  • exptime (float) – Exposure time read from the file header

  • rawdatasec_img (numpy.ndarray) – Data (Science) section of the detector as provided by setting the (1-indexed) number of the amplifier used to read each detector pixel. Pixels unassociated with any amplifier are set to 0.

  • oscansec_img (numpy.ndarray) – Overscan section of the detector as provided by setting the (1-indexed) number of the amplifier used to read each detector pixel. Pixels unassociated with any amplifier are set to 0.

header_name = 'KCRM'

Name of the spectrograph camera or arm from the Header. Usually the INSTRUME card.

init_meta()[source]

Define how metadata are derived from the spectrograph files.

That is, this associates the PypeIt-specific metadata keywords with the instrument-specific header cards using meta.

static is_nasmask(hdr)[source]

Determine if a frame used nod-and-shuffle.

Parameters:

hdr (astropy.io.fits.Header) – The header of the raw frame.

Returns:

True if NAS used.

Return type:

bool

name = 'keck_kcrm'

The name of the spectrograph. See Spectrographs for the currently supported spectrographs.

raw_header_cards()[source]

Return additional raw header cards to be propagated in downstream output files for configuration identification.

The list of raw data FITS keywords should be those used to populate the configuration_keys() or are used in config_specific_par() for a particular spectrograph, if different from the name of the PypeIt metadata keyword.

This list is used by subheader_for_spec() to include additional FITS keywords in downstream output files.

Returns:

List of keywords from the raw data files that should be propagated in output files.

Return type:

list

url = 'https://www2.keck.hawaii.edu/inst/kcwi/'

Reference url

class pypeit.spectrographs.keck_kcwi.KeckKCWIKCRMSpectrograph[source]

Bases: Spectrograph

Parent to handle Keck/KCWI+KCRM specific code

Todo

  • Need to apply spectral flexure and heliocentric correction to waveimg – done?

  • Copy fast_histogram code into PypeIt?

  • Re-write flexure code with datamodel + implement spectral flexure QA in find_objects.py

  • When making the datacube, add an option to apply a spectral flexure correction from a different frame?

  • Write some detailed docs about the corrections that can be used when making a datacube

  • Consider introducing a new method (par[‘flexure’][‘spec_method’]) for IFU flexure corrections (see find-objects.py)

bpm(filename, det, shape=None, msbias=None)[source]

Generate a default bad-pixel mask for KCWI and KCRM.

Even though they are both optional, either the precise shape for the image (shape) or an example file that can be read to get the shape (filename using get_image_shape()) must be provided.

Parameters:
  • filename (str or None) – An example file to use to get the image shape.

  • det (int) – 1-indexed detector number to use when getting the image shape from the example file.

  • shape (tuple, optional) – Processed image shape Required if filename is None Ignored if filename is not None

  • msbias (numpy.ndarray, optional) – Processed bias frame used to identify bad pixels. This is ignored for KCWI.

Returns:

An integer array with a masked value set to 1 and an unmasked value set to 0. All values are set to 0.

Return type:

numpy.ndarray

calc_pattern_freq(frame, rawdatasec_img, oscansec_img, hdu)[source]

Calculate the pattern frequency using the overscan region that covers the overscan and data sections. Using a larger range allows the frequency to be pinned down with high accuracy.

NOTE: The amplifiers are arranged as follows:

(0,ny) ——— (nx,ny)
| 3 | 4 |
———
| 1 | 2 |
(0,0) ——— (nx, 0)

Todo

PATTERN FREQUENCY ALGORITHM HAS NOT BEEN TESTED WHEN BINNING != 1x1

Parameters:
  • frame (numpy.ndarray) – Raw data frame to be used to estimate the pattern frequency.

  • rawdatasec_img (numpy.ndarray) – Array the same shape as frame, used as a mask to identify the data pixels (0 is no data, non-zero values indicate the amplifier number).

  • oscansec_img (numpy.ndarray) – Array the same shape as frame, used as a mask to identify the overscan pixels (0 is no data, non-zero values indicate the amplifier number).

  • hdu (astropy.io.fits.HDUList) – Opened fits file.

Returns:

patt_freqs – List of pattern frequencies.

Return type:

list

check_frame_type(ftype, fitstbl, exprng=None)[source]

Check for frames of the provided type.

Parameters:
Returns:

Boolean array with the flags selecting the exposures in fitstbl that are ftype type frames.

Return type:

numpy.ndarray

compound_meta(headarr, meta_key)[source]

Methods to generate metadata requiring interpretation of the header data, instead of simply reading the value of a header card.

Parameters:
Returns:

Metadata value read from the header(s).

Return type:

object

config_specific_par(scifile, inp_par=None)[source]

Modify the PypeIt parameters to hard-wired values used for specific instrument configurations.

Parameters:
  • scifile (str) – File to use when determining the configuration and how to adjust the input parameters.

  • inp_par (ParSet, optional) – Parameter set used for the full run of PypeIt. If None, use default_pypeit_par().

Returns:

The PypeIt parameter set adjusted for configuration specific parameter values.

Return type:

ParSet

configuration_keys()[source]

Return the metadata keys that define a unique instrument configuration.

This list is used by PypeItMetaData to identify the unique configurations among the list of frames read for a given reduction.

Returns:

List of keywords of data pulled from file headers and used to constuct the PypeItMetaData object.

Return type:

list

classmethod default_pypeit_par()[source]

Return the default parameters to use for this instrument.

Returns:

Parameters required by all of PypeIt methods.

Return type:

PypeItPar

get_datacube_bins(slitlength, minmax, num_wave)[source]

Calculate the bin edges to be used when making a datacube.

Parameters:
  • slitlength (int) – Length of the slit in pixels

  • minmax (numpy.ndarray) – An array with the minimum and maximum pixel locations on each slit relative to the reference location (usually the centre of the slit). Shape must be \((N_{\rm slits},2)\), and is typically the array returned by get_radec_image().

  • num_wave (int) –

    Number of wavelength steps. Given by::

    int(round((wavemax-wavemin)/delta_wave))

:param tuple: Three 1D numpy.ndarray providing the bins to use :param when constructing a histogram of the spec2d files. The elements: :param are \(: :type are :math:\): x,y,lambda

get_lamps_status(headarr)[source]

Return a string containing the information on the lamp status.

Parameters:

headarr (list) – A list of 1 or more astropy.io.fits.Header objects.

Returns:

A string that uniquely represents the lamp status.

Return type:

str

get_wcs(hdr, slits, platescale, wave0, dwv, spatial_scale=None)[source]

Construct/Read a World-Coordinate System for a frame.

Parameters:
  • hdr (astropy.io.fits.Header) – The header of the raw frame. The information in this header will be extracted and returned as a WCS.

  • slits (SlitTraceSet) – Slit traces.

  • platescale (float) – The platescale of an unbinned pixel in arcsec/pixel (e.g. detector.platescale). See also ‘spatial_scale’

  • wave0 (float) – The wavelength zeropoint.

  • dwv (float) – Change in wavelength per spectral pixel.

  • spatial_scale (float, None, optional) – The spatial scale (units=arcsec/pixel) of the WCS to be used. This variable is fixed, and is independent of the binning. If spatial_scale is set, it will be used for the spatial size of the WCS and the platescale will be ignored. If None, then the platescale will be used.

Returns:

The world-coordinate system.

Return type:

astropy.wcs.WCS

init_meta()[source]

Define how metadata are derived from the spectrograph files.

That is, this associates the PypeIt-specific metadata keywords with the instrument-specific header cards using meta.

lamps(fitstbl, status)[source]

Check the lamp status.

Parameters:
  • fitstbl (astropy.table.Table) – The table with the fits header meta data.

  • status (str) – The status to check. Can be 'off', 'arcs', or 'dome'.

Returns:

A boolean array selecting fits files that meet the selected lamp status.

Return type:

numpy.ndarray

Raises:

ValueError – Raised if the status is not one of the valid options.

ndet = 1

Number of detectors for this instrument.

pypeit_file_keys()[source]

Define the list of keys to be output into a standard PypeIt file.

Returns:

The list of keywords in the relevant PypeItMetaData instance to print to the PypeIt Reduction File.

Return type:

list

pypeline = 'SlicerIFU'

String used to select the general pipeline approach for this spectrograph.

supported = True

Flag that PypeIt code base has been sufficiently tested with data from this spectrograph that it is officially supported by the development team.

telescope = Parameter     Value                Default  Type        Callable ---------------------------------------------------------------- name          KECK                 KECK     str         False    longitude     -155.47833333333335  None     int, float  False    latitude      19.828333333333333   None     int, float  False    elevation     4160.000000000756    None     int, float  False    fratio        15                   None     int, float  False    diameter      10                   None     int, float  False    eff_aperture  72.3674              None     int, float  False   

Instance of TelescopePar providing telescope-specific metadata.

class pypeit.spectrographs.keck_kcwi.KeckKCWISpectrograph[source]

Bases: KeckKCWIKCRMSpectrograph

Child to handle Keck/KCWI specific code

camera = 'KCWI'

Name of the spectrograph camera or arm. This is used by specdb, so use that naming convention

comment = 'Supported setups: BL, BM, BH2; see :doc:`keck_kcwi`'

A brief comment or description regarding PypeIt usage with this spectrograph.

classmethod default_pypeit_par()[source]

Return the default parameters to use for this instrument.

Returns:

Parameters required by all of PypeIt methods.

Return type:

PypeItPar

fit_2d_det_response(det_resp, gpmask)[source]

Perform a 2D model fit to the KCWI detector response. A few different setups were inspected (BH2 & BM with different grating angles), and a very similar response pattern was found for all setups, indicating that this structure is something to do with the detector. The starting parameters and functional form are assumed to be sufficient for all setups.

Parameters:
  • det_resp (numpy.ndarray) – An image of the flatfield structure.

  • gpmask (numpy.ndarray) – Good pixel mask (True=good), the same shape as ff_struct.

Returns:

A model fit to the flatfield structure.

Return type:

numpy.ndarray

get_detector_par(det, hdu=None)[source]

Return metadata for the selected detector.

Warning

Many of the necessary detector parameters are read from the file header, meaning the hdu argument is effectively required for KCWI. The optional use of hdu is only viable for automatically generated documentation.

Parameters:
  • det (int) – 1-indexed detector number.

  • hdu (astropy.io.fits.HDUList, optional) – The open fits file with the raw image of interest.

Returns:

Object with the detector metadata.

Return type:

DetectorContainer

get_rawimage(raw_file, det)[source]

Read a raw KCWI data frame

NOTE: The amplifiers are arranged as follows:

(0,ny) ——— (nx,ny)
| 3 | 4 |
———
| 1 | 2 |
(0,0) ——— (nx, 0)
Parameters:
  • raw_file (str) – File to read

  • det (int) – 1-indexed detector to read

Returns:

  • detector_par (pypeit.images.detector_container.DetectorContainer) – Detector metadata parameters.

  • raw_img (numpy.ndarray) – Raw image for this detector.

  • hdu (astropy.io.fits.HDUList) – Opened fits file

  • exptime (float) – Exposure time read from the file header

  • rawdatasec_img (numpy.ndarray) – Data (Science) section of the detector as provided by setting the (1-indexed) number of the amplifier used to read each detector pixel. Pixels unassociated with any amplifier are set to 0.

  • oscansec_img (numpy.ndarray) – Overscan section of the detector as provided by setting the (1-indexed) number of the amplifier used to read each detector pixel. Pixels unassociated with any amplifier are set to 0.

header_name = 'KCWI'

Name of the spectrograph camera or arm from the Header. Usually the INSTRUME card.

init_meta()[source]

Define how metadata are derived from the spectrograph files.

That is, this associates the PypeIt-specific metadata keywords with the instrument-specific header cards using meta.

static is_nasmask(hdr)[source]

Determine if a frame used nod-and-shuffle.

Parameters:

hdr (astropy.io.fits.Header) – The header of the raw frame.

Returns:

True if NAS used.

Return type:

bool

name = 'keck_kcwi'

The name of the spectrograph. See Spectrographs for the currently supported spectrographs.

raw_header_cards()[source]

Return additional raw header cards to be propagated in downstream output files for configuration identification.

The list of raw data FITS keywords should be those used to populate the configuration_keys() or are used in config_specific_par() for a particular spectrograph, if different from the name of the PypeIt metadata keyword.

This list is used by subheader_for_spec() to include additional FITS keywords in downstream output files.

Returns:

List of keywords from the raw data files that should be propagated in output files.

Return type:

list

scattered_light_archive(binning, dispname)[source]

Archival model parameters for the scattered light. These are based on best fits to currently available data.

For KCWI, the main contributor to the scattered light is referred to as the “narcissistic ghost” by Morrissey et al. (2018), ApJ, 864, 93. This scattered light is thought to be a reflection off the detector that travels back through the optical system. Some fraction gets sent back out to space, while the remained comes back through the optical system and a fuzzy version of this is re-imaged onto the detector. The current KCWI scattered light model is designed to account for these effects.

Parameters:
  • binning (str, optional) – Comma-separated binning along the spectral and spatial directions; e.g., 2,1

  • dispname (str, optional) – Name of the disperser

Returns:

  • x0 (numpy.ndarray) – A 1D array containing the best-fitting model parameters

  • bounds (tuple) – A tuple of two elements, containing two numpy.ndarray of the same length as x0. These two arrays contain the lower (first element of the tuple) and upper (second element of the tuple) bounds to consider on the scattered light model parameters.

url = 'https://www2.keck.hawaii.edu/inst/kcwi/'

Reference url