Skip to content

Instantly share code, notes, and snippets.

@jobovy
Created December 22, 2020 21:14
Show Gist options
  • Save jobovy/4187b69eb859e0b9bfc26104814bd639 to your computer and use it in GitHub Desktop.
Save jobovy/4187b69eb859e0b9bfc26104814bd639 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/Users/bovy/tmp/galpy-spheredf/galpy/util/bovy_conversion.py:6: FutureWarning: galpy.util.bovy_conversion is being deprecated in favor of galpy.util.conversion; all functions in there are the same; please switch to the new import, because the old import will be removed in v1.9\n",
" warnings.warn('galpy.util.bovy_conversion is being deprecated in favor of galpy.util.conversion; all functions in there are the same; please switch to the new import, because the old import will be removed in v1.9',FutureWarning)\n",
"\n",
"/Users/bovy/tmp/galpy-spheredf/galpy/util/bovy_coords.py:6: FutureWarning: galpy.util.bovy_coords is being deprecated in favor of galpy.util.coords; all functions in there are the same; please switch to the new import, because the old import will be removed in v1.9\n",
" warnings.warn('galpy.util.bovy_coords is being deprecated in favor of galpy.util.coords; all functions in there are the same; please switch to the new import, because the old import will be removed in v1.9',FutureWarning)\n",
"\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"import numpy\n",
"from astropy import units\n",
"from galpy.potential import LogarithmicHaloPotential\n",
"from galpy.orbit import Orbit\n",
"from galpy.util import conversion, coords\n",
"from galpy.util import plot as galpy_plot\n",
"galpy_plot.start_print(axes_labelsize=17.,text_fontsize=12.,\n",
" xtick_labelsize=15.,ytick_labelsize=15.)\n",
"from streamtools.df import streamspraydf\n",
"from galpy.util import _rotate_to_arbitrary_vector\n",
"%pylab inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Approximately aligning a stream horizontally\n",
"\n",
"In this brief notebook, I illustrate a simple way to transform the sky coordinates of a stream of stars from RA and Dec to $(\\phi_1,\\phi_2)$ such that the stream lies approximately along a constant value of $\\phi_2$. I do this by rotating the sky coordinate frame such that the stream progenitor's angular momentum measured with respect to a non-moving observer at the Sun aligns with the $z$ axis (non-moving in Galactocentric coordinates). I use the example from the ``streamtools`` package.\n",
"\n",
"First we set up the stream as in the ``streamtools`` example:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"o= Orbit([1.56148083,0.35081535,-1.15481504,0.88719443,-0.47713334,0.12019596])\n",
"lp= LogarithmicHaloPotential(normalize=1.,q=0.9)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"spdf= streamspraydf(2*10.**4.*units.Msun,progenitor=o,pot=lp,tdisrupt=4.5*units.Gyr)\n",
"spdft= streamspraydf(2*10.**4.*units.Msun,progenitor=o,pot=lp,leading=False,tdisrupt=4.5*units.Gyr)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we generate a leading and trailing stream:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"numpy.random.seed(4)\n",
"RvR,dt= spdf.sample(n=100,returndt=True,integrate=True)\n",
"RvRt,dt= spdft.sample(n=100,returndt=True,integrate=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We load the stream particles into an ``Orbit`` instance such that we can easily convert coordinates:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"streaml= Orbit(RvR.T)\n",
"streamt= Orbit(RvRt.T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following is then the stream in RA and Dec.:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"galpyWarning: Method ra(.) requires ro to be given at Orbit initialization or at method evaluation; using default ro which is 8.000000 kpc\n",
"galpyWarning: Method dec(.) requires ro to be given at Orbit initialization or at method evaluation; using default ro which is 8.000000 kpc\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"figsize(12,6)\n",
"plot(streaml.ra(),streaml.dec(),'r.')\n",
"plot(streamt.ra(),streamt.dec(),'b.')\n",
"xlabel(r'$\\mathrm{RA}\\,(\\mathrm{deg})$')\n",
"xlabel(r'$\\mathrm{Dec}\\,(\\mathrm{deg})$')\n",
"gca().set_aspect('equal');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we compute the conversion matrix, first defining a function that computes the relative angular momentum between two orbits:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def relative_angmom(orb,ref_orb):\n",
" return numpy.array([(orb.y()-ref_orb.y())*(orb.vz()-ref_orb.vz())\n",
" -(orb.z()-ref_orb.z())*(orb.vy()-ref_orb.vy()),\n",
" (orb.z()-ref_orb.z())*(orb.vx()-ref_orb.vx())\n",
" -(orb.x()-ref_orb.x())*(orb.vz()-ref_orb.vz()),\n",
" (orb.x()-ref_orb.x())*(orb.vy()-ref_orb.vy())\n",
" -(orb.y()-ref_orb.y())*(orb.vx()-ref_orb.vx())])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and we use that the compute the relative angular momentum of the stream progenitor wrt a non-moving Sun (``Orbit()`` is the Sun). "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"sun= Orbit([0,0,0,0,0,0],radec=True)\n",
"sun.vxvv[0][1]= 0.\n",
"sun.vxvv[0][2]= 0.\n",
"sun.vxvv[0][4]= 0.\n",
"sun.turn_physical_off()\n",
"o.turn_physical_off()\n",
"angmom_vec= relative_angmom(o,sun)\n",
"rot= _rotate_to_arbitrary_vector(numpy.atleast_2d(angmom_vec),[0.,0.,1.])[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then use this ``rot`` matrix to convert sky coordinates as follows:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"galpyWarning: Method ra(.) requires ro to be given at Orbit initialization or at method evaluation; using default ro which is 8.000000 kpc\n",
"galpyWarning: Method dec(.) requires ro to be given at Orbit initialization or at method evaluation; using default ro which is 8.000000 kpc\n"
]
}
],
"source": [
"phi12l= coords.radec_to_custom(streaml.ra().to_value(u.deg),streaml.dec().to_value(u.deg),T=rot.T,degree=True)\n",
"phi12t= coords.radec_to_custom(streamt.ra().to_value(u.deg),streamt.dec().to_value(u.deg),T=rot.T,degree=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and the resulting stream in $(\\phi_1,\\phi_2)$ is:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"figsize(12,6)\n",
"plot((phi12l[:,0]+180.) % 360.,phi12l[:,1],'r.')\n",
"plot((phi12t[:,0]+180.) % 360.,phi12t[:,1],'b.')\n",
"gca().set_aspect('equal')\n",
"ylim(8.,-8.)\n",
"xlabel(r'$\\phi_1\\,(\\mathrm{deg})$')\n",
"ylabel(r'$\\phi_2\\,(\\mathrm{deg})$');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Much better aligned!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
@salmanhiro
Copy link

salmanhiro commented Jul 3, 2025

@jobovy thanks, I found this quite helpful to convert ICRS to stream coordinate (well, I found that it was quite time-consuming to manually figure out the math of coordinate transform into this stream coordinate, at least for me). Maybe would be helpful if we have this coordinate transform (I don't know if its already exist but I can't find it here https://docs.galpy.org/en/latest/streamdf.html). Even better this also include the tidal disruption ๐Ÿ˜„

Maybe this tutorial can be included in the Galpy page since I found it very useful but quite hard to locate this gist ๐Ÿ‘

@jobovy
Copy link
Author

jobovy commented Jul 14, 2025

Thanks for your comment, I'm glad you found this code useful (and it reminded me of it, which is useful because I've been trying to solve a similar problem again...). Yes, maybe it would be a good idea to add it to the galpy docs somewhere on that streamdf page, feel free to open a pull request!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment