Esempio n. 1
0
def test_match_filter(samp_rate=20.0, debug=0):
    """
    Function to test the capabilities of match_filter and just check that it\
    is working!  Uses synthetic templates and seeded, randomised data.

    :type debug: int
    :param debug: Debug level, higher the number the more output.
    """
    from eqcorrscan.utils import pre_processing
    from eqcorrscan.utils import EQcorrscan_plotting as plotting
    from eqcorrscan.core import match_filter
    from obspy import UTCDateTime
    import string
    # Generate a random dataset
    templates, data, seeds = generate_synth_data(nsta=5, ntemplates=2,
                                                 nseeds=50,
                                                 samp_rate=samp_rate,
                                                 t_length=6.0, max_amp=5.0,
                                                 debug=debug)
    # Notes to the user: If you use more templates you should ensure they are
    # more different, e.g. set the data to have larger moveouts, otherwise
    # similar templates will detect events seeded by another template.
    # Test the pre_processing functions
    for tr in data:
        pre_processing.dayproc(tr=tr, lowcut=2.0, highcut=8.0, filt_order=3,
                               samp_rate=20.0, debug=0,
                               starttime=UTCDateTime(0))
    if debug > 0:
        data.plot()
    # Filter the data and the templates
    for template in templates:
        pre_processing.shortproc(st=template, lowcut=2.0, highcut=8.0,
                                 filt_order=3, samp_rate=20.0)
        if debug > 0:
            template.plot()
    template_names = list(string.ascii_lowercase)[0:len(templates)]
    detections = match_filter.match_filter(template_names=template_names,
                                           template_list=templates,
                                           st=data, threshold=8.0,
                                           threshold_type='MAD',
                                           trig_int=6.0,
                                           plotvar=False,
                                           plotdir='.',
                                           cores=1)
    # Compare the detections to the seeds
    print('This test made ' + str(len(detections)) + ' detections')
    ktrue = 0
    kfalse = 0
    for detection in detections:
        print(detection.template_name)
        i = template_names.index(detection.template_name)
        t_seeds = seeds[i]
        dtime_samples = int((detection.detect_time - UTCDateTime(0)) *
                            samp_rate)
        if dtime_samples in t_seeds['time']:
            j = list(t_seeds['time']).index(dtime_samples)
            print('Detection at SNR of: ' + str(t_seeds['SNR'][j]))
            ktrue += 1
        else:
            min_diff = min(abs(t_seeds['time'] - dtime_samples))
            if min_diff < 10:
                # If there is a match within ten samples then its good enough
                j = list(abs(t_seeds['time'] - dtime_samples)).index(min_diff)
                print('Detection at SNR of: ' + str(t_seeds['SNR'][j]))
                ktrue += 1
            else:
                print('Detection at sample: ' + str(dtime_samples) +
                      ' does not match anything in seed times:')
                kfalse += 1
            print('Minimum difference in samples is: ' + str(min_diff))
    # Plot the detections
    if debug > 3:
        for i, template in enumerate(templates):
            times = [d.detect_time.datetime for d in detections
                     if d.template_name == template_names[i]]
            print(times)
            plotting.detection_multiplot(data, template, times)
    # Set an 'acceptable' ratio of positive to false detections
    print(str(ktrue) + ' true detections and ' + str(kfalse) +
          ' false detections')
    if kfalse / ktrue < 0.25:
        return True
    else:
        return False
Esempio n. 2
0
def test_match_filter(samp_rate=20.0, debug=0):
    """
    Function to test the capabilities of match_filter and just check that it\
    is working!  Uses synthetic templates and seeded, randomised data.

    :type debug: int
    :param debug: Debug level, higher the number the more output.
    """
    from eqcorrscan.utils import pre_processing
    from eqcorrscan.utils import EQcorrscan_plotting as plotting
    from eqcorrscan.core import match_filter
    from obspy import UTCDateTime
    import string
    # Generate a random dataset
    templates, data, seeds = generate_synth_data(nsta=5,
                                                 ntemplates=2,
                                                 nseeds=50,
                                                 samp_rate=samp_rate,
                                                 t_length=6.0,
                                                 max_amp=5.0,
                                                 debug=debug)
    # Notes to the user: If you use more templates you should ensure they are
    # more different, e.g. set the data to have larger moveouts, otherwise
    # similar templates will detect events seeded by another template.
    # Test the pre_processing functions
    for tr in data:
        pre_processing.dayproc(tr=tr,
                               lowcut=2.0,
                               highcut=8.0,
                               filt_order=3,
                               samp_rate=20.0,
                               debug=0,
                               starttime=UTCDateTime(0))
    if debug > 0:
        data.plot()
    # Filter the data and the templates
    for template in templates:
        pre_processing.shortproc(st=template,
                                 lowcut=2.0,
                                 highcut=8.0,
                                 filt_order=3,
                                 samp_rate=20.0)
        if debug > 0:
            template.plot()
    template_names = list(string.ascii_lowercase)[0:len(templates)]
    detections = match_filter.match_filter(template_names=template_names,
                                           template_list=templates,
                                           st=data,
                                           threshold=8.0,
                                           threshold_type='MAD',
                                           trig_int=6.0,
                                           plotvar=False,
                                           plotdir='.',
                                           cores=1)
    # Compare the detections to the seeds
    print('This test made ' + str(len(detections)) + ' detections')
    ktrue = 0
    kfalse = 0
    for detection in detections:
        print(detection.template_name)
        i = template_names.index(detection.template_name)
        t_seeds = seeds[i]
        dtime_samples = int(
            (detection.detect_time - UTCDateTime(0)) * samp_rate)
        if dtime_samples in t_seeds['time']:
            j = list(t_seeds['time']).index(dtime_samples)
            print('Detection at SNR of: ' + str(t_seeds['SNR'][j]))
            ktrue += 1
        else:
            min_diff = min(abs(t_seeds['time'] - dtime_samples))
            if min_diff < 10:
                # If there is a match within ten samples then its good enough
                j = list(abs(t_seeds['time'] - dtime_samples)).index(min_diff)
                print('Detection at SNR of: ' + str(t_seeds['SNR'][j]))
                ktrue += 1
            else:
                print('Detection at sample: ' + str(dtime_samples) +
                      ' does not match anything in seed times:')
                kfalse += 1
            print 'Minimum difference in samples is: ' + str(min_diff)
    # Plot the detections
    if debug > 3:
        for i, template in enumerate(templates):
            times = [
                d.detect_time.datetime for d in detections
                if d.template_name == template_names[i]
            ]
            print(times)
            plotting.detection_multiplot(data, template, times)
    # Set an 'acceptable' ratio of positive to false detections
    print(
        str(ktrue) + ' true detections and ' + str(kfalse) +
        ' false detections')
    if kfalse / ktrue < 0.25:
        return True
    else:
        return False
Esempio n. 3
0
    # Now lets try and work out how many unique events we have just to compare
    # with the GeoNet catalog of 20 events on this day in this sequence
    for master in detections:
        keep = True
        for slave in detections:
            if not master == slave and\
               abs(master.detect_time - slave.detect_time) <= 6.0:
                # If the events are within 6s of each other then test which
                # was the 'best' match, strongest detection
                if not master.detect_val > slave.detect_val:
                    keep = False
                    break
        if keep:
            unique_detections.append(master)

print('We made a total of ' + str(len(unique_detections)) + ' detections')

for detection in unique_detections:
    print('Detection at :' + str(detection.detect_time) + ' for template ' +
          detection.template_name + ' with a cross-correlation sum of: ' +
          str(detection.detect_val))
    # We can plot these too
    stplot = st.copy()
    template = templates[template_names.index(detection.template_name)]
    lags = sorted([tr.stats.starttime for tr in template])
    maxlag = lags[-1] - lags[0]
    stplot.trim(starttime=detection.detect_time - 10,
                endtime=detection.detect_time + maxlag + 10)
    plotting.detection_multiplot(stplot, template,
                                 [detection.detect_time.datetime])
Esempio n. 4
0
    # Now lets try and work out how many unique events we have just to compare
    # with the GeoNet catalog of 20 events on this day in this sequence
    for master in detections:
        keep = True
        for slave in detections:
            if not master == slave and\
               abs(master.detect_time - slave.detect_time) <= 6.0:
                # If the events are within 6s of each other then test which
                # was the 'best' match, strongest detection
                if not master.detect_val > slave.detect_val:
                    keep = False
                    break
        if keep:
            unique_detections.append(master)

print('We made a total of ' + str(len(unique_detections)) + ' detections')

for detection in unique_detections:
    print('Detection at :' + str(detection.detect_time) + ' for template ' +
          detection.template_name + ' with a cross-correlation sum of: ' +
          str(detection.detect_val))
    # We can plot these too
    stplot = st.copy()
    template = templates[template_names.index(detection.template_name)]
    lags = sorted([tr.stats.starttime for tr in template])
    maxlag = lags[-1] - lags[0]
    stplot.trim(starttime=detection.detect_time - 10,
                endtime=detection.detect_time + maxlag + 10)
    plotting.detection_multiplot(stplot, template,
                                 [detection.detect_time.datetime])