Source code for moana.frames
from __future__ import annotations
import numpy as np
import pandas as pd
import sys
try:
from typing import Literal
except:
from typing_extensions import Literal
[docs]
class LensReferenceFrame:
"""Reference frame where x-axis is a lens symmetry axis.
Args:
center: origin of the frame.
x_axis: direction of the x-axis. The primary (secondary) is '1' ('2'),
so '12' means: 'from the primary, to the secondary'.
"""
hint_frame = Literal['barycenter', 'primary', 'secondary']
hint_dir = Literal['12', '21']
def __init__(self, center: hint_frame = 'barycenter', x_axis: hint_dir = '12'):
self.center = center
self.x_axis = x_axis
@property
def center(self):
return self._center
@center.setter
def center(self, value):
self._center = value
if (not value == 'barycenter') & (not value == 'primary') & (not value == 'secondary'):
txt = "Argument error: [center = 'barycenter' | 'primary' | 'secondary']."
sys.exit(txt)
@property
def x_axis(self):
return self._x_axis
@x_axis.setter
def x_axis(self, value):
self._x_axis = value
if (not value == '12') & (not value == '21'):
txt = "Argument error: [x_axis = '12' | '21']."
sys.exit(txt)
[docs]
def to_frame(self, z: np.ndarray, new_frame: LensReferenceFrame, **kwargs):
"""Compute positions in a new reference frame.
Args:
z: position in old reference frame.
new_frame: new reference frame.
Keyword arguments:
sep (float): separation in Einstein units.
gl1 (float): distance from the barycenter to the primary, in Einstein
units
"""
z_new = pd.DataFrame()
z_new['before'] = z
z_new['after'] = z
sep = kwargs['sep']
gl1 = kwargs['gl1']
x_offset = 0
if not self._center == new_frame.center:
if self._center == 'primary':
if new_frame.center == 'secondary':
x_offset = sep
if new_frame.center == 'barycenter':
x_offset = np.abs(gl1)
if self._center == 'secondary':
if (new_frame.center == 'primary'):
x_offset = - sep
if (new_frame.center == 'barycenter'):
x_offset = - sep + np.abs(gl1)
if self._center == 'barycenter':
if (new_frame.center == 'primary'):
x_offset = - np.abs(gl1)
if (new_frame.center == 'secondary'):
x_offset = sep - np.abs(gl1)
if self._x_axis == new_frame.x_axis:
if self._x_axis == '12':
z_new['after'] = z_new['after'] - x_offset
if self._x_axis == '21':
z_new['after'] = z_new['after'] + x_offset
else:
z_new['after'] = - z_new['after'].values.conjugate()
if self._x_axis == '12':
z_new['after'] = z_new['after'] + x_offset
if self._x_axis == '21':
z_new['after'] = z_new['after'] - x_offset
return z_new['after'].values