22from __future__
import annotations
24__all__ = (
"RewriteDifferenceImageConnections",
"RewriteDifferenceImageTask",
"RewriteDifferenceImageConfig")
26from typing
import ClassVar
30import lsst.pipe.base.connectionTypes
as cT
32from lsst.images
import DifferenceImage
33from lsst.images.fields
import field_from_legacy_photo_calib
35from lsst.pipe.base
import (
36 InputQuantizedConnection,
37 OutputQuantizedConnection,
40 PipelineTaskConnections,
47 PipelineTaskConnections,
48 dimensions={
"visit",
"detector"},
49 defaultTemplates={
"legacy_prefix":
"legacy_",
"future_prefix":
""},
51 legacy_exposure = cT.Input(
52 "{legacy_prefix}difference_image",
57 storageClass=
"DifferenceImage",
58 dimensions={
"visit",
"detector"},
60 doc=
"The input image to convert.",
62 visit_summary = cT.Input(
64 storageClass=
"ExposureCatalog",
66 doc=
"A visit summary catalog with the PhotoCalib that was already applied to the image's pixels.",
68 future_difference_image = cT.Output(
69 "{future_prefix}difference_image",
70 storageClass=
"DifferenceImage",
71 dimensions={
"visit",
"detector"},
72 doc=
"The output difference image.",
75 config: RewriteDifferenceImageConfig
78class RewriteDifferenceImageConfig(
80 pipelineConnections=RewriteDifferenceImageConnections,
82 instrumental_unit = Field(
83 "Unit for instrumental flux pixels (i.e. uncalibrated side of a PhotoCalib).",
89class RewriteDifferenceImageTask(PipelineTask):
90 ConfigClass: ClassVar[type[RewriteDifferenceImageConfig]] = RewriteDifferenceImageConfig
91 config: RewriteDifferenceImageConfig
92 _DefaultName =
"rewriteDifferenceImage"
96 butlerQC: QuantumContext,
97 inputRefs: InputQuantizedConnection,
98 outputRefs: OutputQuantizedConnection,
100 inputs = butlerQC.get(inputRefs)
101 difference_image = inputs.pop(
"legacy_exposure").get(parameters={
"preserve_quantization":
True})
102 visit_summary = inputs.pop(
"visit_summary")
103 photo_calib: PhotoCalib = visit_summary.find(butlerQC.quantum.dataId[
"detector"]).getPhotoCalib()
104 outputs = self.run(difference_image, photo_calib=photo_calib, **inputs)
105 butlerQC.put(outputs, outputRefs)
107 def run(self, difference_image: DifferenceImage, *, photo_calib: PhotoCalib) -> Struct:
108 instrumental_unit = astropy.units.Unit(self.config.instrumental_unit)
109 difference_image.photometric_scaling = field_from_legacy_photo_calib(
110 photo_calib, bounds=difference_image.bbox, instrumental_unit=instrumental_unit
112 return Struct(future_difference_image=difference_image)