|
|
|
from collections import namedtuple
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
ExposureSetting = namedtuple("ExposureSetting", ["channel", "time"])
|
|
|
|
|
|
|
|
|
|
|
|
def test_split(data_frame_with_params):
|
|
|
|
from sensospot_data.utils import split
|
|
|
|
|
|
|
|
result = split(data_frame_with_params, "Well.Row")
|
|
|
|
|
|
|
|
assert set(result.keys()) == set("ABC")
|
|
|
|
for key, value_df in result.items():
|
|
|
|
assert set(value_df["Well.Row"].unique()) == {key}
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"value,expected",
|
|
|
|
[
|
|
|
|
[[1, 2], True],
|
|
|
|
[(1, 2), True],
|
|
|
|
[{1, 2}, False],
|
|
|
|
[{1: 2}, False],
|
|
|
|
["1, 2", False],
|
|
|
|
[None, False],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_is_list_or_tuple(value, expected):
|
|
|
|
from sensospot_data.utils import _is_list_or_tuple
|
|
|
|
|
|
|
|
result = _is_list_or_tuple(value)
|
|
|
|
|
|
|
|
assert result is expected
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"value,expected",
|
|
|
|
[
|
|
|
|
[1, True],
|
|
|
|
[1.2, True],
|
|
|
|
[{1, 2}, False],
|
|
|
|
[{1: 2}, False],
|
|
|
|
["1", False],
|
|
|
|
[None, False],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_is_numerical(value, expected):
|
|
|
|
from sensospot_data.utils import _is_numerical
|
|
|
|
|
|
|
|
result = _is_numerical(value)
|
|
|
|
|
|
|
|
assert result is expected
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_valid_exposure_map_entry_ok():
|
|
|
|
from sensospot_data.utils import _check_valid_exposure_map_entry
|
|
|
|
|
|
|
|
result = _check_valid_exposure_map_entry((2, 1))
|
|
|
|
|
|
|
|
assert result is None
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"value", [[], [1], (1, 2, 3), {"a": 1, "b": 2}, ("A", "B")]
|
|
|
|
)
|
|
|
|
def test_check_valid_exposure_map_entry_raises_error(value):
|
|
|
|
from sensospot_data.utils import _check_valid_exposure_map_entry
|
|
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
_check_valid_exposure_map_entry(value)
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_exposure_map_ok(exposure_df):
|
|
|
|
from sensospot_data.utils import _check_exposure_map
|
|
|
|
|
|
|
|
exposure_map = {1: ("A", 10), 2: ("B", 20), 3: ("C", 30)}
|
|
|
|
|
|
|
|
result = _check_exposure_map(exposure_df, exposure_map)
|
|
|
|
|
|
|
|
assert result is None
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_exposure_map_wrong_type(exposure_df):
|
|
|
|
from sensospot_data.utils import _check_exposure_map
|
|
|
|
|
|
|
|
exposure_map = []
|
|
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
_check_exposure_map(exposure_df, exposure_map)
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_exposure_map_wrong_ids(exposure_df):
|
|
|
|
from sensospot_data.utils import _check_exposure_map
|
|
|
|
|
|
|
|
exposure_map = {1: ("A", 10), 2: ("B", 20), 4: ("D", 40)}
|
|
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
_check_exposure_map(exposure_df, exposure_map)
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_exposure_map_invalid_entries(exposure_df):
|
|
|
|
from sensospot_data.utils import _check_exposure_map
|
|
|
|
|
|
|
|
exposure_map = {1: ("A", 10), 2: ("B", 20), 3: "ERROR"}
|
|
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
_check_exposure_map(exposure_df, exposure_map)
|
|
|
|
|
|
|
|
|
|
|
|
def test_infer_exposure_from_parameters(data_frame_with_params):
|
|
|
|
from sensospot_data.utils import _set_exposure_data_from_parameters
|
|
|
|
|
|
|
|
result = _set_exposure_data_from_parameters(data_frame_with_params)
|
|
|
|
|
|
|
|
assert all(result["Exposure.Channel"] == result["Parameters.Channel"])
|
|
|
|
assert all(result["Exposure.Time"] == result["Parameters.Time"])
|
|
|
|
|
|
|
|
|
|
|
|
def test_infer_exposure_from_parameters_raises_error(
|
|
|
|
data_frame_without_params,
|
|
|
|
):
|
|
|
|
from sensospot_data.utils import _set_exposure_data_from_parameters
|
|
|
|
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
_set_exposure_data_from_parameters(data_frame_without_params)
|
|
|
|
|
|
|
|
assert str(excinfo.value).startswith("Exposure Map: measurement")
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_exposure_map(data_frame_with_params):
|
|
|
|
from sensospot_data.utils import apply_exposure_map
|
|
|
|
|
|
|
|
exposure_map = {
|
|
|
|
1: ExposureSetting("Cy3", 100),
|
|
|
|
2: ExposureSetting("Cy5", 15),
|
|
|
|
3: ExposureSetting("Cy5", 150),
|
|
|
|
}
|
|
|
|
|
|
|
|
result = apply_exposure_map(data_frame_with_params, exposure_map)
|
|
|
|
|
|
|
|
for key, value in exposure_map.items():
|
|
|
|
mask = result["Exposure.Id"] == key
|
|
|
|
partial = result.loc[mask]
|
|
|
|
assert set(partial["Exposure.Channel"].unique()) == {value.channel}
|
|
|
|
assert set(partial["Exposure.Time"].unique()) == {value.time}
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_exposure_map_raises_error(data_frame_with_params):
|
|
|
|
from sensospot_data.utils import apply_exposure_map
|
|
|
|
|
|
|
|
exposure_map = {
|
|
|
|
1: ExposureSetting("Cy3", 100),
|
|
|
|
2: ExposureSetting("Cy5", 15),
|
|
|
|
"X": ExposureSetting("Cy5", 150),
|
|
|
|
}
|
|
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
apply_exposure_map(data_frame_with_params, exposure_map)
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_exposure_map_from_parameters(data_frame_with_params):
|
|
|
|
from sensospot_data.utils import apply_exposure_map
|
|
|
|
|
|
|
|
result = apply_exposure_map(data_frame_with_params, None)
|
|
|
|
|
|
|
|
assert all(result["Exposure.Channel"] == result["Parameters.Channel"])
|
|
|
|
assert all(result["Exposure.Time"] == result["Parameters.Time"])
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_exposure_map_from_parameters_raises_error(
|
|
|
|
data_frame_without_params,
|
|
|
|
):
|
|
|
|
from sensospot_data.utils import apply_exposure_map
|
|
|
|
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
apply_exposure_map(data_frame_without_params, None)
|
|
|
|
|
|
|
|
assert str(excinfo.value).startswith("Exposure Map: measurement")
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_map(exposure_df):
|
|
|
|
from sensospot_data.utils import apply_map
|
|
|
|
|
|
|
|
map = {
|
|
|
|
1: {"SomeColumn": "A", "OtherColumn": 9},
|
|
|
|
2: {"SomeColumn": "B", "OtherColumn": 8},
|
|
|
|
3: {"SomeColumn": "C", "OtherColumn": 7},
|
|
|
|
}
|
|
|
|
|
|
|
|
result = apply_map(exposure_df, map, "Exposure.Id")
|
|
|
|
|
|
|
|
for key, value in map.items():
|
|
|
|
mask = result["Exposure.Id"] == key
|
|
|
|
partial = result.loc[mask]
|
|
|
|
assert set(partial["SomeColumn"].unique()) == {value["SomeColumn"]}
|
|
|
|
assert set(partial["OtherColumn"].unique()) == {value["OtherColumn"]}
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_map_keys_not_in_df(exposure_df):
|
|
|
|
from sensospot_data.utils import apply_map
|
|
|
|
|
|
|
|
map = {
|
|
|
|
1: {"some_col": "A", "other_col": 9},
|
|
|
|
2: {"some_col": "B", "other_col": 8},
|
|
|
|
3: {"some_col": "C", "other_col": 7},
|
|
|
|
4: {"some_col": "D", "other_col": 6},
|
|
|
|
}
|
|
|
|
|
|
|
|
result = apply_map(exposure_df, map, "Exposure.Id")
|
|
|
|
|
|
|
|
for key in (1, 2, 3):
|
|
|
|
value = map[key]
|
|
|
|
mask = result["Exposure.Id"] == key
|
|
|
|
partial = result.loc[mask]
|
|
|
|
assert set(partial["some_col"].unique()) == {value["some_col"]}
|
|
|
|
assert set(partial["other_col"].unique()) == {value["other_col"]}
|
|
|
|
|
|
|
|
assert "D" not in set(result["some_col"].unique())
|
|
|
|
assert "6" not in set(result["other_col"].unique())
|
|
|
|
|
|
|
|
|
|
|
|
def test_apply_map_not_all_keys_map_to_df(exposure_df):
|
|
|
|
from sensospot_data.utils import apply_map
|
|
|
|
|
|
|
|
map = {
|
|
|
|
1: {"some_col": "A", "other_col": 9},
|
|
|
|
3: {"some_col": "C", "other_col": 7},
|
|
|
|
}
|
|
|
|
|
|
|
|
result = apply_map(exposure_df, map, "Exposure.Id")
|
|
|
|
|
|
|
|
assert not result.iloc[0].hasnans
|
|
|
|
assert result.iloc[1].hasnans
|
|
|
|
assert not result.iloc[2].hasnans
|
|
|
|
|
|
|
|
assert result["some_col"].hasnans
|
|
|
|
assert result["other_col"].hasnans
|