From 8bab8da84f001c6b34cf03a17e6840bb06ff8345 Mon Sep 17 00:00:00 2001 From: "gadieide@yahoo.com" Date: Mon, 13 Jul 2026 10:45:03 +0300 Subject: [PATCH 1/5] Fixes from onperm --- .../presentation/casualtiesFigs.py | 26 ++++++++++++++++--- hera/simulations/LSM/singleSimulation.py | 3 +++ hera/simulations/LSM/template.py | 5 +++- hera/utils/matplotlibCountour.py | 2 +- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/hera/riskassessment/presentation/casualtiesFigs.py b/hera/riskassessment/presentation/casualtiesFigs.py index 4b6bcc04e..94914537c 100644 --- a/hera/riskassessment/presentation/casualtiesFigs.py +++ b/hera/riskassessment/presentation/casualtiesFigs.py @@ -5,12 +5,32 @@ from matplotlib.projections import PolarAxes from mpl_toolkits.axisartist.grid_finder import (FixedLocator, MaxNLocator, DictFormatter) - +from matplotlib.patches import Polygon as MplPolygon +from shapely.geometry import (Polygon, MultiPolygon, LineString, Multi LineString, Point, MultiPoint, Geometry Collection) import pandas from ...utils import toMeteorologicalAngle,toMathematicalAngle, toAzimuthAngle from descartes import PolygonPatch - +def plot_geom(ax, geom, patch Prop, lineProp): + if geom.is_empty: + return + if isinstance(geom, Polygon): + patch MplPolygon(list(geom.exterior.coords), + closed=True, + **patchProp) + ax.add_patch(patch) + for interior in geom.interiors: + x,y = interior.xy + ax.plot(x,y,**lineProp) + elif isinstance(geom, Point): + plt.plot(geom.x,geom.y, "o",**lineProp) + elif isinstance(geom, LineString): + x,y =geom.xy + plt.plot(x,y,**lineProp) + else: + for gg in geom.geoms: + plot_geom(ax,gg, patch Prop, lineProp) + class casualtiesPlot(object): """ @@ -60,7 +80,7 @@ def plotCasualtiesRose(self, projectedData.append(injuryareas) projectedData = pandas.concat(projectedData) - pivotedData = projectedData.pivot(index="angle",columns='severity',values=effectedPopulation).reset_index().fillna(0) + pivotedData = projectedData.pivot(index="angle", columns='severity', values=effected Population).reset_index().fillna(0) if (ax is None): fig = plt.gcf() ax = fig.add_subplot(111,polar=True) diff --git a/hera/simulations/LSM/singleSimulation.py b/hera/simulations/LSM/singleSimulation.py index 89a1bcc54..3288fdf53 100644 --- a/hera/simulations/LSM/singleSimulation.py +++ b/hera/simulations/LSM/singleSimulation.py @@ -94,6 +94,9 @@ def getConcentration(self, Q=1*ureg.kg, time_units=ureg.min, q_units=ureg.mg): dDosage: xarray The calculated concentration in 'C' key """ + time_units=unumToPint(time_units) + Q = unumToPint(Q) + q_units=unumToPint(q_units) finalxarray = self.getDosage(Q=Q, time_units=time_units, q_units=q_units) dDosage = finalxarray['Dosage'].diff('datetime').to_dataset().rename({'Dosage': 'dDosage'}) diff --git a/hera/simulations/LSM/template.py b/hera/simulations/LSM/template.py index 2e0fa7367..14215b897 100644 --- a/hera/simulations/LSM/template.py +++ b/hera/simulations/LSM/template.py @@ -320,6 +320,9 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition def prepareParams(desc, paramsToPrepare): logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams") try: + params = dict(desc['params']) + params.update(paramsToPrepare) + paramsToPrepare=params if desc is not None and 'units' in desc: for key in desc["units"].keys(): param_item= paramsToPrepare[key] @@ -445,7 +448,7 @@ def getSimulationByID(self,id): def getSimulationByName(self,simulationName): """ - get a simulation by document id + get a simulation by document name :param id: :return: diff --git a/hera/utils/matplotlibCountour.py b/hera/utils/matplotlibCountour.py index 803c422ca..3297b9ff6 100644 --- a/hera/utils/matplotlibCountour.py +++ b/hera/utils/matplotlibCountour.py @@ -31,7 +31,7 @@ def toGeopandas(ContourData, inunits=None): import geopandas except ImportError: print("gis support not installed. ") - inunits = inunits if inunits is not None else 1*ureg.m + inunits = unumToPint(inunits) if inunits is not None else 1*ureg.m units_conversion = unumToPint(inunits).m_as(ureg.m) polyList = [] From 4a4376c15921039063239d964861c6d1f983316a Mon Sep 17 00:00:00 2001 From: LiorAntonov Date: Tue, 14 Jul 2026 08:10:04 +0300 Subject: [PATCH 2/5] syntax fix and missing __all__ --- hera/riskassessment/__init__.py | 2 ++ .../presentation/casualtiesFigs.py | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/hera/riskassessment/__init__.py b/hera/riskassessment/__init__.py index 131535b5f..2f35a13e5 100644 --- a/hera/riskassessment/__init__.py +++ b/hera/riskassessment/__init__.py @@ -4,3 +4,5 @@ from .presentation.casualtiesFigs import casualtiesPlot from .protectionpolicy.ProtectionPolicy import ProtectionPolicy from .riskToolkit import RiskToolkit + +__all__ = ["Agent", "thresholdGeoDataFrame", "getRiskAreaAlgorithm", "casualtiesPlot", "ProtectionPolicy", "RiskToolkit"] diff --git a/hera/riskassessment/presentation/casualtiesFigs.py b/hera/riskassessment/presentation/casualtiesFigs.py index 94914537c..472bb36da 100644 --- a/hera/riskassessment/presentation/casualtiesFigs.py +++ b/hera/riskassessment/presentation/casualtiesFigs.py @@ -1,21 +1,20 @@ -import numpy import matplotlib.pyplot as plt import mpl_toolkits.axisartist.floating_axes as floating_axes -import mpl_toolkits.axisartist.angle_helper as angle_helper -from matplotlib.projections import PolarAxes -from mpl_toolkits.axisartist.grid_finder import (FixedLocator, MaxNLocator, - DictFormatter) -from matplotlib.patches import Polygon as MplPolygon -from shapely.geometry import (Polygon, MultiPolygon, LineString, Multi LineString, Point, MultiPoint, Geometry Collection) +import numpy import pandas -from ...utils import toMeteorologicalAngle,toMathematicalAngle, toAzimuthAngle +from matplotlib.patches import Polygon as MplPolygon +from matplotlib.projections import PolarAxes +from mpl_toolkits.axisartist.grid_finder import DictFormatter, FixedLocator +from shapely.geometry import LineString, Point, Polygon + +from ...utils import toAzimuthAngle, toMathematicalAngle + -from descartes import PolygonPatch -def plot_geom(ax, geom, patch Prop, lineProp): +def plot_geom(ax, geom, patchProp, lineProp): if geom.is_empty: return if isinstance(geom, Polygon): - patch MplPolygon(list(geom.exterior.coords), + patch=MplPolygon(list(geom.exterior.coords), closed=True, **patchProp) ax.add_patch(patch) @@ -29,7 +28,7 @@ def plot_geom(ax, geom, patch Prop, lineProp): plt.plot(x,y,**lineProp) else: for gg in geom.geoms: - plot_geom(ax,gg, patch Prop, lineProp) + plot_geom(ax,gg, patchProp, lineProp) class casualtiesPlot(object): @@ -80,7 +79,7 @@ def plotCasualtiesRose(self, projectedData.append(injuryareas) projectedData = pandas.concat(projectedData) - pivotedData = projectedData.pivot(index="angle", columns='severity', values=effected Population).reset_index().fillna(0) + pivotedData = projectedData.pivot(index="angle", columns='severity', values=effectedPopulation).reset_index().fillna(0) if (ax is None): fig = plt.gcf() ax = fig.add_subplot(111,polar=True) @@ -220,7 +219,6 @@ def plotCasualtiesProjection(self, boundarycycler = plt.cycler(color=plt.rcParams['axes.prop_cycle'].by_key()['color']) if boundarycycler is None else boundarycycler cycler = plt.cycler(facecolor=plt.rcParams['axes.prop_cycle'].by_key()['color'])*plt.cycler(edgecolor=['None']) if cycler is None else cycler - patchList = [] for severity,prop,lineprop in zip(severityList,cycler,boundarycycler): if severity not in projected.index: continue From f1e165b14c22ef0ec4d5195947afa49fc19aa3e9 Mon Sep 17 00:00:00 2001 From: LiorAntonov Date: Tue, 14 Jul 2026 08:47:34 +0300 Subject: [PATCH 3/5] further fix prepareParams --- hera/simulations/LSM/template.py | 42 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/hera/simulations/LSM/template.py b/hera/simulations/LSM/template.py index 14215b897..24853fbc7 100644 --- a/hera/simulations/LSM/template.py +++ b/hera/simulations/LSM/template.py @@ -1,18 +1,20 @@ -import os import glob -from hera.utils.logging.helpers import get_logger -import xarray -import pandas -import numpy +import os from itertools import product -from ..utils.inputForModelsCreation import InputForModelsCreator -from hera.simulations.LSM.singleSimulation import SingleSimulation -from hera.datalayer import datatypes -from hera.utils.unitHandler import Quantity, ureg, unumToPint +import numpy +import pandas +import xarray + from hera import toolkit -from hera.utils.jsonutils import JSONToConfiguration, stripConfigurationUnits +from hera.datalayer import datatypes +from hera.simulations.LSM.singleSimulation import SingleSimulation from hera.utils import dictToMongoQuery, get_classMethod_logger +from hera.utils.jsonutils import JSONToConfiguration, stripConfigurationUnits +from hera.utils.logging.helpers import get_logger +from hera.utils.unitHandler import Quantity, unumToPint, ureg + +from ..utils.inputForModelsCreation import InputForModelsCreator class LSMTemplate: @@ -119,7 +121,7 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition updated_params.update(params) updated_params.update(descriptor) updated_params = JSONToConfiguration(updated_params) - updated_params = self.prepareParams(desc=self._document['desc'], paramsToPrepare=updated_params) + updated_params = self.prepareParams(template_desc=self._document['desc'], paramsToPrepare=updated_params) logger.info(f"Running simulation with the following parameters:\n{updated_params}") if topography is None: updated_params.update(homogeneousWind=".TRUE.") @@ -317,22 +319,22 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition return None @staticmethod - def prepareParams(desc, paramsToPrepare): + def prepareParams(template_desc:dict, paramsToPrepare): logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams") + params = template_desc.get(['params'], {}) + params.update(paramsToPrepare) + paramsToPrepare=params try: - params = dict(desc['params']) - params.update(paramsToPrepare) - paramsToPrepare=params - if desc is not None and 'units' in desc: - for key in desc["units"].keys(): + if template_desc is not None and 'units' in template_desc: + for key in template_desc["units"].keys(): param_item= paramsToPrepare[key] if hasattr(param_item, 'asNumber') or hasattr(param_item, 'magnitude'): - paramsToPrepare[key] = unumToPint(param_item).m_as(ureg.parse_expression(desc["units"][key])) + paramsToPrepare[key] = unumToPint(param_item).m_as(ureg.parse_expression(template_desc["units"][key])) elif key=='duration': paramsToPrepare[key] = param_item*ureg.minutes else: - paramsToPrepare[key] = ureg.parse_expression(param_item).m_as(ureg.parse_expression(desc["units"][key])) - except: + paramsToPrepare[key] = ureg.parse_expression(param_item).m_as(ureg.parse_expression(template_desc["units"][key])) + except Exception: raise ValueError(f"parameters must use either pint or unum to specify units, currently type({param_item})={type(param_item)}") paramsToPrepare = stripConfigurationUnits(paramsToPrepare, returnStandardize=True, ignoreStandardization=["duration"]) From 7bb9e1946c85bada2b4f6d47760f013ca912714f Mon Sep 17 00:00:00 2001 From: LiorAntonov Date: Tue, 14 Jul 2026 09:20:34 +0300 Subject: [PATCH 4/5] typo --- hera/simulations/LSM/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hera/simulations/LSM/template.py b/hera/simulations/LSM/template.py index 24853fbc7..880a2d59e 100644 --- a/hera/simulations/LSM/template.py +++ b/hera/simulations/LSM/template.py @@ -321,7 +321,7 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition @staticmethod def prepareParams(template_desc:dict, paramsToPrepare): logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams") - params = template_desc.get(['params'], {}) + params = template_desc.get('params', {}) params.update(paramsToPrepare) paramsToPrepare=params try: From 9081e3b78d8e12e254197753af0883318a64f8e9 Mon Sep 17 00:00:00 2001 From: LiorAntonov Date: Tue, 14 Jul 2026 10:04:49 +0300 Subject: [PATCH 5/5] fit test --- hera/simulations/LSM/template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hera/simulations/LSM/template.py b/hera/simulations/LSM/template.py index 880a2d59e..5f3cd78c5 100644 --- a/hera/simulations/LSM/template.py +++ b/hera/simulations/LSM/template.py @@ -319,9 +319,9 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition return None @staticmethod - def prepareParams(template_desc:dict, paramsToPrepare): + def prepareParams(template_desc, paramsToPrepare): logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams") - params = template_desc.get('params', {}) + params = template_desc.get('params', {}) if template_desc is not None else {} params.update(paramsToPrepare) paramsToPrepare=params try: