diff --git a/eqcorrscan/doc/tutorials/matched-filter.ipynb b/eqcorrscan/doc/tutorials/matched-filter.ipynb index 1c2c75c50..2d34e9186 100644 --- a/eqcorrscan/doc/tutorials/matched-filter.ipynb +++ b/eqcorrscan/doc/tutorials/matched-filter.ipynb @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "outputs": [], "source": [ "import logging\n", @@ -57,8 +57,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-16T19:37:33.502304213Z", - "start_time": "2023-11-16T19:37:33.497694833Z" + "end_time": "2023-11-19T21:53:37.791390721Z", + "start_time": "2023-11-19T21:53:37.790149238Z" } }, "id": "afb90fba397b3674" @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "outputs": [], "source": [ "def get_geonet_data(starttime, endtime, stations, outdir):\n", @@ -130,68 +130,68 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-16T20:20:46.452578574Z", - "start_time": "2023-11-16T20:20:46.446307039Z" + "end_time": "2023-11-19T21:53:38.244691249Z", + "start_time": "2023-11-19T21:53:38.237395496Z" } }, "id": "a5e81f234705ab54" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-11-17 09:20:50,237\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.076.EDRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:50,237\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.076.EDRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:50,238\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.076.EDRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:50,583\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.076.LIRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:50,584\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.076.LIRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:50,585\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.076.LIRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:50,932\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.076.MARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:50,932\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.076.MARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:50,933\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.076.MARZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:51,282\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.076.MKRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:51,283\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.076.MKRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:51,283\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.076.MKRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:51,632\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.076.OMRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:51,633\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.076.OMRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:51,633\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.076.OMRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:51,736\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.076.OPRZ.10-HHZ.NZ.D: exists\n", - "2023-11-17 09:20:51,736\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.076.OPRZ.10-HHN.NZ.D: exists\n", - "2023-11-17 09:20:51,737\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.076.OPRZ.10-HHE.NZ.D: exists\n", - "2023-11-17 09:20:52,363\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.076.TARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:52,363\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.076.TARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:52,364\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.076.TARZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:53,725\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.076.KARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:53,725\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.076.KARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:53,726\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.076.KARZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:54,081\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.077.EDRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:54,082\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.077.EDRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:54,082\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/EDRZ.NZ/2023.077.EDRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:54,429\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.077.LIRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:54,430\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.077.LIRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:54,430\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/LIRZ.NZ/2023.077.LIRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:54,775\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.077.MARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:54,775\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.077.MARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:54,776\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MARZ.NZ/2023.077.MARZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:55,276\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.077.MKRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:55,276\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.077.MKRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:55,277\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/MKRZ.NZ/2023.077.MKRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:55,628\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.077.OMRZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:55,629\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.077.OMRZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:55,629\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OMRZ.NZ/2023.077.OMRZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:55,731\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.077.OPRZ.10-HHZ.NZ.D: exists\n", - "2023-11-17 09:20:55,732\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.077.OPRZ.10-HHN.NZ.D: exists\n", - "2023-11-17 09:20:55,732\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/OPRZ.NZ/2023.077.OPRZ.10-HHE.NZ.D: exists\n", - "2023-11-17 09:20:56,337\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.077.TARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:56,337\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.077.TARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:56,338\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/TARZ.NZ/2023.077.TARZ.10-EHE.NZ.D: exists\n", - "2023-11-17 09:20:57,683\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.077.KARZ.10-EHZ.NZ.D: exists\n", - "2023-11-17 09:20:57,684\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.077.KARZ.10-EHN.NZ.D: exists\n", - "2023-11-17 09:20:57,684\tTutorialLogger\tINFO\tSkipping tutorial_waveforms/KARZ.NZ/2023.077.KARZ.10-EHE.NZ.D: exists\n" + "2023-11-20 10:53:41,272\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/EDRZ.NZ/2023.076.EDRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:41,609\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/EDRZ.NZ/2023.076.EDRZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:41,984\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/EDRZ.NZ/2023.076.EDRZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:43,140\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/LIRZ.NZ/2023.076.LIRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:43,570\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/LIRZ.NZ/2023.076.LIRZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:44,111\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/LIRZ.NZ/2023.076.LIRZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:45,003\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MARZ.NZ/2023.076.MARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:45,484\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MARZ.NZ/2023.076.MARZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:45,984\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MARZ.NZ/2023.076.MARZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:47,287\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MKRZ.NZ/2023.076.MKRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:47,919\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MKRZ.NZ/2023.076.MKRZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:48,563\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/MKRZ.NZ/2023.076.MKRZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:49,369\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OMRZ.NZ/2023.076.OMRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:49,868\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OMRZ.NZ/2023.076.OMRZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:50,358\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OMRZ.NZ/2023.076.OMRZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:50,970\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OPRZ.NZ/2023.076.OPRZ.10-HHZ.NZ.D\n", + "2023-11-20 10:53:51,446\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OPRZ.NZ/2023.076.OPRZ.10-HHN.NZ.D\n", + "2023-11-20 10:53:51,946\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/OPRZ.NZ/2023.076.OPRZ.10-HHE.NZ.D\n", + "2023-11-20 10:53:53,000\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/TARZ.NZ/2023.076.TARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:53,501\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/TARZ.NZ/2023.076.TARZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:53,982\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/TARZ.NZ/2023.076.TARZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:55,900\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/KARZ.NZ/2023.076.KARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:56,413\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/KARZ.NZ/2023.076.KARZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:56,987\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.076/KARZ.NZ/2023.076.KARZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:58,276\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/EDRZ.NZ/2023.077.EDRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:53:58,604\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/EDRZ.NZ/2023.077.EDRZ.10-EHN.NZ.D\n", + "2023-11-20 10:53:58,909\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/EDRZ.NZ/2023.077.EDRZ.10-EHE.NZ.D\n", + "2023-11-20 10:53:59,648\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/LIRZ.NZ/2023.077.LIRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:00,069\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/LIRZ.NZ/2023.077.LIRZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:00,426\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/LIRZ.NZ/2023.077.LIRZ.10-EHE.NZ.D\n", + "2023-11-20 10:54:01,145\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MARZ.NZ/2023.077.MARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:01,628\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MARZ.NZ/2023.077.MARZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:02,001\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MARZ.NZ/2023.077.MARZ.10-EHE.NZ.D\n", + "2023-11-20 10:54:02,748\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MKRZ.NZ/2023.077.MKRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:03,084\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MKRZ.NZ/2023.077.MKRZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:03,459\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/MKRZ.NZ/2023.077.MKRZ.10-EHE.NZ.D\n", + "2023-11-20 10:54:04,277\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OMRZ.NZ/2023.077.OMRZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:04,626\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OMRZ.NZ/2023.077.OMRZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:04,964\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OMRZ.NZ/2023.077.OMRZ.10-EHE.NZ.D\n", + "2023-11-20 10:54:05,489\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OPRZ.NZ/2023.077.OPRZ.10-HHZ.NZ.D\n", + "2023-11-20 10:54:05,972\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OPRZ.NZ/2023.077.OPRZ.10-HHN.NZ.D\n", + "2023-11-20 10:54:06,323\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/OPRZ.NZ/2023.077.OPRZ.10-HHE.NZ.D\n", + "2023-11-20 10:54:07,729\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/TARZ.NZ/2023.077.TARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:08,075\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/TARZ.NZ/2023.077.TARZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:08,401\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/TARZ.NZ/2023.077.TARZ.10-EHE.NZ.D\n", + "2023-11-20 10:54:14,979\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/KARZ.NZ/2023.077.KARZ.10-EHZ.NZ.D\n", + "2023-11-20 10:54:17,242\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/KARZ.NZ/2023.077.KARZ.10-EHN.NZ.D\n", + "2023-11-20 10:54:19,087\tTutorialLogger\tINFO\tDownloaded waveforms/miniseed/2023/2023.077/KARZ.NZ/2023.077.KARZ.10-EHE.NZ.D\n" ] } ], @@ -210,8 +210,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-16T20:20:57.788624670Z", - "start_time": "2023-11-16T20:20:49.781096181Z" + "end_time": "2023-11-19T21:54:19.192256002Z", + "start_time": "2023-11-19T21:53:39.140490089Z" } }, "id": "a4182117cbf6692c" @@ -241,14 +241,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-11-17 09:37:45,637\tnumexpr.utils\tINFO\tNote: NumExpr detected 12 cores but \"NUMEXPR_MAX_THREADS\" not set, so enforcing safe limit of 8.\n", - "2023-11-17 09:37:45,638\tnumexpr.utils\tINFO\tNumExpr defaulting to 8 threads.\n" + "2023-11-20 12:29:56,320\tnumexpr.utils\tINFO\tNote: NumExpr detected 16 cores but \"NUMEXPR_MAX_THREADS\" not set, so enforcing safe limit of 8.\n", + "2023-11-20 12:29:56,321\tnumexpr.utils\tINFO\tNumExpr defaulting to 8 threads.\n" ] }, { @@ -256,7 +256,7 @@ "text/plain": " network station location channel starttime \\\n0 NZ EDRZ 10 EHE 2023-03-17 00:00:03.528394 \n1 NZ EDRZ 10 EHN 2023-03-17 00:00:05.458394 \n2 NZ EDRZ 10 EHZ 2023-03-17 00:00:03.528394 \n3 NZ KARZ 10 EHE 2023-03-17 00:00:02.963130 \n4 NZ KARZ 10 EHN 2023-03-17 00:00:00.093130 \n5 NZ KARZ 10 EHZ 2023-03-17 00:00:05.823130 \n6 NZ LIRZ 10 EHE 2023-03-17 00:00:01.753132 \n7 NZ LIRZ 10 EHN 2023-03-17 00:00:02.913132 \n8 NZ LIRZ 10 EHZ 2023-03-17 00:00:01.463132 \n9 NZ MARZ 10 EHE 2023-03-17 00:00:01.553130 \n10 NZ MARZ 10 EHN 2023-03-17 00:00:01.683130 \n11 NZ MARZ 10 EHZ 2023-03-17 00:00:00.963130 \n12 NZ MKRZ 10 EHE 2023-03-17 00:00:01.673129 \n13 NZ MKRZ 10 EHN 2023-03-17 00:00:00.143129 \n14 NZ MKRZ 10 EHZ 2023-03-17 00:00:00.053129 \n15 NZ OMRZ 10 EHE 2023-03-17 00:00:02.740000 \n16 NZ OMRZ 10 EHN 2023-03-17 00:00:00.580000 \n17 NZ OMRZ 10 EHZ 2023-03-17 00:00:04.110000 \n18 NZ OPRZ 10 HHE 2023-03-17 00:00:02.993132 \n19 NZ OPRZ 10 HHN 2023-03-17 00:00:03.473132 \n20 NZ OPRZ 10 HHZ 2023-03-17 00:00:01.963132 \n21 NZ TARZ 10 EHE 2023-03-17 00:00:01.850000 \n22 NZ TARZ 10 EHN 2023-03-17 00:00:00.760000 \n23 NZ TARZ 10 EHZ 2023-03-17 00:00:00.630000 \n\n endtime \n0 2023-03-19 00:00:00.098393 \n1 2023-03-19 00:00:04.518393 \n2 2023-03-19 00:00:03.588393 \n3 2023-03-19 00:00:01.273126 \n4 2023-03-19 00:00:00.303126 \n5 2023-03-19 00:00:03.653126 \n6 2023-03-19 00:00:03.523130 \n7 2023-03-19 00:00:04.253130 \n8 2023-03-19 00:00:00.313130 \n9 2023-03-19 00:00:01.593131 \n10 2023-03-19 00:00:04.163131 \n11 2023-03-19 00:00:05.063131 \n12 2023-03-19 00:00:01.763133 \n13 2023-03-19 00:00:02.463133 \n14 2023-03-19 00:00:02.363133 \n15 2023-03-19 00:00:02.470000 \n16 2023-03-19 00:00:00.550000 \n17 2023-03-19 00:00:03.820000 \n18 2023-03-19 00:00:01.243131 \n19 2023-03-19 00:00:04.443131 \n20 2023-03-19 00:00:00.143131 \n21 2023-03-19 00:00:01.580000 \n22 2023-03-19 00:00:00.820000 \n23 2023-03-19 00:00:03.830000 ", "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 \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
networkstationlocationchannelstarttimeendtime
0NZEDRZ10EHE2023-03-17 00:00:03.5283942023-03-19 00:00:00.098393
1NZEDRZ10EHN2023-03-17 00:00:05.4583942023-03-19 00:00:04.518393
2NZEDRZ10EHZ2023-03-17 00:00:03.5283942023-03-19 00:00:03.588393
3NZKARZ10EHE2023-03-17 00:00:02.9631302023-03-19 00:00:01.273126
4NZKARZ10EHN2023-03-17 00:00:00.0931302023-03-19 00:00:00.303126
5NZKARZ10EHZ2023-03-17 00:00:05.8231302023-03-19 00:00:03.653126
6NZLIRZ10EHE2023-03-17 00:00:01.7531322023-03-19 00:00:03.523130
7NZLIRZ10EHN2023-03-17 00:00:02.9131322023-03-19 00:00:04.253130
8NZLIRZ10EHZ2023-03-17 00:00:01.4631322023-03-19 00:00:00.313130
9NZMARZ10EHE2023-03-17 00:00:01.5531302023-03-19 00:00:01.593131
10NZMARZ10EHN2023-03-17 00:00:01.6831302023-03-19 00:00:04.163131
11NZMARZ10EHZ2023-03-17 00:00:00.9631302023-03-19 00:00:05.063131
12NZMKRZ10EHE2023-03-17 00:00:01.6731292023-03-19 00:00:01.763133
13NZMKRZ10EHN2023-03-17 00:00:00.1431292023-03-19 00:00:02.463133
14NZMKRZ10EHZ2023-03-17 00:00:00.0531292023-03-19 00:00:02.363133
15NZOMRZ10EHE2023-03-17 00:00:02.7400002023-03-19 00:00:02.470000
16NZOMRZ10EHN2023-03-17 00:00:00.5800002023-03-19 00:00:00.550000
17NZOMRZ10EHZ2023-03-17 00:00:04.1100002023-03-19 00:00:03.820000
18NZOPRZ10HHE2023-03-17 00:00:02.9931322023-03-19 00:00:01.243131
19NZOPRZ10HHN2023-03-17 00:00:03.4731322023-03-19 00:00:04.443131
20NZOPRZ10HHZ2023-03-17 00:00:01.9631322023-03-19 00:00:00.143131
21NZTARZ10EHE2023-03-17 00:00:01.8500002023-03-19 00:00:01.580000
22NZTARZ10EHN2023-03-17 00:00:00.7600002023-03-19 00:00:00.820000
23NZTARZ10EHZ2023-03-17 00:00:00.6300002023-03-19 00:00:03.830000
\n
" }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -271,8 +271,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-16T20:37:47.176447856Z", - "start_time": "2023-11-16T20:37:45.510288831Z" + "end_time": "2023-11-19T23:29:57.096270651Z", + "start_time": "2023-11-19T23:29:56.265268109Z" } }, "id": "422d39dd855950a6" @@ -298,7 +298,7 @@ "You can then skip ahead to read those picks back in.\n", "\n", "In the worst case scenario you have times that you know that you want your\n", - "template to start at, but they are not in any standard format readble by obspy,\n", + "template to start at, but they are not in any standard format readable by obspy,\n", "you can construct events from scratch as below. Note in this example I am just\n", "populating the picks as this is all we need. You do need to be careful about\n", "the `waveform_id`: this should match the seed id of the continuous data\n", @@ -311,31 +311,173 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "outputs": [], "source": [ "from obspy.core.event import (\n", " Catalog, Event, Pick, WaveformStreamID)\n", "from obspy import UTCDateTime\n", " \n", - "event = Event(\n", - " picks=[\n", - " Pick(time=UTCDateTime(2016, 9, 26, 8, 52, 45, 180000), phase_hint=\"P\",\n", - " waveform_id=WaveformStreamID(\n", - " network_code=\"YG\", station_code=\"RH08\", channel_code=\"BHZ\")),\n", - " Pick(time=UTCDateTime(2016, 9, 26, 8, 52, 45, 809000), phase_hint=\"P\",\n", - " waveform_id=WaveformStreamID(\n", - " network_code=\"YG\", station_code=\"NEB1\", channel_code=\"BHZ\")),\n", - " Pick(time=UTCDateTime(2016, 9, 26, 8, 52, 45, 661000), phase_hint=\"P\",\n", - " waveform_id=WaveformStreamID(\n", - " network_code=\"YG\", station_code=\"NEB3\", channel_code=\"BHZ\"))])\n", + "# Make the picks for the event:\n", + "picks = [\n", + " Pick(\n", + " time=UTCDateTime(2023, 3, 18, 7, 46, 15, 593125),\n", + "\t waveform_id=WaveformStreamID(\n", + " network_code='NZ', station_code='MARZ', \n", + " channel_code='EHZ', location_code='10'),\n", + " phase_hint='P'),\n", + " Pick(\n", + " time=UTCDateTime(2023, 3, 18, 7, 46, 17, 633115),\n", + "\t waveform_id=WaveformStreamID(\n", + " network_code='NZ', station_code='MKRZ', \n", + " channel_code='EHZ', location_code='10'),\n", + " phase_hint='P'),\n", + " Pick(\n", + " time=UTCDateTime(2023, 3, 18, 7, 46, 18, 110000),\n", + "\t waveform_id=WaveformStreamID(\n", + " network_code='NZ', station_code='OMRZ', \n", + " channel_code='EHZ', location_code='10'),\n", + " phase_hint='P'),\n", + "] \n", + "# Add as many picks as you have - you might want to loop \n", + "# and/or make a function to pasre your picks to obspy Picks.\n", "\n", + "# Make the event\n", + "event = Event(picks=picks)\n", + "# Make the catalog\n", "catalog = Catalog([event])" ], "metadata": { - "collapsed": false + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-11-19T23:48:41.000550086Z", + "start_time": "2023-11-19T23:48:40.941895116Z" + } }, "id": "cf480f12b889f227" + }, + { + "cell_type": "markdown", + "source": [ + "For this example we are going to use a catalogue of events picked by GeoNet - we will download those data and write them to disk to mimic you using local files:" + ], + "metadata": { + "collapsed": false + }, + "id": "d482d389c5260ca6" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "from obspy.clients.fdsn import Client\n", + "\n", + "client = Client(\"GEONET\")\n", + "\n", + "cat = client.get_events(\n", + " starttime=UTCDateTime(2023, 3, 17),\n", + " endtime=UTCDateTime(2023, 3, 19),\n", + " latitude=-38.05, longitude=176.73, \n", + " maxradius=0.5, minmagnitude=3.0) # Limited set of relevent events\n", + "\n", + "cat.write(\"tutorial_catalog.xml\", format=\"QUAKEML\")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-11-19T23:58:52.473788615Z", + "start_time": "2023-11-19T23:58:43.120412286Z" + } + }, + "id": "70ec5a6c46c54884" + }, + { + "cell_type": "markdown", + "source": [ + "## Template creation with local files\n", + "\n", + "Now that we have the events and waveforms we need, we can make our Tribe of templates.\n", + "\n", + "First we have to read in the events that we want to use as templates:" + ], + "metadata": { + "collapsed": false + }, + "id": "2d8590e8fd52ed0c" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "49 Event(s) in Catalog:\n", + "2023-03-17T14:29:34.921582Z | -38.067, +176.689 | 3.40 MLv | manual\n", + "2023-03-17T14:56:17.215087Z | -38.061, +176.679 | 3.07 MLv | manual\n", + "...\n", + "2023-03-18T20:20:52.842474Z | -38.045, +176.734 | 3.17 MLv | manual\n", + "2023-03-18T21:42:39.943071Z | -38.051, +176.735 | 4.25 MLv | manual\n", + "To see all events call 'print(CatalogObject.__str__(print_all=True))'\n" + ] + } + ], + "source": [ + "from obspy import read_events\n", + "\n", + "cat = read_events(\"tutorial_catalog.xml\")\n", + "print(cat)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-11-20T00:00:33.633775674Z", + "start_time": "2023-11-20T00:00:25.227851850Z" + } + }, + "id": "bfce77794a5d15f8" + }, + { + "cell_type": "markdown", + "source": [ + "### Pick curation\n", + "\n", + "You may want to limit what picks you actually use for your templates. Any picks that you provide will\n", + "be used for cutting waveforms - this may include amplitude picks! You should not need to restrict\n", + "what stations you have picks for, but it doesn't do any harm to.\n", + "\n", + "Below we select picks from the stations that we set earlier, and only P and S picks. We also limit\n", + "to only one P and one S pick per station - you may not want to do that, but it can get messy if you\n", + "have multiple picks of the same phase." + ], + "metadata": { + "collapsed": false + }, + "id": "d119b8c9c37581f5" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "from eqcorrscan.utils.catalog_utils import filter_picks\n", + "\n", + "cat = filter_picks(\n", + " cat, \n", + " stations=stations, \n", + " phase_hints=[\"P\", \"S\"], \n", + " enforce_single_pick=\"earliest\") " + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-11-20T02:00:24.542726732Z", + "start_time": "2023-11-20T02:00:22.963356063Z" + } + }, + "id": "7d9ac720ccf4aa2f" } ], "metadata": { diff --git a/eqcorrscan/tests/catalog_utils_test.py b/eqcorrscan/tests/catalog_utils_test.py index ee204b6d2..0493e281c 100644 --- a/eqcorrscan/tests/catalog_utils_test.py +++ b/eqcorrscan/tests/catalog_utils_test.py @@ -13,31 +13,35 @@ @pytest.mark.network class CatalogUtilsTests(unittest.TestCase): @pytest.mark.flaky(reruns=2) # Rerun the test in case of network timeout - def test_filter_picks(self): - """ Test various methods of filtering picks in a catalog.""" + def setUpClass(cls): client = Client(str("NCEDC")) t1 = UTCDateTime(2004, 9, 28) t2 = t1 + 86400 - catalog = client.get_events(starttime=t1, endtime=t2, minmagnitude=3, - minlatitude=35.7, maxlatitude=36.1, - minlongitude=-120.6, maxlongitude=-120.2, - includearrivals=True) + cls.catalog = client.get_events( + starttime=t1, endtime=t2, minmagnitude=3, + minlatitude=35.7, maxlatitude=36.1, + minlongitude=-120.6, maxlongitude=-120.2, + includearrivals=True) + + def test_filter_picks(self): + """ Test various methods of filtering picks in a catalog.""" + stations = ['BMS', 'BAP', 'PAG', 'PAN', 'PBI', 'PKY', 'YEG', 'WOF'] channels = ['SHZ', 'SHN', 'SHE', 'SH1', 'SH2'] networks = ['NC'] locations = [''] top_n_picks = 5 - filtered_catalog = filter_picks(catalog=catalog, stations=stations, - channels=channels, networks=networks, - locations=locations, - top_n_picks=top_n_picks) + filtered_catalog = filter_picks( + catalog=self.catalog.copy(), stations=stations, + channels=channels, networks=networks, + locations=locations, top_n_picks=top_n_picks) for event in filtered_catalog: for pick in event.picks: self.assertTrue(pick.waveform_id.station_code in stations) self.assertTrue(pick.waveform_id.channel_code in channels) self.assertTrue(pick.waveform_id.network_code in networks) self.assertTrue(pick.waveform_id.location_code in locations) - filtered_catalog = filter_picks(catalog=catalog, + filtered_catalog = filter_picks(catalog=self.catalog.copy(), top_n_picks=top_n_picks) filtered_stations = [] for event in filtered_catalog: @@ -45,6 +49,29 @@ def test_filter_picks(self): filtered_stations.append(pick.waveform_id.station_code) self.assertEqual(len(list(set(filtered_stations))), top_n_picks) + def test_filter_phase_hints(self): + filtered_catalog = filter_picks( + self.catalog.copy(), phase_hints=["P"]) + + phase_hints = set(p.phase_hint for ev in filtered_catalog + for p in ev.picks) + self.assertEqual(phase_hints == {"P"}) + + def test_filter_single_pick(self): + filtered_catalog = filter_picks( + self.catalog.copy(), enforce_single_pick="earliest") + + for ev in filtered_catalog: + stations = {p.waveform_id.station_code for p in ev.picks} + for station in stations: + picks = [p for p in ev.picks if p.waveform_id.station_code == station] + phase_hints = {p.phase_hint for p in ev.picks} + for phase_hint in phase_hints: + self.assertEqual( + 1, len([p for p in picks + if p.phase_hint == phase_hint])) + return + if __name__ == '__main__': unittest.main() diff --git a/eqcorrscan/utils/catalog_utils.py b/eqcorrscan/utils/catalog_utils.py index 00cda0e6e..f6064268d 100644 --- a/eqcorrscan/utils/catalog_utils.py +++ b/eqcorrscan/utils/catalog_utils.py @@ -24,7 +24,8 @@ def filter_picks(catalog, stations=None, channels=None, networks=None, - locations=None, top_n_picks=None, evaluation_mode='all'): + locations=None, top_n_picks=None, evaluation_mode='all', + phase_hints=None, enforce_single_pick=False): """ Filter events in the catalog based on a number of parameters. @@ -43,6 +44,12 @@ def filter_picks(catalog, stations=None, channels=None, networks=None, :param evaluation_mode: To select only manual or automatic picks, or use all (default). :type evaluation_mode: str + :param phase_hints: List of retained phase hints, or None to use all + :type phase_hints: list + :param enforce_single_pick: + Method to enforce using only one pick of each phase-hint per + station or False to leave all. Can be {False, "earliest"} + :type enforce_single_pick: str :return: @@ -88,6 +95,8 @@ def filter_picks(catalog, stations=None, channels=None, networks=None, >>> print(sorted(list(set(stations)))) ['BAP', 'BMS', 'PAG', 'PAN', 'PBI', 'PKY', 'WOF', 'YEG'] """ + assert enforce_single_pick in {False, "earliest"}, \ + f"enforce_single_pick={enforce_single_pick} unknown" # Don't work in place on the catalog filtered_catalog = catalog.copy() @@ -115,6 +124,13 @@ def filter_picks(catalog, stations=None, channels=None, networks=None, continue event.picks = [pick for pick in event.picks if pick.waveform_id.location_code in locations] + if phase_hints: + for event in filtered_catalog: + if len(event.picks) == 0: + continue + event.picks = [pick for pick in event.picks + if pick.phase_hint in phase_hints] + if evaluation_mode == 'manual': for event in filtered_catalog: event.picks = [pick for pick in event.picks @@ -159,6 +175,23 @@ def filter_picks(catalog, stations=None, channels=None, networks=None, if len(event.picks) > 0: tmp_catalog.append(event) + # Finally remove extra picks + if enforce_single_pick: + reverse = False + # TODO: Allow other options + for ev in tmp_catalog: + retained_picks = [] + stations = {p.waveform_id.station_code for p in ev.picks} + for station in stations: + phase_hints = {p.phase_hint for p in ev.picks + if p.waveform_id.station_code == station} + for phase_hint in phase_hints: + picks = [p for p in ev.picks + if p.waveform_id.station_code == station + and p.phase_hint == phase_hint] + picks.sort(key=lambda p:p.time, reverse=reverse) + retained_picks.append(picks[0]) + return tmp_catalog