diff --git a/Gradio_app.ipynb b/Gradio_app.ipynb
index a2935b2e3d04ab70763d4454a2cac22c0c8beddf..b0f7d4f735b600f755058e5800af483213fe883f 100644
--- a/Gradio_app.ipynb
+++ b/Gradio_app.ipynb
@@ -2,14 +2,14 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Running on local URL: http://127.0.0.1:7861\n",
+ "Running on local URL: http://127.0.0.1:7860\n",
"\n",
"To create a public link, set `share=True` in `launch()`.\n"
]
@@ -17,7 +17,7 @@
{
"data": {
"text/html": [
- "
"
+ ""
],
"text/plain": [
""
@@ -30,9 +30,711 @@
"data": {
"text/plain": []
},
- "execution_count": 2,
+ "execution_count": 1,
"metadata": {},
"output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting to download inventory\n",
+ "Finished downloading inventory\n",
+ "Processing CI.CCC...\n",
+ "Downloading waveform for CI_CCC_2019-07-04T17:33:40.494920Z\n",
+ "Skipping CI_CCC_2019-07-04T17:33:40.494920Z\n",
+ "Processing CI.CLC...\n",
+ "Processing CI.JRC2...\n",
+ "Reading cached waveform\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/anovosel/Documents/phase-hunter/phasehunter/data_preparation.py:210: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/torch/csrc/utils/tensor_new.cpp:248.)\n",
+ " return torch.tensor([waveform]*128, dtype=torch.float)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Added CI.JRC2 to the list of waveforms\n",
+ "Processing CI.LRL...\n",
+ "Reading cached waveform\n",
+ "Added CI.LRL to the list of waveforms\n",
+ "Processing CI.MPM...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0072...\n",
+ "Reading cached waveform\n",
+ "Processing CI.SLA...\n",
+ "Reading cached waveform\n",
+ "Added CI.SLA to the list of waveforms\n",
+ "Processing CI.SRT...\n",
+ "Reading cached waveform\n",
+ "Added CI.SRT to the list of waveforms\n",
+ "Processing CI.TOW2...\n",
+ "Reading cached waveform\n",
+ "Added CI.TOW2 to the list of waveforms\n",
+ "Processing CI.WBM...\n",
+ "Downloading waveform for CI_WBM_2019-07-04T17:33:40.063616Z\n",
+ "Skipping CI_WBM_2019-07-04T17:33:40.063616Z\n",
+ "Processing CI.WCS2...\n",
+ "Downloading waveform for CI_WCS2_2019-07-04T17:33:40.200958Z\n",
+ "Skipping CI_WCS2_2019-07-04T17:33:40.200958Z\n",
+ "Processing CI.WMF...\n",
+ "Reading cached waveform\n",
+ "Added CI.WMF to the list of waveforms\n",
+ "Processing CI.WNM...\n",
+ "Reading cached waveform\n",
+ "Processing CI.WRC2...\n",
+ "Downloading waveform for CI_WRC2_2019-07-04T17:33:38.698099Z\n",
+ "Skipping CI_WRC2_2019-07-04T17:33:38.698099Z\n",
+ "Processing CI.WRV2...\n",
+ "Reading cached waveform\n",
+ "Processing CI.WVP2...\n",
+ "Downloading waveform for CI_WVP2_2019-07-04T17:33:39.650402Z\n",
+ "Skipping CI_WVP2_2019-07-04T17:33:39.650402Z\n",
+ "Processing NP.1809...\n",
+ "Reading cached waveform\n",
+ "Processing NP.5419...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B916...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B917...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B918...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B921...\n",
+ "Reading cached waveform\n",
+ "Starting to run predictions\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:301: FutureWarning: The input object of type 'Tensor' is an array-like implementing one of the corresponding protocols (`__array__`, `__array_interface__` or `__array_struct__`); but not a sequence (or 0-D). In the future, this object will be coerced as if it was first converted using `np.array(obj)`. To retain the old behaviour, you have to either modify the type 'Tensor', or assign to an empty array created with `np.empty(correct_shape, dtype=object)`.\n",
+ " waveforms = np.array(waveforms)[selection_indexes]\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:301: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
+ " waveforms = np.array(waveforms)[selection_indexes]\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:308: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " waveforms = [torch.tensor(waveform) for waveform in waveforms]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting plotting 3 waveforms\n",
+ "Fetching topography\n",
+ "Plotting topo\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/anovosel/miniconda3/envs/phasehunter/lib/python3.11/site-packages/bmi_topography/api_key.py:49: UserWarning: You are using a demo key to fetch data from OpenTopography, functionality will be limited. See https://bmi-topography.readthedocs.io/en/latest/#api-key for more information.\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Plotting waveform 1/3\n",
+ "Station 36.11758, -117.85486 has P velocity 4.746091546067712 and S velocity 2.649725414106055\n",
+ "Plotting waveform 2/3\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 35.69235, -117.75051 has P velocity 3.4155476453388767 and S velocity 1.67967367867923\n",
+ "Plotting waveform 3/3\n",
+ "Station 35.98249, -117.80885 has P velocity 4.135967410510336 and S velocity 2.2605591132307814\n",
+ "Plotting stations\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:413: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
+ " ax[i].set_xticklabels(ax[i].get_xticks(), rotation = 50)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting to download inventory\n",
+ "Finished downloading inventory\n",
+ "Processing CI.ADO...\n",
+ "Reading cached waveform\n",
+ "Added CI.ADO to the list of waveforms\n",
+ "Processing CI.ALP...\n",
+ "Downloading waveform for CI_ALP_2019-07-04T17:33:53.584674Z\n",
+ "Skipping CI_ALP_2019-07-04T17:33:53.584674Z\n",
+ "Processing CI.APL...\n",
+ "Downloading waveform for CI_APL_2019-07-04T17:33:46.544764Z\n",
+ "Skipping CI_APL_2019-07-04T17:33:46.544764Z\n",
+ "Processing CI.ARV...\n",
+ "Reading cached waveform\n",
+ "Added CI.ARV to the list of waveforms\n",
+ "Processing CI.AVM...\n",
+ "Downloading waveform for CI_AVM_2019-07-04T17:33:51.411326Z\n",
+ "Skipping CI_AVM_2019-07-04T17:33:51.411326Z\n",
+ "Processing CI.BAI...\n",
+ "Downloading waveform for CI_BAI_2019-07-04T17:33:55.818842Z\n",
+ "Skipping CI_BAI_2019-07-04T17:33:55.818842Z\n",
+ "Processing CI.BTP...\n",
+ "Downloading waveform for CI_BTP_2019-07-04T17:33:55.357598Z\n",
+ "Skipping CI_BTP_2019-07-04T17:33:55.357598Z\n",
+ "Processing CI.CCA...\n",
+ "Downloading waveform for CI_CCA_2019-07-04T17:33:46.095412Z\n",
+ "Skipping CI_CCA_2019-07-04T17:33:46.095412Z\n",
+ "Processing CI.CCC...\n",
+ "Downloading waveform for CI_CCC_2019-07-04T17:33:40.494920Z\n",
+ "Skipping CI_CCC_2019-07-04T17:33:40.494920Z\n",
+ "Processing CI.CGO...\n",
+ "Downloading waveform for CI_CGO_2019-07-04T17:33:47.556930Z\n",
+ "Skipping CI_CGO_2019-07-04T17:33:47.556930Z\n",
+ "Processing CI.CJV2...\n",
+ "Downloading waveform for CI_CJV2_2019-07-04T17:33:54.933047Z\n",
+ "Skipping CI_CJV2_2019-07-04T17:33:54.933047Z\n",
+ "Processing CI.CLC...\n",
+ "Processing CI.CSL...\n",
+ "Downloading waveform for CI_CSL_2019-07-04T17:33:57.850444Z\n",
+ "Skipping CI_CSL_2019-07-04T17:33:57.850444Z\n",
+ "Processing CI.CVW...\n",
+ "Downloading waveform for CI_CVW_2019-07-04T17:33:55.861897Z\n",
+ "Skipping CI_CVW_2019-07-04T17:33:55.861897Z\n",
+ "Processing CI.CWC...\n",
+ "Reading cached waveform\n",
+ "Added CI.CWC to the list of waveforms\n",
+ "Processing CI.DAW...\n",
+ "Downloading waveform for CI_DAW_2019-07-04T17:33:43.308028Z\n",
+ "Skipping CI_DAW_2019-07-04T17:33:43.308028Z\n",
+ "Processing CI.DTC...\n",
+ "Downloading waveform for CI_DTC_2019-07-04T17:33:59.020880Z\n",
+ "Skipping CI_DTC_2019-07-04T17:33:59.020880Z\n",
+ "Processing CI.DTP...\n",
+ "Downloading waveform for CI_DTP_2019-07-04T17:33:43.742158Z\n",
+ "Skipping CI_DTP_2019-07-04T17:33:43.742158Z\n",
+ "Processing CI.EDW2...\n",
+ "Reading cached waveform\n",
+ "Added CI.EDW2 to the list of waveforms\n",
+ "Processing CI.FDR...\n",
+ "Downloading waveform for CI_FDR_2019-07-04T17:33:51.676399Z\n",
+ "Skipping CI_FDR_2019-07-04T17:33:51.676399Z\n",
+ "Processing CI.FOX2...\n",
+ "Downloading waveform for CI_FOX2_2019-07-04T17:33:52.666361Z\n",
+ "Skipping CI_FOX2_2019-07-04T17:33:52.666361Z\n",
+ "Processing CI.FUR...\n",
+ "Reading cached waveform\n",
+ "Added CI.FUR to the list of waveforms\n",
+ "Processing CI.GRA...\n",
+ "Reading cached waveform\n",
+ "Added CI.GRA to the list of waveforms\n",
+ "Processing CI.GSC...\n",
+ "Reading cached waveform\n",
+ "Added CI.GSC to the list of waveforms\n",
+ "Processing CI.HAR...\n",
+ "Downloading waveform for CI_HAR_2019-07-04T17:33:47.473752Z\n",
+ "Skipping CI_HAR_2019-07-04T17:33:47.473752Z\n",
+ "Processing CI.HDH...\n",
+ "Downloading waveform for CI_HDH_2019-07-04T17:33:54.782440Z\n",
+ "Skipping CI_HDH_2019-07-04T17:33:54.782440Z\n",
+ "Processing CI.HEC...\n",
+ "Reading cached waveform\n",
+ "Added CI.HEC to the list of waveforms\n",
+ "Processing CI.HOL...\n",
+ "Downloading waveform for CI_HOL_2019-07-04T17:33:55.074657Z\n",
+ "Skipping CI_HOL_2019-07-04T17:33:55.074657Z\n",
+ "Processing CI.HYS...\n",
+ "Downloading waveform for CI_HYS_2019-07-04T17:33:49.006533Z\n",
+ "Skipping CI_HYS_2019-07-04T17:33:49.006533Z\n",
+ "Processing CI.ISA...\n",
+ "Reading cached waveform\n",
+ "Added CI.ISA to the list of waveforms\n",
+ "Processing CI.JNH2...\n",
+ "Downloading waveform for CI_JNH2_2019-07-04T17:33:55.441974Z\n",
+ "Skipping CI_JNH2_2019-07-04T17:33:55.441974Z\n",
+ "Processing CI.JRC2...\n",
+ "Reading cached waveform\n",
+ "Added CI.JRC2 to the list of waveforms\n",
+ "Processing CI.LDR...\n",
+ "Downloading waveform for CI_LDR_2019-07-04T17:33:50.153267Z\n",
+ "Skipping CI_LDR_2019-07-04T17:33:50.153267Z\n",
+ "Processing CI.LEO...\n",
+ "Downloading waveform for CI_LEO_2019-07-04T17:33:54.338977Z\n",
+ "Skipping CI_LEO_2019-07-04T17:33:54.338977Z\n",
+ "Processing CI.LJR...\n",
+ "Downloading waveform for CI_LJR_2019-07-04T17:33:56.299609Z\n",
+ "Skipping CI_LJR_2019-07-04T17:33:56.299609Z\n",
+ "Processing CI.LMR2...\n",
+ "Downloading waveform for CI_LMR2_2019-07-04T17:33:48.052793Z\n",
+ "Skipping CI_LMR2_2019-07-04T17:33:48.052793Z\n",
+ "Processing CI.LRL...\n",
+ "Reading cached waveform\n",
+ "Added CI.LRL to the list of waveforms\n",
+ "Processing CI.LRR2...\n",
+ "Downloading waveform for CI_LRR2_2019-07-04T17:33:54.561166Z\n",
+ "Skipping CI_LRR2_2019-07-04T17:33:54.561166Z\n",
+ "Processing CI.LUC2...\n",
+ "Downloading waveform for CI_LUC2_2019-07-04T17:33:56.345510Z\n",
+ "Skipping CI_LUC2_2019-07-04T17:33:56.345510Z\n",
+ "Processing CI.MAG...\n",
+ "Downloading waveform for CI_MAG_2019-07-04T17:33:52.529563Z\n",
+ "Skipping CI_MAG_2019-07-04T17:33:52.529563Z\n",
+ "Processing CI.MPM...\n",
+ "Reading cached waveform\n",
+ "Processing CI.MRS...\n",
+ "Downloading waveform for CI_MRS_2019-07-04T17:33:45.737308Z\n",
+ "Skipping CI_MRS_2019-07-04T17:33:45.737308Z\n",
+ "Processing CI.NBS...\n",
+ "Downloading waveform for CI_NBS_2019-07-04T17:33:54.819174Z\n",
+ "Skipping CI_NBS_2019-07-04T17:33:54.819174Z\n",
+ "Processing CI.NEN...\n",
+ "Downloading waveform for CI_NEN_2019-07-04T17:33:53.764119Z\n",
+ "Skipping CI_NEN_2019-07-04T17:33:53.764119Z\n",
+ "Processing CI.OSI...\n",
+ "Reading cached waveform\n",
+ "Added CI.OSI to the list of waveforms\n",
+ "Processing CI.PDE...\n",
+ "Downloading waveform for CI_PDE_2019-07-04T17:33:58.304637Z\n",
+ "Skipping CI_PDE_2019-07-04T17:33:58.304637Z\n",
+ "Processing CI.PUT...\n",
+ "Downloading waveform for CI_PUT_2019-07-04T17:33:52.090783Z\n",
+ "Skipping CI_PUT_2019-07-04T17:33:52.090783Z\n",
+ "Processing CI.Q0013...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0024...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0035...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0045...\n",
+ "Downloading waveform for CI_Q0045_2019-07-04T17:33:57.352801Z\n",
+ "Skipping CI_Q0045_2019-07-04T17:33:57.352801Z\n",
+ "Processing CI.Q0056...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0061...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0065...\n",
+ "Downloading waveform for CI_Q0065_2019-07-04T17:33:49.714824Z\n",
+ "Skipping CI_Q0065_2019-07-04T17:33:49.714824Z\n",
+ "Processing CI.Q0068...\n",
+ "Reading cached waveform\n",
+ "Processing CI.Q0072...\n",
+ "Reading cached waveform\n",
+ "Processing CI.RMM...\n",
+ "Downloading waveform for CI_RMM_2019-07-04T17:33:55.887825Z\n",
+ "Skipping CI_RMM_2019-07-04T17:33:55.887825Z\n",
+ "Processing CI.RRX...\n",
+ "Reading cached waveform\n",
+ "Added CI.RRX to the list of waveforms\n",
+ "Processing CI.SBB2...\n",
+ "Downloading waveform for CI_SBB2_2019-07-04T17:33:51.760655Z\n",
+ "Skipping CI_SBB2_2019-07-04T17:33:51.760655Z\n",
+ "Processing CI.SHO...\n",
+ "Reading cached waveform\n",
+ "Added CI.SHO to the list of waveforms\n",
+ "Processing CI.SHU...\n",
+ "Downloading waveform for CI_SHU_2019-07-04T17:33:53.494364Z\n",
+ "Skipping CI_SHU_2019-07-04T17:33:53.494364Z\n",
+ "Processing CI.SLA...\n",
+ "Reading cached waveform\n",
+ "Added CI.SLA to the list of waveforms\n",
+ "Processing CI.SLM...\n",
+ "Downloading waveform for CI_SLM_2019-07-04T17:33:57.261460Z\n",
+ "Skipping CI_SLM_2019-07-04T17:33:57.261460Z\n",
+ "Processing CI.SPG2...\n",
+ "Downloading waveform for CI_SPG2_2019-07-04T17:33:50.938614Z\n",
+ "Skipping CI_SPG2_2019-07-04T17:33:50.938614Z\n",
+ "Processing CI.SRT...\n",
+ "Reading cached waveform\n",
+ "Added CI.SRT to the list of waveforms\n",
+ "Processing CI.TEH...\n",
+ "Downloading waveform for CI_TEH_2019-07-04T17:33:47.782229Z\n",
+ "Skipping CI_TEH_2019-07-04T17:33:47.782229Z\n",
+ "Processing CI.TEJ...\n",
+ "Downloading waveform for CI_TEJ_2019-07-04T17:33:50.888789Z\n",
+ "Skipping CI_TEJ_2019-07-04T17:33:50.888789Z\n",
+ "Processing CI.THC...\n",
+ "Downloading waveform for CI_THC_2019-07-04T17:33:53.562586Z\n",
+ "Skipping CI_THC_2019-07-04T17:33:53.562586Z\n",
+ "Processing CI.TIN...\n",
+ "Reading cached waveform\n",
+ "Added CI.TIN to the list of waveforms\n",
+ "Processing CI.TJR...\n",
+ "Downloading waveform for CI_TJR_2019-07-04T17:33:53.114791Z\n",
+ "Skipping CI_TJR_2019-07-04T17:33:53.114791Z\n",
+ "Processing CI.TOW2...\n",
+ "Reading cached waveform\n",
+ "Added CI.TOW2 to the list of waveforms\n",
+ "Processing CI.TPO...\n",
+ "Downloading waveform for CI_TPO_2019-07-04T17:33:50.757819Z\n",
+ "Skipping CI_TPO_2019-07-04T17:33:50.757819Z\n",
+ "Processing CI.VCS...\n",
+ "Downloading waveform for CI_VCS_2019-07-04T17:33:55.459774Z\n",
+ "Skipping CI_VCS_2019-07-04T17:33:55.459774Z\n",
+ "Processing CI.VTV...\n",
+ "Reading cached waveform\n",
+ "Added CI.VTV to the list of waveforms\n",
+ "Processing CI.WAS2...\n",
+ "Downloading waveform for CI_WAS2_2019-07-04T17:33:47.167220Z\n",
+ "Skipping CI_WAS2_2019-07-04T17:33:47.167220Z\n",
+ "Processing CI.WBM...\n",
+ "Downloading waveform for CI_WBM_2019-07-04T17:33:40.063616Z\n",
+ "Skipping CI_WBM_2019-07-04T17:33:40.063616Z\n",
+ "Processing CI.WBS...\n",
+ "Downloading waveform for CI_WBS_2019-07-04T17:33:43.109050Z\n",
+ "Skipping CI_WBS_2019-07-04T17:33:43.109050Z\n",
+ "Processing CI.WCS2...\n",
+ "Downloading waveform for CI_WCS2_2019-07-04T17:33:40.200958Z\n",
+ "Skipping CI_WCS2_2019-07-04T17:33:40.200958Z\n",
+ "Processing CI.WHF...\n",
+ "Downloading waveform for CI_WHF_2019-07-04T17:33:44.817776Z\n",
+ "Skipping CI_WHF_2019-07-04T17:33:44.817776Z\n",
+ "Processing CI.WLH2...\n",
+ "Downloading waveform for CI_WLH2_2019-07-04T17:33:45.980879Z\n",
+ "Skipping CI_WLH2_2019-07-04T17:33:45.980879Z\n",
+ "Processing CI.WLS...\n",
+ "Downloading waveform for CI_WLS_2019-07-04T17:33:53.177944Z\n",
+ "Skipping CI_WLS_2019-07-04T17:33:53.177944Z\n",
+ "Processing CI.WLS2...\n",
+ "Downloading waveform for CI_WLS2_2019-07-04T17:33:53.177444Z\n",
+ "Skipping CI_WLS2_2019-07-04T17:33:53.177444Z\n",
+ "Processing CI.WMF...\n",
+ "Reading cached waveform\n",
+ "Added CI.WMF to the list of waveforms\n",
+ "Processing CI.WNM...\n",
+ "Reading cached waveform\n",
+ "Processing CI.WOR...\n",
+ "Downloading waveform for CI_WOR_2019-07-04T17:33:43.547818Z\n",
+ "Skipping CI_WOR_2019-07-04T17:33:43.547818Z\n",
+ "Processing CI.WRC2...\n",
+ "Downloading waveform for CI_WRC2_2019-07-04T17:33:38.698099Z\n",
+ "Skipping CI_WRC2_2019-07-04T17:33:38.698099Z\n",
+ "Processing CI.WRV2...\n",
+ "Reading cached waveform\n",
+ "Processing CI.WVP2...\n",
+ "Downloading waveform for CI_WVP2_2019-07-04T17:33:39.650402Z\n",
+ "Skipping CI_WVP2_2019-07-04T17:33:39.650402Z\n",
+ "Processing LB.DAC...\n",
+ "Reading cached waveform\n",
+ "Added LB.DAC to the list of waveforms\n",
+ "Processing NN.FMT...\n",
+ "Reading cached waveform\n",
+ "Processing NN.GVN...\n",
+ "Reading cached waveform\n",
+ "Processing NN.GWY...\n",
+ "Reading cached waveform\n",
+ "Added NN.GWY to the list of waveforms\n",
+ "Processing NN.MCA...\n",
+ "Reading cached waveform\n",
+ "Processing NN.PAN...\n",
+ "Downloading waveform for NN_PAN_2019-07-04T17:33:46.806604Z\n",
+ "Skipping NN_PAN_2019-07-04T17:33:46.806604Z\n",
+ "Processing NN.QSM...\n",
+ "Reading cached waveform\n",
+ "Added NN.QSM to the list of waveforms\n",
+ "Processing NN.STHB...\n",
+ "Reading cached waveform\n",
+ "Added NN.STHB to the list of waveforms\n",
+ "Processing NN.WCT...\n",
+ "Reading cached waveform\n",
+ "Processing NN.WLDB...\n",
+ "Reading cached waveform\n",
+ "Added NN.WLDB to the list of waveforms\n",
+ "Processing NP.1035...\n",
+ "Downloading waveform for NP_1035_2019-07-04T17:33:46.374472Z\n",
+ "Skipping NP_1035_2019-07-04T17:33:46.374472Z\n",
+ "Processing NP.1484...\n",
+ "Downloading waveform for NP_1484_2019-07-04T17:33:51.966935Z\n",
+ "Skipping NP_1484_2019-07-04T17:33:51.966935Z\n",
+ "Processing NP.1808...\n",
+ "Downloading waveform for NP_1808_2019-07-04T17:33:52.487446Z\n",
+ "Skipping NP_1808_2019-07-04T17:33:52.487446Z\n",
+ "Processing NP.1809...\n",
+ "Reading cached waveform\n",
+ "Processing NP.262...\n",
+ "Downloading waveform for NP_262_2019-07-04T17:33:54.156962Z\n",
+ "Skipping NP_262_2019-07-04T17:33:54.156962Z\n",
+ "Processing NP.5029...\n",
+ "Downloading waveform for NP_5029_2019-07-04T17:33:54.407584Z\n",
+ "Skipping NP_5029_2019-07-04T17:33:54.407584Z\n",
+ "Processing NP.5031...\n",
+ "Downloading waveform for NP_5031_2019-07-04T17:33:55.297413Z\n",
+ "Skipping NP_5031_2019-07-04T17:33:55.297413Z\n",
+ "Processing NP.5419...\n",
+ "Reading cached waveform\n",
+ "Processing NP.5420...\n",
+ "Downloading waveform for NP_5420_2019-07-04T17:33:56.859872Z\n",
+ "Skipping NP_5420_2019-07-04T17:33:56.859872Z\n",
+ "Processing NP.5480...\n",
+ "Downloading waveform for NP_5480_2019-07-04T17:33:54.127751Z\n",
+ "Skipping NP_5480_2019-07-04T17:33:54.127751Z\n",
+ "Processing NP.5481...\n",
+ "Downloading waveform for NP_5481_2019-07-04T17:33:55.578047Z\n",
+ "Skipping NP_5481_2019-07-04T17:33:55.578047Z\n",
+ "Processing PB.B916...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B917...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B918...\n",
+ "Reading cached waveform\n",
+ "Processing PB.B921...\n",
+ "Reading cached waveform\n",
+ "Processing SN.AMD...\n",
+ "Reading cached waveform\n",
+ "Processing SN.BTW...\n",
+ "Reading cached waveform\n",
+ "Processing SN.DOM...\n",
+ "Reading cached waveform\n",
+ "Processing SN.HEL...\n",
+ "Reading cached waveform\n",
+ "Added SN.HEL to the list of waveforms\n",
+ "Processing SN.LEC...\n",
+ "Reading cached waveform\n",
+ "Processing SN.SGR...\n",
+ "Reading cached waveform\n",
+ "Processing SN.SW353...\n",
+ "Reading cached waveform\n",
+ "Processing SN.SW435...\n",
+ "Reading cached waveform\n",
+ "Processing SN.SW511...\n",
+ "Reading cached waveform\n",
+ "Processing SN.TIM...\n",
+ "Reading cached waveform\n",
+ "Processing SN.WESTB...\n",
+ "Reading cached waveform\n",
+ "Processing SN.WESTC...\n",
+ "Reading cached waveform\n",
+ "Processing SN.WESTD...\n",
+ "Reading cached waveform\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:301: FutureWarning: The input object of type 'Tensor' is an array-like implementing one of the corresponding protocols (`__array__`, `__array_interface__` or `__array_struct__`); but not a sequence (or 0-D). In the future, this object will be coerced as if it was first converted using `np.array(obj)`. To retain the old behaviour, you have to either modify the type 'Tensor', or assign to an empty array created with `np.empty(correct_shape, dtype=object)`.\n",
+ " waveforms = np.array(waveforms)[selection_indexes]\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:301: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
+ " waveforms = np.array(waveforms)[selection_indexes]\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:308: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " waveforms = [torch.tensor(waveform) for waveform in waveforms]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting to run predictions\n",
+ "Starting plotting 15 waveforms\n",
+ "Fetching topography\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/anovosel/miniconda3/envs/phasehunter/lib/python3.11/site-packages/bmi_topography/api_key.py:49: UserWarning: You are using a demo key to fetch data from OpenTopography, functionality will be limited. See https://bmi-topography.readthedocs.io/en/latest/#api-key for more information.\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Plotting topo\n",
+ "Plotting waveform 1/15\n",
+ "Station 36.277, -117.593697 has P velocity nan and S velocity nan\n",
+ "Plotting waveform 2/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 35.66278, -118.47403 has P velocity 5.509786370336251 and S velocity 2.9747824951914903\n",
+ "Plotting waveform 3/15\n",
+ "Station 35.98249, -117.80885 has P velocity 4.130917960194064 and S velocity 2.262643275505274\n",
+ "Plotting waveform 4/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 36.186001, -116.6698 has P velocity 6.119231109018811 and S velocity 3.5120359625275515\n",
+ "Plotting waveform 5/15\n",
+ "Station 36.645401, -116.338799 has P velocity 6.418864645982177 and S velocity 3.40318240942485\n",
+ "Plotting waveform 6/15\n",
+ "Station 34.875332, -116.996841 has P velocity 6.553167458647257 and S velocity 3.7407386971609977\n",
+ "Plotting waveform 7/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 35.965, -116.869102 has P velocity 6.441474783566184 and S velocity 3.6633153313634157\n",
+ "Plotting waveform 8/15\n",
+ "Station 35.69235, -117.75051 has P velocity 3.4203901487527526 and S velocity 1.680319839371246\n",
+ "Plotting waveform 9/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 36.439049, -118.080498 has P velocity 5.286053905666142 and S velocity 3.0215671601782677\n",
+ "Plotting waveform 10/15\n",
+ "Station 35.899529, -116.275299 has P velocity 6.306307564126418 and S velocity 3.5668976471999314\n",
+ "Plotting waveform 11/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 34.6145, -118.7235 has P velocity nan and S velocity nan\n",
+ "Plotting waveform 12/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 34.550461, -117.433907 has P velocity 6.294295200951223 and S velocity 3.416110775195922\n",
+ "Plotting waveform 13/15\n",
+ "Station 34.8811, -117.993881 has P velocity 6.080147521998276 and S velocity 3.3534711002313884\n",
+ "Plotting waveform 14/15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Station 34.8294, -116.335 has P velocity 6.6093598323533715 and S velocity 3.7813786210938956\n",
+ "Plotting waveform 15/15\n",
+ "Station 36.11758, -117.85486 has P velocity 4.7426953739315625 and S velocity 2.6477379954424243\n",
+ "Plotting stations\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:393: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
+ " output_picks = output_picks.append(pd.DataFrame({'station_name': [names[i]],\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:413: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
+ " ax[i].set_xticklabels(ax[i].get_xticks(), rotation = 50)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n",
+ "/var/folders/_g/3q5q8_dj0ydcpktxlwxb5vrh0000gq/T/ipykernel_21875/2718049065.py:593: MatplotlibDeprecationWarning: Unable to determine Axes to steal space for Colorbar. Using gca(), but will raise in the future. Either provide the *cax* argument to use as the Axes for the Colorbar, provide the *ax* argument to steal space from it, or add *mappable* to an Axes.\n",
+ " plt.colorbar(m)\n"
+ ]
}
],
"source": [
@@ -47,6 +749,8 @@
"\n",
"from scipy.stats import gaussian_kde\n",
"from scipy.signal import resample\n",
+ "from scipy.interpolate import interp1d\n",
+ "\n",
"from bmi_topography import Topography\n",
"import earthpy.spatial as es\n",
"\n",
@@ -473,16 +1177,58 @@
"\n",
"import numpy as np\n",
"from matplotlib import colors, cm\n",
+ "from scipy.interpolate import griddata\n",
+ "\n",
+ "def interpolate_vel_model(velocity_model, initial_velocity, lat_values, lon_values, depth_values, n_lat, n_lon, n_depth):\n",
+ " # Create a mask for points with the initial velocity\n",
+ " initial_velocity_mask = (velocity_model == initial_velocity)\n",
+ "\n",
+ " # Find the indices of points with non-initial velocities\n",
+ " non_initial_velocity_indices = np.argwhere(~initial_velocity_mask)\n",
+ "\n",
+ " # Extract the coordinates and corresponding velocities of the known points\n",
+ " known_points = np.column_stack([lat_values[non_initial_velocity_indices[:, 0]],\n",
+ " lon_values[non_initial_velocity_indices[:, 1]],\n",
+ " depth_values[non_initial_velocity_indices[:, 2]]])\n",
+ " \n",
+ " # Find the maximum depth in the known_points\n",
+ " max_known_depth = np.max(known_points[:, 2])\n",
+ "\n",
+ " known_velocities = velocity_model[~initial_velocity_mask]\n",
+ "\n",
+ " # Create a grid of points for the entire volume\n",
+ " grid_points = np.array(np.meshgrid(lat_values, lon_values, depth_values, indexing='ij')).reshape(3, -1).T\n",
+ "\n",
+ " # Create a mask for grid points that are deeper than the maximum known depth\n",
+ " depth_mask = grid_points[:, 2] <= max_known_depth\n",
+ "\n",
+ " # Interpolate the velocities at the grid points\n",
+ " interpolated_velocities = griddata(known_points, known_velocities, grid_points[depth_mask], method='linear')\n",
+ "\n",
+ " # Fill nan values with the nearest known velocities\n",
+ " interpolated_velocities_filled = griddata(known_points, known_velocities, grid_points[depth_mask], method='nearest')\n",
+ " interpolated_velocities[np.isnan(interpolated_velocities)] = interpolated_velocities_filled[np.isnan(interpolated_velocities)]\n",
+ "\n",
+ " # Initialize an array with the same length as grid_points and fill it with nan values\n",
+ " interpolated_velocities_with_depth_limit = np.full(grid_points.shape[0], np.nan)\n",
+ "\n",
+ " # Update the array with the interpolated velocities for the masked grid points\n",
+ " interpolated_velocities_with_depth_limit[depth_mask] = interpolated_velocities\n",
+ "\n",
+ " # Reshape the interpolated velocities to match the shape of the velocity_model\n",
+ " interpolated_velocity_model = interpolated_velocities_with_depth_limit.reshape(n_lat, n_lon, n_depth)\n",
+ "\n",
+ " return interpolated_velocity_model\n",
+ "\n",
"\n",
"# Function to find the closest index for a given value in an array\n",
"def find_closest_index(array, value):\n",
" return np.argmin(np.abs(array - value))\n",
"\n",
- "def compute_velocity_model(azimuth, elevation):\n",
+ "def compute_velocity_model(azimuth, elevation, interpolate, n_lat, n_lon, n_depth):\n",
" filename = list(output_csv.temp_files)[0]\n",
" \n",
" df = pd.read_csv(filename)\n",
- " print(df)\n",
" filename = filename.split('/')[-1]\n",
" \n",
" # Current EQ location\n",
@@ -496,11 +1242,10 @@
" depth_range = (0, 50)\n",
"\n",
" # Define the number of nodes in each dimension\n",
- " n_lat = 10\n",
- " n_lon = 10\n",
- " n_depth = 10\n",
" num_points = 100\n",
"\n",
+ " taup_model = TauPyModel(model='1066a')\n",
+ "\n",
" # Create the grid\n",
" lat_values = np.linspace(lat_range[0], lat_range[1], n_lat)\n",
" lon_values = np.linspace(lon_range[0], lon_range[1], n_lon)\n",
@@ -513,23 +1258,36 @@
" # Loop through the stations and update the velocity model\n",
" for i in range(len(df)):\n",
" if ~np.isnan(df['velocity_p, km/s'].iloc[i]):\n",
- " # Interpolate coordinates along the great circle path between the earthquake and the station\n",
- " lon_deg = np.linspace(df.st_lon.iloc[i], eq_lon, num_points)\n",
- " lat_deg = np.linspace(df.st_lat.iloc[i], eq_lat, num_points)\n",
- " depth_interpolated = np.interp(np.linspace(0, 1, num_points), [0, 1], [eq_depth, 0])\n",
- "\n",
- " # Loop through the interpolated coordinates and update the grid cells with the average P-wave velocity\n",
- " for lat, lon, depth in zip(lat_deg, lon_deg, depth_interpolated):\n",
- " lat_index = find_closest_index(lat_values, lat)\n",
- " lon_index = find_closest_index(lon_values, lon)\n",
- " depth_index = find_closest_index(depth_values, depth)\n",
- " \n",
- " if velocity_model[lat_index, lon_index, depth_index] == initial_velocity:\n",
- " velocity_model[lat_index, lon_index, depth_index] = df['velocity_p, km/s'].iloc[i]\n",
- " else:\n",
- " velocity_model[lat_index, lon_index, depth_index] = (velocity_model[lat_index, lon_index, depth_index] +\n",
- " df['velocity_p, km/s'].iloc[i]) / 2\n",
+ "\n",
+ " ray_path = taup_model.get_ray_paths_geo(source_depth_in_km=eq_depth,\n",
+ " source_latitude_in_deg=eq_lat,\n",
+ " source_longitude_in_deg=eq_lon,\n",
+ " receiver_latitude_in_deg=df.st_lat.iloc[i],\n",
+ " receiver_longitude_in_deg=df.st_lon.iloc[i],\n",
+ " phase_list=['P', 'S'])\n",
+ "\n",
+ " # Create the interpolator objects for latitude, longitude, and depth\n",
+ " interp_latitude = interp1d(np.linspace(0, ray_path[0].path['lat'].max(), len(ray_path[0].path['lat'])), ray_path[0].path['lat'])\n",
+ " interp_longitude = interp1d(np.linspace(0, ray_path[0].path['lon'].max(), len(ray_path[0].path['lon'])), ray_path[0].path['lon'])\n",
+ " interp_depth = interp1d(np.linspace(0, ray_path[0].path['depth'].max(), len(ray_path[0].path['depth'])), ray_path[0].path['depth'])\n",
+ "\n",
+ " # Resample the ray path to N points\n",
+ " lat_values_interp = interp_latitude(np.linspace(0, ray_path[0].path['lat'].max(), num_points))\n",
+ " lon_values_interp = interp_longitude(np.linspace(0, ray_path[0].path['lon'].max(), num_points))\n",
+ " depth_values_interp = interp_depth(np.linspace(0, ray_path[0].path['depth'].max(), num_points))\n",
+ "\n",
+ " # Loop through the interpolated coordinates and update the grid cells with the average P-wave velocity\n",
+ " for lat, lon, depth in zip(lat_values_interp, lon_values_interp, depth_values_interp):\n",
+ " lat_index = find_closest_index(lat_values, lat)\n",
+ " lon_index = find_closest_index(lon_values, lon)\n",
+ " depth_index = find_closest_index(depth_values, depth)\n",
" \n",
+ " if velocity_model[lat_index, lon_index, depth_index] == initial_velocity:\n",
+ " velocity_model[lat_index, lon_index, depth_index] = df['velocity_p, km/s'].iloc[i]\n",
+ " else:\n",
+ " velocity_model[lat_index, lon_index, depth_index] = (velocity_model[lat_index, lon_index, depth_index] +\n",
+ " df['velocity_p, km/s'].iloc[i]) / 2\n",
+ "\n",
" # Create the figure and axis\n",
" fig = plt.figure(figsize=(8, 8))\n",
" ax = fig.add_subplot(111, projection='3d')\n",
@@ -553,11 +1311,16 @@
" )\n",
"\n",
" # Create the color array\n",
- " norm = plt.Normalize(vmin=velocity_model.min(), vmax=velocity_model.max())\n",
- " colors = plt.cm.plasma(norm(velocity_model))\n",
- "\n",
+ " norm = plt.Normalize(vmin=2, vmax=8)\n",
+ " colors_vel = plt.cm.plasma(norm(velocity_model)) \n",
+ " \n",
" # Plot the voxels\n",
- " ax.voxels(x, y, z, velocity_model > 0, facecolors=colors, alpha=0.5, edgecolor='k')\n",
+ " if interpolate:\n",
+ " interpolated_velocity_model = interpolate_vel_model(velocity_model, initial_velocity, lat_values, lon_values, depth_values, n_lat, n_lon, n_depth)\n",
+ " colors_interp = plt.cm.plasma(norm(interpolated_velocity_model))\n",
+ " ax.voxels(x, y, z, interpolated_velocity_model > 0, facecolors=colors_interp, alpha=0.5, edgecolor='k')\n",
+ " \n",
+ " ax.voxels(x, y, z, velocity_model > 0, facecolors=colors_vel, alpha=1, edgecolor='black')\n",
"\n",
" # Set the view angle\n",
" ax.view_init(elev=elevation, azim=azimuth)\n",
@@ -623,7 +1386,7 @@
" P_thres_inputs = gr.Slider(minimum=0.01,\n",
" maximum=1,\n",
" value=0.1,\n",
- " label=\"P uncertainty threshold, s\",\n",
+ " label=\"P uncertainty threshold (s)\",\n",
" step=0.01,\n",
" info=\"Acceptable uncertainty for P picks expressed in std() seconds\",\n",
" interactive=True,\n",
@@ -632,13 +1395,13 @@
" S_thres_inputs = gr.Slider(minimum=0.01,\n",
" maximum=1,\n",
" value=0.2,\n",
- " label=\"S uncertainty threshold, s\",\n",
+ " label=\"S uncertainty threshold (s)\",\n",
" step=0.01,\n",
" info=\"Acceptable uncertainty for S picks expressed in std() seconds\",\n",
" interactive=True,\n",
" )\n",
" with gr.Column(scale=1):\n",
- " upload = gr.File(label=\"Or upload your own waveform\")\n",
+ " upload = gr.File(label=\"Upload your waveform\")\n",
" with gr.Row():\n",
" sampling_rate_inputs = gr.Slider(minimum=10,\n",
" maximum=1000,\n",
@@ -768,26 +1531,351 @@
" \n",
" with gr.Row():\n",
" with gr.Column(scale=2):\n",
- " inputs_vel_model = [\n",
- " gr.Slider(minimum=-180, maximum=180, value=0, step=5, label=\"Azimuth\", interactive=True),\n",
- " gr.Slider(minimum=-90, maximum=90, value=30, step=5, label=\"Elevation\", interactive=True)\n",
- " ]\n",
+ " azimuth_input = gr.Slider(minimum=-180, maximum=180, value=0, step=5, label=\"Azimuth\", interactive=True)\n",
+ " elevation_input = gr.Slider(minimum=-90, maximum=90, value=30, step=5, label=\"Elevation\", interactive=True)\n",
+ "\n",
+ " with gr.Row():\n",
+ " interpolate_input = gr.Checkbox(label=\"Interpolate\", info=\"Interpolate velocity model\")\n",
+ " n_lat_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label=\"N lat\", info='Number of Lat grid points', interactive=True)\n",
+ " n_lon_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label=\"N lon\", info='Number of Lon grid points', interactive=True)\n",
+ " n_depth_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label=\"N depth\", info='Number of Depth grid points', interactive=True)\n",
+ " \n",
" button = gr.Button(\"Look at 3D Velocities\")\n",
" outputs_vel_model = gr.Image(label=\"3D Velocity Model\")\n",
"\n",
- " button.click(compute_velocity_model, \n",
- " inputs=inputs_vel_model, \n",
- " outputs=outputs_vel_model)\n",
+ " button.click(compute_velocity_model, \n",
+ " inputs=[azimuth_input, elevation_input, \n",
+ " interpolate_input, n_lat_input, \n",
+ " n_lon_input, n_depth_input], \n",
+ " outputs=[outputs_vel_model])\n",
"\n",
"demo.launch()"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 89,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['__class__',\n",
+ " '__delattr__',\n",
+ " '__dict__',\n",
+ " '__dir__',\n",
+ " '__doc__',\n",
+ " '__eq__',\n",
+ " '__format__',\n",
+ " '__ge__',\n",
+ " '__getattribute__',\n",
+ " '__getstate__',\n",
+ " '__gt__',\n",
+ " '__hash__',\n",
+ " '__init__',\n",
+ " '__init_subclass__',\n",
+ " '__le__',\n",
+ " '__lt__',\n",
+ " '__module__',\n",
+ " '__ne__',\n",
+ " '__new__',\n",
+ " '__reduce__',\n",
+ " '__reduce_ex__',\n",
+ " '__repr__',\n",
+ " '__setattr__',\n",
+ " '__sizeof__',\n",
+ " '__str__',\n",
+ " '__subclasshook__',\n",
+ " '__weakref__',\n",
+ " 'azimuth',\n",
+ " 'distance',\n",
+ " 'incident_angle',\n",
+ " 'name',\n",
+ " 'path',\n",
+ " 'phase',\n",
+ " 'pierce',\n",
+ " 'purist_dist',\n",
+ " 'purist_distance',\n",
+ " 'purist_name',\n",
+ " 'ray_param',\n",
+ " 'ray_param_index',\n",
+ " 'ray_param_sec_degree',\n",
+ " 'receiver_depth',\n",
+ " 'source_depth',\n",
+ " 'takeoff_angle',\n",
+ " 'time']"
+ ]
+ },
+ "execution_count": 89,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dir(ray_path[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 107,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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OBX5pWRMCdgENre37a0/ERGR4UOBlBwjKfCawZS0m0tljNv2FmBrfhMRERlGihZI3X777cydO5dIJEJlZWWnZa699lpmzZpFMBikpqamw/FVq1ZhjOmwlZSUHPH669evZ+bMmYRCIcaNG8c111xTOPb0009z0UUXUV1dTUlJCTU1NWzYsKHD+R++biik/Eldsikg18XSMgbwY714vzdLRESkmIo2RyqdTrNo0SLmzJnD2rVruyy3bNkynn/+eV555ZUOx2666SauvvrqdvvOOeccTj/99G6vfdddd3HnnXdyxx13MHv2bFpaWnj77bcLx5977jlmzpzJP/7jPzJ+/HgeeeQRrrzySioqKrjwwgsL5crLy9m+fXvhcz4gkM5ZCnOiOmNMWxkREZHho2iB1G233Qbke3a6cs899wCwd+/eTgOp0tJSSktLC5+3bt3K66+/zr333ttlnQcPHuQb3/gGDz/8MOecc05h/8yZMwv//+abb253znXXXccTTzzBL37xi3aBlDGGCRMmdHktOVz+PyVrbecBp82CU9pxv4iIyBA2pOZIrVmzhmnTpjFv3rwuyzz55JN4nse7777LKaecwsSJE7n00kvZtWtXt3VHo1FGjx7dbl88HmfKlClMmjSJiy66iNdee+2IbUylUsRisXbbiGDC+aVjbEuHQ9amAAfjHHlIVkREZCgZMoFUMplkw4YNLF++vNtyb731Fp7n8e1vf5u7776bn/3sZxw4cIDzzjuPdDrd6TkbN27kv//7v/nyl79c2HfyySezbt06fvnLX/KjH/0Iz/OYO3cu77zzTrfXX716NRUVFYVt0qRJvb/ZIcgYF+OMAVysF8PaBNamsF5zPqmnMwpjwgPdTBERkWOqV4HUihUrOp38ffi2bdu2ojR006ZNNDc3s2TJkm7LeZ5HJpPhnnvuYcGCBZx55pn85Cc/YceOHdTW1nYoX1tby5e//GX+8z//k1NPPbWwf86cOVx55ZXU1NQwf/58fvGLX1BVVcX3v//9bq+/cuVKotFoYTtST9hwYpwIxncctAVUADjlGLcaxx01oG0TEREphl7NkbrxxhtZunRpt2WmTp16NO3p0po1a7jwwgsZP358t+Wqq6sBmDFjRmFfVVUVY8eOpaGhoV3ZZ555hs997nP867/+K1deeWW39fr9fk477TR27tzZbblgMEgw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IiLSI67j8LUvfZozak4A8oHT4UrCQc4546P4HUMykcFa8HLgeBA70Mqrf2zgla0NxJqGz1t9yiNVZMojJSIiw43nWZ74f2/ws0de5L09UYIBH9NOqOKkSWMJuQYwZHIWP4ZMNkckEsDL5XBsPvI67rhKpp0ykXETKnCcwTnUN+B5pG6//Xbmzp1LJBKhsrKy0zLXXnsts2bNIhgMUlNT0+H4qlWrMMZ02EpKSrq99n//939zzjnnUFlZyahRo1iwYAFbt25tV+aVV15h3rx5hEIhJk2axD//8z93qOfBBx9k+vTphEIhPv7xj/PYY4/1+P5FRESGK8cxXDB/Bv/+T3/N3au+yJc/P5tPTDuOkrAfx+cjk7EEfC5ZL4fP55BszeDl8rmmjDG8s+sALz//Jm9ubxzyQ31FC6TS6TSLFi3ia1/7Wrflli1bxuLFizs9dtNNN7F79+5224wZM1i0aFGX9cXjcS644AImT57M888/z29/+1vKyspYsGABmUx+clwsFuP8889nypQpvPjii9xxxx2sWrWKH/zgB4V6nnvuOS677DKWL1/Oyy+/zMUXX8zFF1/Mq6++2oefhoiIyPATDPo56YTxzP7LqUyorsTzDMZAKOgnl83hug5gsXgYLMlEGmstjmOIxhK8uOVPPPeb19j3fnSgb6XPij60t379eq6//nqampq6LLNq1Soeeugh6urquq1r69at1NTU8OyzzzJv3rxOy7zwwgucfvrpNDQ0MGnSJAD++Mc/MnPmTHbs2MFJJ53E9773PW655RYaGxsJBAIArFixgoceeoht27YBsHjxYlpaWnjkkUcKdZ955pnU1NRw77339vj+NbQnIiIjQaw5wc439/DWm++TTmZwMFg8kon8IsfZdBbXdbA5S9O+GFt//xbv1u8DwO93mb9wJsuuP5/RVYPju3LAh/aKYc2aNUybNq3LIArg5JNPZsyYMaxdu5Z0Ok0ikWDt2rWccsopnHDCCQBs2bKFT3/604UgCmDBggVs376dgwcPFsqce+657epesGABW7Zs6baNqVSKWCzWbhMRERnuysvCnHrKRE47bTLlFRFy1mJwCAX9eDmLz/WBB+/9eT+/euC/ee/tfYVzM5kcTz1cxzWX/juN7x4YwLvovSETSCWTSTZs2MDy5cu7LVdWVsbTTz/Nj370I8LhMKWlpTz++OP8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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from scipy.interpolate import interp1d\n",
+ "\n",
+ "taup_model = TauPyModel(model='1066a')\n",
+ "\n",
+ "ray_path = taup_model.get_ray_paths_geo(source_depth_in_km=10,\n",
+ " source_latitude_in_deg=35.766,\n",
+ " source_longitude_in_deg=-117.605,\n",
+ " receiver_latitude_in_deg=35.98249,\n",
+ " receiver_longitude_in_deg=-117.80885,\n",
+ " phase_list=['P', 'S'])\n",
+ "\n",
+ "ray_path[0].path\n",
+ "\n",
+ "# Define the number of points N\n",
+ "N = 100\n",
+ "\n",
+ "# Create the interpolator objects for latitude, longitude, and depth\n",
+ "interp_latitude = interp1d(np.linspace(0, ray_path[0].path['lat'].max(), len(ray_path[0].path['lat'])), ray_path[0].path['lat'])\n",
+ "interp_longitude = interp1d(np.linspace(0, ray_path[0].path['lon'].max(), len(ray_path[0].path['lon'])), ray_path[0].path['lon'])\n",
+ "interp_depth = interp1d(np.linspace(0, ray_path[0].path['depth'].max(), len(ray_path[0].path['depth'])), ray_path[0].path['depth'])\n",
+ "\n",
+ "# Resample the ray path to N points\n",
+ "resampled_latitude = interp_latitude(np.linspace(0, ray_path[0].path['lat'].max(), N))\n",
+ "resampled_longitude = interp_longitude(np.linspace(0, ray_path[0].path['lon'].max(), N))\n",
+ "resampled_depth = interp_depth(np.linspace(0, ray_path[0].path['depth'].max(), N))\n",
+ "\n",
+ "plt.scatter(resampled_latitude, resampled_longitude, c=resampled_depth, cmap='viridis', alpha=0.1)\n",
+ "plt.scatter(ray_path[0].path['lat'], ray_path[0].path['lon'], c=ray_path[0].path['depth'], cmap='viridis')\n"
+ ]
+ },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([(825.43624587, 0. , 0. , 10. , 35.766 , -117.605 ),\n",
+ " (825.43624587, 0.26845098, 0.00012109, 11. , 35.7715199 , -117.61017979),\n",
+ " (825.43624587, 1.63173458, 0.00177268, 11.01091139, 35.84678737, -117.68090241),\n",
+ " (825.43624587, 2.99501819, 0.00342427, 11. , 35.92201332, -117.75175935),\n",
+ " (825.43624587, 3.26346917, 0.00354535, 10. , 35.92752691, -117.75695956),\n",
+ " (825.43624587, 4.33607208, 0.00402859, 6.00385879, 35.94952856, -117.77772004),\n",
+ " (825.43624587, 4.47129397, 0.00408945, 5.5 , 35.9522991 , -117.78033535),\n",
+ " (825.43624587, 5.20940225, 0.00442139, 2.74941477, 35.96740958, -117.79460335),\n",
+ " (825.43624587, 5.57829224, 0.00458712, 1.37456112, 35.97495353, -117.80172933),\n",
+ " (825.43624587, 5.94707298, 0.0047527 , 0. , 35.98248996, -117.80884997)],\n",
+ " dtype=[('p', '"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def compute_velocity_model(azimuth, elevation, interpolate):\n",
+ " filename = list(output_csv.temp_files)[0]\n",
+ " \n",
+ " df = pd.read_csv(filename)\n",
+ " filename = filename.split('/')[-1]\n",
+ " \n",
+ " # Current EQ location\n",
+ " eq_lat = float(filename.split(\"_\")[0])\n",
+ " eq_lon = float(filename.split(\"_\")[1])\n",
+ " eq_depth = float(filename.split(\"_\")[2])\n",
+ "\n",
+ " # Define the region of interest (latitude, longitude, and depth ranges)\n",
+ " lat_range = (np.min([df.st_lat.min(), eq_lat]), np.max([df.st_lat.max(), eq_lat]))\n",
+ " lon_range = (np.min([df.st_lon.min(), eq_lon]), np.max([df.st_lon.max(), eq_lon]))\n",
+ " depth_range = (0, 50)\n",
+ "\n",
+ " # Define the number of nodes in each dimension\n",
+ " n_lat = 10\n",
+ " n_lon = 10\n",
+ " n_depth = 10\n",
+ " num_points = 100\n",
+ "\n",
+ " taup_model = TauPyModel(model='1066a')\n",
+ "\n",
+ " # Create the grid\n",
+ " lat_values = np.linspace(lat_range[0], lat_range[1], n_lat)\n",
+ " lon_values = np.linspace(lon_range[0], lon_range[1], n_lon)\n",
+ " depth_values = np.linspace(depth_range[0], depth_range[1], n_depth)\n",
+ "\n",
+ " # Initialize the velocity model with constant values\n",
+ " initial_velocity = 0 # km/s, this can be P-wave or S-wave velocity\n",
+ " velocity_model = np.full((n_lat, n_lon, n_depth), initial_velocity, dtype=float)\n",
+ "\n",
+ " # Loop through the stations and update the velocity model\n",
+ " for i in range(len(df)):\n",
+ " if ~np.isnan(df['velocity_p, km/s'].iloc[i]):\n",
+ "\n",
+ " ray_path = taup_model.get_ray_paths_geo(source_depth_in_km=eq_depth,\n",
+ " source_latitude_in_deg=eq_lat,\n",
+ " source_longitude_in_deg=eq_lon,\n",
+ " receiver_latitude_in_deg=df.st_lat.iloc[i],\n",
+ " receiver_longitude_in_deg=df.st_lon.iloc[i],\n",
+ " phase_list=['P', 'S'])\n",
+ "\n",
+ " # Create the interpolator objects for latitude, longitude, and depth\n",
+ " interp_latitude = interp1d(np.linspace(0, ray_path[0].path['lat'].max(), len(ray_path[0].path['lat'])), ray_path[0].path['lat'])\n",
+ " interp_longitude = interp1d(np.linspace(0, ray_path[0].path['lon'].max(), len(ray_path[0].path['lon'])), ray_path[0].path['lon'])\n",
+ " interp_depth = interp1d(np.linspace(0, ray_path[0].path['depth'].max(), len(ray_path[0].path['depth'])), ray_path[0].path['depth'])\n",
+ "\n",
+ " # Resample the ray path to N points\n",
+ " lat_values_interp = interp_latitude(np.linspace(0, ray_path[0].path['lat'].max(), num_points))\n",
+ " lon_values_interp = interp_longitude(np.linspace(0, ray_path[0].path['lon'].max(), num_points))\n",
+ " depth_values_interp = interp_depth(np.linspace(0, ray_path[0].path['depth'].max(), num_points))\n",
+ "\n",
+ " # Loop through the interpolated coordinates and update the grid cells with the average P-wave velocity\n",
+ " for lat, lon, depth in zip(lat_values_interp, lon_values_interp, depth_values_interp):\n",
+ " lat_index = find_closest_index(lat_values, lat)\n",
+ " lon_index = find_closest_index(lon_values, lon)\n",
+ " depth_index = find_closest_index(depth_values, depth)\n",
+ " \n",
+ " if velocity_model[lat_index, lon_index, depth_index] == initial_velocity:\n",
+ " velocity_model[lat_index, lon_index, depth_index] = df['velocity_p, km/s'].iloc[i]\n",
+ " else:\n",
+ " velocity_model[lat_index, lon_index, depth_index] = (velocity_model[lat_index, lon_index, depth_index] +\n",
+ " df['velocity_p, km/s'].iloc[i]) / 2\n",
+ "\n",
+ " # Create the figure and axis\n",
+ " fig = plt.figure(figsize=(8, 8))\n",
+ " ax = fig.add_subplot(111, projection='3d')\n",
+ "\n",
+ " # Set the plot limits\n",
+ " ax.set_xlim3d(lat_range[0], lat_range[1])\n",
+ " ax.set_ylim3d(lon_range[0], lon_range[1])\n",
+ " ax.set_zlim3d(depth_range[1], depth_range[0])\n",
+ "\n",
+ " ax.set_xlabel('Latitude')\n",
+ " ax.set_ylabel('Longitude')\n",
+ " ax.set_zlabel('Depth (km)')\n",
+ " ax.set_title('Velocity Model')\n",
+ " \n",
+ " # Create the meshgrid\n",
+ " x, y, z = np.meshgrid(\n",
+ " np.linspace(lat_range[0], lat_range[1], velocity_model.shape[0]+1),\n",
+ " np.linspace(lon_range[0], lon_range[1], velocity_model.shape[1]+1),\n",
+ " np.linspace(depth_range[0], depth_range[1], velocity_model.shape[2]+1),\n",
+ " indexing='ij'\n",
+ " )\n",
+ "\n",
+ " # Create the color array\n",
+ " norm = plt.Normalize(vmin=2, vmax=8)\n",
+ " colors_vel = plt.cm.plasma(norm(velocity_model)) \n",
+ " \n",
+ " # Plot the voxels\n",
+ " if interpolate:\n",
+ " interpolated_velocity_model = interpolate_vel_model(velocity_model, initial_velocity, lat_values, lon_values, depth_values, n_lat, n_lon, n_depth)\n",
+ " colors_interp = plt.cm.plasma(norm(interpolated_velocity_model))\n",
+ " ax.voxels(x, y, z, interpolated_velocity_model > 0, facecolors=colors_interp, alpha=0.5, edgecolor='k')\n",
+ " \n",
+ " ax.voxels(x, y, z, velocity_model > 0, facecolors=colors_vel, alpha=1, edgecolor='black')\n",
+ "\n",
+ " # Set the view angle\n",
+ " ax.view_init(elev=elevation, azim=azimuth)\n",
+ "\n",
+ "\n",
+ "compute_velocity_model(0, 40, False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "35.766_-117.605_10.0_2019-07-04 17:33:49_3.csv\n",
+ "35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv\n",
+ "35.766_-117.605_2019-07-04 17:33:49_3.csv\n",
+ "35.766_-117.605_2019-07-04 17:33:49_9.csv\n",
+ "current_vel_model.csv\n",
+ "testt\n"
+ ]
+ }
+ ],
+ "source": [
+ "!ls data/velocity"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "35.766_-117.605_10.0_2019-07-04 17:33:49_3.csv\n",
+ "35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv\n",
+ "35.766_-117.605_2019-07-04 17:33:49_3.csv\n",
+ "35.766_-117.605_2019-07-04 17:33:49_9.csv\n",
+ "current_vel_model.csv\n",
+ "testt\n"
+ ]
+ }
+ ],
+ "source": [
+ "!ls '/Users/anovosel/Documents/phase-hunter/data/velocity'"
+ ]
}
],
"metadata": {
diff --git a/app.py b/app.py
index 9735cc0285a678f10f3234cc32861dc1e061c7cc..d9696e80db02595bd80ad79565e84388bebfa08e 100644
--- a/app.py
+++ b/app.py
@@ -9,6 +9,8 @@ import io
from scipy.stats import gaussian_kde
from scipy.signal import resample
+from scipy.interpolate import interp1d
+
from bmi_topography import Topography
import earthpy.spatial as es
@@ -435,16 +437,58 @@ def predict_on_section(client_name, timestamp, eq_lat, eq_lon, radius_km, source
import numpy as np
from matplotlib import colors, cm
+from scipy.interpolate import griddata
+
+def interpolate_vel_model(velocity_model, initial_velocity, lat_values, lon_values, depth_values, n_lat, n_lon, n_depth):
+ # Create a mask for points with the initial velocity
+ initial_velocity_mask = (velocity_model == initial_velocity)
+
+ # Find the indices of points with non-initial velocities
+ non_initial_velocity_indices = np.argwhere(~initial_velocity_mask)
+
+ # Extract the coordinates and corresponding velocities of the known points
+ known_points = np.column_stack([lat_values[non_initial_velocity_indices[:, 0]],
+ lon_values[non_initial_velocity_indices[:, 1]],
+ depth_values[non_initial_velocity_indices[:, 2]]])
+
+ # Find the maximum depth in the known_points
+ max_known_depth = np.max(known_points[:, 2])
+
+ known_velocities = velocity_model[~initial_velocity_mask]
+
+ # Create a grid of points for the entire volume
+ grid_points = np.array(np.meshgrid(lat_values, lon_values, depth_values, indexing='ij')).reshape(3, -1).T
+
+ # Create a mask for grid points that are deeper than the maximum known depth
+ depth_mask = grid_points[:, 2] <= max_known_depth
+
+ # Interpolate the velocities at the grid points
+ interpolated_velocities = griddata(known_points, known_velocities, grid_points[depth_mask], method='linear')
+
+ # Fill nan values with the nearest known velocities
+ interpolated_velocities_filled = griddata(known_points, known_velocities, grid_points[depth_mask], method='nearest')
+ interpolated_velocities[np.isnan(interpolated_velocities)] = interpolated_velocities_filled[np.isnan(interpolated_velocities)]
+
+ # Initialize an array with the same length as grid_points and fill it with nan values
+ interpolated_velocities_with_depth_limit = np.full(grid_points.shape[0], np.nan)
+
+ # Update the array with the interpolated velocities for the masked grid points
+ interpolated_velocities_with_depth_limit[depth_mask] = interpolated_velocities
+
+ # Reshape the interpolated velocities to match the shape of the velocity_model
+ interpolated_velocity_model = interpolated_velocities_with_depth_limit.reshape(n_lat, n_lon, n_depth)
+
+ return interpolated_velocity_model
+
# Function to find the closest index for a given value in an array
def find_closest_index(array, value):
return np.argmin(np.abs(array - value))
-def compute_velocity_model(azimuth, elevation):
+def compute_velocity_model(azimuth, elevation, interpolate, n_lat, n_lon, n_depth):
filename = list(output_csv.temp_files)[0]
df = pd.read_csv(filename)
- print(df)
filename = filename.split('/')[-1]
# Current EQ location
@@ -458,11 +502,10 @@ def compute_velocity_model(azimuth, elevation):
depth_range = (0, 50)
# Define the number of nodes in each dimension
- n_lat = 10
- n_lon = 10
- n_depth = 10
num_points = 100
+ taup_model = TauPyModel(model='1066a')
+
# Create the grid
lat_values = np.linspace(lat_range[0], lat_range[1], n_lat)
lon_values = np.linspace(lon_range[0], lon_range[1], n_lon)
@@ -475,23 +518,36 @@ def compute_velocity_model(azimuth, elevation):
# Loop through the stations and update the velocity model
for i in range(len(df)):
if ~np.isnan(df['velocity_p, km/s'].iloc[i]):
- # Interpolate coordinates along the great circle path between the earthquake and the station
- lon_deg = np.linspace(df.st_lon.iloc[i], eq_lon, num_points)
- lat_deg = np.linspace(df.st_lat.iloc[i], eq_lat, num_points)
- depth_interpolated = np.interp(np.linspace(0, 1, num_points), [0, 1], [eq_depth, 0])
-
- # Loop through the interpolated coordinates and update the grid cells with the average P-wave velocity
- for lat, lon, depth in zip(lat_deg, lon_deg, depth_interpolated):
- lat_index = find_closest_index(lat_values, lat)
- lon_index = find_closest_index(lon_values, lon)
- depth_index = find_closest_index(depth_values, depth)
-
- if velocity_model[lat_index, lon_index, depth_index] == initial_velocity:
- velocity_model[lat_index, lon_index, depth_index] = df['velocity_p, km/s'].iloc[i]
- else:
- velocity_model[lat_index, lon_index, depth_index] = (velocity_model[lat_index, lon_index, depth_index] +
- df['velocity_p, km/s'].iloc[i]) / 2
+
+ ray_path = taup_model.get_ray_paths_geo(source_depth_in_km=eq_depth,
+ source_latitude_in_deg=eq_lat,
+ source_longitude_in_deg=eq_lon,
+ receiver_latitude_in_deg=df.st_lat.iloc[i],
+ receiver_longitude_in_deg=df.st_lon.iloc[i],
+ phase_list=['P', 'S'])
+
+ # Create the interpolator objects for latitude, longitude, and depth
+ interp_latitude = interp1d(np.linspace(0, ray_path[0].path['lat'].max(), len(ray_path[0].path['lat'])), ray_path[0].path['lat'])
+ interp_longitude = interp1d(np.linspace(0, ray_path[0].path['lon'].max(), len(ray_path[0].path['lon'])), ray_path[0].path['lon'])
+ interp_depth = interp1d(np.linspace(0, ray_path[0].path['depth'].max(), len(ray_path[0].path['depth'])), ray_path[0].path['depth'])
+
+ # Resample the ray path to N points
+ lat_values_interp = interp_latitude(np.linspace(0, ray_path[0].path['lat'].max(), num_points))
+ lon_values_interp = interp_longitude(np.linspace(0, ray_path[0].path['lon'].max(), num_points))
+ depth_values_interp = interp_depth(np.linspace(0, ray_path[0].path['depth'].max(), num_points))
+
+ # Loop through the interpolated coordinates and update the grid cells with the average P-wave velocity
+ for lat, lon, depth in zip(lat_values_interp, lon_values_interp, depth_values_interp):
+ lat_index = find_closest_index(lat_values, lat)
+ lon_index = find_closest_index(lon_values, lon)
+ depth_index = find_closest_index(depth_values, depth)
+ if velocity_model[lat_index, lon_index, depth_index] == initial_velocity:
+ velocity_model[lat_index, lon_index, depth_index] = df['velocity_p, km/s'].iloc[i]
+ else:
+ velocity_model[lat_index, lon_index, depth_index] = (velocity_model[lat_index, lon_index, depth_index] +
+ df['velocity_p, km/s'].iloc[i]) / 2
+
# Create the figure and axis
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
@@ -515,11 +571,16 @@ def compute_velocity_model(azimuth, elevation):
)
# Create the color array
- norm = plt.Normalize(vmin=velocity_model.min(), vmax=velocity_model.max())
- colors = plt.cm.plasma(norm(velocity_model))
-
+ norm = plt.Normalize(vmin=2, vmax=8)
+ colors_vel = plt.cm.plasma(norm(velocity_model))
+
# Plot the voxels
- ax.voxels(x, y, z, velocity_model > 0, facecolors=colors, alpha=0.5, edgecolor='k')
+ if interpolate:
+ interpolated_velocity_model = interpolate_vel_model(velocity_model, initial_velocity, lat_values, lon_values, depth_values, n_lat, n_lon, n_depth)
+ colors_interp = plt.cm.plasma(norm(interpolated_velocity_model))
+ ax.voxels(x, y, z, interpolated_velocity_model > 0, facecolors=colors_interp, alpha=0.5, edgecolor='k')
+
+ ax.voxels(x, y, z, velocity_model > 0, facecolors=colors_vel, alpha=1, edgecolor='black')
# Set the view angle
ax.view_init(elev=elevation, azim=azimuth)
@@ -585,7 +646,7 @@ with gr.Blocks() as demo:
P_thres_inputs = gr.Slider(minimum=0.01,
maximum=1,
value=0.1,
- label="P uncertainty threshold, s",
+ label="P uncertainty threshold (s)",
step=0.01,
info="Acceptable uncertainty for P picks expressed in std() seconds",
interactive=True,
@@ -594,13 +655,13 @@ with gr.Blocks() as demo:
S_thres_inputs = gr.Slider(minimum=0.01,
maximum=1,
value=0.2,
- label="S uncertainty threshold, s",
+ label="S uncertainty threshold (s)",
step=0.01,
info="Acceptable uncertainty for S picks expressed in std() seconds",
interactive=True,
)
with gr.Column(scale=1):
- upload = gr.File(label="Or upload your own waveform")
+ upload = gr.File(label="Upload your waveform")
with gr.Row():
sampling_rate_inputs = gr.Slider(minimum=10,
maximum=1000,
@@ -730,15 +791,22 @@ with gr.Blocks() as demo:
with gr.Row():
with gr.Column(scale=2):
- inputs_vel_model = [
- gr.Slider(minimum=-180, maximum=180, value=0, step=5, label="Azimuth", interactive=True),
- gr.Slider(minimum=-90, maximum=90, value=30, step=5, label="Elevation", interactive=True)
- ]
+ azimuth_input = gr.Slider(minimum=-180, maximum=180, value=0, step=5, label="Azimuth", interactive=True)
+ elevation_input = gr.Slider(minimum=-90, maximum=90, value=30, step=5, label="Elevation", interactive=True)
+
+ with gr.Row():
+ interpolate_input = gr.Checkbox(label="Interpolate", info="Interpolate velocity model")
+ n_lat_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label="N lat", info='Number of Lat grid points', interactive=True)
+ n_lon_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label="N lon", info='Number of Lon grid points', interactive=True)
+ n_depth_input = gr.Slider(minimum=5, maximum=100, value=50, step=5, label="N depth", info='Number of Depth grid points', interactive=True)
+
button = gr.Button("Look at 3D Velocities")
outputs_vel_model = gr.Image(label="3D Velocity Model")
- button.click(compute_velocity_model,
- inputs=inputs_vel_model,
- outputs=outputs_vel_model)
+ button.click(compute_velocity_model,
+ inputs=[azimuth_input, elevation_input,
+ interpolate_input, n_lat_input,
+ n_lon_input, n_depth_input],
+ outputs=[outputs_vel_model])
demo.launch()
\ No newline at end of file
diff --git a/data/cached/CI_BAK_2019-07-04T17:33:54.617418Z.mseed b/data/cached/CI_BAK_2019-07-04T17:33:54.617418Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..8f49723606787e09fa1df94d69387d98d6352c20
Binary files /dev/null and b/data/cached/CI_BAK_2019-07-04T17:33:54.617418Z.mseed differ
diff --git a/data/cached/CI_BBR_2019-07-04T17:33:59.141726Z.mseed b/data/cached/CI_BBR_2019-07-04T17:33:59.141726Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f1d0fb505e77921b9a65bcedfd97281d6f0713cc
Binary files /dev/null and b/data/cached/CI_BBR_2019-07-04T17:33:59.141726Z.mseed differ
diff --git a/data/cached/CI_BFS_2019-07-04T17:33:58.033722Z.mseed b/data/cached/CI_BFS_2019-07-04T17:33:58.033722Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..3171dbf0394fe2318399b8d5a42c925a20723ff8
Binary files /dev/null and b/data/cached/CI_BFS_2019-07-04T17:33:58.033722Z.mseed differ
diff --git a/data/cached/CI_CHF_2019-07-04T17:33:57.250415Z.mseed b/data/cached/CI_CHF_2019-07-04T17:33:57.250415Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..1edda93da352648aaf4835abcf08d502089ab520
Binary files /dev/null and b/data/cached/CI_CHF_2019-07-04T17:33:57.250415Z.mseed differ
diff --git a/data/cached/CI_DEC_2019-07-04T17:33:59.448227Z.mseed b/data/cached/CI_DEC_2019-07-04T17:33:59.448227Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..55b10db631384b899646107d3f07c787b417600c
Binary files /dev/null and b/data/cached/CI_DEC_2019-07-04T17:33:59.448227Z.mseed differ
diff --git a/data/cached/CI_DJJ_2019-07-04T17:34:01.956593Z.mseed b/data/cached/CI_DJJ_2019-07-04T17:34:01.956593Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..77c4a2af98a3d572fb7724fb4f47cc2cc993a9a0
Binary files /dev/null and b/data/cached/CI_DJJ_2019-07-04T17:34:01.956593Z.mseed differ
diff --git a/data/cached/CI_MWC_2019-07-04T17:33:58.878567Z.mseed b/data/cached/CI_MWC_2019-07-04T17:33:58.878567Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..a3933d2d5f34f97eb15e15121d0736ea43f28486
Binary files /dev/null and b/data/cached/CI_MWC_2019-07-04T17:33:58.878567Z.mseed differ
diff --git a/data/cached/CI_PASC_2019-07-04T17:33:59.995038Z.mseed b/data/cached/CI_PASC_2019-07-04T17:33:59.995038Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..8ee03c56644e8c48da64eaa61ef2cb74b670d442
Binary files /dev/null and b/data/cached/CI_PASC_2019-07-04T17:33:59.995038Z.mseed differ
diff --git a/data/cached/CI_Q0000_2019-07-04T17:33:59.542086Z.mseed b/data/cached/CI_Q0000_2019-07-04T17:33:59.542086Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..8405002c335a1b73aca7b3eb09202e130b795a35
Binary files /dev/null and b/data/cached/CI_Q0000_2019-07-04T17:33:59.542086Z.mseed differ
diff --git a/data/cached/CI_Q0001_2019-07-04T17:33:59.848010Z.mseed b/data/cached/CI_Q0001_2019-07-04T17:33:59.848010Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..42c4b6b6da13d74b9223534dbe499e0ce367a26b
Binary files /dev/null and b/data/cached/CI_Q0001_2019-07-04T17:33:59.848010Z.mseed differ
diff --git a/data/cached/CI_Q0002_2019-07-04T17:34:02.161273Z.mseed b/data/cached/CI_Q0002_2019-07-04T17:34:02.161273Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..376ef837d9a2e0dcd2fe025745153b69df1b767c
Binary files /dev/null and b/data/cached/CI_Q0002_2019-07-04T17:34:02.161273Z.mseed differ
diff --git a/data/cached/CI_Q0015_2019-07-04T17:33:58.949256Z.mseed b/data/cached/CI_Q0015_2019-07-04T17:33:58.949256Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..ad78dd8bace4f4b0906de77429b6db528973faca
Binary files /dev/null and b/data/cached/CI_Q0015_2019-07-04T17:33:58.949256Z.mseed differ
diff --git a/data/cached/CI_Q0031_2019-07-04T17:34:01.066693Z.mseed b/data/cached/CI_Q0031_2019-07-04T17:34:01.066693Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..fe875ea3ffb3eaea300c463b2c994cf239dfb561
Binary files /dev/null and b/data/cached/CI_Q0031_2019-07-04T17:34:01.066693Z.mseed differ
diff --git a/data/cached/CI_Q0049_2019-07-04T17:33:59.323575Z.mseed b/data/cached/CI_Q0049_2019-07-04T17:33:59.323575Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..3ef1127a73886b98e76053e2570bd0845e23070b
Binary files /dev/null and b/data/cached/CI_Q0049_2019-07-04T17:33:59.323575Z.mseed differ
diff --git a/data/cached/CI_Q0050_2019-07-04T17:34:03.767760Z.mseed b/data/cached/CI_Q0050_2019-07-04T17:34:03.767760Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..a0460707a73a24438a9a63752cdedaf7a1fbf0e4
Binary files /dev/null and b/data/cached/CI_Q0050_2019-07-04T17:34:03.767760Z.mseed differ
diff --git a/data/cached/CI_Q0057_2019-07-04T17:34:00.984409Z.mseed b/data/cached/CI_Q0057_2019-07-04T17:34:00.984409Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..65516814f645938911291604fec087031bb5245e
Binary files /dev/null and b/data/cached/CI_Q0057_2019-07-04T17:34:00.984409Z.mseed differ
diff --git a/data/cached/CI_Q0073_2019-07-04T17:34:03.226784Z.mseed b/data/cached/CI_Q0073_2019-07-04T17:34:03.226784Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..cb6d788d6cc41c34df660a8f8cd302cd9fee20d2
Binary files /dev/null and b/data/cached/CI_Q0073_2019-07-04T17:34:03.226784Z.mseed differ
diff --git a/data/cached/CI_Q0077_2019-07-04T17:34:03.800544Z.mseed b/data/cached/CI_Q0077_2019-07-04T17:34:03.800544Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..bae26938c7092197b3b69e92e10b3ccf61c5499b
Binary files /dev/null and b/data/cached/CI_Q0077_2019-07-04T17:34:03.800544Z.mseed differ
diff --git a/data/cached/CI_Q0080_2019-07-04T17:34:01.906420Z.mseed b/data/cached/CI_Q0080_2019-07-04T17:34:01.906420Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..caf624f1bc5f173388cce5faf1994027e3066efe
Binary files /dev/null and b/data/cached/CI_Q0080_2019-07-04T17:34:01.906420Z.mseed differ
diff --git a/data/cached/CI_SVD_2019-07-04T17:34:00.668795Z.mseed b/data/cached/CI_SVD_2019-07-04T17:34:00.668795Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e5c277c001193e0433383dfc0f8ab2ede5d08e0a
Binary files /dev/null and b/data/cached/CI_SVD_2019-07-04T17:34:00.668795Z.mseed differ
diff --git a/data/cached/CI_TUQ_2019-07-04T17:33:56.281687Z.mseed b/data/cached/CI_TUQ_2019-07-04T17:33:56.281687Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..689775752f3ec57636ff776e3cf867b67ba837c6
Binary files /dev/null and b/data/cached/CI_TUQ_2019-07-04T17:33:56.281687Z.mseed differ
diff --git a/data/cached/CI_USC_2019-07-04T17:34:02.444223Z.mseed b/data/cached/CI_USC_2019-07-04T17:34:02.444223Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b0204f19de2487ebc095dd7684dc7331d7efdfea
Binary files /dev/null and b/data/cached/CI_USC_2019-07-04T17:34:02.444223Z.mseed differ
diff --git a/data/cached/CI_VES_2019-07-04T17:33:53.346003Z.mseed b/data/cached/CI_VES_2019-07-04T17:33:53.346003Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..9d350fd4126bc1e3fe583f541975de57b88abc5c
Binary files /dev/null and b/data/cached/CI_VES_2019-07-04T17:33:53.346003Z.mseed differ
diff --git a/data/cached/CI_VOG_2019-07-04T17:33:58.215994Z.mseed b/data/cached/CI_VOG_2019-07-04T17:33:58.215994Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..c6673bc2fdb00529b037512fd87645b0e157ab6a
Binary files /dev/null and b/data/cached/CI_VOG_2019-07-04T17:33:58.215994Z.mseed differ
diff --git a/data/cached/GS_COM_2000-09-03T08:36:34.034702Z.mseed b/data/cached/GS_COM_2000-09-03T08:36:34.034702Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..2e2ede26f4f314bcb8f77d73b6d8d68ac94ba4e8
Binary files /dev/null and b/data/cached/GS_COM_2000-09-03T08:36:34.034702Z.mseed differ
diff --git a/data/cached/GS_FAI_2000-09-03T08:36:33.897223Z.mseed b/data/cached/GS_FAI_2000-09-03T08:36:33.897223Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b47788c74d099c7e7deb23ea7398a730e40d03ba
Binary files /dev/null and b/data/cached/GS_FAI_2000-09-03T08:36:33.897223Z.mseed differ
diff --git a/data/cached/GS_N10_2000-09-03T08:36:32.693278Z.mseed b/data/cached/GS_N10_2000-09-03T08:36:32.693278Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..63785128e7577942cd38bb2fafa8ab2ae51db2c1
Binary files /dev/null and b/data/cached/GS_N10_2000-09-03T08:36:32.693278Z.mseed differ
diff --git a/data/cached/GS_N20_2000-09-03T08:36:32.659822Z.mseed b/data/cached/GS_N20_2000-09-03T08:36:32.659822Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..93a7ae43d39ebe185d046176f90dead550a0bf38
Binary files /dev/null and b/data/cached/GS_N20_2000-09-03T08:36:32.659822Z.mseed differ
diff --git a/data/cached/GS_N30_2000-09-03T08:36:32.556386Z.mseed b/data/cached/GS_N30_2000-09-03T08:36:32.556386Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..2b93c7ed45115b94900254cc4029d020eabea8a5
Binary files /dev/null and b/data/cached/GS_N30_2000-09-03T08:36:32.556386Z.mseed differ
diff --git a/data/cached/GS_N40_2000-09-03T08:36:32.571201Z.mseed b/data/cached/GS_N40_2000-09-03T08:36:32.571201Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..067796c5b2e1e9cc5de446baf60ef1595585da73
Binary files /dev/null and b/data/cached/GS_N40_2000-09-03T08:36:32.571201Z.mseed differ
diff --git a/data/cached/GS_N50_2000-09-03T08:36:32.517254Z.mseed b/data/cached/GS_N50_2000-09-03T08:36:32.517254Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e08c6ceffac320a1a4b0324a8600ac9da40f10b3
Binary files /dev/null and b/data/cached/GS_N50_2000-09-03T08:36:32.517254Z.mseed differ
diff --git a/data/cached/GS_N60_2000-09-03T08:36:32.499849Z.mseed b/data/cached/GS_N60_2000-09-03T08:36:32.499849Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..c03dd2f9d4c7e0059ac43fe0d0e8ef99b77e24c7
Binary files /dev/null and b/data/cached/GS_N60_2000-09-03T08:36:32.499849Z.mseed differ
diff --git a/data/cached/GS_O10_2000-09-03T08:36:32.796101Z.mseed b/data/cached/GS_O10_2000-09-03T08:36:32.796101Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..4691257d4a20e767297197b15a2a649213cb81c8
Binary files /dev/null and b/data/cached/GS_O10_2000-09-03T08:36:32.796101Z.mseed differ
diff --git a/data/cached/GS_O50_2000-09-03T08:36:32.656750Z.mseed b/data/cached/GS_O50_2000-09-03T08:36:32.656750Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..65fb676ba40efeea36949eece341ff853aa3a53e
Binary files /dev/null and b/data/cached/GS_O50_2000-09-03T08:36:32.656750Z.mseed differ
diff --git a/data/cached/GS_O60_2000-09-03T08:36:32.626776Z.mseed b/data/cached/GS_O60_2000-09-03T08:36:32.626776Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..377d96e39b4c8556dc89a12b70419f2790fb0033
Binary files /dev/null and b/data/cached/GS_O60_2000-09-03T08:36:32.626776Z.mseed differ
diff --git a/data/cached/GS_P10_2000-09-03T08:36:32.900030Z.mseed b/data/cached/GS_P10_2000-09-03T08:36:32.900030Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..bda62fd759cb169e9f6d538e9a2275746bda8335
Binary files /dev/null and b/data/cached/GS_P10_2000-09-03T08:36:32.900030Z.mseed differ
diff --git a/data/cached/GS_P20_2000-09-03T08:36:32.838345Z.mseed b/data/cached/GS_P20_2000-09-03T08:36:32.838345Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..984fa13fce827b08f028fa338305c33cc8ec7eef
Binary files /dev/null and b/data/cached/GS_P20_2000-09-03T08:36:32.838345Z.mseed differ
diff --git a/data/cached/GS_P30_2000-09-03T08:36:32.820809Z.mseed b/data/cached/GS_P30_2000-09-03T08:36:32.820809Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..63003254a5d85029f91c334f3b6567f8c9d6c045
Binary files /dev/null and b/data/cached/GS_P30_2000-09-03T08:36:32.820809Z.mseed differ
diff --git a/data/cached/GS_P40_2000-09-03T08:36:32.774233Z.mseed b/data/cached/GS_P40_2000-09-03T08:36:32.774233Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..9fb23a8e3b7a2fff82bcee33b0419f50c2fb7a0b
Binary files /dev/null and b/data/cached/GS_P40_2000-09-03T08:36:32.774233Z.mseed differ
diff --git a/data/cached/GS_P60_2000-09-03T08:36:32.712966Z.mseed b/data/cached/GS_P60_2000-09-03T08:36:32.712966Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..bfc4a2375d295ed6fc7509f90020f6dc4608a6db
Binary files /dev/null and b/data/cached/GS_P60_2000-09-03T08:36:32.712966Z.mseed differ
diff --git a/data/cached/GS_Q10_2000-09-03T08:36:33.032313Z.mseed b/data/cached/GS_Q10_2000-09-03T08:36:33.032313Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..4992d9306009137e6ae337c79a1a9c6aa979cfc9
Binary files /dev/null and b/data/cached/GS_Q10_2000-09-03T08:36:33.032313Z.mseed differ
diff --git a/data/cached/GS_Q20_2000-09-03T08:36:32.982191Z.mseed b/data/cached/GS_Q20_2000-09-03T08:36:32.982191Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b09474296b4946d0590622c3076fbf52cae5c5fa
Binary files /dev/null and b/data/cached/GS_Q20_2000-09-03T08:36:32.982191Z.mseed differ
diff --git a/data/cached/GS_Q30_2000-09-03T08:36:32.962975Z.mseed b/data/cached/GS_Q30_2000-09-03T08:36:32.962975Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..34e8bc2ce0a446005d44a53d71ce0192105d107d
Binary files /dev/null and b/data/cached/GS_Q30_2000-09-03T08:36:32.962975Z.mseed differ
diff --git a/data/cached/GS_Q40_2000-09-03T08:36:32.907654Z.mseed b/data/cached/GS_Q40_2000-09-03T08:36:32.907654Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..139d9b833aa52b282845916e825f236c2737e39c
Binary files /dev/null and b/data/cached/GS_Q40_2000-09-03T08:36:32.907654Z.mseed differ
diff --git a/data/cached/GS_Q50_2000-09-03T08:36:32.896534Z.mseed b/data/cached/GS_Q50_2000-09-03T08:36:32.896534Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..4d23395fae7d5d1f71766b8f12cda445dc795ffb
Binary files /dev/null and b/data/cached/GS_Q50_2000-09-03T08:36:32.896534Z.mseed differ
diff --git a/data/cached/GS_Q60_2000-09-03T08:36:32.832100Z.mseed b/data/cached/GS_Q60_2000-09-03T08:36:32.832100Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..0039aae832979bb0c27f7e1dd1c3c1a568a83a3d
Binary files /dev/null and b/data/cached/GS_Q60_2000-09-03T08:36:32.832100Z.mseed differ
diff --git a/data/cached/GS_R10_2000-09-03T08:36:33.107196Z.mseed b/data/cached/GS_R10_2000-09-03T08:36:33.107196Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..da503c99d6d5a53daa0c46d5fd383387b6d59e96
Binary files /dev/null and b/data/cached/GS_R10_2000-09-03T08:36:33.107196Z.mseed differ
diff --git a/data/cached/GS_R20_2000-09-03T08:36:33.065548Z.mseed b/data/cached/GS_R20_2000-09-03T08:36:33.065548Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e0113cd2b72a2a876b8eca6f33e21a4107517189
Binary files /dev/null and b/data/cached/GS_R20_2000-09-03T08:36:33.065548Z.mseed differ
diff --git a/data/cached/GS_R30_2000-09-03T08:36:33.032988Z.mseed b/data/cached/GS_R30_2000-09-03T08:36:33.032988Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..d89115d6e9bb6e896013d0ac7f6d3fc258a6ac50
Binary files /dev/null and b/data/cached/GS_R30_2000-09-03T08:36:33.032988Z.mseed differ
diff --git a/data/cached/GS_R40_2000-09-03T08:36:33.012859Z.mseed b/data/cached/GS_R40_2000-09-03T08:36:33.012859Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..ac140c30e6e236511628a69c46767188ac1e8095
Binary files /dev/null and b/data/cached/GS_R40_2000-09-03T08:36:33.012859Z.mseed differ
diff --git a/data/cached/GS_R60_2000-09-03T08:36:32.943845Z.mseed b/data/cached/GS_R60_2000-09-03T08:36:32.943845Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f55e76be90d4d4ae41fb3f496a4d2ac544022048
Binary files /dev/null and b/data/cached/GS_R60_2000-09-03T08:36:32.943845Z.mseed differ
diff --git a/data/cached/GS_RCK_2000-09-03T08:36:32.690055Z.mseed b/data/cached/GS_RCK_2000-09-03T08:36:32.690055Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..395ea3fe3a541da8860e4f4dd1788a00e118851e
Binary files /dev/null and b/data/cached/GS_RCK_2000-09-03T08:36:32.690055Z.mseed differ
diff --git a/data/cached/GS_ROC_2000-09-03T08:36:32.709666Z.mseed b/data/cached/GS_ROC_2000-09-03T08:36:32.709666Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..0aa77ce84fb19e392cb6d90b71702724670eea15
Binary files /dev/null and b/data/cached/GS_ROC_2000-09-03T08:36:32.709666Z.mseed differ
diff --git a/data/cached/GS_S10_2000-09-03T08:36:33.226985Z.mseed b/data/cached/GS_S10_2000-09-03T08:36:33.226985Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..818c6ea4120414f01c502b435c909171e5f4fe84
Binary files /dev/null and b/data/cached/GS_S10_2000-09-03T08:36:33.226985Z.mseed differ
diff --git a/data/cached/GS_S20_2000-09-03T08:36:33.189907Z.mseed b/data/cached/GS_S20_2000-09-03T08:36:33.189907Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..62147262a936b8329e93346d1f743fd99bdd1cf2
Binary files /dev/null and b/data/cached/GS_S20_2000-09-03T08:36:33.189907Z.mseed differ
diff --git a/data/cached/GS_S30_2000-09-03T08:36:33.147596Z.mseed b/data/cached/GS_S30_2000-09-03T08:36:33.147596Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..34bcfe2a88b856ca10bb778d9b6fb63a3fc23372
Binary files /dev/null and b/data/cached/GS_S30_2000-09-03T08:36:33.147596Z.mseed differ
diff --git a/data/cached/GS_S40_2000-09-03T08:36:33.118622Z.mseed b/data/cached/GS_S40_2000-09-03T08:36:33.118622Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..aa93af6d496c79b06352be57c2ae7e68c0524632
Binary files /dev/null and b/data/cached/GS_S40_2000-09-03T08:36:33.118622Z.mseed differ
diff --git a/data/cached/GS_S50_2000-09-03T08:36:33.087670Z.mseed b/data/cached/GS_S50_2000-09-03T08:36:33.087670Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b8ef6ccdf843815d266072e720a5ff3a2541cc71
Binary files /dev/null and b/data/cached/GS_S50_2000-09-03T08:36:33.087670Z.mseed differ
diff --git a/data/cached/GS_S60_2000-09-03T08:36:33.069610Z.mseed b/data/cached/GS_S60_2000-09-03T08:36:33.069610Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..2d7f4dca7586e9aa10e23e748bf49a7a402be32a
Binary files /dev/null and b/data/cached/GS_S60_2000-09-03T08:36:33.069610Z.mseed differ
diff --git a/data/cached/NN_BHP_2019-07-04T17:34:00.373160Z.mseed b/data/cached/NN_BHP_2019-07-04T17:34:00.373160Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..83e65086b54ca6f03c97d607d4154bc79e17df80
Binary files /dev/null and b/data/cached/NN_BHP_2019-07-04T17:34:00.373160Z.mseed differ
diff --git a/data/cached/NN_CPYB_2019-07-04T17:34:00.619199Z.mseed b/data/cached/NN_CPYB_2019-07-04T17:34:00.619199Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b28c90d1d8a9cd40e0b255c3d5728ba3d06e0ef5
Binary files /dev/null and b/data/cached/NN_CPYB_2019-07-04T17:34:00.619199Z.mseed differ
diff --git a/data/cached/NN_DSP_2019-07-04T17:33:59.490257Z.mseed b/data/cached/NN_DSP_2019-07-04T17:33:59.490257Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b0c035d32abfe09eea6b1131623d7db5f7553063
Binary files /dev/null and b/data/cached/NN_DSP_2019-07-04T17:33:59.490257Z.mseed differ
diff --git a/data/cached/NN_GMN_2019-07-04T17:33:58.483987Z.mseed b/data/cached/NN_GMN_2019-07-04T17:33:58.483987Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..3de777d0498082ab5318cecbd91e97bc2936dd41
Binary files /dev/null and b/data/cached/NN_GMN_2019-07-04T17:33:58.483987Z.mseed differ
diff --git a/data/cached/NN_LCH_2019-07-04T17:33:57.161615Z.mseed b/data/cached/NN_LCH_2019-07-04T17:33:57.161615Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..eea5f89d3d9bd2830669ab1e6abc7b244065b9a7
Binary files /dev/null and b/data/cached/NN_LCH_2019-07-04T17:33:57.161615Z.mseed differ
diff --git a/data/cached/NN_POC_2019-07-04T17:34:00.309208Z.mseed b/data/cached/NN_POC_2019-07-04T17:34:00.309208Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..1878d740bf0dacc84df65e03786ab183c6a004d7
Binary files /dev/null and b/data/cached/NN_POC_2019-07-04T17:34:00.309208Z.mseed differ
diff --git a/data/cached/NN_RCC_2019-07-04T17:34:03.980210Z.mseed b/data/cached/NN_RCC_2019-07-04T17:34:03.980210Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..01fb4a56aeded3ff0c3c41dec9bb6f8eea225c19
Binary files /dev/null and b/data/cached/NN_RCC_2019-07-04T17:34:03.980210Z.mseed differ
diff --git a/data/cached/NN_SCH_2019-07-04T17:34:02.176635Z.mseed b/data/cached/NN_SCH_2019-07-04T17:34:02.176635Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..975b9bb94fcd5b4e8acbddec497d676354ee1418
Binary files /dev/null and b/data/cached/NN_SCH_2019-07-04T17:34:02.176635Z.mseed differ
diff --git a/data/cached/NN_WMD_2019-07-04T17:34:02.983187Z.mseed b/data/cached/NN_WMD_2019-07-04T17:34:02.983187Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..bb0b01ef9ba3afef1cb4e41c8e85effbd1fc7617
Binary files /dev/null and b/data/cached/NN_WMD_2019-07-04T17:34:02.983187Z.mseed differ
diff --git a/data/cached/RE_CSTS_2019-07-04T17:34:04.658380Z.mseed b/data/cached/RE_CSTS_2019-07-04T17:34:04.658380Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..fef16b72033ca915112be11205db963ebf3b03d5
Binary files /dev/null and b/data/cached/RE_CSTS_2019-07-04T17:34:04.658380Z.mseed differ
diff --git a/data/cached/SN_AF001_2019-07-04T17:34:02.780693Z.mseed b/data/cached/SN_AF001_2019-07-04T17:34:02.780693Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..4c9ce51c9e6bf15943b45c33a65a91a4d662f591
Binary files /dev/null and b/data/cached/SN_AF001_2019-07-04T17:34:02.780693Z.mseed differ
diff --git a/data/cached/SN_AF004_2019-07-04T17:34:03.732887Z.mseed b/data/cached/SN_AF004_2019-07-04T17:34:03.732887Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..d14b933b924f8a98e312a389ee8c969012f61a0e
Binary files /dev/null and b/data/cached/SN_AF004_2019-07-04T17:34:03.732887Z.mseed differ
diff --git a/data/cached/SN_AF005_2019-07-04T17:34:03.543108Z.mseed b/data/cached/SN_AF005_2019-07-04T17:34:03.543108Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..4f4aa91819a883ae68cd01ae2dd89dfb3f5a54ad
Binary files /dev/null and b/data/cached/SN_AF005_2019-07-04T17:34:03.543108Z.mseed differ
diff --git a/data/cached/SN_EASTA_2019-07-04T17:34:02.920878Z.mseed b/data/cached/SN_EASTA_2019-07-04T17:34:02.920878Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..fba7f26f31c3041a5871961faaffbf85ecd469aa
Binary files /dev/null and b/data/cached/SN_EASTA_2019-07-04T17:34:02.920878Z.mseed differ
diff --git a/data/cached/SN_EASTB_2019-07-04T17:34:03.112399Z.mseed b/data/cached/SN_EASTB_2019-07-04T17:34:03.112399Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..fba8a7ddb1664c4f62784607e30e8e381aede351
Binary files /dev/null and b/data/cached/SN_EASTB_2019-07-04T17:34:03.112399Z.mseed differ
diff --git a/data/cached/SN_EASTC_2019-07-04T17:34:03.240829Z.mseed b/data/cached/SN_EASTC_2019-07-04T17:34:03.240829Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..5340a42e4e9b085a9be304ec8e29b716791ad292
Binary files /dev/null and b/data/cached/SN_EASTC_2019-07-04T17:34:03.240829Z.mseed differ
diff --git a/data/cached/SN_EASTD_2019-07-04T17:34:03.318931Z.mseed b/data/cached/SN_EASTD_2019-07-04T17:34:03.318931Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..0470d21323ee27a81fcdcf32926908b169e40abf
Binary files /dev/null and b/data/cached/SN_EASTD_2019-07-04T17:34:03.318931Z.mseed differ
diff --git a/data/cached/SN_ECO_2019-07-04T17:34:01.540101Z.mseed b/data/cached/SN_ECO_2019-07-04T17:34:01.540101Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..c2169658d0952ce820ae75834df6a5c28ff037b6
Binary files /dev/null and b/data/cached/SN_ECO_2019-07-04T17:34:01.540101Z.mseed differ
diff --git a/data/cached/SN_I20M0_2019-07-04T17:34:02.504236Z.mseed b/data/cached/SN_I20M0_2019-07-04T17:34:02.504236Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..d6663d3e005b27b1f7da20b544219726320b9e9e
Binary files /dev/null and b/data/cached/SN_I20M0_2019-07-04T17:34:02.504236Z.mseed differ
diff --git a/data/cached/SN_I20M3_2019-07-04T17:34:02.563334Z.mseed b/data/cached/SN_I20M3_2019-07-04T17:34:02.563334Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..89131b9d1698460c4f25db4f8a0d4640d4e50507
Binary files /dev/null and b/data/cached/SN_I20M3_2019-07-04T17:34:02.563334Z.mseed differ
diff --git a/data/cached/SN_I20M9_2019-07-04T17:34:02.181773Z.mseed b/data/cached/SN_I20M9_2019-07-04T17:34:02.181773Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..9d8846e88185800225037c891f99ff8cd6eca2f8
Binary files /dev/null and b/data/cached/SN_I20M9_2019-07-04T17:34:02.181773Z.mseed differ
diff --git a/data/cached/SN_JFR2_2019-07-04T17:33:57.498866Z.mseed b/data/cached/SN_JFR2_2019-07-04T17:33:57.498866Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e740ff37a2f1a238210f336f65b94329067f53cc
Binary files /dev/null and b/data/cached/SN_JFR2_2019-07-04T17:33:57.498866Z.mseed differ
diff --git a/data/cached/SN_L3023_2019-07-04T17:34:03.275439Z.mseed b/data/cached/SN_L3023_2019-07-04T17:34:03.275439Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..55117097dc770150c0d40515fbe22bc40f9c791f
Binary files /dev/null and b/data/cached/SN_L3023_2019-07-04T17:34:03.275439Z.mseed differ
diff --git a/data/cached/SN_L5026_2019-07-04T17:34:03.288901Z.mseed b/data/cached/SN_L5026_2019-07-04T17:34:03.288901Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..25207093f16638a157120300fe26d45ff5ab2400
Binary files /dev/null and b/data/cached/SN_L5026_2019-07-04T17:34:03.288901Z.mseed differ
diff --git a/data/cached/SN_MCY_2019-07-04T17:33:59.068777Z.mseed b/data/cached/SN_MCY_2019-07-04T17:33:59.068777Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b557cb2b3cfddba588cbb300e577e2f0c51335a7
Binary files /dev/null and b/data/cached/SN_MCY_2019-07-04T17:33:59.068777Z.mseed differ
diff --git a/data/cached/SN_NORA_2019-07-04T17:34:02.979479Z.mseed b/data/cached/SN_NORA_2019-07-04T17:34:02.979479Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f58c4e1da6e1bddc135b1be176e4c90627bf63fa
Binary files /dev/null and b/data/cached/SN_NORA_2019-07-04T17:34:02.979479Z.mseed differ
diff --git a/data/cached/SN_NSP_2019-07-04T17:33:57.325111Z.mseed b/data/cached/SN_NSP_2019-07-04T17:33:57.325111Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..a4ff1f66995fabd96305aee33a2d8d53444591d7
Binary files /dev/null and b/data/cached/SN_NSP_2019-07-04T17:33:57.325111Z.mseed differ
diff --git a/data/cached/SN_RTPP_2019-07-04T17:33:58.012862Z.mseed b/data/cached/SN_RTPP_2019-07-04T17:33:58.012862Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..9109a42278eb95a808656d5e346f2c349d5ee483
Binary files /dev/null and b/data/cached/SN_RTPP_2019-07-04T17:33:58.012862Z.mseed differ
diff --git a/data/cached/SN_RV157_2019-07-04T17:34:00.806177Z.mseed b/data/cached/SN_RV157_2019-07-04T17:34:00.806177Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..1dcc663962036da3479a06d76e3816b96c57ec93
Binary files /dev/null and b/data/cached/SN_RV157_2019-07-04T17:34:00.806177Z.mseed differ
diff --git a/data/cached/SN_RV196_2019-07-04T17:34:00.483629Z.mseed b/data/cached/SN_RV196_2019-07-04T17:34:00.483629Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..0092fdea639f94421feaccc3a63335f01303ef15
Binary files /dev/null and b/data/cached/SN_RV196_2019-07-04T17:34:00.483629Z.mseed differ
diff --git a/data/cached/SN_RV339_2019-07-04T17:33:59.156053Z.mseed b/data/cached/SN_RV339_2019-07-04T17:33:59.156053Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..9f08338855eae4bd463e9a8663d84e43f0030301
Binary files /dev/null and b/data/cached/SN_RV339_2019-07-04T17:33:59.156053Z.mseed differ
diff --git a/data/cached/SN_RVEE_2019-07-04T17:33:58.128206Z.mseed b/data/cached/SN_RVEE_2019-07-04T17:33:58.128206Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..895b95c25fad3e7f8af189176c0597b4bb1e77ff
Binary files /dev/null and b/data/cached/SN_RVEE_2019-07-04T17:33:58.128206Z.mseed differ
diff --git a/data/cached/SN_RVFF_2019-07-04T17:33:59.397106Z.mseed b/data/cached/SN_RVFF_2019-07-04T17:33:59.397106Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..63b1992273d814cf23e0e335d461b119da3cc393
Binary files /dev/null and b/data/cached/SN_RVFF_2019-07-04T17:33:59.397106Z.mseed differ
diff --git a/data/cached/SN_RVNE_2019-07-04T17:33:58.579209Z.mseed b/data/cached/SN_RVNE_2019-07-04T17:33:58.579209Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..78cee004cf824c591b15d745fcca838c6d4f48d8
Binary files /dev/null and b/data/cached/SN_RVNE_2019-07-04T17:33:58.579209Z.mseed differ
diff --git a/data/cached/SN_RVSE_2019-07-04T17:33:58.068372Z.mseed b/data/cached/SN_RVSE_2019-07-04T17:33:58.068372Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..70316e51fb50cab626d4ac03325886805292b7f3
Binary files /dev/null and b/data/cached/SN_RVSE_2019-07-04T17:33:58.068372Z.mseed differ
diff --git a/data/cached/SN_SOUB_2019-07-04T17:34:01.016021Z.mseed b/data/cached/SN_SOUB_2019-07-04T17:34:01.016021Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..a0d782c63e78990377140c05e96895316619dfa4
Binary files /dev/null and b/data/cached/SN_SOUB_2019-07-04T17:34:01.016021Z.mseed differ
diff --git a/data/cached/SN_SOUC_2019-07-04T17:34:00.929820Z.mseed b/data/cached/SN_SOUC_2019-07-04T17:34:00.929820Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..8cb187a629360da253ef2464835c5e24ab9327ca
Binary files /dev/null and b/data/cached/SN_SOUC_2019-07-04T17:34:00.929820Z.mseed differ
diff --git a/data/cached/SN_SOUD_2019-07-04T17:34:00.677472Z.mseed b/data/cached/SN_SOUD_2019-07-04T17:34:00.677472Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..2541efc0912198fb7464485a3b9db8dd6e1b31d1
Binary files /dev/null and b/data/cached/SN_SOUD_2019-07-04T17:34:00.677472Z.mseed differ
diff --git a/data/cached/SN_SOUE_2019-07-04T17:34:00.577733Z.mseed b/data/cached/SN_SOUE_2019-07-04T17:34:00.577733Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..aa8cdf94f436a002d7aec4961a2573d96c06d04f
Binary files /dev/null and b/data/cached/SN_SOUE_2019-07-04T17:34:00.577733Z.mseed differ
diff --git a/data/cached/SN_SOUF_2019-07-04T17:34:00.387104Z.mseed b/data/cached/SN_SOUF_2019-07-04T17:34:00.387104Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..8cd6f05c8565235c8e43fbcb359e2e7a8193767c
Binary files /dev/null and b/data/cached/SN_SOUF_2019-07-04T17:34:00.387104Z.mseed differ
diff --git a/data/cached/SN_SPRS_2019-07-04T17:33:57.271299Z.mseed b/data/cached/SN_SPRS_2019-07-04T17:33:57.271299Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..292e42bd42120e8b0422281af2a6efa156d79001
Binary files /dev/null and b/data/cached/SN_SPRS_2019-07-04T17:33:57.271299Z.mseed differ
diff --git a/data/cached/SN_STC_2019-07-04T17:34:01.855594Z.mseed b/data/cached/SN_STC_2019-07-04T17:34:01.855594Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..0768793ef4279b23f6fbba65d7d225d2f4eb4d82
Binary files /dev/null and b/data/cached/SN_STC_2019-07-04T17:34:01.855594Z.mseed differ
diff --git a/data/cached/SN_SW119_2019-07-04T17:34:00.827942Z.mseed b/data/cached/SN_SW119_2019-07-04T17:34:00.827942Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..794f043bc63c1c938d6967c1157e1f2dcd038fee
Binary files /dev/null and b/data/cached/SN_SW119_2019-07-04T17:34:00.827942Z.mseed differ
diff --git a/data/cached/SN_SW157_2019-07-04T17:34:00.285282Z.mseed b/data/cached/SN_SW157_2019-07-04T17:34:00.285282Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..1ca7849ea09bc24ac01d1a2059fae12ecdf94756
Binary files /dev/null and b/data/cached/SN_SW157_2019-07-04T17:34:00.285282Z.mseed differ
diff --git a/data/cached/SN_SW522_2019-07-04T17:34:01.627675Z.mseed b/data/cached/SN_SW522_2019-07-04T17:34:01.627675Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..5fe2eeca809346a1b8111f4483a6c77fe59f5fdf
Binary files /dev/null and b/data/cached/SN_SW522_2019-07-04T17:34:01.627675Z.mseed differ
diff --git a/data/cached/SN_TPW_2019-07-04T17:33:58.692695Z.mseed b/data/cached/SN_TPW_2019-07-04T17:33:58.692695Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e5f5b25d21e8df3fa791ff5c95d63ee59f88769a
Binary files /dev/null and b/data/cached/SN_TPW_2019-07-04T17:33:58.692695Z.mseed differ
diff --git a/data/cached/SN_TWP_2019-07-04T17:34:02.924259Z.mseed b/data/cached/SN_TWP_2019-07-04T17:34:02.924259Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..17475c204ae8d48f965510b182057d49c4a0664c
Binary files /dev/null and b/data/cached/SN_TWP_2019-07-04T17:34:02.924259Z.mseed differ
diff --git a/data/cached/SN_U1AS_2019-07-04T17:34:01.345572Z.mseed b/data/cached/SN_U1AS_2019-07-04T17:34:01.345572Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..773a4f1de314f32169cb810b494985b0720728fc
Binary files /dev/null and b/data/cached/SN_U1AS_2019-07-04T17:34:01.345572Z.mseed differ
diff --git a/data/cached/SN_U1AU_2019-07-04T17:34:01.351215Z.mseed b/data/cached/SN_U1AU_2019-07-04T17:34:01.351215Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f170dfe565d6f2ffd466ccf0c905e7024dd5b5e8
Binary files /dev/null and b/data/cached/SN_U1AU_2019-07-04T17:34:01.351215Z.mseed differ
diff --git a/data/cached/SN_WESTA_2019-07-04T17:34:00.939546Z.mseed b/data/cached/SN_WESTA_2019-07-04T17:34:00.939546Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..db7a7004287157ae41b931ec9084a1947b27a38c
Binary files /dev/null and b/data/cached/SN_WESTA_2019-07-04T17:34:00.939546Z.mseed differ
diff --git a/data/cached/SN_YFT_2019-07-04T17:34:02.734929Z.mseed b/data/cached/SN_YFT_2019-07-04T17:34:02.734929Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..2cdeecace7ba987135b7365fba06a4676571eecc
Binary files /dev/null and b/data/cached/SN_YFT_2019-07-04T17:34:02.734929Z.mseed differ
diff --git a/data/cached/US_TPNV_2019-07-04T17:33:59.210827Z.mseed b/data/cached/US_TPNV_2019-07-04T17:33:59.210827Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f5dd286a5a741cc0b1da5b2c28edb0c3bab796ce
Binary files /dev/null and b/data/cached/US_TPNV_2019-07-04T17:33:59.210827Z.mseed differ
diff --git a/data/cached/YB_MOJA_2019-07-04T17:33:59.109183Z.mseed b/data/cached/YB_MOJA_2019-07-04T17:33:59.109183Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e318ea771a3bbed6520aec46dea53cab6e03bb83
Binary files /dev/null and b/data/cached/YB_MOJA_2019-07-04T17:33:59.109183Z.mseed differ
diff --git a/data/cached/YG_BMT_2000-09-03T08:36:32.692570Z.mseed b/data/cached/YG_BMT_2000-09-03T08:36:32.692570Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..b781b92a18f20258fb84b00d318c05ea9e633051
Binary files /dev/null and b/data/cached/YG_BMT_2000-09-03T08:36:32.692570Z.mseed differ
diff --git a/data/cached/YG_FIT_2000-09-03T08:36:33.075862Z.mseed b/data/cached/YG_FIT_2000-09-03T08:36:33.075862Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..1c03a847b6f4a90455ac83bdf0e38d38c74b7222
Binary files /dev/null and b/data/cached/YG_FIT_2000-09-03T08:36:33.075862Z.mseed differ
diff --git a/data/cached/YG_IAN_2000-09-03T08:36:32.115658Z.mseed b/data/cached/YG_IAN_2000-09-03T08:36:32.115658Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..62d475a5b39ec39b7f84eed85727098a25991fa3
Binary files /dev/null and b/data/cached/YG_IAN_2000-09-03T08:36:32.115658Z.mseed differ
diff --git a/data/cached/YG_KAT_2000-09-03T08:36:32.636001Z.mseed b/data/cached/YG_KAT_2000-09-03T08:36:32.636001Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..d15ee308bfdb550ae220d488b138de6b414ae38e
Binary files /dev/null and b/data/cached/YG_KAT_2000-09-03T08:36:32.636001Z.mseed differ
diff --git a/data/cached/YG_LEX_2000-09-03T08:36:34.746037Z.mseed b/data/cached/YG_LEX_2000-09-03T08:36:34.746037Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..28d248ad92a0d2285a6e52c52c9e39cde05d4acb
Binary files /dev/null and b/data/cached/YG_LEX_2000-09-03T08:36:34.746037Z.mseed differ
diff --git a/data/cached/YG_MCL_2000-09-03T08:36:32.128026Z.mseed b/data/cached/YG_MCL_2000-09-03T08:36:32.128026Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..f66b7217bfe73ecbcb52058fe3912c6f89f96adf
Binary files /dev/null and b/data/cached/YG_MCL_2000-09-03T08:36:32.128026Z.mseed differ
diff --git a/data/cached/YG_PRS_2000-09-03T08:36:33.486444Z.mseed b/data/cached/YG_PRS_2000-09-03T08:36:33.486444Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..e85a72931e2800fdd592b2cecebc0dd4d0974732
Binary files /dev/null and b/data/cached/YG_PRS_2000-09-03T08:36:33.486444Z.mseed differ
diff --git a/data/cached/YG_WVC_2000-09-03T08:36:33.867341Z.mseed b/data/cached/YG_WVC_2000-09-03T08:36:33.867341Z.mseed
new file mode 100644
index 0000000000000000000000000000000000000000..3fba4e1f0face0ed7bf193d4a927aaee439d9a2c
Binary files /dev/null and b/data/cached/YG_WVC_2000-09-03T08:36:33.867341Z.mseed differ
diff --git a/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_15.csv b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_15.csv
new file mode 100644
index 0000000000000000000000000000000000000000..098e5a096f4471fce64d29ea0166e7a91d04d853
--- /dev/null
+++ b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_15.csv
@@ -0,0 +1,16 @@
+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"
+LB.DAC,36.277,-117.593697,2019-07-04T17:33:43.387184Z,34.439029693603516,0.23750784806907177,41.48210525512695,0.84033178165555,,
+CI.ISA,35.66278,-118.47403,2019-07-04T17:33:46.297658Z,14.392077445983887,0.031968383118510246,26.656494140625,0.06666059140115976,5.509786370336251,2.9747824951914903
+CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.330288887023926,0.016060356865637004,13.382941246032715,0.03524674102663994,4.130917960194064,2.262643275505274
+NN.GWY,36.186001,-116.6698,2019-07-04T17:33:48.493781Z,15.728899002075195,0.045239757746458054,27.405405044555664,0.012221475772093982,6.119231109018811,3.5120359625275515
+NN.STHB,36.645401,-116.338799,2019-07-04T17:33:55.443778Z,23.352947235107422,0.3744226321578026,44.04683303833008,0.1678685937076807,6.418864645982177,3.40318240942485
+CI.RRX,34.875332,-116.996841,2019-07-04T17:33:50.712219Z,17.300827026367188,0.046564643271267414,30.308242797851562,0.07697680732235312,6.553167458647257,3.7407386971609977
+NN.QSM,35.965,-116.869102,2019-07-04T17:33:45.081547Z,10.853179931640625,0.03833597875200212,19.083938598632812,0.020896304631605744,6.441474783566184,3.6633153313634157
+CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.525603294372559,0.015247567207552493,9.212132453918457,0.017153594526462257,3.4203901487527526,1.680319839371246
+CI.CWC,36.439049,-118.080498,2019-07-04T17:33:47.189005Z,16.30278205871582,0.03326277597807348,28.5207576751709,0.025247696321457624,5.286053905666142,3.0215671601782677
+CI.SHO,35.899529,-116.275299,2019-07-04T17:33:51.673022Z,19.154117584228516,0.029428565176203847,33.864654541015625,0.038687243359163404,6.306307564126418,3.5668976471999314
+CI.OSI,34.6145,-118.7235,2019-07-04T17:33:57.203547Z,26.982280731201172,0.26682447642087936,49.88245391845703,0.21120380144566298,,
+CI.ADO,34.550461,-117.433907,2019-07-04T17:33:53.650962Z,21.616382598876953,0.04179573501460254,39.828887939453125,0.11273605981841683,6.294295200951223,3.416110775195922
+CI.EDW2,34.8811,-117.993881,2019-07-04T17:33:49.567241Z,17.19280242919922,0.023178785922937095,31.17211151123047,0.14238633681088686,6.080147521998276,3.3534711002313884
+CI.HEC,34.8294,-116.335,2019-07-04T17:33:56.148977Z,23.503509521484375,0.16815592534840107,41.08108901977539,0.05570112029090524,6.6093598323533715,3.7813786210938956
+CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.510456085205078,0.018548613879829645,17.035369873046875,0.035437317565083504,4.7426953739315625,2.6477379954424243
diff --git a/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_19.csv b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_19.csv
new file mode 100644
index 0000000000000000000000000000000000000000..ed9fae7519a68372c323f0e9faf31559b91d098f
--- /dev/null
+++ b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_19.csv
@@ -0,0 +1,20 @@
+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"
+CI.RRX,34.875332,-116.996841,2019-07-04T17:33:50.712219Z,17.26609230041504,0.01999325060751289,30.311491012573242,0.053286688635125756,6.566350666047879,3.7403378352403145
+CI.ISA,35.66278,-118.47403,2019-07-04T17:33:46.297658Z,14.404366493225098,0.038277864223346114,26.667644500732422,0.03612099797464907,5.50508571064213,2.9735386696987014
+CI.CWC,36.439049,-118.080498,2019-07-04T17:33:47.189005Z,16.308765411376953,0.03776653320528567,28.54163932800293,0.05438004853203893,5.284114560540649,3.0193565192363647
+CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.5269575119018555,0.011725481890607625,9.215554237365723,0.010158613440580666,3.4193669555188206,1.6796959278338193
+CI.EDW2,34.8811,-117.993881,2019-07-04T17:33:49.567241Z,17.17991828918457,0.0628892658278346,31.307424545288086,0.18126913346350193,6.084707349970942,3.3389771469347687
+CI.DJJ,34.10618,-118.45505,2019-07-04T17:34:01.956593Z,30.000263214111328,0.347661254927516,56.981781005859375,0.21276529412716627,,
+CI.SVD,34.10647,-117.09822,2019-07-04T17:34:00.668795Z,28.283260345458984,0.3603836987167597,52.81038284301758,0.1510767498984933,6.726014774674426,3.6022012475274554
+CI.ADO,34.550461,-117.433907,2019-07-04T17:33:53.650962Z,21.651683807373047,0.09646778460592031,39.87929153442383,0.02957542659714818,6.284032893908429,3.411793139218377
+CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.314583778381348,0.021924254251644015,13.388041496276855,0.027581736794672906,4.139787434838701,2.2617813087327994
+CI.BAK,35.34444,-119.104446,2019-07-04T17:33:54.617418Z,24.565580368041992,0.03401762223802507,46.200660705566406,0.23733587935566902,5.842337436232189,3.106457951794842
+CI.BBR,34.2623,-116.92075,2019-07-04T17:33:59.141726Z,28.10399055480957,0.1285839406773448,49.22570037841797,0.034670617897063494,6.349447559001124,3.625033526280956
+NN.GWY,36.186001,-116.6698,2019-07-04T17:33:48.493781Z,15.723100662231445,0.08844907628372312,27.40696144104004,0.022286682506091893,6.121487749252488,3.5118365197532464
+CI.BFS,34.23883,-117.65853,2019-07-04T17:33:58.033722Z,26.031116485595703,0.3012958914041519,47.595970153808594,0.07795811165124178,6.5264690963738525,3.5694466724459386
+NN.QSM,35.965,-116.869102,2019-07-04T17:33:45.081547Z,10.825481414794922,0.030407473677769303,19.073392868041992,0.01883336983155459,6.457956202818351,3.665340788334866
+CI.HEC,34.8294,-116.335,2019-07-04T17:33:56.148977Z,23.591991424560547,0.08986699394881725,41.083412170410156,0.05884413840249181,6.58457138929413,3.7811647948394587
+LB.DAC,36.277,-117.593697,2019-07-04T17:33:43.387184Z,34.324581146240234,0.3142671938985586,40.98020935058594,0.7438081316649914,,
+CI.DEC,34.253529,-118.333832,2019-07-04T17:33:59.448227Z,29.22709846496582,0.37216429598629475,51.75123596191406,0.15198043081909418,6.186414587152959,3.493847923108288
+CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.494861602783203,0.006664922257186845,17.034446716308594,0.02735861053224653,4.750484837615731,2.6478814857014505
+CI.SHO,35.899529,-116.275299,2019-07-04T17:33:51.673022Z,19.16595458984375,0.03903473261743784,33.81660842895508,0.026658850838430226,6.30241275170275,3.571965439980686
diff --git a/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv
index 7e9d219d97f97529f3c22df3c571f0b018bb1300..d9f81ed908cb3b084963a1ce16fc69b6109873d6 100644
--- a/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv
+++ b/data/velocity/35.766_-117.605_10.0_2019-07-04T17:33:49-00_3.csv
@@ -1,4 +1,4 @@
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"
-CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.320212364196777,0.020417090272530913,13.38510799407959,0.028438671142794192,4.13660431013202,2.2622770044299756
-CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.509395599365234,0.017237872816622257,17.024826049804688,0.04319542204029858,4.743224278343435,2.6493777937777434
-CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.530284881591797,0.01301152427913621,9.212895393371582,0.01826027117203921,3.4168555245020182,1.6801806885131727
+CI.WMF,36.11758,-117.85486,2019-07-04T17:33:41.867962Z,9.503650665283203,0.016685163136571646,17.022592544555664,0.04997979383915663,4.746091546067712,2.649725414106055
+CI.SRT,35.69235,-117.75051,2019-07-04T17:33:38.029990Z,4.53201961517334,0.01748959010001272,9.215676307678223,0.019567650742828846,3.4155476453388767,1.67967367867923
+CI.JRC2,35.98249,-117.80885,2019-07-04T17:33:39.947494Z,7.3213396072387695,0.014792646397836506,13.395279884338379,0.02523316943552345,4.135967410510336,2.2605591132307814
diff --git a/data/velocity/38.38_-122.41_9.4_2000-09-03T08:36:30-00_3.csv b/data/velocity/38.38_-122.41_9.4_2000-09-03T08:36:30-00_3.csv
new file mode 100644
index 0000000000000000000000000000000000000000..62cb57b5933842d4b4fc53e297de1ab76847fa51
--- /dev/null
+++ b/data/velocity/38.38_-122.41_9.4_2000-09-03T08:36:30-00_3.csv
@@ -0,0 +1,4 @@
+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"
+YG.IAN,37.37822,-122.053497,2000-09-03T08:36:32.115658Z,13.042083740234375,1.3291988521814346,12.836393356323242,2.4260426312685013,,
+YG.BMT,37.318611,-122.15313,2000-09-03T08:36:32.692570Z,18.609819412231445,1.7255506664514542,22.838241577148438,4.067991524934769,,
+YG.LEX,37.205791,-121.976562,2000-09-03T08:36:34.746037Z,9.203312873840332,1.3033630326390266,14.400150299072266,0.11303140316158533,14.778722714192403,9.445263152788494