Repository: catalystneuro/roiextractors
Pull request #407: Add InscopixSegmentationExtractor 
Author: login: daphnedequatrebarbes
Created: 2025-03-20T10:12:29Z | Merged: 2025-05-12T19:17:43Z

fix #274

Linked issue #274: [Feature]: Add support for Inscopix
### What would you like to see added to ROI Extractors?

Add support for Inscopix

Blocked by https://github.com/inscopix/py_isx/issues/45

### Do you have any interest in helping implement the feature?

Yes.

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/catalystneuro/roiextractors/blob/master/.github/CODE_OF_CONDUCT.rst)
- [X] Have you ensured this bug was not already [reported](https://github.com/catalystneuro/roiextractors/issues)?
Linked issue comments: user: login: bendichter
created_at: 2024-12-09T18:27:01Z
body: looks like we are unblocked here. This would be a good item for someone to put in the queue. @anoushkajain, want to take a look at this?
author_association: CONTRIBUTOR

Diff:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fa4fcedc..c0bbe328f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 * Added volumetric imaging support with `is_volumetric` flag, `get_frame_shape`, `get_num_planes`, and `get_volume_shape` methods [PR #418](https://github.com/catalystneuro/roiextractors/pull/418)
 * Added support for multiple samples per slice to `ScanImageIMagingExtractor` [PR # 417](https://github.com/catalystneuro/roiextractors/pull/417)
 * Added support for flyback frames to `ScanImageImagingExtractor` [PR #419](https://github.com/catalystneuro/roiextractors/pull/419)
+* Added InscopixSegmentationExtractor for reading .isxd segmentation files [#407](https://github.com/catalystneuro/roiextractors/pull/407)
 * Add `plane_index` to `ScanImageImagingExtractor` to obtain a planar extractor across a plane [PR #424](https://github.com/catalystneuro/roiextractors/pull/424)
 * Add testing to timestamp extraction on `ScanImageImagingExtractor` [PR #426](https://github.com/catalystneuro/roiextractors/pull/426)
 * Add paths as string support to `ScanImageImagingExtractor` [PR #427](https://github.com/catalystneuro/roiextractors/pull/427)
@@ -33,7 +34,6 @@
 # v0.5.12 (April 18th, 2025)
 
 ### Features
-
 * New `read_scanimage_metadata` for reading scanimage metadata from a file directly as a python dict [PR #405](https://github.com/catalystneuro/roiextractors/pull/401)
 
 ### Fixes
diff --git a/pyproject.toml b/pyproject.toml
index 51095eb72..fde5b0785 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -52,7 +52,7 @@ full = [
     "neuroconv[video]>=0.4.6",
     "opencv-python-headless>=4.8.1.78",
     "natsort>=8.3.1",
-    "isx>=1.0.4"
+    "isx>=2.0; sys_platform != 'darwin' or platform_machine != 'arm64'"
 ]
 test = [
     "pytest",
diff --git a/src/roiextractors/extractorlist.py b/src/roiextractors/extractorlist.py
index 7be0dd261..c52218e8c 100644
--- a/src/roiextractors/extractorlist.py
+++ b/src/roiextractors/extractorlist.py
@@ -28,6 +28,7 @@
 )
 from .extractors.sbximagingextractor import SbxImagingExtractor
 from .extractors.inscopixextractors import InscopixImagingExtractor
+from .extractors.inscopixextractors import InscopixSegmentationExtractor
 from .extractors.memmapextractors import NumpyMemmapImagingExtractor
 from .extractors.memmapextractors import MemmapImagingExtractor
 from .extractors.miniscopeimagingextractor import MiniscopeImagingExtractor
@@ -35,6 +36,7 @@
 from .multiimagingextractor import MultiImagingExtractor
 from .volumetricimagingextractor import VolumetricImagingExtractor
 
+
 imaging_extractor_full_list = [
     NumpyImagingExtractor,
     Hdf5ImagingExtractor,
@@ -66,6 +68,7 @@
     ExtractSegmentationExtractor,
     SimaSegmentationExtractor,
     CaimanSegmentationExtractor,
+    InscopixSegmentationExtractor,
 ]
 
 imaging_extractor_dict = {imaging_class.extractor_name: imaging_class for imaging_class in imaging_extractor_full_list}
diff --git a/src/roiextractors/extractors/inscopixextractors/__init__.py b/src/roiextractors/extractors/inscopixextractors/__init__.py
index 60c67ef70..9767f5d28 100644
--- a/src/roiextractors/extractors/inscopixextractors/__init__.py
+++ b/src/roiextractors/extractors/inscopixextractors/__init__.py
@@ -1,3 +1,4 @@
 """Defines extactors for Inscopix data."""
 
 from .inscopiximagingextractor import InscopixImagingExtractor
+from .inscopixsegmentationextractor import InscopixSegmentationExtractor
diff --git a/src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py b/src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
index 233e20776..1b28dff8b 100644
--- a/src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
+++ b/src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
@@ -1,6 +1,7 @@
 """Inscopix Imaging Extractor."""
 
 import warnings
+import platform
 from typing import Optional, Tuple
 
 import numpy as np
@@ -23,6 +24,13 @@ def __init__(self, file_path: PathType):
         file_path : PathType
             Path to the Inscopix file.
         """
+        if platform.system() == "Darwin" and platform.machine() == "arm64":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
         import isx
 
         super().__init__(file_path=file_path)
diff --git a/src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py b/src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
new file mode 100644
index 000000000..8d191261f
--- /dev/null
+++ b/src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
@@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin" and platform.machine() == "arm64":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
+
+    def get_num_rois(self) -> int:
+        return self.cell_set.num_cells
+
+    def get_roi_image_masks(self, roi_ids=None) -> np.ndarray:
+        if roi_ids is None:
+            roi_idx_ = range(self.get_num_rois())
+        else:
+            all_ids = self.get_roi_ids()
+            roi_idx_ = [all_ids.index(i) for i in roi_ids]
+
+        masks = [self.cell_set.get_cell_image_data(roi_id) for roi_id in roi_idx_]
+        if len(masks) == 1:
+            return masks[0]
+        return np.stack(masks)
+
+    def get_roi_ids(self) -> list:
+        return [self.cell_set.get_cell_name(x) for x in range(self.get_num_rois())]
+
+    def get_image_size(self) -> ArrayType:
+        if hasattr(self.cell_set, "spacing"):
+            # Swap dimensions to return (width, height)
+            pixels = self.cell_set.spacing.num_pixels
+            return (pixels[1], pixels[0])
+        else:
+            if self.get_num_rois() > 0:
+                shape = self.cell_set.get_cell_image_data(0).shape
+                # Swap dimensions to return (width, height)
+                return (shape[1], shape[0])
+            raise ValueError("No ROIs found in the segmentation. Unable to determine image size.")
+
+    def get_accepted_list(self) -> list:
+        return [id for x, id in enumerate(self.get_roi_ids()) if self.cell_set.get_cell_status(x) == "accepted"]
+
+    def get_rejected_list(self) -> list:
+        return [id for x, id in enumerate(self.get_roi_ids()) if self.cell_set.get_cell_status(x) == "rejected"]
+
+    def get_traces(self, roi_ids=None, start_frame=None, end_frame=None, name="raw") -> ArrayType:
+        if roi_ids is None:
+            roi_idx_ = range(self.get_num_rois())
+        else:
+            all_ids = self.get_roi_ids()
+            roi_idx_ = [all_ids.index(i) for i in roi_ids]
+        return np.vstack([self.cell_set.get_cell_trace_data(roi_id)[start_frame:end_frame] for roi_id in roi_idx_])
+
+    def get_num_frames(self) -> int:
+        try:
+            return self.cell_set.timing.num_samples
+        except AttributeError:
+            if self.get_num_rois() > 0:
+                return len(self.cell_set.get_cell_trace_data(0))
+            return 0
+
+    def get_sampling_frequency(self) -> float:
+        try:
+            return 1 / self.cell_set.timing.period.secs_float
+        except AttributeError:
+            return None
diff --git a/tests/test_inscopiximagingextractor.py b/tests/test_inscopiximagingextractor.py
index cb7c2368e..a961014d9 100644
--- a/tests/test_inscopiximagingextractor.py
+++ b/tests/test_inscopiximagingextractor.py
@@ -1,4 +1,6 @@
 import numpy as np
+import pytest
+import platform
 from numpy import dtype
 from numpy.testing import assert_array_equal
 
@@ -6,8 +8,32 @@
 
 from tests.setup_paths import OPHYS_DATA_PATH
 
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(
+    platform.system() == "Darwin" and platform.machine() == "arm64",
+    reason="Inscopix is not natively supported on macOS ARM",
+)
+
 
 def test_inscopiximagingextractor_movie_128x128x100_part1():
+    """
+     Test with a small movie file (128x128 resolution, 100 frames).
+
+     File: movie_128x128x100_part1.isxd
+     Metadata:
+    - Source: Movie file (Inscopix isxcore v1.8.0)
+     - 100 samples (frames)
+     - Frame rate: 10.0 Hz
+     - Volumetric: False
+     - Frame shape: (128, 128) pixels
+     - Pixel size: 3 µm x 3 µm
+     - Spatial offset (top-left): (0, 0) in global image space
+     - Channels: 1 (isx format supports only single channel)
+
+     This test verifies that the extractor correctly:
+     1. Loads the file and extracts metadata (frame count, resolution, data type, etc.).
+     2. Retrieves the video data and raw data with correct shape and type.
+    """
     file_path = OPHYS_DATA_PATH / "imaging_datasets" / "inscopix" / "movie_128x128x100_part1.isxd"
     extractor = InscopixImagingExtractor(file_path=file_path)
 
@@ -21,8 +47,36 @@ def test_inscopiximagingextractor_movie_128x128x100_part1():
     assert extractor.get_frames(frame_idxs=[0], channel=0).dtype is extractor.get_dtype()
     assert extractor.get_dtype().itemsize
 
+    raw_data = extractor.get_series()
+    assert raw_data.shape == (100, 128, 128)
+    assert raw_data.dtype == extractor.get_dtype()
+
 
 def test_inscopiximagingextractor_movie_longer_than_3_min():
+    """
+    Test with a movie longer than 3 minutes.
+
+    File: movie_longer_than_3_min.isxd
+    Metadata:
+    - Source: Movie file (Inscopix isxcore v1.8.1)
+    - 1248 samples (frames)
+    - Frame rate: ~5.56 Hz (Period = 179973 µs)
+    - Volumetric: True (3 active planes: 170 µm, 370 µm, 570 µm)
+    - Frame shape: (33, 29) pixels
+    - Pixel size: 72 µm x 72 µm
+    - Spatial offset (top-left): (333, 0) in global image space
+    - Spatial downsampling: 12x
+    - Temporal downsampling: 1x
+    - Channels: 1 (isx format supports only single channel)
+    - Microscope: Inscopix NVista3, Serial: FA-11092903
+    - LED Power: 0.4, Exposure: 20 ms, Gain: 5.9
+    - Acquisition start time: 2019-10-07
+    - Session name: 4D_SAAV_PFC_IM7_20191007
+
+    This test verifies that the extractor correctly:
+    1. Loads the file and extracts metadata (frame count, resolution, data type, etc.).
+    2. Retrieves the video data and raw data with correct shape and type.
+    """
     file_path = OPHYS_DATA_PATH / "imaging_datasets" / "inscopix" / "movie_longer_than_3_min.isxd"
     extractor = InscopixImagingExtractor(file_path=file_path)
 
@@ -36,8 +90,30 @@ def test_inscopiximagingextractor_movie_longer_than_3_min():
     assert extractor.get_frames(frame_idxs=[0], channel=0).dtype is extractor.get_dtype()
     assert extractor.get_dtype().itemsize
 
+    raw_data = extractor.get_series()
+    assert raw_data.shape == (1248, 33, 29)
+    assert raw_data.dtype == extractor.get_dtype()
+
 
 def test_inscopiximagingextractor_movie_u8():
+    """
+    Test loading a minimal valid Inscopix movie file with uint8-encoded pixel data.
+
+
+    File: movie_u8.isxd
+    Metadata:
+    - Source: Movie file (Inscopix isxcore v1.9.5)
+    - 5 samples (frames)
+    - Frame rate: 20.0 Hz
+    - Volumetric: False
+    - Frame shape: (3, 4) pixels
+    - Pixel size: 3 µm x 3 µm
+    - Channels: 1 (isx format supports only single channel)
+
+    This test verifies that the extractor correctly:
+    1. Loads the file and extracts metadata (frame count, resolution, data type, etc.).
+    2. Retrieves the video data and raw data with correct shape and type.
+    """
     file_path = OPHYS_DATA_PATH / "imaging_datasets" / "inscopix" / "movie_u8.isxd"
     extractor = InscopixImagingExtractor(file_path=file_path)
 
@@ -50,3 +126,7 @@ def test_inscopiximagingextractor_movie_u8():
     assert extractor.get_video().shape == (5, 3, 4)
     assert extractor.get_frames(frame_idxs=[0], channel=0).dtype is extractor.get_dtype()
     assert extractor.get_dtype().itemsize
+
+    raw_data = extractor.get_series()
+    assert raw_data.shape == (5, 3, 4)
+    assert raw_data.dtype == extractor.get_dtype()
diff --git a/tests/test_inscopixsegmentation.py b/tests/test_inscopixsegmentation.py
new file mode 100644
index 000000000..4c404cef6
--- /dev/null
+++ b/tests/test_inscopixsegmentation.py
@@ -0,0 +1,136 @@
+import numpy as np
+import pytest
+import platform
+from numpy.testing import assert_array_equal
+from pathlib import Path
+from roiextractors import InscopixSegmentationExtractor
+
+from .setup_paths import OPHYS_DATA_PATH
+
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(
+    platform.system() == "Darwin" and platform.machine() == "arm64",
+    reason="Inscopix is not natively supported on macOS ARM",
+)
+
+print(f"OPHYS_DATA_PATH: {OPHYS_DATA_PATH}")
+
+
+def test_inscopix_segmentation_extractor():
+    """
+    Test with a standard Inscopix segmentation dataset.
+
+    Files: segmentation_datasets/inscopix/cellset.isxd
+    Metadata:
+    - Source: CellSet produced by CNMF-E (Inscopix isxcore v1.8.0)
+    - 4 segmented cells (`C0` to `C3`)
+    - 5444 samples (frames)
+    - Frame rate: ~9.9987 Hz
+    - Volumetric: True (3 active planes: 400 µm, 700 µm, 1000 µm)
+    - Frame shape: (366, 398)
+    - Pixel size: 6 µm x 6 µm
+    - Signal units: dF over noise (analog)
+    - Cell status:
+        - C0: Rejected
+        - C1: Rejected
+        - C2: Unknown
+        - C3: Accepted
+    - Animal ID: FV4581 (male, species: CaMKIICre)
+    - Experiment: Retrieval day
+    - Channel: Green, Exposure: 33 ms, Gain: 6
+    - LED Power: 1.3, Focus: 1000 µm
+    - Acquisition date: 2021-04-01
+
+    This test verifies that the extractor correctly:
+    1. Loads the dataset and extracts metadata (ROI count, image size, etc.)
+    2. Retrieves ROI masks and traces with correct dimensions
+    3. Handles frame slicing and ROI-specific trace extraction
+    """
+    file_path = OPHYS_DATA_PATH / "segmentation_datasets" / "inscopix" / "cellset.isxd"
+    extractor = InscopixSegmentationExtractor(file_path=str(file_path))
+
+    assert extractor.get_num_rois() == 4
+    assert extractor.get_roi_ids() == ["C0", "C1", "C2", "C3"]
+    assert extractor.get_accepted_list() == ["C0", "C1", "C2"]
+    assert extractor.get_rejected_list() == ["C3"]
+    assert extractor.get_image_size() == (398, 366)
+    assert extractor.get_num_frames() == 5444
+    img = extractor.get_roi_image_masks(["C1"])
+    assert img.shape == (366, 398)
+    np.testing.assert_allclose(extractor.get_sampling_frequency(), 9.998700168978033)
+    assert extractor.get_traces().shape == (4, 5444)
+    assert extractor.get_traces(start_frame=10, end_frame=20).shape == (4, 10)
+    assert extractor.get_traces(start_frame=10, end_frame=20, roi_ids=["C1"]).shape == (1, 10)
+
+
+def test_inscopix_segmentation_extractor_part1():
+    """
+    Test with a smaller Inscopix segmentation dataset
+
+    Files: segmentation_datasets/inscopix/cellset_series_part1.isxd
+    Metadata:
+    - Source: CellSet produced by CNMF-E (Inscopix isxcore v1.8.0)
+    - 6 segmented cells (`C0` to `C5`)
+    - 100 samples (frames)
+    - Frame rate: 10.0 Hz
+    - Volumetric: False
+    - Frame shape: (21, 21)
+    - Pixel size: 6 µm x 6 µm
+    - Footprint offset (top-left): (216, 156) in original movie
+    - Signal units: dF over noise (analog)
+    - Motion corrected: Yes (pre_mc = True, mc_padding = False)
+    - Activity present in all cells (`CellActivity = True`)
+    - Additional fields: cellMetrics, CellColors, Matches, PairScores
+
+    This test verifies that the extractor correctly:
+    1. Loads the dataset and extracts metadata (ROI count, image size, etc.)
+    2. Retrieves ROI masks and traces with correct dimensions
+    3. Handles frame slicing and ROI-specific trace extraction
+    """
+    file_path = OPHYS_DATA_PATH / "segmentation_datasets" / "inscopix" / "cellset_series_part1.isxd"
+    extractor = InscopixSegmentationExtractor(file_path=str(file_path))
+
+    assert extractor.get_num_rois() == 6
+    assert extractor.get_roi_ids() == ["C0", "C1", "C2", "C3", "C4", "C5"]
+    assert extractor.get_accepted_list() == []
+    assert extractor.get_rejected_list() == []
+    assert extractor.get_image_size() == (21, 21)
+    img = extractor.get_roi_image_masks(["C1"])
+    assert img.shape == (21, 21)
+    assert extractor.get_sampling_frequency() == 10.0
+    assert extractor.get_traces().shape == (6, 100)
+    assert extractor.get_traces(start_frame=10, end_frame=20).shape == (6, 10)
+    assert extractor.get_traces(start_frame=10, end_frame=20, roi_ids=["C1"]).shape == (1, 10)
+    assert extractor.get_num_frames() == 100
+
+
+def test_inscopix_segmentation_extractor_empty():
+    """
+    Test with an empty Inscopix segmentation dataset.
+
+    Files: segmentation_datasets/inscopix/empty_cellset.isxd
+    Metadata:
+    - Source: CellSet (Inscopix isxcore v1.8.0)
+    - 0 segmented cells
+    - 7 samples (frames)
+    - Frame rate: 40.0 Hz
+    - Volumetric: False
+    - Frame shape: (4, 5)
+    - Pixel size: 3 µm x 3 µm
+
+
+    This test verifies that the extractor correctly:
+    1. Handles datasets with no ROIs
+    2. Extracts metadata (image size, frame count, etc.)
+    3. Ensures no ROI masks or traces are returned
+    """
+    file_path = OPHYS_DATA_PATH / "segmentation_datasets" / "inscopix" / "empty_cellset.isxd"
+    extractor = InscopixSegmentationExtractor(file_path=str(file_path))
+
+    assert extractor.get_num_rois() == 0
+    assert extractor.get_roi_ids() == []
+    assert extractor.get_accepted_list() == []
+    assert extractor.get_rejected_list() == []
+    assert extractor.get_image_size() == (5, 4)
+    assert extractor.get_sampling_frequency() == 40.0
+    assert extractor.get_num_frames() == 7


Reviews:
user: login: h-mayorquin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-20T21:53:23Z
user: login: daphnedequatrebarbes
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T10:37:31Z
user: login: h-mayorquin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T15:21:41Z
user: login: h-mayorquin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T15:28:47Z
user: login: daphnedequatrebarbes
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T16:44:34Z
user: login: h-mayorquin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-30T17:10:32Z
user: login: h-mayorquin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-30T17:10:43Z
user: login: pauladkisson
body: Some minor comments, but overall looks really good!
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-05-05T16:25:17Z
user: login: daphnedequatrebarbes
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T18:21:08Z
user: login: daphnedequatrebarbes
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T18:45:13Z
user: login: pauladkisson
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-06T18:49:25Z
user: login: pauladkisson
body: Just one outstanding request, otherwise looks great!
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-05-12T18:30:54Z
user: login: pauladkisson
body: Everything looks great now. Thanks @daphnedequatrebarbes @h-mayorquin!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-12T19:13:24Z

Review comments:
diff_hunk: @@ -0,0 +1,91 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        import isx
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: h-mayorquin
body: The minimal version of this should be set to 2.0 on the pyproject.toml I think:

https://github.com/catalystneuro/roiextractors/blob/c383cb86dc2a780e42d6269cadd61d57f56d92c0/pyproject.toml#L55-L56

created_at: 2025-03-20T21:53:22Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,91 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        import isx
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: daphnedequatrebarbes
body: I have updated `isx` to `isx >=2.0` in `pyproject.toml`. However, for Apple Silicon , the package is currently not natively supported. To work around this on my Mac, I installed `isx` directly from the GitHub repository using `pip install git+https://github.com/inscopix/py_isx.git@main`. This installation is documented in the README.
created_at: 2025-04-02T10:37:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,91 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        import isx
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: h-mayorquin
body: Hi, I think that is better to have support for some OSes that no support at all.
You can skip tests on apple sillicon:

https://docs.pytest.org/en/7.1.x/how-to/skipping.html


created_at: 2025-04-02T15:21:40Z
author_association: COLLABORATOR
diff_hunk: @@ -56,6 +56,11 @@ Finally, if you prefer to avoid `conda` altogether, the following commands provi
 pip install git+https://github.com/catalystneuro/roiextractors.git@main
 ```
 
+For macOS users with Apple Silicon (M1/M2 chips), the `isx` package version 2.0 or higher is currently not natively supported. However, it can be installed directly from GitHub
+```shell
+pip install git+https://github.com/inscopix/py_isx.git@main
path: README.md
user: login: h-mayorquin
body: It seems that their github suggestion are a bit more complicated:

https://github.com/inscopix/pyisx?tab=readme-ov-file#install

Are the equivalent to what you wrote here?
created_at: 2025-04-02T15:28:47Z
author_association: COLLABORATOR
diff_hunk: @@ -56,6 +56,11 @@ Finally, if you prefer to avoid `conda` altogether, the following commands provi
 pip install git+https://github.com/catalystneuro/roiextractors.git@main
 ```
 
+For macOS users with Apple Silicon (M1/M2 chips), the `isx` package version 2.0 or higher is currently not natively supported. However, it can be installed directly from GitHub
+```shell
+pip install git+https://github.com/inscopix/py_isx.git@main
path: README.md
user: login: daphnedequatrebarbes
body: Thanks for pointing that out! I must have mixed up some info, as it isn’t supported by the official ISX docs. I appreciate it—I’m looking into it now.
created_at: 2025-04-02T16:44:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -56,6 +56,11 @@ Finally, if you prefer to avoid `conda` altogether, the following commands provi
 pip install git+https://github.com/catalystneuro/roiextractors.git@main
 ```
 
+For macOS users with Apple Silicon (M1/M2 chips), the `isx` package version 2.0 or higher is currently not natively supported. However, it can be installed directly from GitHub
+```shell
+pip install git+https://github.com/inscopix/py_isx.git@main
path: README.md
user: login: h-mayorquin
body: OK, I fixed this with an installation message.
created_at: 2025-04-30T17:10:32Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,91 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        import isx
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: h-mayorquin
body: Thanks. This is done now.
created_at: 2025-04-30T17:10:43Z
author_association: COLLABORATOR
diff_hunk: @@ -23,6 +24,13 @@ def __init__(self, file_path: PathType):
         file_path : PathType
             Path to the Inscopix file.
         """
+        if platform.system() == "Darwin":
path: src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
user: login: pauladkisson
body: ```suggestion
        if platform.system() == "Darwin" and platform.machine() == "arm64":
```

Both system and machine need to be specified to differentiate between apple silicon and intel macos
created_at: 2025-05-05T15:55:49Z
author_association: MEMBER
diff_hunk: @@ -107,3 +115,15 @@ def get_video(
 
     def get_dtype(self) -> np.dtype:
         return np.dtype(self.movie.data_type)
+
+    def get_raw_data(self, start_frame: Optional[int] = None, end_frame: Optional[int] = None) -> np.ndarray:
+        """Get raw data from the video frames.
+
+        Returns
+        -------
+        np.ndarray : The raw data from the specified frames.
+        """
+        start_frame = start_frame or 0
+        end_frame = end_frame or self.get_num_frames()
+        raw_data = np.array([self.movie.get_frame_data(i) for i in range(start_frame, end_frame)])
+        return raw_data
path: src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
user: login: pauladkisson
body: This seems redundant with `get_series`
created_at: 2025-05-05T15:58:00Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: pauladkisson
body: ```suggestion
        if platform.system() == "Darwin" and platform.machine() == "arm64":
```
created_at: 2025-05-05T15:58:48Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: pauladkisson
body: Is this read operation lazy?
created_at: 2025-05-05T16:02:08Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
+
+    def get_num_rois(self) -> int:
+        return self.cell_set.num_cells
+
+    def get_roi_image_masks(self, roi_ids=None) -> np.ndarray:
+        if roi_ids is None:
+            roi_idx_ = range(self.get_num_rois())
+        else:
+            all_ids = self.get_roi_ids()
+            roi_idx_ = [all_ids.index(i) for i in roi_ids]
+
+        masks = [self.cell_set.get_cell_image_data(roi_id) for roi_id in roi_idx_]
+        if len(masks) == 1:
+            return masks[0]
+        return np.stack(masks)
+
+    def get_roi_ids(self) -> list:
+        return [self.cell_set.get_cell_name(x) for x in range(self.get_num_rois())]
+
+    def get_image_size(self) -> ArrayType:
+        try:
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: pauladkisson
body: Instead of try-except AttributeError, use `if hasattr(self.cell_set, "spacing")`.

It's more explicit and readable.
created_at: 2025-05-05T16:11:48Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
+
+    def get_num_rois(self) -> int:
+        return self.cell_set.num_cells
+
+    def get_roi_image_masks(self, roi_ids=None) -> np.ndarray:
+        if roi_ids is None:
+            roi_idx_ = range(self.get_num_rois())
+        else:
+            all_ids = self.get_roi_ids()
+            roi_idx_ = [all_ids.index(i) for i in roi_ids]
+
+        masks = [self.cell_set.get_cell_image_data(roi_id) for roi_id in roi_idx_]
+        if len(masks) == 1:
+            return masks[0]
+        return np.stack(masks)
+
+    def get_roi_ids(self) -> list:
+        return [self.cell_set.get_cell_name(x) for x in range(self.get_num_rois())]
+
+    def get_image_size(self) -> ArrayType:
+        try:
+            # Swap dimensions to return (width, height)
+            pixels = self.cell_set.spacing.num_pixels
+            return (pixels[1], pixels[0])
+        except AttributeError:
+            if self.get_num_rois() > 0:
+                shape = self.cell_set.get_cell_image_data(0).shape
+                # Swap dimensions to return (width, height)
+                return (shape[1], shape[0])
+            return None
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: pauladkisson
body: Instead of returning None here, I think we should throw an error. Is num_rois=0 even a sensible situation for an inscopix segmentation?
created_at: 2025-05-05T16:14:03Z
author_association: MEMBER
diff_hunk: @@ -1,11 +1,16 @@
 import numpy as np
+import pytest
+import platform
 from numpy import dtype
 from numpy.testing import assert_array_equal
 
 from roiextractors import InscopixImagingExtractor
 
 from tests.setup_paths import OPHYS_DATA_PATH
 
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(platform.system() == "Darwin", reason="Inscopix is not natively supported on macOS")
path: tests/test_inscopiximagingextractor.py
user: login: pauladkisson
body: ```suggestion
pytestmark = pytest.mark.skipif(platform.system() == "Darwin" and platform.machine() == "arm64", reason="Inscopix is not natively supported on macOS ARM")
```
created_at: 2025-05-05T16:15:17Z
author_association: MEMBER
diff_hunk: @@ -1,11 +1,16 @@
 import numpy as np
+import pytest
+import platform
 from numpy import dtype
 from numpy.testing import assert_array_equal
 
 from roiextractors import InscopixImagingExtractor
 
 from tests.setup_paths import OPHYS_DATA_PATH
 
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(platform.system() == "Darwin", reason="Inscopix is not natively supported on macOS")
+
 
 def test_inscopiximagingextractor_movie_128x128x100_part1():
path: tests/test_inscopiximagingextractor.py
user: login: pauladkisson
body: Could you add docstrings with descriptions of the files like we have here: https://github.com/catalystneuro/roiextractors/blob/main/tests/test_scanimage_extractor.py
created_at: 2025-05-05T16:21:50Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,62 @@
+import numpy as np
+import pytest
+import platform
+from numpy.testing import assert_array_equal
+from pathlib import Path
+from roiextractors import InscopixSegmentationExtractor
+
+from .setup_paths import OPHYS_DATA_PATH
+
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(platform.system() == "Darwin", reason="Inscopix is not natively supported on macOS")
path: tests/test_inscopixsegmentation.py
user: login: pauladkisson
body: ```suggestion
pytestmark = pytest.mark.skipif(platform.system() == "Darwin" and platform.machine() == "arm64", reason="Inscopix is not natively supported on macOS ARM")
```
created_at: 2025-05-05T16:23:52Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,62 @@
+import numpy as np
+import pytest
+import platform
+from numpy.testing import assert_array_equal
+from pathlib import Path
+from roiextractors import InscopixSegmentationExtractor
+
+from .setup_paths import OPHYS_DATA_PATH
+
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(platform.system() == "Darwin", reason="Inscopix is not natively supported on macOS")
+
+print(f"OPHYS_DATA_PATH: {OPHYS_DATA_PATH}")
+
+
+def test_inscopix_segmentation_extractor():
path: tests/test_inscopixsegmentation.py
user: login: pauladkisson
body: Similar file docstrings would be nice here too.
created_at: 2025-05-05T16:24:20Z
author_association: MEMBER
diff_hunk: @@ -107,3 +115,15 @@ def get_video(
 
     def get_dtype(self) -> np.dtype:
         return np.dtype(self.movie.data_type)
+
+    def get_raw_data(self, start_frame: Optional[int] = None, end_frame: Optional[int] = None) -> np.ndarray:
+        """Get raw data from the video frames.
+
+        Returns
+        -------
+        np.ndarray : The raw data from the specified frames.
+        """
+        start_frame = start_frame or 0
+        end_frame = end_frame or self.get_num_frames()
+        raw_data = np.array([self.movie.get_frame_data(i) for i in range(start_frame, end_frame)])
+        return raw_data
path: src/roiextractors/extractors/inscopixextractors/inscopiximagingextractor.py
user: login: daphnedequatrebarbes
body: I'll remove get_raw_data to keep the code consistent.
created_at: 2025-05-06T18:21:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: daphnedequatrebarbes
body: No, the read() operation is not lazy. It eagerly loads metadata (cell names, timing information, spacing) during initialization. However, data like cell image masks and traces are loaded lazily when specifically requested.
created_at: 2025-05-06T18:45:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,99 @@
+"""Inscopix Segmentation Extractor."""
+
+from typing import Optional
+import platform
+import numpy as np
+
+from ...extraction_tools import PathType, ArrayType
+from ...segmentationextractor import SegmentationExtractor
+
+
+class InscopixSegmentationExtractor(SegmentationExtractor):
+    """A segmentation extractor for Inscopix."""
+
+    extractor_name = "InscopixSegmentationExtractor"
+    installed = True
+    is_writable = False
+    mode = "file"
+    installation_mesg = ""
+
+    def __init__(self, file_path: PathType):
+        """Initialize a InscopixSegmentationExtractor instance.
+
+        Main class for extracting segmentation data from Inscopix format.
+
+        Parameters
+        ----------
+        file_path: str
+            The location of the folder containing Inscopix *.mat output file.
+        """
+        if platform.system() == "Darwin":
+            raise ImportError(
+                "The isx package is currently not natively supported on macOS with Apple Silicon. "
+                "Installation instructions can be found at: "
+                "https://github.com/inscopix/pyisx?tab=readme-ov-file#install"
+            )
+
+        import isx
+
+        SegmentationExtractor.__init__(self)
+        self.file_path = file_path
+        self.cell_set = isx.CellSet.read(file_path)
path: src/roiextractors/extractors/inscopixextractors/inscopixsegmentationextractor.py
user: login: pauladkisson
body: Perfect
created_at: 2025-05-06T18:49:25Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,62 @@
+import numpy as np
+import pytest
+import platform
+from numpy.testing import assert_array_equal
+from pathlib import Path
+from roiextractors import InscopixSegmentationExtractor
+
+from .setup_paths import OPHYS_DATA_PATH
+
+# Skip all tests in this file on macOS
+pytestmark = pytest.mark.skipif(platform.system() == "Darwin", reason="Inscopix is not natively supported on macOS")
path: tests/test_inscopixsegmentation.py
user: login: pauladkisson
body: This still needs to be updated I think.
created_at: 2025-05-12T18:30:32Z
author_association: MEMBER

PR comments:
user: login: pauladkisson
created_at: 2025-03-20T16:12:26Z
body: This replaces #275, right? 
author_association: MEMBER
user: login: daphnedequatrebarbes
created_at: 2025-03-20T17:07:07Z
body: > This replaces #275, right?  

Yes, I tried to resolve it starting from #275 but couldn't make it work, so I tried starting from scratch. However, I'm having trouble resolving the final dev-test checks.  

What I Understood:  
The failing tests are in the NeuroConv repository at:  
`/neuroconv/tests/test_on_data/ophys/test_imaging_interfaces.py`  

Specifically, these three test cases are failing:  
- `TestScanImageMultiFileImagingInterfaceMultiPlaneCase_0_TwoPhotonSeriesChannel1`  
- `TestScanImageMultiFileImagingInterfaceMultiPlaneCase_1_TwoPhotonSeriesChannel4`  
- `TestScanImageMultiFileImagingInterfaceMultiPlaneCase`  

Issue (As I Understand It):  
The issue seems to be a mismatch in the sampling rate:  
- NeuroConv tests expected rate: 29.1248 Hz  
- roiextractor rate: 30.0 Hz  

Relevant Code:  
The test check not in compliance with neuroconvtests is in `roiextractors/tests/tests_internals/test_nwb_extractors.py`.  

Where I'm Stuck: 
I'm unsure whether this is the actual issue, and I want to make sure I approach it correctly before making any changes to the tests. If anyone has insights or suggestions on how to proceed, that would be really helpful!  
author_association: CONTRIBUTOR
user: login: pauladkisson
created_at: 2025-03-20T17:14:56Z
body: > However, I'm having trouble resolving the final dev-test checks.

Yes, they are failing bc of a change introduced in #405. They will fail until we make a release and fix the tests in neuroconv. You don't need to worry about them at all.  Sorry for the confusion.
author_association: MEMBER
user: login: daphnedequatrebarbes
created_at: 2025-03-20T17:26:59Z
body: > > However, I'm having trouble resolving the final dev-test checks.
> 
> Yes, they are failing bc of a change introduced in #405. They will fail until we make a release and fix the tests in neuroconv. You don't need to worry about them at all. Sorry for the confusion.

Great, thanks. I'll wait for the release to change the draft mode into ready for review. 
author_association: CONTRIBUTOR
user: login: h-mayorquin
created_at: 2025-03-20T21:44:37Z
body: > Great, thanks. I'll wait for the release to change the draft mode into ready for review.

My suggestion is not wait, it would be great if we can have this in the same release so we can port this to neuroconv.
author_association: COLLABORATOR
user: login: h-mayorquin
created_at: 2025-04-30T17:34:59Z
body: @bendichter @pauladkisson @daphnedequatrebarbes 
I fixed the testing and dependency management part that was the last 5 % of the work here. This should be ready to go, right @daphnedequatrebarbes? 
author_association: COLLABORATOR
user: login: bendichter
created_at: 2025-04-30T19:30:14Z
body: LGTM! Do we have an issue raised on the ISX repo about support for Apple Silicon?
author_association: CONTRIBUTOR
user: login: h-mayorquin
created_at: 2025-04-30T19:50:58Z
body: Important context
They are aware of it as they clearly state it on their readme:

https://github.com/inscopix/pyisx?tab=readme-ov-file#install

Maybe the just don't intend to support it. Do you want me to go ahead and request it anyway?
author_association: COLLABORATOR
user: login: bendichter
created_at: 2025-04-30T19:55:52Z
body: yes please. Let's make a habit of (politely) requesting features we would like from other libraries. It's good to know they are aware of this issue, but there are still some advantages to filing the issue anyway:

* It let's them know they have users who would like this feature
* It gives them an opportunity to respond to the request, telling us whether the feature we requested is in scope for them and what a timeline might be
* It allows other users to easily pile on and request the feature by giving the issues a thumbs up
* We get notified when they solve the issues and close the ticket
* If we mention this PR in that issue then they will be cross-linked in GitHub, making it easy for us to navigate through the repos and understand the state of developments on features like this.
author_association: CONTRIBUTOR
user: login: h-mayorquin
created_at: 2025-04-30T19:58:07Z
body: These are good guidelines, Ben. Thanks.
author_association: COLLABORATOR
user: login: h-mayorquin
created_at: 2025-04-30T20:06:30Z
body: Here you go:
https://github.com/inscopix/pyisx/issues/60

author_association: COLLABORATOR
user: login: bendichter
created_at: 2025-05-02T20:41:49Z
body: great, thanks @h-mayorquin ! @pauladkisson , I assigned you as a reviewer here
author_association: CONTRIBUTOR
user: login: h-mayorquin
created_at: 2025-05-09T18:05:45Z
body: I fixed the CI issues that were making the tests fail.
author_association: COLLABORATOR
user: login: h-mayorquin
created_at: 2025-05-12T18:38:43Z
body: Good catch, @pauladkisson. Let's see if the testing suite works as expected with that last skip.
author_association: COLLABORATOR
user: login: codecov[bot]
created_at: 2025-05-12T19:18:15Z
body: ## [Codecov](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 0.00%. Comparing base [(`7aa2a63`)](https://app.codecov.io/gh/catalystneuro/roiextractors/commit/7aa2a63c1700075df45f377cc281f573aa1c30f8?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro) to head [(`94e6571`)](https://app.codecov.io/gh/catalystneuro/roiextractors/commit/94e6571130f7e16a3c81b37cc96136c26fe1f9a5?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro).
> Report is 99 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407/graphs/tree.svg?width=650&height=150&src=pr&token=UA958XVSZP&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro)](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro)

```diff
@@            Coverage Diff            @@
##             main   #407       +/-   ##
=========================================
- Coverage   79.37%      0   -79.38%     
=========================================
  Files          39      0       -39     
  Lines        3069      0     -3069     
=========================================
- Hits         2436      0     -2436     
+ Misses        633      0      -633     
```

| [Flag](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro) | Coverage Δ | |
|---|---|---|
| [unittests](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro) | `?` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro#carryforward-flags-in-the-pull-request-comment) to find out more.

[see 38 files with indirect coverage changes](https://app.codecov.io/gh/catalystneuro/roiextractors/pull/407/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=catalystneuro)

</details>
<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE