#!/usr/local/bin/python
# encoding: utf-8
"""
*Calculate separations between sky-coordinates*
Author
: David Young
"""
from __future__ import division
from past.utils import old_div
from builtins import object
import sys
import os
import math
os.environ['TERM'] = 'vt100'
[docs]
class separations(object):
"""
*The worker class for the separations module*
**Key Arguments**
- ``log`` -- logger
- ``settings`` -- the settings dictionary
- ``ra1`` -- the right-ascension of the first location. Decimal degrees or sexegesimal.
- ``dec1`` -- the declination of the first location. Decimal degrees or sexegesimal.
- ``ra2`` -- the right-ascension of the second location. Decimal degrees or sexegesimal.
- ``dec2`` -- the declination of the second location. Decimal degrees or sexegesimal.
**Usage**
.. todo::
- replace get_angular_separation throughout all code using dryxPython
- replace getAngularSeparationthroughout all code using dryxPython
You can input sexegesimal coordinates,
```python
from astrocalc.coords import separations
calculator = separations(
log=log,
ra1="23:32:23.2324",
dec1="-13:32:45.43553",
ra2="23:32:34.642",
dec2="-12:12:34.9334",
)
angularSeparation, north, east = calculator.get()
print(angularSeparation, north, east)
# OUT: '4813.39431', '4810.50214', '166.83941'
```
or decimal degrees,
```python
from astrocalc.coords import separations
calculator = separations(
log=log,
ra1=2.3342343,
dec1=89.23244233,
ra2=45.343545345,
dec2=87.3435435
)
angularSeparation, north, east = calculator.get()
print(angularSeparation, north, east)
# OUT: '7774.4375', '-6800.0358', '4625.7620'
```
or even a mix of both
```python
from astrocalc.coords import separations
calculator = separations(
log=log,
ra1=352.5342343,
dec1=89.23,
ra2="23:32:34.642",
dec2="89:12:34.9334"
)
angularSeparation, north, east = calculator.get()
print(angularSeparation, north, east)
# OUT: '78.9', '-73.1', '29.9')
```
"""
# Initialisation
def __init__(
self,
log,
ra1,
dec1,
ra2,
dec2,
settings=False
):
self.log = log
log.debug("instansiating a new 'separations' object")
self.settings = settings
self.ra1 = ra1
self.dec1 = dec1
self.ra2 = ra2
self.dec2 = dec2
# xt-self-arg-tmpx
return None
[docs]
def get(
self):
"""*Calulate the angular separation between two locations on the sky*
Input precision should be respected.
**Key Arguments**
**Return**
- ``angularSeparation`` -- total angular separation between coordinates (arcsec)
- ``north`` -- north-south separation between coordinates (arcsec)
- ``east`` -- east-west separation between coordinates (arcsec)
See main class usage for details.
"""
self.log.debug('starting the ``get_angular_separation`` method')
from astrocalc.coords import unit_conversion
# CONSTANTS
pi = (4 * math.atan(1.0))
DEG_TO_RAD_FACTOR = old_div(pi, 180.0)
RAD_TO_DEG_FACTOR = old_div(180.0, pi)
converter = unit_conversion(
log=self.log
)
dec1 = converter.dec_sexegesimal_to_decimal(
dec=self.dec1
)
dec2 = converter.dec_sexegesimal_to_decimal(
dec=self.dec2
)
ra1 = converter.ra_sexegesimal_to_decimal(
ra=self.ra1
)
ra2 = converter.ra_sexegesimal_to_decimal(
ra=self.ra2
)
# PRECISION TEST
precision = 100
vals = [dec1, dec2, ra1, ra2]
for v in vals:
thisLen = len(repr(v * 3600.).split(".")[-1])
if thisLen < precision:
precision = thisLen
angularSeparation = None
aa = (90.0 - dec1) * DEG_TO_RAD_FACTOR
bb = (90.0 - dec2) * DEG_TO_RAD_FACTOR
cc = (ra1 - ra2) * DEG_TO_RAD_FACTOR
one = math.cos(aa) * math.cos(bb)
two = math.sin(aa) * math.sin(bb) * math.cos(cc)
# Because acos() returns NaN outside the ranges of -1 to +1
# we need to check this. Double precision decimal places
# can give values like 1.0000000000002 which will throw an
# exception.
three = one + two
if (three > 1.0):
three = 1.0
if (three < -1.0):
three = -1.0
# BE CAREFUL WITH PRECISION PROPAGATION
thisVal = math.acos(three)
angularSeparation = float(thisVal) * RAD_TO_DEG_FACTOR * 3600.0
# Now work out N-S, E-W separations (object 1 relative to 2)
north = -(dec1 - dec2) * 3600.0
east = -(ra1 - ra2) * \
math.cos((dec1 + dec2) * DEG_TO_RAD_FACTOR / 2.) * 3600.0
angularSeparation = "%0.*f" % (precision, angularSeparation)
north = "%0.*f" % (precision, north)
east = "%0.*f" % (precision, east)
self.log.debug('completed the ``get_angular_separation`` method')
return angularSeparation, north, east
# use the tab-trigger below for new method
# xt-class-method