From e27945478b22f6106bd1825a1b06cb98b6086395 Mon Sep 17 00:00:00 2001 From: khawajasim Date: Tue, 15 Feb 2022 12:14:25 +0100 Subject: [PATCH 1/5] quadtree csv reader --- csep/utils/readers.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/csep/utils/readers.py b/csep/utils/readers.py index 753d57fa..2d6a831a 100644 --- a/csep/utils/readers.py +++ b/csep/utils/readers.py @@ -756,4 +756,32 @@ def load_quadtree_forecast(ascii_fname): # reshape rates into correct 2d format rates = data[:, -1].reshape(n_poly, n_mag_bins) + return rates, region, mws + + +def load_quadtree_forecast_csv(csv_fname): + """ Load quadtree forecasted stored as csv file + + The format expects forecast as a comma separated file, in which first column corresponds to quadtree grid cell (quadkey). + The corresponding enteries in the respective row are forecast rates corresponding to the magnitude bins. + The first line of forecast is a header, and its format is listed here: + 'Quadkey' Mag_0, Mag_1, Mag_2, Mag_3 , .... + Quadkey is a string. Rest of the values are floats. + For the purposes of defining region objects quadkey is used. + + We assume that the starting value of magnitude bins are provided in the header. + Args: + csv_fname: file name of csep forecast in csv format + Returns: + rates, region, mws (numpy.ndarray, QuadtreeRegion2D, numpy.ndarray): rates, region, and magnitude bins needed + to define QuadTree forecasts + """ + + data = numpy.genfromtxt(csv_fname, dtype='str', delimiter=',') + quadkeys = data[1:, 0] + mws = data[0, 1:] + rates = data[1:, 1:] + rates = rates.astype(float) + region = QuadtreeGrid2D.from_quadkeys(quadkeys, magnitudes=mws) + return rates, region, mws \ No newline at end of file From 87b780b5e835f80a8b3ad2201ddf95ea15b63dea Mon Sep 17 00:00:00 2001 From: khawajasim Date: Mon, 21 Feb 2022 12:58:55 +0100 Subject: [PATCH 2/5] included depth columns in reader --- csep/utils/readers.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/csep/utils/readers.py b/csep/utils/readers.py index 2d6a831a..2482a0f8 100644 --- a/csep/utils/readers.py +++ b/csep/utils/readers.py @@ -763,9 +763,10 @@ def load_quadtree_forecast_csv(csv_fname): """ Load quadtree forecasted stored as csv file The format expects forecast as a comma separated file, in which first column corresponds to quadtree grid cell (quadkey). + The second and thrid columns indicate depth range. The corresponding enteries in the respective row are forecast rates corresponding to the magnitude bins. The first line of forecast is a header, and its format is listed here: - 'Quadkey' Mag_0, Mag_1, Mag_2, Mag_3 , .... + 'Quadkey', depth_min, depth_max, Mag_0, Mag_1, Mag_2, Mag_3 , .... Quadkey is a string. Rest of the values are floats. For the purposes of defining region objects quadkey is used. @@ -779,8 +780,8 @@ def load_quadtree_forecast_csv(csv_fname): data = numpy.genfromtxt(csv_fname, dtype='str', delimiter=',') quadkeys = data[1:, 0] - mws = data[0, 1:] - rates = data[1:, 1:] + mws = data[0, 3:] + rates = data[1:, 3:] rates = rates.astype(float) region = QuadtreeGrid2D.from_quadkeys(quadkeys, magnitudes=mws) From a114a22d1bf03b9dfbd619ab342655bde3e3489d Mon Sep 17 00:00:00 2001 From: khawajasim Date: Wed, 23 Feb 2022 11:02:36 +0100 Subject: [PATCH 3/5] reader name change --- csep/utils/readers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csep/utils/readers.py b/csep/utils/readers.py index 2482a0f8..b5352279 100644 --- a/csep/utils/readers.py +++ b/csep/utils/readers.py @@ -719,7 +719,7 @@ def _parse_datetime_to_zmap(date, time): out['second'] = dt.second return out -def load_quadtree_forecast(ascii_fname): +def quadtree_ascii_loader(ascii_fname): """ Load quadtree forecasted stored as ascii text file Note: This function is adapted form csep.forecasts.load_ascii @@ -759,7 +759,7 @@ def load_quadtree_forecast(ascii_fname): return rates, region, mws -def load_quadtree_forecast_csv(csv_fname): +def quadtree_csv_loader(csv_fname): """ Load quadtree forecasted stored as csv file The format expects forecast as a comma separated file, in which first column corresponds to quadtree grid cell (quadkey). From c18a218ffacad16830e46d3eb60babaf173fa5ab Mon Sep 17 00:00:00 2001 From: khawajasim Date: Wed, 23 Feb 2022 12:11:14 +0100 Subject: [PATCH 4/5] cartesian_grid.bounds added --- csep/core/regions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/csep/core/regions.py b/csep/core/regions.py index 48295b40..d50bff6f 100644 --- a/csep/core/regions.py +++ b/csep/core/regions.py @@ -517,6 +517,9 @@ def __init__(self, polygons, dh, name='cartesian2d', mask=None): # index values of polygons array into the 2d cartesian grid, based on the midpoint. self.xs = xs self.ys = ys + # Bounds [origin, top_right] + orgs = self.origins() + self.bounds = numpy.column_stack((orgs, orgs + dh)) def __eq__(self, other): return self.to_dict() == other.to_dict() From 876d877c04ca5cdd4e463b16284fa177c10293eb Mon Sep 17 00:00:00 2001 From: khawajasim Date: Wed, 23 Feb 2022 12:14:25 +0100 Subject: [PATCH 5/5] check for zero area --- csep/core/regions.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/csep/core/regions.py b/csep/core/regions.py index d50bff6f..05c69747 100644 --- a/csep/core/regions.py +++ b/csep/core/regions.py @@ -775,13 +775,16 @@ def geographical_area_from_bounds(lon1, lat1, lon2, lat2): Returns: Area of cell in Km2 """ - earth_radius_km = 6371. - R2 = earth_radius_km ** 2 - rad_per_deg = numpy.pi / 180.0e0 + if lon1 == lon2 or lat1 == lat2: + return 0 + else: + earth_radius_km = 6371. + R2 = earth_radius_km ** 2 + rad_per_deg = numpy.pi / 180.0e0 - strip_area_steradian = 2 * numpy.pi * (1.0e0 - numpy.cos((90.0e0 - lat1) * rad_per_deg)) \ + strip_area_steradian = 2 * numpy.pi * (1.0e0 - numpy.cos((90.0e0 - lat1) * rad_per_deg)) \ - 2 * numpy.pi * (1.0e0 - numpy.cos((90.0e0 - lat2) * rad_per_deg)) - area_km2 = strip_area_steradian * R2 / (360.0 / (lon2 - lon1)) + area_km2 = strip_area_steradian * R2 / (360.0 / (lon2 - lon1)) return area_km2 def quadtree_grid_bounds(quadk):