LSSTApplications  1.1.2+25,10.0+13,10.0+132,10.0+133,10.0+224,10.0+41,10.0+8,10.0-1-g0f53050+14,10.0-1-g4b7b172+19,10.0-1-g61a5bae+98,10.0-1-g7408a83+3,10.0-1-gc1e0f5a+19,10.0-1-gdb4482e+14,10.0-11-g3947115+2,10.0-12-g8719d8b+2,10.0-15-ga3f480f+1,10.0-2-g4f67435,10.0-2-gcb4bc6c+26,10.0-28-gf7f57a9+1,10.0-3-g1bbe32c+14,10.0-3-g5b46d21,10.0-4-g027f45f+5,10.0-4-g86f66b5+2,10.0-4-gc4fccf3+24,10.0-40-g4349866+2,10.0-5-g766159b,10.0-5-gca2295e+25,10.0-6-g462a451+1
LSSTDataManagementBasePackage
skyTileUtils.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 import math
24 
25 import lsst.geom as geom
26 import lsst.skypix as skypix
27 import lsst.afw.geom as afwGeom
28 import lsst.afw.coord as afwCoord
29 import lsst.afw.image as afwImage
30 
31 __all__ = ["findWcsCoveringSkyTile", "createImageCoveringSkyTile"]
32 
33 def findWcsCoveringSkyTile(skyPixelization, skyTileId, imageRes):
34  """Computes and returns a TAN WCS such that a 2D image with the
35  given WCS and the following properties completely covers the
36  sky-tile with the given pixel id:
37 
38  - NAXIS1/NAXIS2 >= imageRes
39  - CRPIX1 = NAXIS1 / 2 + 0.5
40  - CRPIX2 = NAXIS2 / 2 + 0.5
41  """
42  if not isinstance(imageRes, (int, long)):
43  raise TypeError("Image resolution must be an integer")
44  if imageRes < 1:
45  raise RuntimeError("Image resolution must be at least 1")
46  crpix = afwGeom.Point2D(0.5*(imageRes + 1), 0.5*(imageRes + 1))
47  crval = geom.sphericalCoords(skyPixelization.getCenter(skyTileId))
48  crval = afwCoord.makeCoord(afwCoord.ICRS, crval[0] * afwGeom.degrees, crval[1] * afwGeom.degrees)
49  skyTile = skyPixelization.getGeometry(skyTileId)
50  # Start with a huge TAN image centered at the sky-tile center,
51  # then shrink it using binary search to determine suitable
52  # CD matrix coefficients
53  scale = 1000.0 # deg/pixel, ridiculously large
54  delta = 0.5*scale
55  frac = 0.01 # desired relative accuracy of CD matrix coeffs
56  wcs = afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
57  imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
58  # Make sure the initial guess really is too large
59  if not imagePoly.contains(skyTile):
60  raise RuntimeError("Failed to construct image WCS covering sky-tile")
61  # Search for a WCS with a tight fit to the sky-tile. Note that the
62  # tightness of fit could be further improved by searching for a rotation
63  # and not just a pixel scale.
64  while delta >= frac * scale:
65  tmp = scale - delta
66  wcs = afwImage.makeWcs(crval, crpix, tmp, 0.0, 0.0, tmp)
67  imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
68  delta *= 0.5
69  if imagePoly.contains(skyTile):
70  scale = tmp
71  return afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
72 
73 def createImageCoveringSkyTile(skyPixelization, skyTileId, imageRes,
74  imageType=afwImage.DecoratedImageU):
75  """Creates an image of the specified type and resolution along with
76  a WCS that covers the given sky tile. If the requested image type
77  is an lsst.afw.image.ExposureX, the exposure WCS is set automatically.
78  Otherwise, the WCS is translated to a lsst.daf.base.PropertySet and set
79  as lsst.afw.image.[Decorated]ImageX metadata.
80  """
81  wcs = findWcsCoveringSkyTile(skyPixelization, skyTileId, imageRes)
82  img = imageType(afwGeom.Extent2I(imageRes, imageRes))
83  if hasattr(img, 'setWcs'):
84  img.setWcs(wcs)
85  elif hasattr(img, 'setMetadata'):
86  img.setMetadata(wcs.getFitsMetadata())
87  return img, wcs
88 
Wcs::Ptr makeWcs(coord::Coord const &crval, geom::Point2D const &crpix, double CD11, double CD12, double CD21, double CD22)
Create a Wcs object from crval, crpix, CD, using CD elements (useful from python) ...
Definition: makeWcs.cc:87
Coord::Ptr makeCoord(CoordSystem const system, lsst::afw::geom::Point3D const &p3d, bool normalize=true, lsst::afw::geom::Angle const defaultLongitude=lsst::afw::geom::Angle(0.))
Factory function to create a Coord of arbitrary type with a Point3D.
Definition: Coord.cc:1311