Coverage for python / lsst / meas / modelfit / cmodel / cmodelContinued.py: 56%
48 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-26 09:16 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-26 09:16 +0000
1#
2# LSST Data Management System
3# Copyright 2008-2017 LSST/AURA.
4#
5# This product includes software developed by the
6# LSST Project (http://www.lsst.org/).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the LSST License Statement and
19# the GNU General Public License along with this program. If not,
20# see <http://www.lsstcorp.org/LegalNotices/>.
21#
23# The Plugin classes here are accessed via registries, not direct imports.
24__all__ = ("CModelStageConfig", "CModelConfig")
26import logging
28import lsst.meas.base
29from lsst.pex.config import makeConfigClass
31from .._modelfitLib import CModelAlgorithm, CModelControl, CModelStageControl
33CModelStageConfig = makeConfigClass(CModelStageControl)
34CModelConfig = makeConfigClass(CModelControl)
36apCorrList = ("modelfit_CModel", "modelfit_CModel_initial", "modelfit_CModel_exp", "modelfit_CModel_dev")
39class CModelSingleFrameConfig(lsst.meas.base.SingleFramePluginConfig, CModelConfig):
41 def setDefaults(self):
42 lsst.meas.base.SingleFramePluginConfig.setDefaults(self)
43 CModelConfig.setDefaults(self)
46@lsst.meas.base.register("modelfit_CModel", apCorrList=apCorrList)
47class CModelSingleFramePlugin(lsst.meas.base.SingleFramePlugin):
48 """Single-frame measurement interface for CModelAlgorithm.
50 This class simply provides __init__ and measure methods that matched the SingleFramePlugin signatures
51 and delegate to the CModelAlgorithm's methods.
52 """
53 ConfigClass = CModelSingleFrameConfig
55 @staticmethod
56 def getExecutionOrder():
57 return 3.0
59 def __init__(self, config, name, schema, metadata):
60 lsst.meas.base.SingleFramePlugin.__init__(self, config, name, schema, metadata)
61 self.algorithm = CModelAlgorithm(name, config.makeControl(), schema)
63 def measure(self, measRecord, exposure):
64 self.algorithm.measure(measRecord, exposure)
66 def fail(self, measRecord, error=None):
67 self.algorithm.fail(measRecord, error.cpp if error is not None else None)
70class CModelForcedConfig(lsst.meas.base.ForcedPluginConfig, CModelConfig):
72 def setDefaults(self):
73 lsst.meas.base.ForcedPluginConfig.setDefaults(self)
74 CModelConfig.setDefaults(self)
77@lsst.meas.base.register("modelfit_CModel", apCorrList=apCorrList)
78class CModelForcedPlugin(lsst.meas.base.ForcedPlugin):
79 """Forced measurement interface for CModelAlgorithm
81 This class simply provides __init__ and measure methods that matched the ForcedPlugin signatures
82 and delegate to CModelAlgorithm implementations.
84 The CModel algorithm currently cannot be run in forced mode when the measurement WCS is different
85 from the reference WCS (as is the case in CCD forced photometry). This is a temporary limitation
86 that will be addressed on DM-5405.
88 CModel forced measurement when the measurement image is the same as the reference image should be
89 almost -- but not quite -- identical to unforced measurement. The primary difference is that
90 the final fit region from the reference measurement will be used for the initial fit in forced mode
91 as well as the exp, dev, and combined exp+dev fits
92 """
93 ConfigClass = CModelForcedConfig
94 hasLogName = True
96 @staticmethod
97 def getExecutionOrder():
98 return 3.0
100 def __init__(self, config, name, schemaMapper, metadata, logName=None):
101 lsst.meas.base.ForcedPlugin.__init__(self, config, name, schemaMapper, metadata, logName=logName)
102 self.algorithm = CModelAlgorithm(name, config.makeControl(), schemaMapper)
104 def measure(self, measRecord, exposure, refRecord, refWcs):
105 if refWcs != exposure.getWcs():
106 if str(refWcs) == str(exposure.getWcs()):
107 logger = logging.getLogger(self.getLogName())
108 logger.debug(
109 "The measurement and reference WCS are not equal, but have the same"
110 "string representation."
111 )
112 else:
113 raise lsst.meas.base.FatalAlgorithmError(
114 "CModel forced measurement currently requires the measurement image to have the same"
115 " Wcs as the reference catalog (this is a temporary limitation)."
116 )
117 self.algorithm.measure(measRecord, exposure, refRecord)
119 def fail(self, measRecord, error=None):
120 self.algorithm.fail(measRecord, error.cpp if error is not None else None)