LSSTApplications  8.0.0.0+107,8.0.0.1+13,9.1+18,9.2,master-g084aeec0a4,master-g0aced2eed8+6,master-g15627eb03c,master-g28afc54ef9,master-g3391ba5ea0,master-g3d0fb8ae5f,master-g4432ae2e89+36,master-g5c3c32f3ec+17,master-g60f1e072bb+1,master-g6a3ac32d1b,master-g76a88a4307+1,master-g7bce1f4e06+57,master-g8ff4092549+31,master-g98e65bf68e,master-ga6b77976b1+53,master-gae20e2b580+3,master-gb584cd3397+53,master-gc5448b162b+1,master-gc54cf9771d,master-gc69578ece6+1,master-gcbf758c456+22,master-gcec1da163f+63,master-gcf15f11bcc,master-gd167108223,master-gf44c96c709
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