summaryrefslogtreecommitdiff
path: root/doc/headerlet_tsr/source
diff options
context:
space:
mode:
Diffstat (limited to 'doc/headerlet_tsr/source')
-rw-r--r--doc/headerlet_tsr/source/hdrlet_tsr.rst959
-rw-r--r--doc/headerlet_tsr/source/images/Headerlet_figure_final.pngbin0 -> 191461 bytes
2 files changed, 959 insertions, 0 deletions
diff --git a/doc/headerlet_tsr/source/hdrlet_tsr.rst b/doc/headerlet_tsr/source/hdrlet_tsr.rst
new file mode 100644
index 0000000..6ab423b
--- /dev/null
+++ b/doc/headerlet_tsr/source/hdrlet_tsr.rst
@@ -0,0 +1,959 @@
+==================================================================
+Definition of a Headerlet and Its Role in Updating WCS Information
+==================================================================
+
+.. abstract::
+ :author: Warren Hack, Nadezhda Dencheva
+ :date: 22 Oct 2012
+
+
+ A headerlet is a self-consistent representation of a single WCS solution for a single
+ exposure complete with all distortion information. FITS is the data
+ storage format currently supported. It has no observational data
+ which makes it relatively small and light to distribute.
+ It is, essentially, a mechanism for encapsulating WCS information
+ which can later be used to update the WCS of a science file and allows
+ improved astrometric solutions to be stored and passed around easily.
+ The HST archive is expected to start accepting headerlets for HST data soon.
+ However the implementaiton is not HST specific and FITS WCS standard, as well as
+ all WCS conventions implemented in pywcs are supported.
+ This report describes the format and contents of a headerlet
+ along with the software implementation and methods for creating headerlets and using them
+ to update the WCS of a science observation.
+
+Introduction
+============
+
+The original motivation for this work was a WCS based replacement
+of Multidrizzle, now released as Astrodrizzle, and specifically a
+requirement for the availability and management of multiple WCS
+sets, complete with distortion, within one science file. However,
+the concept of encapsulating astrometric solutions is more general
+than that since each solution may represent a different astrometric
+alignment, either with a catalog or another image. Furthermore, computing
+accurate astrometric solutions requires considerable effort and time so
+having a way to distribute them, apply them to a science observation and
+switch between different WCSs efficiently would facilitate many aspects of
+data analysis.
+
+Some of the immediate areas for the use of headerlets with HST data include
+the HST archive, the HLA and other legacy projects which provide improved astrometry
+of HST observations. The HST Archive, for example, provides access to all HST data,
+most of which can not be readily combined together due to errors in guide star astrometry
+imposing offsets between images taken using different pairs of guide stars.
+A lot of effort has gone into computing those offsets so that all the images taken
+at a particular pointing can be combined successfully with astrometry matched to
+external astrometric catalogs. Unfortunately, there is no current mechanism for
+passing those updated solutions along to the community without providing entirely
+new copies of all the data.
+
+Source Image
+============
+
+Any science observation with a valid WCS described by the FITS standard or any of the
+WCS conventions implemented in pywcs may serve as a source for creating a headerlet.
+
+We describe as an example the type of WCS information of a typical HST ACS/WFC image as it
+is distributed by the HST archive (OTFR) after being processed with the latest image
+calibrations, including applying the latest available distortion
+models. The full description of the WCS is available in the
+"Distortion Correction In HST Files" report [1]_ by Hack et al.
+The science header now contains the following set of keywords and extensions to fully
+describe the WCS with distortion:
+
+* **Linear WCS keywords**: CRPIX, CRVAL, CTYPE, CD matrix keywords
+* **SIP coefficients**: A_*_* and B_*_*, A_ORDER, B_ORDER
+* **The first order coefficients from the IDC table**: (needed by astrodrizzle) OCX10, OCX11, OCY10, and OCY11 keywords
+* **NPOL distortion**: if an NPOLFILE has been specified for the image,
+ CPDIS and DP record-value keywords to point to WCSDVARR extensions (Distortion
+ Paper [2]_ )
+* **Detector defect correction**: (for ACS/WFC this is a column defect)if a D2IMFILE has been
+ specified for use with the image, the D2IMEXT, D2IMERR and AXISCORR keywords point to the D2IMARR extension
+
+Some of the distortion information may be stored in additional extensions in the science file:
+
+* **WCSDVARR extensions**: 2 extensions for each chip with lookup tables containing
+ the non-polynomial corrections, with each extension corresponding to an axis of
+ the image (X correction or Y correction)
+* **D2IMARR extension**: an extension with a lookup table containing the row- or column-correction from the D2IMFILE.
+
+Each science header will have its own set of these keywords and extensions that will
+be kept together as part of the headerlet definition. This avoids any ambiguity as
+to what solution was used for any given WCS.
+
+An HST ACS/WFC exposure would end up with the following set of extensions::
+
+ EXT# FITSNAME FILENAME EXTVE DIMENS BITPI OBJECT
+
+ 0 j8hw27c4q_flt j8hw27c4q_flt.fits 16
+ 1 IMAGE SCI 1 4096x2048 -32
+ 2 IMAGE ERR 1 4096x2048 -32
+ 3 IMAGE DQ 1 4096x2048 16
+ 4 IMAGE SCI 2 4096x2048 -32
+ 5 IMAGE ERR 2 4096x2048 -32
+ 6 IMAGE DQ 2 4096x2048 16
+ 7 IMAGE D2IMARR 1 4096 -32
+ 8 IMAGE WCSDVARR 1 65x33 -32
+ 9 IMAGE WCSDVARR 2 65x33 -32
+ 10 IMAGE WCSDVARR 3 65x33 -32
+ 11 IMAGE WCSDVARR 4 65x33 -32
+
+These additional extensions add approximately 100kB to a typical ACS/WFC image
+making them a space efficient means of managing all the distortion and WCS information.
+
+Headerlet Definition
+====================
+A `headerlet` is a self-consistent definition of a single WCS
+including all distortion for all chips/detectors of a single exposure.
+This is different from alternate WCS defined in Greisen, E. W., and Calabretta (Paper I) [3]_
+in that by definition all alternate WCSs share the same distortion model while headerlets
+may be based on different distortion models. A headerlet does not include alternate WCSs.
+It is stored as a multi-extension FITS file following the structure of the science file.
+The WCS information in the science header is saved in the header of an HDU with EXTNAME 'SIPWCS'.
+All other HDUs in the headerlet (containing distorion information)
+have the same EXTNAME as the science file.
+
+SIPWCS - A New FITS Extension
+-----------------------------
+
+We introduce a new HDU with EXTNAME `SIPWCS`. It has no data and the header
+contains all the WCS-related keywords from the SCI
+header. As a minimum it contains the basic WCS keywords described in Paper I [3]_
+If the science observation has a SIP distortion model, the SIP keywords are included
+in this extension. If the distortion includes a non-polynomial
+part, the keywords describing the extensions with the lookup tables
+(EXTNAME=WCSDVARR) are also in this header. If there's a detector defect correction
+(row or column correction), the keywords describing the D2IMARR HDU are also in this
+header. In addition, each SIPWCS header contains two keywords which point back to the HDU
+of the original science file which was the source for it. These keywords are TG_ENAME and
+TG_EVER and have the meaning of (extname, extver) for the data extension in the science file.
+
+The keywords in this extension are used by the software to overwrite the keywords
+in the corresponding SCI header to update the WCS solution for each chip without any
+computation.
+
+Headerlet File Structure
+------------------------
+
+This SIPWCS extension along with all WCSDVARR extensions and the D2IMARR extension if available
+fully describe the WCS of each chip.
+The listing of the FITS extensions for a `headerlet` for a sample ACS/WFC exposure after writing
+it out to a file is::
+
+ EXT# FITSNAME FILENAME EXTVE DIMENS BITPI OBJECT
+
+ 0 j8hw27c4q j8hw27c4q_hdr.fits 16
+ 1 IMAGE SIPWCS 1 8
+ 2 IMAGE SIPWCS 2 8
+ 3 IMAGE WCSDVARR 1 65x33 -32
+ 4 IMAGE WCSDVARR 2 65x33 -32
+ 5 IMAGE WCSDVARR 3 65x33 -32
+ 6 IMAGE WCSDVARR 4 65x33 -32
+ 7 IMAGE D2IMARR 1 4096 -32
+
+
+.. note::
+
+ A headerlet derived from a full-frame WFC3/UVIS image would only
+ contain a PRIMARY header and two SIPWCS extensions (one for each SCI extension)
+ as WFC3/UVIS does not currently have non-polynomial distortion or any detector defect corrections.
+
+The keywords used to populate the headerlet come from all the extensions of the updated
+FITS file, as illustrated in the following figure.
+
+.. figure:: images/Headerlet_figure_final.png
+ :width: 95 %
+ :alt: Relationship Between an ACS/WFC Image’s FITS File and a Headerlet
+ :align: center
+
+ This figure shows the keywords that are included in a headerlet, the extensions included
+ in a headerlet, and how a headerlet appears as a new extension when it gets appended to the
+ original ACS/WFC file.
+
+
+Headerlet Primary Header
+-------------------------
+
+The list below contains all keywords specific to the primary header of a headerlet with
+a brief description how to determine their value. Note that all keywords will be present in the header
+and 'required' and 'optional' below refers to their value.
+
+ * `HDRNAME` - (required) a unique name for the headerlet
+ - the value is given by the user as a parameter to `~stwcs.wcsutil.headerlet.create_headerlet` or `~stwcs.wcsutil.headerlet.write_headerlet`
+ - HDRNAME<wcskey> from the science file is used
+ - WCSNAME<wcskey> from the science file is used
+ - KeyError is raised
+ * `DESTIM` - (required) target image filename - used to determine if a headerlet can be applied to a science file.
+ - the ROOTNAME keyword of the original science file
+ - the name of the science file
+ * `WCSNAME` - (required) name for the WCS
+ - the value is given by the user as a parameter to `~stwcs.wcsutil.headerlet.create_headerlet` or `~stwcs.wcsutil.headerlet.write_headerlet`
+ - WCSNAME<wcskey> from the science file is used
+ - the value of hdrname parameter is used
+ - HDRNAME<wcskey> from the science file
+ - KeyError is raised
+ * `DISTNAME` - (optional) name of distortion model
+ - The value of DISTNAME has the form
+ <idctab rootname>-<npolfile rootname>-<d2imfile rootname>
+ and has a value of 'NONE' if no reference files are specified.
+ * `SIPNAME` - (optional) name of SIP model
+ - SIPNAME is constructed as <ROOTNAME>_<IDCTAB_rootname>, where
+
+ ROOTNAME is the keyword from the science file header (or the file name)
+
+ IDCTAB_rootname is the rootname of the idctab file
+
+ so for example, SIPNAME for a science file j94f05bgq_flt.fits and an idctab file
+ postsm4_idc.fits is j94f05bgq_postsm4
+
+ - If the SIP coefficients are present in the header but IDCTAB is missing or invalid, then SIPNAME is set to UNKNOWN.
+ - If there's no polynomial model, SIPNAME is set to NOMODEL.
+ * `NPOLFILE` - (optional) name of npol reference file
+
+ - NPOLFILE keyword from science file primary header
+
+ - UNKNOWN if NPOLFILE keyword is missing or invalid but data extensions exist
+
+ - or NOMODEL
+
+ * `IDCTAB` - (optional)
+
+ IDCTAB keyword from science file primary header or N/A
+
+ * `D2IMFILE` - (optional)
+
+ D2IMFILE keyword from science file primary header or N/A
+
+ * `AUTHOR` - (optional) name of person who created the headerlet
+ * `DESCRIP` - (optional) short description of the headerlet solution
+ * `NMATCH` - (optional) number of sources used in the new solution fit, if updated from the Archive’s default WCS
+ * `CATALOG` - (optional) a reference frame used to define the astrometric solution
+ * `UPWCSVER` - (optional) version of STWCS used to create the WCS of the original image
+ * `PYWCSVER` - (optional) version of PyWCS used to create the WCS of the original image
+
+
+These keywords are used to determine whether a headerlet can be applied to a
+given exposure or not. Some of the keywords provide more
+information about the solution itself, how it was derived, and by whom.
+
+Working With Headerlets
+=======================
+
+Headerlets are implemented in a python module `~stwcs.wcsutil.headerlet` which uses PyWCS for
+WCS management and PyFITS for FITS file handling. The functionality includes methods to:
+
+
+ - Create a headerlet (on disk or in memory) from a specific WCS of a science observation.
+ This can be the Primary or an alternate WCS.
+ - Apply a WCS from a headerlet to the Primary WCS of a science observation (and
+ optionally save the original WCS as an alternate WCs or a different headerlet).
+ - Copy a WCS from a headerlet as an alternate WCS.
+ - Attach a headerlet to a science file.
+ - Archive a WCS of a science file as a headerlet attached to the file.
+ - Delete a headerlet attached to a science file.
+ - Print a summary of all headerlets attached to a science file.
+
+An optional GUI interface is available through TEAL and includes functions for writing a headerlet,
+applying a headerlet, etc. A full listing of all functions with GUI interface is available
+after `stwcs.wcsutil` is imported.
+
+The headerlet API as of the time of writing this report is documented in :ref:`Appendix1`.
+
+`Note: For an up-to-date API always consult the current the SSB documentation pages.`
+
+Headerlet HDU - A New Type of FITS Extension
+--------------------------------------------
+
+The word `headerlet` has been used sofar in three different ways:
+
+- A single WCS representation
+- The multi-extension FITS file storing a WCS
+- The extension of a science file containing a headerlet (as a WCS representation)
+
+The last usage of the term `headerlet` is discussed in this section.
+When a `headerlet` is applied to an image, a copy of the original headerlet file is
+appended to the image's HDU list as a special extension HDU called a `HeaderletHDU`.
+A HeaderletHDU consists of a simple header describing the headerlet, and has as its data
+the headerlet file itself, (which may be compressed). A HeaderletHDU has an 'XTENSION'
+value of 'HDRLET'. Support for this is provided through the implementation of a
+NonstandardExtHDU in PyFITS.
+
+When opening a file that contains `Headerlet HDU` extensions, it will normally look like this in PyFITS::
+
+ >>> import pyfits
+ >>> hdul = pyfits.open('94f05bgq_flt_with_hlet.fits')
+ >>> hdul.info()
+ Filename: j94f05bgq_flt_with_hlet.fits
+ No. Name Type Cards Dimensions Format
+ 0 PRIMARY PrimaryHDU 248 () int16
+ 1 SCI ImageHDU 286 (4096, 2048) float32
+ 2 ERR ImageHDU 76 (4096, 2048) float32
+ 3 DQ ImageHDU 66 (4096, 2048) int16
+ 4 SCI ImageHDU 282 (4096, 2048) float32
+ 5 ERR ImageHDU 74 (4096, 2048) float32
+ 6 DQ ImageHDU 66 (4096, 2048) int16
+ 7 WCSCORR BinTableHDU 56 10R x 23C [40A, I, 1A, D, D, D, D, D, D, D, D, 24A, 24A, D, D, D, D, D, D, D, D, J, 40A]
+ 8 WCSDVARR ImageHDU 15 (65, 33) float32
+ 9 WCSDVARR ImageHDU 15 (65, 33) float32
+ 10 WCSDVARR ImageHDU 15 (65, 33) float32
+ 11 WCSDVARR ImageHDU 15 (65, 33) float32
+ 12 D2IMARR ImageHDU 12 (4096,) float32
+ 13 HDRLET NonstandardExtHDU 13
+ 14 HDRLET NonstandardExtHDU 13
+
+
+
+The names of the `headerlet` extensions are both HDRLET, but its type shows up
+as `NonstandardExtHDU`. Their headers can be read, and while their data can be
+read you'd have to know what to do with it (the data is actually
+either a tar file or a gzipped tar file containing the
+`headerlet` file). However, if you have `stwcs.wcsutil.headerlet` imported, PyFITS will
+recognize these extensions as `Headerlet HDUs`::
+
+
+ >>> import stwcs.wcsutil.headerlet
+ >>> # Note that it's necessary to reopen the file
+ >>> hdul = pyfits.open('j94f05bgq_flt_with_hlet.fits')
+ >>> hdul.info()
+ Filename: j94f05bgq_flt_with_hlet.fits
+ No. Name Type Cards Dimensions Format
+ 0 PRIMARY PrimaryHDU 248 () int16
+ 1 SCI ImageHDU 286 (4096, 2048) float32
+ 2 ERR ImageHDU 76 (4096, 2048) float32
+ 3 DQ ImageHDU 66 (4096, 2048) int16
+ 4 SCI ImageHDU 282 (4096, 2048) float32
+ 5 ERR ImageHDU 74 (4096, 2048) float32
+ 6 DQ ImageHDU 66 (4096, 2048) int16
+ 7 WCSCORR BinTableHDU 56 10R x 23C [40A, I, 1A, D, D, D, D, D, D, D, D, 24A, 24A, D, D, D, D, D, D, D, D, J, 40A]
+ 8 WCSDVARR ImageHDU 15 (65, 33) float32
+ 9 WCSDVARR ImageHDU 15 (65, 33) float32
+ 10 WCSDVARR ImageHDU 15 (65, 33) float32
+ 11 WCSDVARR ImageHDU 15 (65, 33) float32
+ 12 D2IMARR ImageHDU 12 (4096,) float32
+ 13 HDRLET HeaderletHDU 13
+ 14 HDRLET HeaderletHDU 13
+ >>> print hdul['HDRLET', 1].header.ascard
+ XTENSION= 'HDRLET ' / Headerlet extension
+ BITPIX = 8 / array data type
+ NAXIS = 1 / number of array dimensions
+ NAXIS1 = 102400 / Axis length
+ PCOUNT = 0 / number of parameters
+ GCOUNT = 1 / number of groups
+ EXTNAME = 'HDRLET ' / name of the headerlet extension
+ HDRNAME = 'j94f05bgq_orig' / Headerlet name
+ DATE = '2011-04-13T12:14:42' / Date FITS file was generated
+ SIPNAME = 'IDC_qbu1641sj' / SIP distortion model name
+ NPOLFILE= '/grp/hst/acs/lucas/new-npl/qbu16424j_npl.fits' / Non-polynomial correction
+ D2IMFILE= '/grp/hst/acs/lucas/new-npl/wfc_ref68col_d2i.fits' / Column correction
+ COMPRESS= F / Uses gzip compression
+
+`HeaderletHDU` objects are similar to other HDU objects in PyFITS.
+However, they have a special `.headerlet` attribute that returns
+the actual `headerlet` contained in the HDU data as a `Headerlet` object::
+
+ >>> hdrlet = hdul['HDERLET', 1].headerlet
+ >>> hdrlet.info()
+ Filename: (No file associated with this HDUList)
+ No. Name Type Cards Dimensions Format
+ 0 PRIMARY PrimaryHDU 12 () uint8
+ 1 SIPWCS ImageHDU 111 () uint8
+ 2 SIPWCS ImageHDU 110 () uint8
+ 3 WCSDVARR ImageHDU 15 (65, 33) float32
+ 4 WCSDVARR ImageHDU 15 (65, 33) float32
+ 5 WCSDVARR ImageHDU 15 (65, 33) float32
+ 6 WCSDVARR ImageHDU 15 (65, 33) float32
+ 7 D2IMARR ImageHDU 12 (4096,) float32
+
+This is useful if you want to view the contents of the `headerlets` attached to a file.
+
+Examples
+--------
+
+To create a `headerlet` from an image, a `createHeaderlet()` function is provided::
+
+ >>> from stwcs.wcsutil import headerlet
+ >>> hdrlet = headerlet.createHeaderlet('j94f05bgq_flt.fits', 'VERSION1')
+ >>> type(hdrlet)
+ <class 'stwcs.wcsutil.headerlet.Headerlet'>
+ >>> hdrlet.info()
+ Filename: (No file associated with this HDUList)
+ No. Name Type Cards Dimensions Format
+ 0 PRIMARY PrimaryHDU 12 ()
+ 1 SIPWCS ImageHDU 111 ()
+ 2 SIPWCS ImageHDU 110 ()
+ 3 WCSDVARR ImageHDU 15 (65, 33) float32
+ 4 WCSDVARR ImageHDU 15 (65, 33) float32
+ 5 WCSDVARR ImageHDU 15 (65, 33) float32
+ 6 WCSDVARR ImageHDU 15 (65, 33) float32
+ 7 D2IMARR ImageHDU 12 (4096,) float32
+
+As you can see, the `Headerlet` object is similar to a normal PyFITS `HDUList` object. `createHeaderlet()` can be given either the path
+to a file, or an already open `HDUList` as its first argument.
+
+What do you do with a `Headerlet` object? Its main purpose is to apply its WCS solution to another file. This can be done using the
+`Headerlet.apply()` method::
+
+ >>> hdrlet.apply('some_other_image.fits')
+
+Or you can use the `applyHeaderlet()` convenience function. It takes an existing `headerlet` file path or object as its first argument;
+the rest of its arguments are the same as `Headerlet.apply()`. As with `createHeaderlet()` both of these can take a file path or opened
+`HDUList` objects as arguments.
+
+When a `headerlet` is applied to an image, an additional `headerlet` containing that image's original WCS solution is automatically created,
+and is appended to the file's HDU list as a `Headerlet HDU`. However, this behavior can be disabled by setting the `createheaderlet` keyword
+argument to `False` in either `Headerlet.apply()` or `applyHeaderlet()`.
+
+
+
+.. _Appendix1:
+
+Appendix 1: Headerlet API
+=========================
+
+* :ref:`apply_headerlet_as_alternate`
+* :ref:`apply_headerlet_as_primary`
+* :ref:`archive_as_headerlet`
+* :ref:`attach_headerlet`
+* :ref:`create_headerlet`
+* :ref:`delete_headerlet`
+* :ref:`extract_headerlet`
+* :ref:`print_summary`
+* :ref:`restore_all_with_distname`
+* :ref:`restore_from_headerlet`
+* :ref:`write_headerlet`
+
+.. _apply_headerlet_as_alternate:
+
+apply_headerlet_as_alternate
+----------------------------
+
+::
+
+ def apply_headerlet_as_alternate(filename, hdrlet, attach=True, wcskey=None,
+ wcsname=None, logging=False, logmode='w'):
+ """
+ Apply headerlet to a science observation as an alternate WCS
+
+ Parameters
+ ----------
+ filename: string
+ File name of science observation whose WCS solution will be updated
+ hdrlet: string
+ Headerlet file
+ attach: boolean
+ flag indicating if the headerlet should be attached as a
+ HeaderletHDU to fobj. If True checks that HDRNAME is unique
+ in the fobj and stops if not.
+ wcskey: string
+ Key value (A-Z, except O) for this alternate WCS
+ If None, the next available key will be used
+ wcsname: string
+ Name to be assigned to this alternate WCS
+ WCSNAME is a required keyword in a Headerlet but this allows the
+ user to change it as desired.
+ logging: boolean
+ enable file logging
+ logmode: 'a' or 'w'
+ """
+
+.. _apply_headerlet_as_primary:
+
+apply_headerlet_as_primary
+--------------------------
+
+::
+
+ def apply_headerlet_as_primary(filename, hdrlet, attach=True, archive=True,
+ force=False, logging=False, logmode='a'):
+ """
+ Apply headerlet 'hdrfile' to a science observation 'destfile' as the primary WCS
+
+ Parameters
+ ----------
+ filename: string
+ File name of science observation whose WCS solution will be updated
+ hdrlet: string
+ Headerlet file
+ attach: boolean
+ True (default): append headerlet to FITS file as a new extension.
+ archive: boolean
+ True (default): before updating, create a headerlet with the
+ WCS old solution.
+ force: boolean
+ If True, this will cause the headerlet to replace the current PRIMARY
+ WCS even if it has a different distortion model. [Default: False]
+ logging: boolean
+ enable file logging
+ logmode: 'w' or 'a'
+ log file open mode
+ """
+
+.. _archive_as_headerlet:
+
+archive_as_headerlet
+--------------------
+
+::
+
+ def archive_as_headerlet(filename, hdrname, sciext='SCI',
+ wcsname=None, wcskey=None, destim=None,
+ sipname=None, npolfile=None, d2imfile=None,
+ author=None, descrip=None, history=None,
+ nmatch=None, catalog=None,
+ logging=False, logmode='w'):
+ """
+ Save a WCS as a headerlet extension and write it out to a file.
+
+ This function will create a headerlet, attach it as an extension to the
+ science image (if it has not already been archived) then, optionally,
+ write out the headerlet to a separate headerlet file.
+
+ Either wcsname or wcskey must be provided, if both are given, they must match a valid WCS
+ Updates wcscorr if necessary.
+
+ Parameters
+ ----------
+ filename: string or HDUList
+ Either a filename or PyFITS HDUList object for the input science file
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ hdrname: string
+ Unique name for this headerlet, stored as HDRNAME keyword
+ sciext: string
+ name (EXTNAME) of extension that contains WCS to be saved
+ wcsname: string
+ name of WCS to be archived, if " ": stop
+ wcskey: one of A...Z or " " or "PRIMARY"
+ if " " or "PRIMARY" - archive the primary WCS
+ destim: string
+ DESTIM keyword
+ if NOne, use ROOTNAME or science file name
+ sipname: string or None (default)
+ Name of unique file where the polynomial distortion coefficients were
+ read from. If None, the behavior is:
+ The code looks for a keyword 'SIPNAME' in the science header
+ If not found, for HST it defaults to 'IDCTAB'
+ If there is no SIP model the value is 'NOMODEL'
+ If there is a SIP model but no SIPNAME, it is set to 'UNKNOWN'
+ npolfile: string or None (default)
+ Name of a unique file where the non-polynomial distortion was stored.
+ If None:
+ The code looks for 'NPOLFILE' in science header.
+ If 'NPOLFILE' was not found and there is no npol model, it is set to 'NOMODEL'
+ If npol model exists, it is set to 'UNKNOWN'
+ d2imfile: string
+ Name of a unique file where the detector to image correction was
+ stored. If None:
+ The code looks for 'D2IMFILE' in the science header.
+ If 'D2IMFILE' is not found and there is no d2im correction,
+ it is set to 'NOMODEL'
+ If d2im correction exists, but 'D2IMFILE' is missing from science
+ header, it is set to 'UNKNOWN'
+ author: string
+ Name of user who created the headerlet, added as 'AUTHOR' keyword
+ to headerlet PRIMARY header
+ descrip: string
+ Short description of the solution provided by the headerlet
+ This description will be added as the single 'DESCRIP' keyword
+ to the headerlet PRIMARY header
+ history: filename, string or list of strings
+ Long (possibly multi-line) description of the solution provided
+ by the headerlet. These comments will be added as 'HISTORY' cards
+ to the headerlet PRIMARY header
+ If filename is specified, it will format and attach all text from
+ that file as the history.
+ logging: boolean
+ enable file folling
+ logmode: 'w' or 'a'
+ log file open mode
+ """
+
+.. _attach_headerlet:
+
+attach_headerlet
+----------------
+
+::
+
+ def attach_headerlet(filename, hdrlet, logging=False, logmode='a'):
+ """
+ Attach Headerlet as an HeaderletHDU to a science file
+
+ Parameters
+ ----------
+ filename: string, HDUList
+ science file to which the headerlet should be applied
+ hdrlet: string or Headerlet object
+ string representing a headerlet file
+ logging: boolean
+ enable file logging
+ logmode: 'a' or 'w'
+ """
+
+.. _create_headerlet:
+
+create_headerlet
+----------------
+
+::
+
+ def create_headerlet(filename, sciext='SCI', hdrname=None, destim=None,
+ wcskey=" ", wcsname=None,
+ sipname=None, npolfile=None, d2imfile=None,
+ author=None, descrip=None, history=None,
+ nmatch=None, catalog=None,
+ logging=False, logmode='w'):
+ """
+ Create a headerlet from a WCS in a science file
+ If both wcskey and wcsname are given they should match, if not
+ raise an Exception
+
+ Parameters
+ ----------
+ filename: string or HDUList
+ Either a filename or PyFITS HDUList object for the input science file
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ sciext: string or python list (default: 'SCI')
+ Extension in which the science data with the linear WCS is.
+ The headerlet will be created from these extensions.
+ If string - a valid EXTNAME is expected
+ If int - specifies an extension with a valid WCS, such as 0 for a
+ simple FITS file
+ If list - a list of FITS extension numbers or strings representing
+ extension tuples, e.g. ('SCI, 1') is expected.
+ hdrname: string
+ value of HDRNAME keyword
+ Takes the value from the HDRNAME<wcskey> keyword, if not available from WCSNAME<wcskey>
+ It stops if neither is found in the science file and a value is not provided
+ destim: string or None
+ name of file this headerlet can be applied to
+ if None, use ROOTNAME keyword
+ wcskey: char (A...Z) or " " or "PRIMARY" or None
+ a char representing an alternate WCS to be used for the headerlet
+ if " ", use the primary (default)
+ if None use wcsname
+ wcsname: string or None
+ if wcskey is None use wcsname specified here to choose an alternate WCS for the headerlet
+ sipname: string or None (default)
+ Name of unique file where the polynomial distortion coefficients were
+ read from. If None, the behavior is:
+ The code looks for a keyword 'SIPNAME' in the science header
+ If not found, for HST it defaults to 'IDCTAB'
+ If there is no SIP model the value is 'NOMODEL'
+ If there is a SIP model but no SIPNAME, it is set to 'UNKNOWN'
+ npolfile: string or None (default)
+ Name of a unique file where the non-polynomial distortion was stored.
+ If None:
+ The code looks for 'NPOLFILE' in science header.
+ If 'NPOLFILE' was not found and there is no npol model, it is set to 'NOMODEL'
+ If npol model exists, it is set to 'UNKNOWN'
+ d2imfile: string
+ Name of a unique file where the detector to image correction was
+ stored. If None:
+ The code looks for 'D2IMFILE' in the science header.
+ If 'D2IMFILE' is not found and there is no d2im correction,
+ it is set to 'NOMODEL'
+ If d2im correction exists, but 'D2IMFILE' is missing from science
+ header, it is set to 'UNKNOWN'
+ author: string
+ Name of user who created the headerlet, added as 'AUTHOR' keyword
+ to headerlet PRIMARY header
+ descrip: string
+ Short description of the solution provided by the headerlet
+ This description will be added as the single 'DESCRIP' keyword
+ to the headerlet PRIMARY header
+ history: filename, string or list of strings
+ Long (possibly multi-line) description of the solution provided
+ by the headerlet. These comments will be added as 'HISTORY' cards
+ to the headerlet PRIMARY header
+ If filename is specified, it will format and attach all text from
+ that file as the history.
+ nmatch: int (optional)
+ Number of sources used in the new solution fit
+ catalog: string (optional)
+ Astrometric catalog used for headerlet solution
+ logging: boolean
+ enable file logging
+ logmode: 'w' or 'a'
+ log file open mode
+
+ Returns
+ -------
+ Headerlet object
+ """
+
+.. _delete_headerlet:
+
+delete_headerlet
+----------------
+
+::
+
+ def delete_headerlet(filename, hdrname=None, hdrext=None, distname=None,
+ logging=False, logmode='w'):
+ """
+ Deletes HeaderletHDU(s) from a science file
+
+ Notes
+ -----
+ One of hdrname, hdrext or distname should be given.
+ If hdrname is given - delete a HeaderletHDU with a name HDRNAME from fobj.
+ If hdrext is given - delete HeaderletHDU in extension.
+ If distname is given - deletes all HeaderletHDUs with a specific distortion model from fobj.
+ Updates wcscorr
+
+ Parameters
+ ----------
+ filename: string or HDUList
+ Either a filename or PyFITS HDUList object for the input science file
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ hdrname: string or None
+ HeaderletHDU primary header keyword HDRNAME
+ hdrext: int, tuple or None
+ HeaderletHDU FITS extension number
+ tuple has the form ('HDRLET', 1)
+ distname: string or None
+ distortion model as specified in the DISTNAME keyword
+ logging: boolean
+ enable file logging
+ logmode: 'a' or 'w'
+ """
+
+.. _extract_headerlet:
+
+extract_headerlet
+-----------------
+
+::
+
+ def extract_headerlet(filename, output, extnum=None, hdrname=None,
+ clobber=False, logging=True):
+ """
+ Finds a headerlet extension in a science file and writes it out as
+ a headerlet FITS file.
+
+ If both hdrname and extnum are given they should match, if not
+ raise an Exception
+
+ Parameters
+ ----------
+ filename: string or HDUList or Python list
+ This specifies the name(s) of science file(s) from which headerlets
+ will be extracted.
+
+ String input formats supported include use of wild-cards, IRAF-style
+ '@'-files (given as '@<filename>') and comma-separated list of names.
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ If a list of filenames has been specified, it will extract a
+ headerlet from the same extnum from all filenames.
+ output: string
+ Filename or just rootname of output headerlet FITS file
+ If string does not contain '.fits', it will create a filename with
+ '_hlet.fits' suffix
+ extnum: int
+ Extension number which contains the headerlet to be written out
+ hdrname: string
+ Unique name for headerlet, stored as the HDRNAME keyword
+ It stops if a value is not provided and no extnum has been specified
+ clobber: bool
+ If output file already exists, this parameter specifies whether or not
+ to overwrite that file [Default: False]
+ logging: boolean
+ enable logging to a file
+
+ """
+
+.. _print_summary:
+
+print_summary
+-------------
+
+ ::
+
+ def print_summary(summary_cols, summary_dict, pad=2, maxwidth=None, idcol=None,
+ output=None, clobber=True, quiet=False ):
+ """
+ Print out summary dictionary to STDOUT, and possibly an output file
+
+ """
+
+.. _restore_all_with_distname:
+
+restore_all_with_distname
+-------------------------
+
+::
+
+ def restore_all_with_distname(filename, distname, primary, archive=True,
+ sciext='SCI', logging=False, logmode='w'):
+ """
+ Restores all HeaderletHDUs with a given distortion model as alternate WCSs and a primary
+
+ Parameters
+ --------------
+ filename: string or HDUList
+ Either a filename or PyFITS HDUList object for the input science file
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ distname: string
+ distortion model as represented by a DISTNAME keyword
+ primary: int or string or None
+ HeaderletHDU to be restored as primary
+ if int - a fits extension
+ if string - HDRNAME
+ if None - use first HeaderletHDU
+ archive: boolean (default True)
+ flag indicating if HeaderletHDUs should be created from the
+ primary and alternate WCSs in fname before restoring all matching
+ headerlet extensions
+ logging: boolean
+ enable file logging
+ logmode: 'a' or 'w'
+ """
+
+.. _restore_from_headerlet:
+
+restore_from_headerlet
+----------------------
+
+::
+
+ def restore_from_headerlet(filename, hdrname=None, hdrext=None, archive=True,
+ force=False, logging=False, logmode='w'):
+ """
+ Restores a headerlet as a primary WCS
+
+ Parameters
+ ----------
+ filename: string or HDUList
+ Either a filename or PyFITS HDUList object for the input science file
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ hdrname: string
+ HDRNAME keyword of HeaderletHDU
+ hdrext: int or tuple
+ Headerlet extension number of tuple ('HDRLET',2)
+ archive: boolean (default: True)
+ When the distortion model in the headerlet is the same as the distortion model of
+ the science file, this flag indicates if the primary WCS should be saved as an alternate
+ nd a headerlet extension.
+ When the distortion models do not match this flag indicates if the current primary and
+ alternate WCSs should be archived as headerlet extensions and alternate WCS.
+ force: boolean (default:False)
+ When the distortion models of the headerlet and the primary do not match, and archive
+ is False, this flag forces an update of the primary.
+ logging: boolean
+ enable file logging
+ logmode: 'a' or 'w'
+ """
+
+.. _write_headerlet:
+
+write_headerlet
+---------------
+
+::
+
+ def write_headerlet(filename, hdrname, output=None, sciext='SCI',
+ wcsname=None, wcskey=None, destim=None,
+ sipname=None, npolfile=None, d2imfile=None,
+ author=None, descrip=None, history=None,
+ nmatch=None, catalog=None,
+ attach=True, clobber=False, logging=False):
+
+ """
+ Save a WCS as a headerlet FITS file.
+
+ This function will create a headerlet, write out the headerlet to a
+ separate headerlet file, then, optionally, attach it as an extension
+ to the science image (if it has not already been archived)
+
+ Either wcsname or wcskey must be provided; if both are given, they must
+ match a valid WCS.
+
+ Updates wcscorr if necessary.
+
+ Parameters
+ ----------
+ filename: string or HDUList or Python list
+ This specifies the name(s) of science file(s) from which headerlets
+ will be created and written out.
+ String input formats supported include use of wild-cards, IRAF-style
+ '@'-files (given as '@<filename>') and comma-separated list of names.
+ An input filename (str) will be expanded as necessary to interpret
+ any environmental variables included in the filename.
+ hdrname: string
+ Unique name for this headerlet, stored as HDRNAME keyword
+ output: string or None
+ Filename or just rootname of output headerlet FITS file
+ If string does not contain '.fits', it will create a filename
+ starting with the science filename and ending with '_hlet.fits'.
+ If None, a default filename based on the input filename will be
+ generated for the headerlet FITS filename
+ sciext: string
+ name (EXTNAME) of extension that contains WCS to be saved
+ wcsname: string
+ name of WCS to be archived, if " ": stop
+ wcskey: one of A...Z or " " or "PRIMARY"
+ if " " or "PRIMARY" - archive the primary WCS
+ destim: string
+ DESTIM keyword
+ if NOne, use ROOTNAME or science file name
+ sipname: string or None (default)
+ Name of unique file where the polynomial distortion coefficients were
+ read from. If None, the behavior is:
+ The code looks for a keyword 'SIPNAME' in the science header
+ If not found, for HST it defaults to 'IDCTAB'
+ If there is no SIP model the value is 'NOMODEL'
+ If there is a SIP model but no SIPNAME, it is set to 'UNKNOWN'
+ npolfile: string or None (default)
+ Name of a unique file where the non-polynomial distortion was stored.
+ If None:
+ The code looks for 'NPOLFILE' in science header.
+ If 'NPOLFILE' was not found and there is no npol model, it is set to 'NOMODEL'
+ If npol model exists, it is set to 'UNKNOWN'
+ d2imfile: string
+ Name of a unique file where the detector to image correction was
+ stored. If None:
+ The code looks for 'D2IMFILE' in the science header.
+ If 'D2IMFILE' is not found and there is no d2im correction,
+ it is set to 'NOMODEL'
+ If d2im correction exists, but 'D2IMFILE' is missing from science
+ header, it is set to 'UNKNOWN'
+ author: string
+ Name of user who created the headerlet, added as 'AUTHOR' keyword
+ to headerlet PRIMARY header
+ descrip: string
+ Short description of the solution provided by the headerlet
+ This description will be added as the single 'DESCRIP' keyword
+ to the headerlet PRIMARY header
+ history: filename, string or list of strings
+ Long (possibly multi-line) description of the solution provided
+ by the headerlet. These comments will be added as 'HISTORY' cards
+ to the headerlet PRIMARY header
+ If filename is specified, it will format and attach all text from
+ that file as the history.
+ attach: bool
+ Specify whether or not to attach this headerlet as a new extension
+ It will verify that no other headerlet extension has been created with
+ the same 'hdrname' value.
+ clobber: bool
+ If output file already exists, this parameter specifies whether or not
+ to overwrite that file [Default: False]
+ logging: boolean
+ enable file logging
+ """
+
+References
+==========
+
+.. [1] Hack, et al, STScI 2012-01 TSR, http://stsdas.stsci.edu/tsr
+
+.. [2] (draft FITS WCS Distortion paper) Calabretta M. R., Valdes F. G., Greisen E. W., and Allen S. L., 2004,
+ "Representations of distortions in FITS world coordinate systems",[cited 2012 Sept 18],
+ Available from: http://www.atnf.csiro.au/people/mcalabre/WCS/dcs_20040422.pdf
+
+.. [3] Greisen, E. W., and Calabretta M.R. 2002, A&A, 395 (Paper I)
diff --git a/doc/headerlet_tsr/source/images/Headerlet_figure_final.png b/doc/headerlet_tsr/source/images/Headerlet_figure_final.png
new file mode 100644
index 0000000..e17005f
--- /dev/null
+++ b/doc/headerlet_tsr/source/images/Headerlet_figure_final.png
Binary files differ