diff --git a/tests/test_networklength.py b/tests/test_networklength.py index 7262e04..71f860c 100644 --- a/tests/test_networklength.py +++ b/tests/test_networklength.py @@ -303,6 +303,103 @@ def test_get_network_distribution_different_fraction(): assert network_length == pytest.approx(expected_length) +def test_get_network_distribution_one_point(): + # Define inputs + primary_pts = np.array([[[1, 1], [2, 2], [3, 3]]]) + lateral_pts = np.array( + [[[4, 4], [5, 5]], [[6, 6], [np.nan, np.nan]]] + ) # One of the roots has only one point + bounding_box = (0, 0, 10, 10) + fraction = 2 / 3 + monocots = False + + # Call the function + network_length = get_network_distribution( + primary_pts, lateral_pts, bounding_box, fraction, monocots + ) + + # Define the expected result + # Only the valid roots should be considered in the calculation + lower_box = Polygon( + [(0, 10 - 10 * (2 / 3)), (0, 10), (10, 10), (10, 10 - 10 * (2 / 3))] + ) + expected_length = ( + LineString(primary_pts[0]).intersection(lower_box).length + + LineString(lateral_pts[0]).intersection(lower_box).length + ) + + # Assert that the result is as expected + assert network_length == pytest.approx(expected_length) + + +def test_get_network_distribution_empty_arrays(): + primary_pts = np.full((2, 2), np.nan) + lateral_pts = np.full((2, 2, 2), np.nan) + bounding_box = (0, 0, 10, 10) + + network_length = get_network_distribution(primary_pts, lateral_pts, bounding_box) + assert network_length == 0 + + +def test_get_network_distribution_with_nans(): + primary_pts = np.array([[1, 1], [2, 2], [np.nan, np.nan]]) + lateral_pts = np.array([[[4, 4], [5, 5], [np.nan, np.nan]]]) + bounding_box = (0, 0, 10, 10) + + network_length = get_network_distribution(primary_pts, lateral_pts, bounding_box) + + lower_box = Polygon( + [(0, 10 - 10 * (2 / 3)), (0, 10), (10, 10), (10, 10 - 10 * (2 / 3))] + ) + expected_length = ( + LineString(primary_pts[:-1]).intersection(lower_box).length + + LineString(lateral_pts[0, :-1]).intersection(lower_box).length + ) + + assert network_length == pytest.approx(expected_length) + + +def test_get_network_distribution_monocots(): + primary_pts = np.array([[1, 1], [2, 2], [3, 3]]) + lateral_pts = np.array([[[4, 4], [5, 5]]]) + bounding_box = (0, 0, 10, 10) + monocots = True + + network_length = get_network_distribution( + primary_pts, lateral_pts, bounding_box, monocots=monocots + ) + + lower_box = Polygon( + [(0, 10 - 10 * (2 / 3)), (0, 10), (10, 10), (10, 10 - 10 * (2 / 3))] + ) + expected_length = ( + LineString(lateral_pts[0]).intersection(lower_box).length + ) # Only lateral_pts are considered + + assert network_length == pytest.approx(expected_length) + + +def test_get_network_distribution_different_fraction(): + primary_pts = np.array([[1, 1], [2, 2], [3, 3]]) + lateral_pts = np.array([[[4, 4], [5, 5]]]) + bounding_box = (0, 0, 10, 10) + fraction = 0.5 + + network_length = get_network_distribution( + primary_pts, lateral_pts, bounding_box, fraction=fraction + ) + + lower_box = Polygon( + [(0, 10 - 10 * fraction), (0, 10), (10, 10), (10, 10 - 10 * fraction)] + ) + expected_length = ( + LineString(primary_pts).intersection(lower_box).length + + LineString(lateral_pts[0]).intersection(lower_box).length + ) + + assert network_length == pytest.approx(expected_length) + + def test_get_network_distribution(canola_h5): series = Series.load( canola_h5, primary_name="primary_multi_day", lateral_name="lateral_3_nodes"