From e2b39cbd1d2fc636cfcf16db263793ed8860c97f Mon Sep 17 00:00:00 2001 From: lewisblake Date: Wed, 4 Oct 2023 14:21:01 +0000 Subject: [PATCH 1/6] WIP --- pyaerocom/aeroval/coldatatojson_helpers.py | 7 +++-- pyaerocom/region.py | 34 +++++++++++++++------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/pyaerocom/aeroval/coldatatojson_helpers.py b/pyaerocom/aeroval/coldatatojson_helpers.py index 42d634291..6b5be120a 100644 --- a/pyaerocom/aeroval/coldatatojson_helpers.py +++ b/pyaerocom/aeroval/coldatatojson_helpers.py @@ -632,10 +632,11 @@ def _init_site_coord_arrays(data): return (sites, lats, lons, alts, countries, jsdates) -def _get_stat_regions(lats, lons, regions): +def _get_stat_regions(lats, lons, regions, **kwargs): regs = [] + regions_how = kwargs["regions_how"] if kwargs["regions_how"] else None for lat, lon in zip(lats, lons): - reg = find_closest_region_coord(lat, lon, regions=regions) + reg = find_closest_region_coord(lat, lon, regions=regions, regions_how=regions_how) regs.append(reg) return regs @@ -645,6 +646,8 @@ def _process_sites(data, regions, regions_how, meta_glob): (sites, lats, lons, alts, countries, jsdates) = _init_site_coord_arrays(data) if regions_how == "country": regs = countries + elif regions_how == "htap": + regs = _get_stat_regions(lats, lons, regions, regions_how=regions_how) else: regs = _get_stat_regions(lats, lons, regions) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index d40021c45..7ac00b770 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -12,6 +12,8 @@ from pyaerocom.region_defs import REGION_DEFS # all region definitions from pyaerocom.region_defs import OLD_AEROCOM_REGIONS, REGION_NAMES # custom names (dict) +POSSIBLE_REGION_OCEAN_NAMES = ["OCN", "Oceans"] + class Region(BrowseDict): """Class specifying a region @@ -345,28 +347,30 @@ def get_regions_coord(lat, lon, regions=None): list list of regions that contain this coordinate """ + breakpoint() matches = [] if regions is None: regions = get_all_default_regions() ocean_mask = load_region_mask_xr("OCN") - on_ocean = get_mask_value(lat, lon, ocean_mask) + on_ocean = bool(get_mask_value(lat, lon, ocean_mask)) for rname, reg in regions.items(): - if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME - continue + # if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME + # continue # OCN needs special handling determined by the rname, not hardcoded to return OCN b/c of HTAP issues + + if rname in POSSIBLE_REGION_OCEAN_NAMES: + if on_ocean: + matches.append(rname) + continue if reg.contains_coordinate(lat, lon) and not on_ocean: matches.append(rname) - if rname == "OCN" and on_ocean: - matches.append(rname) - if len(matches) == 0: - matches.append(ALL_REGION_NAME) + # if len(matches) == 0: + matches.append(ALL_REGION_NAME) return matches def find_closest_region_coord( - lat: float, - lon: float, - regions: dict | None = None, + lat: float, lon: float, regions: dict | None = None, **kwargs ) -> list[str]: """Finds list of regions sorted by their center closest to input coordinate @@ -389,5 +393,13 @@ def find_closest_region_coord( regions = get_all_default_regions() matches = get_regions_coord(lat, lon, regions) matches.sort(key=lambda id: regions[id].distance_to_center(lat, lon)) - + breakpoint() + if kwargs["regions_how"] and kwargs["regions_how"] == "htap": + # keep only first entry and Oceans if it exists + keep = matches[:1] + if "Oceans" in matches[1:]: + keep += ["Oceans"] + if ALL_REGION_NAME in matches: + keep += [ALL_REGION_NAME] + return keep return matches From 09daafe7aeca94cae1362c860a99edc7de9601e6 Mon Sep 17 00:00:00 2001 From: lewisblake Date: Thu, 5 Oct 2023 08:41:56 +0000 Subject: [PATCH 2/6] WIP --- pyaerocom/region.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index 7ac00b770..da6420cf7 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -347,15 +347,14 @@ def get_regions_coord(lat, lon, regions=None): list list of regions that contain this coordinate """ - breakpoint() matches = [] if regions is None: regions = get_all_default_regions() ocean_mask = load_region_mask_xr("OCN") on_ocean = bool(get_mask_value(lat, lon, ocean_mask)) for rname, reg in regions.items(): - # if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME - # continue + if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME + continue # OCN needs special handling determined by the rname, not hardcoded to return OCN b/c of HTAP issues if rname in POSSIBLE_REGION_OCEAN_NAMES: @@ -393,7 +392,6 @@ def find_closest_region_coord( regions = get_all_default_regions() matches = get_regions_coord(lat, lon, regions) matches.sort(key=lambda id: regions[id].distance_to_center(lat, lon)) - breakpoint() if kwargs["regions_how"] and kwargs["regions_how"] == "htap": # keep only first entry and Oceans if it exists keep = matches[:1] From 5a891131c6a710c39551a406514f04a32a9bca6e Mon Sep 17 00:00:00 2001 From: lewisblake Date: Thu, 5 Oct 2023 12:04:33 +0000 Subject: [PATCH 3/6] version for testing --- pyaerocom/region.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index da6420cf7..5252e50af 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -354,17 +354,17 @@ def get_regions_coord(lat, lon, regions=None): on_ocean = bool(get_mask_value(lat, lon, ocean_mask)) for rname, reg in regions.items(): if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME + matches.append(rname) continue # OCN needs special handling determined by the rname, not hardcoded to return OCN b/c of HTAP issues - if rname in POSSIBLE_REGION_OCEAN_NAMES: if on_ocean: matches.append(rname) continue if reg.contains_coordinate(lat, lon) and not on_ocean: matches.append(rname) - # if len(matches) == 0: - matches.append(ALL_REGION_NAME) + if len(matches) == 0: + matches.append(ALL_REGION_NAME) return matches @@ -397,7 +397,7 @@ def find_closest_region_coord( keep = matches[:1] if "Oceans" in matches[1:]: keep += ["Oceans"] - if ALL_REGION_NAME in matches: + if ALL_REGION_NAME in matches[1:]: keep += [ALL_REGION_NAME] - return keep + return list({*keep}) return matches From b1da506ee7711802cd1419e83c2b402b3195fd40 Mon Sep 17 00:00:00 2001 From: lewisblake Date: Thu, 5 Oct 2023 12:21:57 +0000 Subject: [PATCH 4/6] "regions_how" in kwargs --- pyaerocom/region.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index 5252e50af..4a7f8f781 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -392,7 +392,7 @@ def find_closest_region_coord( regions = get_all_default_regions() matches = get_regions_coord(lat, lon, regions) matches.sort(key=lambda id: regions[id].distance_to_center(lat, lon)) - if kwargs["regions_how"] and kwargs["regions_how"] == "htap": + if "regions_how" in kwargs and kwargs["regions_how"] == "htap": # keep only first entry and Oceans if it exists keep = matches[:1] if "Oceans" in matches[1:]: From 5dc1216c35ff240ad5fc2b141b56bf5f3ae35d4f Mon Sep 17 00:00:00 2001 From: lewisblake Date: Thu, 5 Oct 2023 12:44:02 +0000 Subject: [PATCH 5/6] get() wit it --- pyaerocom/aeroval/coldatatojson_helpers.py | 2 +- pyaerocom/region.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyaerocom/aeroval/coldatatojson_helpers.py b/pyaerocom/aeroval/coldatatojson_helpers.py index 6b5be120a..3af9f6852 100644 --- a/pyaerocom/aeroval/coldatatojson_helpers.py +++ b/pyaerocom/aeroval/coldatatojson_helpers.py @@ -634,7 +634,7 @@ def _init_site_coord_arrays(data): def _get_stat_regions(lats, lons, regions, **kwargs): regs = [] - regions_how = kwargs["regions_how"] if kwargs["regions_how"] else None + regions_how = kwargs.get("regions_how", None) for lat, lon in zip(lats, lons): reg = find_closest_region_coord(lat, lon, regions=regions, regions_how=regions_how) regs.append(reg) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index 4a7f8f781..d3b8d81c1 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -392,7 +392,7 @@ def find_closest_region_coord( regions = get_all_default_regions() matches = get_regions_coord(lat, lon, regions) matches.sort(key=lambda id: regions[id].distance_to_center(lat, lon)) - if "regions_how" in kwargs and kwargs["regions_how"] == "htap": + if kwargs.get("regions_how") == "htap": # keep only first entry and Oceans if it exists keep = matches[:1] if "Oceans" in matches[1:]: From 6288c41481e39783f377269478d605bb1a4d33ca Mon Sep 17 00:00:00 2001 From: lewisblake Date: Tue, 10 Oct 2023 12:24:56 +0000 Subject: [PATCH 6/6] list(set(keep)) --- pyaerocom/region.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyaerocom/region.py b/pyaerocom/region.py index d3b8d81c1..4b94dbf2e 100644 --- a/pyaerocom/region.py +++ b/pyaerocom/region.py @@ -399,5 +399,5 @@ def find_closest_region_coord( keep += ["Oceans"] if ALL_REGION_NAME in matches[1:]: keep += [ALL_REGION_NAME] - return list({*keep}) + return list(set(keep)) return matches