# Source code for galpy.actionAngle.actionAngleHarmonicInverse

###############################################################################
#   actionAngle: a Python module to calculate  actions, angles, and frequencies
#
#      class: actionAngleHarmonicInverse
#
#             Calculate (x,v) coordinates for the harmonic oscillator from
#             given actions-angle coordinates
#
###############################################################################
import numpy
from .actionAngleInverse import actionAngleInverse
from ..util import conversion
[docs]class actionAngleHarmonicInverse(actionAngleInverse):
"""Inverse action-angle formalism for the one-dimensional harmonic oscillator"""
[docs]    def __init__(self,*args,**kwargs):
"""
NAME:

__init__

PURPOSE:

initialize an actionAngleHarmonicInverse object

INPUT:

omega= frequency (can be Quantity)

ro= distance from vantage point to GC (kpc; can be Quantity)

vo= circular velocity at ro (km/s; can be Quantity)

OUTPUT:

instance

HISTORY:

2018-04-08 - Started - Bovy (UofT)

"""
actionAngleInverse.__init__(self,*args,**kwargs)
if not 'omega' in kwargs: #pragma: no cover
raise IOError("Must specify omega= for actionAngleHarmonic")
omega= conversion.parse_frequency(kwargs.get('omega'),
ro=self._ro,vo=self._vo)
self._omega= omega
return None

def _evaluate(self,j,angle,**kwargs):
"""
NAME:

__call__

PURPOSE:

evaluate the phase-space coordinates (x,v) for a number of angles on a single torus

INPUT:

j - action (scalar)

angle - angle (array [N])

OUTPUT:

[x,vx]

HISTORY:

2018-04-08 - Written - Bovy (UofT)

"""
return self._xvFreqs(j,angle,**kwargs)[:2]

def _xvFreqs(self,j,angle,**kwargs):
"""
NAME:

xvFreqs

PURPOSE:

evaluate the phase-space coordinates (x,v) for a number of angles on a single torus as well as the frequency

INPUT:

j - action (scalar)

angle - angle (array [N])

OUTPUT:

([x,vx],Omega)

HISTORY:

2018-04-08 - Written - Bovy (UofT)

"""
amp= numpy.sqrt(2.*j/self._omega)
x= amp*numpy.sin(angle)
vx= amp*self._omega*numpy.cos(angle)
return (x,vx,self._omega)

def _Freqs(self,j,**kwargs):
"""
NAME:

Freqs

PURPOSE:

return the frequency corresponding to a torus

INPUT:

j - action (scalar)

OUTPUT:

(Omega)

HISTORY:

2018-04-08 - Written - Bovy (UofT)

"""
return self._omega