Sophie

Sophie

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

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


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


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Example: Defining a new spherical coordinate system &mdash; Astropy v0.2.4</title>
    
    <link rel="stylesheet" href="../_static/bootstrap-astropy.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '0.2.4',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/sidebar.js"></script>
    <link rel="shortcut icon" href="../_static/astropy_logo.ico"/>
    <link rel="top" title="Astropy v0.2.4" href="../index.html" />
    <link rel="up" title="Astronomical Coordinate Systems (astropy.coordinates)" href="index.html" />
    <link rel="next" title="cartesian_to_spherical" href="../_generated/astropy.coordinates.distances.cartesian_to_spherical.html" />
    <link rel="prev" title="Designing Coordinate Systems" href="designing.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 class="right">
	<a href="../_generated/astropy.coordinates.distances.cartesian_to_spherical.html" title="cartesian_to_spherical">
	  next &raquo;
	</a>
      </li>
      <li class="right">
	<a href="designing.html" title="Designing Coordinate Systems">
	  &laquo; previous
	</a>
	 |
      </li>
      <li>
	<a href="../index.html">Astropy v0.2.4</a>
	 &raquo;
      </li>
      <li><a href="index.html" accesskey="U">Astronomical Coordinate Systems (<tt class="docutils literal"><span class="pre">astropy.coordinates</span></tt>)</a> &raquo;</li>
      
      <li>Example: Defining a new spherical coordinate system</li> 
    </ul>
</div>
  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="example-defining-a-new-spherical-coordinate-system">
<span id="sgr-example"></span><h1>Example: Defining a new spherical coordinate system<a class="headerlink" href="#example-defining-a-new-spherical-coordinate-system" title="Permalink to this headline">¶</a></h1>
<p>This document describes in detail how to subclass and define a custom spherical
coordinate system, as mentioned in <a class="reference internal" href="designing.html"><em>Designing Coordinate Systems</em></a> and the docstring for
<a class="reference internal" href="../_generated/astropy.coordinates.coordsystems.SphericalCoordinatesBase.html#astropy.coordinates.coordsystems.SphericalCoordinatesBase" title="astropy.coordinates.coordsystems.SphericalCoordinatesBase"><tt class="xref py py-obj docutils literal"><span class="pre">SphericalCoordinatesBase</span></tt></a>. In this example,
we will define a coordinate system defined by the plane of orbit of the
Sagitarrius Dwarf Galaxy (hereafter Sgr; as defined in Majewski et al. 2003).
The Sgr coordinate system is often referred to in terms of two angular
coordinates, <span class="math">\Lambda,B</span>.</p>
<p>We&#8217;ll start by using a template to generate a descriptive docstring for our
subclass. Then we&#8217;ll add some glue to the default initializer to recognize that
we want to call the coordinates <tt class="xref py py-obj docutils literal"><span class="pre">Lambda</span></tt> and <tt class="xref py py-obj docutils literal"><span class="pre">Beta</span></tt>. Then we have to define the
transformation from this coordinate system to some other built-in system, in
this case we will use spherical Galactic Coordinates as defined in
<a class="reference internal" href="../_generated/astropy.coordinates.builtin_systems.GalacticCoordinates.html#astropy.coordinates.builtin_systems.GalacticCoordinates" title="astropy.coordinates.builtin_systems.GalacticCoordinates"><tt class="xref py py-obj docutils literal"><span class="pre">GalacticCoordinates</span></tt></a>.</p>
<p>The first step is to create a new class for our coordinates, let&#8217;s call it
<tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> and make it a subclass of
<a class="reference internal" href="../_generated/astropy.coordinates.coordsystems.SphericalCoordinatesBase.html#astropy.coordinates.coordsystems.SphericalCoordinatesBase" title="astropy.coordinates.coordsystems.SphericalCoordinatesBase"><tt class="xref py py-obj docutils literal"><span class="pre">SphericalCoordinatesBase</span></tt></a>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">astropy.coordinates</span> <span class="kn">as</span> <span class="nn">coord</span>

<span class="k">class</span> <span class="nc">SgrCoordinates</span><span class="p">(</span><span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; A spherical coordinate system defined by the orbit of the</span>
<span class="sd">        Sagittarius dwarf galaxy, as described in</span>
<span class="sd">            http://adsabs.harvard.edu/abs/2003ApJ...599.1082M</span>
<span class="sd">        and further explained in</span>
<span class="sd">            http://www.astro.virginia.edu/~srm4n/Sgr/.</span>

<span class="sd">&quot;&quot;&quot;</span>
</pre></div>
</div>
<p>We can use some convenience variables defined at the superclass level to
generate a descriptive docstring for our subclass:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">__doc__</span> <span class="o">=</span> <span class="n">__doc__</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">params</span><span class="o">=</span><span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="o">.</span>
                                <span class="n">_init_docstring_param_templ</span><span class="o">.</span>
                                <span class="n">format</span><span class="p">(</span><span class="n">lonnm</span><span class="o">=</span><span class="s">&#39;Lambda&#39;</span><span class="p">,</span> <span class="n">latnm</span><span class="o">=</span><span class="s">&#39;Beta&#39;</span><span class="p">))</span>
</pre></div>
</div>
<p>This may look scary, but let&#8217;s break down what it is doing. <tt class="xref py py-obj docutils literal"><span class="pre">__doc__</span></tt> is a class
attribute defined in the superclass,
<a class="reference internal" href="../_generated/astropy.coordinates.coordsystems.SphericalCoordinatesBase.html#astropy.coordinates.coordsystems.SphericalCoordinatesBase" title="astropy.coordinates.coordsystems.SphericalCoordinatesBase"><tt class="xref py py-obj docutils literal"><span class="pre">SphericalCoordinatesBase</span></tt></a>, and is just a
string with a placeholder for a docstring specific to this subclass. We specify
that extra, descriptive text by using <tt class="xref py py-obj docutils literal"><span class="pre">format()</span></tt> with the <tt class="xref py py-obj docutils literal"><span class="pre">params</span></tt> keyword.
<tt class="xref py py-obj docutils literal"><span class="pre">params</span></tt> expects a string describing the variable names of our current
coordinate system. We can generate this from a template as well by formatting
another class attribute and telling it what we want to name our coordinates (in
this case, Lambda and Beta). The template string is defined as a class attribute
<tt class="xref py py-obj docutils literal"><span class="pre">_init_docstring_param_templ</span></tt>,
and expects the name of the longitude-equivalent (Lambda) and
latitude-equivalent (Beta) coordinates:</p>
<div class="highlight-python"><pre>coord.SphericalCoordinatesBase._init_docstring_param_templ
                              .format(lonnm='Lambda', latnm='Beta')</pre>
</div>
<p>If this looks strange or complicated, just remember that we&#8217;re just doing this
to help the user (this will provide them with a nice docstring if they look at
the help for this class). <strong>The bottom line:</strong> if you want to define a custom
spherical coordinate system with two angular coordinates, copy and paste the
below line into the class definition and change <tt class="xref py py-obj docutils literal"><span class="pre">'Lambda'</span></tt> to the name of your
longitude coordinate, and <tt class="xref py py-obj docutils literal"><span class="pre">'Beta'</span></tt> to the name of your latitude coordinate.:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">__doc__</span> <span class="o">=</span> <span class="n">__doc__</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">params</span><span class="o">=</span><span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="o">.</span>
                                <span class="n">_init_docstring_param_templ</span><span class="o">.</span>
                                <span class="n">format</span><span class="p">(</span><span class="n">lonnm</span><span class="o">=</span><span class="s">&#39;Lambda&#39;</span><span class="p">,</span> <span class="n">latnm</span><span class="o">=</span><span class="s">&#39;Beta&#39;</span><span class="p">))</span>
</pre></div>
</div>
<p>Next we can define our subclass&#8217; initializer, <tt class="xref py py-obj docutils literal"><span class="pre">__init__()</span></tt>. We start by calling
<tt class="xref py py-obj docutils literal"><span class="pre">__init__()</span></tt> on the superclass. Then, we add a catch to see if the user passed
in another <a class="reference internal" href="../_generated/astropy.coordinates.coordsystems.SphericalCoordinatesBase.html#astropy.coordinates.coordsystems.SphericalCoordinatesBase" title="astropy.coordinates.coordsystems.SphericalCoordinatesBase"><tt class="xref py py-obj docutils literal"><span class="pre">SphericalCoordinatesBase</span></tt></a> object
in. If so, we can just transform those coordinates to <tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> and copy
the attributes directly. Otherwise, we have to tell our subclass how to parse
the arguments and keyword arguments that the user passed in. We do this with the
<tt class="xref py py-obj docutils literal"><span class="pre">_initialize_latlon()</span></tt> classmethod. This convenience function accepts the name
of the longitude coordinate, the name of the latitude coordinate, a boolean
parameter to specify whether to use <tt class="xref py py-obj docutils literal"><span class="pre">RA</span></tt> and <tt class="xref py py-obj docutils literal"><span class="pre">Dec</span></tt> objects to store the angles
internally, or to use <a class="reference internal" href="../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle" title="astropy.coordinates.angles.Angle"><tt class="xref py py-obj docutils literal"><span class="pre">Angle</span></tt></a> objects instead (we
want to use <a class="reference internal" href="../_generated/astropy.coordinates.angles.Angle.html#astropy.coordinates.angles.Angle" title="astropy.coordinates.angles.Angle"><tt class="xref py py-obj docutils literal"><span class="pre">Angle</span></tt></a> s so we set it to False), the
arguments and keyword arguments passed to this initializer, and finally an
optional parameter to specify the bounds of the coordinate system. This function
will handle parsing the args and kwargs to validate and sanitize the input from
the user.:</p>
<div class="highlight-python"><pre>def __init__(self, *args, **kwargs):
    super(SgrCoordinates, self).__init__()

    if len(args) == 1 and len(kwargs) == 0 and
        isinstance(args[0], coord.SphericalCoordinatesBase):

        newcoord = args[0].transform_to(self.__class__)
        self.Lambda = newcoord.Lambda
        self.Beta = newcoord.Beta
        self._distance = newcoord._distance
    else:
        super(SgrCoordinates, self).
            _initialize_latlon('Lambda', 'Beta', False, args, kwargs,
                               anglebounds=((0, 360), (-90,90)))</pre>
</div>
<p>Next we have to tell the class what to use for the longitude and latitude when
doing coordinate transformations with other coordinate systems. Calling
<tt class="xref py py-obj docutils literal"><span class="pre">_initialize_latlon()</span></tt> will define attributes for the names of our coordinates,
in this case <tt class="xref py py-obj docutils literal"><span class="pre">Lambda</span></tt> and <tt class="xref py py-obj docutils literal"><span class="pre">Beta</span></tt>, so we just have to create two properties
<tt class="xref py py-obj docutils literal"><span class="pre">lonangle</span></tt> and <tt class="xref py py-obj docutils literal"><span class="pre">latangle</span></tt> that reference the others:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@property</span>
<span class="k">def</span> <span class="nf">lonangle</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">Lambda</span>

<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">latangle</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">Beta</span>
</pre></div>
</div>
<p>Now our coordinate system is set up! You can now create <tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> objects
by passing any valid specifiers accepted by
<a class="reference internal" href="../_generated/astropy.coordinates.coordsystems.SphericalCoordinatesBase.html#astropy.coordinates.coordsystems.SphericalCoordinatesBase" title="astropy.coordinates.coordsystems.SphericalCoordinatesBase"><tt class="xref py py-obj docutils literal"><span class="pre">SphericalCoordinatesBase</span></tt></a>, but you won&#8217;t be
able to transform to and from any other coordinate systems because we haven&#8217;t
yet defined how to do that.</p>
<p>We will define the coordinate transformation as a function that accepts a
<a class="reference internal" href="../_generated/astropy.coordinates.builtin_systems.GalacticCoordinates.html#astropy.coordinates.builtin_systems.GalacticCoordinates" title="astropy.coordinates.builtin_systems.GalacticCoordinates"><tt class="xref py py-obj docutils literal"><span class="pre">GalacticCoordinates</span></tt></a> object and returns an
<tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> object. We could alternatively define the transformation by
specifying a transformation matrix (
<a class="reference internal" href="../_generated/astropy.coordinates.transformations.static_transform_matrix.html#astropy.coordinates.transformations.static_transform_matrix" title="astropy.coordinates.transformations.static_transform_matrix"><tt class="xref py py-obj docutils literal"><span class="pre">static_transform_matrix</span></tt></a>), but in this
case the transformation is from a left-handed coordinate system to a right-
handed system, so we need more control over the transformation. We&#8217;ll start by
constructing the rotation matrix, using the helper function
<tt class="xref py py-obj docutils literal"><span class="pre">astropy.coordinates.angles.rotation_matrix</span></tt></p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># Define the Euler angles (from Law &amp; Majewski 2010)</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">180</span><span class="o">+</span><span class="mf">3.75</span><span class="p">)</span>
<span class="n">theta</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="mf">13.46</span><span class="p">)</span>
<span class="n">psi</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">180</span><span class="o">+</span><span class="mf">14.111534</span><span class="p">)</span>

<span class="c"># Generate the rotation matrix using the x-convention (see Goldstein)</span>
<span class="n">D</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">phi</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">B</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">psi</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">sgr_matrix</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">B</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">C</span><span class="p">)</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">D</span><span class="p">))</span>
</pre></div>
</div>
<p>This is done at the module level, since it will be used by both the
transformation from Sgr to Galactic as well as the inverse from Galactic to Sgr.
Now we can define our first transformation function:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@transformations.transform_function</span><span class="p">(</span><span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">,</span>
                                    <span class="n">SgrCoordinates</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">galactic_to_sgr</span><span class="p">(</span><span class="n">galactic_coord</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Compute the transformation from Galactic spherical to Sgr</span>
<span class="sd">        coordinates.</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="n">l</span> <span class="o">=</span> <span class="n">galactic_coord</span><span class="o">.</span><span class="n">l</span><span class="o">.</span><span class="n">radians</span>
    <span class="n">b</span> <span class="o">=</span> <span class="n">galactic_coord</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">radians</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
    <span class="n">Y</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
    <span class="n">Z</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>

    <span class="c"># Calculate X,Y,Z,distance in the Sgr system</span>
    <span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</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="p">]))</span>
    <span class="n">Zs</span> <span class="o">=</span> <span class="o">-</span><span class="n">Zs</span> <span class="c"># left-handed to right-handed</span>

    <span class="c"># Calculate the angular coordinates lambda,beta</span>
    <span class="n">Lambda</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">Ys</span><span class="p">,</span><span class="n">Xs</span><span class="p">))</span>
    <span class="k">if</span> <span class="n">Lambda</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">Lambda</span> <span class="o">+=</span> <span class="mi">360</span>

    <span class="n">Beta</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arcsin</span><span class="p">(</span><span class="n">Zs</span><span class="o">/</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">Xs</span><span class="o">*</span><span class="n">Xs</span><span class="o">+</span><span class="n">Ys</span><span class="o">*</span><span class="n">Ys</span><span class="o">+</span><span class="n">Zs</span><span class="o">*</span><span class="n">Zs</span><span class="p">)))</span>

    <span class="k">return</span> <span class="n">SgrCoordinates</span><span class="p">(</span><span class="n">Lambda</span><span class="p">,</span> <span class="n">Beta</span><span class="p">,</span> <span class="n">distance</span><span class="o">=</span><span class="n">galactic_coord</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span>
                          <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">))</span>
</pre></div>
</div>
<p>The decorator
<tt class="xref py py-obj docutils literal"><span class="pre">&#64;transformations.transform_function(coord.GalacticCoordinates,</span> <span class="pre">SgrCoordinates)</span></tt>
registers this function with the <tt class="xref py py-obj docutils literal"><span class="pre">Coordinates</span></tt> subpackage as a transformation.
Inside the function, we simply follow the same procedure as detailed by David
Law&#8217;s
<tt class="xref py py-obj docutils literal"><span class="pre">transformation</span> <span class="pre">code</span></tt>. Note
that in this case, both coordinate systems are heliocentric, so we can simply
copy any distance from the
<a class="reference internal" href="../_generated/astropy.coordinates.builtin_systems.GalacticCoordinates.html#astropy.coordinates.builtin_systems.GalacticCoordinates" title="astropy.coordinates.builtin_systems.GalacticCoordinates"><tt class="xref py py-obj docutils literal"><span class="pre">GalacticCoordinates</span></tt></a> object.</p>
<p>We then register the inverse transformation by using the Transpose of the
rotation matrix:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@transformations.transform_function</span><span class="p">(</span><span class="n">SgrCoordinates</span><span class="p">,</span>
                                    <span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">sgr_to_galactic</span><span class="p">(</span><span class="n">sgr_coord</span><span class="p">):</span>
    <span class="n">L</span> <span class="o">=</span> <span class="n">sgr_coord</span><span class="o">.</span><span class="n">Lambda</span><span class="o">.</span><span class="n">radians</span>
    <span class="n">B</span> <span class="o">=</span> <span class="n">sgr_coord</span><span class="o">.</span><span class="n">Beta</span><span class="o">.</span><span class="n">radians</span>

    <span class="n">Xs</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">B</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
    <span class="n">Ys</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">B</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
    <span class="n">Zs</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">B</span><span class="p">)</span>
    <span class="n">Zs</span> <span class="o">=</span> <span class="o">-</span><span class="n">Zs</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">rotation_matrix</span><span class="o">.</span><span class="n">T</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span><span class="p">]))</span>

    <span class="n">l</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">Y</span><span class="p">,</span><span class="n">X</span><span class="p">))</span>
    <span class="n">b</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arcsin</span><span class="p">(</span><span class="n">Z</span><span class="o">/</span><span class="n">np</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="k">if</span> <span class="n">l</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">:</span>
        <span class="n">l</span> <span class="o">+=</span> <span class="mi">360</span>

    <span class="k">return</span> <span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">distance</span><span class="o">=</span><span class="n">sgr_coord</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span>
                                     <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">))</span>
</pre></div>
</div>
<p>Now that we&#8217;ve registered these transformations between <tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> and
<a class="reference internal" href="../_generated/astropy.coordinates.builtin_systems.GalacticCoordinates.html#astropy.coordinates.builtin_systems.GalacticCoordinates" title="astropy.coordinates.builtin_systems.GalacticCoordinates"><tt class="xref py py-obj docutils literal"><span class="pre">GalacticCoordinates</span></tt></a>, we can transform
between <em>any</em> coordinate system and <tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt> (as long as the other
system has a path to transform to
<a class="reference internal" href="../_generated/astropy.coordinates.builtin_systems.GalacticCoordinates.html#astropy.coordinates.builtin_systems.GalacticCoordinates" title="astropy.coordinates.builtin_systems.GalacticCoordinates"><tt class="xref py py-obj docutils literal"><span class="pre">GalacticCoordinates</span></tt></a>). For example, to
transform from ICRS coordinates to <tt class="xref py py-obj docutils literal"><span class="pre">SgrCoordinates</span></tt>, we simply:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">astropy.coordinates</span> <span class="kn">as</span> <span class="nn">coord</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">icrs</span> <span class="o">=</span> <span class="n">coord</span><span class="o">.</span><span class="n">ICRSCoordinates</span><span class="p">(</span><span class="mf">280.161732</span><span class="p">,</span> <span class="mf">11.91934</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">icrs</span><span class="o">.</span><span class="n">transform_to</span><span class="p">(</span><span class="n">SgrCoordinates</span><span class="p">)</span>
<span class="go">&lt;SgrCoordinates Lambda=346.81827 deg, Beta=-39.28367 deg&gt;</span>
</pre></div>
</div>
<p>The complete code for the above example is included below for reference.</p>
<div class="section" id="see-also">
<h2>See Also<a class="headerlink" href="#see-also" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li>Majewski et al. 2003, &#8220;A Two Micron All Sky Survey View of the Sagittarius
Dwarf Galaxy. I. Morphology of the Sagittarius Core and Tidal Arms&#8221;,
<a class="reference external" href="http://arxiv.org/abs/astro-ph/0304198">http://arxiv.org/abs/astro-ph/0304198</a></li>
<li>Law &amp; Majewski 2010, &#8220;The Sagittarius Dwarf Galaxy: A Model for Evolution in a
Triaxial Milky Way Halo&#8221;, <a class="reference external" href="http://arxiv.org/abs/1003.1132">http://arxiv.org/abs/1003.1132</a></li>
<li>David Law&#8217;s Sgr info page <a class="reference external" href="http://www.astro.virginia.edu/~srm4n/Sgr/">http://www.astro.virginia.edu/~srm4n/Sgr/</a></li>
</ul>
</div>
<div class="section" id="complete-code-for-example">
<h2>Complete Code for Example<a class="headerlink" href="#complete-code-for-example" title="Permalink to this headline">¶</a></h2>
<div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136</pre></div></td><td class="code"><div class="highlight"><pre><span class="c"># coding: utf-8</span>

<span class="sd">&quot;&quot;&quot; Astropy coordinate class for the Sagittarius coordinate system &quot;&quot;&quot;</span>

<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span>

<span class="n">__author__</span> <span class="o">=</span> <span class="s">&quot;adrn &lt;adrn@astro.columbia.edu&gt;&quot;</span>

<span class="c"># Standard library</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span>

<span class="c"># Third-party</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">radians</span><span class="p">,</span> <span class="n">degrees</span><span class="p">,</span> <span class="n">cos</span><span class="p">,</span> <span class="n">sin</span>

<span class="kn">import</span> <span class="nn">astropy.coordinates</span> <span class="kn">as</span> <span class="nn">coord</span>
<span class="kn">import</span> <span class="nn">astropy.units</span> <span class="kn">as</span> <span class="nn">u</span>
<span class="kn">from</span> <span class="nn">astropy.coordinates</span> <span class="kn">import</span> <span class="n">transformations</span>
<span class="kn">from</span> <span class="nn">astropy.coordinates.angles</span> <span class="kn">import</span> <span class="n">rotation_matrix</span>

<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SgrCoordinates&quot;</span><span class="p">]</span>

<span class="k">class</span> <span class="nc">SgrCoordinates</span><span class="p">(</span><span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; A spherical coordinate system defined by the orbit of the Sagittarius </span>
<span class="sd">        dwarf galaxy, as described in </span>
<span class="sd">            http://adsabs.harvard.edu/abs/2003ApJ...599.1082M </span>
<span class="sd">        and further explained in</span>
<span class="sd">            http://www.astro.virginia.edu/~srm4n/Sgr/.</span>

<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__doc__</span> <span class="o">=</span> <span class="n">__doc__</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">params</span><span class="o">=</span><span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="o">.</span> \
                                          <span class="n">_init_docstring_param_templ</span><span class="o">.</span> \
                                          <span class="n">format</span><span class="p">(</span><span class="n">lonnm</span><span class="o">=</span><span class="s">&#39;Lambda&#39;</span><span class="p">,</span> <span class="n">latnm</span><span class="o">=</span><span class="s">&#39;Beta&#39;</span><span class="p">))</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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">SgrCoordinates</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="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> \
            <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">coord</span><span class="o">.</span><span class="n">SphericalCoordinatesBase</span><span class="p">):</span>
            
            <span class="n">newcoord</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">transform_to</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">Lambda</span> <span class="o">=</span> <span class="n">newcoord</span><span class="o">.</span><span class="n">Lambda</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">Beta</span> <span class="o">=</span> <span class="n">newcoord</span><span class="o">.</span><span class="n">Beta</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_distance</span> <span class="o">=</span> <span class="n">newcoord</span><span class="o">.</span><span class="n">_distance</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nb">super</span><span class="p">(</span><span class="n">SgrCoordinates</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span>\
                <span class="n">_initialize_latlon</span><span class="p">(</span><span class="s">&#39;Lambda&#39;</span><span class="p">,</span> <span class="s">&#39;Beta&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> 
                                   <span class="n">anglebounds</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="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="k">def</span> <span class="nf">__repr__</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">distance</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">diststr</span> <span class="o">=</span> <span class="s">&#39;, Distance={0:.2g} {1!s}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">distance</span><span class="o">.</span><span class="n">_value</span><span class="p">,</span> 
                                                        <span class="bp">self</span><span class="o">.</span><span class="n">distance</span><span class="o">.</span><span class="n">_unit</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">diststr</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>

        <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;&lt;{0} Lambda={1:.5f} deg, Beta={2:.5f} deg{3}&gt;&quot;</span>
        <span class="k">return</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">__class__</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">Lambda</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">Beta</span><span class="o">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">diststr</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">lonangle</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">Lambda</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">latangle</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">Beta</span>

<span class="c"># Define the Euler angles (from Law &amp; Majewski 2010)</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">180</span><span class="o">+</span><span class="mf">3.75</span><span class="p">)</span>
<span class="n">theta</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">90</span><span class="o">-</span><span class="mf">13.46</span><span class="p">)</span>
<span class="n">psi</span> <span class="o">=</span> <span class="n">radians</span><span class="p">(</span><span class="mi">180</span><span class="o">+</span><span class="mf">14.111534</span><span class="p">)</span>

<span class="c"># Generate the rotation matrix using the x-convention (see Goldstein)</span>
<span class="n">D</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">phi</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">C</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">B</span> <span class="o">=</span> <span class="n">rotation_matrix</span><span class="p">(</span><span class="n">psi</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">degrees</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">sgr_matrix</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">B</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">C</span><span class="p">)</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">D</span><span class="p">))</span>

<span class="c"># Galactic to Sgr coordinates</span>
<span class="nd">@transformations.transform_function</span><span class="p">(</span><span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">,</span> <span class="n">SgrCoordinates</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">galactic_to_sgr</span><span class="p">(</span><span class="n">galactic_coord</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Compute the transformation from Galactic spherical to Sgr coordinates. </span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="n">l</span> <span class="o">=</span> <span class="n">galactic_coord</span><span class="o">.</span><span class="n">l</span><span class="o">.</span><span class="n">radians</span>
    <span class="n">b</span> <span class="o">=</span> <span class="n">galactic_coord</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">radians</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
    <span class="n">Y</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
    <span class="n">Z</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>

    <span class="c"># Calculate X,Y,Z,distance in the Sgr system</span>
    <span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span> <span class="o">=</span> <span class="n">sgr_matrix</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</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="p">]))</span>

    <span class="n">Zs</span> <span class="o">=</span> <span class="o">-</span><span class="n">Zs</span>

    <span class="c"># Calculate the angular coordinates lambda,beta</span>
    <span class="n">Lambda</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">Ys</span><span class="p">,</span><span class="n">Xs</span><span class="p">))</span>
    <span class="k">if</span> <span class="n">Lambda</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">:</span>
        <span class="n">Lambda</span> <span class="o">+=</span> <span class="mi">360</span>

    <span class="n">Beta</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arcsin</span><span class="p">(</span><span class="n">Zs</span><span class="o">/</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">Xs</span><span class="o">*</span><span class="n">Xs</span><span class="o">+</span><span class="n">Ys</span><span class="o">*</span><span class="n">Ys</span><span class="o">+</span><span class="n">Zs</span><span class="o">*</span><span class="n">Zs</span><span class="p">)))</span>

    <span class="k">return</span> <span class="n">SgrCoordinates</span><span class="p">(</span><span class="n">Lambda</span><span class="p">,</span> <span class="n">Beta</span><span class="p">,</span> <span class="n">distance</span><span class="o">=</span><span class="n">galactic_coord</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span> 
                          <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">))</span>

<span class="nd">@transformations.transform_function</span><span class="p">(</span><span class="n">SgrCoordinates</span><span class="p">,</span> <span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">sgr_to_galactic</span><span class="p">(</span><span class="n">sgr_coord</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Compute the transformation from Sgr coordinates to spherical Galactic. </span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">L</span> <span class="o">=</span> <span class="n">sgr_coord</span><span class="o">.</span><span class="n">Lambda</span><span class="o">.</span><span class="n">radians</span>
    <span class="n">B</span> <span class="o">=</span> <span class="n">sgr_coord</span><span class="o">.</span><span class="n">Beta</span><span class="o">.</span><span class="n">radians</span>

    <span class="n">Xs</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">B</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
    <span class="n">Ys</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">B</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
    <span class="n">Zs</span> <span class="o">=</span> <span class="n">sin</span><span class="p">(</span><span class="n">B</span><span class="p">)</span>
    <span class="n">Zs</span> <span class="o">=</span> <span class="o">-</span><span class="n">Zs</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">sgr_matrix</span><span class="o">.</span><span class="n">T</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">Xs</span><span class="p">,</span> <span class="n">Ys</span><span class="p">,</span> <span class="n">Zs</span><span class="p">]))</span>

    <span class="n">l</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">Y</span><span class="p">,</span><span class="n">X</span><span class="p">))</span>
    <span class="n">b</span> <span class="o">=</span> <span class="n">degrees</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arcsin</span><span class="p">(</span><span class="n">Z</span><span class="o">/</span><span class="n">np</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="k">if</span> <span class="n">l</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">:</span>
        <span class="n">l</span> <span class="o">+=</span> <span class="mi">360</span>

    <span class="k">return</span> <span class="n">coord</span><span class="o">.</span><span class="n">GalacticCoordinates</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">distance</span><span class="o">=</span><span class="n">sgr_coord</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span> 
                                     <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</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">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
    <span class="c"># Example use case for our newly defined coordinate class</span>
    <span class="n">ra_dec</span> <span class="o">=</span> <span class="n">coord</span><span class="o">.</span><span class="n">ICRSCoordinates</span><span class="p">(</span><span class="mf">152.88572</span><span class="p">,</span> <span class="mf">11.57281</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">,</span>
                                                              <span class="n">u</span><span class="o">.</span><span class="n">degree</span><span class="p">))</span>
    <span class="n">sgr</span> <span class="o">=</span> <span class="n">ra_dec</span><span class="o">.</span><span class="n">transform_to</span><span class="p">(</span><span class="n">SgrCoordinates</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="n">sgr</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper"><h3>Page Contents</h3>
<ul>
<li><a class="reference internal" href="#">Example: Defining a new spherical coordinate system</a><ul>
<li><a class="reference internal" href="#see-also">See Also</a></li>
<li><a class="reference internal" href="#complete-code-for-example">Complete Code for Example</a></li>
</ul>
</li>
</ul>


        </div>
      </div>
      <div class="clearer"></div>
    </div>
<footer class="footer">
  <p class="pull-right">
    <a href="http://github.com/astropy/astropy/tree/v0.2.4/docs/coordinates/sgr-example.rst">Edit This Page on Github</a> &nbsp;
    <a href="../_sources/coordinates/sgr-example.txt"
       rel="nofollow">Page Source</a> &nbsp;
    <a href="#">Back to Top</a></p>
  <p>
    &copy; Copyright 2011-2013, The Astropy Developers.<br/>
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. &nbsp;
    Last built 22 Oct 2013. <br/>
  </p>
</footer>
  </body>
</html>