LSSTApplications  17.0+10,17.0+51,17.0+88,18.0.0+10,18.0.0+15,18.0.0+34,18.0.0+4,18.0.0+6,18.0.0-2-ge43143a+6,18.1.0-1-g0001055+2,18.1.0-1-g0896a44+10,18.1.0-1-g1349e88+9,18.1.0-1-g2505f39+7,18.1.0-1-g380d4d4+9,18.1.0-1-g5e4b7ea+2,18.1.0-1-g7e8fceb,18.1.0-1-g85f8cd4+7,18.1.0-1-g9a6769a+3,18.1.0-1-ga1a4c1a+6,18.1.0-1-gc037db8+2,18.1.0-1-gd55f500+3,18.1.0-1-ge10677a+7,18.1.0-10-g73b8679e+12,18.1.0-12-gf30922b,18.1.0-13-g451e75588,18.1.0-13-gbfe7f7f,18.1.0-2-g31c43f9+7,18.1.0-2-g9c63283+9,18.1.0-2-gdf0b915+9,18.1.0-2-gf03bb23+2,18.1.0-3-g52aa583+3,18.1.0-3-g8f4a2b1+1,18.1.0-3-g9cb968e+8,18.1.0-4-g7bbbad0,18.1.0-5-g510c42a+8,18.1.0-5-ga46117f,18.1.0-5-gaeab27e+9,18.1.0-6-gdda7f3e+11,18.1.0-8-g4084bf03+1,w.2019.34
LSSTDataManagementBasePackage
Functions
lsst.meas.astrom.display Namespace Reference

Functions

def displayAstrometry (refCat=None, sourceCat=None, distortedCentroidKey=None, bbox=None, exposure=None, matches=None, frame=1, title="", pause=True)
 
def plotAstrometry (matches, refCat=None, sourceCat=None, refMarker="x", refColor="r", sourceMarker="+", sourceColor="g", matchColor="y")
 

Function Documentation

◆ displayAstrometry()

def lsst.meas.astrom.display.displayAstrometry (   refCat = None,
  sourceCat = None,
  distortedCentroidKey = None,
  bbox = None,
  exposure = None,
  matches = None,
  frame = 1,
  title = "",
  pause = True 
)
Show an astrometry debug image.

Parameters
----------
refCat : `lsst.afw.table.SimpleCatalog`
    reference object catalog; must have fields "centroid_x" an
    "centroid_y"
sourceCat : `lsst.afw.table.SourceCatalg`
    source catalog; must have field "slot_Centroid_x" and "slot_Centroid_y"
distortedCentroidKey : `lsst.afw.table.Key`
    key for sourceCat with field to use for distorted positions
exposure : `lsst.afw.image.Exposure`
    exposure to display
bbox : `lsst.geom.Box2I`
    bounding box of exposure; Used if the exposure is `None`
matches : `list` of `lsst.afw.table.ReferenceMatch`
    List of matched objects
frame : `int`
    frame number for display
title : `str`
    title for display
pause : `bool`
    pause for inspection of display? This is done by dropping into pdb.

Notes
-----

- reference objects in refCat are shown as red X
- sources in sourceCat are shown as green +
- distorted sources in sourceCat (position given by distortedCentroidKey)
  are shown as green o
- matches are shown as a yellow circle around the source and a yellow line
  connecting the reference object and source
- if both exposure and bbox are `None`, no image is displayed

Definition at line 34 of file display.py.

34  matches=None, frame=1, title="", pause=True):
35  """Show an astrometry debug image.
36 
37  Parameters
38  ----------
39  refCat : `lsst.afw.table.SimpleCatalog`
40  reference object catalog; must have fields "centroid_x" an
41  "centroid_y"
42  sourceCat : `lsst.afw.table.SourceCatalg`
43  source catalog; must have field "slot_Centroid_x" and "slot_Centroid_y"
44  distortedCentroidKey : `lsst.afw.table.Key`
45  key for sourceCat with field to use for distorted positions
46  exposure : `lsst.afw.image.Exposure`
47  exposure to display
48  bbox : `lsst.geom.Box2I`
49  bounding box of exposure; Used if the exposure is `None`
50  matches : `list` of `lsst.afw.table.ReferenceMatch`
51  List of matched objects
52  frame : `int`
53  frame number for display
54  title : `str`
55  title for display
56  pause : `bool`
57  pause for inspection of display? This is done by dropping into pdb.
58 
59  Notes
60  -----
61 
62  - reference objects in refCat are shown as red X
63  - sources in sourceCat are shown as green +
64  - distorted sources in sourceCat (position given by distortedCentroidKey)
65  are shown as green o
66  - matches are shown as a yellow circle around the source and a yellow line
67  connecting the reference object and source
68  - if both exposure and bbox are `None`, no image is displayed
69 
70  """
71  disp = afwDisplay.getDisplay(frame=frame)
72 
73  if exposure is not None:
74  disp.mtv(exposure, title=title)
75  elif bbox is not None:
76  disp.mtv(exposure=ExposureF(bbox), title=title)
77 
78  with disp.Buffering():
79  if refCat is not None:
80  refCentroidKey = Point2DKey(refCat.schema["centroid"])
81  for refObj in refCat:
82  rx, ry = refObj.get(refCentroidKey)
83  disp.dot("x", rx, ry, size=10, ctype=afwDisplay.RED)
84 
85  if sourceCat is not None:
86  sourceCentroidKey = Point2DKey(sourceCat.schema["slot_Centroid"])
87  for source in sourceCat:
88  sx, sy = source.get(sourceCentroidKey)
89  disp.dot("+", sx, sy, size=10, ctype=afwDisplay.GREEN)
90  if distortedCentroidKey is not None:
91  dx, dy = source.get(distortedCentroidKey)
92  disp.dot("o", dx, dy, size=10, ctype=afwDisplay.GREEN)
93  disp.line([(sx, sy), (dx, dy)], ctype=afwDisplay.GREEN)
94 
95  if matches is not None:
96  refCentroidKey = Point2DKey(matches[0].first.schema["centroid"])
97  sourceCentroidKey = Point2DKey(matches[0].second.schema["slot_Centroid"])
98  radArr = np.ndarray(len(matches))
99 
100  for i, m in enumerate(matches):
101  refCentroid = m.first.get(refCentroidKey)
102  sourceCentroid = m.second.get(sourceCentroidKey)
103  radArr[i] = math.hypot(*(refCentroid - sourceCentroid))
104  sx, sy = sourceCentroid
105  disp.dot("o", sx, sy, size=10, ctype=afwDisplay.YELLOW)
106  disp.line([refCentroid, sourceCentroid], ctype=afwDisplay.YELLOW)
107 
108  print("<match radius> = %.4g +- %.4g [%d matches]" %
109  (radArr.mean(), radArr.std(), len(matches)))
110 
111  if pause:
112  print("Dropping into debugger to allow inspection of display. Type 'continue' when done.")
113  import pdb
114  pdb.set_trace()
115 
116 
PointKey< double > Point2DKey
Definition: aggregates.h:118

◆ plotAstrometry()

def lsst.meas.astrom.display.plotAstrometry (   matches,
  refCat = None,
  sourceCat = None,
  refMarker = "x",
  refColor = "r",
  sourceMarker = "+",
  sourceColor = "g",
  matchColor = "y" 
)
Plot reference objects, sources and matches

Parameters
----------
matches : `list` of `lsst.afw.table.ReferenceMatch`
    list of matches
refCat : `lsst.afw.table.SimpleCatalog`
    reference object catalog, or None to not plot reference objects
sourceCat : `lsst.afw.table.SourceCatalog`
    source catalog, or None to not plot sources
refMarker : `str`
    pyplot marker for reference objects
refColor : `str`
    pyplot color for reference objects
sourceMarker : `str`
    pyplot marker for sources
sourceColor : `str`
    pyplot color for sources
matchColor : `str`
    color for matches; can be a constant
    or a function taking one match and returning a string

Notes
-----
By default:

- reference objects in refCat are shown as red X
- sources in sourceCat are shown as green +
- matches are shown as a yellow circle around the source and a line
  connecting the reference object to the source

Definition at line 126 of file display.py.

126 ):
127  """Plot reference objects, sources and matches
128 
129  Parameters
130  ----------
131  matches : `list` of `lsst.afw.table.ReferenceMatch`
132  list of matches
133  refCat : `lsst.afw.table.SimpleCatalog`
134  reference object catalog, or None to not plot reference objects
135  sourceCat : `lsst.afw.table.SourceCatalog`
136  source catalog, or None to not plot sources
137  refMarker : `str`
138  pyplot marker for reference objects
139  refColor : `str`
140  pyplot color for reference objects
141  sourceMarker : `str`
142  pyplot marker for sources
143  sourceColor : `str`
144  pyplot color for sources
145  matchColor : `str`
146  color for matches; can be a constant
147  or a function taking one match and returning a string
148 
149  Notes
150  -----
151  By default:
152 
153  - reference objects in refCat are shown as red X
154  - sources in sourceCat are shown as green +
155  - matches are shown as a yellow circle around the source and a line
156  connecting the reference object to the source
157  """
158  # delay importing plt to give users a chance to set the backend before calling this function
159  import matplotlib.pyplot as plt
160  refSchema = matches[0][0].schema
161  refCentroidKey = Point2DKey(refSchema["centroid"])
162  srcSchema = matches[0][1].schema
163  srcCentroidKey = Point2DKey(srcSchema["slot_Centroid"])
164 
165  if refCat is not None:
166  refXArr, refYArr = list(zip(*[ref.get(refCentroidKey) for ref in refCat]))
167  plt.plot(refXArr, refYArr, marker=refMarker, color=refColor, linestyle="")
168 
169  if sourceCat is not None:
170  srcXArr, srcYArr = list(zip(*[src.get(srcCentroidKey) for src in sourceCat]))
171  plt.plot(srcXArr, srcYArr, marker=sourceMarker, color=sourceColor, linestyle="")
172 
173  def makeLineSegmentData(refXYArr, srcXYArr, colorArr):
174  """Make a list of line segement data
175 
176  This is used to draw line segements between ref and src positions in the specified color
177 
178  Notes
179  -----
180  The returned data has the format:
181  [(refX0, srcX0), (refY0, srcY0), color0, (refX1, srcX1), (refY1, srcY1), color1,...]
182  """
183  if len(refXYArr) != len(srcXYArr):
184  raise RuntimeError("len(refXYArr) = %d != %d = len(srcXYArr)" %
185  (len(refXYArr), len(srcXYArr)))
186  if len(refXYArr) != len(colorArr):
187  raise RuntimeError("len(refXYArr) = %d != %d = len(colorArr)" %
188  (len(refXYArr), len(colorArr)))
189 
190  refXArr, refYArr = list(zip(*refXYArr))
191  srcXArr, srcYArr = list(zip(*srcXYArr))
192  refSrcXArr = list(zip(refXArr, srcXArr))
193  refSrcYArr = list(zip(refYArr, srcYArr))
194  dataList = []
195  for xycolor in zip(refSrcXArr, refSrcYArr, colorArr):
196  for val in xycolor:
197  dataList.append(val)
198  return dataList
199 
200  refXYArr, srcXYArr = \
201  list(zip(*[(match[0].get(refCentroidKey), match[1].get(srcCentroidKey)) for match in matches]))
202 
203  def plotSourceCircles(matches, color):
204  srcXYArr = [match[1].get(srcCentroidKey) for match in matches]
205  srcXArr, srcYArr = list(zip(*srcXYArr))
206  plt.plot(srcXArr, srcYArr, "o", mec=color, mfc="none", ms=10,)
207 
208  if callable(matchColor):
209  # different matches have different colors
210  matchColorArr = [matchColor(match) for match in matches]
211 
212  # plot circles for each color separately
213  matchColorSet = set(matchColorArr)
214  for color in matchColorSet:
215  subMatches = [match for match in matches if matchColor(match) == color]
216  plotSourceCircles(subMatches, color=color)
217  else:
218  matchColorArr = [matchColor]*len(refXYArr)
219  plotSourceCircles(matches, color=matchColor)
220 
221  lineSegData = makeLineSegmentData(refXYArr, srcXYArr, matchColorArr)
222  plt.plot(*lineSegData)
223 
224  plt.show()
225 
PointKey< double > Point2DKey
Definition: aggregates.h:118
daf::base::PropertySet * set
Definition: fits.cc:884
daf::base::PropertyList * list
Definition: fits.cc:885