Source code for jwst.spectral_leak.spectral_leak_step

#! /usr/bin/env python

from stdatamodels.jwst import datamodels
from jwst.datamodels import ModelContainer
from ..stpipe import Step
import numpy as np

from . import spectral_leak

__all__ = ["SpectralLeakStep"]


[docs] class SpectralLeakStep(Step): """ The MIRI MRS has a spectral leak in which 6 micron light leaks into the 12 micron channel. This step applies a correction to the 12 micron channel. """ class_alias = "spectral_leak" reference_file_types = ['mrsptcorr']
[docs] def process(self, input): """Execute the step. Parameters ---------- input : container of models containing 1-D extracted spectra Returns ------- JWST DataModel The corrected data model. This will be "input" if the step is skipped, otherwise it will be a corrected 1D extracted spectrum that contains the MRS channel 3B range. """ ch1b = None ch3a = None ich3a = None ch1b_wave = 6.0 ch3a_wave = 12.0 with datamodels.open(input) as input_model: if isinstance(input_model, ModelContainer): result = input_model.copy() # copy input to return # Retrieve the reference parameters for this type of data sp_leak_ref = self.get_reference_file(input_model[0], 'mrsptcorr') for i, x1d in enumerate(input_model): # input_model is a Model Container # check that we have the correct type of data if not isinstance(x1d, datamodels.MultiSpecModel): self.log.warning("Data sent to spectral_leak step is not an extracted spectrum. It is {}." .format(type(x1d))) for r in result: r.meta.cal_step.spectral_leak = 'SKIPPED' return result channel = x1d.meta.instrument.channel band = x1d.meta.instrument.band srctype = x1d.spec[0].source_type if srctype == 'EXTENDED': self.log.warning('No spectral leak correction for extended source data') for r in result: r.meta.cal_step.spectral_leak = 'SKIPPED' return result # search x1d containing CH 1 B if '1' in channel and 'MEDIUM' in band: self.log.info('Found CH 1B in input data') ch1b = x1d elif '1' in channel and 'MULTIPLE' in band: # read in the wavelength array and see # if it covers ch1b_wave wave = x1d.spec[0].spec_table.WAVELENGTH if np.min(wave) < ch1b_wave and np.max(wave) > ch1b_wave: self.log.info('Found CH 1B in the input data') ch1b = x1d # search x1d containing CH 3 A if '3' in channel and 'SHORT' in band: self.log.info('Found CH 3A in the input data') ch3a = x1d ich3a = i # store the datamodel # to update later elif '3' in channel and 'MULTIPLE' in band: # read in the wavelength array and see # if it covers ch3a_wave wave = x1d.spec[0].spec_table.WAVELENGTH if np.min(wave) < ch3a_wave and np.max(wave) > ch3a_wave: self.log.info('Found CH 3A in the input data') ch3a = x1d ich3a = i # store the datamodel to update later # done looping over data now if 1B and 3A data exists make a correction # update result and return if ch1b is not None and ch3a is not None: corrected_3a = spectral_leak.do_correction(sp_leak_ref, ch1b, ch3a) result[ich3a].spec[0].spec_table.FLUX = corrected_3a result[ich3a].meta.cal_step.spectral_leak = 'COMPLETE' return result else: for r in result: r.meta.cal_step.spectral_leak = 'SKIPPED' self.log.warning('CH1B and CH3A were not found. No spectral leak correction') return result else: self.log.warning("Data sent to spectral_leak step is not a ModelContainer. It is {}." .format(type(input_model))) self.log.warning("Step is skipped") return input