crimeacs commited on
Commit
d59f437
1 Parent(s): 15dbd99

section plot updated

Browse files
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
Gradio_app.ipynb CHANGED
@@ -2,178 +2,27 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 8,
6
  "metadata": {},
7
  "outputs": [
8
  {
9
- "name": "stdout",
10
- "output_type": "stream",
11
- "text": [
12
- "Inventory created at 2023-03-31T20:48:41.380800Z\n",
13
- "\tCreated by: IRIS WEB SERVICE: fdsnws-station | version: 1.1.52\n",
14
- "\t\t http://service.iris.edu/fdsnws/station/1/query?starttime=2019-07-...\n",
15
- "\tSending institution: IRIS-DMC (IRIS-DMC)\n",
16
- "\tContains:\n",
17
- "\t\tNetworks (7):\n",
18
- "\t\t\t8P, CI, LB, NN, NP, PB, SY\n",
19
- "\t\tStations (85):\n",
20
- "\t\t\t8P.CAU08 (Monache Meadows, CA, USA)\n",
21
- "\t\t\tCI.APL (Apollo)\n",
22
- "\t\t\tCI.CCA (California City Airport)\n",
23
- "\t\t\tCI.CCC (Christmas Canyon China Lake)\n",
24
- "\t\t\tCI.CGO (Cerro Gordo)\n",
25
- "\t\t\tCI.CLC (China Lake)\n",
26
- "\t\t\tCI.CWC (Cottonwood Creek)\n",
27
- "\t\t\tCI.DAW (Darwin)\n",
28
- "\t\t\tCI.DTP (Desert Tortoise Park)\n",
29
- "\t\t\tCI.GSC (Goldstone)\n",
30
- "\t\t\tCI.HAR (Harper Dry Lake bed)\n",
31
- "\t\t\tCI.ISA (Isabella)\n",
32
- "\t\t\tCI.JRC2 (Joshua Ridge: China Lake)\n",
33
- "\t\t\tCI.LMR2 (Leuhmann Ridge Extension)\n",
34
- "\t\t\tCI.LRL (Laurel Mtn)\n",
35
- "\t\t\tCI.MPM (Manuel Prospect Mine)\n",
36
- "\t\t\tCI.MRS (Mars)\n",
37
- "\t\t\tCI.Q0068 (Redwood Blvd, California City CA)\n",
38
- "\t\t\tCI.Q0072 (Lakeland Street, Ridgecrest CA)\n",
39
- "\t\t\tCI.SLA (Slate Mountain)\n",
40
- "\t\t\tCI.SRT (Snort)\n",
41
- "\t\t\tCI.TEH (Cattani Ranch)\n",
42
- "\t\t\tCI.TOW2 (Tower 2)\n",
43
- "\t\t\tCI.WAS2 (Alta Sierra 2)\n",
44
- "\t\t\tCI.WBM (Bowman Road)\n",
45
- "\t\t\tCI.WBS (Bird Springs)\n",
46
- "\t\t\tCI.WCS2 (Coso Hot Springs 2)\n",
47
- "\t\t\tCI.WHF (Hanning Flat)\n",
48
- "\t\t\tCI.WLH2 (Little Horse 2)\n",
49
- "\t\t\tCI.WMF (Mccloud Flat)\n",
50
- "\t\t\tCI.WNM (Nine Mile Canyon)\n",
51
- "\t\t\tCI.WOR (Onyx Ranch)\n",
52
- "\t\t\tCI.WRC2 (Renegade Canyon)\n",
53
- "\t\t\tCI.WRV2 (Rose Valley Canyon 2)\n",
54
- "\t\t\tCI.WVP2 (Volcano Peak 2)\n",
55
- "\t\t\tLB.DAC (Inyo County, Darwin, CA, USA)\n",
56
- "\t\t\tNN.GWY (Greenwater Valley, CA. (GPS 12/06/2000) w84gm)\n",
57
- "\t\t\tNN.PAN (Panamint Range. (GPS 12/06/2000) w84gm)\n",
58
- "\t\t\tNN.QSM (Queen of Sheba Mine, CA. (GPS 01/17/2001) w84gm)\n",
59
- "\t\t\tNP.1035 (CA:Lake Isabella Dam)\n",
60
- "\t\t\tNP.1809 (CA:Haiwee Rsvr;Pump Pl)\n",
61
- "\t\t\tNP.5419 (CA:China Lake;Nav Weapon Ctr)\n",
62
- "\t\t\tPB.B916 (marips916bcs2008, China Lake, CA, USA)\n",
63
- "\t\t\tPB.B917 (tonyso917bcs2008, China Lake, CA, USA)\n",
64
- "\t\t\tPB.B918 (mtsprn918bcs2008, China Lake, CA, USA)\n",
65
- "\t\t\tPB.B921 (randsb921bcs2008, China Lake, CA, USA)\n",
66
- "\t\t\tSY.CCA (CCA synthetic)\n",
67
- "\t\t\tSY.CCC (CCC synthetic)\n",
68
- "\t\t\tSY.CGO (CGO synthetic)\n",
69
- "\t\t\tSY.CLC (CLC synthetic)\n",
70
- "\t\t\tSY.CWC (CWC synthetic)\n",
71
- "\t\t\tSY.DAC (DAC synthetic)\n",
72
- "\t\t\tSY.DAW (DAW synthetic)\n",
73
- "\t\t\tSY.DTP (DTP synthetic)\n",
74
- "\t\t\tSY.FPC (FPC synthetic)\n",
75
- "\t\t\tSY.FSR (FSR synthetic)\n",
76
- "\t\t\tSY.GPO (GPO synthetic)\n",
77
- "\t\t\tSY.GSC (GSC synthetic)\n",
78
- "\t\t\tSY.HAR (HAR synthetic)\n",
79
- "\t\t\tSY.ISA (ISA synthetic)\n",
80
- "\t\t\tSY.JRC (JRC synthetic)\n",
81
- "\t\t\tSY.JRC2 (JRC2 synthetic)\n",
82
- "\t\t\tSY.KRV3 (KRV3 synthetic)\n",
83
- "\t\t\tSY.LMR (LMR synthetic)\n",
84
- "\t\t\tSY.LMR2 (LMR2 synthetic)\n",
85
- "\t\t\tSY.LRL (LRL synthetic)\n",
86
- "\t\t\tSY.MPM (MPM synthetic)\n",
87
- "\t\t\tSY.OVRO (OVRO synthetic)\n",
88
- "\t\t\tSY.RRC (RRC synthetic)\n",
89
- "\t\t\tSY.SEV (SEV synthetic)\n",
90
- "\t\t\tSY.SLA (SLA synthetic)\n",
91
- "\t\t\tSY.SRT (SRT synthetic)\n",
92
- "\t\t\tSY.TEH (TEH synthetic)\n",
93
- "\t\t\tSY.TOW2 (TOW2 synthetic)\n",
94
- "\t\t\tSY.WAS2 (WAS2 synthetic)\n",
95
- "\t\t\tSY.WBM (WBM synthetic)\n",
96
- "\t\t\tSY.WBP (WBP synthetic)\n",
97
- "\t\t\tSY.WBS (WBS synthetic)\n",
98
- "\t\t\tSY.WCS2 (WCS2 synthetic)\n",
99
- "\t\t\tSY.WHF (WHF synthetic)\n",
100
- "\t\t\tSY.WLH2 (WLH2 synthetic)\n",
101
- "\t\t\tSY.WMF (WMF synthetic)\n",
102
- "\t\t\tSY.WNM (WNM synthetic)\n",
103
- "\t\t\tSY.WOR (WOR synthetic)\n",
104
- "\t\t\tSY.WRC2 (WRC2 synthetic)\n",
105
- "\t\tChannels (0):\n",
106
- "\n"
107
- ]
108
- }
109
- ],
110
- "source": [
111
- "import obspy\n",
112
- "from obspy.clients.fdsn import Client\n",
113
- "\n",
114
- "client_name = 'SCEDC'\n",
115
- "radius_km = 100\n",
116
- "timestamp = '2019-07-04 17:33:49'\n",
117
- "eq_lat = 35.766\n",
118
- "eq_lon = -117.605\n",
119
- "\n",
120
- "origin_time = obspy.UTCDateTime(timestamp)\n",
121
- "\n",
122
- "client = Client(\"IRIS\")\n",
123
- "inventory = client.get_stations(network=\"*\", station=\"*\", channel=\"*\",\n",
124
- " starttime=origin_time, endtime=origin_time + 120,\n",
125
- " latitude=eq_lat, longitude=eq_lon, maxradius=radius_km/111.2)\n",
126
- "print(inventory)\n"
127
- ]
128
- },
129
- {
130
- "cell_type": "code",
131
- "execution_count": null,
132
- "metadata": {},
133
- "outputs": [],
134
- "source": [
135
- "\n",
136
- "\n",
137
- "client = Client(client_name)\n",
138
- "window = radius_km / 111.2\n",
139
- "\n",
140
- "assert eq_lat - window > -90 and eq_lat + window < 90, \"Latitude out of bounds\"\n",
141
- "assert eq_lon - window > -180 and eq_lon + window < 180, \"Longitude out of bounds\"\n",
142
- "\n",
143
- "starttime = obspy.UTCDateTime(timestamp)\n",
144
- "endtime = starttime + 120\n",
145
- "\n",
146
- "inv = client.get_stations(network=\"*\", station=\"*\", location=\"*\", channel=\"*H*\", \n",
147
- " starttime=starttime, endtime=endtime, \n",
148
- " minlatitude=(eq_lat-window), maxlatitude=(eq_lat+window),\n",
149
- " minlongitude=(eq_lon-window), maxlongitude=(eq_lon+window), \n",
150
- " level='station')"
151
- ]
152
- },
153
- {
154
- "cell_type": "code",
155
- "execution_count": 75,
156
- "metadata": {},
157
- "outputs": [
158
- {
159
- "ename": "NameError",
160
- "evalue": "name 't0s' is not defined",
161
- "output_type": "error",
162
- "traceback": [
163
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
164
- "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
165
- "Cell \u001b[0;32mIn[75], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m pd\u001b[39m.\u001b[39mdate_range(start\u001b[39m=\u001b[39mt0s[i], periods\u001b[39m=\u001b[39mwaveforms[i][\u001b[39m0\u001b[39m]\u001b[39m.\u001b[39mshape[\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m], freq\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39m1s\u001b[39m\u001b[39m'\u001b[39m)\n",
166
- "\u001b[0;31mNameError\u001b[0m: name 't0s' is not defined"
167
- ]
168
  }
169
  ],
170
  "source": [
171
- "import pandas as pd\n"
172
  ]
173
  },
174
  {
175
  "cell_type": "code",
176
- "execution_count": 114,
177
  "metadata": {},
178
  "outputs": [
179
  {
@@ -188,7 +37,7 @@
188
  "name": "stdout",
189
  "output_type": "stream",
190
  "text": [
191
- "Running on local URL: http://127.0.0.1:7935\n",
192
  "\n",
193
  "To create a public link, set `share=True` in `launch()`.\n"
194
  ]
@@ -196,7 +45,7 @@
196
  {
197
  "data": {
198
  "text/html": [
199
- "<div><iframe src=\"http://127.0.0.1:7935/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
200
  ],
201
  "text/plain": [
202
  "<IPython.core.display.HTML object>"
@@ -209,7 +58,7 @@
209
  "data": {
210
  "text/plain": []
211
  },
212
- "execution_count": 114,
213
  "metadata": {},
214
  "output_type": "execute_result"
215
  }
@@ -238,6 +87,8 @@
238
  "import matplotlib.pyplot as plt\n",
239
  "import matplotlib.dates as mdates\n",
240
  "\n",
 
 
241
  "def make_prediction(waveform):\n",
242
  " waveform = np.load(waveform)\n",
243
  " processed_input = prepare_waveform(waveform)\n",
@@ -297,6 +148,15 @@
297
  " plt.close(fig)\n",
298
  " return image\n",
299
  "\n",
 
 
 
 
 
 
 
 
 
300
  "def predict_on_section(client_name, timestamp, eq_lat, eq_lon, radius_km, source_depth_km, velocity_model):\n",
301
  " distances, t0s, st_lats, st_lons, waveforms = [], [], [], [], []\n",
302
  " \n",
@@ -318,6 +178,8 @@
318
  " level='station')\n",
319
  " \n",
320
  " waveforms = []\n",
 
 
321
  " for network in inv:\n",
322
  " for station in network:\n",
323
  " try:\n",
@@ -332,8 +194,12 @@
332
  " starttime = obspy.UTCDateTime(timestamp) + arrivals[0].time - 15\n",
333
  " endtime = starttime + 60\n",
334
  "\n",
335
- " waveform = client.get_waveforms(network=network.code, station=station.code, location=\"*\", channel=\"*\", \n",
336
- " starttime=starttime, endtime=endtime)\n",
 
 
 
 
337
  " \n",
338
  " waveform = waveform.select(channel=\"H[BH][ZNE]\")\n",
339
  " waveform = waveform.merge(fill_value=0)\n",
@@ -365,29 +231,39 @@
365
  " p_phases = output[:, 0]\n",
366
  " s_phases = output[:, 1]\n",
367
  "\n",
368
- " fig, ax = plt.subplots(nrows=1, figsize=(10, 3), sharex=True)\n",
 
 
 
 
369
  " for i in range(len(waveforms)):\n",
370
  " current_P = p_phases[i::len(waveforms)]\n",
371
  " current_S = s_phases[i::len(waveforms)]\n",
 
372
  " x = [t0s[i] + pd.Timedelta(seconds=k/100) for k in np.linspace(0,6000,6000)]\n",
373
  " x = mdates.date2num(x)\n",
374
- " ax.plot(x, waveforms[i][0, 0]+distances[i]*111.2, color='black', alpha=0.5)\n",
375
- " ax.scatter(x[int(current_P.mean()*waveforms[i][0].shape[-1])], waveforms[i][0, 0].mean()+distances[i]*111.2, color='r')\n",
376
- " ax.scatter(x[int(current_S.mean()*waveforms[i][0].shape[-1])], waveforms[i][0, 0].mean()+distances[i]*111.2, color='b')\n",
377
- " ax.set_ylabel('Z')\n",
378
  "\n",
379
- " ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))\n",
380
- " ax.xaxis.set_major_locator(mdates.SecondLocator(interval=10))\n",
 
381
  "\n",
382
- " # for a in ax:\n",
383
- " # a.axvline(current_P.mean()*waveforms[i][0].shape[-1], color='r', linestyle='--', label='P')\n",
384
- " # a.axvline(current_S.mean()*waveforms[i][0].shape[-1], color='b', linestyle='--', label='S')\n",
385
  "\n",
386
- " # ax[-1].set_xlabel('Time, samples')\n",
387
- " # ax[-1].set_ylabel('Uncert.')\n",
388
- " # ax[-1].legend()\n",
389
  "\n",
390
- " plt.subplots_adjust(hspace=0., wspace=0.)\n",
 
 
 
 
 
 
 
 
 
 
391
  " \n",
392
  " fig.canvas.draw();\n",
393
  " image = np.array(fig.canvas.renderer.buffer_rgba())\n",
@@ -401,12 +277,6 @@
401
  " learning_rate=3e-4)\n",
402
  "model.eval()\n",
403
  "\n",
404
- "\n",
405
- "\n",
406
- "# # Create the Gradio interface\n",
407
- "# gr.Interface(mark_phases, inputs, outputs, title='PhaseHunter').launch()\n",
408
- "\n",
409
- "\n",
410
  "with gr.Blocks() as demo:\n",
411
  " gr.Markdown(\"# PhaseHunter\")\n",
412
  " gr.Markdown(\"\"\"This app allows one to detect P and S seismic phases along with uncertainty of the detection. \n",
@@ -467,7 +337,9 @@
467
  " radius_inputs = gr.Slider(minimum=1, \n",
468
  " maximum=150, \n",
469
  " value=50, label=\"Radius (km)\", \n",
470
- " info=\"Select the radius around the earthquake to download data from\",\n",
 
 
471
  " interactive=True)\n",
472
  " \n",
473
  " velocity_inputs = gr.Dropdown(\n",
@@ -480,7 +352,7 @@
480
  " \n",
481
  " \n",
482
  " button = gr.Button(\"Predict phases\")\n",
483
- " outputs_section = gr.outputs.Image(label='Waveforms with Phases Marked', type='numpy')\n",
484
  " \n",
485
  " button.click(predict_on_section, \n",
486
  " inputs=[client_inputs, timestamp_inputs, \n",
@@ -494,41 +366,15 @@
494
  " Your waveform should be sampled at 100 sps and have 3 (Z, N, E) or 1 (Z) channels.\n",
495
  " \"\"\")\n",
496
  "\n",
497
- "\n",
498
- "\n",
499
  "demo.launch()"
500
  ]
501
  },
502
  {
503
  "cell_type": "code",
504
- "execution_count": 105,
505
  "metadata": {},
506
- "outputs": [
507
- {
508
- "data": {
509
- "text/plain": [
510
- "DatetimeIndex(['2019-07-04 17:33:49', '2019-07-04 17:33:50',\n",
511
- " '2019-07-04 17:33:51', '2019-07-04 17:33:52',\n",
512
- " '2019-07-04 17:33:53', '2019-07-04 17:33:54',\n",
513
- " '2019-07-04 17:33:55', '2019-07-04 17:33:56',\n",
514
- " '2019-07-04 17:33:57', '2019-07-04 17:33:58',\n",
515
- " ...\n",
516
- " '2019-07-04 19:13:39', '2019-07-04 19:13:40',\n",
517
- " '2019-07-04 19:13:41', '2019-07-04 19:13:42',\n",
518
- " '2019-07-04 19:13:43', '2019-07-04 19:13:44',\n",
519
- " '2019-07-04 19:13:45', '2019-07-04 19:13:46',\n",
520
- " '2019-07-04 19:13:47', '2019-07-04 19:13:48'],\n",
521
- " dtype='datetime64[ns]', length=6000, freq='S')"
522
- ]
523
- },
524
- "execution_count": 105,
525
- "metadata": {},
526
- "output_type": "execute_result"
527
- }
528
- ],
529
- "source": [
530
- "pd.date_range(start=obspy.UTCDateTime(\"2019-07-04 17:33:49\").timestamp*1e9, periods=6000, freq='s')"
531
- ]
532
  }
533
  ],
534
  "metadata": {
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 1,
6
  "metadata": {},
7
  "outputs": [
8
  {
9
+ "data": {
10
+ "text/plain": [
11
+ "'hi!'"
12
+ ]
13
+ },
14
+ "execution_count": 1,
15
+ "metadata": {},
16
+ "output_type": "execute_result"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  }
18
  ],
19
  "source": [
20
+ "'hi!'"
21
  ]
22
  },
23
  {
24
  "cell_type": "code",
25
+ "execution_count": 4,
26
  "metadata": {},
27
  "outputs": [
28
  {
 
37
  "name": "stdout",
38
  "output_type": "stream",
39
  "text": [
40
+ "Running on local URL: http://127.0.0.1:7862\n",
41
  "\n",
42
  "To create a public link, set `share=True` in `launch()`.\n"
43
  ]
 
45
  {
46
  "data": {
47
  "text/html": [
48
+ "<div><iframe src=\"http://127.0.0.1:7862/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
49
  ],
50
  "text/plain": [
51
  "<IPython.core.display.HTML object>"
 
58
  "data": {
59
  "text/plain": []
60
  },
61
+ "execution_count": 4,
62
  "metadata": {},
63
  "output_type": "execute_result"
64
  }
 
87
  "import matplotlib.pyplot as plt\n",
88
  "import matplotlib.dates as mdates\n",
89
  "\n",
90
+ "from glob import glob\n",
91
+ "\n",
92
  "def make_prediction(waveform):\n",
93
  " waveform = np.load(waveform)\n",
94
  " processed_input = prepare_waveform(waveform)\n",
 
148
  " plt.close(fig)\n",
149
  " return image\n",
150
  "\n",
151
+ "def variance_coefficient(residuals):\n",
152
+ " # calculate the variance of the residuals\n",
153
+ " var = residuals.var()\n",
154
+ " \n",
155
+ " # scale the variance to a coefficient between 0 and 1\n",
156
+ " coeff = 1 - (var / (residuals.max() - residuals.min()))\n",
157
+ " \n",
158
+ " return coeff\n",
159
+ "\n",
160
  "def predict_on_section(client_name, timestamp, eq_lat, eq_lon, radius_km, source_depth_km, velocity_model):\n",
161
  " distances, t0s, st_lats, st_lons, waveforms = [], [], [], [], []\n",
162
  " \n",
 
178
  " level='station')\n",
179
  " \n",
180
  " waveforms = []\n",
181
+ " cached_waveforms = glob(\"data/cached/*.mseed\")\n",
182
+ "\n",
183
  " for network in inv:\n",
184
  " for station in network:\n",
185
  " try:\n",
 
194
  " starttime = obspy.UTCDateTime(timestamp) + arrivals[0].time - 15\n",
195
  " endtime = starttime + 60\n",
196
  "\n",
197
+ " if f\"data/cached/{network.code}_{station.code}_{starttime}.mseed\" not in cached_waveforms:\n",
198
+ " waveform = client.get_waveforms(network=network.code, station=station.code, location=\"*\", channel=\"*\", \n",
199
+ " starttime=starttime, endtime=endtime)\n",
200
+ " waveform.write(f\"data/cached/{network.code}_{station.code}_{starttime}.mseed\", format=\"MSEED\")\n",
201
+ " else:\n",
202
+ " waveform = obspy.read(f\"data/cached/{network.code}_{station.code}_{starttime}.mseed\")\n",
203
  " \n",
204
  " waveform = waveform.select(channel=\"H[BH][ZNE]\")\n",
205
  " waveform = waveform.merge(fill_value=0)\n",
 
231
  " p_phases = output[:, 0]\n",
232
  " s_phases = output[:, 1]\n",
233
  "\n",
234
+ " # Max confidence - min variance \n",
235
+ " p_max_confidence = np.min([p_phases[i::len(waveforms)].std() for i in range(len(waveforms))]) \n",
236
+ " s_max_confidence = np.min([s_phases[i::len(waveforms)].std() for i in range(len(waveforms))])\n",
237
+ "\n",
238
+ " fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 3), sharex=True)\n",
239
  " for i in range(len(waveforms)):\n",
240
  " current_P = p_phases[i::len(waveforms)]\n",
241
  " current_S = s_phases[i::len(waveforms)]\n",
242
+ "\n",
243
  " x = [t0s[i] + pd.Timedelta(seconds=k/100) for k in np.linspace(0,6000,6000)]\n",
244
  " x = mdates.date2num(x)\n",
 
 
 
 
245
  "\n",
246
+ " # Normalize confidence for the plot\n",
247
+ " p_conf = 1/(current_P.std()/p_max_confidence).item()\n",
248
+ " s_conf = 1/(current_S.std()/s_max_confidence).item()\n",
249
  "\n",
250
+ " ax[0].plot(x, waveforms[i][0, 0]*10+distances[i]*111.2, color='black', alpha=0.5, lw=1)\n",
 
 
251
  "\n",
252
+ " ax[0].scatter(x[int(current_P.mean()*waveforms[i][0].shape[-1])], waveforms[i][0, 0].mean()+distances[i]*111.2, color='r', alpha=p_conf, marker='|')\n",
253
+ " ax[0].scatter(x[int(current_S.mean()*waveforms[i][0].shape[-1])], waveforms[i][0, 0].mean()+distances[i]*111.2, color='b', alpha=s_conf, marker='|')\n",
254
+ " ax[0].set_ylabel('Z')\n",
255
  "\n",
256
+ " ax[0].xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))\n",
257
+ " ax[0].xaxis.set_major_locator(mdates.SecondLocator(interval=5))\n",
258
+ " \n",
259
+ " ax[0].scatter(None, None, color='r', marker='|', label='P')\n",
260
+ " ax[0].scatter(None, None, color='b', marker='|', label='S')\n",
261
+ " ax[0].legend()\n",
262
+ "\n",
263
+ " ax[1].scatter(st_lats, st_lons, color='b', marker='d', label='Stations')\n",
264
+ " ax[1].scatter(eq_lat, eq_lon, color='r', marker='*', label='Earthquake')\n",
265
+ " ax[1].legend()\n",
266
+ " plt.subplots_adjust(hspace=0., wspace=0.)\n",
267
  " \n",
268
  " fig.canvas.draw();\n",
269
  " image = np.array(fig.canvas.renderer.buffer_rgba())\n",
 
277
  " learning_rate=3e-4)\n",
278
  "model.eval()\n",
279
  "\n",
 
 
 
 
 
 
280
  "with gr.Blocks() as demo:\n",
281
  " gr.Markdown(\"# PhaseHunter\")\n",
282
  " gr.Markdown(\"\"\"This app allows one to detect P and S seismic phases along with uncertainty of the detection. \n",
 
337
  " radius_inputs = gr.Slider(minimum=1, \n",
338
  " maximum=150, \n",
339
  " value=50, label=\"Radius (km)\", \n",
340
+ " step=10,\n",
341
+ " info=\"\"\"Select the radius around the earthquake to download data from.\\n \n",
342
+ " Note that the larger the radius, the longer the app will take to run.\"\"\",\n",
343
  " interactive=True)\n",
344
  " \n",
345
  " velocity_inputs = gr.Dropdown(\n",
 
352
  " \n",
353
  " \n",
354
  " button = gr.Button(\"Predict phases\")\n",
355
+ " outputs_section = gr.Image(label='Waveforms with Phases Marked', type='numpy', interactive=False)\n",
356
  " \n",
357
  " button.click(predict_on_section, \n",
358
  " inputs=[client_inputs, timestamp_inputs, \n",
 
366
  " Your waveform should be sampled at 100 sps and have 3 (Z, N, E) or 1 (Z) channels.\n",
367
  " \"\"\")\n",
368
  "\n",
 
 
369
  "demo.launch()"
370
  ]
371
  },
372
  {
373
  "cell_type": "code",
374
+ "execution_count": null,
375
  "metadata": {},
376
+ "outputs": [],
377
+ "source": []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  }
379
  ],
380
  "metadata": {
data/.DS_Store CHANGED
Binary files a/data/.DS_Store and b/data/.DS_Store differ
 
data/cached/CI_CCC_2019-07-04T17:33:40.494912Z.mseed ADDED
Binary file (123 kB). View file
 
data/cached/CI_WCS2_2019-07-04T17:33:40.200950Z.mseed ADDED
Binary file (111 kB). View file
 
data/cached/CI_WNM_2019-07-04T17:33:39.710492Z.mseed ADDED
Binary file (65.5 kB). View file
 
data/cached/NP_1809_2019-07-04T17:33:42.451267Z.mseed ADDED
Binary file (86 kB). View file