File size: 48,811 Bytes
06d33b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
{
  "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": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>time</th>\n",
              "      <th>magnitude</th>\n",
              "      <th>sigma_time</th>\n",
              "      <th>sigma_amp</th>\n",
              "      <th>cov_time_amp</th>\n",
              "      <th>gamma_score</th>\n",
              "      <th>num_picks</th>\n",
              "      <th>num_p_picks</th>\n",
              "      <th>num_s_picks</th>\n",
              "      <th>event_index</th>\n",
              "      <th>longitude</th>\n",
              "      <th>latitude</th>\n",
              "      <th>depth_km</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2019-07-04T17:58:02.566</td>\n",
              "      <td>999</td>\n",
              "      <td>0.344259</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>56.970255</td>\n",
              "      <td>57</td>\n",
              "      <td>29</td>\n",
              "      <td>28</td>\n",
              "      <td>1</td>\n",
              "      <td>-117.503559</td>\n",
              "      <td>35.70536</td>\n",
              "      <td>12.578723</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "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": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>station_id</th>\n",
              "      <th>phase_time</th>\n",
              "      <th>phase_score</th>\n",
              "      <th>phase_type</th>\n",
              "      <th>dt</th>\n",
              "      <th>event_index</th>\n",
              "      <th>gamma_score</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>CI.CCC..BH</td>\n",
              "      <td>2019-07-04T17:58:07.368000</td>\n",
              "      <td>0.952</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.667284</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>CI.CCC..BH</td>\n",
              "      <td>2019-07-04T17:58:10.978000</td>\n",
              "      <td>0.891</td>\n",
              "      <td>S</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.362202</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>CI.CCC..HH</td>\n",
              "      <td>2019-07-04T17:58:07.398000</td>\n",
              "      <td>0.952</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.631032</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>CI.CCC..HH</td>\n",
              "      <td>2019-07-04T17:58:11.008000</td>\n",
              "      <td>0.798</td>\n",
              "      <td>S</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.294299</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>CI.CLC..BH</td>\n",
              "      <td>2019-07-04T17:58:05.478000</td>\n",
              "      <td>0.959</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.491822</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>57</th>\n",
              "      <td>CI.WRC2..HH</td>\n",
              "      <td>2019-07-04T17:58:08.038000</td>\n",
              "      <td>0.983</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.617376</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>58</th>\n",
              "      <td>CI.WRC2..HH</td>\n",
              "      <td>2019-07-04T17:58:12.048000</td>\n",
              "      <td>0.803</td>\n",
              "      <td>S</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.859684</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>59</th>\n",
              "      <td>CI.WRV2..EH</td>\n",
              "      <td>2019-07-04T17:58:10.948000</td>\n",
              "      <td>0.959</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.573461</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>60</th>\n",
              "      <td>CI.WRV2..EH</td>\n",
              "      <td>2019-07-04T17:58:17.068000</td>\n",
              "      <td>0.551</td>\n",
              "      <td>S</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.877037</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>61</th>\n",
              "      <td>CI.WVP2..EH</td>\n",
              "      <td>2019-07-04T17:58:09.578000</td>\n",
              "      <td>0.352</td>\n",
              "      <td>P</td>\n",
              "      <td>0.01</td>\n",
              "      <td>1</td>\n",
              "      <td>0.676099</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>62 rows × 7 columns</p>\n",
              "</div>"
            ],
            "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": [
              "<matplotlib.collections.PathCollection at 0x306ca0910>"
            ]
          },
          "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": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "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
}