TwoPy 0.3.7__py3-none-any.whl → 0.3.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -388,7 +388,7 @@ def current_recording_image(
388
388
  Returns:
389
389
  Two-dimensional display-coordinate image.
390
390
  """
391
- movie_layer = _layer_by_name(viewer, "aligned movie")
391
+ movie_layer = _visible_layer_by_name(viewer, "aligned movie")
392
392
  if movie_layer is not None:
393
393
  data = np.asarray(cast(NapariLayerWithData, movie_layer).data)
394
394
  if data.ndim == 3:
@@ -397,6 +397,12 @@ def current_recording_image(
397
397
  if data.ndim == 2:
398
398
  return cast(npt.NDArray[np.float64], data)
399
399
 
400
+ mean_layer = _visible_layer_by_name(viewer, "mean image")
401
+ if mean_layer is not None:
402
+ data = np.asarray(cast(NapariLayerWithData, mean_layer).data)
403
+ if data.ndim == 2:
404
+ return cast(npt.NDArray[np.float64], data)
405
+
400
406
  mean_image = recording.alignment_valid_crop.crop_image(recording.mean_image)
401
407
  return cast(npt.NDArray[np.float64], mean_image)
402
408
 
@@ -948,3 +954,11 @@ def _layer_by_name(viewer: object | None, name: str) -> object | None:
948
954
  if getattr(layer, "name", None) == name:
949
955
  return layer
950
956
  return None
957
+
958
+
959
+ def _visible_layer_by_name(viewer: object | None, name: str) -> object | None:
960
+ """Return a named layer only when napari is currently showing it."""
961
+ layer = _layer_by_name(viewer, name)
962
+ if layer is None or not bool(getattr(layer, "visible", True)):
963
+ return None
964
+ return layer
twopy/napari/session.py CHANGED
@@ -269,6 +269,27 @@ def remove_loaded_recording_layers(
269
269
  _remove_layer(viewer, layer)
270
270
 
271
271
 
272
+ def _clear_all_viewer_layers(viewer: object) -> None:
273
+ """Clear every viewer layer because twopy owns the layer stack."""
274
+ layer_collection = getattr(viewer, "layers", None)
275
+ clear = getattr(layer_collection, "clear", None)
276
+ if callable(clear):
277
+ clear()
278
+ return
279
+
280
+ for collection_name in ("images", "labels"):
281
+ collection = getattr(viewer, collection_name, None)
282
+ if isinstance(collection, list):
283
+ collection.clear()
284
+
285
+ selection = getattr(layer_collection, "selection", None)
286
+ if selection is not None and hasattr(selection, "active"):
287
+ try:
288
+ cast(_LayerSelection, selection).active = None
289
+ except (AttributeError, TypeError):
290
+ return
291
+
292
+
272
293
  def record_loaded_view(
273
294
  state: NapariSessionState,
274
295
  *,
@@ -444,7 +465,7 @@ def unload_loaded_recording(state: NapariSessionState, index: int) -> None:
444
465
 
445
466
 
446
467
  def unload_all_loaded_recordings(state: NapariSessionState) -> None:
447
- """Unload every recording and remove all owned layers from napari.
468
+ """Unload every recording and clear all twopy-owned layers from napari.
448
469
 
449
470
  Args:
450
471
  state: Mutable napari session state.
@@ -454,8 +475,7 @@ def unload_all_loaded_recordings(state: NapariSessionState) -> None:
454
475
  """
455
476
  if len(state.loaded_recordings) == 0:
456
477
  return
457
- for loaded_recording in state.loaded_recordings:
458
- remove_loaded_recording_layers(state.viewer, loaded_recording)
478
+ _clear_all_viewer_layers(state.viewer)
459
479
  state.loaded_recordings.clear()
460
480
  clear_matching_state = getattr(
461
481
  state.group_matching_panel,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: twopy
3
- Version: 0.3.7
3
+ Version: 0.3.8
4
4
  Summary: Two-photon imaging analysis tool with a napari interface.
5
5
  Author-email: Gustavo Madeira Santana <fromweb1@gumadeiras.com>
6
6
  License-Expression: MIT
@@ -114,7 +114,7 @@ twopy/napari/protocols.py,sha256=ZZKBrihoXNzBYdPp7z7dB9aetZsHrcWwYEdJ40w_w08,396
114
114
  twopy/napari/responses.py,sha256=5pehTKhX0vXt243uH8RorHO0Mnwc_AhTGFujJeL8hoQ,11803
115
115
  twopy/napari/roi.py,sha256=C74NY22w1ZwFSikb3IWXOXXv3yQv91KBGBQ4TQqYCVE,14901
116
116
  twopy/napari/roi_signatures.py,sha256=f7agEqdEKlRYFZBTV6zTDobOSpKy5A3FpP0_HYdg_7o,618
117
- twopy/napari/session.py,sha256=xZpGp2zxEqXQ76PgL6qnRouX9vd61KA82tM1ABXDTkw,18356
117
+ twopy/napari/session.py,sha256=wcpBmQHoKQ9vZPLs39a_t6GLMCnuj4QcxSiL7bVOZlA,19012
118
118
  twopy/napari/sidebar.py,sha256=wBMWvVlSUJdM8uRfq1KI6ebN3Da0nLZjenIyojGQn2o,8520
119
119
  twopy/napari/state.py,sha256=P4QD9XZdeHvm_Ebjn7nOqV49gmDUTqBr0kSlOSZruhU,7337
120
120
  twopy/napari/text.py,sha256=amsxpoq4zMj5sHnNIiWpcVS5sS2KzIh7d1vQD2C4paE,2127
@@ -146,7 +146,7 @@ twopy/napari/group_matching/window.py,sha256=bLxT-qUAjzSkJVhynBeQXKMZIfeIlWl5gq1
146
146
  twopy/napari/plotting/__init__.py,sha256=JWUrDXYi6x8YYMrzGZyJtIKz6U8-CR9cVxDIkNsnuVY,1572
147
147
  twopy/napari/plotting/data.py,sha256=Rpiy_NePnd56-ixunN8inp8ez57Vfn41h-UhBE5pZX0,16343
148
148
  twopy/napari/plotting/dff_options.py,sha256=-Jwa5A15qJpKYUFnQi8ZedftPZUTWsdQ-IXy-T3VWu8,15956
149
- twopy/napari/plotting/export.py,sha256=BeySQQ-SUg_7bFYMEj4C1z1TKoyVh2jlCts4wh2YMDg,30338
149
+ twopy/napari/plotting/export.py,sha256=rEXVzXW1ojgphi53CI0djOIs4f1FtpQsZkMis_4ZUUY,30891
150
150
  twopy/napari/plotting/export_controls.py,sha256=oy0k7Zi3Iyv5Fhz1Wx4qWwxU-ZYsmMAzVxhriVI6w4M,11105
151
151
  twopy/napari/plotting/form_controls.py,sha256=qqiiOzfIT7oHHlft9qUBf2Z_6rUZP8vfX5XCW8tp_hA,2526
152
152
  twopy/napari/plotting/label_visibility.py,sha256=415JAD6dqYYJvGIikgay2RPTHEc2FEsULzzlTjLzeVE,9246
@@ -180,8 +180,8 @@ twopy/parity/psycho5.py,sha256=Xg7Q8Ipyv6hH9AXYKLxU0cLx9z10uWDLg7PNxT-rDyk,13908
180
180
  twopy/parity/roi.py,sha256=Q3deH6xRGCmTXASTlPHQgzH7FhBWkdjRUgh9skyS8j0,4975
181
181
  twopy/parity/roi_extraction.py,sha256=Z-ABVSB4Z6IUqZMWU1bq6Ko1tGP4uTdzk3As0gHaHTA,10372
182
182
  twopy/parity/saved_analysis.py,sha256=Kbpaxh1zapR5XxnHEkin8r4mEZX8kEtonudeZcwI7Dw,5597
183
- twopy-0.3.7.dist-info/METADATA,sha256=z50WG35cIqK6rU9DCY_d3zCD0FNpJZZtKFAB2nwYhO8,4143
184
- twopy-0.3.7.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
185
- twopy-0.3.7.dist-info/entry_points.txt,sha256=RnmRKOxEv5ZwLN-dArdSB678gM2iNxbE30VwRpwhp8o,44
186
- twopy-0.3.7.dist-info/top_level.txt,sha256=8MB6QGpnHMTeTfEE543DOr676HcemeoELujrJkFcvak,6
187
- twopy-0.3.7.dist-info/RECORD,,
183
+ twopy-0.3.8.dist-info/METADATA,sha256=jjT2lCro_K1biXVpbzMoRSipJPkbzaJ3nvZU8USEsxo,4143
184
+ twopy-0.3.8.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
185
+ twopy-0.3.8.dist-info/entry_points.txt,sha256=RnmRKOxEv5ZwLN-dArdSB678gM2iNxbE30VwRpwhp8o,44
186
+ twopy-0.3.8.dist-info/top_level.txt,sha256=8MB6QGpnHMTeTfEE543DOr676HcemeoELujrJkFcvak,6
187
+ twopy-0.3.8.dist-info/RECORD,,
File without changes