Skip to content

Commit

Permalink
fix(eyevolume.py): enable import of B-scans with varying distances by…
Browse files Browse the repository at this point in the history
… replacing the raised Error by a warning; support deleteion of annotations
  • Loading branch information
Oli4 committed Apr 19, 2022
1 parent c9c13d1 commit d8b4bb8
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 10 deletions.
32 changes: 29 additions & 3 deletions eyepy/core/eyevolume.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import logging
import shutil
import tempfile
import warnings
Expand All @@ -21,6 +22,8 @@
from eyepy.core.eyemeta import EyeBscanMeta, EyeEnfaceMeta, EyeVolumeMeta
from eyepy.core.utils import intensity_transforms

logger = logging.getLogger("eyepy.core.eyevolume")


class LayerKnot(TypedDict):
knot_pos: Tuple[float, float]
Expand Down Expand Up @@ -593,11 +596,14 @@ def set_intensity_transform(self, func: Union[str, Callable]):
self.meta["intensity_transform"] = func
self.intensity_transform = intensity_transforms[func]
self._data = None
elif func == "custom":
logger.warning(
"Custom intensity transforms can not be loaded currently"
)
else:
raise ValueError(
"Provided intensity transform name is not know. Valid names are 'vol' or 'default'. You can also pass your own function."
logger.warning(
f"Provided intensity transform name {func} is not know. Valid names are 'vol' or 'default'. You can also pass your own function."
)

else:
self.meta["intensity_transform"] = "custom"
self.intensity_transform = func
Expand Down Expand Up @@ -663,6 +669,16 @@ def add_voxel_annotation(self, voxel_map=None, meta=None, **kwargs):
self._volume_maps.append(voxel_annotation)
return voxel_annotation

def delete_voxel_annotations(self, name):
for i, voxel_map in enumerate(self._volume_maps):
if voxel_map.name == name:
self._volume_maps.pop(i)

# Remove references from B-scans
for bscan in self:
if name in bscan.area_maps:
bscan.area_maps.pop(name)

def add_layer_annotation(self, height_map=None, meta=None, **kwargs):
if meta is None:
meta = {}
Expand All @@ -671,6 +687,16 @@ def add_layer_annotation(self, height_map=None, meta=None, **kwargs):
self._layers.append(layer_annotation)
return layer_annotation

def delete_layer_annotation(self, name):
for i, layer in enumerate(self._layers):
if layer.name == name:
self._layers.pop(i)

# Remove references from B-scans
for bscan in self:
if name in bscan.layers:
bscan.layers.pop(name)

def plot(
self,
ax=None,
Expand Down
4 changes: 2 additions & 2 deletions eyepy/io/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ def import_heyex_vol(path):
)

## Check if scan is a volume scan
if not l_volume.ScanPattern in [3, 4]:
msg = f"Only volumes with ScanPattern 3 or 4 are supported. The ScanPattern is {l_volume.ScanPattern} which might lead to exceptions or unexpected behaviour."
if not l_volume.ScanPattern in [1, 3, 4]:
msg = f"Only volumes with ScanPattern 1, 3 or 4 are supported. The ScanPattern is {l_volume.ScanPattern} which might lead to exceptions or unexpected behaviour."
logger.warning(msg)

enface_meta = _get_enface_meta(l_volume)
Expand Down
9 changes: 4 additions & 5 deletions eyepy/io/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,10 @@ def _get_volume_meta(lazy_volume: LazyVolume):
dist_func(bscan_meta[i]["end_pos"], bscan_meta[i + 1]["end_pos"])
for i in range(len(bscan_meta) - 1)
]
if set(start_distances) == set(end_distances):
bscan_distance = start_distances[0]
else:
msg = "B-scans are not equally spaced. Data can not be imported."
raise ValueError(msg)
if not set(start_distances) == set(end_distances):
msg = "B-scans are not equally spaced. Projections into the enface space are distorted."
logger.warning(msg)
bscan_distance = start_distances[0]
else:
bscan_distance = 0

Expand Down
36 changes: 36 additions & 0 deletions tests/test_eyevolume.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,39 @@ def test_set_layers_on_eyebscan(eyevolume):
assert np.all(bscan.layers["test_layer_2"].data == 240)
assert np.nansum(eyevolume.layers["test_layer_2"].data) == eyevolume.size_x * 240
assert np.all(eyevolume.layers["test_layer_2"].data[-(5 + 1)] == 240)


# Test Bscan iteration
def test_bscan_iteration(eyevolume):
bscans = [b for b in eyevolume]
bscans_2 = [eyevolume[i] for i in range(len(eyevolume))]
assert bscans == bscans_2


# Delete layers
def test_delete_layers(eyevolume):
eyevolume.add_layer_annotation(name="delete_layer")
assert "delete_layer" in eyevolume.layers

eyevolume[2].layers["delete_layer"].data = 20
assert "delete_layer" in eyevolume[2].layers

eyevolume.delete_layer_annotation("delete_layer")

assert "delete_layer" not in eyevolume.layers
# Test for references in the B-scans
assert "delete_layer" not in eyevolume[2].layers


def test_delete_voxel_annotation(eyevolume):
eyevolume.add_voxel_annotation(name="delete_volume")
assert "delete_volume" in eyevolume.volume_maps

eyevolume[2].area_maps["delete_volume"][:5, :5] = 20
assert "delete_volume" in eyevolume[2].area_maps

eyevolume.delete_voxel_annotations("delete_volume")

assert "delete_volume" not in eyevolume.volume_maps
# Test for references in the B-scans
assert "delete_volume" not in eyevolume[2].area_maps

0 comments on commit d8b4bb8

Please sign in to comment.