Completed
Push — master ( 233f70...185362 )
by
unknown
10s
created

parse_DM()   A

Complexity

Conditions 3

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
c 0
b 0
f 0
dl 0
loc 11
rs 9.4285
1
"Some utility methods"
2
from __future__ import division
3
import numpy as np
4
from numpy import cos
5
from numpy import pi
6
from numpy import sin
7
8
from astropy.coordinates import Angle
9
from astropy.units import Quantity
10
from astropy.units.core import UnitConversionError
11
12
13
def parse_DM(in_DM):
14
    """ Convert, as necessary, DM into float
15
    """
16
    if isinstance(in_DM, float):
17
        DM = in_DM
18
    elif isinstance(in_DM, Quantity):
19
        DM = in_DM.to('pc/cm**3').value
20
    else:
21
        raise IOError("Bad format for input DM")
22
    # Return
23
    return DM
24
25
26
def parse_lbd(in_l, in_b, in_d):
27
    """ Convert, as necessary, l,b,d into floats
28
    Parameters
29
    ----------
30
    in_l : float or Angle
31
      Galactic longitude; assumed deg if unitless
32
    in_b : float
33
      Galactic latitude; assumed deg if unitless
34
    in_d : float or Quantity
35
      Distance to source; assumed kpc if unitless
36
37
    Returns
38
    -------
39
    l : float
40
    b : float
41
    d : float
42
      Distance in kpc
43
44
    """
45
    # l
46
    if isinstance(in_l, float):
47
        l = in_l
48
    elif isinstance(in_l, int):
49
        l = float(in_l)
50
    elif isinstance(in_l, (Angle,Quantity)):
51
        l = in_l.value
52
    else:
53
        raise IOError("Bad format for input Galactic longitude")
54
    # b
55
    if isinstance(in_b, float):
56
        b = in_b
57
    elif isinstance(in_b, int):
58
        b = float(in_b)
59
    elif isinstance(in_b, (Angle,Quantity)):
60
        b = in_b.value
61
    else:
62
        raise IOError("Bad format for input Galactic latitude")
63
    # d
64
    if isinstance(in_d, float):
65
        d = in_d
66
    elif isinstance(in_d, int):
67
        d = float(in_d)
68
    elif isinstance(in_d, (Quantity)):
69
        d = in_d.to('kpc').value
70
    else:
71
        raise IOError("Bad format for input distance")
72
    # Return
73
    return l,b,d
74
75
76
def galactic_to_galactocentric(l, b, distance, xyz_sun):
77
    slc = sin(l/180*pi)
78
    clc = cos(l/180*pi)
79
    sbc = sin(b/180*pi)
80
    cbc = cos(b/180*pi)
81
    rgalc = distance*cbc
82
    xc = xyz_sun[0] + rgalc*slc
83
    yc = xyz_sun[1] - rgalc*clc
84
    zc = xyz_sun[-1] + distance*sbc
85
    return np.array([xc, yc, zc])
86
87
88
def lzproperty(attribute):
89
    """
90
    Lazy property: evaluate property only once
91
    """
92
    save_att = '_' + attribute.__name__
93
94
    @property
95
    def _get(self):
96
        try:
97
            return getattr(self, save_att)
98
        except AttributeError:
99
            setattr(self, save_att, attribute(self))
100
        return getattr(self, save_att)
101
    return _get
102
103
104
def rotation(theta, axis=-1):
105
    """
106
    Return a rotation matrix around axis
107
    0:x, 1:y, 2:z
108
    """
109
    ct = cos(theta)
110
    st = sin(theta)
111
112
    if axis in (0, -3):
113
        return np.array([[1, 0, 0],
114
                         [0, ct, st],
115
                         [0, -st, ct]])
116
117
    if axis in (1, -2):
118
        return np.array([[ct, 0, st],
119
                         [0, 1, 0],
120
                         [-st, 0, ct]])
121
122
    if axis in (2, -1):
123
        return np.array([[ct, st, 0],
124
                         [-st, ct, 0],
125
                         [0, 0, 1]])
126
127
128
129