Source code for jwst.persistence.persistence_step

#! /usr/bin/env python

from ..stpipe import Step
from .. import datamodels
from . import persistence

__all__ = ["PersistenceStep"]


[docs]class PersistenceStep(Step): """ PersistenceStep: Correct a science image for persistence. """ spec = """ # `input_trapsfilled` is the name of the most recent trapsfilled # file for the current detector. # Pixels that have received a persistence correction greater than # or equal to `flag_pers_cutoff` DN will be flagged in the pixeldq # extension of the output (rootname_persistence.fits) file. # if `save_persistence` is True, the persistence that was # subtracted (group by group, integration by integration) will be # written to an output file with suffix "_output_pers". input_trapsfilled = string(default="") flag_pers_cutoff = float(default=40.) save_persistence = boolean(default=False) save_trapsfilled = boolean(default=True) """ reference_file_types = ["trapdensity", "trappars", "persat"]
[docs] def process(self, input): if self.input_trapsfilled is not None: if (self.input_trapsfilled == "None" or len(self.input_trapsfilled) == 0): self.input_trapsfilled = None output_obj = datamodels.RampModel(input).copy() self.trap_density_filename = self.get_reference_file(output_obj, "trapdensity") self.trappars_filename = self.get_reference_file(output_obj, "trappars") self.persat_filename = self.get_reference_file(output_obj, "persat") # Is any reference file missing? missing = False missing_reftypes = [] if self.persat_filename == "N/A": missing = True missing_reftypes.append("PERSAT") if self.trap_density_filename == "N/A": missing = True missing_reftypes.append("TRAPDENSITY") if self.trappars_filename == "N/A": missing = True missing_reftypes.append("TRAPPARS") if missing: if len(missing_reftypes) == 1: msg = "Missing reference file type: " + missing_reftypes[0] else: msg = "Missing reference file types: " for name in missing_reftypes: msg += (" " + name) self.log.warning("%s", msg) output_obj.meta.cal_step.persistence = "SKIPPED" return output_obj if self.input_trapsfilled is None: traps_filled_model = None else: traps_filled_model = datamodels.TrapsFilledModel( self.input_trapsfilled) trap_density_model = datamodels.TrapDensityModel( self.trap_density_filename) trappars_model = datamodels.TrapParsModel(self.trappars_filename) persat_model = datamodels.PersistenceSatModel(self.persat_filename) pers_a = persistence.DataSet(output_obj, traps_filled_model, self.flag_pers_cutoff, self.save_persistence, trap_density_model, trappars_model, persat_model) (output_obj, traps_filled, output_pers, skipped) = pers_a.do_all() if skipped: output_obj.meta.cal_step.persistence = 'SKIPPED' else: output_obj.meta.cal_step.persistence = 'COMPLETE' if traps_filled_model is not None: # input traps_filled traps_filled_model.close() if traps_filled is not None: # output traps_filled # Save the traps_filled image with suffix 'trapsfilled'. self.save_model( traps_filled, suffix='trapsfilled', force=self.save_trapsfilled ) traps_filled.close() if output_pers is not None: # output file of persistence self.save_model(output_pers, suffix='output_pers') output_pers.close() # Close reference files. trap_density_model.close() trappars_model.close() persat_model.close() return output_obj