def _internal_get_ppsd(): """ Returns ready computed ppsd for testing purposes. """ tr, paz = _get_sample_data() st = Stream([tr]) ppsd = PPSD(tr.stats, paz, db_bins=(-200, -50, 0.5)) ppsd.add(st) ppsd.calculate_histogram() return ppsd
def test_PPSD_w_IRIS(self): # Bands to be used this is the upper and lower frequency band pairs fres = zip([0.1, 0.05], [0.2, 0.1]) file_dataANMO = os.path.join(self.path, 'IUANMO.seed') # Read in ANMO data for one day st = read(file_dataANMO) # Use a canned ANMO response which will stay static paz = {'gain': 86298.5, 'zeros': [0, 0], 'poles': [-59.4313, -22.7121 + 27.1065j, -22.7121 + 27.1065j, -0.0048004, -0.073199], 'sensitivity': 3.3554*10**9} # Make an empty PPSD and add the data ppsd = PPSD(st[0].stats, paz) ppsd.add(st) ppsd.calculate_histogram() # Get the 50th percentile from the PPSD (per, perval) = ppsd.get_percentile(percentile=50) # Read in the results obtained from a Mustang flat file file_dataIRIS = os.path.join(self.path, 'IRISpdfExample') freq, power, hits = np.genfromtxt(file_dataIRIS, comments='#', delimiter=',', unpack=True) # For each frequency pair we want to compare the mean of the bands for fre in fres: pervalGoodOBSPY = [] # Get the values for the bands from the PPSD perinv = 1 / per mask = (fre[0] < perinv) & (perinv < fre[1]) pervalGoodOBSPY = perval[mask] # Now we sort out all of the data from the IRIS flat file mask = (fre[0] < freq) & (freq < fre[1]) triples = list(zip(freq[mask], hits[mask], power[mask])) # We now have all of the frequency values of interest # We will get the distinct frequency values freqdistinct = sorted(list(set(freq[mask])), reverse=True) percenlist = [] # We will loop through the frequency values and compute a # 50th percentile for curfreq in freqdistinct: tempvalslist = [] for triple in triples: if np.isclose(curfreq, triple[0], atol=1e-3, rtol=0.0): tempvalslist += [int(triple[2])] * int(triple[1]) percenlist.append(np.percentile(tempvalslist, 50)) # Here is the actual test np.testing.assert_allclose(np.mean(pervalGoodOBSPY), np.mean(percenlist), rtol=0.0, atol=1.0)
def test_ppsd_restricted_stacks(self): """ Test PPSD.calculate_histogram() with restrictions to what data should be stacked. Also includes image tests. """ # set up a bogus PPSD, with fixed random psds but with real start times # of psd pieces, to facilitate testing the stack selection. ppsd = PPSD(stats=Stats(dict(sampling_rate=150)), metadata=None, db_bins=(-200, -50, 20.), period_step_octaves=1.4) ppsd._times_processed = np.load( os.path.join(self.path, "ppsd_times_processed.npy")).tolist() np.random.seed(1234) ppsd._binned_psds = [ arr for arr in np.random.uniform( -200, -50, (len(ppsd._times_processed), len(ppsd.period_bin_centers)))] # Test callback function that selects a fixed random set of the # timestamps. Also checks that we get passed the type we expect, # which is 1D numpy ndarray of float type. def callback(t_array): self.assertIsInstance(t_array, np.ndarray) self.assertEqual(t_array.shape, (len(ppsd._times_processed),)) self.assertEqual(t_array.dtype, np.float64) np.random.seed(1234) res = np.random.randint(0, 2, len(t_array)).astype(np.bool) return res # test several different sets of stack criteria, should cover # everything, even with lots of combined criteria stack_criteria_list = [ dict(starttime=UTCDateTime(2015, 3, 8), month=[2, 3, 5, 7, 8]), dict(endtime=UTCDateTime(2015, 6, 7), year=[2015], time_of_weekday=[(1, 0, 24), (2, 0, 24), (-1, 0, 11)]), dict(year=[2013, 2014, 2016, 2017], month=[2, 3, 4]), dict(month=[1, 2, 5, 6, 8], year=2015), dict(isoweek=[4, 5, 6, 13, 22, 23, 24, 44, 45]), dict(time_of_weekday=[(5, 22, 24), (6, 0, 2), (6, 22, 24)]), dict(callback=callback, month=[1, 3, 5, 7]), dict(callback=callback)] expected_selections = np.load( os.path.join(self.path, "ppsd_stack_selections.npy")) # test every set of criteria for stack_criteria, expected_selection in zip( stack_criteria_list, expected_selections): selection_got = ppsd._stack_selection(**stack_criteria) np.testing.assert_array_equal(selection_got, expected_selection) # test one particular selection as an image test plot_kwargs = dict(max_percentage=15, xaxis_frequency=True, period_lim=(0.01, 50)) ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=1.5) as ic: fig = ppsd.plot(show=False, **plot_kwargs) # some matplotlib/Python version combinations lack the left-most # tick/label "Jan 2015". Try to circumvent and get the (otherwise # OK) test by changing the left x limit a bit further out (by two # days, axis is in mpl days). See e.g. # https://tests.obspy.org/30657/#1 fig.axes[1].set_xlim(left=fig.axes[1].get_xlim()[0] - 2) with np.errstate(under='ignore'): fig.savefig(ic.name) # test it again, checking that updating an existing plot with different # stack selection works.. # a) we start with the stack for the expected image and test that it # matches (like above): ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=1.5, plt_close_all_exit=False) as ic: fig = ppsd.plot(show=False, **plot_kwargs) # some matplotlib/Python version combinations lack the left-most # tick/label "Jan 2015". Try to circumvent and get the (otherwise # OK) test by changing the left x limit a bit further out (by two # days, axis is in mpl days). See e.g. # https://tests.obspy.org/30657/#1 fig.axes[1].set_xlim(left=fig.axes[1].get_xlim()[0] - 2) with np.errstate(under='ignore'): fig.savefig(ic.name) # b) now reuse figure and set the histogram with a different stack, # image test should fail: ppsd.calculate_histogram(**stack_criteria_list[3]) try: with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', adjust_tolerance=False, plt_close_all_enter=False, plt_close_all_exit=False) as ic: # rms of the valid comparison above is ~31, # rms of the invalid comparison we test here is ~36 if MATPLOTLIB_VERSION == [1, 1, 1]: ic.tol = 33 ppsd._plot_histogram(fig=fig, draw=True) with np.errstate(under='ignore'): fig.savefig(ic.name) except ImageComparisonException: pass else: msg = "Expected ImageComparisonException was not raised." self.fail(msg) # c) now reuse figure and set the original histogram stack again, # image test should pass agin: ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=1.5, plt_close_all_enter=False) as ic: ppsd._plot_histogram(fig=fig, draw=True) with np.errstate(under='ignore'): fig.savefig(ic.name)
def test_ppsd_w_iris(self): # Bands to be used this is the upper and lower frequency band pairs fres = zip([0.1, 0.05], [0.2, 0.1]) file_data_anmo = os.path.join(self.path, 'IUANMO.seed') # Read in ANMO data for one day st = read(file_data_anmo) # Use a canned ANMO response which will stay static paz = {'gain': 86298.5, 'zeros': [0, 0], 'poles': [-59.4313, -22.7121 + 27.1065j, -22.7121 + 27.1065j, -0.0048004, -0.073199], 'sensitivity': 3.3554 * 10 ** 9} # Make an empty PPSD and add the data # use highest frequency given by IRIS Mustang noise-pdf web service # (0.475683 Hz == 2.10224036 s) as center of first bin, so that we # end up with the same bins. ppsd = PPSD(st[0].stats, paz, period_limits=(2.10224036, 1400)) ppsd.add(st) ppsd.calculate_histogram() # Get the 50th percentile from the PPSD (per, perval) = ppsd.get_percentile(percentile=50) perinv = 1 / per # Read in the results obtained from a Mustang flat file file_data_iris = os.path.join(self.path, 'IRISpdfExample') data = np.genfromtxt( file_data_iris, comments='#', delimiter=',', dtype=[(native_str("freq"), np.float64), (native_str("power"), np.int32), (native_str("hits"), np.int32)]) freq = data["freq"] power = data["power"] hits = data["hits"] # cut data to same period range as in the ppsd we computed # (Mustang returns more long periods, probably due to some zero padding # or longer nfft in psd) num_periods = len(ppsd.period_bin_centers) freqdistinct = np.array(sorted(set(freq), reverse=True)[:num_periods]) # just make sure that we compare the same periods in the following # (as we access both frequency arrays by indices from now on) np.testing.assert_allclose(freqdistinct, 1 / ppsd.period_bin_centers, rtol=1e-4) # For each frequency pair we want to compare the mean of the bands for fre in fres: # determine which bins we want to compare mask = (fre[0] < perinv) & (perinv < fre[1]) # Get the values for the bands from the PPSD per_val_good_obspy = perval[mask] percenlist = [] # Now we sort out all of the data from the IRIS flat file # We will loop through the frequency values and compute a # 50th percentile for curfreq in freqdistinct[mask]: mask_ = curfreq == freq tempvalslist = np.repeat(power[mask_], hits[mask_]) percenlist.append(np.percentile(tempvalslist, 50)) # Here is the actual test np.testing.assert_allclose(np.mean(per_val_good_obspy), np.mean(percenlist), rtol=0.0, atol=1.2)
def test_ppsd_restricted_stacks(self): """ Test PPSD.calculate_histogram() with restrictions to what data should be stacked. Also includes image tests. """ # set up a bogus PPSD, with fixed random psds but with real start times # of psd pieces, to facilitate testing the stack selection. ppsd = PPSD(stats=Stats(dict(sampling_rate=150)), metadata=None, db_bins=(-200, -50, 20.), period_step_octaves=1.4) # change data to nowadays used nanoseconds POSIX timestamp ppsd._times_processed = [ UTCDateTime(t)._ns for t in np.load( os.path.join(self.path, "ppsd_times_processed.npy")).tolist() ] np.random.seed(1234) ppsd._binned_psds = [ arr for arr in np.random.uniform(-200, -50, ( len(ppsd._times_processed), len(ppsd.period_bin_centers))) ] # Test callback function that selects a fixed random set of the # timestamps. Also checks that we get passed the type we expect, # which is 1D numpy ndarray of int type. def callback(t_array): self.assertIsInstance(t_array, np.ndarray) self.assertEqual(t_array.shape, (len(ppsd._times_processed), )) self.assertTrue(np.issubdtype(t_array.dtype, np.integer)) np.random.seed(1234) res = np.random.randint(0, 2, len(t_array)).astype(np.bool) return res # test several different sets of stack criteria, should cover # everything, even with lots of combined criteria stack_criteria_list = [ dict(starttime=UTCDateTime(2015, 3, 8), month=[2, 3, 5, 7, 8]), dict(endtime=UTCDateTime(2015, 6, 7), year=[2015], time_of_weekday=[(1, 0, 24), (2, 0, 24), (-1, 0, 11)]), dict(year=[2013, 2014, 2016, 2017], month=[2, 3, 4]), dict(month=[1, 2, 5, 6, 8], year=2015), dict(isoweek=[4, 5, 6, 13, 22, 23, 24, 44, 45]), dict(time_of_weekday=[(5, 22, 24), (6, 0, 2), (6, 22, 24)]), dict(callback=callback, month=[1, 3, 5, 7]), dict(callback=callback) ] expected_selections = np.load( os.path.join(self.path, "ppsd_stack_selections.npy")) # test every set of criteria for stack_criteria, expected_selection in zip(stack_criteria_list, expected_selections): selection_got = ppsd._stack_selection(**stack_criteria) np.testing.assert_array_equal(selection_got, expected_selection) # test one particular selection as an image test # mpl < 2.2 has slightly offset ticks/ticklabels, so needs a higher # `reltol` tolerance (see e.g. http://tests.obspy.org/102260) reltol = 1.5 plot_kwargs = dict(max_percentage=15, xaxis_frequency=True, period_lim=(0.01, 50)) ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=reltol) as ic: fig = ppsd.plot(show=False, **plot_kwargs) # some matplotlib/Python version combinations lack the left-most # tick/label "Jan 2015". Try to circumvent and get the (otherwise # OK) test by changing the left x limit a bit further out (by two # days, axis is in mpl days). See e.g. # https://tests.obspy.org/30657/#1 fig.axes[1].set_xlim(left=fig.axes[1].get_xlim()[0] - 2) with np.errstate(under='ignore'): fig.savefig(ic.name) # test it again, checking that updating an existing plot with different # stack selection works.. # a) we start with the stack for the expected image and test that it # matches (like above): ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=reltol, plt_close_all_exit=False) as ic: fig = ppsd.plot(show=False, **plot_kwargs) # some matplotlib/Python version combinations lack the left-most # tick/label "Jan 2015". Try to circumvent and get the (otherwise # OK) test by changing the left x limit a bit further out (by two # days, axis is in mpl days). See e.g. # https://tests.obspy.org/30657/#1 fig.axes[1].set_xlim(left=fig.axes[1].get_xlim()[0] - 2) with np.errstate(under='ignore'): fig.savefig(ic.name) # b) now reuse figure and set the histogram with a different stack, # image test should fail: ppsd.calculate_histogram(**stack_criteria_list[3]) try: with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', adjust_tolerance=False, plt_close_all_enter=False, plt_close_all_exit=False) as ic: # rms of the valid comparison above is ~31, # rms of the invalid comparison we test here is ~36 ppsd._plot_histogram(fig=fig, draw=True) with np.errstate(under='ignore'): fig.savefig(ic.name) except ImageComparisonException: pass else: msg = "Expected ImageComparisonException was not raised." self.fail(msg) # c) now reuse figure and set the original histogram stack again, # image test should pass agin: ppsd.calculate_histogram(**stack_criteria_list[1]) with ImageComparison(self.path_images, 'ppsd_restricted_stack.png', reltol=reltol, plt_close_all_enter=False) as ic: ppsd._plot_histogram(fig=fig, draw=True) with np.errstate(under='ignore'): fig.savefig(ic.name)
def test_ppsd_w_iris(self): # Bands to be used this is the upper and lower frequency band pairs fres = zip([0.1, 0.05], [0.2, 0.1]) file_data_anmo = os.path.join(self.path, 'IUANMO.seed') # Read in ANMO data for one day st = read(file_data_anmo) # Use a canned ANMO response which will stay static paz = { 'gain': 86298.5, 'zeros': [0, 0], 'poles': [ -59.4313, -22.7121 + 27.1065j, -22.7121 + 27.1065j, -0.0048004, -0.073199 ], 'sensitivity': 3.3554 * 10**9 } # Make an empty PPSD and add the data # use highest frequency given by IRIS Mustang noise-pdf web service # (0.475683 Hz == 2.10224036 s) as center of first bin, so that we # end up with the same bins. ppsd = PPSD(st[0].stats, paz, period_limits=(2.10224036, 1400)) ppsd.add(st) ppsd.calculate_histogram() # Get the 50th percentile from the PPSD (per, perval) = ppsd.get_percentile(percentile=50) perinv = 1 / per # Read in the results obtained from a Mustang flat file file_data_iris = os.path.join(self.path, 'IRISpdfExample') data = np.genfromtxt(file_data_iris, comments='#', delimiter=',', dtype=[("freq", np.float64), ("power", np.int32), ("hits", np.int32)]) freq = data["freq"] power = data["power"] hits = data["hits"] # cut data to same period range as in the ppsd we computed # (Mustang returns more long periods, probably due to some zero padding # or longer nfft in psd) num_periods = len(ppsd.period_bin_centers) freqdistinct = np.array(sorted(set(freq), reverse=True)[:num_periods]) # just make sure that we compare the same periods in the following # (as we access both frequency arrays by indices from now on) np.testing.assert_allclose(freqdistinct, 1 / ppsd.period_bin_centers, rtol=1e-4) # For each frequency pair we want to compare the mean of the bands for fre in fres: # determine which bins we want to compare mask = (fre[0] < perinv) & (perinv < fre[1]) # Get the values for the bands from the PPSD per_val_good_obspy = perval[mask] percenlist = [] # Now we sort out all of the data from the IRIS flat file # We will loop through the frequency values and compute a # 50th percentile for curfreq in freqdistinct[mask]: mask_ = curfreq == freq tempvalslist = np.repeat(power[mask_], hits[mask_]) percenlist.append(np.percentile(tempvalslist, 50)) # Here is the actual test np.testing.assert_allclose(np.mean(per_val_good_obspy), np.mean(percenlist), rtol=0.0, atol=1.2)
def test_PPSD_w_IRIS(self): # Bands to be used this is the upper and lower frequency band pairs fres = zip([0.1, 0.05], [0.2, 0.1]) file_dataANMO = os.path.join(self.path, 'IUANMO.seed') # Read in ANMO data for one day st = read(file_dataANMO) # Use a canned ANMO response which will stay static paz = { 'gain': 86298.5, 'zeros': [0, 0], 'poles': [ -59.4313, -22.7121 + 27.1065j, -22.7121 + 27.1065j, -0.0048004, -0.073199 ], 'sensitivity': 3.3554 * 10**9 } # Make an empty PPSD and add the data ppsd = PPSD(st[0].stats, paz) ppsd.add(st) ppsd.calculate_histogram() # Get the 50th percentile from the PPSD (per, perval) = ppsd.get_percentile(percentile=50) # Read in the results obtained from a Mustang flat file file_dataIRIS = os.path.join(self.path, 'IRISpdfExample') freq, power, hits = np.genfromtxt(file_dataIRIS, comments='#', delimiter=',', unpack=True) # For each frequency pair we want to compare the mean of the bands for fre in fres: pervalGoodOBSPY = [] # Get the values for the bands from the PPSD perinv = 1 / per mask = (fre[0] < perinv) & (perinv < fre[1]) pervalGoodOBSPY = perval[mask] # Now we sort out all of the data from the IRIS flat file mask = (fre[0] < freq) & (freq < fre[1]) triples = list(zip(freq[mask], hits[mask], power[mask])) # We now have all of the frequency values of interest # We will get the distinct frequency values freqdistinct = sorted(list(set(freq[mask])), reverse=True) percenlist = [] # We will loop through the frequency values and compute a # 50th percentile for curfreq in freqdistinct: tempvalslist = [] for triple in triples: if np.isclose(curfreq, triple[0], atol=1e-3, rtol=0.0): tempvalslist += [int(triple[2])] * int(triple[1]) percenlist.append(np.percentile(tempvalslist, 50)) # Here is the actual test np.testing.assert_allclose(np.mean(pervalGoodOBSPY), np.mean(percenlist), rtol=0.0, atol=1.0)