Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions hera/riskassessment/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
42 changes: 30 additions & 12 deletions hera/riskassessment/presentation/casualtiesFigs.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,35 @@
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)

import numpy
import pandas
from ...utils import toMeteorologicalAngle,toMathematicalAngle, toAzimuthAngle

from descartes import PolygonPatch

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


def plot_geom(ax, geom, patchProp, 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, patchProp, lineProp)

class casualtiesPlot(object):

"""
Expand Down Expand Up @@ -60,7 +79,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=effectedPopulation).reset_index().fillna(0)
if (ax is None):
fig = plt.gcf()
ax = fig.add_subplot(111,polar=True)
Expand Down Expand Up @@ -200,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
Expand Down
3 changes: 3 additions & 0 deletions hera/simulations/LSM/singleSimulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'})
Expand Down
41 changes: 23 additions & 18 deletions hera/simulations/LSM/template.py
Original file line number Diff line number Diff line change
@@ -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:
Expand Down Expand Up @@ -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.")
Expand Down Expand Up @@ -317,19 +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, paramsToPrepare):
logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams")
params = template_desc.get('params', {}) if template_desc is not None else {}
params.update(paramsToPrepare)
paramsToPrepare=params
try:
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"])
Expand Down Expand Up @@ -445,7 +450,7 @@ def getSimulationByID(self,id):

def getSimulationByName(self,simulationName):
"""
get a simulation by document id
get a simulation by document name

:param id:
:return:
Expand Down
2 changes: 1 addition & 1 deletion hera/utils/matplotlibCountour.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down
Loading