Skip to content
19 changes: 18 additions & 1 deletion packages/scratch-core/src/conversion/export/mark.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
from pathlib import Path
from typing import Annotated, Any

import numpy as np
Comment thread
cfs-data marked this conversation as resolved.
from pydantic import Field

from scipy.io import loadmat
from container_models.base import ConfigBaseModel
from container_models.scan_image import ScanImage
from conversion.data_formats import Mark, MarkType
Expand Down Expand Up @@ -50,6 +51,22 @@ def save_mark(mark: Mark, path: Path) -> None:
save_as_compressed_binary(array=mark.scan_image.data, file_path=path)


def load_mark_from_mat_file(path: Path) -> Mark:
"""Load a `Mark` object from a .mat file."""
parsed = loadmat(str(path))
Comment thread
cfs-data marked this conversation as resolved.
container = parsed["data_struct"][0, 0]
mark = Mark(
scan_image=ScanImage(
data=np.asarray(container["depth_data"], dtype=np.float64),
scale_x=float(container["xdim"][0]),
scale_y=float(container["ydim"][0]),
),
mark_type=MarkType(str(container["mark_type"][0]).lower()),
# TODO: Parse `center` and `meta_data` from data struct
Comment thread
cfs-data marked this conversation as resolved.
)
return mark


def load_mark_from_path(path: Path, stem: str) -> Mark:
"""
Load a Mark object from JSON and NPZ files.
Expand Down
6 changes: 6 additions & 0 deletions packages/scratch-core/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ def baseline_images_dir() -> Path:
return TEST_ROOT / "resources" / "baseline_images"


@pytest.fixture(scope="session")
def matlab_marks_dir() -> Path:
"""Path to `Mark` instances saved as .mat file."""
return TEST_ROOT / "resources" / "matlab_marks"


@pytest.fixture(scope="session")
def scan_image_array(baseline_images_dir: Path) -> DepthData:
"""Build a fixture with ground truth image data."""
Expand Down
22 changes: 20 additions & 2 deletions packages/scratch-core/tests/conversion/export/test_mark.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import json
from pathlib import PosixPath
from pathlib import PosixPath, Path

import numpy as np
import pytest
from scipy.constants import micro

from container_models.scan_image import ScanImage
from conversion.data_formats import Mark, MarkType
from conversion.export.mark import ExportedMarkData, load_mark_from_path, save_mark
from conversion.export.mark import (
ExportedMarkData,
load_mark_from_path,
save_mark,
load_mark_from_mat_file,
)


@pytest.fixture()
Expand Down Expand Up @@ -264,3 +269,16 @@ def test_multiple_marks_in_directory(
assert loaded_mark2.mark_type == MarkType.CHAMBER_IMPRESSION
assert loaded_mark1.meta_data["id"] == 1
assert loaded_mark2.meta_data["id"] == 2

def test_load_mark_from_mat_file(self, tmp_path: PosixPath, matlab_marks_dir: Path):
"""Test that we can build a `Mark` instance from a .mat file."""
Comment thread
cfs-data marked this conversation as resolved.
# Arrange
Comment thread
cfs-data marked this conversation as resolved.
path = matlab_marks_dir / "processed.mat"
# Act
mark = load_mark_from_mat_file(path)
# Asserts
assert mark.mark_type == MarkType.BREECH_FACE_IMPRESSION
assert mark.scan_image.scale_x == pytest.approx(3.5e-6)
assert mark.scan_image.scale_y == pytest.approx(3.5e-6)
assert (mark.scan_image.width, mark.scan_image.height) == (1060, 1060)
assert np.any(mark.scan_image.valid_mask)
Comment thread
cfs-data marked this conversation as resolved.
Binary file not shown.
Loading