Interoperability with Other Dynamics Packages#

Gala provides interfaces with other common Galactic dynamics packages, which enables easily converting objects between these packages. Some examples are shown below. As always, if something does not work as expected or you would like more interoperability with any of these packages, please open an issue on GitHub.

Here are some imports we will use below in examples:

>>> import astropy.units as u
>>> import numpy as np
>>> import gala.dynamics as gd
>>> import gala.potential as gp
>>> from gala.units import galactic

Galpy#

Galpy is another popular Python package for Galactic dynamics with similar functionality to Gala. For example, Galpy supports creating gravitational potential objects and numerically integrating orbits (among other things).

Gala provides an interface for converting representations of orbits from Gala to Galpy, or from Galpy to Gala. To convert a Gala Orbit object to a Galpy Orbit, use the to_galpy_orbit() method:

>>> w0 = gd.PhaseSpacePosition(pos=[10., 0, 0] * u.kpc,
...                            vel=[0, 0, 200.] * u.km/u.s)
>>> mw = gp.Hamiltonian(gp.MilkyWayPotential())
>>> orbit = mw.integrate_orbit(w0, dt=1, n_steps=1000)
>>> orbit
<Orbit cartesian, dim=3, shape=(1001,)>
>>> galpy_orbit = orbit.to_galpy_orbit()
>>> galpy_orbit  
<galpy.orbit.Orbits.Orbit object at 0x7f99b3c8fe80>

Similarly, a Galpy Orbit can be converted to a Gala Orbit using the from_galpy_orbit() classmethod:

>>> import galpy.potential as galpy_p
>>> import galpy.orbit as galpy_o
>>> mp = galpy_p.MiyamotoNagaiPotential(a=0.5, b=0.0375, amp=1.,
...                                     normalize=1.)
>>> galpy_orbit = galpy_o.Orbit([1., 0.1, 1.1, 0., 0.1, 1.])
>>> ts = np.linspace(0, 100, 10000)
>>> galpy_orbit.integrate(ts, mp, method='odeint')
>>> orbit = gd.Orbit.from_galpy_orbit(galpy_orbit)
>>> orbit
<Orbit cylindrical, dim=3, shape=(10000,)>

Gala also provides tools for converting potential objects to galpy potential objects, or creating Gala potential objects from existing galpy potentials. To convert a Gala potential to a Galpy potential, use the to_galpy_potential() method on any Gala potential object. For example:

>>> pot = gp.HernquistPotential(m=1e10*u.Msun, c=1.5*u.kpc, units=galactic)
>>> galpy_pot = pot.to_galpy_potential()
>>> galpy_pot  
<galpy.potential.TwoPowerSphericalPotential.HernquistPotential at 0x7faa00263b20>
>>> galpy_pot.Rforce(1., 0.)  
-0.48737954713808573

To convert from a Galpy potential to a Gala potential, use the galpy_to_gala_potential() function. For example:

>>> import galpy.potential as galpy_gp
>>> from gala.potential.potential.interop import galpy_to_gala_potential
>>> galpy_pot = galpy_gp.HernquistPotential(amp=1., a=0.5)
>>> pot = galpy_to_gala_potential(galpy_pot)
>>> pot
<HernquistPotential: m=4.50e+10, c=4.00 (kpc,Myr,solMass,rad)>

Agama#

Coming soon, but we could use your help! Please leave a note in this issue if you would find interoperability with Agama useful.