def _arrange_data_in_bins(bins_data, bin_edges): """ Given bins data, as it comes from :func:`_collect_bins_data`, and bin edges from :func:`_define_bins`, create a normalized 6d disaggregation matrix. """ mags, dists, lons, lats, joint_probs, tect_reg_types, trt_bins = bins_data mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges shape = (len(mag_bins) - 1, len(dist_bins) - 1, len(lon_bins) - 1, len(lat_bins) - 1, len(eps_bins) - 1, len(trt_bins)) diss_matrix = numpy.zeros(shape) for i_mag in xrange(len(mag_bins) - 1): mag_idx = mags <= mag_bins[i_mag + 1] if i_mag != 0: mag_idx &= mags > mag_bins[i_mag] for i_dist in xrange(len(dist_bins) - 1): dist_idx = dists <= dist_bins[i_dist + 1] if i_dist != 0: dist_idx &= dists > dist_bins[i_dist] for i_lon in xrange(len(lon_bins) - 1): extents = get_longitudinal_extent(lons, lon_bins[i_lon + 1]) lon_idx = extents >= 0 if i_lon != 0: extents = get_longitudinal_extent(lon_bins[i_lon], lons) lon_idx &= extents > 0 for i_lat in xrange(len(lat_bins) - 1): lat_idx = lats <= lat_bins[i_lat + 1] if i_lat != 0: lat_idx &= lats > lat_bins[i_lat] for i_eps in xrange(len(eps_bins) - 1): for i_trt in xrange(len(trt_bins)): trt_idx = tect_reg_types == i_trt prob_idx = mag_idx & dist_idx & lon_idx \ & lat_idx & trt_idx diss_idx = i_mag, i_dist, i_lon, \ i_lat, i_eps, i_trt diss_matrix[diss_idx] = numpy.sum( joint_probs[prob_idx, i_eps] ) diss_matrix /= numpy.sum(diss_matrix) return diss_matrix
def _arrange_data_in_bins(bins_data, bin_edges): """ Given bins data, as it comes from :func:`_collect_bins_data`, and bin edges from :func:`_define_bins`, create a normalized 6d disaggregation matrix. """ mags, dists, lons, lats, joint_probs, tect_reg_types, trt_bins = bins_data mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges shape = (len(mag_bins) - 1, len(dist_bins) - 1, len(lon_bins) - 1, len(lat_bins) - 1, len(eps_bins) - 1, len(trt_bins)) diss_matrix = numpy.zeros(shape) for i_mag in xrange(len(mag_bins) - 1): mag_idx = mags <= mag_bins[i_mag + 1] if i_mag != 0: mag_idx &= mags > mag_bins[i_mag] for i_dist in xrange(len(dist_bins) - 1): dist_idx = dists <= dist_bins[i_dist + 1] if i_dist != 0: dist_idx &= dists > dist_bins[i_dist] for i_lon in xrange(len(lon_bins) - 1): extents = get_longitudinal_extent(lons, lon_bins[i_lon + 1]) lon_idx = extents >= 0 if i_lon != 0: extents = get_longitudinal_extent(lon_bins[i_lon], lons) lon_idx &= extents > 0 for i_lat in xrange(len(lat_bins) - 1): lat_idx = lats <= lat_bins[i_lat + 1] if i_lat != 0: lat_idx &= lats > lat_bins[i_lat] for i_eps in xrange(len(eps_bins) - 1): for i_trt in xrange(len(trt_bins)): trt_idx = tect_reg_types == i_trt prob_idx = mag_idx & dist_idx & lon_idx \ & lat_idx & trt_idx diss_idx = i_mag, i_dist, i_lon, \ i_lat, i_eps, i_trt diss_matrix[diss_idx] = numpy.sum( joint_probs[prob_idx, i_eps]) diss_matrix /= numpy.sum(diss_matrix) return diss_matrix
def test_polygon_on_international_date_line(self): MESH_SPACING = 10 bl = geo.Point(177, 40) bml = geo.Point(179, 40) bmr = geo.Point(-179, 40) br = geo.Point(-177, 40) tr = geo.Point(-177, 43) tmr = geo.Point(-179, 43) tml = geo.Point(179, 43) tl = geo.Point(177, 43) poly = geo.Polygon([bl, bml, bmr, br, tr, tmr, tml, tl]) mesh = list(poly.discretize(mesh_spacing=MESH_SPACING)) west = east = mesh[0] for point in mesh: if geo_utils.get_longitudinal_extent(point.longitude, west.longitude) > 0: west = point if geo_utils.get_longitudinal_extent(point.longitude, east.longitude) < 0: east = point self.assertLess(west.longitude, 177.15) self.assertGreater(east.longitude, -177.15)
def test_polygon_on_international_date_line(self): MESH_SPACING = 10 bl = geo.Point(177, 40) bml = geo.Point(179, 40) bmr = geo.Point(-179, 40) br = geo.Point(-177, 40) tr = geo.Point(-177, 43) tmr = geo.Point(-179, 43) tml = geo.Point(179, 43) tl = geo.Point(177, 43) poly = geo.Polygon([bl, bml, bmr, br, tr, tmr, tml, tl]) mesh = list(poly.discretize(mesh_spacing=MESH_SPACING)) west = east = mesh[0] for point in mesh: if geo_utils.get_longitudinal_extent(point.longitude, west.longitude) > 0: west = point if geo_utils.get_longitudinal_extent(point.longitude, east.longitude) < 0: east = point self.assertLess(west.longitude, 177.15) self.assertGreater(east.longitude, -177.15)
def discretize(self, mesh_spacing): """ Get a mesh of uniformly spaced points inside the polygon area with distance of ``mesh_spacing`` km between. :returns: An instance of :class:`~nhlib.geo.mesh.Mesh` that holds the points data. Mesh is created with no depth information (all the points are on the Earth surface). """ self._init_polygon2d() west, east, north, south = self._bbox lons = [] lats = [] # we cover the bounding box (in spherical coordinates) from highest # to lowest latitude and from left to right by longitude. we step # by mesh spacing distance (linear measure). we check each point # if it is inside the polygon and yield the point object, if so. # this way we produce an uniformly-spaced mesh regardless of the # latitude. latitude = north while latitude > south: longitude = west while utils.get_longitudinal_extent(longitude, east) > 0: # we use Cartesian space just for checking if a point # is inside of the polygon. x, y = self._projection(longitude, latitude) if self._polygon2d.contains(shapely.geometry.Point(x, y)): lons.append(longitude) lats.append(latitude) # move by mesh spacing along parallel... longitude, _, = geodetic.point_at(longitude, latitude, 90, mesh_spacing) # ... and by the same distance along meridian in outer one _, latitude = geodetic.point_at(west, latitude, 180, mesh_spacing) lons = numpy.array(lons) lats = numpy.array(lats) return Mesh(lons, lats, depths=None)
def discretize(self, mesh_spacing): """ Get a mesh of uniformly spaced points inside the polygon area with distance of ``mesh_spacing`` km between. :returns: An instance of :class:`~nhlib.geo.mesh.Mesh` that holds the points data. Mesh is created with no depth information (all the points are on the Earth surface). """ self._init_polygon2d() west, east, north, south = self._bbox lons = [] lats = [] # we cover the bounding box (in spherical coordinates) from highest # to lowest latitude and from left to right by longitude. we step # by mesh spacing distance (linear measure). we check each point # if it is inside the polygon and yield the point object, if so. # this way we produce an uniformly-spaced mesh regardless of the # latitude. latitude = north while latitude > south: longitude = west while utils.get_longitudinal_extent(longitude, east) > 0: # we use Cartesian space just for checking if a point # is inside of the polygon. x, y = self._projection(longitude, latitude) if self._polygon2d.contains(shapely.geometry.Point(x, y)): lons.append(longitude) lats.append(latitude) # move by mesh spacing along parallel... longitude, _, = geodetic.point_at(longitude, latitude, 90, mesh_spacing) # ... and by the same distance along meridian in outer one _, latitude = geodetic.point_at(west, latitude, 180, mesh_spacing) lons = numpy.array(lons) lats = numpy.array(lats) return Mesh(lons, lats, depths=None)
def _define_bins(bins_data, mag_bin_width, dist_bin_width, coord_bin_width, truncation_level, n_epsilons): """ Define bin edges for disaggregation histograms. Given bins data as provided by :func:`_collect_bins_data`, this function finds edges of histograms, taking into account maximum and minimum values of magnitude, distance and coordinates as well as requested sizes/numbers of bins. """ mags, dists, lons, lats, _joint_probs, tect_reg_types, trt_bins = bins_data mag_bins = mag_bin_width * numpy.arange( int(numpy.floor(mags.min() / mag_bin_width)), int(numpy.ceil(mags.max() / mag_bin_width) + 1) ) dist_bins = dist_bin_width * numpy.arange( int(numpy.floor(dists.min() / dist_bin_width)), int(numpy.ceil(dists.max() / dist_bin_width) + 1) ) west, east, north, south = get_spherical_bounding_box(lons, lats) west = numpy.floor(west / coord_bin_width) * coord_bin_width east = numpy.ceil(east / coord_bin_width) * coord_bin_width lon_extent = get_longitudinal_extent(west, east) lon_bins, _, _ = npoints_between( west, 0, 0, east, 0, 0, numpy.round(lon_extent / coord_bin_width) + 1 ) lat_bins = coord_bin_width * numpy.arange( int(numpy.floor(south / coord_bin_width)), int(numpy.ceil(north / coord_bin_width) + 1) ) eps_bins = numpy.linspace(-truncation_level, truncation_level, n_epsilons + 1) return mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins
def _define_bins(bins_data, mag_bin_width, dist_bin_width, coord_bin_width, truncation_level, n_epsilons): """ Define bin edges for disaggregation histograms. Given bins data as provided by :func:`_collect_bins_data`, this function finds edges of histograms, taking into account maximum and minimum values of magnitude, distance and coordinates as well as requested sizes/numbers of bins. """ mags, dists, lons, lats, _joint_probs, tect_reg_types, trt_bins = bins_data mag_bins = mag_bin_width * numpy.arange( int(numpy.floor(mags.min() / mag_bin_width)), int(numpy.ceil(mags.max() / mag_bin_width) + 1)) dist_bins = dist_bin_width * numpy.arange( int(numpy.floor(dists.min() / dist_bin_width)), int(numpy.ceil(dists.max() / dist_bin_width) + 1)) west, east, north, south = get_spherical_bounding_box(lons, lats) west = numpy.floor(west / coord_bin_width) * coord_bin_width east = numpy.ceil(east / coord_bin_width) * coord_bin_width lon_extent = get_longitudinal_extent(west, east) lon_bins, _, _ = npoints_between( west, 0, 0, east, 0, 0, numpy.round(lon_extent / coord_bin_width) + 1) lat_bins = coord_bin_width * numpy.arange( int(numpy.floor(south / coord_bin_width)), int(numpy.ceil(north / coord_bin_width) + 1)) eps_bins = numpy.linspace(-truncation_level, truncation_level, n_epsilons + 1) return mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins
def test_international_date_line(self): self.assertEqual(utils.get_longitudinal_extent(-178.3, 177.7), -4) self.assertEqual(utils.get_longitudinal_extent(177.7, -178.3), 4) self.assertEqual(utils.get_longitudinal_extent(95, -180 + 94), 179) self.assertEqual(utils.get_longitudinal_extent(95, -180 + 96), -179)
def test_negative(self): self.assertEqual(utils.get_longitudinal_extent(20, 10), -10) self.assertEqual(utils.get_longitudinal_extent(-10, -15), -5)
def test_positive(self): self.assertEqual(utils.get_longitudinal_extent(10, 20), 10) self.assertEqual(utils.get_longitudinal_extent(-120, 30), 150)
def test_international_date_line(self): self.assertEqual(utils.get_longitudinal_extent(-178.3, 177.7), -4) self.assertEqual(utils.get_longitudinal_extent(177.7, -178.3), 4) self.assertEqual(utils.get_longitudinal_extent(95, -180 + 94), 179) self.assertEqual(utils.get_longitudinal_extent(95, -180 + 96), -179)
def test_negative(self): self.assertEqual(utils.get_longitudinal_extent(20, 10), -10) self.assertEqual(utils.get_longitudinal_extent(-10, -15), -5)
def test_positive(self): self.assertEqual(utils.get_longitudinal_extent(10, 20), 10) self.assertEqual(utils.get_longitudinal_extent(-120, 30), 150)