From 5119bd5488561dbc65777d1186b4a006df18a167 Mon Sep 17 00:00:00 2001 From: Katy Barnhart Date: Fri, 14 Feb 2020 16:07:47 -0700 Subject: [PATCH 1/3] wip --- umami/calculations/metric/drainage_density.py | 72 +++++++++++++++++++ umami/metric.py | 1 + umami/residual.py | 1 + 3 files changed, 74 insertions(+) create mode 100644 umami/calculations/metric/drainage_density.py diff --git a/umami/calculations/metric/drainage_density.py b/umami/calculations/metric/drainage_density.py new file mode 100644 index 0000000..caf7e8a --- /dev/null +++ b/umami/calculations/metric/drainage_density.py @@ -0,0 +1,72 @@ +""" +""" +from landlab.components import DrainageDensity + + +def _validate_drainage_density(drainage_density): + if not isinstance(drainage_density, DrainageDensity): + msg = "umami: A valid instance of a DrainageDensity is required." + raise ValueError(msg) + + +def chi_intercept(drainage_density): + r"""Return the intercept to a linear fit through a :math:`\chi`-z plot. + + This is a loose wrapper around the Landlab function + `DrainageDensity.calculate_drainage_density`_. + + .. _DrainageDensity.calculate_drainage_density: + + Parameters + ---------- + drainage_density : an instance of a `DrainageDensity`_ + + + .. _DrainageDensity: + + + Returns + ------- + out : float + The intercept value. + + Examples + -------- + First an example that only uses the ``calculate_drainage_density`` function. + + >>> import numpy as np + >>> from landlab import RasterModelGrid + >>> from landlab.components import FlowAccumulator, DrainageDensity + >>> from umami.calculations import drainage_density + >>> grid = RasterModelGrid((10, 10)) + >>> z = grid.add_zeros("node", "topographic__elevation") + >>> z += grid.x_of_node**2 + grid.y_of_node**2 + >>> fa = FlowAccumulator(grid) + >>> fa.run_one_step() + >>> dd = DrainageDensity(grid, ) + >>> drainage_density = dd.calculate_drainage_density() + >>> np.round(drainage_density(cf), decimals=0) + -4.0 + + Next, the same calculations are shown as part of an umami ``Metric``. + + >>> from io import StringIO + >>> from umami import Metric + >>> grid = RasterModelGrid((10, 10)) + >>> z = grid.add_zeros("node", "topographic__elevation") + >>> z += grid.x_of_node**2 + grid.y_of_node**2 + >>> file_like=StringIO(''' + ... ci: + ... _func: drainage_density + ... ''') + >>> metric = Metric(grid, drainage_density_kwds={"min_drainage_area": 1.0}) + >>> metric.add_from_file(file_like) + >>> metric.names + ['ci'] + >>> metric.calculate() + >>> np.round(metric.values, decimals=0) + array([-4.]) + """ + _validate_drainage_density(drainage_density) + slp, incp = drainage_density.best_fit_chi_elevation_gradient_and_intercept() + return incp diff --git a/umami/metric.py b/umami/metric.py index 2798ac6..f4cfa9e 100755 --- a/umami/metric.py +++ b/umami/metric.py @@ -24,6 +24,7 @@ def __init__( grid, flow_accumulator_kwds=None, chi_finder_kwds=None, + drainage_density_kwds=None, metrics=None, ): """ diff --git a/umami/residual.py b/umami/residual.py index 2880ad2..62f2c2f 100644 --- a/umami/residual.py +++ b/umami/residual.py @@ -30,6 +30,7 @@ def __init__( data, flow_accumulator_kwds=None, chi_finder_kwds=None, + drainage_density_kwds=None, residuals=None, ): """ From ee37c7ccb9c295f01df10ef8b0ff4cbdfb9f1164 Mon Sep 17 00:00:00 2001 From: Katy Barnhart Date: Mon, 17 Feb 2020 08:20:35 -0700 Subject: [PATCH 2/3] add to docs --- docs/source/umami.calculations.metric.drainage_density.rst | 7 +++++++ docs/source/umami.calculations.rst | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 docs/source/umami.calculations.metric.drainage_density.rst diff --git a/docs/source/umami.calculations.metric.drainage_density.rst b/docs/source/umami.calculations.metric.drainage_density.rst new file mode 100644 index 0000000..5c92ddb --- /dev/null +++ b/docs/source/umami.calculations.metric.drainage_density.rst @@ -0,0 +1,7 @@ +drainage_density: calculate drainage_density +-------------------------------------------- + +.. automodule:: umami.calculations.metric.drainage_density + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/umami.calculations.rst b/docs/source/umami.calculations.rst index c00fdfc..4612f55 100644 --- a/docs/source/umami.calculations.rst +++ b/docs/source/umami.calculations.rst @@ -11,9 +11,11 @@ Calculations for Metrics or Residuals umami.calculations.metric.aggregate umami.calculations.metric.chi_intercept_gradient umami.calculations.metric.count_equal + umami.calculations.metric.drainage_density umami.calculations.metric.hypsometric_integral umami.calculations.metric.watershed_aggregation + Calculations for Residuals only ------------------------------- From 20b0f3179e148c3717cfd24d4cefe1925381175f Mon Sep 17 00:00:00 2001 From: Katy Barnhart Date: Mon, 17 Feb 2020 08:20:46 -0700 Subject: [PATCH 3/3] wip on metric --- umami/calculations/metric/drainage_density.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/umami/calculations/metric/drainage_density.py b/umami/calculations/metric/drainage_density.py index caf7e8a..30311ef 100644 --- a/umami/calculations/metric/drainage_density.py +++ b/umami/calculations/metric/drainage_density.py @@ -9,8 +9,8 @@ def _validate_drainage_density(drainage_density): raise ValueError(msg) -def chi_intercept(drainage_density): - r"""Return the intercept to a linear fit through a :math:`\chi`-z plot. +def drainage_density(drainage_density): + r"""Return the drainage density. This is a loose wrapper around the Landlab function `DrainageDensity.calculate_drainage_density`_. @@ -28,7 +28,7 @@ def chi_intercept(drainage_density): Returns ------- out : float - The intercept value. + The drainage density. Examples -------- @@ -43,9 +43,14 @@ def chi_intercept(drainage_density): >>> z += grid.x_of_node**2 + grid.y_of_node**2 >>> fa = FlowAccumulator(grid) >>> fa.run_one_step() + + The Landlab ``DrainageDensity`` component can be initialized with either + an area exponent and coefficient, a slope exponent and coefficient, and a + threshold, OR a mask. Umami can support either of these options. + >>> dd = DrainageDensity(grid, ) >>> drainage_density = dd.calculate_drainage_density() - >>> np.round(drainage_density(cf), decimals=0) + >>> np.round(drainage_density(dd), decimals=1) -4.0 Next, the same calculations are shown as part of an umami ``Metric``. @@ -56,17 +61,19 @@ def chi_intercept(drainage_density): >>> z = grid.add_zeros("node", "topographic__elevation") >>> z += grid.x_of_node**2 + grid.y_of_node**2 >>> file_like=StringIO(''' - ... ci: + ... dd: ... _func: drainage_density ... ''') - >>> metric = Metric(grid, drainage_density_kwds={"min_drainage_area": 1.0}) + >>> metric = Metric( + ... grid, + ... drainage_density_kwds={"min_drainage_area": 1.0}) >>> metric.add_from_file(file_like) >>> metric.names - ['ci'] + ['dd'] >>> metric.calculate() >>> np.round(metric.values, decimals=0) array([-4.]) """ _validate_drainage_density(drainage_density) - slp, incp = drainage_density.best_fit_chi_elevation_gradient_and_intercept() - return incp + dd = drainage_density.calculate_drainage_density() + return dd