LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
verifyWcs.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2008, 2009, 2010 LSST Corporation.
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 #
22 
23 __all__ = ["checkMatches"]
24 
25 
26 import numpy as np
27 import logging
28 
29 import lsst.geom
30 import lsst.afw.detection as afwDetection
31 import lsst.afw.math as afwMath
32 import lsst.meas.algorithms as measAlg
33 
34 _LOG = logging.getLogger(__name__)
35 
36 
37 def checkMatches(srcMatchSet, exposure, log=None):
38  """Check astrometric matches and assess Wcs quality by computing statics
39  over spacial cells in the image.
40 
41  Parameters
42  ----------
43  srcMatchSet : `list` of `lsst.afw.table.ReferenceMatch`
44  List of matched sources to a reference catalog.
45  exposure : `lsst.afw.image.Exposure`
46  Image the sources in srcMatchSet were detected/measured in.
47  log : `lsst.log.Log` or `logging.Logger`
48  Logger object.
49 
50  Returns
51  -------
52  values : `dict`
53  Result dictionary with fields:
54 
55  - ``minObjectsPerCell`` : (`int`)
56  - ``maxObjectsPerCell`` : (`int`)
57  - ``meanObjectsPerCell`` : (`float`)
58  - ``stdObjectsPerCell`` : (`float`)
59  """
60  if not exposure:
61  return {}
62 
63  if log is None:
64  log = _LOG
65 
66  im = exposure.getMaskedImage().getImage()
67  width, height = im.getWidth(), im.getHeight()
68  nx, ny = 3, 3
69  w, h = width//nx, height//ny
70 
71  if w == 0:
72  w = 1
73  while nx*w < width:
74  w += 1
75 
76  if h == 0:
77  h = 1
78  while ny*h < height:
79  h += 1
80 
81  cellSet = afwMath.SpatialCellSet(
82  lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(width, height)), w, h)
83  #
84  # Populate cellSet
85  #
86  i = -1
87  for m in srcMatchSet:
88  i += 1
89 
90  src = m.second
91  csrc = afwDetection.Source()
92  csrc.setId(i)
93  csrc.setXAstrom(src.getXAstrom())
94  csrc.setYAstrom(src.getYAstrom())
95 
96  try:
97  cellSet.insertCandidate(measAlg.PsfCandidateF(csrc, exposure.getMaskedImage()))
98  except Exception as e:
99  log.warning("%s", e)
100 
101  ncell = len(cellSet.getCellList())
102  nobj = np.ndarray(ncell, dtype='i')
103 
104  for i in range(ncell):
105  cell = cellSet.getCellList()[i]
106 
107  nobj[i] = cell.size()
108 
109  dx = np.ndarray(cell.size())
110  dy = np.ndarray(cell.size())
111 
112  j = 0
113  for cand in cell:
114  #
115  # Swig doesn't know that we're a SpatialCellImageCandidate; all it knows is that we have
116  # a SpatialCellCandidate so we need an explicit (dynamic) cast
117  #
118  mid = cand.getSource().getId()
119  dx[j] = srcMatchSet[mid].first.getXAstrom() - srcMatchSet[mid].second.getXAstrom()
120  dy[j] = srcMatchSet[mid].first.getYAstrom() - srcMatchSet[mid].second.getYAstrom()
121 
122  j += 1
123 
124  log.debug("%s %-30s %8s dx,dy = %5.2f,%5.2f rms_x,y = %5.2f,%5.2f",
125  cell.getLabel(), cell.getBBox(), ("nobj=%d" % cell.size()),
126  dx.mean(), dy.mean(), dx.std(), dy.std())
127 
128  nobj.sort()
129 
130  values = {}
131  values["minObjectsPerCell"] = int(nobj[0]) # otherwise it's a numpy integral type
132  values["maxObjectsPerCell"] = int(nobj[-1])
133  values["meanObjectsPerCell"] = nobj.mean()
134  values["stdObjectsPerCell"] = nobj.std()
135 
136  return values
A collection of SpatialCells covering an entire image.
Definition: SpatialCell.h:383
An integer coordinate rectangle.
Definition: Box.h:55
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations.
def checkMatches(srcMatchSet, exposure, log=None)
Definition: verifyWcs.py:37