Skip to content
Closed
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
17 changes: 4 additions & 13 deletions hera/riskassessment/agents/Agents.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from hera.utils.unitHandler import ureg, Unum, Quantity, celsius, K
from hera.utils.unitHandler import ureg, unumToPint, Quantity, celsius, K
from hera.riskassessment.agents.effects import injuryfactory
import numpy
import json
Expand Down Expand Up @@ -254,10 +254,7 @@ def getVolatility(self,temperature):
:return:
The vapor saturation as Unum.
"""
if isinstance(temperature, Unum):
temperature = temperature.asNumber(celsius)
elif isinstance(temperature, Quantity):
temperature = temperature.m_as(ureg.celsius)
temperature = unumToPint(temperature).m_as(ureg.celsius)
MW = self.getMolecularWeight().to(ureg.g/ureg.mol)

a,b,c,d = self._volatilityConst
Expand All @@ -277,10 +274,7 @@ def getDensity(self, temperature):
:return:
The density as Unum
"""
if isinstance(temperature, Unum):
temperature = temperature.asNumber(celsius)
elif isinstance(temperature, Quantity):
temperature = temperature.m_as(ureg.celsius)
temperature = unumToPint(temperature).m_as(ureg.celsius)
a,b,c = self._densityConst

return (a-b*(temperature-c))*ureg.g/ureg.cm**3
Expand All @@ -299,10 +293,7 @@ def vaporPressure(self, temperature):
float
Vapor pressure in bar.
"""
if isinstance(temperature, Unum):
temperature = temperature.asNumber(K)
elif isinstance(temperature, Quantity):
temperature = temperature.m_as(ureg.kelvin)
temperature = unumToPint(temperature).m_as(ureg.kelvin)
A = self._vaporConst["A"]
B = self._vaporConst["B"]
C = self._vaporConst["C"]
Expand Down
23 changes: 10 additions & 13 deletions hera/riskassessment/agents/effects/Calculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
import pandas
from hera.utils import ureg
import xarray
from utils.unitHandler import unumToPint

class AbstractCalculator(object):

class AbstractCalculator(object):
"""
Holds the abstract calculator.
"""
Expand Down Expand Up @@ -88,11 +90,10 @@ def calculate(self,concentrationField,breathingRate=10*ureg.L/ureg.min,time="dat


"""
breathingRate = unumToPint(breathingRate)
breathingRatio = (breathingRate/self.injuryBreathingRate).magnitude
if inUnits is None:
if hasattr(concentrationField, "attrs"):
attrs_units = concentrationField.attrs.get("field", None)
inUnits = concentrationField.attrs[field] if attrs_units is not None else ureg.mg / ureg.m ** 3
inUnits = concentrationField.attrs[field] if hasattr(concentrationField, "attrs") else 1*(ureg.mg / ureg.m ** 3)

CunitConversion = inUnits.m_as(ureg.mg / ureg.m ** 3)

Expand Down Expand Up @@ -165,12 +166,10 @@ def calculate(self,concentrationField,field,breathingRate=10*ureg.L/ureg.min,tim


"""
breathingRate = unumToPint(breathingRate)
breathingRatio = (breathingRate/self.injuryBreathingRate).magnitude

if inUnits is None:
if hasattr(concentrationField, "attrs"):
attrs_units = concentrationField.attrs.get("field", None)
inUnits = concentrationField.attrs[field] if attrs_units is not None else ureg.mg / ureg.m ** 3
inUnits = concentrationField.attrs[field] if hasattr(concentrationField, "attrs") else 1*(ureg.mg / ureg.m ** 3)
CunitConversion = inUnits.m_as(ureg.mg / ureg.m ** 3)

if isinstance(concentrationField, xarray.Dataset):
Expand Down Expand Up @@ -236,12 +235,10 @@ def calculate(self,concentrationField,field,breathingRate=10*ureg.L/ureg.min,tim


"""
breathingRatio = (breathingRate / self.injuryBreathingRate).magnitude

breathingRate = unumToPint(breathingRate)
breathingRatio = (breathingRate/self.injuryBreathingRate).magnitude
if inUnits is None:
if hasattr(concentrationField, "attrs"):
attrs_units = concentrationField.attrs.get("field", None)
inUnits = attrs_units[field] if attrs_units is not None else ureg.mg / ureg.m ** 3
inUnits = concentrationField.attrs[field] if hasattr(concentrationField, "attrs") else 1*(ureg.mg / ureg.m ** 3)
CunitConversion = inUnits.m_as(ureg.mg / ureg.m ** 3)

if isinstance(concentrationField, xarray.Dataset):
Expand Down
9 changes: 4 additions & 5 deletions hera/riskassessment/agents/effects/Injury.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def _postCalculatePointWise(self, retList):
pass

def calculate(self, concentrationField, field, time="datetime", x="x", y="y", breathingRate=10 * ureg.L / ureg.min,
**parameters):
sel={},isel={}):
"""Deprecated. Use ``calculateRegionOfInjured`` instead."""
import warnings
warnings.warn("This function is obselete. Use calculateRegionOfInjured instead")
Expand All @@ -205,9 +205,9 @@ def calculate(self, concentrationField, field, time="datetime", x="x", y="y", br
x=x,
y=y,
breathingRate=breathingRate,
**parameters)
sel=sel,isel=isel)

def calculateRegionOfInjured(self,concentrationField,field,time="datetime",x="x",y="y",breathingRate=10*ureg.L / ureg.min,**parameters):
def calculateRegionOfInjured(self,concentrationField,field,time="datetime",x="x",y="y",breathingRate=10*ureg.L / ureg.min,sel={},isel={}):
"""
Calculates the fraction of the population that was effected in each point, and returns its contour.
The levels are determined by the injury type.
Expand Down Expand Up @@ -247,8 +247,7 @@ def calculateRegionOfInjured(self,concentrationField,field,time="datetime",x="x"
toxicLoads = self.calculateToxicLoads(concentrationField=concentrationField,
time=time,
breathingRate=breathingRate,
field=field,
**parameters).compute()
field=field).sel(**sel).isel(**isel).compute()
for lvl in self.levels:
data = lvl.calculateContours(toxicLoads=toxicLoads,time=time,x=x,y=y)
if data is not None:
Expand Down
3 changes: 2 additions & 1 deletion hera/riskassessment/agents/effects/InjuryLevel.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import geopandas
import pandas
from hera.utils import tounit, ureg
from hera.utils.unitHandler import unumToPint
import numpy
import json

Expand Down Expand Up @@ -338,7 +339,7 @@ def _getGeopandas(self,concentrationField,x,y,**parameters):
"""
Return the correct geopandas of the Injury level
"""
level = self.threshold.asNumber()
level = unumToPint(self.threshold).magnitude
CS = plt.contour(concentrationField[x],concentrationField[y],concentrationField.squeeze(),levels=numpy.atleast_1d(level))
if numpy.max(CS.levels) < level:
ret = geopandas.GeoDataFrame()
Expand Down
23 changes: 10 additions & 13 deletions hera/riskassessment/presentation/casualtiesFigs.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def plotCasualtiesRose(self,
projectedData.append(injuryareas)
projectedData = pandas.concat(projectedData)

pivotedData = projectedData.pivot("angle",'severity',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 All @@ -83,15 +83,15 @@ def plotCasualtiesRose(self,
cycler += plt.cycler(width=[weights]*len(severityList))

bottom = numpy.zeros(pivotedData.shape[0])
pivotedData["total"] = 0
for severity,plotprops in zip(severityList,cycler):
if severity not in pivotedData.columns:
continue

ax.bar(pivotedData["angle"],pivotedData[severity],label=severity,bottom=bottom,**plotprops)
bottom += pivotedData[severity]
pivotedData["total"] = 0
for severity in severityList:
pivotedData["total"] += pivotedData[severity]

if windDistribution is not None:
windDist = windDistribution.copy()
windTicks = [25,50,75,100] if windTicks is None else sorted(windTicks)
Expand Down Expand Up @@ -175,7 +175,9 @@ def plotCasualtiesProjection(self,
:cycler: a property cycler for the polygons.
:boundarycycler: a property cycler for the overall polygons.
"""
if (ax is None):
from hera.utils.matplotlibCountour import plot_polygons

if (ax is None):
fig = plt.gcf()
ax = fig.add_subplot(111)
elif isinstance(ax,list):
Expand All @@ -196,20 +198,15 @@ def plotCasualtiesProjection(self,
projected = retProj.dissolve("severity")

boundarycycler = plt.cycler(color=plt.rcParams['axes.prop_cycle'].by_key()['color']) if boundarycycler is None else boundarycycler
cycler = plt.cycler(fc=plt.rcParams['axes.prop_cycle'].by_key()['color'])*plt.cycler(ec=['None']) if cycler is None else cycler
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
if projected.loc[severity].geometry.filterType == 'GeometryCollection' or projected.loc[severity].geometry.filterType == 'MultiPolygon':
for pol in projected.loc[severity].geometry:
if pol.filterType == 'LineString':
ax.plot(*pol.xy,**lineprop)
else:
ax.add_patch(PolygonPatch(pol,**prop) )
else:
ax.add_patch(PolygonPatch(projected.loc[severity].geometry,**prop) )
geom =projected.loc[severity].geometry
plot_polygons(ax,geom,**prop)


for ((severity,severitydata),prop) in zip(results.shiftLocationAndAngle(loc,mathematical_angle=rotate_angle,geometry="TotalPolygon")
.query("severity in %s" % numpy.atleast_1d(plumSeverity))
Expand Down
8 changes: 2 additions & 6 deletions hera/simulations/LSM/singleSimulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import xarray
import numpy
import os
from hera.utils.unitHandler import *
from hera.utils.unitHandler import ureg, unumToPint

from ...utils import tounit,tonumber

Expand Down Expand Up @@ -67,10 +67,6 @@ def getDosage(self, Q=1 * ureg.kg, time_units=ureg.min, q_units=ureg.mg):
final_xarray.attrs['dt'] = dt_minutes.to(time_units)
final_xarray.attrs['Q'] = Q.to(q_units)
final_xarray.attrs['C'] = q_units/ ureg.m ** 3
if not ret_pint:
final_xarray.attrs['dt'] = pintToUnum(final_xarray.attrs['dt'])
final_xarray.attrs['Q'] = pintToUnum(final_xarray.attrs['Q'])
final_xarray.attrs['C'] = pintToUnum(final_xarray.attrs['C'])

Qfactor = (Q.to(q_units) * ureg.min / ureg.m ** 3).m_as(q_units * time_units / ureg.m ** 3)

Expand Down Expand Up @@ -101,7 +97,7 @@ def getConcentration(self, Q=1*ureg.kg, time_units=ureg.min, q_units=ureg.mg):
finalxarray = self.getDosage(Q=Q, time_units=time_units, q_units=q_units)

dDosage = finalxarray['Dosage'].diff('datetime').to_dataset().rename({'Dosage': 'dDosage'})
dDosage['C'] = dDosage['dDosage'] / finalxarray.attrs['dt']
dDosage['C'] = dDosage['dDosage'] / finalxarray.attrs['dt'].m_as(time_units)
dDosage.attrs = finalxarray.attrs

return dDosage
Expand Down
45 changes: 30 additions & 15 deletions hera/simulations/LSM/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from ..utils.inputForModelsCreation import InputForModelsCreator
from hera.simulations.LSM.singleSimulation import SingleSimulation
from hera.datalayer import datatypes
from hera.utils.unitHandler import Quantity, ureg, Unum
from hera.utils.unitHandler import Quantity, ureg, unumToPint
from hera import toolkit
from hera.utils.jsonutils import JSONToConfiguration, stripConfigurationUnits
from hera.utils import dictToMongoQuery, get_classMethod_logger
Expand Down Expand Up @@ -160,6 +160,11 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition
f"{toolkit.TOOLKIT_SAVEMODE_FILEANDDB_REPLACE} in order to replace it.")
if saveMode == toolkit.TOOLKIT_SAVEMODE_FILEANDDB_REPLACE:
docList.delete()

curr_counter = self.Toolkit.getCounterAndAdd(f"LSM_SIMULATION_{self.Toolkit.projectName}")
simulationName = simulationName if simulationName is not None else f"LSM_Simulation_{curr_counter}"
saveDir = os.path.join(saveDir, simulationName)

doc = self.Toolkit.addSimulationsDocument(
type=self.doctype_simulation,
resource='None',
Expand All @@ -170,8 +175,7 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition
simulationName=simulationName,
params=updated_params)
)
curr_counter = self.Toolkit.getCounterAndAdd(f"LSM_SIMULATION_{self.Toolkit.projectName}")
saveDir = os.path.join(saveDir, f"LSM_Simulation_{curr_counter}")

if self.to_xarray:
doc['resource'] = os.path.join(saveDir, 'netcdf', '*')
doc['dataFormat'] = datatypes.NETCDF_XARRAY
Expand Down Expand Up @@ -315,17 +319,19 @@ def run(self,topography=None, stations=None,canopy=None,params=dict(),deposition
@staticmethod
def prepareParams(desc, paramsToPrepare):
logger = get_logger(instance=None, name="hera.simulations.LSM.prepareParams")
if desc is not None and 'units' in desc:
for key in desc["units"].keys():
param_item= paramsToPrepare[key]
if isinstance(param_item, Unum):
paramsToPrepare[key] = param_item.asNumber(eval(desc["units"][key]))
elif isinstance(param_item, Quantity):
paramsToPrepare[key] = param_item.m_as(desc["units"][key])
else:
raise ValueError(f"parameters must use either pint or unum to specify units, currently type({param_item})={type(param_item)}")
if 'duration' in paramsToPrepare and isinstance(paramsToPrepare['duration'], Quantity):
paramsToPrepare['duration'] = paramsToPrepare['duration'].to(ureg.minutes)
try:
if desc is not None and 'units' in desc:
for key in 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]))
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:
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"])
for integer_field in ["TopoXn", "TopoYn"]:
if not isinstance(paramsToPrepare[integer_field], int):
Expand Down Expand Up @@ -437,6 +443,15 @@ def getSimulationByID(self,id):
"""
return SingleSimulation(self.getDocumentByID(id))

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

:param id:
:return:
"""
return SingleSimulation(self.getSimulationsDocuments(type=self.doctype_simulation,templateName=self.templateName,simulationName=simulationName))

def _getSimulationsList(self, **query):
"""
List the Simulation parameters that fulfil the query
Expand Down Expand Up @@ -484,4 +499,4 @@ def getSimulationsTable(self,**query):

return df
except ValueError:
raise FileNotFoundError('No simulations.old found')
raise FileNotFoundError('No simulations found')
10 changes: 5 additions & 5 deletions hera/simulations/LSM/toolkit.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from ... import datalayer
from ... import toolkit
from .singleSimulation import SingleSimulation
from unum.units import *
from hera.utils.unitHandler import ureg, unumToPint
from ..utils.coordinateHandler import coordinateHandler
from pathlib import Path

Expand Down Expand Up @@ -238,10 +238,10 @@ def getSimulations(self,simulationName=None,unitsTemplateVersion="v4-general", *
for key in template._document['desc']["units"].keys():
if key in query.keys():
query_item= query[key]
if isinstance(query_item, Unum):
query[key] = query_item.asNumber(eval(template._document['desc']["units"][key]))
elif isinstance(query_item, Quantity):
query[key] = query_item.m_as(template._document['desc']["units"][key])
if hasattr(query_item, 'asNumber') or hasattr(query_item, 'magnitude'):
pint_item = unumToPint(query_item)
unit_expr = template._document['desc']["units"][key]
query[key] = pint_item.m_as(ureg.parse_expression(unit_expr))
else:
raise ValueError(f"query must use either pint or unum to specify units, currently type({query[key]})={type(query[key])}")
else:
Expand Down
17 changes: 12 additions & 5 deletions hera/simulations/deposition/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from ...datalayer import project
from ...riskassessment import AgentHome
from ..utils import tonumber, tounit
from unum.units import *
from hera.utils.unitHandler import ureg, unumToPint
import numpy

class depositionModels(object):
Expand Down Expand Up @@ -71,16 +71,23 @@ def depositionModel(self,newModel):
self._depositionModel=newModel

def __init__(self, projectName = "deposition", surface={"name":"Desert","zrough":0.04},
ustar=1, density=1500, diameter = 1E-6*m,heatFlux=0.1*W/(m**2), temperature=293*K, depositionModel="Petroff"):
ustar=1, density=1500, diameter=None, heatFlux=None, temperature=None, depositionModel="Petroff"):

if diameter is None:
diameter = 1E-6*ureg.m
if heatFlux is None:
heatFlux = 0.1*ureg.W/ureg.m**2
if temperature is None:
temperature = 293*ureg.K

p = project.Project(projectName)
self._depositionModel = depositionModel
self._ustar = ustar
self._density = density
self._temperature = tonumber(tounit(temperature,K),K)
self._temperature = tonumber(tounit(temperature, ureg.K), ureg.K)
self._surface = surface if type(surface)==dict else p.getCacheDocuments(type="surface",surface=surface)[0].asDict()["desc"]
self._diameter = tonumber(tounit(diameter,m),m)
self._heatFlux = tonumber(tounit(heatFlux, W/(m**2)), W/(m**2))
self._diameter = tonumber(tounit(diameter, ureg.m), ureg.m)
self._heatFlux = tonumber(tounit(heatFlux, ureg.W/ureg.m**2), ureg.W/ureg.m**2)

def depositionRate(self):
return getattr(self, f"depositionRate_{self._depositionModel}")()
Expand Down
Loading