def test_get_magnitude_vector_properties(self): # Tests the function to retreive mmin and number of earthquakes if # required for certain functions test_catalogue = { 'magnitude': np.array([3.4, 4.5, 7.6, 5.4, 3.8]), 'sigmaMagnitude': np.array([0.1, 0.2, 0.3, 0.2, 0.1]) } self.config['input_mmin'] = 4.0 # Test 1: Finds the number of events from the catalogue with defined # minimum magnitude neq, mmin = _get_magnitude_vector_properties(test_catalogue, self.config) self.assertAlmostEqual(neq, 3.0) self.assertAlmostEqual(mmin, 4.0) # Test 2 Finds the number of events from the catalogue with an # unspecified minimum magnitude del self.config['input_mmin'] neq, mmin = _get_magnitude_vector_properties(test_catalogue, self.config) self.assertAlmostEqual(neq, 5.0) self.assertAlmostEqual(mmin, 3.4)
def get_mmax(self, catalogue, config): ''' Calculates Maximum magnitude :param catalogue: Earthquake catalogue as instance of :class: hmtk.seismicity.catalogue.Catalogue :param dict config: Configuration file for algorithm, contains the attributes: * 'b-value': b-value (positive float) * 'input_mmin': Minimum magnitude for integral (if less than minimum observed magnitude, will be overwritten by minimum observed magnitude) * 'tolerance': Tolerance of stabilising of iterator * 'maximum_interations': Maximum number of iterations :returns: **mmax** Maximum magnitude and **mmax_sig** corresponding uncertainty ''' config = check_config(config, catalogue.data) obsmax, obsmaxsig = _get_observed_mmax(catalogue.data, config) mmin = config['input_mmin'] beta = config['b-value'] * np.log(10.) neq, mmin = _get_magnitude_vector_properties(catalogue.data, config) mmax = np.copy(obsmax) d_t = np.inf iterator = 0 while d_t > config['tolerance']: delta = quadrature(self._ks_intfunc, mmin, mmax, args=(neq, mmax, mmin, beta))[0] #print mmin, neq, delta, mmax tmmax = obsmax + delta d_t = np.abs(tmmax - mmax) mmax = np.copy(tmmax) iterator += 1 if iterator > config['maximum_iterations']: print 'Kijko-Sellevol estimator reached maximum # of iterations' d_t = -np.inf return mmax.item(), np.sqrt(obsmaxsig**2. + delta**2.)
def get_mmax(self, catalogue, config): ''' Calculates Maximum magnitude :param catalogue: Earthquake catalogue as instance of :class: hmtk.seismicity.catalogue.Catalogue :param dict config: Configuration file for algorithm, contains the attributes: * 'b-value': b-value (positive float) * 'input_mmin': Minimum magnitude for integral (if less than minimum observed magnitude, will be overwritten by minimum observed magnitude) * 'tolerance': Tolerance of stabilising of iterator * 'maximum_interations': Maximum number of iterations :returns: **mmax** Maximum magnitude and **mmax_sig** corresponding uncertainty ''' config = check_config(config, catalogue.data) obsmax, obsmaxsig = _get_observed_mmax(catalogue.data, config) mmin = config['input_mmin'] beta = config['b-value'] * np.log(10.) neq, mmin = _get_magnitude_vector_properties(catalogue.data, config) mmax = np.copy(obsmax) d_t = np.inf iterator = 0 while d_t > config['tolerance']: delta = quadrature(self._ks_intfunc, mmin, mmax, args=(neq, mmax, mmin, beta))[0] #print mmin, neq, delta, mmax tmmax = obsmax + delta d_t = np.abs(tmmax - mmax) mmax = np.copy(tmmax) iterator += 1 if iterator > config['maximum_iterations']: print ('Kijko-Sellevol estimator reached ' 'maximum # of iterations') d_t = -np.inf return mmax.item(), np.sqrt(obsmaxsig ** 2. + delta ** 2.)
def get_mmax(self, catalogue, config): '''Calculate maximum magnitude :return: **mmax** Maximum magnitude and **mmax_sig** corresponding uncertainty :rtype: Float ''' # Check configuration file config = check_config(config, catalogue.data) # Negative b-values will return nan - this simply skips the integral if config['b-value'] <= 0.0: return np.nan, np.nan obsmax, obsmaxsig = _get_observed_mmax(catalogue.data, config) beta = config['b-value'] * np.log(10.) sigbeta = config['sigma-b'] * np.log(10.) neq, mmin = _get_magnitude_vector_properties(catalogue.data, config) pval = beta / (sigbeta ** 2.) qval = (beta / sigbeta) ** 2. mmax = np.copy(obsmax) d_t = np.inf iterator = 0 while d_t > config['tolerance']: rval = pval / (pval + mmax - mmin) ldelt = (1. / (1. - (rval ** qval))) ** neq delta = ldelt * quadrature(self._ksb_intfunc, mmin, mmax, args=(neq, mmin, pval, qval))[0] tmmax = obsmax + delta d_t = np.abs(tmmax - mmax) mmax = np.copy(tmmax) iterator += 1 if iterator > config['maximum_iterations']: print 'Kijko-Sellevol-Bayes estimator reached' print 'maximum # of iterations' d_t = -np.inf return mmax.item(), np.sqrt(obsmaxsig ** 2. + delta ** 2.)