lsst.meas.algorithms
g4a7591d645+ff8a1bd350
Toggle main menu visibility
Loading...
Searching...
No Matches
python
lsst
meas
algorithms
psfDeterminer.py
Go to the documentation of this file.
1
# This file is part of meas_algorithms.
2
#
3
# Developed for the LSST Data Management System.
4
# This product includes software developed by the LSST Project
5
# (https://www.lsst.org).
6
# See the COPYRIGHT file at the top-level directory of this distribution
7
# for details of code ownership.
8
#
9
# This program is free software: you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation, either version 3 of the License, or
12
# (at your option) any later version.
13
#
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
18
#
19
# You should have received a copy of the GNU General Public License
20
# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22
__all__ = [
"BasePsfDeterminerConfig"
,
"BasePsfDeterminerTask"
,
"psfDeterminerRegistry"
]
23
24
import
abc
25
import
numpy
as
np
26
27
import
lsst.pipe.base
as
pipeBase
28
import
lsst.pex.config
as
pexConfig
29
30
31
class
BasePsfDeterminerConfig
(pexConfig.Config):
32
"""Configuration that is likely to be shared by all PSF determiners
33
34
This is fairly sparse; more fields can be moved here once it is clear they are universal.
35
"""
36
stampSize = pexConfig.Field[int](
37
doc=
"Size of the postage stamp (in native pixels) to render the PSF model. Should be odd."
,
38
default=
None
,
39
optional=
True
,
40
check=
lambda
x: (x > 0) & (x % 2 == 1),
41
)
42
maxCandidates = pexConfig.Field[int](
43
doc=
"Maximum number of candidates to consider. Will down-sample if given more."
,
44
default=300,
45
)
46
downsampleRandomSeed = pexConfig.Field[int](
47
doc=
"Random seed to use to downsample candidates."
,
48
default=98765,
49
)
50
51
52
class
BasePsfDeterminerTask
(pipeBase.Task, metaclass=abc.ABCMeta):
53
"""Base class for PSF determiners
54
55
Register all PSF determiners with the psfDeterminerRegistry using:
56
psfDeterminerRegistry.register(name, class)
57
58
Parameters
59
----------
60
config : `lsst.pexConfig.Config`
61
Input for configuring the algorithm
62
schema : `lsst.afw.table.Schema`
63
Schema used for sources; passing a schema allows the
64
determiner to reserve a flag field to mark stars used in
65
PSF measurement, but some PSF determiners ignore this argument.
66
"""
67
68
usesMatches =
False
# Does the PSF determiner use the "matches" argument in the "run method? Few do.
69
ConfigClass = BasePsfDeterminerConfig
70
_DefaultName =
"psfDeterminer"
71
72
def
__init__
(self, config, schema=None, **kwds):
73
pipeBase.Task.__init__(self, config=config, **kwds)
74
75
def
downsampleCandidates
(self, inputCandidateList):
76
"""Down-sample candidates from the input candidate list.
77
78
Parameters
79
----------
80
inputCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`]
81
Input candidate list.
82
83
Returns
84
-------
85
outputCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`]
86
Down-selected candidate list.
87
"""
88
if
len(inputCandidateList) <= self.config.maxCandidates:
89
return
inputCandidateList
90
91
rng = np.random.RandomState(seed=self.config.downsampleRandomSeed)
92
93
self.log.info(
94
"Down-sampling from %d to %d psf candidates."
,
95
len(inputCandidateList),
96
self.config.maxCandidates,
97
)
98
99
selection = rng.choice(len(inputCandidateList), size=self.config.maxCandidates, replace=
False
)
100
selection = np.sort(selection)
101
102
outputCandidateList = [inputCandidateList[index]
for
index
in
selection]
103
104
return
outputCandidateList
105
106
@abc.abstractmethod
107
def
determinePsf
(self, exposure, psfCandidateList, metadata=None, flagKey=None):
108
"""Determine a PSF model.
109
110
Parameters
111
----------
112
exposure : `lsst.afw.Exposure`
113
Exposure containing the psf candidates.
114
psdCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`]
115
A sequence of PSF candidates; typically obtained by
116
detecting sources and then running them through a star
117
selector.
118
metadata : `str`, optional
119
A place to save interesting items.
120
flagKey: `lsst.afw.table.Key`, optional
121
Schema key used to mark sources actually used in PSF determination.
122
123
Returns
124
-------
125
psf : `lsst.afw.detection.Psf`
126
The fit PSF.
127
cellSet : `lsst.afw.math.SpatialCellSet`
128
The spatial cell set used to determine the PSF
129
"""
130
raise
NotImplementedError(
"BasePsfDeterminerTask is abstract, subclasses must override this method"
)
131
132
133
psfDeterminerRegistry = pexConfig.makeRegistry(
134
doc=
"A registry of PSF determiners (subclasses of BasePsfDeterminerTask)"
,
135
)
lsst::meas::algorithms.psfDeterminer.BasePsfDeterminerConfig
Definition
psfDeterminer.py:31
lsst::meas::algorithms.psfDeterminer.BasePsfDeterminerTask
Definition
psfDeterminer.py:52
lsst::meas::algorithms.psfDeterminer.BasePsfDeterminerTask.downsampleCandidates
downsampleCandidates(self, inputCandidateList)
Definition
psfDeterminer.py:75
lsst::meas::algorithms.psfDeterminer.BasePsfDeterminerTask.__init__
__init__(self, config, schema=None, **kwds)
Definition
psfDeterminer.py:72
lsst::meas::algorithms.psfDeterminer.BasePsfDeterminerTask.determinePsf
determinePsf(self, exposure, psfCandidateList, metadata=None, flagKey=None)
Definition
psfDeterminer.py:107
lsst::pex::config
lsst.pipe.base
Generated on
for lsst.meas.algorithms by
1.17.0