Coverage for python/lsst/obs/base/fitsRawFormatterBase.py : 26%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# This file is part of obs_base. # # Developed for the LSST Data Management System. # This product includes software developed by the LSST Project # (http://www.lsst.org). # See the COPYRIGHT file at the top-level directory of this distribution # for details of code ownership. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Abstract base class for reading and writing raw data to and from FITS files. """
self.filterDefinitions.reset() self.filterDefinitions.defineFilters() super().__init__(*args, **kwargs)
"""Construct a possibly-limited formatter from known metadata.
Parameters ---------- metadata : `lsst.daf.base.PropertyList` Raw header metadata, with any fixes (see `astro_metadata_translator.fix_header`) applied but nothing stripped. obsInfo : `astro_metadata_translator.ObservationInfo`, optional Structured information already extracted from ``metadata``. If not provided, will be read from ``metadata`` on first use. storageClass : `lsst.daf.butler.StorageClass`, optional StorageClass for this file. If not provided, the formatter will only support `makeWcs`, `makeVisitInfo`, `makeFilter`, and other operations that operate purely on metadata and not the actual file. location : `lsst.daf.butler.Location`, optional. Location of the file. If not provided, the formatter will only support `makeWcs`, `makeVisitInfo`, `makeFilter`, and other operations that operate purely on metadata and not the actual file.
Returns ------- formatter : `FitsRawFormatterBase` An instance of ``cls``. """ self = cls(FileDescriptor(location, storageClass)) self._metadata = metadata self._observationInfo = obsInfo return self
def translatorClass(self): """`~astro_metadata_translator.MetadataTranslator` to translate metadata header to `~astro_metadata_translator.ObservationInfo`. """ return None
def filterDefinitions(self): """`~lsst.obs.base.FilterDefinitions`, defining the filters for this instrument. """ return None
"""Read just the image component of the Exposure.
Returns ------- image : `~lsst.afw.image.Image` In-memory image component. """ return lsst.afw.image.ImageU(self.fileDescriptor.location.path)
"""Read just the mask component of the Exposure.
May return None (as the default implementation does) to indicate that there is no mask information to be extracted (at least not trivially) from the raw data. This will prohibit direct reading of just the mask, and set the mask of the full Exposure to zeros.
Returns ------- mask : `~lsst.afw.image.Mask` In-memory mask component. """ return None
"""Read just the variance component of the Exposure.
May return None (as the default implementation does) to indicate that there is no variance information to be extracted (at least not trivially) from the raw data. This will prohibit direct reading of just the variance, and set the variance of the full Exposure to zeros.
Returns ------- image : `~lsst.afw.image.Image` In-memory variance component. """ return None
"""Boolean to determine if the exposure is thought to be on the sky.
Returns ------- onSky : `bool` Returns `True` if the observation looks like it was taken on the sky. Returns `False` if this observation looks like a calibration observation.
Notes ----- If there is tracking RA/Dec information associated with the observation it is assumed that the observation is on sky. Currently the observation type is not checked. """ if self.observationInfo.tracking_radec is None: return False return True
"""Remove metadata entries that are parsed into components. """ # NOTE: makeVisitInfo() may not strip any metadata itself, but calling # it ensures that ObservationInfo is created from the metadata, which # will strip the VisitInfo keys and more. self.makeVisitInfo() self._createSkyWcsFromMetadata()
"""Construct a VisitInfo from metadata.
Returns ------- visitInfo : `~lsst.afw.image.VisitInfo` Structured metadata about the observation. """ return MakeRawVisitInfoViaObsInfo.observationInfo2visitInfo(self.observationInfo)
def getDetector(self, id): """Return the detector that acquired this raw exposure.
Parameters ---------- id : `int` The identifying number of the detector to get.
Returns ------- detector : `~lsst.afw.cameraGeom.Detector` The detector associated with that ``id``. """ raise NotImplementedError("Must be implemented by subclasses.")
"""Create a SkyWcs from information about the exposure.
If VisitInfo is not None, use it and the detector to create a SkyWcs, otherwise return the metadata-based SkyWcs (always created, so that the relevant metadata keywords are stripped).
Parameters ---------- visitInfo : `~lsst.afw.image.VisitInfo` The information about the telescope boresight and camera orientation angle for this exposure. detector : `~lsst.afw.cameraGeom.Detector` The detector used to acquire this exposure.
Returns ------- skyWcs : `~lsst.afw.geom.SkyWcs` Reversible mapping from pixel coordinates to sky coordinates.
Raises ------ InitialSkyWcsError Raised if there is an error generating the SkyWcs, chained from the lower-level exception if available. """ if not self.isOnSky(): # This is not an on-sky observation return None
skyWcs = self._createSkyWcsFromMetadata()
log = lsst.log.Log.getLogger("fitsRawFormatter") if visitInfo is None: msg = "No VisitInfo; cannot access boresight information. Defaulting to metadata-based SkyWcs." log.warn(msg) if skyWcs is None: raise InitialSkyWcsError("Failed to create both metadata and boresight-based SkyWcs." "See warnings in log messages for details.") return skyWcs skyWcs = createInitialSkyWcs(visitInfo, detector)
return skyWcs
"""Create a SkyWcs from the FITS header metadata in an Exposure.
Returns ------- skyWcs: `lsst.afw.geom.SkyWcs`, or None The WCS that was created from ``self.metadata``, or None if that creation fails due to invalid metadata. """ if not self.isOnSky(): # This is not an on-sky observation return None
try: return lsst.afw.geom.makeSkyWcs(self.metadata, strip=True) except TypeError as e: log = lsst.log.Log.getLogger("fitsRawFormatter") log.warn("Cannot create a valid WCS from metadata: %s", e.args[0]) return None
"""Construct a Filter from metadata.
Returns ------- filter : `~lsst.afw.image.Filter` Object that identifies the filter for this image.
Raises ------ NotFoundError Raised if the physical filter was not registered via `~lsst.afw.image.utils.defineFilter`. """ return lsst.afw.image.Filter(self.observationInfo.physical_filter)
"""Read the image, mask, or variance component of an Exposure.
Parameters ---------- component : `str`, optional Component to read from the file. Always one of "image", "variance", or "mask".
Returns ------- image : `~lsst.afw.image.Image` or `~lsst.afw.image.Mask` In-memory image, variance, or mask component. """ if component == "image": return self.readImage() elif component == "mask": return self.readMask() elif component == "variance": return self.readVariance()
"""Read a component held by ExposureInfo.
The implementation provided by FitsRawFormatter provides only "wcs" and "visitInfo". When adding support for other components, subclasses should delegate to `super()` for those and update `readFull` with similar logic.
Parameters ---------- component : `str`, optional Component to read from the file.
Returns ------- obj : component-dependent In-memory component object. """ if component == "filter": return self.makeFilter() elif component == "visitInfo": return self.makeVisitInfo() elif component == "wcs": detector = self.getDetector(self.observationInfo.detector_num) visitInfo = self.makeVisitInfo() return self.makeWcs(visitInfo, detector) return None
"""Read the full Exposure object.
Parameters ---------- parameters : `dict`, optional If specified, a dictionary of slicing parameters that overrides those in the `fileDescriptor` attribute.
Returns ------- exposure : `~lsst.afw.image.Exposure` Complete in-memory exposure. """ from lsst.afw.image import makeExposure, makeMaskedImage full = makeExposure(makeMaskedImage(self.readImage())) mask = self.readMask() if mask is not None: full.setMask(mask) variance = self.readVariance() if variance is not None: full.setVariance(variance) full.setDetector(self.getDetector(self.observationInfo.detector_num)) info = full.getInfo() info.setFilter(self.makeFilter()) info.setVisitInfo(self.makeVisitInfo()) info.setWcs(self.makeWcs(info.getVisitInfo(), info.getDetector())) # We don't need to call stripMetadata() here because it has already # been stripped during creation of the ObservationInfo, WCS, etc. full.setMetadata(self.metadata) return full
"""Read the SkyWcs stored in the un-modified raw FITS WCS header keys. """ return lsst.afw.geom.makeSkyWcs(lsst.afw.fits.readMetadata(self.fileDescriptor))
"""Write a Python object to a file.
Parameters ---------- inMemoryDataset : `object` The Python object to store.
Returns ------- path : `str` The `URI` where the primary file is stored. """ raise NotImplementedError("Raw data cannot be `put`.")
def observationInfo(self): """The `~astro_metadata_translator.ObservationInfo` extracted from this file's metadata (`~astro_metadata_translator.ObservationInfo`, read-only). """ if self._observationInfo is None: self._observationInfo = ObservationInfo(self.metadata, translator_class=self.translatorClass) return self._observationInfo |