{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "id": "wGgBzZbXuajb" }, "outputs": [], "source": [ "from collections import defaultdict\n", "import numpy as np\n", "import pandas as pd\n", "import time\n", "import requests\n", "import json\n", "import obspy\n", "from obspy.clients.fdsn import Client" ] }, { "cell_type": "markdown", "metadata": { "id": "D3rP1Gu3R8wf" }, "source": [ "## 1. Configuration" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "W98ancI1u1-T" }, "outputs": [], "source": [ "region_name = \"Ridgecrest_demo\"\n", "center = (-117.504, 35.705)\n", "horizontal_degree = 1.0\n", "vertical_degree = 1.0\n", "starttime = obspy.UTCDateTime(\"2019-07-04T17\")\n", "endtime = obspy.UTCDateTime(\"2019-07-04T18\")\n", "client = \"SCEDC\"\n", "network_list = [\"CI\"]\n", "# channel_list = \"HH*,BH*,EH*,HN*\"\n", "channel_list = \"HH*,BH*,EH*\"\n", "\n", "config = {}\n", "config[\"region\"] = region_name\n", "config[\"center\"] = center\n", "config[\"xlim_degree\"] = [center[0] - horizontal_degree / 2, center[0] + horizontal_degree / 2]\n", "config[\"ylim_degree\"] = [center[1] - vertical_degree / 2, center[1] + vertical_degree / 2]\n", "config[\"starttime\"] = starttime.datetime.isoformat()\n", "config[\"endtime\"] = endtime.datetime.isoformat()\n", "config[\"networks\"] = network_list\n", "config[\"channels\"] = channel_list\n", "config[\"client\"] = client" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'region': 'Ridgecrest_demo',\n", " 'center': (-117.504, 35.705),\n", " 'xlim_degree': [-118.004, -117.004],\n", " 'ylim_degree': [35.205, 36.205],\n", " 'starttime': '2019-07-04T17:00:00',\n", " 'endtime': '2019-07-04T18:00:00',\n", " 'networks': ['CI'],\n", " 'channels': 'HH*,BH*,EH*',\n", " 'client': 'SCEDC'}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "config" ] }, { "cell_type": "markdown", "metadata": { "id": "m6ftaZ7HSCxG" }, "source": [ "## 2. Download event information" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "DltZ-s2vtzDo" }, "outputs": [], "source": [ "events = Client(\"iris\").get_events(\n", " starttime=config[\"starttime\"],\n", " endtime=config[\"endtime\"],\n", " minlongitude=config[\"xlim_degree\"][0],\n", " maxlongitude=config[\"xlim_degree\"][1],\n", " minlatitude=config[\"ylim_degree\"][0],\n", " maxlatitude=config[\"ylim_degree\"][1],\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "gfMajl0jS82C" }, "source": [ "## 3. Download station information" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "6PaJGUf0vGHL" }, "outputs": [], "source": [ "stations = Client(config[\"client\"]).get_stations(\n", " network=\",\".join(config[\"networks\"]),\n", " station=\"*\",\n", " starttime=config[\"starttime\"],\n", " endtime=config[\"endtime\"],\n", " minlongitude=config[\"xlim_degree\"][0],\n", " maxlongitude=config[\"xlim_degree\"][1],\n", " minlatitude=config[\"ylim_degree\"][0],\n", " maxlatitude=config[\"ylim_degree\"][1],\n", " channel=config[\"channels\"],\n", " level=\"response\",\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "muvw2-CjTCPI" }, "source": [ "## 3.1 Convert station information into csv" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "HZpJxfSnvVjD" }, "outputs": [], "source": [ "station_locs = defaultdict(dict)\n", "for network in stations:\n", " for station in network:\n", " for chn in station:\n", " sid = f\"{network.code}.{station.code}.{chn.location_code}.{chn.code[:-1]}\"\n", " if sid in station_locs:\n", " station_locs[sid][\"component\"] += f\",{chn.code[-1]}\"\n", " station_locs[sid][\"response\"] += f\",{chn.response.instrument_sensitivity.value:.2f}\"\n", " else:\n", " component = f\"{chn.code[-1]}\"\n", " response = f\"{chn.response.instrument_sensitivity.value:.2f}\"\n", " dtype = chn.response.instrument_sensitivity.input_units.lower()\n", " tmp_dict = {}\n", " tmp_dict[\"longitude\"], tmp_dict[\"latitude\"], tmp_dict[\"elevation_m\"] = (\n", " chn.longitude,\n", " chn.latitude,\n", " chn.elevation,\n", " )\n", " tmp_dict[\"component\"], tmp_dict[\"response\"], tmp_dict[\"unit\"] = component, response, dtype\n", " station_locs[sid] = tmp_dict\n", "\n", "station_locs = pd.DataFrame.from_dict(station_locs, orient='index')\n", "station_locs[\"station_id\"] = station_locs.index" ] }, { "cell_type": "markdown", "metadata": { "id": "5ZQdfPRgTNa8" }, "source": [ "## 4. Download waveform" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "NwfJw3f9vmyr" }, "outputs": [], "source": [ "client = Client(config[\"client\"])\n", "interval = 30 #s\n", "# interval = 3600 #s\n", "\n", "# for event in events:\n", "def downlad(event, stations):\n", " starttime = event[\"origins\"][0].time\n", " endtime = starttime + interval\n", "\n", " max_retry = 10\n", " stream = obspy.Stream()\n", " num_sta = 0\n", " for network in stations:\n", " for station in network:\n", " print(f\"********{network.code}.{station.code}********\")\n", " retry = 0\n", " while retry < max_retry:\n", " try:\n", " tmp = client.get_waveforms(\n", " network.code, station.code, \"*\", config[\"channels\"], starttime, endtime\n", " )\n", " for trace in tmp:\n", " if trace.stats.sampling_rate != 100:\n", " # print(trace)\n", " trace = trace.interpolate(100, method=\"linear\")\n", " # trace = trace.detrend(\"spline\", order=2, dspline=5*trace.stats.sampling_rate)\n", " # stream.append(trace)\n", " stream += tmp\n", " num_sta += len(tmp)\n", " break\n", " except Exception as err:\n", " print(\"Error {}.{}: {}\".format(network.code, station.code, err))\n", " message = \"No data available for request.\"\n", " if str(err)[: len(message)] == message:\n", " break\n", " retry += 1\n", " time.sleep(5)\n", " continue\n", " if retry == max_retry:\n", " print(f\"{fname}: MAX {max_retry} retries reached : {network.code}.{station.code}\")\n", "\n", " # stream.attach_response(stations)\n", " # stream = stream.remove_sensitivity()\n", " return stream" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "js21MWgZv3b9", "outputId": "c4727cff-ad03-4dc1-9980-0d29950b6e38" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "********CI.CCC********\n", "********CI.CLC********\n", "********CI.DTP********\n", "********CI.JRC2********\n", "********CI.LRL********\n", "********CI.MPM********\n", "********CI.SLA********\n", "********CI.SRT********\n", "********CI.TOW2********\n", "********CI.WBM********\n", "********CI.WCS2********\n", "********CI.WMF********\n", "********CI.WNM********\n", "********CI.WRC2********\n", "********CI.WRV2********\n", "********CI.WVP2********\n" ] } ], "source": [ "mseed = downlad(events[0], stations)" ] }, { "cell_type": "markdown", "metadata": { "id": "nZ12RlV3UlR9" }, "source": [ "## 5. Convert waveform to numpy" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "z5YUt8FN1Mxe" }, "outputs": [], "source": [ "sampling_rate = 100\n", "n_channel = 3\n", "dtype = \"float32\"\n", "amplitude = True\n", "remove_resp = True\n", "\n", "def convert_mseed(mseed, station_locs):\n", " try:\n", " mseed = mseed.detrend(\"spline\", order=2, dspline=5 * mseed[0].stats.sampling_rate)\n", " except:\n", " logging.error(f\"Error: spline detrend failed at file {fname}\")\n", " mseed = mseed.detrend(\"demean\")\n", " mseed = mseed.merge(fill_value=0)\n", " starttime = min([st.stats.starttime for st in mseed])\n", " endtime = max([st.stats.endtime for st in mseed])\n", " mseed = mseed.trim(starttime, endtime, pad=True, fill_value=0)\n", "\n", " for i in range(len(mseed)):\n", " if mseed[i].stats.sampling_rate != sampling_rate:\n", " logging.warning(\n", " f\"Resampling {mseed[i].id} from {mseed[i].stats.sampling_rate} to {sampling_rate} Hz\"\n", " )\n", " mseed[i] = mseed[i].interpolate(sampling_rate, method=\"linear\")\n", "\n", " order = ['3', '2', '1', 'E', 'N', 'Z']\n", " order = {key: i for i, key in enumerate(order)}\n", " comp2idx = {\"3\": 0, \"2\": 1, \"1\": 2, \"E\": 0, \"N\": 1, \"Z\": 2}\n", "\n", " nsta = len(station_locs)\n", " nt = max(len(mseed[i].data) for i in range(len(mseed)))\n", " data = []\n", " station_id = []\n", " t0 = []\n", " for i in range(nsta):\n", " trace_data = np.zeros([nt, n_channel], dtype=dtype)\n", " empty_station = True\n", " # sta = station_locs.iloc[i][\"station\"]\n", " sta = station_locs.index[i]\n", " comp = station_locs.iloc[i][\"component\"].split(\",\")\n", " if remove_resp:\n", " resp = station_locs.iloc[i][\"response\"].split(\",\")\n", " # resp = station_locs.iloc[i][\"response\"]\n", "\n", " for j, c in enumerate(sorted(comp, key=lambda x: order[x[-1]])):\n", "\n", " resp_j = float(resp[j])\n", " if len(comp) != 3: ## less than 3 component\n", " j = comp2idx[c]\n", "\n", " if len(mseed.select(id=sta + c)) == 0:\n", " print(f\"Empty trace: {sta+c} {starttime}\")\n", " continue\n", " else:\n", " empty_station = False\n", "\n", " tmp = mseed.select(id=sta + c)[0].data.astype(dtype)\n", " trace_data[: len(tmp), j] = tmp[:nt]\n", "\n", " if station_locs.iloc[i][\"unit\"] == \"m/s**2\":\n", " tmp = mseed.select(id=sta + c)[0]\n", " tmp = tmp.integrate()\n", " tmp = tmp.filter(\"highpass\", freq=1.0)\n", " tmp = tmp.data.astype(dtype)\n", " trace_data[: len(tmp), j] = tmp[:nt]\n", " elif station_locs.iloc[i][\"unit\"] == \"m/s\":\n", " tmp = mseed.select(id=sta + c)[0].data.astype(dtype)\n", " trace_data[: len(tmp), j] = tmp[:nt]\n", " else:\n", " print(\n", " f\"Error in {station_locs.iloc[i]['station']}\\n{station_locs.iloc[i]['unit']} should be m/s**2 or m/s!\"\n", " )\n", "\n", " if remove_resp:\n", " trace_data[:, j] /= resp_j\n", "\n", " if not empty_station:\n", " data.append(trace_data)\n", " station_id.append(sta)\n", " t0.append(starttime.strftime(\"%Y-%m-%dT%H:%M:%S.%f\")[:-3])\n", "\n", " data = np.stack(data)\n", "\n", " meta = {\"data\": data, \"t0\": t0, \"station_id\": station_id, \"fname\": station_id}\n", "\n", "\n", " return meta" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "hNaM-pt7VEev" }, "outputs": [], "source": [ "meta = convert_mseed(mseed, station_locs)" ] }, { "cell_type": "markdown", "metadata": { "id": "3dpQquouVKya" }, "source": [ "## 6. Pick P/S picks using PhaseNet" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 408 }, "id": "UDPpI9rl02Kv", "outputId": "acdd4ebc-82c3-4549-ce15-581c82afafc4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PhaseNet picks station_id phase_time phase_score phase_type dt\n", "0 CI.CCC..BH 2019-07-04T17:58:07.368 0.952 P 0.01\n", "1 CI.CCC..BH 2019-07-04T17:58:10.978 0.891 S 0.01\n", "2 CI.CCC..HH 2019-07-04T17:58:07.398 0.952 P 0.01\n", "3 CI.CCC..HH 2019-07-04T17:58:11.008 0.798 S 0.01\n", "4 CI.CLC..BH 2019-07-04T17:58:05.478 0.959 P 0.01\n", ".. ... ... ... ... ...\n", "57 CI.WRC2..HH 2019-07-04T17:58:08.038 0.983 P 0.01\n", "58 CI.WRC2..HH 2019-07-04T17:58:12.048 0.803 S 0.01\n", "59 CI.WRV2..EH 2019-07-04T17:58:10.948 0.959 P 0.01\n", "60 CI.WRV2..EH 2019-07-04T17:58:17.068 0.551 S 0.01\n", "61 CI.WVP2..EH 2019-07-04T17:58:09.578 0.352 P 0.01\n", "\n", "[62 rows x 5 columns]\n" ] } ], "source": [ "# PHASENET_API_URL = \"http://127.0.0.1:8000\"\n", "PHASENET_API_URL = \"https://ai4eps-eqnet.hf.space\"\n", "\n", "\n", "batch = 4\n", "phasenet_picks = []\n", "for j in range(0, len(meta[\"station_id\"]), batch):\n", " req = {\"id\": [[x] for x in meta[\"station_id\"][j:j+batch]],\n", " \"timestamp\": meta[\"t0\"][j:j+batch],\n", " \"vec\": meta[\"data\"][j:j+batch].tolist()}\n", "\n", " resp = requests.post(f'{PHASENET_API_URL}/predict', json=req)\n", " phasenet_picks.extend(resp.json())\n", "\n", "print('PhaseNet picks', pd.DataFrame(phasenet_picks))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "5JX6AppkV1b0" }, "source": [ "## 7. Associate picks using GaMMA" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 228 }, "id": "YEkupkaa3JmD", "outputId": "9b40951c-ed12-4031-ddbc-7ada6c4e09e5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GaMMA catalog:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timemagnitudesigma_timesigma_ampcov_time_ampgamma_scorenum_picksnum_p_picksnum_s_picksevent_indexlongitudelatitudedepth_km
02019-07-04T17:58:02.5669990.3442590056.9702555729281-117.50355935.7053612.578723
\n", "
" ], "text/plain": [ " time magnitude sigma_time sigma_amp cov_time_amp \\\n", "0 2019-07-04T17:58:02.566 999 0.344259 0 0 \n", "\n", " gamma_score num_picks num_p_picks num_s_picks event_index longitude \\\n", "0 56.970255 57 29 28 1 -117.503559 \n", "\n", " latitude depth_km \n", "0 35.70536 12.578723 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "GaMMA association:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
station_idphase_timephase_scorephase_typedtevent_indexgamma_score
0CI.CCC..BH2019-07-04T17:58:07.3680000.952P0.0110.667284
1CI.CCC..BH2019-07-04T17:58:10.9780000.891S0.0110.362202
2CI.CCC..HH2019-07-04T17:58:07.3980000.952P0.0110.631032
3CI.CCC..HH2019-07-04T17:58:11.0080000.798S0.0110.294299
4CI.CLC..BH2019-07-04T17:58:05.4780000.959P0.0110.491822
........................
57CI.WRC2..HH2019-07-04T17:58:08.0380000.983P0.0110.617376
58CI.WRC2..HH2019-07-04T17:58:12.0480000.803S0.0110.859684
59CI.WRV2..EH2019-07-04T17:58:10.9480000.959P0.0110.573461
60CI.WRV2..EH2019-07-04T17:58:17.0680000.551S0.0110.877037
61CI.WVP2..EH2019-07-04T17:58:09.5780000.352P0.0110.676099
\n", "

62 rows × 7 columns

\n", "
" ], "text/plain": [ " station_id phase_time phase_score phase_type dt \\\n", "0 CI.CCC..BH 2019-07-04T17:58:07.368000 0.952 P 0.01 \n", "1 CI.CCC..BH 2019-07-04T17:58:10.978000 0.891 S 0.01 \n", "2 CI.CCC..HH 2019-07-04T17:58:07.398000 0.952 P 0.01 \n", "3 CI.CCC..HH 2019-07-04T17:58:11.008000 0.798 S 0.01 \n", "4 CI.CLC..BH 2019-07-04T17:58:05.478000 0.959 P 0.01 \n", ".. ... ... ... ... ... \n", "57 CI.WRC2..HH 2019-07-04T17:58:08.038000 0.983 P 0.01 \n", "58 CI.WRC2..HH 2019-07-04T17:58:12.048000 0.803 S 0.01 \n", "59 CI.WRV2..EH 2019-07-04T17:58:10.948000 0.959 P 0.01 \n", "60 CI.WRV2..EH 2019-07-04T17:58:17.068000 0.551 S 0.01 \n", "61 CI.WVP2..EH 2019-07-04T17:58:09.578000 0.352 P 0.01 \n", "\n", " event_index gamma_score \n", "0 1 0.667284 \n", "1 1 0.362202 \n", "2 1 0.631032 \n", "3 1 0.294299 \n", "4 1 0.491822 \n", ".. ... ... \n", "57 1 0.617376 \n", "58 1 0.859684 \n", "59 1 0.573461 \n", "60 1 0.877037 \n", "61 1 0.676099 \n", "\n", "[62 rows x 7 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# GAMMA_API_URL = \"http://127.0.0.1:8001\"\n", "GAMMA_API_URL = \"https://ai4eps-gamma.hf.space\"\n", "\n", "stations_json = station_locs.to_dict(orient=\"records\")\n", "\n", "config = {}\n", "config[\"use_amplitude\"] = False\n", "response = requests.post(f'{GAMMA_API_URL}/predict/', json= {\"picks\": {\"data\": phasenet_picks},\n", " \"stations\": {\"data\": stations_json},\n", " \"config\": config})\n", "\n", "if response.status_code == 200:\n", " result = response.json()\n", " events_gamma = result[\"events\"]\n", " picks_gamma = result[\"picks\"]\n", " print(\"GaMMA catalog:\")\n", " display(pd.DataFrame(events_gamma))\n", " print(\"GaMMA association:\")\n", " display(pd.DataFrame(picks_gamma))\n", "else:\n", " print(f\"Request failed with status code: {response.status_code}\")\n", " print(f\"Error message: {response.text}\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "QlsjyoCtLFAr" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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V43N9qzrpZNPcyQOACA0uOg23MTESfeslj54TCpcK53SUbrit77S0hSknC/duVT692+l8hKpyyDpgtudTgUAOMFcxhjjdIhg8Hq98ng8KikpkdvtdjoOAABogIbuvzklBAAArEdhAQAA1qOwAAAA61FYAACA9SgsAADAehQWAABgPQoLAACwHoUFAABYj8ICAACsR2EBAADWo7AAAADrUVgAAID1KCwAAMB6FBYAAGA9CgsAALAehQUAAFiPwgIAAKxHYQEAANajsAAAAOtRWAAAgPUoLAAAwHoUFgAAYD0KCwAAsF6jCsv06dOVkZEht9stt9utzMxMvfvuu/7HR48eLZfLFXDr1atXg9efnZ0tl8ula6+9tjGxAABAhItpzMIpKSmaMmWKOnbsKEmaM2eOhgwZory8PJ111lmSpAEDBmjWrFn+58TFxTVo3d98843uv/9+XXzxxY2JBAAAmoBGFZZBgwYF3J80aZKmT5+uZcuW+QtLfHy82rVr16gQVVVVGjFihCZOnKhPPvlExcXFjXo+AACIbMd8DUtVVZWys7NVVlamzMxM/3hubq6SkpLUqVMn3Xbbbfruu++Ouq7HH39cbdq00ZgxYxr8+hUVFfJ6vQE3AAAQmRp1hEWS8vPzlZmZqfLycrVs2VILFixQ165dJUkDBw7UjTfeqLS0NG3evFkTJkxQ3759tXr1asXHx9e6vv/85z966aWXtGbNmkblmDx5siZOnNjY+AAAIAy5jDGmMU/Yv3+/tmzZouLiYs2fP18zZszQokWL/KXlcIWFhUpLS1N2draGDh1a4/HS0lJlZGTo+eef18CBAyX5LtwtLi7Wm2++WW+OiooKVVRU+O97vV6lpqaqpKREbre7MW8JAAA4xOv1yuPxHHX/3egjLHFxcf6Lbnv06KGVK1fqmWee0Ysvvlhj2eTkZKWlpWnDhg21rmvTpk0qKCgIuDamurraFywmRl999ZXOOOOMWp8bHx9f51EbAAAQWRpdWI5kjAk40nG4Xbt2aevWrUpOTq718c6dOys/Pz9g7JFHHlFpaameeeYZpaamHm88AAAQARpVWMaPH6+BAwcqNTVVpaWlys7OVm5urnJycrRnzx499thjuv7665WcnKyCggKNHz9erVu31nXXXedfx8iRI9WhQwdNnjxZCQkJOvvsswNeo1WrVpJUYxwAADRd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mJiooUOHBownJyerurraf79ly5aaNm2aLrzwQkVFRentt9/WsGHDNGfOHP30pz+V5NtI5s6dq2HDhqm8vFyVlZUaPHiwnnvuOf96mjdvrvT0dMXGxkqSioqKFBcXp5NOOing9du2bauioiL//XHjxuncc8/VSSedpBUrVujhhx/W5s2bNWPGjKDPyfFwej4boqioSElJSTXGk5KSAubcaeEwlxLb5rHO565du/Tb3/5WY8eO9Y+Fy7Yphcd8SmyfjZ3P559/Xr/61a9UVlamzp076/3331dcXJyk8No+6+Tk4Z2j0VEOw6Wnp5u77777mNZ99913m27duvnvf/755yY5Odn8/ve/N2vXrjU5OTmmW7du5pZbbqlzHXPnzjVxcXE1xi+//HIzduzYOp/3xhtvGElm586dx5T9WNk+n4er6zTGpEmTTKdOnWos37FjRzN58uRjyn4sImEua8O2eXQlJSWmZ8+eZsCAAWb//v3+cVu2TWMiYz5rw/ZZv+LiYrN+/XqzaNEiM2jQIHPuueeaffv2GWPs2j6PVdgWlo8//thIMmvWrDmmdf/tb38zCQkJ/vs//elPzQ033BCwzCeffGIkme3bt9e6jg8//NBIMt9//33AeEZGhvnNb35T52tv27atxrnEULB9Pg9X1072pZdeMh6Pp8byHo/HzJw585iyH4tImMvasG3WP59er9dkZmaafv36+XcEB9mybRoTGfNZG7bPo/99P6iiosI0b97cvPrqq8YYu7bPYxW217C89NJLOu+889S9e/djen5eXp6Sk5P99/fu3auoqMDpiI6OliSZOn5u6bzzzlNsbKzef/99/1hhYaE+++wz9e7du97XlhTw+k6zYT4bIjMzUyUlJVqxYoV/bPny5SopKal3zkMpXOayrteW2DZr4/V6dcUVVyguLk5vv/22EhISAh4Ph21TCp/5rOu1JbbPhjLGqKKiQlL4bJ/1crAs1aq0tNTk5eWZvLw8I8lMmzbN5OXlmW+++ca/TElJiWnevLmZPn16ret46KGHTFZWlv/+7Nmzzdy5c80XX3xh1q1bZ6ZOnWpiY2PNtGnT/MvMmjXLxMTEmOeff95s2rTJLF682PTo0cNccMEF/mWWL19u0tPTzbZt2/xjP//5z01KSor54IMPzKeffmr69u1runfvbiorK40xxixZssT/Hr7++mszb9480759ezN48OCgzVl9wm0+CwsLTV5envnrX/9qJJmPP/7Y5OXlmV27dvmXGTBggMnIyDBLly41S5cuNd26dTPXXHNNUOarPpE2l2ybDZ9Pr9drevbsabp162Y2btxoCgsL/beDf9eNcW7bNCby5pPts+HzuWnTJvO73/3OrFq1ynzzzTdmyZIlZsiQIebkk082O3bs8D/Pye0zGKwrLAcPXx95GzVqlH+ZF1980TRr1swUFxfXuo5Ro0aZSy+91H9/9uzZpkuXLqZ58+YmMTHRnHfeeeaVV16p8bxnn33WdO3a1TRr1swkJyebESNGBOwADmbbvHmzf2zfvn3m7rvvNieffLJp1qyZueaaa8yWLVv8j69evdr07NnTeDwek5CQYNLT082jjz5qysrKjn2SGiHc5vPRRx+tNe+sWbP8y+zatcuMGDHCJCYmmsTERDNixIgGne44XpE2l2ybDZ/PurIeOedObZv1ZQzX+WT7bPh8fvvtt2bgwIEmKSnJxMbGmpSUFDN8+PAaH1d2cvsMBpcxQT6mDAAAEGRhew0LAABoOigsAADAehQWAABgPQoLAACwHoUFAABYj8ICAACsR2EBAADWo7AAAADrUVgAAID1KCwAAMB6FBYAAGA9CgsAALDe/wencCRbdtkiPgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "events_ = pd.DataFrame(result[\"events\"])\n", "picks_ = pd.DataFrame(result[\"picks\"])\n", "picks_[\"phase_time\"] = pd.to_datetime(picks_[\"phase_time\"])\n", "picks_ = picks_.merge(station_locs[[\"station_id\", \"longitude\", \"latitude\"]], on=\"station_id\")\n", "\n", "plt.figure()\n", "mapping_color = lambda x: f\"C{x}\" if x!= -1 else \"black\"\n", "plt.scatter(picks_[\"phase_time\"], picks_[\"latitude\"], c=picks_[\"event_index\"].apply(mapping_color), s=10)" ] }, { "cell_type": "markdown", "metadata": { "id": "Cz-fBlTmwkl2" }, "source": [ "## Compare with official catalog" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "q-EW2OPo51qr" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Origin\n", "\t resource_id: ResourceIdentifier(id=\"smi:service.iris.edu/fdsnws/event/1/query?originid=39384936\")\n", "\t time: UTCDateTime(2019, 7, 4, 17, 58, 2, 620000)\n", "\t longitude: -117.516998\n", "\t latitude: 35.700832\n", "\t depth: 2770.0\n", "\t creation_info: CreationInfo(author='ci,us')\n", "Magnitude\n", "\t resource_id: ResourceIdentifier(id=\"smi:service.iris.edu/fdsnws/event/1/query?magnitudeid=195120172\")\n", "\t mag: 3.29\n", "\t magnitude_type: 'Ml'\n", "\t creation_info: CreationInfo(author='CI')\n" ] } ], "source": [ "event = events[0]\n", "print(event.origins[0])\n", "print(event.magnitudes[0])" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 0 }