motile-tracker 3.1.3.dev0__tar.gz → 3.1.4.dev0__tar.gz

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.
Files changed (104) hide show
  1. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/PKG-INFO +1 -1
  2. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/application_menus/menu_widget.py +15 -8
  3. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/solution_tracks.py +31 -25
  4. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/contour_labels.py +2 -4
  5. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/track_labels.py +2 -2
  6. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/view_3d/view3D.py +6 -1
  7. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/PKG-INFO +1 -1
  8. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/.github/workflows/deploy.yml +0 -0
  9. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/.github/workflows/docs.yml +0 -0
  10. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/.github/workflows/test.yml +0 -0
  11. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/.gitignore +0 -0
  12. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/.pre-commit-config.yaml +0 -0
  13. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/LICENSE +0 -0
  14. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/README.md +0 -0
  15. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/conda_config.yml +0 -0
  16. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/Makefile +0 -0
  17. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/conf.py +0 -0
  18. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/editing.rst +0 -0
  19. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/getting_started.rst +0 -0
  20. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/images/add_edge.png +0 -0
  21. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/images/add_node.png +0 -0
  22. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/images/break_edge.png +0 -0
  23. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/images/delete_node.png +0 -0
  24. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/images/results_demo_720p.mp4 +0 -0
  25. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/index.rst +0 -0
  26. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/key_bindings.rst +0 -0
  27. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/motile.rst +0 -0
  28. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/docs/source/tree_view.rst +0 -0
  29. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/pyproject.toml +0 -0
  30. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/scripts/hela_example_tracks.csv +0 -0
  31. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/scripts/load_external_points.py +0 -0
  32. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/scripts/run_hela.py +0 -0
  33. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/scripts/test_edge_selection.py +0 -0
  34. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/scripts/view_external_tracks.py +0 -0
  35. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/setup.cfg +0 -0
  36. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/__init__.py +0 -0
  37. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/application_menus/__init__.py +0 -0
  38. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/application_menus/editing_menu.py +0 -0
  39. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/application_menus/main_app.py +0 -0
  40. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/__init__.py +0 -0
  41. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/action_history.py +0 -0
  42. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/actions.py +0 -0
  43. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/node_type.py +0 -0
  44. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/tracks.py +0 -0
  45. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_model/tracks_controller.py +0 -0
  46. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/__init__.py +0 -0
  47. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/__init__.py +0 -0
  48. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/__init__.py +0 -0
  49. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/track_graph.py +0 -0
  50. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/track_points.py +0 -0
  51. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/layers/tracks_layer_group.py +0 -0
  52. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/__init__.py +0 -0
  53. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/flip_axes_widget.py +0 -0
  54. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/navigation_widget.py +0 -0
  55. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/tree_view_feature_widget.py +0 -0
  56. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/tree_view_mode_widget.py +0 -0
  57. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/tree_widget.py +0 -0
  58. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/tree_view/tree_widget_utils.py +0 -0
  59. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/view_3d/__init__.py +0 -0
  60. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/view_3d/clipping_plane_sliders.py +0 -0
  61. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/view_3d/layer_dropdown.py +0 -0
  62. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views/view_3d/multiple_view_widget.py +0 -0
  63. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views_coordinator/__init__.py +0 -0
  64. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views_coordinator/collection_widget.py +0 -0
  65. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views_coordinator/node_selection_list.py +0 -0
  66. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views_coordinator/tracks_list.py +0 -0
  67. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/data_views/views_coordinator/tracks_viewer.py +0 -0
  68. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/example_data.py +0 -0
  69. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/__init__.py +0 -0
  70. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/load_tracks.py +0 -0
  71. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/__init__.py +0 -0
  72. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/csv_widget.py +0 -0
  73. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/import_external_tracks_dialog.py +0 -0
  74. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/measurement_widget.py +0 -0
  75. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/metadata_menu.py +0 -0
  76. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/import_export/menus/segmentation_widget.py +0 -0
  77. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/backend/__init__.py +0 -0
  78. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/backend/motile_run.py +0 -0
  79. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/backend/solve.py +0 -0
  80. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/backend/solver_params.py +0 -0
  81. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/__init__.py +0 -0
  82. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/motile_widget.py +0 -0
  83. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/param_values.py +0 -0
  84. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/params_editor.py +0 -0
  85. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/params_viewer.py +0 -0
  86. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/run_editor.py +0 -0
  87. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/motile/menus/run_viewer.py +0 -0
  88. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker/napari.yaml +0 -0
  89. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/SOURCES.txt +0 -0
  90. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/dependency_links.txt +0 -0
  91. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/entry_points.txt +0 -0
  92. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/requires.txt +0 -0
  93. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/src/motile_tracker.egg-info/top_level.txt +0 -0
  94. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/conftest.py +0 -0
  95. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/data_model/test_action_history.py +0 -0
  96. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/data_model/test_actions.py +0 -0
  97. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/data_model/test_tracks.py +0 -0
  98. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/data_model/test_tracks_controller.py +0 -0
  99. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/import_export/test_export_solution_to_csv.py +0 -0
  100. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/import_export/test_import_external_tracks.py +0 -0
  101. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/motile/backend/test_motile_run.py +0 -0
  102. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/motile/backend/test_solver.py +0 -0
  103. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/motile/menus/test_run_editor.py +0 -0
  104. {motile_tracker-3.1.3.dev0 → motile_tracker-3.1.4.dev0}/tests/motile_plugin/utils/test_tree_widget_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: motile-tracker
3
- Version: 3.1.3.dev0
3
+ Version: 3.1.4.dev0
4
4
  Summary: Application for interactive tracking with global optimization
5
5
  Author-email: Caroline Malin-Mayor <malinmayorc@janelia.hhmi.org>
6
6
  License: BSD 3-Clause License
@@ -13,24 +13,31 @@ class MenuWidget(QScrollArea):
13
13
  def __init__(self, viewer: napari.Viewer):
14
14
  super().__init__()
15
15
 
16
+ self.viewer = viewer
16
17
  tracks_viewer = TracksViewer.get_instance(viewer)
17
18
 
18
19
  motile_widget = MotileWidget(viewer)
19
20
  editing_widget = EditingMenu(viewer)
20
21
  view3D_widget = View3D(viewer)
22
+ view3D_widget.update_tab.connect(self.update_3D_tab)
21
23
 
22
- tabwidget = QTabWidget()
24
+ self.tabwidget = QTabWidget()
23
25
 
24
- tabwidget.addTab(view3D_widget, "3D viewing")
25
- tabwidget.addTab(motile_widget, "Track with Motile")
26
- tabwidget.addTab(editing_widget, "Edit Tracks")
27
- tabwidget.addTab(tracks_viewer.tracks_list, "Results List")
28
- tabwidget.addTab(tracks_viewer.collection_widget, "Collections")
26
+ self.tabwidget.addTab(view3D_widget, "3D viewing")
27
+ self.tabwidget.addTab(motile_widget, "Track with Motile")
28
+ self.tabwidget.addTab(editing_widget, "Edit Tracks")
29
+ self.tabwidget.addTab(tracks_viewer.tracks_list, "Results List")
30
+ self.tabwidget.addTab(tracks_viewer.collection_widget, "Collections")
29
31
 
30
32
  layout = QVBoxLayout()
31
- layout.addWidget(tabwidget)
33
+ layout.addWidget(self.tabwidget)
32
34
 
33
- self.setWidget(tabwidget)
35
+ self.setWidget(self.tabwidget)
34
36
  self.setWidgetResizable(True)
35
37
 
36
38
  self.setLayout(layout)
39
+
40
+ def update_3D_tab(self):
41
+ if self.tabwidget.currentIndex() == 0:
42
+ self.tabwidget.setCurrentIndex(1)
43
+ self.tabwidget.setCurrentIndex(0)
@@ -1,8 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  from typing import TYPE_CHECKING
4
5
 
5
6
  import networkx as nx
7
+ import pandas as pd
6
8
  from motile_toolbox.candidate_graph.graph_attributes import NodeAttr
7
9
 
8
10
  from .tracks import Tracks
@@ -177,31 +179,35 @@ class SolutionTracks(Tracks):
177
179
  }
178
180
  header = header + list(additional_attrs)
179
181
 
180
- with open(outfile, "w") as f:
181
- f.write(",".join(header))
182
- for node_id in self.graph.nodes():
183
- parents = list(self.graph.predecessors(node_id))
184
- parent_id = "" if len(parents) == 0 else parents[0]
185
- track_id = self.get_track_id(node_id)
186
- time = self.get_time(node_id)
187
- position = self.get_position(node_id)
188
- lineage_id = self.get_lineage_id(node_id)
189
- color = colormap.map(track_id)[:3] * 255
190
- attrs = [
191
- self._get_node_attr(node_id, attr) for attr in additional_attrs
192
- ]
193
- row = [
194
- time,
195
- *position,
196
- node_id,
197
- parent_id,
198
- track_id,
199
- lineage_id,
200
- color,
201
- *attrs,
202
- ]
203
- f.write("\n")
204
- f.write(",".join(map(str, row)))
182
+ data = []
183
+ for node_id in self.graph.nodes():
184
+ parents = list(self.graph.predecessors(node_id))
185
+ parent_id = "" if len(parents) == 0 else parents[0]
186
+ track_id = self.get_track_id(node_id)
187
+ time = self.get_time(node_id)
188
+ position = self.get_position(node_id)
189
+ lineage_id = self.get_lineage_id(node_id)
190
+ color = colormap.map(track_id)[:3] * 255
191
+ attrs = [
192
+ self._get_node_attr(node_id, attr)
193
+ if attr != "group"
194
+ else json.dumps(self._get_node_attr(node_id, attr))
195
+ for attr in additional_attrs
196
+ ]
197
+ row = [
198
+ time,
199
+ *position,
200
+ node_id,
201
+ parent_id,
202
+ track_id,
203
+ lineage_id,
204
+ color,
205
+ *attrs,
206
+ ]
207
+ data.append(row)
208
+
209
+ df = pd.DataFrame(data, columns=header)
210
+ df.to_csv(outfile, index=False)
205
211
 
206
212
  def add_nodes(
207
213
  self,
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import functools
4
3
  from typing import Optional
5
4
 
6
5
  import napari
@@ -47,9 +46,7 @@ def get_contours(
47
46
 
48
47
  # instead of filling with background label, fill the group label with their normal color
49
48
  if group_labels is not None and len(group_labels) > 0:
50
- group_mask = functools.reduce(
51
- np.logical_or, (labels == val for val in group_labels)
52
- )
49
+ group_mask = np.isin(labels, group_labels)
53
50
  combined_mask = not_boundaries & group_mask
54
51
  contours = np.where(combined_mask, labels, contours)
55
52
 
@@ -100,6 +97,7 @@ class ContourLabels(napari.layers.Labels):
100
97
  Returns None if the contour parameter is less than 1,
101
98
  or if the label array has more than 2 dimensions.
102
99
  """
100
+
103
101
  if self.contour < 1:
104
102
  return None
105
103
  if labels.ndim > 2:
@@ -45,7 +45,7 @@ def _new_label(layer: TrackLabels, new_track_id=True):
45
45
  """
46
46
 
47
47
  if isinstance(layer.data, np.ndarray):
48
- new_selected_label = np.max(layer.data) + 1
48
+ new_selected_label = int(np.max(layer.data) + 1)
49
49
  if layer.selected_label == new_selected_label:
50
50
  show_info(
51
51
  trans._(
@@ -362,7 +362,7 @@ class TrackLabels(ContourLabels):
362
362
  else:
363
363
  if self.viewer.dims.ndisplay == 2:
364
364
  self.contour = 1
365
- self.group_labels = visible
365
+ self.group_labels = visible + highlighted._list
366
366
  self.update_group_labels.emit(self.group_labels)
367
367
  else:
368
368
  self.colormap.color_dict = {
@@ -1,4 +1,5 @@
1
1
  import napari
2
+ from psygnal import Signal
2
3
  from qtpy.QtWidgets import QLabel, QVBoxLayout, QWidget
3
4
 
4
5
  from .clipping_plane_sliders import PlaneSliderWidget
@@ -30,6 +31,8 @@ class OrthogonalViews(QWidget):
30
31
  class View3D(QWidget):
31
32
  """Widget to combine multiple views and cross widget together."""
32
33
 
34
+ update_tab = Signal()
35
+
33
36
  def __init__(
34
37
  self,
35
38
  viewer: napari.Viewer,
@@ -59,7 +62,7 @@ class View3D(QWidget):
59
62
  self.plane_widget.hide()
60
63
  self.widget_2d.hide()
61
64
 
62
- # Show the correct widget initially
65
+ # Show the correct widget
63
66
  self.display_changed()
64
67
 
65
68
  def display_changed(self, event=None):
@@ -75,5 +78,7 @@ class View3D(QWidget):
75
78
  self.plane_widget.show()
76
79
  elif self.viewer.dims.ndisplay == 2:
77
80
  self.orth_views.show()
81
+ self.orth_views.update()
82
+ self.update_tab.emit()
78
83
  else:
79
84
  self.widget_2d.show()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: motile-tracker
3
- Version: 3.1.3.dev0
3
+ Version: 3.1.4.dev0
4
4
  Summary: Application for interactive tracking with global optimization
5
5
  Author-email: Caroline Malin-Mayor <malinmayorc@janelia.hhmi.org>
6
6
  License: BSD 3-Clause License