Source code for etrsitrs.parameterset

from numpy import array


[docs]class ParameterSet(object): r''' A ParameterSet holds either the parameters :math:`Tn`, :math:`D`, and :math:`Rn`, or their derivatives with respect to time, in units of meters for :math:`Tn`, and radians for :math:`Rn`. **Parameters** translate_m : sequence of floats A vector containing the translation parameters T1, T2, and T3 in units of meters. term_d : float Term D from Boucher and Altamimi. It is the cosine of a tiny rotation, minus 1. rotate_rad : sequence of floats The rotation parameters R1, R2, and R3 in units of radians. **Examples** >>> ParameterSet((0.01, 0.02, 0.03), 3.14e-9, [-0.1, -0.2, -0.3]) ParameterSet(translate_m = array([ 0.01, 0.02, 0.03]), term_d = 3.1400e-09, rotate_rad = array([-0.1, -0.2, -0.3])) >>> ParameterSet((0.01, 0.02), 3.14e-9, [-0.1, -0.2, -0.3]) Traceback (most recent call last): ... ValueError: translate_m((0.01, 0.02)) must be e sequence of 3 floats. >>> ParameterSet((0.01, 0.02, 0.03), 3.14, [-0.1, -0.2, -0.3]) Traceback (most recent call last): ... ValueError: term_d(3.14) must be a very small number. >>> ParameterSet((0.01, 0.02, 0.03), 3.14e-9, 15.0) Traceback (most recent call last): ... TypeError: object of type 'float' has no len() >>> ParameterSet((0.01, 0.02, 0.03), 3.14e-9, (15.0,14,13,12)) Traceback (most recent call last): ... ValueError: rotate_rad((15.0, 14, 13, 12)) must be e sequence of 3 floats. ``ParameterSet`` also supports multiplication by a number and addition of two ``ParameterSet`` s >>> from math import pi >>> mm = 0.001 >>> mas = pi/(180.0*3600.0*1000.0) >>> parameters = ParameterSet(array([52.1, 49.3, -58.5])*mm, ... 1.34e-9, ... array([0.891, 5.390, -8.712])*mas) >>> parameters ParameterSet(translate_m = array([ 0.0521, 0.0493, -0.0585]), term_d = 1.3400e-09, rotate_rad = array([ 4.31968990e-09, 2.61314574e-08, -4.22369679e-08])) >>> rates = ParameterSet(array([0.1, 0.1, -1.8])*mm, ... 0.08e-9, ... array([0.081, 0.490, -0.792])*mas) >>> rates ParameterSet(translate_m = array([ 0.0001, 0.0001, -0.0018]), term_d = 8.0000e-11, rotate_rad = array([ 3.92699082e-10, 2.37558704e-09, -3.83972435e-09])) >>> ref_epoch = 2000.0 >>> parameters + rates*(2010.0 - ref_epoch) ParameterSet(translate_m = array([ 0.0531, 0.0503, -0.0765]), term_d = 2.1400e-09, rotate_rad = array([ 8.24668072e-09, 4.98873278e-08, -8.06342114e-08])) ''' def __init__(self, translate_m, term_d, rotate_rad): self.translate_m = array(translate_m) self.term_d = term_d self.rotate_rad = array(rotate_rad) if len(translate_m) != 3: raise ValueError('translate_m(%r) must be e sequence of 3 floats.' % (translate_m,)) if term_d > 1e-6: raise ValueError('term_d(%r) must be a very small number.' % (term_d,)) if len(rotate_rad) != 3: raise ValueError('rotate_rad(%r) must be e sequence of 3 floats.' % (rotate_rad,)) def __repr__(self): return ('ParameterSet(translate_m = %r, term_d = %.4e, rotate_rad = %r)' % (self.translate_m, self.term_d, self.rotate_rad))
[docs] def matrix(self): r''' **Returns** The matrix .. math:: \left(\begin{array}{ccc} D & -R3 & R2 \\ R3 & D & -R1 \\ -R2 & R1 & D \end{array}\right) **Examples** >>> ps = ParameterSet((0.01, 0.02, 0.03), 3.14e-9, [-0.1, -0.2, -0.3]) >>> ps.matrix() array([[ 3.14000000e-09, 3.00000000e-01, -2.00000000e-01], [ -3.00000000e-01, 3.14000000e-09, 1.00000000e-01], [ 2.00000000e-01, -1.00000000e-01, 3.14000000e-09]]) ''' r_1, r_2, r_3 = self.rotate_rad return array([[self.term_d, -r_3 , r_2], [r_3 , self.term_d, -r_1], [-r_2 , r_1 , self.term_d]])
def __mul__(self, number): return ParameterSet(translate_m = self.translate_m * number, term_d = self.term_d * number, rotate_rad = self.rotate_rad * number) def __add__(self, parameter_set): other = parameter_set return ParameterSet(translate_m = self.translate_m + other.translate_m, term_d = self.term_d + other.term_d, rotate_rad = self.rotate_rad + other.rotate_rad)