76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
import numpy as np
|
|
import pytest
|
|
from tests.node_tests._shared import make_field
|
|
from backend.nodes.helpers import bool_to_mask
|
|
|
|
|
|
def test_basic_correlation():
|
|
from backend.nodes.grain_cross import GrainCross
|
|
|
|
node = GrainCross()
|
|
|
|
rng = np.random.default_rng(42)
|
|
data_a = rng.standard_normal((64, 64))
|
|
data_b = rng.standard_normal((64, 64))
|
|
field_a = make_field(data=data_a)
|
|
field_b = make_field(data=data_b)
|
|
|
|
# Create mask with two distinct grains
|
|
mask_bool = np.zeros((64, 64), dtype=bool)
|
|
mask_bool[5:20, 5:20] = True
|
|
mask_bool[40:55, 40:55] = True
|
|
mask = bool_to_mask(mask_bool)
|
|
|
|
(table,) = node.process(field_a, field_b, mask=mask,
|
|
property_a="mean_height", property_b="max_height",
|
|
min_size=10)
|
|
assert len(table) > 0, "Should return entries for detected grains"
|
|
|
|
|
|
def test_pearson_reported():
|
|
from backend.nodes.grain_cross import GrainCross
|
|
|
|
node = GrainCross()
|
|
|
|
rng = np.random.default_rng(7)
|
|
data_a = rng.standard_normal((64, 64))
|
|
data_b = rng.standard_normal((64, 64))
|
|
field_a = make_field(data=data_a)
|
|
field_b = make_field(data=data_b)
|
|
|
|
# Two grains so Pearson can be computed
|
|
mask_bool = np.zeros((64, 64), dtype=bool)
|
|
mask_bool[5:20, 5:20] = True
|
|
mask_bool[40:55, 40:55] = True
|
|
mask = bool_to_mask(mask_bool)
|
|
|
|
(table,) = node.process(field_a, field_b, mask=mask,
|
|
property_a="mean_height", property_b="mean_height",
|
|
min_size=10)
|
|
quantities = [row["quantity"] for row in table]
|
|
assert "Pearson r" in quantities, f"Expected 'Pearson r' in {quantities}"
|
|
|
|
|
|
def test_min_size_filters():
|
|
from backend.nodes.grain_cross import GrainCross
|
|
|
|
node = GrainCross()
|
|
|
|
data_a = np.zeros((64, 64))
|
|
data_b = np.zeros((64, 64))
|
|
field_a = make_field(data=data_a)
|
|
field_b = make_field(data=data_b)
|
|
|
|
# Small grain (10x10 = 100 pixels)
|
|
mask_bool = np.zeros((64, 64), dtype=bool)
|
|
mask_bool[5:15, 5:15] = True
|
|
mask = bool_to_mask(mask_bool)
|
|
|
|
# min_size larger than any grain
|
|
(table,) = node.process(field_a, field_b, mask=mask,
|
|
property_a="area", property_b="area",
|
|
min_size=200)
|
|
# No grain entries (only maybe no Pearson either since < 2 grains)
|
|
grain_entries = [r for r in table if r["quantity"].startswith("Grain")]
|
|
assert len(grain_entries) == 0, "No grains should pass with large min_size"
|