Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > 82fd441cd3f2a8bc33fc3ed41403eced > files > 1540

python-astropy-0.2.4-4.mga4.x86_64.rpm


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>astropy.wcs.wcs &mdash; Astropy v0.2.4</title>
    
    <link rel="stylesheet" href="../../../_static/bootstrap-astropy.css" type="text/css" />
    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../../../',
        VERSION:     '0.2.4',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../../_static/sidebar.js"></script>
    <link rel="shortcut icon" href="../../../_static/astropy_logo.ico"/>
    <link rel="top" title="Astropy v0.2.4" href="../../../index.html" />
    <link rel="up" title="astropy.wcs" href="../wcs.html" /> 
  </head>
  <body>
<div class="topbar">
  <a class="brand" title="Documentation Home" href="../../../index.html"></a>
  <ul>
    <li><a class="homelink" title="AstroPy Homepage" href="http://www.astropy.org"></a></li>
    <li><a title="General Index" href="../../../genindex.html">Index</a></li>
    <li><a title="Python Module Index" href="../../../py-modindex.html">Modules</a></li>
    <li>
      
      
<form action="../../../search.html" method="get">
  <input type="text" name="q" placeholder="Search" />
  <input type="hidden" name="check_keywords" value="yes" />
  <input type="hidden" name="area" value="default" />
</form>
      
    </li>
  </ul>
</div>

<div class="related">
    <h3>Navigation</h3>
    <ul>
      <li>
	<a href="../../../index.html">Astropy v0.2.4</a>
	 &raquo;
      </li>
      <li><a href="../../index.html" >Module code</a> &raquo;</li>
      <li><a href="../wcs.html" accesskey="U">astropy.wcs</a> &raquo;</li>
      
       
    </ul>
</div>
  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <h1>Source code for astropy.wcs.wcs</h1><div class="highlight"><pre>
<span class="c"># Licensed under a 3-clause BSD style license - see LICENSE.rst</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Under the hood, there are 3 separate classes that perform different</span>
<span class="sd">parts of the transformation:</span>

<span class="sd">   - `~astropy.wcs.Wcsprm`: Is a direct wrapper of the core WCS</span>
<span class="sd">     functionality in `wcslib`_.</span>

<span class="sd">   - `~astropy.wcs.Sip`: Handles polynomial distortion as defined in the</span>
<span class="sd">     `SIP`_ convention.</span>

<span class="sd">   - `~astropy.wcs.DistortionLookupTable`: Handles `Paper IV`_ distortion</span>
<span class="sd">     lookup tables.</span>

<span class="sd">Additionally, the class `WCS` aggregates all of these transformations</span>
<span class="sd">together in a pipeline:</span>

<span class="sd">   - Detector to image plane correction (by a pair of</span>
<span class="sd">     `~astropy.wcs.DistortionLookupTable` objects).</span>

<span class="sd">   - `SIP`_ distortion correction (by an underlying `~astropy.wcs.Sip`</span>
<span class="sd">     object)</span>

<span class="sd">   - `Paper IV`_ table-lookup distortion correction (by a pair of</span>
<span class="sd">     `~astropy.wcs.DistortionLookupTable` objects).</span>

<span class="sd">   - `wcslib`_ WCS transformation (by a `~astropy.wcs.Wcsprm` object)</span>
<span class="sd">&quot;&quot;&quot;</span>

<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span>  <span class="c"># confidence high</span>

<span class="c"># STDLIB</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">io</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">warnings</span>

<span class="c"># THIRD-PARTY</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>

<span class="c"># LOCAL</span>
<span class="kn">from</span> <span class="nn">..io</span> <span class="kn">import</span> <span class="n">fits</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">_docutil</span> <span class="k">as</span> <span class="n">__</span>
<span class="k">try</span><span class="p">:</span>
    <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">_wcs</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
    <span class="n">_wcs</span> <span class="o">=</span> <span class="bp">None</span>
<span class="kn">from</span> <span class="nn">..utils</span> <span class="kn">import</span> <span class="n">deprecated</span><span class="p">,</span> <span class="n">deprecated_attribute</span>
<span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">log</span>

<span class="k">if</span> <span class="n">_wcs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
    <span class="k">assert</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">_sanity_check</span><span class="p">(),</span> \
        <span class="s">&quot;astropy.wcs did not pass its sanity check for your build &quot;</span> \
        <span class="s">&quot;on your platform.&quot;</span>

<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>  <span class="c"># pragma: py3</span>
    <span class="n">string_types</span> <span class="o">=</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>  <span class="c"># pragma: py2</span>
    <span class="n">string_types</span> <span class="o">=</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">)</span>


<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;FITSFixedWarning&#39;</span><span class="p">,</span> <span class="s">&#39;WCS&#39;</span><span class="p">,</span> <span class="s">&#39;find_all_wcs&#39;</span><span class="p">,</span>
           <span class="s">&#39;DistortionLookupTable&#39;</span><span class="p">,</span> <span class="s">&#39;Sip&#39;</span><span class="p">,</span> <span class="s">&#39;Tabprm&#39;</span><span class="p">,</span> <span class="s">&#39;UnitConverter&#39;</span><span class="p">,</span>
           <span class="s">&#39;Wcsprm&#39;</span><span class="p">,</span> <span class="s">&#39;WCSBase&#39;</span><span class="p">]</span>


<span class="k">if</span> <span class="n">_wcs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
    <span class="n">WCSBase</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">_Wcs</span>
    <span class="n">DistortionLookupTable</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">DistortionLookupTable</span>
    <span class="n">Sip</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Sip</span>
    <span class="n">UnitConverter</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">UnitConverter</span>
    <span class="n">Wcsprm</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Wcsprm</span>
    <span class="n">Tabprm</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Tabprm</span>
    <span class="c"># Copy all the constants from the C extension into this module&#39;s namespace</span>
    <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;WCSSUB&#39;</span><span class="p">)</span> <span class="ow">or</span>
            <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;WCSHDR&#39;</span><span class="p">)</span> <span class="ow">or</span>
            <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;WCSHDO&#39;</span><span class="p">)):</span>
            <span class="nb">locals</span><span class="p">()[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
            <span class="n">__all__</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>

    <span class="n">UnitConverter</span> <span class="o">=</span> <span class="n">deprecated</span><span class="p">(</span>
        <span class="s">&#39;0.2&#39;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;UnitConverter&#39;</span><span class="p">,</span> <span class="n">alternative</span><span class="o">=</span><span class="s">&#39;astropy.units&#39;</span><span class="p">)(</span>
            <span class="n">UnitConverter</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="n">WCSBase</span> <span class="o">=</span> <span class="nb">object</span>
    <span class="n">Wcsprm</span> <span class="o">=</span> <span class="nb">object</span>
    <span class="n">DistortionLookupTable</span> <span class="o">=</span> <span class="nb">object</span>
    <span class="n">Sip</span> <span class="o">=</span> <span class="nb">object</span>
    <span class="n">UnitConverter</span> <span class="o">=</span> <span class="nb">object</span>
    <span class="n">Tabprm</span> <span class="o">=</span> <span class="nb">object</span>


<span class="c"># Additional relax bit flags</span>
<span class="n">WCSHDO_SIP</span> <span class="o">=</span> <span class="mh">0x10000</span>


<span class="k">def</span> <span class="nf">_parse_keysel</span><span class="p">(</span><span class="n">keysel</span><span class="p">):</span>
    <span class="n">keysel_flags</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">if</span> <span class="n">keysel</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">keysel</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">element</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;image&#39;</span><span class="p">:</span>
                <span class="n">keysel_flags</span> <span class="o">|=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">WCSHDR_IMGHEAD</span>
            <span class="k">elif</span> <span class="n">element</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;binary&#39;</span><span class="p">:</span>
                <span class="n">keysel_flags</span> <span class="o">|=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">WCSHDR_BIMGARR</span>
            <span class="k">elif</span> <span class="n">element</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;pixel&#39;</span><span class="p">:</span>
                <span class="n">keysel_flags</span> <span class="o">|=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">WCSHDR_PIXLIST</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;keysel must be a list of &#39;image&#39;, &#39;binary&#39; &quot;</span> <span class="o">+</span>
                    <span class="s">&quot;and/or &#39;pixel&#39;&quot;</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">keysel_flags</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>

    <span class="k">return</span> <span class="n">keysel_flags</span>


<div class="viewcode-block" id="FITSFixedWarning"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.FITSFixedWarning.html#astropy.wcs.wcs.FITSFixedWarning">[docs]</a><span class="k">class</span> <span class="nc">FITSFixedWarning</span><span class="p">(</span><span class="ne">Warning</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    The warning raised when the contents of the FITS header have been</span>
<span class="sd">    modified to be standards compliant.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">pass</span>

</div>
<div class="viewcode-block" id="WCS"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS">[docs]</a><span class="k">class</span> <span class="nc">WCS</span><span class="p">(</span><span class="n">WCSBase</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    WCS objects perform standard WCS transformations, and correct for</span>
<span class="sd">    `SIP`_ and `Paper IV`_ table-lookup distortions, based on the WCS</span>
<span class="sd">    keywords and supplementary data read from a FITS file.</span>

<span class="sd">    Parameters</span>
<span class="sd">    ----------</span>
<span class="sd">    header : astropy.io.fits header object, string, dict-like, or None, optional</span>
<span class="sd">        If *header* is not provided or None, the object will be</span>
<span class="sd">        initialized to default values.</span>

<span class="sd">    fobj : An astropy.io.fits file (hdulist) object, optional</span>
<span class="sd">        It is needed when header keywords point to a `Paper IV`_</span>
<span class="sd">        Lookup table distortion stored in a different extension.</span>

<span class="sd">    key : string, optional</span>
<span class="sd">        The name of a particular WCS transform to use.  This may be</span>
<span class="sd">        either ``&#39; &#39;`` or ``&#39;A&#39;``-``&#39;Z&#39;`` and corresponds to the</span>
<span class="sd">        ``\&quot;a\&quot;`` part of the ``CTYPEia`` cards.  *key* may only be</span>
<span class="sd">        provided if *header* is also provided.</span>

<span class="sd">    minerr : float, optional</span>
<span class="sd">        The minimum value a distortion correction must have in order</span>
<span class="sd">        to be applied. If the value of ``CQERRja`` is smaller than</span>
<span class="sd">        *minerr*, the corresponding distortion is not applied.</span>

<span class="sd">    relax : bool or int, optional</span>
<span class="sd">        Degree of permissiveness:</span>

<span class="sd">        - `True` (default): Admit all recognized informal extensions</span>
<span class="sd">          of the WCS standard.</span>

<span class="sd">        - `False`: Recognize only FITS keywords defined by the</span>
<span class="sd">          published WCS standard.</span>

<span class="sd">        - `int`: a bit field selecting specific extensions to accept.</span>
<span class="sd">          See :ref:`relaxread` for details.</span>

<span class="sd">    naxis : int or sequence, optional</span>
<span class="sd">        Extracts specific coordinate axes using</span>
<span class="sd">        :meth:`~astropy.wcs.Wcsprm.sub`.  If a header is provided, and</span>
<span class="sd">        *naxis* is not ``None``, *naxis* will be passed to</span>
<span class="sd">        :meth:`~astropy.wcs.Wcsprm.sub` in order to select specific</span>
<span class="sd">        axes from the header.  See :meth:`~astropy.wcs.Wcsprm.sub` for</span>
<span class="sd">        more details about this parameter.</span>

<span class="sd">    keysel : sequence of flags, optional</span>
<span class="sd">        A sequence of flags used to select the keyword types</span>
<span class="sd">        considered by wcslib.  When ``None``, only the standard image</span>
<span class="sd">        header keywords are considered (and the underlying wcspih() C</span>
<span class="sd">        function is called).  To use binary table image array or pixel</span>
<span class="sd">        list keywords, *keysel* must be set.</span>

<span class="sd">        Each element in the list should be one of the following</span>
<span class="sd">        strings:</span>

<span class="sd">        - &#39;image&#39;: Image header keywords</span>

<span class="sd">        - &#39;binary&#39;: Binary table image array keywords</span>

<span class="sd">        - &#39;pixel&#39;: Pixel list keywords</span>

<span class="sd">        Keywords such as ``EQUIna`` or ``RFRQna`` that are common to</span>
<span class="sd">        binary table image arrays and pixel lists (including</span>
<span class="sd">        ``WCSNna`` and ``TWCSna``) are selected by both &#39;binary&#39; and</span>
<span class="sd">        &#39;pixel&#39;.</span>

<span class="sd">    colsel : sequence of int, optional</span>
<span class="sd">        A sequence of table column numbers used to restrict the WCS</span>
<span class="sd">        transformations considered to only those pertaining to the</span>
<span class="sd">        specified columns.  If `None`, there is no restriction.</span>

<span class="sd">    fix : bool, optional</span>
<span class="sd">        When `True` (default), call `~astropy.wcs._wcs.Wcsprm.fix` on</span>
<span class="sd">        the resulting object to fix any non-standard uses in the</span>
<span class="sd">        header.  `FITSFixedWarning` Warnings will be emitted if any</span>
<span class="sd">        changes were made.</span>

<span class="sd">    Raises</span>
<span class="sd">    ------</span>
<span class="sd">    MemoryError</span>
<span class="sd">         Memory allocation failed.</span>

<span class="sd">    ValueError</span>
<span class="sd">         Invalid key.</span>

<span class="sd">    KeyError</span>
<span class="sd">         Key not found in FITS header.</span>

<span class="sd">    AssertionError</span>
<span class="sd">         Lookup table distortion present in the header but *fobj* was</span>
<span class="sd">         not provided.</span>

<span class="sd">    Notes</span>
<span class="sd">    -----</span>

<span class="sd">    1. astropy.wcs supports arbitrary *n* dimensions for the core WCS</span>
<span class="sd">       (the transformations handled by WCSLIB).  However, the Paper IV</span>
<span class="sd">       lookup table and SIP distortions must be two dimensional.</span>
<span class="sd">       Therefore, if you try to create a WCS object where the core WCS</span>
<span class="sd">       has a different number of dimensions than 2 and that object</span>
<span class="sd">       also contains a Paper IV lookup table or SIP distortion, a</span>
<span class="sd">       `ValueError` exception will be raised.  To avoid this, consider</span>
<span class="sd">       using the *naxis* kwarg to select two dimensions from the core</span>
<span class="sd">       WCS.</span>

<span class="sd">    2. The number of coordinate axes in the transformation is not</span>
<span class="sd">       determined directly from the ``NAXIS`` keyword but instead from</span>
<span class="sd">       the highest of:</span>

<span class="sd">           - ``NAXIS`` keyword</span>

<span class="sd">           - ``WCSAXESa`` keyword</span>

<span class="sd">           - The highest axis number in any parameterized WCS keyword.</span>
<span class="sd">             The keyvalue, as well as the keyword, must be</span>
<span class="sd">             syntactically valid otherwise it will not be considered.</span>

<span class="sd">       If none of these keyword types is present, i.e. if the header</span>
<span class="sd">       only contains auxiliary WCS keywords for a particular</span>
<span class="sd">       coordinate representation, then no coordinate description is</span>
<span class="sd">       constructed for it.</span>

<span class="sd">       The number of axes, which is set as the `naxis` member, may</span>
<span class="sd">       differ for different coordinate representations of the same</span>
<span class="sd">       image.</span>

<span class="sd">    3. When the header includes duplicate keywords, in most cases the</span>
<span class="sd">       last encountered is used.</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">fobj</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="n">minerr</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
                 <span class="n">relax</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">naxis</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">keysel</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">colsel</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
                 <span class="n">fix</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="n">close_fds</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="k">if</span> <span class="n">header</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">naxis</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">naxis</span> <span class="o">=</span> <span class="mi">2</span>
            <span class="n">wcsprm</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Wcsprm</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
                                 <span class="n">relax</span><span class="o">=</span><span class="n">relax</span><span class="p">,</span> <span class="n">naxis</span><span class="o">=</span><span class="n">naxis</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">naxis</span> <span class="o">=</span> <span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span>
            <span class="c"># Set some reasonable defaults.</span>
            <span class="n">det2im</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
            <span class="n">cpdis</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
            <span class="n">sip</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">keysel_flags</span> <span class="o">=</span> <span class="n">_parse_keysel</span><span class="p">(</span><span class="n">keysel</span><span class="p">)</span>

            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
                <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">header</span><span class="p">):</span>
                    <span class="k">if</span> <span class="n">fobj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
                        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                            <span class="s">&quot;Can not provide both a FITS filename to &quot;</span>
                            <span class="s">&quot;argument 1 and a FITS file object to argument 2&quot;</span><span class="p">)</span>
                    <span class="n">fobj</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
                    <span class="n">close_fds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fobj</span><span class="p">)</span>
                    <span class="n">header</span> <span class="o">=</span> <span class="n">fobj</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span>
                    <span class="n">header_string</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">tostring</span><span class="p">()</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">header_string</span> <span class="o">=</span> <span class="n">header</span>
            <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="p">):</span>
                <span class="n">header_string</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">tostring</span><span class="p">()</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">try</span><span class="p">:</span>
                    <span class="c"># Accept any dict-like object</span>
                    <span class="n">new_header</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="p">()</span>
                    <span class="k">for</span> <span class="n">dict_key</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
                        <span class="n">new_header</span><span class="p">[</span><span class="n">dict_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">dict_key</span><span class="p">]</span>
                    <span class="n">header_string</span> <span class="o">=</span> <span class="n">new_header</span><span class="o">.</span><span class="n">tostring</span><span class="p">()</span>
                <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
                    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                        <span class="s">&quot;header must be a string, an astropy.io.fits.Header &quot;</span>
                        <span class="s">&quot;object, or a dict-like object&quot;</span><span class="p">)</span>

            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header_string</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
                <span class="n">header_bytes</span> <span class="o">=</span> <span class="n">header_string</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;ascii&#39;</span><span class="p">)</span>
                <span class="n">header_string</span> <span class="o">=</span> <span class="n">header_string</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">header_bytes</span> <span class="o">=</span> <span class="n">header_string</span>
                <span class="n">header_string</span> <span class="o">=</span> <span class="n">header_string</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;ascii&#39;</span><span class="p">)</span>

            <span class="k">try</span><span class="p">:</span>
                <span class="n">wcsprm</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Wcsprm</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="n">header_bytes</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
                                     <span class="n">relax</span><span class="o">=</span><span class="n">relax</span><span class="p">,</span> <span class="n">keysel</span><span class="o">=</span><span class="n">keysel_flags</span><span class="p">,</span>
                                     <span class="n">colsel</span><span class="o">=</span><span class="n">colsel</span><span class="p">)</span>
            <span class="k">except</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">NoWcsKeywordsFoundError</span><span class="p">:</span>
                <span class="c"># The header may have SIP or distortions, but no core</span>
                <span class="c"># WCS.  That isn&#39;t an error -- we want a &quot;default&quot;</span>
                <span class="c"># (identity) core Wcs transformation in that case.</span>
                <span class="k">if</span> <span class="n">colsel</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                    <span class="n">wcsprm</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Wcsprm</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
                                         <span class="n">relax</span><span class="o">=</span><span class="n">relax</span><span class="p">,</span> <span class="n">keysel</span><span class="o">=</span><span class="n">keysel_flags</span><span class="p">,</span>
                                         <span class="n">colsel</span><span class="o">=</span><span class="n">colsel</span><span class="p">)</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="k">raise</span>

            <span class="k">if</span> <span class="n">naxis</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">wcsprm</span> <span class="o">=</span> <span class="n">wcsprm</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">naxis</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">naxis</span> <span class="o">=</span> <span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span>

            <span class="n">header</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">header_string</span><span class="p">)</span>

            <span class="n">det2im</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_det2im_kw</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">fobj</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="n">minerr</span><span class="p">)</span>
            <span class="n">cpdis</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_distortion_kw</span><span class="p">(</span>
                <span class="n">header</span><span class="p">,</span> <span class="n">fobj</span><span class="p">,</span> <span class="n">dist</span><span class="o">=</span><span class="s">&#39;CPDIS&#39;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="n">minerr</span><span class="p">)</span>
            <span class="n">sip</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_sip_kw</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">and</span>
                <span class="p">(</span><span class="n">det2im</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">or</span> <span class="n">det2im</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="n">cpdis</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">or</span> <span class="n">cpdis</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="n">sip</span><span class="p">)):</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Paper IV lookup tables and SIP distortions only work in 2 dimensions.</span>
<span class="sd">However, WCSLIB has detected {0} dimensions in the core WCS keywords.</span>
<span class="sd">To use core WCS in conjunction with Paper IV lookup tables or SIP</span>
<span class="sd">distortion, you must select or reduce these to 2 dimensions using the</span>
<span class="sd">naxis kwarg.</span>
<span class="sd">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span><span class="p">))</span>

            <span class="n">header_naxis</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NAXIS&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">header_naxis</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">header_naxis</span> <span class="o">&lt;</span> <span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span><span class="p">:</span>
                <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
                    <span class="s">&quot;The WCS transformation has more axes ({0:d}) than the &quot;</span>
                    <span class="s">&quot;image it is associated with ({1:d})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
                        <span class="n">wcsprm</span><span class="o">.</span><span class="n">naxis</span><span class="p">,</span> <span class="n">header_naxis</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">fix</span><span class="p">:</span>
            <span class="n">fixes</span> <span class="o">=</span> <span class="n">wcsprm</span><span class="o">.</span><span class="n">fix</span><span class="p">()</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">fixes</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
                <span class="k">if</span> <span class="n">val</span> <span class="o">!=</span> <span class="s">&quot;No change&quot;</span><span class="p">:</span>
                    <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
                        <span class="p">(</span><span class="s">&quot;&#39;{0}&#39; made the change &#39;{1}&#39;. &quot;</span>
                         <span class="s">&quot;This FITS header contains non-standard content.&quot;</span><span class="p">)</span><span class="o">.</span>
                        <span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">),</span>
                        <span class="n">FITSFixedWarning</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">_get_naxis</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
        <span class="n">WCSBase</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sip</span><span class="p">,</span> <span class="n">cpdis</span><span class="p">,</span> <span class="n">wcsprm</span><span class="p">,</span> <span class="n">det2im</span><span class="p">)</span>

        <span class="k">for</span> <span class="n">fd</span> <span class="ow">in</span> <span class="n">close_fds</span><span class="p">:</span>
            <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">new_copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">()</span>
        <span class="n">WCSBase</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">new_copy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="p">,</span>
                         <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cpdis1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpdis2</span><span class="p">),</span>
                         <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="p">,</span>
                         <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">det2im1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">det2im2</span><span class="p">))</span>
        <span class="n">new_copy</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">new_copy</span>

    <span class="k">def</span> <span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
        <span class="n">new_copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">()</span>
        <span class="n">new_copy</span><span class="o">.</span><span class="n">naxis</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">naxis</span><span class="p">,</span> <span class="n">memo</span><span class="p">)</span>
        <span class="n">WCSBase</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">new_copy</span><span class="p">,</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="p">,</span> <span class="n">memo</span><span class="p">),</span>
                         <span class="p">(</span><span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cpdis1</span><span class="p">,</span> <span class="n">memo</span><span class="p">),</span>
                          <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cpdis2</span><span class="p">,</span> <span class="n">memo</span><span class="p">)),</span>
                         <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="p">,</span> <span class="n">memo</span><span class="p">),</span>
                         <span class="p">(</span><span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">det2im1</span><span class="p">,</span> <span class="n">memo</span><span class="p">),</span>
                          <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">det2im2</span><span class="p">,</span> <span class="n">memo</span><span class="p">)))</span>
        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">:</span>
            <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
            <span class="n">new_copy</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">memo</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">new_copy</span>

<div class="viewcode-block" id="WCS.copy"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.copy">[docs]</a>    <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Return a shallow copy of the object.</span>

<span class="sd">        Convenience method so user doesn&#39;t have to import the</span>
<span class="sd">        :mod:`copy` stdlib module.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="WCS.deepcopy"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.deepcopy">[docs]</a>    <span class="k">def</span> <span class="nf">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Return a deep copy of the object.</span>

<span class="sd">        Convenience method so user doesn&#39;t have to import the</span>
<span class="sd">        :mod:`copy` stdlib module.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="WCS.sub"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.sub">[docs]</a>    <span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">axes</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="n">copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">()</span>
        <span class="n">copy</span><span class="o">.</span><span class="n">wcs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">axes</span><span class="p">)</span>
        <span class="n">copy</span><span class="o">.</span><span class="n">naxis</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">naxis</span>
        <span class="k">return</span> <span class="n">copy</span></div>
    <span class="k">if</span> <span class="n">_wcs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">sub</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">Wcsprm</span><span class="o">.</span><span class="n">sub</span><span class="o">.</span><span class="n">__doc__</span>

<div class="viewcode-block" id="WCS.calcFootprint"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.calcFootprint">[docs]</a>    <span class="k">def</span> <span class="nf">calcFootprint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">undistort</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">axes</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Calculates the footprint of the image on the sky.</span>

<span class="sd">        A footprint is defined as the positions of the corners of the</span>
<span class="sd">        image on the sky after all available distortions have been</span>
<span class="sd">        applied.</span>

<span class="sd">        Parameters</span>
<span class="sd">        ----------</span>
<span class="sd">        header : astropy.io.fits header object, optional</span>

<span class="sd">        undistort : bool, optional</span>
<span class="sd">            If `True`, take SIP and distortion lookup table into</span>
<span class="sd">            account</span>

<span class="sd">        axes : length 2 sequence ints, optional</span>
<span class="sd">            If provided, use the given sequence as the shape of the</span>
<span class="sd">            image.  Otherwise, use the ``NAXIS1`` and ``NAXIS2``</span>
<span class="sd">            keywords from the header that was used to create this</span>
<span class="sd">            `WCS` object.</span>

<span class="sd">        Returns</span>
<span class="sd">        -------</span>
<span class="sd">        coord : (4, 2) array of (*x*, *y*) coordinates.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">axes</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">naxis1</span><span class="p">,</span> <span class="n">naxis2</span> <span class="o">=</span> <span class="n">axes</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">header</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="k">try</span><span class="p">:</span>
                    <span class="c"># classes that inherit from WCS and define naxis1/2</span>
                    <span class="c"># do not require a header parameter</span>
                    <span class="n">naxis1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_naxis1</span>
                    <span class="n">naxis2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_naxis2</span>
                <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
                    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Need a valid header in order to calculate footprint</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
                    <span class="k">return</span> <span class="bp">None</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">naxis1</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NAXIS1&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
                <span class="n">naxis2</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NAXIS2&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="n">corners</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">naxis1</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">naxis2</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="n">corners</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">naxis2</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">naxis1</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">naxis2</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">naxis1</span>
        <span class="n">corners</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.</span>
        <span class="k">if</span> <span class="n">undistort</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">all_pix2world</span><span class="p">(</span><span class="n">corners</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs_pix2world</span><span class="p">(</span><span class="n">corners</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</div>
    <span class="k">def</span> <span class="nf">_read_det2im_kw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">fobj</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Create a `Paper IV`_ type lookup table for detector to image</span>
<span class="sd">        plane correction.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="n">cpdis</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">]</span>
        <span class="n">crpix</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">]</span>
        <span class="n">crval</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">]</span>
        <span class="n">cdelt</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">]</span>

        <span class="k">if</span> <span class="n">fobj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fobj</span><span class="p">,</span> <span class="n">fits</span><span class="o">.</span><span class="n">HDUList</span><span class="p">):</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="n">d_error</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;D2IMERR&#39;</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">d_error</span> <span class="o">&lt;</span> <span class="n">err</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="k">try</span><span class="p">:</span>
            <span class="n">d2im_data</span> <span class="o">=</span> <span class="n">fobj</span><span class="p">[(</span><span class="s">&#39;D2IMARR&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span><span class="o">.</span><span class="n">data</span>
        <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="n">d2im_data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">d2im_data</span><span class="p">])</span>
        <span class="n">d2im_hdr</span> <span class="o">=</span> <span class="n">fobj</span><span class="p">[(</span><span class="s">&#39;D2IMARR&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span><span class="o">.</span><span class="n">header</span>
        <span class="n">naxis</span> <span class="o">=</span> <span class="n">d2im_hdr</span><span class="p">[</span><span class="s">&#39;NAXIS&#39;</span><span class="p">]</span>

        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">naxis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">crpix</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">d2im_hdr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRPIX&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>
            <span class="n">crval</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">d2im_hdr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRVAL&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>
            <span class="n">cdelt</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">d2im_hdr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CDELT&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="mf">1.0</span><span class="p">)</span>

        <span class="n">cpdis</span> <span class="o">=</span> <span class="n">DistortionLookupTable</span><span class="p">(</span><span class="n">d2im_data</span><span class="p">,</span> <span class="n">crpix</span><span class="p">,</span> <span class="n">crval</span><span class="p">,</span> <span class="n">cdelt</span><span class="p">)</span>

        <span class="n">axiscorr</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;AXISCORR&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">axiscorr</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="n">cpdis</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">cpdis</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_write_det2im</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hdulist</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Writes a Paper IV type lookup table to the given</span>
<span class="sd">        `astropy.io.fits.HDUList`.</span>
<span class="sd">        &quot;&quot;&quot;</span>

        <span class="n">det2im1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">det2im1</span>
        <span class="n">det2im2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">det2im2</span>
        <span class="k">if</span> <span class="n">det2im1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">det2im2</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;AXISCORR&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
            <span class="n">det2im</span> <span class="o">=</span> <span class="n">det2im1</span>
        <span class="k">elif</span> <span class="n">det2im1</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">det2im2</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;AXISCORR&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
            <span class="n">det2im</span> <span class="o">=</span> <span class="n">det2im2</span>
        <span class="k">elif</span> <span class="n">det2im1</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">det2im2</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;Saving both distortion images is not supported&quot;</span><span class="p">)</span>

        <span class="n">image</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">ImageHDU</span><span class="p">(</span><span class="n">det2im</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;D2IMARR&#39;</span><span class="p">)</span>
        <span class="n">header</span> <span class="o">=</span> <span class="n">image</span><span class="o">.</span><span class="n">header</span>

        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CRPIX1&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CRPIX2&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CRVAL1&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CRVAL2&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CDELT1&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">cdelt</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
        <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s">&#39;CDELT2&#39;</span><span class="p">,</span> <span class="n">det2im</span><span class="o">.</span><span class="n">cdelt</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>

        <span class="n">hdulist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">image</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_read_distortion_kw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">fobj</span><span class="p">,</span> <span class="n">dist</span><span class="o">=</span><span class="s">&#39;CPDIS&#39;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Reads `Paper IV`_ table-lookup distortion keywords and data,</span>
<span class="sd">        and returns a 2-tuple of `~astropy.wcs.DistortionLookupTable`</span>
<span class="sd">        objects.</span>

<span class="sd">        If no `Paper IV`_ distortion keywords are found, ``(None,</span>
<span class="sd">        None)`` is returned.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">dist</span> <span class="o">==</span> <span class="s">&#39;CPDIS&#39;</span><span class="p">:</span>
            <span class="n">d_kw</span> <span class="o">=</span> <span class="s">&#39;DP&#39;</span>
            <span class="n">err_kw</span> <span class="o">=</span> <span class="s">&#39;CPERR&#39;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">d_kw</span> <span class="o">=</span> <span class="s">&#39;DQ&#39;</span>
            <span class="n">err_kw</span> <span class="o">=</span> <span class="s">&#39;CQERR&#39;</span>

        <span class="n">tables</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">naxis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">d_error</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">err_kw</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">d_error</span> <span class="o">&lt;</span> <span class="n">err</span><span class="p">:</span>
                <span class="n">tables</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span>
                <span class="k">continue</span>
            <span class="n">distortion</span> <span class="o">=</span> <span class="n">dist</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">distortion</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
                <span class="n">dis</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">distortion</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
                <span class="k">if</span> <span class="n">dis</span> <span class="o">==</span> <span class="s">&#39;lookup&#39;</span><span class="p">:</span>
                    <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fobj</span><span class="p">,</span> <span class="n">fits</span><span class="o">.</span><span class="n">HDUList</span><span class="p">),</span> \
                        <span class="s">&#39;An astropy.io.fits.HDUList is required for &#39;</span> <span class="o">+</span> \
                        <span class="s">&#39;Lookup table distortion.&#39;</span>
                    <span class="n">dp</span> <span class="o">=</span> <span class="p">(</span><span class="n">d_kw</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
                    <span class="n">d_extver</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">dp</span> <span class="o">+</span> <span class="s">&#39;.EXTVER&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                    <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">header</span><span class="p">[</span><span class="n">dp</span> <span class="o">+</span> <span class="s">&#39;.AXIS.&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)]:</span>
                        <span class="n">d_data</span> <span class="o">=</span> <span class="n">fobj</span><span class="p">[</span><span class="s">&#39;WCSDVARR&#39;</span><span class="p">,</span> <span class="n">d_extver</span><span class="p">]</span><span class="o">.</span><span class="n">data</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="n">d_data</span> <span class="o">=</span> <span class="p">(</span><span class="n">fobj</span><span class="p">[</span><span class="s">&#39;WCSDVARR&#39;</span><span class="p">,</span> <span class="n">d_extver</span><span class="p">]</span><span class="o">.</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span>
                    <span class="n">d_header</span> <span class="o">=</span> <span class="n">fobj</span><span class="p">[</span><span class="s">&#39;WCSDVARR&#39;</span><span class="p">,</span> <span class="n">d_extver</span><span class="p">]</span><span class="o">.</span><span class="n">header</span>
                    <span class="n">d_crpix</span> <span class="o">=</span> <span class="p">(</span><span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRPIX1&#39;</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">),</span>
                               <span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRPIX2&#39;</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">))</span>
                    <span class="n">d_crval</span> <span class="o">=</span> <span class="p">(</span><span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRVAL1&#39;</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">),</span>
                               <span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CRVAL2&#39;</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">))</span>
                    <span class="n">d_cdelt</span> <span class="o">=</span> <span class="p">(</span><span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CDELT1&#39;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">),</span>
                               <span class="n">d_header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;CDELT2&#39;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">))</span>
                    <span class="n">d_lookup</span> <span class="o">=</span> <span class="n">DistortionLookupTable</span><span class="p">(</span><span class="n">d_data</span><span class="p">,</span> <span class="n">d_crpix</span><span class="p">,</span>
                                                     <span class="n">d_crval</span><span class="p">,</span> <span class="n">d_cdelt</span><span class="p">)</span>
                    <span class="n">tables</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">d_lookup</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="k">print</span><span class="p">(</span><span class="s">&#39;Polynomial distortion is not implemented.</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">tables</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="n">tables</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">(</span><span class="n">tables</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">tables</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">_write_distortion_kw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hdulist</span><span class="p">,</span> <span class="n">dist</span><span class="o">=</span><span class="s">&#39;CPDIS&#39;</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Write out Paper IV distortion keywords to the given</span>
<span class="sd">        `fits.HDUList`.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpdis1</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpdis2</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span>

        <span class="k">if</span> <span class="n">dist</span> <span class="o">==</span> <span class="s">&#39;CPDIS&#39;</span><span class="p">:</span>
            <span class="n">d_kw</span> <span class="o">=</span> <span class="s">&#39;DP&#39;</span>
            <span class="n">err_kw</span> <span class="o">=</span> <span class="s">&#39;CPERR&#39;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">d_kw</span> <span class="o">=</span> <span class="s">&#39;DQ&#39;</span>
            <span class="n">err_kw</span> <span class="o">=</span> <span class="s">&#39;CQERR&#39;</span>

        <span class="k">def</span> <span class="nf">write_dist</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">cpdis</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">cpdis</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="k">return</span>

            <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;{0}{1:d}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dist</span><span class="p">,</span> <span class="n">num</span><span class="p">),</span>
                <span class="p">(</span><span class="s">&#39;LOOKUP&#39;</span><span class="p">,</span> <span class="s">&#39;Prior distortion function type&#39;</span><span class="p">))</span>
            <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;{0}{1:d}.EXTVER&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d_kw</span><span class="p">,</span> <span class="n">num</span><span class="p">),</span>
                <span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="s">&#39;Version number of WCSDVARR extension&#39;</span><span class="p">))</span>
            <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;{0}{1:d}.NAXES&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d_kw</span><span class="p">,</span> <span class="n">num</span><span class="p">),</span>
                <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">),</span>
                 <span class="s">&#39;Number of independent variables in distortion function&#39;</span><span class="p">))</span>

            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">ndim</span><span class="p">):</span>
                <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                    <span class="s">&#39;{0}{1:d}.AXIS.{2:d}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d_kw</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
                    <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="s">&#39;Axis number of the jth independent variable in a &#39;</span>
                     <span class="s">&#39;distortion function&#39;</span><span class="p">))</span>

            <span class="n">image</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">ImageHDU</span><span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;WCSDVARR&#39;</span><span class="p">)</span>
            <span class="n">header</span> <span class="o">=</span> <span class="n">image</span><span class="o">.</span><span class="n">header</span>

            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CRPIX1&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Coordinate system reference pixel&#39;</span><span class="p">))</span>
            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CRPIX2&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">&#39;Coordinate system reference pixel&#39;</span><span class="p">))</span>
            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CRVAL1&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Coordinate system value at reference pixel&#39;</span><span class="p">))</span>
            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CRVAL2&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">&#39;Coordinate system value at reference pixel&#39;</span><span class="p">))</span>
            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CDELT1&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">cdelt</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Coordinate increment along axis&#39;</span><span class="p">))</span>
            <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
                <span class="s">&#39;CDELT2&#39;</span><span class="p">,</span>
                <span class="p">(</span><span class="n">cpdis</span><span class="o">.</span><span class="n">cdelt</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">&#39;Coordinate increment along axis&#39;</span><span class="p">))</span>
            <span class="n">image</span><span class="o">.</span><span class="n">update_ext_version</span><span class="p">(</span>
                <span class="nb">int</span><span class="p">(</span><span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="p">[</span><span class="s">&#39;{0}{1:d}.EXTVER&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">d_kw</span><span class="p">,</span> <span class="n">num</span><span class="p">)]))</span>

            <span class="n">hdulist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">image</span><span class="p">)</span>

        <span class="n">write_dist</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpdis1</span><span class="p">)</span>
        <span class="n">write_dist</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpdis2</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_read_sip_kw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Reads `SIP`_ header keywords and returns a `~astropy.wcs.Sip`</span>
<span class="sd">        object.</span>

<span class="sd">        If no `SIP`_ header keywords are found, ``None`` is returned.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
            <span class="c"># TODO: Parse SIP from a string without pyfits around</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="k">if</span> <span class="s">&quot;A_ORDER&quot;</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
            <span class="k">if</span> <span class="s">&quot;B_ORDER&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;A_ORDER provided without corresponding B_ORDER &quot;</span>
                    <span class="s">&quot;keyword for SIP distortion&quot;</span><span class="p">)</span>

            <span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">header</span><span class="p">[</span><span class="s">&quot;A_ORDER&quot;</span><span class="p">])</span>
            <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">-</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                    <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s">&quot;A_{0}_{1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)),</span> <span class="mf">0.0</span><span class="p">)</span>

            <span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">header</span><span class="p">[</span><span class="s">&quot;B_ORDER&quot;</span><span class="p">])</span>
            <span class="n">b</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">-</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                    <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s">&quot;B_{0}_{1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)),</span> <span class="mf">0.0</span><span class="p">)</span>
        <span class="k">elif</span> <span class="s">&quot;B_ORDER&quot;</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;B_ORDER provided without corresponding A_ORDER &quot;</span> <span class="o">+</span>
                <span class="s">&quot;keyword for SIP distortion&quot;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">a</span> <span class="o">=</span> <span class="bp">None</span>
            <span class="n">b</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="k">if</span> <span class="s">&quot;AP_ORDER&quot;</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
            <span class="k">if</span> <span class="s">&quot;BP_ORDER&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;AP_ORDER provided without corresponding BP_ORDER &quot;</span>
                    <span class="s">&quot;keyword for SIP distortion&quot;</span><span class="p">)</span>

            <span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">header</span><span class="p">[</span><span class="s">&quot;AP_ORDER&quot;</span><span class="p">])</span>
            <span class="n">ap</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">-</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                    <span class="n">ap</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;AP_{0}_{1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>

            <span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">header</span><span class="p">[</span><span class="s">&quot;BP_ORDER&quot;</span><span class="p">])</span>
            <span class="n">bp</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span> <span class="o">-</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
                    <span class="n">bp</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;BP_{0}_{1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>
        <span class="k">elif</span> <span class="s">&quot;BP_ORDER&quot;</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;BP_ORDER provided without corresponding AP_ORDER &quot;</span>
                <span class="s">&quot;keyword for SIP distortion&quot;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">ap</span> <span class="o">=</span> <span class="bp">None</span>
            <span class="n">bp</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="k">if</span> <span class="n">a</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">b</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">ap</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="k">if</span> <span class="s">&quot;CRPIX1&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">header</span> <span class="ow">or</span> <span class="s">&quot;CRPIX2&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">header</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;Header has SIP keywords without CRPIX keywords&quot;</span><span class="p">)</span>

        <span class="n">crpix1</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;CRPIX1&quot;</span><span class="p">)</span>
        <span class="n">crpix2</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;CRPIX2&quot;</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">Sip</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">ap</span><span class="p">,</span> <span class="n">bp</span><span class="p">,</span> <span class="p">(</span><span class="n">crpix1</span><span class="p">,</span> <span class="n">crpix2</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">_write_sip_kw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Write out SIP keywords.  Returns a dictionary of key-value</span>
<span class="sd">        pairs.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{}</span>

        <span class="n">keywords</span> <span class="o">=</span> <span class="p">{}</span>

        <span class="k">def</span> <span class="nf">write_array</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">a</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="k">return</span>
            <span class="n">size</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
            <span class="n">keywords</span><span class="p">[</span><span class="s">&#39;{0}_ORDER&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size</span><span class="p">):</span>
                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size</span> <span class="o">-</span> <span class="n">i</span><span class="p">):</span>
                    <span class="k">if</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">!=</span> <span class="mf">0.0</span><span class="p">:</span>
                        <span class="n">keywords</span><span class="p">[</span>
                            <span class="s">&#39;{0}_{1:d}_{2:d}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span>

        <span class="n">write_array</span><span class="p">(</span><span class="s">&#39;A&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">a</span><span class="p">)</span>
        <span class="n">write_array</span><span class="p">(</span><span class="s">&#39;B&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">b</span><span class="p">)</span>
        <span class="n">write_array</span><span class="p">(</span><span class="s">&#39;AP&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">ap</span><span class="p">)</span>
        <span class="n">write_array</span><span class="p">(</span><span class="s">&#39;BP&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">bp</span><span class="p">)</span>

        <span class="n">keywords</span><span class="p">[</span><span class="s">&#39;CRPIX1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">keywords</span><span class="p">[</span><span class="s">&#39;CRPIX2&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>

        <span class="k">return</span> <span class="n">keywords</span>

    <span class="k">def</span> <span class="nf">_denormalize_sky</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sky</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lngtyp</span> <span class="o">!=</span> <span class="s">&#39;RA&#39;</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;WCS does not have longitude type of &#39;RA&#39;, therefore &quot;</span> <span class="o">+</span>
                <span class="s">&quot;(ra, dec) data can not be used as input&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lattype</span> <span class="o">!=</span> <span class="s">&#39;DEC&#39;</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;WCS does not have longitude type of &#39;DEC&#39;, therefore &quot;</span> <span class="o">+</span>
                <span class="s">&quot;(ra, dec) data can not be used as input&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">naxis</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">sky</span>
            <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="c"># Reverse the order of the columns</span>
                <span class="k">return</span> <span class="n">sky</span><span class="p">[:,</span> <span class="p">::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;WCS does not have longitude and latitude celestial &quot;</span> <span class="o">+</span>
                    <span class="s">&quot;axes, therefore (ra, dec) data can not be used as input&quot;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;WCS does not have both longitude and latitude &quot;</span>
                    <span class="s">&quot;celestial axes, therefore (ra, dec) data can not be &quot;</span> <span class="o">+</span>
                    <span class="s">&quot;used as input&quot;</span><span class="p">)</span>
            <span class="n">out</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">sky</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">naxis</span><span class="p">))</span>
            <span class="n">out</span><span class="p">[:,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span><span class="p">]</span> <span class="o">=</span> <span class="n">sky</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
            <span class="n">out</span><span class="p">[:,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span><span class="p">]</span> <span class="o">=</span> <span class="n">sky</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>
            <span class="k">return</span> <span class="n">out</span>

    <span class="k">def</span> <span class="nf">_normalize_sky</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sky</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lngtyp</span> <span class="o">!=</span> <span class="s">&#39;RA&#39;</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;WCS does not have longitude type of &#39;RA&#39;, therefore &quot;</span> <span class="o">+</span>
                <span class="s">&quot;(ra, dec) data can not be returned&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lattype</span> <span class="o">!=</span> <span class="s">&#39;DEC&#39;</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                <span class="s">&quot;WCS does not have longitude type of &#39;DEC&#39;, therefore &quot;</span> <span class="o">+</span>
                <span class="s">&quot;(ra, dec) data can not be returned&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">naxis</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">sky</span>
            <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="c"># Reverse the order of the columns</span>
                <span class="k">return</span> <span class="n">sky</span><span class="p">[:,</span> <span class="p">::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;WCS does not have longitude and latitude celestial &quot;</span>
                    <span class="s">&quot;axes, therefore (ra, dec) data can not be returned&quot;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;WCS does not have both longitude and latitude celestial &quot;</span>
                    <span class="s">&quot;axes, therefore (ra, dec) data can not be returned&quot;</span><span class="p">)</span>
            <span class="n">out</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">sky</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">2</span><span class="p">))</span>
            <span class="n">out</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">sky</span><span class="p">[:,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lng</span><span class="p">]</span>
            <span class="n">out</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">sky</span><span class="p">[:,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">lat</span><span class="p">]</span>
            <span class="k">return</span> <span class="n">out</span>

    <span class="k">def</span> <span class="nf">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">sky</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        A helper function to support reading either a pair of arrays</span>
<span class="sd">        or a single Nx2 array.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="n">ra_dec_order</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;ra_dec_order&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&quot;Unexpected keyword argument {0!r}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
                <span class="n">kwargs</span><span class="o">.</span><span class="n">keys</span><span class="p">()[</span><span class="mi">0</span><span class="p">]))</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="n">xy</span><span class="p">,</span> <span class="n">origin</span> <span class="o">=</span> <span class="n">args</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">xy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">xy</span><span class="p">)</span>
                <span class="n">origin</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">origin</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                    <span class="s">&quot;When providing two arguments, they must be &quot;</span>
                    <span class="s">&quot;(coords[N][{0}], origin)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">naxis</span><span class="p">))</span>
            <span class="k">if</span> <span class="n">ra_dec_order</span> <span class="ow">and</span> <span class="n">sky</span> <span class="o">==</span> <span class="s">&#39;input&#39;</span><span class="p">:</span>
                <span class="n">xy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_denormalize_sky</span><span class="p">(</span><span class="n">xy</span><span class="p">)</span>
            <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">xy</span><span class="p">,</span> <span class="n">origin</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">ra_dec_order</span> <span class="ow">and</span> <span class="n">sky</span> <span class="o">==</span> <span class="s">&#39;output&#39;</span><span class="p">:</span>
                <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_sky</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">result</span>
        <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">naxis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">axes</span> <span class="o">=</span> <span class="n">args</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
            <span class="n">origin</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">axes</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">axes</span><span class="p">]</span>
                <span class="n">origin</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">origin</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                    <span class="s">&quot;When providing more than two arguments, they must be &quot;</span> <span class="o">+</span>
                    <span class="s">&quot;a 1-D array for each axis, followed by an origin.&quot;</span><span class="p">)</span>

            <span class="k">try</span><span class="p">:</span>
                <span class="n">axes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">broadcast_arrays</span><span class="p">(</span><span class="o">*</span><span class="n">axes</span><span class="p">)</span>
            <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s">&quot;Coordinate arrays are not broadcastable to each other&quot;</span><span class="p">)</span>

            <span class="n">xy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">x</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">axes</span><span class="p">])</span>

            <span class="k">if</span> <span class="n">ra_dec_order</span> <span class="ow">and</span> <span class="n">sky</span> <span class="o">==</span> <span class="s">&#39;input&#39;</span><span class="p">:</span>
                <span class="n">xy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_denormalize_sky</span><span class="p">(</span><span class="n">xy</span><span class="p">)</span>
            <span class="n">sky</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">xy</span><span class="p">,</span> <span class="n">origin</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">ra_dec_order</span> <span class="ow">and</span> <span class="n">sky</span> <span class="o">==</span> <span class="s">&#39;output&#39;</span><span class="p">:</span>
                <span class="n">sky</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_sky_output</span><span class="p">(</span><span class="n">sky</span><span class="p">)</span>
                <span class="k">return</span> <span class="p">(</span><span class="n">sky</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">),</span>
                        <span class="n">sky</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">))</span>
            <span class="k">return</span> <span class="p">[</span><span class="n">sky</span><span class="p">[:,</span> <span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
                    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">sky</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])]</span>

        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
            <span class="s">&quot;Expected 2 or {0} arguments, {1} given&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">naxis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)))</span>

<div class="viewcode-block" id="WCS.all_pix2world"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.all_pix2world">[docs]</a>    <span class="k">def</span> <span class="nf">all_pix2world</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_all_pix2world</span><span class="p">,</span> <span class="s">&#39;output&#39;</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
    <span class="n">all_pix2world</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Transforms pixel coordinates to world coordinates.</span>

<span class="s">        Performs all of the following in order:</span>

<span class="s">            - Detector to image plane correction (optionally)</span>

<span class="s">            - `SIP`_ distortion correction (optionally)</span>

<span class="s">            - `Paper IV`_ table-lookup distortion correction (optionally)</span>

<span class="s">            - `wcslib`_ WCS transformation</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>
<span class="s">        {0}</span>

<span class="s">            For a transformation that is not two-dimensional, the</span>
<span class="s">            two-argument form must be used.</span>

<span class="s">        {1}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {2}</span>

<span class="s">        Notes</span>
<span class="s">        -----</span>
<span class="s">        The order of the axes for the result is determined by the</span>
<span class="s">        `CTYPEia` keywords in the FITS header, therefore it may not</span>
<span class="s">        always be of the form (*ra*, *dec*).  The</span>
<span class="s">        `~astropy.wcs.Wcsprm.lat`, `~astropy.wcs.Wcsprm.lng`,</span>
<span class="s">        `~astropy.wcs.Wcsprm.lattyp` and `~astropy.wcs.Wcsprm.lngtyp`</span>
<span class="s">        members can be used to determine the order of the axes.</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        SingularMatrixError</span>
<span class="s">            Linear transformation matrix is singular.</span>

<span class="s">        InconsistentAxisTypesError</span>
<span class="s">            Inconsistent or unrecognized coordinate axis types.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid parameter value.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        ValueError</span>
<span class="s">            x- and y-coordinate arrays are not the same size.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Ill-conditioned coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;naxis&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RA_DEC_ORDER</span><span class="p">(</span><span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;sky coordinates, in degrees&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

    <span class="nd">@deprecated</span><span class="p">(</span><span class="s">&quot;0.0&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;all_pix2sky&quot;</span><span class="p">,</span> <span class="n">alternative</span><span class="o">=</span><span class="s">&quot;all_pix2world&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="WCS.all_pix2sky"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.all_pix2sky">[docs]</a>    <span class="k">def</span> <span class="nf">all_pix2sky</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">all_pix2world</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="WCS.wcs_pix2world"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.wcs_pix2world">[docs]</a>    <span class="k">def</span> <span class="nf">wcs_pix2world</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;No basic WCS settings were created.&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span>
            <span class="k">lambda</span> <span class="n">xy</span><span class="p">,</span> <span class="n">o</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">p2s</span><span class="p">(</span><span class="n">xy</span><span class="p">,</span> <span class="n">o</span><span class="p">)[</span><span class="s">&#39;world&#39;</span><span class="p">],</span>
            <span class="s">&#39;output&#39;</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
    <span class="n">wcs_pix2world</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Transforms pixel coordinates to world coordinates by doing</span>
<span class="s">        only the basic `wcslib`_ transformation.</span>

<span class="s">        No `SIP`_ or `Paper IV`_ table lookup distortion correction is</span>
<span class="s">        applied.  To perform distortion correction, see</span>
<span class="s">        `~astropy.wcs.WCS.all_pix2world`,</span>
<span class="s">        `~astropy.wcs.WCS.sip_pix2foc`, `~astropy.wcs.WCS.p4_pix2foc`,</span>
<span class="s">        or `~astropy.wcs.WCS.pix2foc`.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>
<span class="s">        {0}</span>

<span class="s">            For a transformation that is not two-dimensional, the</span>
<span class="s">            two-argument form must be used.</span>

<span class="s">        {1}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {2}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        SingularMatrixError</span>
<span class="s">            Linear transformation matrix is singular.</span>

<span class="s">        InconsistentAxisTypesError</span>
<span class="s">            Inconsistent or unrecognized coordinate axis types.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid parameter value.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        ValueError</span>
<span class="s">            x- and y-coordinate arrays are not the same size.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Ill-conditioned coordinate transformation parameters.</span>

<span class="s">        Notes</span>
<span class="s">        -----</span>
<span class="s">        The order of the axes for the result is determined by the</span>
<span class="s">        `CTYPEia` keywords in the FITS header, therefore it may not</span>
<span class="s">        always be of the form (*ra*, *dec*).  The</span>
<span class="s">        `~astropy.wcs.Wcsprm.lat`, `~astropy.wcs.Wcsprm.lng`,</span>
<span class="s">        `~astropy.wcs.Wcsprm.lattyp` and `~astropy.wcs.Wcsprm.lngtyp`</span>
<span class="s">        members can be used to determine the order of the axes.</span>

<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;naxis&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RA_DEC_ORDER</span><span class="p">(</span><span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;world coordinates, in degrees&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

    <span class="nd">@deprecated</span><span class="p">(</span><span class="s">&quot;0.0&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;wcs_pix2sky&quot;</span><span class="p">,</span> <span class="n">alternative</span><span class="o">=</span><span class="s">&quot;wcs_pix2world&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="WCS.wcs_pix2sky"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.wcs_pix2sky">[docs]</a>    <span class="k">def</span> <span class="nf">wcs_pix2sky</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs_pix2world</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="WCS.wcs_world2pix"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.wcs_world2pix">[docs]</a>    <span class="k">def</span> <span class="nf">wcs_world2pix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;No basic WCS settings were created.&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span>
            <span class="k">lambda</span> <span class="n">xy</span><span class="p">,</span> <span class="n">o</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">s2p</span><span class="p">(</span><span class="n">xy</span><span class="p">,</span> <span class="n">o</span><span class="p">)[</span><span class="s">&#39;pixcrd&#39;</span><span class="p">],</span>
            <span class="s">&#39;input&#39;</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
    <span class="n">wcs_world2pix</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Transforms world coordinates to pixel coordinates, using only</span>
<span class="s">        the basic `wcslib`_ WCS transformation.  No `SIP`_ or `Paper</span>
<span class="s">        IV`_ table lookup distortion is applied.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>
<span class="s">        {0}</span>

<span class="s">            For a transformation that is not two-dimensional, the</span>
<span class="s">            two-argument form must be used.</span>

<span class="s">        {1}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {2}</span>

<span class="s">        Notes</span>
<span class="s">        -----</span>
<span class="s">        The order of the axes for the input world array is determined by</span>
<span class="s">        the `CTYPEia` keywords in the FITS header, therefore it may</span>
<span class="s">        not always be of the form (*ra*, *dec*).  The</span>
<span class="s">        `~astropy.wcs.Wcsprm.lat`, `~astropy.wcs.Wcsprm.lng`,</span>
<span class="s">        `~astropy.wcs.Wcsprm.lattyp` and `~astropy.wcs.Wcsprm.lngtyp`</span>
<span class="s">        members can be used to determine the order of the axes.</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        SingularMatrixError</span>
<span class="s">            Linear transformation matrix is singular.</span>

<span class="s">        InconsistentAxisTypesError</span>
<span class="s">            Inconsistent or unrecognized coordinate axis types.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid parameter value.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        ValueError</span>
<span class="s">            x- and y-coordinate arrays are not the same size.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>

<span class="s">        InvalidTransformError</span>
<span class="s">            Ill-conditioned coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;naxis&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RA_DEC_ORDER</span><span class="p">(</span><span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;pixel coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

    <span class="nd">@deprecated</span><span class="p">(</span><span class="s">&quot;0.0&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;wcs_sky2pix&quot;</span><span class="p">,</span> <span class="n">alternative</span><span class="o">=</span><span class="s">&quot;wcs_world2pix&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="WCS.wcs_sky2pix"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.wcs_sky2pix">[docs]</a>    <span class="k">def</span> <span class="nf">wcs_sky2pix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs_world2pix</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="WCS.pix2foc"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.pix2foc">[docs]</a>    <span class="k">def</span> <span class="nf">pix2foc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pix2foc</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
    <span class="n">pix2foc</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Convert pixel coordinates to focal plane coordinates using the</span>
<span class="s">        `SIP`_ polynomial distortion convention and `Paper IV`_</span>
<span class="s">        table-lookup distortion correction.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>

<span class="s">        {0}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {1}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;focal coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

<div class="viewcode-block" id="WCS.p4_pix2foc"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.p4_pix2foc">[docs]</a>    <span class="k">def</span> <span class="nf">p4_pix2foc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_p4_pix2foc</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
    <span class="n">p4_pix2foc</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Convert pixel coordinates to focal plane coordinates using</span>
<span class="s">        `Paper IV`_ table-lookup distortion correction.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>

<span class="s">        {0}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {1}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;focal coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

<div class="viewcode-block" id="WCS.det2im"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.det2im">[docs]</a>    <span class="k">def</span> <span class="nf">det2im</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_det2im</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
    <span class="n">det2im</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Convert detector coordinates to image plane coordinates using</span>
<span class="s">        `Paper IV`_ table-lookup distortion correction.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>

<span class="s">        {0}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {1}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;pixel coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

<div class="viewcode-block" id="WCS.sip_pix2foc"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.sip_pix2foc">[docs]</a>    <span class="k">def</span> <span class="nf">sip_pix2foc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
            <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">args</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&quot;Wrong number of arguments&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">pix2foc</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
    <span class="n">sip_pix2foc</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Convert pixel coordinates to focal plane coordinates using the</span>
<span class="s">        `SIP`_ polynomial distortion convention.</span>

<span class="s">        `Paper IV`_ table lookup distortion correction is not applied,</span>
<span class="s">        even if that information existed in the FITS file that</span>
<span class="s">        initialized this :class:`~astropy.wcs.WCS` object.  To correct</span>
<span class="s">        for that, use `~astropy.wcs.WCS.pix2foc` or</span>
<span class="s">        `~astropy.wcs.WCS.p4_pix2foc`.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>

<span class="s">        {0}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {1}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;focal coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

<div class="viewcode-block" id="WCS.sip_foc2pix"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.sip_foc2pix">[docs]</a>    <span class="k">def</span> <span class="nf">sip_foc2pix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
            <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">args</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&quot;Wrong number of arguments&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_array_converter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sip</span><span class="o">.</span><span class="n">foc2pix</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
    <span class="n">sip_foc2pix</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">        Convert focal plane coordinates to pixel coordinates using the</span>
<span class="s">        `SIP`_ polynomial distortion convention.</span>

<span class="s">        `Paper IV`_ table lookup distortion correction is not applied,</span>
<span class="s">        even if that information existed in the FITS file that</span>
<span class="s">        initialized this `~astropy.wcs.WCS` object.</span>

<span class="s">        Parameters</span>
<span class="s">        ----------</span>

<span class="s">        {0}</span>

<span class="s">        Returns</span>
<span class="s">        -------</span>

<span class="s">        {1}</span>

<span class="s">        Raises</span>
<span class="s">        ------</span>
<span class="s">        MemoryError</span>
<span class="s">            Memory allocation failed.</span>

<span class="s">        ValueError</span>
<span class="s">            Invalid coordinate transformation parameters.</span>
<span class="s">        &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">__</span><span class="o">.</span><span class="n">TWO_OR_MORE_ARGS</span><span class="p">(</span><span class="s">&#39;2&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
                   <span class="n">__</span><span class="o">.</span><span class="n">RETURNS</span><span class="p">(</span><span class="s">&#39;pixel coordinates&#39;</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>

<div class="viewcode-block" id="WCS.to_fits"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.to_fits">[docs]</a>    <span class="k">def</span> <span class="nf">to_fits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relax</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Generate an `astropy.io.fits.HDUList` object with all of the</span>
<span class="sd">        information stored in this object.  This should be logically identical</span>
<span class="sd">        to the input FITS file, but it will be normalized in a number of ways.</span>

<span class="sd">        See `to_header` for some warnings about the output produced.</span>

<span class="sd">        Parameters</span>
<span class="sd">        ----------</span>

<span class="sd">        relax : bool or int, optional</span>
<span class="sd">            Degree of permissiveness:</span>

<span class="sd">            - `False` (default): Write all extensions that are</span>
<span class="sd">              considered to be safe and recommended.</span>

<span class="sd">            - `True`: Write all recognized informal extensions of the</span>
<span class="sd">              WCS standard.</span>

<span class="sd">            - `int`: a bit field selecting specific extensions to</span>
<span class="sd">              write.  See :ref:`relaxwrite` for details.</span>

<span class="sd">        Returns</span>
<span class="sd">        -------</span>
<span class="sd">        hdulist : `astropy.io.fits.HDUList`</span>
<span class="sd">        &quot;&quot;&quot;</span>

        <span class="n">header</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">(</span><span class="n">relax</span><span class="o">=</span><span class="n">relax</span><span class="p">)</span>

        <span class="n">hdu</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">PrimaryHDU</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="n">header</span><span class="p">)</span>
        <span class="n">hdulist</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">HDUList</span><span class="p">(</span><span class="n">hdu</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">_write_det2im</span><span class="p">(</span><span class="n">hdulist</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_write_distortion_kw</span><span class="p">(</span><span class="n">hdulist</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">hdulist</span>
</div>
<div class="viewcode-block" id="WCS.to_header"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.to_header">[docs]</a>    <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relax</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Generate an `astropy.io.fits.Header` object with the basic WCS and SIP</span>
<span class="sd">        information stored in this object.  This should be logically</span>
<span class="sd">        identical to the input FITS file, but it will be normalized in</span>
<span class="sd">        a number of ways.</span>

<span class="sd">        .. warning::</span>

<span class="sd">          This function does not write out Paper IV distortion</span>
<span class="sd">          information, since that requires multiple FITS header data</span>
<span class="sd">          units.  To get a full representation of everything in this</span>
<span class="sd">          object, use `to_fits`.</span>

<span class="sd">        Parameters</span>
<span class="sd">        ----------</span>
<span class="sd">        relax : bool or int, optional</span>
<span class="sd">            Degree of permissiveness:</span>

<span class="sd">            - `False` (default): Write all extensions that are</span>
<span class="sd">              considered to be safe and recommended.</span>

<span class="sd">            - `True`: Write all recognized informal extensions of the</span>
<span class="sd">              WCS standard.</span>

<span class="sd">            - `int`: a bit field selecting specific extensions to</span>
<span class="sd">              write.  See :ref:`relaxwrite` for details.</span>

<span class="sd">        Returns</span>
<span class="sd">        -------</span>
<span class="sd">        header : `astropy.io.fits.Header`</span>

<span class="sd">        Notes</span>
<span class="sd">        -----</span>
<span class="sd">        The output header will almost certainly differ from the input in a</span>
<span class="sd">        number of respects:</span>

<span class="sd">          1. The output header only contains WCS-related keywords.  In</span>
<span class="sd">             particular, it does not contain syntactically-required</span>
<span class="sd">             keywords such as ``SIMPLE``, ``NAXIS``, ``BITPIX``, or</span>
<span class="sd">             ``END``.</span>

<span class="sd">          2. Deprecated (e.g. ``CROTAn``) or non-standard usage will</span>
<span class="sd">             be translated to standard (this is partially dependent on</span>
<span class="sd">             whether `fix` was applied).</span>

<span class="sd">          3. Quantities will be converted to the units used internally,</span>
<span class="sd">             basically SI with the addition of degrees.</span>

<span class="sd">          4. Floating-point quantities may be given to a different decimal</span>
<span class="sd">             precision.</span>

<span class="sd">          5. Elements of the ``PCi_j`` matrix will be written if and</span>
<span class="sd">             only if they differ from the unit matrix.  Thus, if the</span>
<span class="sd">             matrix is unity then no elements will be written.</span>

<span class="sd">          6. Additional keywords such as ``WCSAXES``, ``CUNITia``,</span>
<span class="sd">             ``LONPOLEa`` and ``LATPOLEa`` may appear.</span>

<span class="sd">          7. The original keycomments will be lost, although</span>
<span class="sd">             `to_header` tries hard to write meaningful comments.</span>

<span class="sd">          8. Keyword order may be changed.</span>
<span class="sd">        &quot;&quot;&quot;</span>

        <span class="k">if</span> <span class="n">relax</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">True</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">do_sip</span> <span class="o">=</span> <span class="n">relax</span> <span class="o">&amp;</span> <span class="n">WCSHDO_SIP</span>
            <span class="n">relax</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="n">WCSHDO_SIP</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">do_sip</span> <span class="o">=</span> <span class="n">relax</span>

        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">header_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">to_header</span><span class="p">(</span><span class="n">relax</span><span class="p">)</span>
            <span class="n">header</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">header_string</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">header</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="p">()</span>

        <span class="k">if</span> <span class="n">do_sip</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">sip</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_sip_kw</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="n">header</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">header</span>
</div>
<div class="viewcode-block" id="WCS.to_header_string"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.to_header_string">[docs]</a>    <span class="k">def</span> <span class="nf">to_header_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relax</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Identical to `to_header`, but returns a string containing the</span>
<span class="sd">        header cards.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">(</span><span class="n">relax</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="WCS.footprint_to_file"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.footprint_to_file">[docs]</a>    <span class="k">def</span> <span class="nf">footprint_to_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">&#39;green&#39;</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Writes out a `ds9`_ style regions file. It can be loaded</span>
<span class="sd">        directly by `ds9`_.</span>

<span class="sd">        Parameters</span>
<span class="sd">        ----------</span>
<span class="sd">        filename : string, optional</span>
<span class="sd">            Output file name - default is ``&#39;footprint.reg&#39;``</span>

<span class="sd">        color : string, optional</span>
<span class="sd">            Color to use when plotting the line.</span>

<span class="sd">        width : int, optional</span>
<span class="sd">            Width of the region line.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span><span class="p">:</span>
            <span class="n">filename</span> <span class="o">=</span> <span class="s">&#39;footprint.reg&#39;</span>
        <span class="n">comments</span> <span class="o">=</span> <span class="s">&#39;# Region file format: DS9 version 4.0 </span><span class="se">\n</span><span class="s">&#39;</span>
        <span class="n">comments</span> <span class="o">+=</span> <span class="p">(</span><span class="s">&#39;# global color=green font=&quot;helvetica 12 bold &#39;</span> <span class="o">+</span>
                     <span class="s">&#39;select=1 highlite=1 edit=1 move=1 delete=1 &#39;</span> <span class="o">+</span>
                     <span class="s">&#39;include=1 fixed=0 source</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>

        <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;a&#39;</span><span class="p">)</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">comments</span><span class="p">)</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;linear</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;polygon(&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">footprint</span><span class="o">.</span><span class="n">tofile</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39;,&#39;</span><span class="p">)</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;) # color={0}, width={1:d} </span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">color</span><span class="p">,</span> <span class="n">width</span><span class="p">))</span>
        <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</div>
    <span class="n">naxis1</span> <span class="o">=</span> <span class="n">deprecated_attribute</span><span class="p">(</span><span class="s">&#39;naxis1&#39;</span><span class="p">,</span> <span class="s">&#39;0.2&#39;</span><span class="p">)</span>
    <span class="n">naxis2</span> <span class="o">=</span> <span class="n">deprecated_attribute</span><span class="p">(</span><span class="s">&#39;naxis2&#39;</span><span class="p">,</span> <span class="s">&#39;0.2&#39;</span><span class="p">)</span>

    <span class="nd">@deprecated</span><span class="p">(</span><span class="s">&#39;0.2&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s">&#39;This method should not be public&#39;</span><span class="p">)</span>
<div class="viewcode-block" id="WCS.get_naxis"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.get_naxis">[docs]</a>    <span class="k">def</span> <span class="nf">get_naxis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_naxis</span><span class="p">(</span><span class="n">header</span><span class="o">=</span><span class="n">header</span><span class="p">)</span>
</div>
    <span class="k">def</span> <span class="nf">_get_naxis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_naxis1</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_naxis2</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">if</span> <span class="n">header</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">naxis1</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NAXIS1&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">naxis2</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NAXIS2&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>

<div class="viewcode-block" id="WCS.rotateCD"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.rotateCD">[docs]</a>    <span class="k">def</span> <span class="nf">rotateCD</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
        <span class="n">_theta</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">deg2rad</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
        <span class="n">_mrot</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">double</span><span class="p">)</span>
        <span class="n">_mrot</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">_theta</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">_theta</span><span class="p">))</span>
        <span class="n">_mrot</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">_theta</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">_theta</span><span class="p">))</span>
        <span class="n">new_cd</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span><span class="p">,</span> <span class="n">_mrot</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span> <span class="o">=</span> <span class="n">new_cd</span>
</div>
<div class="viewcode-block" id="WCS.printwcs"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.printwcs">[docs]</a>    <span class="k">def</span> <span class="nf">printwcs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Temporary function for internal use.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">print</span><span class="p">(</span><span class="s">&#39;WCS Keywords</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="p">,</span> <span class="s">&#39;cd&#39;</span><span class="p">):</span>
            <span class="k">print</span><span class="p">(</span><span class="s">&#39;CD_11  CD_12: {!r} {!r}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]))</span>
            <span class="k">print</span><span class="p">(</span><span class="s">&#39;CD_21  CD_22: {!r} {!r}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">cd</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]))</span>
        <span class="k">print</span><span class="p">(</span><span class="s">&#39;CRVAL    : {!r} {!r}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">crval</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
        <span class="k">print</span><span class="p">(</span><span class="s">&#39;CRPIX    : {!r} {!r}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">crpix</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
        <span class="k">print</span><span class="p">(</span><span class="s">&#39;NAXIS    : {!r} {!r}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">naxis1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">naxis2</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="WCS.get_axis_types"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.WCS.html#astropy.wcs.wcs.WCS.get_axis_types">[docs]</a>    <span class="k">def</span> <span class="nf">get_axis_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Similar to `self.wcsprm.axis_types &lt;_wcs.Wcsprm.axis_types&gt;`</span>
<span class="sd">        but provides the information in a more Python-friendly format.</span>

<span class="sd">        Returns</span>
<span class="sd">        -------</span>
<span class="sd">        result : list of dicts</span>

<span class="sd">            Returns a list of dictionaries, one for each axis, each</span>
<span class="sd">            containing attributes about the type of that axis.</span>

<span class="sd">            Each dictionary has the following keys:</span>

<span class="sd">            - &#39;coordinate_type&#39;:</span>

<span class="sd">              - None: Non-specific coordinate type.</span>

<span class="sd">              - &#39;stokes&#39;: Stokes coordinate.</span>

<span class="sd">              - &#39;celestial&#39;: Celestial coordinate (including ``CUBEFACE``).</span>

<span class="sd">              - &#39;spectral&#39;: Spectral coordinate.</span>

<span class="sd">            - &#39;scale&#39;:</span>

<span class="sd">              - &#39;linear&#39;: Linear axis.</span>

<span class="sd">              - &#39;quantized&#39;: Quantized axis (``STOKES``, ``CUBEFACE``).</span>

<span class="sd">              - &#39;non-linear celestial&#39;: Non-linear celestial axis.</span>

<span class="sd">              - &#39;non-linear spectral&#39;: Non-linear spectral axis.</span>

<span class="sd">              - &#39;logarithmic&#39;: Logarithmic axis.</span>

<span class="sd">              - &#39;tabular&#39;: Tabular axis.</span>

<span class="sd">            - &#39;group&#39;</span>

<span class="sd">              - Group number, e.g. lookup table number</span>

<span class="sd">            - &#39;number&#39;</span>

<span class="sd">              - For celestial axes:</span>

<span class="sd">                - 0: Longitude coordinate.</span>

<span class="sd">                - 1: Latitude coordinate.</span>

<span class="sd">                - 2: ``CUBEFACE`` number.</span>

<span class="sd">              - For lookup tables:</span>

<span class="sd">                - the axis number in a multidimensional table.</span>

<span class="sd">            ``CTYPEia`` in ``&quot;4-3&quot;`` form with unrecognized algorithm code will</span>
<span class="sd">            generate an error.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
                <span class="s">&quot;This WCS object does not have a wcsprm object.&quot;</span><span class="p">)</span>

        <span class="n">coordinate_type_map</span> <span class="o">=</span> <span class="p">{</span>
            <span class="mi">0</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
            <span class="mi">1</span><span class="p">:</span> <span class="s">&#39;stokes&#39;</span><span class="p">,</span>
            <span class="mi">2</span><span class="p">:</span> <span class="s">&#39;celestial&#39;</span><span class="p">,</span>
            <span class="mi">3</span><span class="p">:</span> <span class="s">&#39;spectral&#39;</span><span class="p">}</span>

        <span class="n">scale_map</span> <span class="o">=</span> <span class="p">{</span>
            <span class="mi">0</span><span class="p">:</span> <span class="s">&#39;linear&#39;</span><span class="p">,</span>
            <span class="mi">1</span><span class="p">:</span> <span class="s">&#39;quantized&#39;</span><span class="p">,</span>
            <span class="mi">2</span><span class="p">:</span> <span class="s">&#39;non-linear celestial&#39;</span><span class="p">,</span>
            <span class="mi">3</span><span class="p">:</span> <span class="s">&#39;non-linear spectral&#39;</span><span class="p">,</span>
            <span class="mi">4</span><span class="p">:</span> <span class="s">&#39;logarithmic&#39;</span><span class="p">,</span>
            <span class="mi">5</span><span class="p">:</span> <span class="s">&#39;tabular&#39;</span><span class="p">}</span>

        <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">axis_type</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">wcs</span><span class="o">.</span><span class="n">axis_types</span><span class="p">:</span>
            <span class="n">subresult</span> <span class="o">=</span> <span class="p">{}</span>

            <span class="n">coordinate_type</span> <span class="o">=</span> <span class="p">(</span><span class="n">axis_type</span> <span class="o">//</span> <span class="mi">1000</span><span class="p">)</span> <span class="o">%</span> <span class="mi">10</span>
            <span class="n">subresult</span><span class="p">[</span><span class="s">&#39;coordinate_type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">coordinate_type_map</span><span class="p">[</span><span class="n">coordinate_type</span><span class="p">]</span>

            <span class="n">scale</span> <span class="o">=</span> <span class="p">(</span><span class="n">axis_type</span> <span class="o">//</span> <span class="mi">100</span><span class="p">)</span> <span class="o">%</span> <span class="mi">10</span>
            <span class="n">subresult</span><span class="p">[</span><span class="s">&#39;scale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">scale_map</span><span class="p">[</span><span class="n">scale</span><span class="p">]</span>

            <span class="n">group</span> <span class="o">=</span> <span class="p">(</span><span class="n">axis_type</span> <span class="o">//</span> <span class="mi">10</span><span class="p">)</span> <span class="o">%</span> <span class="mi">10</span>
            <span class="n">subresult</span><span class="p">[</span><span class="s">&#39;group&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">group</span>

            <span class="n">number</span> <span class="o">=</span> <span class="n">axis_type</span> <span class="o">%</span> <span class="mi">10</span>
            <span class="n">subresult</span><span class="p">[</span><span class="s">&#39;number&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">number</span>

            <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subresult</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">result</span>
</div>
    <span class="k">def</span> <span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Support pickling of WCS objects.  This is done by serializing</span>
<span class="sd">        to an in-memory FITS file and dumping that as a string.</span>
<span class="sd">        &quot;&quot;&quot;</span>

        <span class="n">hdulist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_fits</span><span class="p">(</span><span class="n">relax</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

        <span class="nb">buffer</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">()</span>
        <span class="n">hdulist</span><span class="o">.</span><span class="n">writeto</span><span class="p">(</span><span class="nb">buffer</span><span class="p">)</span>

        <span class="k">return</span> <span class="p">(</span><span class="n">__WCS_unpickle__</span><span class="p">,</span>
                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">,</span> <span class="nb">buffer</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(),))</span>

</div>
<span class="k">def</span> <span class="nf">__WCS_unpickle__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">dct</span><span class="p">,</span> <span class="n">fits_data</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Unpickles a WCS object from a serialized FITS string.</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="bp">self</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">dct</span><span class="p">)</span>

    <span class="nb">buffer</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">(</span><span class="n">fits_data</span><span class="p">)</span>
    <span class="n">hdulist</span> <span class="o">=</span> <span class="n">fits</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="nb">buffer</span><span class="p">)</span>

    <span class="n">WCS</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hdulist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">header</span><span class="p">,</span> <span class="n">hdulist</span><span class="p">)</span>

    <span class="k">return</span> <span class="bp">self</span>


<div class="viewcode-block" id="find_all_wcs"><a class="viewcode-back" href="../../../_generated/astropy.wcs.wcs.find_all_wcs.html#astropy.wcs.wcs.find_all_wcs">[docs]</a><span class="k">def</span> <span class="nf">find_all_wcs</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">relax</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">keysel</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Find all the WCS transformations in the given header.</span>

<span class="sd">    Parameters</span>
<span class="sd">    ----------</span>
<span class="sd">    header : string or astropy.io.fits header object.</span>

<span class="sd">    relax : bool or int, optional</span>
<span class="sd">        Degree of permissiveness:</span>

<span class="sd">        - `True` (default): Admit all recognized informal extensions of the</span>
<span class="sd">          WCS standard.</span>

<span class="sd">        - `False`: Recognize only FITS keywords defined by the</span>
<span class="sd">          published WCS standard.</span>

<span class="sd">        - `int`: a bit field selecting specific extensions to accept.</span>
<span class="sd">          See :ref:`relaxread` for details.</span>

<span class="sd">    keysel : sequence of flags, optional</span>
<span class="sd">        A list of flags used to select the keyword types considered by</span>
<span class="sd">        wcslib.  When ``None``, only the standard image header</span>
<span class="sd">        keywords are considered (and the underlying wcspih() C</span>
<span class="sd">        function is called).  To use binary table image array or pixel</span>
<span class="sd">        list keywords, *keysel* must be set.</span>

<span class="sd">        Each element in the list should be one of the following strings:</span>

<span class="sd">            - &#39;image&#39;: Image header keywords</span>

<span class="sd">            - &#39;binary&#39;: Binary table image array keywords</span>

<span class="sd">            - &#39;pixel&#39;: Pixel list keywords</span>

<span class="sd">        Keywords such as ``EQUIna`` or ``RFRQna`` that are common to</span>
<span class="sd">        binary table image arrays and pixel lists (including</span>
<span class="sd">        ``WCSNna`` and ``TWCSna``) are selected by both &#39;binary&#39; and</span>
<span class="sd">        &#39;pixel&#39;.</span>

<span class="sd">    Returns</span>
<span class="sd">    -------</span>
<span class="sd">    wcses : list of `WCS` objects</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
        <span class="n">header_string</span> <span class="o">=</span> <span class="n">header</span>
    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">fits</span><span class="o">.</span><span class="n">Header</span><span class="p">):</span>
        <span class="n">header_string</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">tostring</span><span class="p">()</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
            <span class="s">&quot;header must be a string or astropy.io.fits.Header object&quot;</span><span class="p">)</span>

    <span class="n">keysel_flags</span> <span class="o">=</span> <span class="n">_parse_keysel</span><span class="p">(</span><span class="n">keysel</span><span class="p">)</span>

    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">header_string</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
        <span class="n">header_bytes</span> <span class="o">=</span> <span class="n">header_string</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;ascii&#39;</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">header_bytes</span> <span class="o">=</span> <span class="n">header_string</span>

    <span class="n">wcsprms</span> <span class="o">=</span> <span class="n">_wcs</span><span class="o">.</span><span class="n">find_all_wcs</span><span class="p">(</span><span class="n">header_bytes</span><span class="p">,</span> <span class="n">relax</span><span class="p">,</span> <span class="n">keysel_flags</span><span class="p">)</span>

    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">wcsprm</span> <span class="ow">in</span> <span class="n">wcsprms</span><span class="p">:</span>
        <span class="n">subresult</span> <span class="o">=</span> <span class="n">WCS</span><span class="p">()</span>
        <span class="n">subresult</span><span class="o">.</span><span class="n">wcs</span> <span class="o">=</span> <span class="n">wcsprm</span>
        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subresult</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">result</span></div>
</pre></div>

          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper"><h3>Page Contents</h3>


        </div>
      </div>
      <div class="clearer"></div>
    </div>
<footer class="footer">
  <p class="pull-right"> &nbsp;
    <a href="#">Back to Top</a></p>
  <p>
    &copy; Copyright 2011-2013, The Astropy Developers.<br/>
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. &nbsp;
    Last built 22 Oct 2013. <br/>
  </p>
</footer>
  </body>
</html>