Source code for jwst.extract_1d.extract_1d_step
#! /usr/bin/env python
from ..stpipe import Step
from .. import datamodels
from . import extract
__all__ = ["Extract1dStep"]
[docs]class Extract1dStep(Step):
"""
Extract1dStep: Extract a 1-d spectrum from 2-d data
"""
spec = """
# Boxcar smoothing width for background regions.
smoothing_length = integer(default=None)
# Order of polynomial fit to one column (or row if the dispersion
# direction is vertical) of background regions.
bkg_order = integer(default=None, min=0)
# Log a progress message when processing multi-integration data.
log_increment = integer(default=50)
"""
reference_file_types = ['extract1d']
[docs] def process(self, input):
# Open the input and figure out what type of model it is
input_model = datamodels.open(input)
if isinstance(input_model, datamodels.CubeModel):
# It's a 3-D multi-integration model
self.log.debug('Input is a CubeModel for a multiple integ. file')
elif isinstance(input_model, datamodels.ImageModel):
# It's a single 2-D image
self.log.debug('Input is an ImageModel')
elif isinstance(input_model, datamodels.ModelContainer):
self.log.debug('Input is a ModelContainer')
elif isinstance(input_model, datamodels.MultiSlitModel):
self.log.debug('Input is a MultiSlitModel')
elif isinstance(input_model, datamodels.MultiProductModel):
self.log.debug('Input is a MultiProductModel')
elif isinstance(input_model, datamodels.IFUCubeModel):
self.log.debug('Input is an IFUCubeModel')
elif isinstance(input_model, datamodels.DrizProductModel):
# Resampled 2-D data
self.log.debug('Input is a DrizProductModel')
elif isinstance(input_model, datamodels.SlitModel):
# NRS_BRIGHTOBJ mode
self.log.debug('Input is a SlitModel')
else:
self.log.error('Input is a %s,', str(type(input_model)))
self.log.error('which was not expected for extract_1d.')
self.log.error('extract_1d will be skipped.')
input_model.meta.cal_step.extract_1d = 'SKIPPED'
return input_model
# Do the extraction
if isinstance(input_model, datamodels.ModelContainer):
if len(input_model) > 1:
self.log.debug("Input contains %d items", len(input_model))
result = datamodels.ModelContainer()
for model in input_model:
if model.meta.exposure.type in extract.WFSS_EXPTYPES:
self.ref_file = 'N/A'
self.log.info('No EXTRACT1D reference file '
'will be used')
else:
# Get the reference file name
self.ref_file = self.get_reference_file(
model, 'extract1d')
self.log.info('Using EXTRACT1D reference file %s',
self.ref_file)
temp = extract.do_extract1d(model, self.ref_file,
self.smoothing_length,
self.bkg_order,
self.log_increment)
# Set the step flag to complete in each MultiSpecModel
temp.meta.cal_step.extract_1d = 'COMPLETE'
result.append(temp)
del temp
elif len(input_model) == 1:
if input_model[0].meta.exposure.type in extract.WFSS_EXPTYPES:
self.ref_file = 'N/A'
self.log.info('No EXTRACT1D reference file will be used')
else:
# Get the reference file name for the one model in input
self.ref_file = self.get_reference_file(input_model[0],
'extract1d')
self.log.info('Using EXTRACT1D reference file %s',
self.ref_file)
result = extract.do_extract1d(input_model[0], self.ref_file,
self.smoothing_length,
self.bkg_order,
self.log_increment)
# Set the step flag to complete
result.meta.cal_step.extract_1d = 'COMPLETE'
else:
self.log.error('Input model is empty;')
self.log.error('extract_1d will be skipped.')
return input_model
else:
# Get the reference file name
if input_model.meta.exposure.type in extract.WFSS_EXPTYPES:
self.ref_file = 'N/A'
self.log.info('No EXTRACT1D reference file will be used')
else:
self.ref_file = self.get_reference_file(input_model,
'extract1d')
self.log.info('Using EXTRACT1D reference file %s',
self.ref_file)
result = extract.do_extract1d(input_model, self.ref_file,
self.smoothing_length,
self.bkg_order,
self.log_increment)
# Set the step flag to complete
result.meta.cal_step.extract_1d = 'COMPLETE'
input_model.close()
return result
def extract_1d_correction(input):
a = Extract1dStep()
result = a.process(input)
return result