Spaces:
Runtime error
Runtime error
Fixed button bug and added contacts
Browse files
.vscode/settings.json
CHANGED
@@ -1,3 +1,6 @@
|
|
1 |
{
|
2 |
-
"python.formatting.provider": "
|
|
|
|
|
|
|
3 |
}
|
|
|
1 |
{
|
2 |
+
"python.formatting.provider": "none",
|
3 |
+
"[python]": {
|
4 |
+
"editor.defaultFormatter": "ms-python.black-formatter"
|
5 |
+
}
|
6 |
}
|
Gradio_app.ipynb
CHANGED
@@ -2,14 +2,14 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [
|
8 |
{
|
9 |
"name": "stdout",
|
10 |
"output_type": "stream",
|
11 |
"text": [
|
12 |
-
"Running on local URL: http://127.0.0.1:
|
13 |
"\n",
|
14 |
"To create a public link, set `share=True` in `launch()`.\n"
|
15 |
]
|
@@ -17,7 +17,7 @@
|
|
17 |
{
|
18 |
"data": {
|
19 |
"text/html": [
|
20 |
-
"<div><iframe src=\"http://127.0.0.1:
|
21 |
],
|
22 |
"text/plain": [
|
23 |
"<IPython.core.display.HTML object>"
|
@@ -30,7 +30,7 @@
|
|
30 |
"data": {
|
31 |
"text/plain": []
|
32 |
},
|
33 |
-
"execution_count":
|
34 |
"metadata": {},
|
35 |
"output_type": "execute_result"
|
36 |
}
|
@@ -667,6 +667,7 @@
|
|
667 |
" <li>Select an earthquake from the global earthquake catalogue and PhaseHunter will analyze seismic stations in the given radius.</li>\n",
|
668 |
" <li>Waveforms should be sampled at 100 samples/sec and have 3 (Z, N, E) or 1 (Z) channels. PhaseHunter analyzes the first 6000 samples of your file.</li>\n",
|
669 |
" </ul>\n",
|
|
|
670 |
"</div>\n",
|
671 |
"\"\"\")\n",
|
672 |
" with gr.Tab(\"Try on a single station\"):\n",
|
@@ -810,7 +811,7 @@
|
|
810 |
" interactive=True,\n",
|
811 |
" )\n",
|
812 |
" \n",
|
813 |
-
"
|
814 |
" output_image = gr.Image(label='Waveforms with Phases Marked', type='numpy', interactive=False)\n",
|
815 |
" \n",
|
816 |
" with gr.Row():\n",
|
@@ -839,7 +840,7 @@
|
|
839 |
" interactive=False)\n",
|
840 |
" output_csv = gr.File(label=\"Output File\", file_types=[\".csv\"])\n",
|
841 |
"\n",
|
842 |
-
"
|
843 |
" inputs=[client_inputs, timestamp_inputs, \n",
|
844 |
" eq_lat_inputs, eq_lon_inputs, \n",
|
845 |
" radius_inputs, source_depth_inputs, \n",
|
@@ -1465,7 +1466,7 @@
|
|
1465 |
"name": "python",
|
1466 |
"nbconvert_exporter": "python",
|
1467 |
"pygments_lexer": "ipython3",
|
1468 |
-
"version": "3.
|
1469 |
},
|
1470 |
"orig_nbformat": 4
|
1471 |
},
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 5,
|
6 |
"metadata": {},
|
7 |
"outputs": [
|
8 |
{
|
9 |
"name": "stdout",
|
10 |
"output_type": "stream",
|
11 |
"text": [
|
12 |
+
"Running on local URL: http://127.0.0.1:7862\n",
|
13 |
"\n",
|
14 |
"To create a public link, set `share=True` in `launch()`.\n"
|
15 |
]
|
|
|
17 |
{
|
18 |
"data": {
|
19 |
"text/html": [
|
20 |
+
"<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>"
|
21 |
],
|
22 |
"text/plain": [
|
23 |
"<IPython.core.display.HTML object>"
|
|
|
30 |
"data": {
|
31 |
"text/plain": []
|
32 |
},
|
33 |
+
"execution_count": 5,
|
34 |
"metadata": {},
|
35 |
"output_type": "execute_result"
|
36 |
}
|
|
|
667 |
" <li>Select an earthquake from the global earthquake catalogue and PhaseHunter will analyze seismic stations in the given radius.</li>\n",
|
668 |
" <li>Waveforms should be sampled at 100 samples/sec and have 3 (Z, N, E) or 1 (Z) channels. PhaseHunter analyzes the first 6000 samples of your file.</li>\n",
|
669 |
" </ul>\n",
|
670 |
+
" <p style=\"font-size: 16px; margin-bottom: 20px;\">Please contact me at [email protected] with questions and feedback</p>\n",
|
671 |
"</div>\n",
|
672 |
"\"\"\")\n",
|
673 |
" with gr.Tab(\"Try on a single station\"):\n",
|
|
|
811 |
" interactive=True,\n",
|
812 |
" )\n",
|
813 |
" \n",
|
814 |
+
" button_phases = gr.Button(\"Predict phases\")\n",
|
815 |
" output_image = gr.Image(label='Waveforms with Phases Marked', type='numpy', interactive=False)\n",
|
816 |
" \n",
|
817 |
" with gr.Row():\n",
|
|
|
840 |
" interactive=False)\n",
|
841 |
" output_csv = gr.File(label=\"Output File\", file_types=[\".csv\"])\n",
|
842 |
"\n",
|
843 |
+
" button_phases.click(predict_on_section, \n",
|
844 |
" inputs=[client_inputs, timestamp_inputs, \n",
|
845 |
" eq_lat_inputs, eq_lon_inputs, \n",
|
846 |
" radius_inputs, source_depth_inputs, \n",
|
|
|
1466 |
"name": "python",
|
1467 |
"nbconvert_exporter": "python",
|
1468 |
"pygments_lexer": "ipython3",
|
1469 |
+
"version": "3.9.8"
|
1470 |
},
|
1471 |
"orig_nbformat": 4
|
1472 |
},
|
app.py
CHANGED
@@ -629,6 +629,7 @@ with gr.Blocks() as demo:
|
|
629 |
<li>Select an earthquake from the global earthquake catalogue and PhaseHunter will analyze seismic stations in the given radius.</li>
|
630 |
<li>Waveforms should be sampled at 100 samples/sec and have 3 (Z, N, E) or 1 (Z) channels. PhaseHunter analyzes the first 6000 samples of your file.</li>
|
631 |
</ul>
|
|
|
632 |
</div>
|
633 |
""")
|
634 |
with gr.Tab("Try on a single station"):
|
@@ -772,7 +773,7 @@ with gr.Blocks() as demo:
|
|
772 |
interactive=True,
|
773 |
)
|
774 |
|
775 |
-
|
776 |
output_image = gr.Image(label='Waveforms with Phases Marked', type='numpy', interactive=False)
|
777 |
|
778 |
with gr.Row():
|
@@ -801,7 +802,7 @@ with gr.Blocks() as demo:
|
|
801 |
interactive=False)
|
802 |
output_csv = gr.File(label="Output File", file_types=[".csv"])
|
803 |
|
804 |
-
|
805 |
inputs=[client_inputs, timestamp_inputs,
|
806 |
eq_lat_inputs, eq_lon_inputs,
|
807 |
radius_inputs, source_depth_inputs,
|
|
|
629 |
<li>Select an earthquake from the global earthquake catalogue and PhaseHunter will analyze seismic stations in the given radius.</li>
|
630 |
<li>Waveforms should be sampled at 100 samples/sec and have 3 (Z, N, E) or 1 (Z) channels. PhaseHunter analyzes the first 6000 samples of your file.</li>
|
631 |
</ul>
|
632 |
+
<p style="font-size: 16px; margin-bottom: 20px;">Please contact me at [email protected] with questions and feedback</p>
|
633 |
</div>
|
634 |
""")
|
635 |
with gr.Tab("Try on a single station"):
|
|
|
773 |
interactive=True,
|
774 |
)
|
775 |
|
776 |
+
button_phases = gr.Button("Predict phases")
|
777 |
output_image = gr.Image(label='Waveforms with Phases Marked', type='numpy', interactive=False)
|
778 |
|
779 |
with gr.Row():
|
|
|
802 |
interactive=False)
|
803 |
output_csv = gr.File(label="Output File", file_types=[".csv"])
|
804 |
|
805 |
+
button_phases.click(predict_on_section,
|
806 |
inputs=[client_inputs, timestamp_inputs,
|
807 |
eq_lat_inputs, eq_lon_inputs,
|
808 |
radius_inputs, source_depth_inputs,
|
data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
station_name,st_lat,st_lon,starttime,"p_phase, s","p_uncertainty, s","s_phase, s","s_uncertainty, s","velocity_p, km/s","velocity_s, km/s"
|
2 |
-
CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.503650665283203,0.
|
3 |
-
CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.53201961517334,0.
|
4 |
-
CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.3213396072387695,0.
|
|
|
1 |
station_name,st_lat,st_lon,starttime,"p_phase, s","p_uncertainty, s","s_phase, s","s_uncertainty, s","velocity_p, km/s","velocity_s, km/s"
|
2 |
+
CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.503650665283203,0.0166851474205032,17.022594451904297,0.04997983225621283,4.746091546067712,2.6497251172094707
|
3 |
+
CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.53201961517334,0.017489900928921998,9.215676307678223,0.019567753770388663,3.4155476453388767,1.67967367867923
|
4 |
+
CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.3213396072387695,0.014792497968301177,13.395279884338379,0.025232930202037096,4.135967410510336,2.2605591132307814
|
phasehunter/__pycache__/data_preparation.cpython-39.pyc
CHANGED
Binary files a/phasehunter/__pycache__/data_preparation.cpython-39.pyc and b/phasehunter/__pycache__/data_preparation.cpython-39.pyc differ
|
|
phasehunter/__pycache__/utils.cpython-39.pyc
ADDED
Binary file (1.73 kB). View file
|
|
phasehunter/utils.py
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
from scipy.interpolate import griddata
|
3 |
+
|
4 |
+
|
5 |
+
def bin_distances(distances, bin_size=10):
|
6 |
+
# Bin the distances into groups of `bin_size` kilometers
|
7 |
+
binned_distances = {}
|
8 |
+
for i, distance in enumerate(distances):
|
9 |
+
bin_index = distance // bin_size
|
10 |
+
if bin_index not in binned_distances:
|
11 |
+
binned_distances[bin_index] = (distance, i)
|
12 |
+
elif i < binned_distances[bin_index][1]:
|
13 |
+
binned_distances[bin_index] = (distance, i)
|
14 |
+
|
15 |
+
# Select the first distance in each bin and its index
|
16 |
+
first_distances = []
|
17 |
+
for bin_index in binned_distances:
|
18 |
+
first_distance, first_distance_index = binned_distances[bin_index]
|
19 |
+
first_distances.append(first_distance_index)
|
20 |
+
|
21 |
+
return first_distances
|
22 |
+
|
23 |
+
|
24 |
+
def interpolate_vel_model(
|
25 |
+
velocity_model,
|
26 |
+
initial_velocity,
|
27 |
+
lat_values,
|
28 |
+
lon_values,
|
29 |
+
depth_values,
|
30 |
+
n_lat,
|
31 |
+
n_lon,
|
32 |
+
n_depth,
|
33 |
+
):
|
34 |
+
# Create a mask for points with the initial velocity
|
35 |
+
initial_velocity_mask = velocity_model == initial_velocity
|
36 |
+
|
37 |
+
# Find the indices of points with non-initial velocities
|
38 |
+
non_initial_velocity_indices = np.argwhere(~initial_velocity_mask)
|
39 |
+
|
40 |
+
# Extract the coordinates and corresponding velocities of the known points
|
41 |
+
known_points = np.column_stack(
|
42 |
+
[
|
43 |
+
lat_values[non_initial_velocity_indices[:, 0]],
|
44 |
+
lon_values[non_initial_velocity_indices[:, 1]],
|
45 |
+
depth_values[non_initial_velocity_indices[:, 2]],
|
46 |
+
]
|
47 |
+
)
|
48 |
+
|
49 |
+
# Find the maximum depth in the known_points
|
50 |
+
max_known_depth = np.max(known_points[:, 2])
|
51 |
+
|
52 |
+
known_velocities = velocity_model[~initial_velocity_mask]
|
53 |
+
|
54 |
+
# Create a grid of points for the entire volume
|
55 |
+
grid_points = (
|
56 |
+
np.array(np.meshgrid(lat_values, lon_values, depth_values, indexing="ij"))
|
57 |
+
.reshape(3, -1)
|
58 |
+
.T
|
59 |
+
)
|
60 |
+
|
61 |
+
# Create a mask for grid points that are deeper than the maximum known depth
|
62 |
+
depth_mask = grid_points[:, 2] <= max_known_depth
|
63 |
+
|
64 |
+
# Interpolate the velocities at the grid points
|
65 |
+
interpolated_velocities = griddata(
|
66 |
+
known_points, known_velocities, grid_points[depth_mask], method="linear"
|
67 |
+
)
|
68 |
+
|
69 |
+
# Fill nan values with the nearest known velocities
|
70 |
+
interpolated_velocities_filled = griddata(
|
71 |
+
known_points, known_velocities, grid_points[depth_mask], method="nearest"
|
72 |
+
)
|
73 |
+
interpolated_velocities[
|
74 |
+
np.isnan(interpolated_velocities)
|
75 |
+
] = interpolated_velocities_filled[np.isnan(interpolated_velocities)]
|
76 |
+
|
77 |
+
# Initialize an array with the same length as grid_points and fill it with nan values
|
78 |
+
interpolated_velocities_with_depth_limit = np.full(grid_points.shape[0], np.nan)
|
79 |
+
|
80 |
+
# Update the array with the interpolated velocities for the masked grid points
|
81 |
+
interpolated_velocities_with_depth_limit[depth_mask] = interpolated_velocities
|
82 |
+
|
83 |
+
# Reshape the interpolated velocities to match the shape of the velocity_model
|
84 |
+
interpolated_velocity_model = interpolated_velocities_with_depth_limit.reshape(
|
85 |
+
n_lat, n_lon, n_depth
|
86 |
+
)
|
87 |
+
|
88 |
+
return interpolated_velocity_model
|
89 |
+
|
90 |
+
|
91 |
+
# Function to find the closest index for a given value in an array
|
92 |
+
def find_closest_index(array, value):
|
93 |
+
return np.argmin(np.abs(array - value))
|