1# http://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6import numpy as num
8from pyrocko import moment_tensor as pmt
11def project(mt):
12 '''
13 Calculate Hudson's (u, v) coordinates for a given moment tensor.
15 The moment tensor can be given as a
16 :py:class:`pyrocko.moment_tensor.MomentTensor` object, or by anything that
17 can be converted to a 3x3 NumPy matrix, or as the six independent moment
18 tensor entries as ``(mnn, mee, mdd, mne, mnd, med)``.
19 '''
21 mt = pmt.values_to_matrix(mt)
22 eig_m = pmt.eigh_check(mt)[0]
23 m3, m2, m1 = eig_m / num.max(num.abs(eig_m))
24 u = -2./3. * (m1 + m3 - 2.0*m2)
25 v = 1./3. * (m1 + m2 + m3)
26 return u, v
29def draw_axes(axes, color='black', fontsize=12, linewidth=1.5):
31 '''
32 Plot axes and annotations of Hudson's MT decomposition diagram.
33 '''
35 axes.set_axis_off()
36 axes.set_aspect(1.0)
38 axes.set_xlim(-4./3.-0.1, 4./3.+0.1)
39 axes.set_ylim(-1.1, 1.1)
41 axes.plot(
42 [-4./3., 0., 4./3., 0., -4/3.],
43 [-1./3., -1., 1./3., 1., -1./3.],
44 zorder=-1,
45 linewidth=linewidth,
46 color=color)
48 axes.plot(
49 [-1.0, 1.0],
50 [0., 0.],
51 zorder=-1,
52 linewidth=linewidth,
53 color=color)
55 axes.plot(
56 [0., 0.],
57 [-1., 1.],
58 zorder=-1,
59 linewidth=linewidth,
60 color=color)
62 d = fontsize/3.
63 for txt, pos, off, va, ha in [
64 ('+Isotropic', (0., 1.), (-d, d), 'bottom', 'right'),
65 ('-Isotropic', (0., -1.), (d, -d), 'top', 'left'),
66 ('-CLVD', (+1.0, 0.), (d, -d), 'top', 'left'),
67 ('+CLVD', (-1.0, 0.), (-d, d), 'bottom', 'right')]:
69 axes.plot(
70 pos[0], pos[1], 'o',
71 color=color,
72 markersize=fontsize/2.)
74 axes.annotate(
75 txt,
76 xy=pos,
77 xycoords='data',
78 xytext=off,
79 textcoords='offset points',
80 verticalalignment=va,
81 horizontalalignment=ha,
82 rotation=0.)
84 for txt, pos, off, va, ha in [
85 ('-Dipole', (2./3., -1./3.), (d, -d), 'top', 'left'),
86 ('+Dipole', (-2./3., 1./3.), (-d, d), 'bottom', 'right'),
87 ('-Crack', (4./9., -5./9.), (d, -d), 'top', 'left'),
88 ('+Crack', (-4./9., 5./9.), (-d, d), 'bottom', 'right')]:
90 axes.plot(
91 pos[0], pos[1], 'o',
92 color=color,
93 markersize=fontsize/2.)
95 axes.annotate(
96 txt,
97 xy=pos,
98 xycoords='data',
99 xytext=off,
100 textcoords='offset points',
101 verticalalignment=va,
102 horizontalalignment=ha,
103 rotation=0.)