From fb2ac576eadb78f8082ec4f793838a2c7b3a4e78 Mon Sep 17 00:00:00 2001 From: rstiskalek Date: Mon, 23 Oct 2023 16:01:26 +0100 Subject: [PATCH] Add great circle distance --- csiborgtools/__init__.py | 3 ++- csiborgtools/utils.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/csiborgtools/__init__.py b/csiborgtools/__init__.py index b791fa6..7cad633 100644 --- a/csiborgtools/__init__.py +++ b/csiborgtools/__init__.py @@ -16,7 +16,8 @@ from csiborgtools import clustering, field, match, read, summary from .utils import (center_of_mass, delta2ncells, number_counts, # noqa periodic_distance, periodic_distance_two_points, # noqa - binned_statistic, cosine_similarity, fprint) # noqa + binned_statistic, cosine_similarity, fprint, # noqa + great_circle_distance) # noqa # Arguments to csiborgtools.read.Paths. diff --git a/csiborgtools/utils.py b/csiborgtools/utils.py index ccbf721..7cc5c72 100644 --- a/csiborgtools/utils.py +++ b/csiborgtools/utils.py @@ -148,6 +148,26 @@ def radec_to_cartesian(X): ]).T +@jit(nopython=True, fastmath=True, boundscheck=False) +def great_circle_distance(x1, x2): + """ + Great circle distance between two points on a sphere, defined by RA and + dec, both in degrees. + """ + ra1, dec1 = x1 + ra2, dec2 = x2 + + ra1 *= numpy.pi / 180 + dec1 *= numpy.pi / 180 + ra2 *= numpy.pi / 180 + dec2 *= numpy.pi / 180 + + return 180 / numpy.pi * numpy.arccos( + numpy.sin(dec1) * numpy.sin(dec2) + + numpy.cos(dec1) * numpy.cos(dec2) * numpy.cos(ra1 - ra2) + ) + + def cosine_similarity(x, y): r""" Calculate the cosine similarity between two Cartesian vectors. Defined