Skip to content

Commit

Permalink
Add an option to flip the order by depth
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelgarcia committed Sep 18, 2023
1 parent 77523e1 commit c57cfa7
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/spikeinterface/core/recording_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ def get_chunk_with_margin(
return traces_chunk, left_margin, right_margin


def order_channels_by_depth(recording, channel_ids=None, dimensions=("x", "y")):
def order_channels_by_depth(recording, channel_ids=None, dimensions=("x", "y"), flip=False):
"""
Order channels by depth, by first ordering the x-axis, and then the y-axis.
Expand All @@ -316,6 +316,9 @@ def order_channels_by_depth(recording, channel_ids=None, dimensions=("x", "y")):
If str, it needs to be 'x', 'y', 'z'.
If tuple or list, it sorts the locations in two dimensions using lexsort.
This approach is recommended since there is less ambiguity, by default ('x', 'y')
flip: bool, default False
If flip is False then the order is bottom first (starting from tip of the probe).
If flip is True then the order is upper first.
Returns
-------
Expand All @@ -341,6 +344,8 @@ def order_channels_by_depth(recording, channel_ids=None, dimensions=("x", "y")):
assert dim < ndim, "Invalid dimensions!"
locations_to_sort += (locations[:, dim],)
order_f = np.lexsort(locations_to_sort)
if flip:
order_f = order_f[::-1]
order_r = np.argsort(order_f, kind="stable")

return order_f, order_r
Expand Down
2 changes: 2 additions & 0 deletions src/spikeinterface/core/tests/test_recording_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,13 @@ def test_order_channels_by_depth():
order_1d, order_r1d = order_channels_by_depth(rec, dimensions="y")
order_2d, order_r2d = order_channels_by_depth(rec, dimensions=("x", "y"))
locations_rev = locations_copy[order_1d][order_r1d]
order_2d_fliped, order_r2d_fliped = order_channels_by_depth(rec, dimensions=("x", "y"), flip=True)

assert np.array_equal(locations[:, 1], locations_copy[order_1d][:, 1])
assert np.array_equal(locations_copy[order_1d][:, 1], locations_copy[order_2d][:, 1])
assert np.array_equal(locations, locations_copy[order_2d])
assert np.array_equal(locations_copy, locations_copy[order_2d][order_r2d])
assert np.array_equal(order_2d[::-1], order_2d_fliped)


if __name__ == "__main__":
Expand Down
8 changes: 6 additions & 2 deletions src/spikeinterface/preprocessing/depth_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@ class DepthOrderRecording(ChannelSliceRecording):
If str, it needs to be 'x', 'y', 'z'.
If tuple or list, it sorts the locations in two dimensions using lexsort.
This approach is recommended since there is less ambiguity, by default ('x', 'y')
flip: bool, default False
If flip is False then the order is bottom first (starting from tip of the probe).
If flip is True then the order is upper first.
"""

name = "depth_order"
installed = True

def __init__(self, parent_recording, channel_ids=None, dimensions=("x", "y")):
order_f, order_r = order_channels_by_depth(parent_recording, channel_ids=channel_ids, dimensions=dimensions)
def __init__(self, parent_recording, channel_ids=None, dimensions=("x", "y"), flip=False):
order_f, order_r = order_channels_by_depth(parent_recording, channel_ids=channel_ids, dimensions=dimensions, flip=flip)
reordered_channel_ids = parent_recording.channel_ids[order_f]
ChannelSliceRecording.__init__(
self,
Expand All @@ -35,6 +38,7 @@ def __init__(self, parent_recording, channel_ids=None, dimensions=("x", "y")):
parent_recording=parent_recording,
channel_ids=channel_ids,
dimensions=dimensions,
flip=flip,
)


Expand Down

0 comments on commit c57cfa7

Please sign in to comment.