Skip to content

napari_ndev._napari_reader #

nImageSceneWidget #

Bases: Container

Widget to select a scene from a multi-scene file.

Parameters:

  • viewer #

    (Viewer) –

    The napari viewer instance.

  • path #

    (PathLike) –

    Path to the file.

  • img #

    (nImage) –

    The nImage instance.

  • in_memory #

    (bool) –

    Whether the image should be added in memory.

Attributes:

  • viewer (Viewer) –

    The napari viewer instance.

  • path (PathLike) –

    Path to the file.

  • img (nImage) –

    The nImage instance.

  • in_memory (bool) –

    Whether the image should be added in memory.

  • settings (Settings) –

    The settings instance.

  • scenes (list) –

    List of scenes in the image.

  • _scene_list_widget (Select) –

    Widget to select a scene from a multi-scene file.

Methods:

  • open_scene

    Opens the selected scene(s) in the viewer.

Source code in src/napari_ndev/_napari_reader.py
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
class nImageSceneWidget(Container):
    """
    Widget to select a scene from a multi-scene file.

    Parameters
    ----------
    viewer : napari.viewer.Viewer
        The napari viewer instance.
    path : PathLike
        Path to the file.
    img : nImage
        The nImage instance.
    in_memory : bool
        Whether the image should be added in memory.

    Attributes
    ----------
    viewer : napari.viewer.Viewer
        The napari viewer instance.
    path : PathLike
        Path to the file.
    img : nImage
        The nImage instance.
    in_memory : bool
        Whether the image should be added in memory.
    settings : Settings
        The settings instance.
    scenes : list
        List of scenes in the image.
    _scene_list_widget : magicgui.widgets.Select
        Widget to select a scene from a multi-scene file.

    Methods
    -------
    open_scene
        Opens the selected scene(s) in the viewer.

    """

    def __init__(
        self,
        viewer: napari.viewer.Viewer,
        path: PathLike,
        img: nImage,
        in_memory: bool,
    ):
        """
        Initialize the nImageSceneWidget.

        Parameters
        ----------
        viewer : napari.viewer.Viewer
            The napari viewer instance.
        path : PathLike
            Path to the file.
        img : nImage
            The nImage instance.
        in_memory : bool
            Whether the image should be added in memory.

        """
        super().__init__(labels=False)
        self.max_height = 200
        self.viewer = viewer
        self.path = path
        self.img = img
        self.in_memory = in_memory
        self.settings = get_settings()
        self.scenes = [
            f'{idx}{DELIMITER}{scene}'
            for idx, scene in enumerate(self.img.scenes)
        ]

        self._init_widgets()
        self._connect_events()

    def _init_widgets(self):

        self._scene_list_widget = Select(
            value = None,
            nullable = True,
            choices = self.scenes,
        )
        self.append(self._scene_list_widget)

    def _connect_events(self):
        self._scene_list_widget.changed.connect(self.open_scene)

    def open_scene(self) -> None:
        """Open the selected scene(s) in the viewer."""
        if self.settings.CLEAR_LAYERS_ON_NEW_SCENE:
            self.viewer.layers.clear()

        for scene in self._scene_list_widget.value:
            if scene is None:
                continue
            # Use scene indexes to cover for duplicate names
            scene_index = int(scene.split(DELIMITER)[0])
            self.img.set_scene(scene_index)
            img_data = self.img.get_napari_image_data(in_memory=self.in_memory)
            img_meta = self.img.get_napari_metadata()

            self.viewer.add_image(img_data.data, **img_meta)

__init__ #

__init__(viewer, path, img, in_memory)

Initialize the nImageSceneWidget.

Parameters:

  • viewer #

    (Viewer) –

    The napari viewer instance.

  • path #

    (PathLike) –

    Path to the file.

  • img #

    (nImage) –

    The nImage instance.

  • in_memory #

    (bool) –

    Whether the image should be added in memory.

Source code in src/napari_ndev/_napari_reader.py
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def __init__(
    self,
    viewer: napari.viewer.Viewer,
    path: PathLike,
    img: nImage,
    in_memory: bool,
):
    """
    Initialize the nImageSceneWidget.

    Parameters
    ----------
    viewer : napari.viewer.Viewer
        The napari viewer instance.
    path : PathLike
        Path to the file.
    img : nImage
        The nImage instance.
    in_memory : bool
        Whether the image should be added in memory.

    """
    super().__init__(labels=False)
    self.max_height = 200
    self.viewer = viewer
    self.path = path
    self.img = img
    self.in_memory = in_memory
    self.settings = get_settings()
    self.scenes = [
        f'{idx}{DELIMITER}{scene}'
        for idx, scene in enumerate(self.img.scenes)
    ]

    self._init_widgets()
    self._connect_events()

open_scene #

open_scene()

Open the selected scene(s) in the viewer.

Source code in src/napari_ndev/_napari_reader.py
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
def open_scene(self) -> None:
    """Open the selected scene(s) in the viewer."""
    if self.settings.CLEAR_LAYERS_ON_NEW_SCENE:
        self.viewer.layers.clear()

    for scene in self._scene_list_widget.value:
        if scene is None:
            continue
        # Use scene indexes to cover for duplicate names
        scene_index = int(scene.split(DELIMITER)[0])
        self.img.set_scene(scene_index)
        img_data = self.img.get_napari_image_data(in_memory=self.in_memory)
        img_meta = self.img.get_napari_metadata()

        self.viewer.add_image(img_data.data, **img_meta)

napari_get_reader #

napari_get_reader(
    path, in_memory=None, open_first_scene_only=None, open_all_scenes=None
)

Get the appropriate reader function for a single given path.

Parameters:

  • path #

    (PathLike) –

    Path to the file to be read

  • in_memory #

    (bool, default: None ) –

    Whether to read the file in memory, by default None

  • open_first_scene_only #

    (bool, default: None ) –

    Whether to ignore multi-scene files and just open the first scene, by default False

  • open_all_scenes #

    (bool, default: None ) –

    Whether to open all scenes in a multi-scene file, by default False Ignored if open_first_scene_only is True

Returns:

  • ReaderFunction

    The reader function for the given path

Source code in src/napari_ndev/_napari_reader.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
def napari_get_reader(
    path: PathLike,
    in_memory: bool | None = None,
    open_first_scene_only: bool | None = None,
    open_all_scenes: bool | None = None,
) -> ReaderFunction | None:
    """
    Get the appropriate reader function for a single given path.

    Parameters
    ----------
    path : PathLike
        Path to the file to be read
    in_memory : bool, optional
        Whether to read the file in memory, by default None
    open_first_scene_only : bool, optional
        Whether to ignore multi-scene files and just open the first scene,
        by default False
    open_all_scenes : bool, optional
        Whether to open all scenes in a multi-scene file, by default False
        Ignored if open_first_scene_only is True


    Returns
    -------
    ReaderFunction
        The reader function for the given path

    """
    settings = get_settings()
    if open_first_scene_only is None:
        open_first_scene_only = settings.SCENE_HANDLING == "View First Scene Only"
    if open_all_scenes is None:
        open_all_scenes = settings.SCENE_HANDLING == "View All Scenes"

    if isinstance(path, list):
        logger.info("Bioio: Expected a single path, got a list of paths.")
        return None

    try:
        # TODO: Test this if else functionality.
        from bioio import plugin_feasibility_report as pfr
        fr = pfr(path)
        if settings.PREFERRED_READER in fr and fr[settings.PREFERRED_READER].supported:
            reader_module = importlib.import_module(
                settings.PREFERRED_READER.replace('-', '_')
            )
            reader = reader_module.Reader
        else:
            plugin = nImage.determine_plugin(path)
            reader = plugin.metadata.get_reader()
        # return napari_reader_function(path, reader, in_memory)
        return partial(
            napari_reader_function,
            reader=reader,
            in_memory=in_memory,
            open_first_scene_only=open_first_scene_only,
            open_all_scenes=open_all_scenes,
        )
    except UnsupportedFileFormatError:
        logger.warning("Bioio: Unsupported file format")
        return None
    except Exception as e:  # noqa: BLE001
        logger.warning("Bioio: Error reading file")
        logger.warning(e)
        return None

napari_reader_function #

napari_reader_function(
    path,
    reader,
    in_memory=None,
    open_first_scene_only=False,
    open_all_scenes=False,
    layer_type="image",
)

Read a file using the given reader function.

Parameters:

  • path #

    (PathLike) –

    Path to the file to be read

  • reader #

    (None) –

    Bioio Reader function to be used to read the file, by default None.

  • in_memory #

    (bool, default: None ) –

    Whether to read the file in memory, by default None.

  • layer_type #

    (str, default: 'image' ) –

    Type of layer to be created in napari, by default 'image'.

  • open_first_scene_only #

    (bool, default: False ) –

    Whether to ignore multi-scene files and just open the first scene, by default False.

  • open_all_scenes #

    (bool, default: False ) –

    Whether to open all scenes in a multi-scene file, by default False. Ignored if open_first_scene_only is True.

Returns:

  • list

    List containing image data, metadata, and layer type

Source code in src/napari_ndev/_napari_reader.py
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
def napari_reader_function(
    path: PathLike,
    reader: Callable,
    in_memory: bool | None = None,
    open_first_scene_only: bool = False,
    open_all_scenes: bool = False,
    layer_type: str = 'image'
) -> list[LayerData] | None:
    """
    Read a file using the given reader function.

    Parameters
    ----------
    path : PathLike
        Path to the file to be read
    reader : None
        Bioio Reader function to be used to read the file, by default None.
    in_memory : bool, optional
        Whether to read the file in memory, by default None.
    layer_type : str, optional
        Type of layer to be created in napari, by default 'image'.
    open_first_scene_only : bool, optional
        Whether to ignore multi-scene files and just open the first scene,
        by default False.
    open_all_scenes : bool, optional
        Whether to open all scenes in a multi-scene file, by default False.
        Ignored if open_first_scene_only is True.

    Returns
    -------
    list
        List containing image data, metadata, and layer type

    """
    if isinstance(path, list):
        logger.info("Bioio: Expected a single path, got a list of paths.")
        return None

    img = nImage(path, reader=reader)
    in_memory = img._determine_in_memory(path) if in_memory is None else in_memory
    # TODO: Guess layer type here (check channel names for labels?)
    logger.info('Bioio: Reading in-memory: %s', in_memory)


    # open first scene only
    if len(img.scenes) == 1 or open_first_scene_only:
        img_data = img.get_napari_image_data(in_memory=in_memory)
        img_meta = img.get_napari_metadata(path)
        return [(img_data.data, img_meta, layer_type)]

    # TODO: USE settings for open first or all scenes to set the nubmer of iterations of a for loop
    # check napari reader settings stuff
    # open all scenes as layers
    if len(img.scenes) > 1 and open_all_scenes:
        layer_list = []
        for scene in img.scenes:
            img.set_scene(scene)
            img_data = img.get_napari_image_data(in_memory=in_memory)
            img_meta = img.get_napari_metadata(path)
            layer_list.append((img_data.data, img_meta, layer_type))
        return layer_list

    # open scene widget
    if len(img.scenes) > 1 and not open_all_scenes:
        _open_scene_container(path=path, img=img, in_memory=in_memory)
        return [(None,)]

    logger.warning("Bioio: Error reading file")
    return [(None,)]