Skip to content

Commit

Permalink
Merge pull request #2005 from samuelgarcia/flip_order
Browse files Browse the repository at this point in the history
Add an option to flip the order by depth
  • Loading branch information
alejoe91 authored Sep 19, 2023
2 parents 0adee81 + b202c43 commit 2f3bb29
Show file tree
Hide file tree
Showing 3 changed files with 16 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
10 changes: 8 additions & 2 deletions src/spikeinterface/preprocessing/depth_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@ 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 +40,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 2f3bb29

Please sign in to comment.