Skip to content

Commit bcafaa5

Browse files
committed
add source utility
1 parent b7b1395 commit bcafaa5

File tree

13 files changed

+259
-121
lines changed

13 files changed

+259
-121
lines changed

pytomo3d/adjoint/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
"""
4+
:copyright:
5+
Wenjie Lei (lei@princeton.edu), 2016
6+
:license:
7+
GNU General Public License, Version 3
8+
(http://www.gnu.org/copyleft/gpl.html)
9+
"""
10+
11+
from __future__ import (absolute_import, division, print_function)
12+
13+
from .adjsrc import calculate_adjsrc_on_stream # NOQA

pytomo3d/adjoint/examples/cc_traveltime.adjoint.config.yaml

Lines changed: 0 additions & 9 deletions
This file was deleted.

pytomo3d/adjoint/examples/multitaper.adjoint.config.yaml

Lines changed: 0 additions & 20 deletions
This file was deleted.

pytomo3d/adjoint/examples/waveform.adjoint.config.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

pytomo3d/signal/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
"""
4+
:copyright:
5+
Wenjie Lei (lei@princeton.edu), 2016
6+
:license:
7+
GNU General Public License, Version 3
8+
(http://www.gnu.org/copyleft/gpl.html)
9+
"""
10+
11+
from __future__ import (absolute_import, division, print_function)
12+
13+
from .process import process_stream # NOQA

pytomo3d/signal/process.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,14 @@ def interpolate_stream(stream, sampling_rate, starttime=None, npts=None):
157157
return st_new
158158

159159

160-
def process(st, remove_response_flag=False, inventory=None,
161-
filter_flag=False, pre_filt=None,
162-
starttime=None, endtime=None,
163-
resample_flag=False, sampling_rate=1.0,
164-
taper_type="hann", taper_percentage=0.05,
165-
rotate_flag=False, event_latitude=None,
166-
event_longitude=None, sanity_check=False,
167-
**kwargs):
160+
def process_stream(st, remove_response_flag=False, inventory=None,
161+
filter_flag=False, pre_filt=None,
162+
starttime=None, endtime=None,
163+
resample_flag=False, sampling_rate=1.0,
164+
taper_type="hann", taper_percentage=0.05,
165+
rotate_flag=False, event_latitude=None,
166+
event_longitude=None, sanity_check=False,
167+
**kwargs):
168168
"""
169169
Stream processing function defined for general purpose of tomography.
170170
The advantage of using Stream, rather than than Trace, is that rotation

pytomo3d/signal/tests/test_signal.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,14 @@ def test_process_obsd():
137137
pre_filt = [1/90., 1/60., 1/27.0, 1/22.5]
138138
t1 = event_time
139139
t2 = event_time + 6000.0
140-
st_new = proc.process(st, remove_response_flag=True, inventory=inv,
141-
filter_flag=True, pre_filt=pre_filt,
142-
starttime=t1, endtime=t2, resample_flag=True,
143-
sampling_rate=2.0, taper_type="hann",
144-
taper_percentage=0.05, rotate_flag=True,
145-
event_latitude=event_lat,
146-
event_longitude=event_lon)
140+
st_new = proc.process_stream(
141+
st, remove_response_flag=True, inventory=inv,
142+
filter_flag=True, pre_filt=pre_filt,
143+
starttime=t1, endtime=t2, resample_flag=True,
144+
sampling_rate=2.0, taper_type="hann",
145+
taper_percentage=0.05, rotate_flag=True,
146+
event_latitude=event_lat,
147+
event_longitude=event_lon)
147148
bmfile = os.path.join(DATA_DIR, "proc", "IU.KBL.obs.proc.mseed")
148149
st_compare = obspy.read(bmfile)
149150
assert compare_stream_kernel(st_new, st_compare)
@@ -161,14 +162,15 @@ def test_process_obsd_2():
161162
pre_filt = [1/90., 1/60., 1/27.0, 1/22.5]
162163
t1 = event_time
163164
t2 = event_time + 6000.0
164-
st_new = proc.process(st, remove_response_flag=True, inventory=inv,
165-
filter_flag=True, pre_filt=pre_filt,
166-
starttime=t1, endtime=t2, resample_flag=True,
167-
sampling_rate=2.0, taper_type="hann",
168-
taper_percentage=0.05, rotate_flag=True,
169-
event_latitude=event_lat,
170-
event_longitude=event_lon,
171-
sanity_check=True)
165+
st_new = proc.process_stream(
166+
st, remove_response_flag=True, inventory=inv,
167+
filter_flag=True, pre_filt=pre_filt,
168+
starttime=t1, endtime=t2, resample_flag=True,
169+
sampling_rate=2.0, taper_type="hann",
170+
taper_percentage=0.05, rotate_flag=True,
171+
event_latitude=event_lat,
172+
event_longitude=event_lon,
173+
sanity_check=True)
172174
bmfile = os.path.join(DATA_DIR, "proc", "IU.KBL.obs.proc.mseed")
173175
st_compare = obspy.read(bmfile)
174176
assert len(st_new) == 1
@@ -190,13 +192,14 @@ def test_process_synt():
190192
pre_filt = [1/90., 1/60., 1/27.0, 1/22.5]
191193
t1 = event_time
192194
t2 = event_time + 6000.0
193-
st_new = proc.process(st, remove_response_flag=False, inventory=inv,
194-
filter_flag=True, pre_filt=pre_filt,
195-
starttime=t1, endtime=t2, resample_flag=True,
196-
sampling_rate=2.0, taper_type="hann",
197-
taper_percentage=0.05, rotate_flag=True,
198-
event_latitude=event_lat,
199-
event_longitude=event_lon)
195+
st_new = proc.process_stream(
196+
st, remove_response_flag=False, inventory=inv,
197+
filter_flag=True, pre_filt=pre_filt,
198+
starttime=t1, endtime=t2, resample_flag=True,
199+
sampling_rate=2.0, taper_type="hann",
200+
taper_percentage=0.05, rotate_flag=True,
201+
event_latitude=event_lat,
202+
event_longitude=event_lon)
200203
bmfile = os.path.join(DATA_DIR, "proc", "IU.KBL.syn.proc.mseed")
201204
st_compare = obspy.read(bmfile)
202205
assert compare_stream_kernel(st_new, st_compare)

pytomo3d/source/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
"""
4+
:copyright:
5+
Wenjie Lei (lei@princeton.edu), 2016
6+
:license:
7+
GNU General Public License, Version 3
8+
(http://www.gnu.org/copyleft/gpl.html)
9+
"""
10+
11+
from __future__ import (absolute_import, division, print_function)
12+
13+
from .append_cmtsolution import append_cmt_to_catalog # NOQA
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
"""
4+
Functions that append CMTSOLUTION information into catalog
5+
:copyright:
6+
Wenjie Lei (lei@princeton.edu), 2016
7+
:license:
8+
GNU Lesser General Public License, version 3 (LGPLv3)
9+
(http://www.gnu.org/licenses/lgpl-3.0.en.html)
10+
"""
11+
from __future__ import print_function, division
12+
import obspy
13+
from obspy.core.event.source import ResourceIdentifier
14+
from obspy.core.event import Catalog
15+
from obspy.core.event import CreationInfo
16+
17+
18+
def _validator(event, cmt_origin, cmt_mag, cmt_focal):
19+
if event.preferred_origin() != cmt_origin:
20+
raise ValueError("preferred_origin_id wrong, not the same as the "
21+
"new added cmt")
22+
if event.preferred_magnitude() != cmt_mag:
23+
raise ValueError("preferred_magnitude_id wrong, not the same as "
24+
"the new added cmt")
25+
if event.preferred_focal_mechanism() != cmt_focal:
26+
raise ValueError("preferred_focal_mechanism_id wrong, not the same "
27+
"as the new added cmt")
28+
29+
30+
def prepare_cmt_origin(cmt, tag, creation_info):
31+
cmt_origin = None
32+
for _origin in cmt.origins:
33+
if str(_origin.resource_id).endswith("origin#cmt"):
34+
cmt_origin = _origin
35+
break
36+
37+
if cmt_origin is None:
38+
raise ValueError("No cmt origin found")
39+
40+
new_id = str(cmt_origin.resource_id).strip() + "#%s" % tag
41+
# new_id = str(cmt_origin.resource_id).replace("origin#cmt",
42+
# "origin#%s" % tag)
43+
cmt_origin.resource_id = ResourceIdentifier(new_id)
44+
cmt_origin.creation_info = creation_info
45+
return cmt_origin
46+
47+
48+
def prepare_cmt_mag(cmt, tag, origin_id, creation_info):
49+
cmt_mag = None
50+
for _mag in cmt.magnitudes:
51+
if _mag.magnitude_type == "mw":
52+
cmt_mag = _mag
53+
54+
if cmt_mag is None:
55+
raise ValueError("No cmt Mw mag found")
56+
57+
new_id = str(cmt_mag.resource_id).strip() + "#%s" % tag
58+
cmt_mag.resource_id = ResourceIdentifier(new_id)
59+
cmt_mag.origin_id = origin_id
60+
cmt_mag.creation_info = creation_info
61+
return cmt_mag
62+
63+
64+
def prepare_cmt_focal(cmt, tag, origin_id, mag_id, creation_info):
65+
66+
cmt_focal = None
67+
for _focal in cmt.focal_mechanisms:
68+
if "cmtsolution" in str(_focal.resource_id):
69+
cmt_focal = _focal
70+
break
71+
72+
if cmt_focal is None:
73+
raise ValueError("no cmt focal found")
74+
75+
focal_id = str(cmt_focal.resource_id).strip() + "#%s" % tag
76+
cmt_focal.resource_id = ResourceIdentifier(focal_id)
77+
cmt_focal.creation_info = creation_info
78+
tensor = cmt_focal.moment_tensor
79+
tensor_id = str(tensor.resource_id).strip() + "#%s" % tag
80+
tensor.resource_id = ResourceIdentifier(tensor_id)
81+
tensor.derived_origin_id = origin_id
82+
tensor.moment_magnitude_id = mag_id
83+
tensor.creation_info = creation_info
84+
return cmt_focal
85+
86+
87+
def append_cmt_to_catalog(event, cmt, tag, change_preferred_id=True):
88+
"""
89+
Add cmt to event. The cmt.resource_id will be appened tag to avoid
90+
tag duplication problem in event.
91+
:param event: the event that you want to add cmt in.
92+
:type event: str, obspy.core.event.Event or obspy.core.event.Catalog
93+
:param cmt: the cmt that you want to add to event.
94+
:type event: str, obspy.core.event.Event or obspy.core.event.Catalog
95+
:param change_preferred_id: change all preferred_id to the new added cmt
96+
:type change_preferred_id: bool
97+
"""
98+
if isinstance(event, str):
99+
event = obspy.read_events(event)[0]
100+
elif isinstance(event, Catalog):
101+
event = event[0]
102+
103+
if isinstance(cmt, str):
104+
cmt_event = obspy.read_events(cmt)[0]
105+
elif isinstance(cmt, Catalog):
106+
cmt_event = cmt_event[0]
107+
108+
if not isinstance(tag, str):
109+
raise TypeError("tag(%s) should be type of str" % type(tag))
110+
111+
creation_info = CreationInfo(author="GATG", version=tag)
112+
113+
cmt_origin = prepare_cmt_origin(cmt_event, tag, creation_info)
114+
cmt_mag = prepare_cmt_mag(cmt_event, tag, cmt_origin.resource_id,
115+
creation_info)
116+
cmt_focal = prepare_cmt_focal(cmt_event, tag, cmt_origin.resource_id,
117+
cmt_mag.resource_id, creation_info)
118+
event.origins.append(cmt_origin)
119+
event.magnitudes.append(cmt_mag)
120+
event.focal_mechanisms.append(cmt_focal)
121+
122+
if change_preferred_id:
123+
event.preferred_origin_id = str(cmt_origin.resource_id)
124+
event.preferred_magnitude_id = str(cmt_mag.resource_id)
125+
event.preferred_focal_mechanism_id = str(cmt_focal.resource_id)
126+
_validator(event, cmt_origin, cmt_mag, cmt_focal)
127+
128+
new_cat = Catalog()
129+
new_cat.append(event)
130+
131+
return new_cat
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import os
2+
import inspect
3+
import pytomo3d.source.append_cmtsolution as app_cmt
4+
5+
6+
def _upper_level(path, nlevel=4):
7+
"""
8+
Go the nlevel dir up
9+
"""
10+
for i in range(nlevel):
11+
path = os.path.dirname(path)
12+
return path
13+
14+
# Most generic way to get the data folder path.
15+
TESTBASE_DIR = _upper_level(os.path.abspath(
16+
inspect.getfile(inspect.currentframe())), 4)
17+
DATA_DIR = os.path.join(TESTBASE_DIR, "tests", "data")
18+
19+
testquakeml = os.path.join(DATA_DIR, "quakeml", "C201009031635A.xml")
20+
testcmt = os.path.join(DATA_DIR, "quakeml", "C201009031635A.inv")
21+
22+
23+
def test_append_cmt_to_catalog():
24+
tag = "GATG_M15"
25+
new_cat = app_cmt.append_cmt_to_catalog(
26+
testquakeml, testcmt, tag, change_preferred_id=True)
27+
28+
assert new_cat[0].preferred_origin()
29+
assert new_cat[0].preferred_magnitude()
30+
assert new_cat[0].preferred_focal_mechanism()

0 commit comments

Comments
 (0)