<!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.coordinates.angles — 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="Module code" href="../../index.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> » </li> <li><a href="../../index.html" accesskey="U">Module code</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <h1>Source code for astropy.coordinates.angles</h1><div class="highlight"><pre> <span class="c"># -*- coding: utf-8 -*-</span> <span class="c"># Licensed under a 3-clause BSD style license - see LICENSE.rst</span> <span class="sd">"""</span> <span class="sd">This module contains the fundamental classes used for representing</span> <span class="sd">coordinates in astropy.</span> <span class="sd">"""</span> <span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">unicode_literals</span> <span class="kn">import</span> <span class="nn">math</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span> <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">angle_utilities</span> <span class="k">as</span> <span class="n">util</span> <span class="kn">from</span> <span class="nn">.errors</span> <span class="kn">import</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">units</span> <span class="k">as</span> <span class="n">u</span> <span class="kn">from</span> <span class="nn">..utils.compat.odict</span> <span class="kn">import</span> <span class="n">OrderedDict</span> <span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">'Angle'</span><span class="p">,</span> <span class="s">'RA'</span><span class="p">,</span> <span class="s">'Dec'</span><span class="p">,</span> <span class="s">'AngularSeparation'</span><span class="p">]</span> <span class="n">TWOPI</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">*</span> <span class="mf">2.0</span> <span class="c"># no need to calculate this all the time</span> <div class="viewcode-block" id="Angle"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle">[docs]</a><span class="k">class</span> <span class="nc">Angle</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">""" An angle.</span> <span class="sd"> An angle can be specified either as a float, tuple (see below),</span> <span class="sd"> or string. If A string, it must be in one of the following formats:</span> <span class="sd"> * '1:2:3.4'</span> <span class="sd"> * '1 2 3.4'</span> <span class="sd"> * '1h2m3.4s'</span> <span class="sd"> * '1d2m3.4s'</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> angle : float, int, str, tuple</span> <span class="sd"> The angle value. If a tuple, will be interpreted as (h, m s) or</span> <span class="sd"> (d, m, s) depending on `unit`. If a string, it will be interpreted</span> <span class="sd"> following the rules described above.</span> <span class="sd"> unit : `~astropy.units.UnitBase`, str</span> <span class="sd"> The unit of the value specified for the angle. This may be any</span> <span class="sd"> string that `~astropy.units.Unit` understands, but it is better to</span> <span class="sd"> give an actual unit object. Must be one of `~astropy.units.degree`,</span> <span class="sd"> `~astropy.units.radian`, or `~astropy.units.hour`.</span> <span class="sd"> bounds : tuple</span> <span class="sd"> A tuple indicating the upper and lower value that the new angle object may</span> <span class="sd"> have.</span> <span class="sd"> Raises</span> <span class="sd"> ------</span> <span class="sd"> `~astropy.coordinates.errors.UnitsError`</span> <span class="sd"> If a unit is not provided or it is not hour, radian, or degree.</span> <span class="sd"> """</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">angle</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">360</span><span class="p">,</span> <span class="mi">360</span><span class="p">)):</span> <span class="kn">from</span> <span class="nn">..utils</span> <span class="kn">import</span> <span class="n">isiterable</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bounds</span> <span class="o">=</span> <span class="n">bounds</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">Angle</span><span class="p">):</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">angle</span><span class="o">.</span><span class="n">radians</span> <span class="n">unit</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">radian</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_array</span> <span class="o">=</span> <span class="p">(</span><span class="n">isiterable</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">))</span> <span class="c"># short circuit arrays for now</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_array</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"Angles as arrays are not yet supported."</span><span class="p">)</span> <span class="c"># -------------------------------</span> <span class="c"># unit validation and angle value</span> <span class="c"># -------------------------------</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">unit</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">Unit</span><span class="p">(</span><span class="n">unit</span><span class="p">)</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">hour</span><span class="p">:</span> <span class="n">unit</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">hourangle</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span> <span class="n">angle</span><span class="p">,</span> <span class="n">found_unit</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">parse_angle</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">unit</span><span class="p">)</span> <span class="n">unit</span> <span class="o">=</span> <span class="n">found_unit</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">hourangle</span><span class="p">:</span> <span class="n">util</span><span class="o">.</span><span class="n">check_hms_ranges</span><span class="p">(</span><span class="o">*</span><span class="n">angle</span><span class="p">)</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">hms_to_hours</span><span class="p">(</span><span class="o">*</span><span class="n">angle</span><span class="p">)</span> <span class="k">elif</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">:</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">dms_to_degrees</span><span class="p">(</span><span class="o">*</span><span class="n">angle</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnitsError</span><span class="p">(</span> <span class="s">"Can not parse '{0}' as unit '{1}'"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">angle</span><span class="p">,</span> <span class="n">unit</span><span class="p">))</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnitsError</span><span class="p">(</span><span class="s">"No unit was specified in Angle initializer; the "</span> <span class="s">"unit parameter should be an object from the astropy.units "</span> <span class="s">"module (e.g. 'from astropy import units as u', then use "</span> <span class="s">"'u.degree')."</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_array</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># already performed conversions to radians above</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o">=</span> <span class="n">unit</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span> <span class="c"># ---------------</span> <span class="c"># bounds checking</span> <span class="c"># ---------------</span> <span class="c"># TODO: handle arrays</span> <span class="c"># handle bounds units, convert to radians</span> <span class="k">if</span> <span class="n">bounds</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># no range checking performed</span> <span class="k">else</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">:</span> <span class="n">lower_bound</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">upper_bound</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">elif</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">:</span> <span class="n">lower_bound</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">upper_bound</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">elif</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">hourangle</span><span class="p">:</span> <span class="n">lower_bound</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mf">15.</span><span class="p">)</span> <span class="n">upper_bound</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="mf">15.</span><span class="p">)</span> <span class="c"># invalid units handled above</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">"Bounds specified for Angle must be a two element list, "</span> <span class="s">"e.g. [0,360] (was given '{0}')."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">bounds</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="c"># bounds check</span> <span class="k">if</span> <span class="n">lower_bound</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o"><</span> <span class="n">upper_bound</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># looks good</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">_radians</span> <span class="o">></span> <span class="n">upper_bound</span><span class="p">:</span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o">-=</span> <span class="n">TWOPI</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o"><</span> <span class="n">lower_bound</span><span class="p">:</span> <span class="k">raise</span> <span class="n">BoundsError</span><span class="p">(</span><span class="s">"The angle given falls outside of the specified bounds."</span><span class="p">)</span> <span class="k">elif</span> <span class="n">lower_bound</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o"><</span> <span class="n">upper_bound</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o"><</span> <span class="n">lower_bound</span><span class="p">:</span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o">+=</span> <span class="n">TWOPI</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o">></span> <span class="n">upper_bound</span><span class="p">:</span> <span class="k">raise</span> <span class="n">BoundsError</span><span class="p">(</span><span class="s">"The angle given falls outside of the specified bounds."</span><span class="p">)</span> <span class="k">elif</span> <span class="n">lower_bound</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> <span class="o"><</span> <span class="n">upper_bound</span><span class="p">:</span> <span class="k">break</span> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.bounds"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.bounds">[docs]</a> <span class="k">def</span> <span class="nf">bounds</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""" The angle's bounds, an immutable property. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bounds</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.degrees"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.degrees">[docs]</a> <span class="k">def</span> <span class="nf">degrees</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" The angle's value in degrees (read-only property). """</span> <span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">degrees</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">)</span> <span class="c"># converts radians to degrees</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.radians"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.radians">[docs]</a> <span class="k">def</span> <span class="nf">radians</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" The angle's value in radians (read-only property). """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_radians</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.hours"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.hours">[docs]</a> <span class="k">def</span> <span class="nf">hours</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" The angle's value in hours (read-only property). """</span> <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">radians_to_hours</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">)</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.hms"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.hms">[docs]</a> <span class="k">def</span> <span class="nf">hms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" The angle's value in hours, and print as an (h,m,s) tuple (read-only property). """</span> <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">radians_to_hms</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">)</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Angle.dms"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.dms">[docs]</a> <span class="k">def</span> <span class="nf">dms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" The angle's value in degrees, and print as an (d,m,s) tuple (read-only property). """</span> <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">radians_to_dms</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">)</span> </div> <div class="viewcode-block" id="Angle.format"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle.format">[docs]</a> <span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">decimal</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">'fromunit'</span><span class="p">,</span> <span class="n">precision</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">alwayssign</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">pad</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="sd">""" A string representation of the angle.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> units : `~astropy.units.UnitBase`</span> <span class="sd"> Specifies the units, should be 'degree', 'hour', or 'radian'</span> <span class="sd"> decimal : bool</span> <span class="sd"> If True, a decimal respresentation will be used, otherwise</span> <span class="sd"> the returned string will be in sexagesimal form.</span> <span class="sd"> sep : str</span> <span class="sd"> The separator between numbers in a sexagesimal representation.</span> <span class="sd"> E.g., if it is ':', the result is "12:41:11.1241". Also accepts</span> <span class="sd"> 2 or 3 separators. E.g., ``sep='hms'`` would give the result</span> <span class="sd"> "12h41m11.1241s", or sep='-:' would yield "11-21:17.124".</span> <span class="sd"> Alternatively, the special string 'fromunit' means 'dms' if</span> <span class="sd"> the unit is degrees, or 'hms' if the unit is hours.</span> <span class="sd"> precision : int</span> <span class="sd"> The level of decimal precision. if `decimal` is True, this is</span> <span class="sd"> the raw precision, otherwise it gives the precision of the last</span> <span class="sd"> place of the sexagesimal representation (seconds).</span> <span class="sd"> alwayssign : bool</span> <span class="sd"> If True, include the sign no matter what. If False, only</span> <span class="sd"> include the sign if it is necessary (negative).</span> <span class="sd"> pad : bool</span> <span class="sd"> If True, include leading zeros when needed to ensure a fixed</span> <span class="sd"> number of characters for sexagesimal representation.</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> strrepr : str</span> <span class="sd"> A string representation of the angle.</span> <span class="sd"> """</span> <span class="n">unit</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">Unit</span><span class="p">(</span><span class="n">unit</span><span class="p">)</span> <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">:</span> <span class="k">if</span> <span class="n">decimal</span><span class="p">:</span> <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="s">"{0:0."</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">precision</span><span class="p">)</span> <span class="o">+</span> <span class="s">"}"</span><span class="p">)</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">degrees</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">sep</span> <span class="o">==</span> <span class="s">'fromunit'</span><span class="p">:</span> <span class="n">sep</span> <span class="o">=</span> <span class="s">'dms'</span> <span class="n">res</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">degrees_to_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">precision</span><span class="o">=</span><span class="n">precision</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="n">sep</span><span class="p">,</span> <span class="n">pad</span><span class="o">=</span><span class="n">pad</span><span class="p">)</span> <span class="k">elif</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">:</span> <span class="k">if</span> <span class="n">decimal</span><span class="p">:</span> <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="s">"{0:0."</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">precision</span><span class="p">)</span> <span class="o">+</span> <span class="s">"}"</span><span class="p">)</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">radians</span><span class="p">)</span> <span class="k">elif</span> <span class="n">sep</span> <span class="o">==</span> <span class="s">'fromunit'</span><span class="p">:</span> <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="s">"{0:0."</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">precision</span><span class="p">)</span> <span class="o">+</span> <span class="s">"}"</span><span class="p">)</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">radians</span><span class="p">)</span> <span class="o">+</span> <span class="s">'radian'</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">'Radians cannot be in sexagesimal representation'</span><span class="p">)</span> <span class="k">elif</span> <span class="n">unit</span> <span class="ow">is</span> <span class="n">u</span><span class="o">.</span><span class="n">hour</span><span class="p">:</span> <span class="k">if</span> <span class="n">decimal</span><span class="p">:</span> <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="s">"{0:0."</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">precision</span><span class="p">)</span> <span class="o">+</span> <span class="s">"}"</span><span class="p">)</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">hours</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">sep</span> <span class="o">==</span> <span class="s">'fromunit'</span><span class="p">:</span> <span class="n">sep</span> <span class="o">=</span> <span class="s">'hms'</span> <span class="n">res</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">hours_to_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">hours</span><span class="p">,</span> <span class="n">precision</span><span class="o">=</span><span class="n">precision</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="n">sep</span><span class="p">,</span> <span class="n">pad</span><span class="o">=</span><span class="n">pad</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnitsError</span><span class="p">(</span><span class="s">"The unit value provided was not one of u.degree, u.hour, u.radian'."</span><span class="p">)</span> <span class="k">if</span> <span class="n">alwayssign</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">res</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'-'</span><span class="p">):</span> <span class="k">return</span> <span class="s">'+'</span> <span class="o">+</span> <span class="n">res</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">res</span> </div> <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">()</span> <span class="c"># ----------------------------------------------------------------------------</span> <span class="c"># Emulating numeric types</span> <span class="c"># -----------------------</span> <span class="c"># Ref: http://docs.python.org/reference/datamodel.html#emulating-numeric-types</span> <span class="c"># ----------------------------------------------------------------------------</span> <span class="c"># Addition</span> <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bounds</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"Can't add angles because bounds don't match: {0} and {1}"</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</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">bounds</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">+</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bounds</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be added to another "</span> <span class="s">"{0} object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__add__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c"># Subtraction</span> <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">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bounds</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"Can't add angles because bounds don't match: {0} and {1}"</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</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">bounds</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">-</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bounds</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be subtracted from another "</span> <span class="s">"{0} object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bounds</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"Can't add angles because bounds don't match: {0} and {1}"</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</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">bounds</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">bounds</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bounds</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be subtracted from another "</span> <span class="s">"{0} object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="c"># Multiplication</span> <span class="k">def</span> <span class="nf">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"Multiplication is not supported between two {0} "</span> <span class="s">"objects "</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">*</span> <span class="n">other</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be multiplied by a float or integer."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__mul__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c"># Division</span> <span class="k">def</span> <span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"Division is not supported between two {0} "</span> <span class="s">"objects."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">/</span> <span class="n">other</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be divided by a float or integer."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__rdiv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"Division is not supported between two {0} "</span> <span class="s">"objects."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="n">other</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be divided by a float or integer."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__div__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__rtruediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__rdiv__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c"># other operations</span> <span class="k">def</span> <span class="nf">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Angle</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="k">if</span> <span class="n">other</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"To compare {0} objects, compare their "</span> <span class="s">"float values directly."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="c"># return not self.radians == other.radians</span> <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o"><</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be compared to another {0} "</span> <span class="s">"object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">></span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be compared to another {0} "</span> <span class="s">"object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__ge__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o">>=</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be compared to another {0} "</span> <span class="s">"object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__le__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span> <span class="o"><=</span> <span class="n">other</span><span class="o">.</span><span class="n">radians</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"An {0} object can only be compared to another {0} "</span> <span class="s">"object."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__abs__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">),</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">"<{0} {1:.5f} deg>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">degrees</span><span class="p">)</span> </div> <div class="viewcode-block" id="RA"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.RA.html#astropy.coordinates.angles.RA">[docs]</a><span class="k">class</span> <span class="nc">RA</span><span class="p">(</span><span class="n">Angle</span><span class="p">):</span> <span class="sd">""" An object that represents a right ascension angle.</span> <span class="sd"> This object can be created from a numeric value along with a unit. If the</span> <span class="sd"> value specified is greater than "24", then a unit of degrees is assumed. Bounds</span> <span class="sd"> are fixed to [0,360] degrees.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> angle : float, int, str, tuple</span> <span class="sd"> The angle value. If a tuple, will be interpreted as (h, m s) or</span> <span class="sd"> (d, m, s) depending on `unit`. If a string, it will be interpreted</span> <span class="sd"> following the rules described above.</span> <span class="sd"> unit : `~astropy.units.UnitBase`, str</span> <span class="sd"> The unit of the value specified for the angle. This may be any</span> <span class="sd"> string that `~astropy.units.Unit` understands, but it is better to</span> <span class="sd"> give an actual unit object. Must be one of `~astropy.units.degree`,</span> <span class="sd"> `~astropy.units.radian`, or `~astropy.units.hour`.</span> <span class="sd"> Raises</span> <span class="sd"> ------</span> <span class="sd"> `~astropy.coordinates.errors.UnitsError`</span> <span class="sd"> If a unit is not provided or it is not hour, radian, or degree.</span> <span class="sd"> """</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">angle</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">RA</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">360</span><span class="p">))</span> <span class="c"># The initializer as originally conceived allowed the unit to be unspecified</span> <span class="c"># if it's bigger than 24, because hours typically aren't past 24.</span> <span class="c"># It is also then implicit that `RA` is usually in hours.</span> <span class="c"># This is commented out for now because in discussion for v0.2 we decided to</span> <span class="c"># keep things simple and just use the same behavior as Angle.</span> <span class="c"># In v0.3 it may be either uncommented,</span> <span class="c"># moved somewhere else, or eliminated completely</span> <span class="c"># TODO: decide if this should stay in or permanently be removed</span> <span class="c">#</span> <span class="c"># def __init__(self, angle, unit=None):</span> <span class="c">#</span> <span class="c"># # This block attempts to determine the validity of the unit,</span> <span class="c"># # particularly with regard to the specifics of RA.</span> <span class="c"># # After this block, the normal Angle initializer handles most of the</span> <span class="c"># # validation/creation.</span> <span class="c">#</span> <span class="c"># if isinstance(angle, Angle):</span> <span class="c"># return super(RA, self).__init__(angle.radians, unit=u.radian, bounds=(0, 360))</span> <span class="c">#</span> <span class="c"># if unit is u.hour:</span> <span class="c"># pass # to Angle initializer</span> <span class="c"># # self._radians = math.radians(decimal_hours * 15.)</span> <span class="c"># elif unit is u.degree:</span> <span class="c"># pass # to Angle initializer</span> <span class="c"># # decimal_degrees = util.parse_degrees(angle)</span> <span class="c"># # self._radians = math.radians(decimal_degrees)</span> <span class="c"># elif unit is u.radian:</span> <span class="c"># pass # to Angle initializer</span> <span class="c"># # self._radians = util.parse_radians(angle)</span> <span class="c">#</span> <span class="c">#</span> <span class="c"># elif unit is None:</span> <span class="c"># # Try to figure out the unit if we can.</span> <span class="c"># if isinstance(angle, float) or isinstance(angle, int):</span> <span class="c"># if angle > 24:</span> <span class="c"># unit = u.degree</span> <span class="c"># else:</span> <span class="c"># raise UnitsError("No units were specified, and the angle value was ambiguous between hours and degrees.")</span> <span class="c"># elif isinstance(angle, basestring):</span> <span class="c"># # Try to deduce the units from hints in the string.</span> <span class="c"># # Further, enforce absolute bounds here, i.e. don't let</span> <span class="c"># # Angle +-2π to see if the angle falls in the bounds.</span> <span class="c"># if "d" in angle or "°" in angle:</span> <span class="c"># # If in the form "12d32m53s", look for the "d" and assume degrees.</span> <span class="c"># angle = math.radians(util.parse_degrees(angle))</span> <span class="c"># if 0 < angle < TWOPI:</span> <span class="c"># unit = u.radian</span> <span class="c"># else:</span> <span class="c"># raise RangeError("The provided angle was assumed to be in degrees, but was out of the range (0,360) degrees.")</span> <span class="c"># elif "h" in angle:</span> <span class="c"># # Same for "12h32m53s" for hours.</span> <span class="c"># # self._radians = math.radians(util.parse_hours(angle)*15.0)</span> <span class="c"># unit = u.hour</span> <span class="c"># else:</span> <span class="c"># # could be in a form: "54:43:26" -</span> <span class="c"># # if so AND the resulting decimal value is > 24 or < -24, assume degrees</span> <span class="c"># decimal_value = util.parse_degrees(angle)</span> <span class="c"># if decimal_value > 24:</span> <span class="c"># unit = u.degree</span> <span class="c"># elif 0 <= decimal_value <= 24.0:</span> <span class="c"># raise UnitsError("No units were specified, and the angle value was ambiguous between hours and degrees.")</span> <span class="c"># elif decimal_value < 0:</span> <span class="c"># raise RangeError("No units were specified; could not assume any since the value was less than zero.")</span> <span class="c"># elif isinstance(angle, tuple):</span> <span class="c"># if len(angle) == 3 and 0 <= angle[0] < 24.0:</span> <span class="c"># raise UnitsError("No units were specified, and the angle value was ambiguous between hours and degrees.")</span> <span class="c"># else:</span> <span class="c"># unit = u.degree</span> <span class="c"># else:</span> <span class="c"># raise ValueError("Angle values of type {0} not supported.".format(type(angle).__name__))</span> <span class="c">#</span> <span class="c"># if unit is None:</span> <span class="c"># raise UnitsError("Units must be specified for RA, one of u.degree, u.hour, or u.radian.")</span> <span class="c">#</span> <span class="c"># # By here, the unit should be defined.</span> <span class="c"># super(RA, self).__init__(angle, unit=unit, bounds=(0, 360))</span> <div class="viewcode-block" id="RA.hour_angle"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.RA.html#astropy.coordinates.angles.RA.hour_angle">[docs]</a> <span class="k">def</span> <span class="nf">hour_angle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lst</span><span class="p">):</span> <span class="sd">""" Computes the hour angle for this RA given a local sidereal</span> <span class="sd"> time (LST).</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> lst : `~astropy.coordinates.angle.Angle`, `~astropy.time.Time`</span> <span class="sd"> A local sidereal time (LST).</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> hour_angle : `~astropy.coordinates.angle.Angle`</span> <span class="sd"> The hour angle for this RA at the LST `lst`.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="s">'mjd'</span><span class="p">):</span> <span class="n">lst</span> <span class="o">=</span> <span class="n">Angle</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">remainder</span><span class="p">(</span><span class="n">lst</span><span class="o">.</span><span class="n">mjd</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">hour</span><span class="p">)</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="n">lst</span><span class="o">.</span><span class="n">radians</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">TWOPI</span><span class="p">))</span> </div> <div class="viewcode-block" id="RA.lst"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.RA.html#astropy.coordinates.angles.RA.lst">[docs]</a> <span class="k">def</span> <span class="nf">lst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hour_angle</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Calculates the local sidereal time (LST) if this RA is at a</span> <span class="sd"> particular hour angle.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> hour_angle : `~astropy.coordinates.angle.Angle`</span> <span class="sd"> An hour angle.</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> lst : `~astropy.coordinates.angle.Angle`</span> <span class="sd"> The local siderial time as an angle.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">Angle</span><span class="p">(</span><span class="n">hour_angle</span><span class="o">.</span><span class="n">radians</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">radians</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">TWOPI</span><span class="p">))</span> </div></div> <div class="viewcode-block" id="Dec"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.Dec.html#astropy.coordinates.angles.Dec">[docs]</a><span class="k">class</span> <span class="nc">Dec</span><span class="p">(</span><span class="n">Angle</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Represents a declination value.</span> <span class="sd"> This object can be created from a numeric value along with a unit, or else a</span> <span class="sd"> string in any commonly represented format, e.g. "12 43 23.53", "-32d52m29s".</span> <span class="sd"> Unless otherwise specified via the 'unit' parameter, degrees are assumed.</span> <span class="sd"> Bounds are fixed to [-90,90] degrees.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> angle : float, int, str, tuple</span> <span class="sd"> The angle value. If a tuple, will be interpreted as (h, m s) or</span> <span class="sd"> (d, m, s) depending on `unit`. If a string, it will be interpreted</span> <span class="sd"> following the rules described above.</span> <span class="sd"> unit : `~astropy.units.UnitBase`, str</span> <span class="sd"> The unit of the value specified for the angle. This may be any</span> <span class="sd"> string that `~astropy.units.Unit` understands, but it is better to</span> <span class="sd"> give an actual unit object. Must be one of `~astropy.units.degree`,</span> <span class="sd"> `~astropy.units.radian`, or `~astropy.units.hour`.</span> <span class="sd"> bounds : tuple</span> <span class="sd"> A tuple indicating the upper and lower value that the new angle object may</span> <span class="sd"> have.</span> <span class="sd"> Raises</span> <span class="sd"> ------</span> <span class="sd"> `~astropy.coordinates.errors.UnitsError`</span> <span class="sd"> If a unit is not provided or it is not hour, radian, or degree.</span> <span class="sd"> """</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">angle</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">Dec</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">,</span> <span class="n">bounds</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">90</span><span class="p">,</span> <span class="mi">90</span><span class="p">))</span> <span class="c"># TODO: do here whatever is decided for the "smart" RA initializer above</span> <span class="c">#</span> <span class="c"># def __init__(self, angle, unit=u.degree):</span> <span class="c"># super(RA, self).__init__(angle, unit=unit, bounds=(0, 360))</span> <span class="c">#</span> <span class="c"># if isinstance(angle, Angle):</span> <span class="c"># return super(Dec, self).__init__(angle.radians, unit=u.radian, bounds=(-90, 90))</span> <span class="c">#</span> <span class="c"># super(Dec, self).__init__(angle, unit=unit, bounds=(-90, 90))</span> </div> <div class="viewcode-block" id="AngularSeparation"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.AngularSeparation.html#astropy.coordinates.angles.AngularSeparation">[docs]</a><span class="k">class</span> <span class="nc">AngularSeparation</span><span class="p">(</span><span class="n">Angle</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> An on-sky separation between two directions.</span> <span class="sd"> .. note::</span> <span class="sd"> This is computed using the Vincenty great circle distance</span> <span class="sd"> formula, and hence should be numerically stable even for</span> <span class="sd"> near antipodal points.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> lat1 : float</span> <span class="sd"> The value of the first latitudinal/elevation angle.</span> <span class="sd"> lon1 : float</span> <span class="sd"> The value of the first longitudinal/azimuthal angle.</span> <span class="sd"> lat2 : float</span> <span class="sd"> The value of the second latitudinal/elevation angle.</span> <span class="sd"> lon2 : float</span> <span class="sd"> The value of the second longitudinal/azimuthal angle.</span> <span class="sd"> units : `~astropy.units`</span> <span class="sd"> The units of the given angles.</span> <span class="sd"> """</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">lat1</span><span class="p">,</span> <span class="n">lon1</span><span class="p">,</span> <span class="n">lat2</span><span class="p">,</span> <span class="n">lon2</span><span class="p">,</span> <span class="n">units</span><span class="p">):</span> <span class="n">units</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">Unit</span><span class="p">(</span><span class="n">units</span><span class="p">)</span> <span class="n">lat1</span> <span class="o">=</span> <span class="n">units</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">lat1</span><span class="p">)</span> <span class="k">if</span> <span class="mi">0</span> <span class="o">==</span> <span class="n">lon1</span> <span class="o">==</span> <span class="n">lat2</span> <span class="o">==</span> <span class="n">lon2</span><span class="p">:</span> <span class="n">sepval</span> <span class="o">=</span> <span class="n">lat1</span> <span class="k">else</span><span class="p">:</span> <span class="n">lon1</span> <span class="o">=</span> <span class="n">units</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">lon1</span><span class="p">)</span> <span class="n">lat2</span> <span class="o">=</span> <span class="n">units</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">lat2</span><span class="p">)</span> <span class="n">lon2</span> <span class="o">=</span> <span class="n">units</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">,</span> <span class="n">lon2</span><span class="p">)</span> <span class="n">sepval</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">vincenty_sphere_dist</span><span class="p">(</span><span class="n">lon1</span><span class="p">,</span> <span class="n">lat1</span><span class="p">,</span> <span class="n">lon2</span><span class="p">,</span> <span class="n">lat2</span><span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">AngularSeparation</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">sepval</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">radian</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">'+ is ambiguous for AngularSeparation objects; not supported'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">'+ is ambiguous for AngularSeparation objects; not supported'</span><span class="p">)</span> <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">other</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">'- is ambiguous for AngularSeparation objects; not supported'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">'- is ambiguous for AngularSeparation objects; not supported'</span><span class="p">)</span> <span class="nd">@property</span> <div class="viewcode-block" id="AngularSeparation.arcmins"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.AngularSeparation.html#astropy.coordinates.angles.AngularSeparation.arcmins">[docs]</a> <span class="k">def</span> <span class="nf">arcmins</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> The value of this separation in arcminutes.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">degrees</span> <span class="o">*</span> <span class="mf">60.</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="AngularSeparation.arcsecs"><a class="viewcode-back" href="../../../_generated/astropy.coordinates.angles.AngularSeparation.html#astropy.coordinates.angles.AngularSeparation.arcsecs">[docs]</a> <span class="k">def</span> <span class="nf">arcsecs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> The value of this separation in arcseconds.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">degrees</span> <span class="o">*</span> <span class="mf">3600.</span> <span class="c">#<----------------------------------Rotations----------------------------------></span> </div></div> <span class="k">def</span> <span class="nf">rotation_matrix</span><span class="p">(</span><span class="n">angle</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="s">'z'</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Generate a 3x3 cartesian rotation matrix in for rotation about</span> <span class="sd"> a particular axis.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> angle : scalar</span> <span class="sd"> The amount of rotation this matrix should represent. In degrees</span> <span class="sd"> if `degrees` is True, otherwise radians.</span> <span class="sd"> axis : str or 3-sequence</span> <span class="sd"> Either 'x','y', 'z', or a (x,y,z) specifying an axis to rotate</span> <span class="sd"> about. If 'x','y', or 'z', the rotation sense is</span> <span class="sd"> counterclockwise looking down the + axis (e.g. positive</span> <span class="sd"> rotations obey left-hand-rule).</span> <span class="sd"> degrees : bool</span> <span class="sd"> If True the input angle is degrees, otherwise radians.</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> rmat: `numpy.matrix`</span> <span class="sd"> A unitary rotation matrix.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sin</span><span class="p">,</span> <span class="n">cos</span><span class="p">,</span> <span class="n">radians</span><span class="p">,</span> <span class="n">sqrt</span> <span class="k">if</span> <span class="n">degrees</span><span class="p">:</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="k">if</span> <span class="n">axis</span> <span class="o">==</span> <span class="s">'z'</span><span class="p">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="n">c</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">matrix</span><span class="p">(((</span><span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</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="mi">1</span><span class="p">)))</span> <span class="k">elif</span> <span class="n">axis</span> <span class="o">==</span> <span class="s">'y'</span><span class="p">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="n">c</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">matrix</span><span class="p">(((</span><span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">s</span><span class="p">),</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="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span> <span class="k">elif</span> <span class="n">axis</span> <span class="o">==</span> <span class="s">'x'</span><span class="p">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="n">c</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">matrix</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="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">axis</span> <span class="n">w</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="c"># normalize</span> <span class="k">if</span> <span class="n">w</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">x</span> <span class="o">=</span> <span class="n">y</span> <span class="o">=</span> <span class="n">z</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> <span class="n">l</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">((</span><span class="n">x</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span> <span class="o">*</span> <span class="n">y</span> <span class="o">+</span> <span class="n">z</span> <span class="o">*</span> <span class="n">z</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">w</span> <span class="o">*</span> <span class="n">w</span><span class="p">))</span> <span class="n">x</span> <span class="o">/=</span> <span class="n">l</span> <span class="n">y</span> <span class="o">/=</span> <span class="n">l</span> <span class="n">z</span> <span class="o">/=</span> <span class="n">l</span> <span class="n">wsq</span> <span class="o">=</span> <span class="n">w</span> <span class="o">*</span> <span class="n">w</span> <span class="n">xsq</span> <span class="o">=</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span> <span class="n">ysq</span> <span class="o">=</span> <span class="n">y</span> <span class="o">*</span> <span class="n">y</span> <span class="n">zsq</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">z</span> <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">matrix</span><span class="p">(((</span><span class="n">wsq</span> <span class="o">+</span> <span class="n">xsq</span> <span class="o">-</span> <span class="n">ysq</span> <span class="o">-</span> <span class="n">zsq</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">z</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">*</span> <span class="n">z</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">z</span><span class="p">,</span> <span class="n">wsq</span> <span class="o">-</span> <span class="n">xsq</span> <span class="o">+</span> <span class="n">ysq</span> <span class="o">-</span> <span class="n">zsq</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">y</span> <span class="o">*</span> <span class="n">z</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">x</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">*</span> <span class="n">z</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">y</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">y</span> <span class="o">*</span> <span class="n">z</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">w</span> <span class="o">*</span> <span class="n">x</span><span class="p">,</span> <span class="n">wsq</span> <span class="o">-</span> <span class="n">xsq</span> <span class="o">-</span> <span class="n">ysq</span> <span class="o">+</span> <span class="n">zsq</span><span class="p">)))</span> <span class="k">def</span> <span class="nf">angle_axis</span><span class="p">(</span><span class="n">matrix</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Computes the angle of rotation and the rotation axis for a given rotation</span> <span class="sd"> matrix.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> matrix : array-like</span> <span class="sd"> A 3 x 3 unitary rotation matrix.</span> <span class="sd"> degrees : bool</span> <span class="sd"> If True, output is in degrees.</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> angle : scalar</span> <span class="sd"> The angle of rotation for this matrix. In degrees if `degrees is</span> <span class="sd"> True, otherwise radians.</span> <span class="sd"> axis : array (length 3)</span> <span class="sd"> The axis of rotation for this matrix.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sin</span><span class="p">,</span> <span class="n">cos</span><span class="p">,</span> <span class="n">acos</span><span class="p">,</span> <span class="n">degrees</span><span class="p">,</span> <span class="n">sqrt</span> <span class="n">m</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asmatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">shape</span> <span class="o">!=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'matrix is not 3x3'</span><span class="p">)</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">acos</span><span class="p">((</span><span class="n">m</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="n">m</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">m</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="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="n">denom</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="p">((</span><span class="n">m</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">m</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span> <span class="o">+</span> <span class="p">(</span><span class="n">m</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="o">-</span> <span class="n">m</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="p">(</span><span class="n">m</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="n">m</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="n">axis</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">m</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">m</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="n">m</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="o">-</span> <span class="n">m</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="n">m</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="n">m</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="n">denom</span> <span class="n">axis</span> <span class="o">/=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">axis</span> <span class="o">**</span> <span class="mi">2</span><span class="p">))</span> <span class="k">if</span> <span class="n">degrees</span><span class="p">:</span> <span class="k">return</span> <span class="n">degrees</span><span class="p">(</span><span class="n">angle</span><span class="p">),</span> <span class="n">axis</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">angle</span><span class="p">,</span> <span class="n">axis</span> </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"> <a href="#">Back to Top</a></p> <p> © Copyright 2011-2013, The Astropy Developers.<br/> Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. Last built 22 Oct 2013. <br/> </p> </footer> </body> </html>