Role of Model Blender
Model Blender performs 2 operations:
Accumulate, blend and set metadata when combining several models ( as is done during resampling) using combination rules defined in the datamodel schemas.
Record the metadata of input models in a table added to the combined model.
One problem with combining data from multiple exposures stems from not being able to keep track of what kind of data was used to create the final product. The final product only reports one value for each of the metadata attributes from the model schema used to describe the science data, where each of multiple inputs may have had different values for each attribute. The model_blender package solves this problem by allowing the user to define rules that can be used to determine a final single value from all the input values for each attribute, using separate rules for each attribute as appropriate. This package also creates a table that records the input attribute values for all the input models used to create the final product, allowing the user to select what attributes to keep in this table.
This code works by
reading in all the input datamodels (either already in-memory or from FITS files)
evaluating the rules for each attribute as defined in the model’s schema
determining from definitions in the input model’s schema what attributes to keep in the table
applying each attributes rule to the set of input values to determine the final output value
updating the output model’s metadata with the new values
generating the output table with one row for each input model’s values
Using model_blender
Using blendmodels
The simplest way to run model blender only requires calling a single interface:
from jwst.model_blender import blendmeta
blendmeta.blendmodels(product, input_list)
where
product
: the datamodel for the already combined product
input_list
: list of input datamodels used to create theproduct
The output product will end up with new metadata attribute values and a new hdrtab
attribute that will produce a HDRTAB
table extension when the product is saved
to disk.
Using ModelBlender
Alternatively, metadata blending can be done incrementally by using ModelBlender
to accumulate metadata from several models and then blending the result into an
output model.
from jwst.model_blender import ModelBlender
blender = ModelBlender()
for model in input_models:
blender.accumulate(model)
blender.finalize_model(product)
This produces a product
identical to a call to blendmodels
described above.
Customizing the behavior
Combined model metadata
The metadata assigned to the combined (output) model will be determined from:
the first combined model metadata
any metadata with a
blend_rule
Looking at this sample from the core schema:
start_time:
title: "[d] exposure start time in MJD"
type: number
fits_keyword: EXPSTART
blend_table: True
blend_rule: min
Since start_time
uses blend_rule: min
the start_time
for the combined
model will be the minimum of all input models. If blend_rule
was not defined, the
start_time
for the combined model would be the start_time
of the first model.
Warning
All blended models must be of the same type.
Warning
Since model blender copies the metadata of the first model, all metadata from that model will be added to combined model. This is true even for metadata that is not defined in the schema.
Warning
Metadata nested in arrays will not be blended. For example,
meta.background.polynomial_info
contains a list/array of
dictionaries. Model blender will not blend this attribute.
Input model metadata Table
As seen in the above example, start_time
defines blend_table: True
.
This tells model blender to include this attribute in the table added to the
combined model that lists attributes from input models. If the attribute
has a fits_keyword
, the resulting column will use the keyword for the
column name (if not defined, the attribute name will be used). So for
the above example, the resulting table will contain an EXPSTART
column
(and not a meta.exposure.start_time
column) with a row listing
the start_time
for each input model.
If an input model is missing an attribute a nan
will be stored in the
corresponding table cell.