driftlessmap 1.1.0__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.
Files changed (210) hide show
  1. driftlessmap/__init__.py +16 -0
  2. driftlessmap/__main__.py +5 -0
  3. driftlessmap/about.py +24 -0
  4. driftlessmap/allen_downloader.py +908 -0
  5. driftlessmap/app.py +8085 -0
  6. driftlessmap/atlas_downloader.py +370 -0
  7. driftlessmap/atlas_loader.py +526 -0
  8. driftlessmap/atlas_processor.py +784 -0
  9. driftlessmap/atlas_transform.py +111 -0
  10. driftlessmap/atlas_view.py +1435 -0
  11. driftlessmap/cell_detection.py +27 -0
  12. driftlessmap/coordinate_validation.py +19 -0
  13. driftlessmap/czi_reader.py +236 -0
  14. driftlessmap/data/WHS_atlas_labels.pkl +0 -0
  15. driftlessmap/data/allen_mice_atlas_labels.pkl +0 -0
  16. driftlessmap/data/atlas_labels.pkl +0 -0
  17. driftlessmap/data/query.csv +1328 -0
  18. driftlessmap/download_utils.py +85 -0
  19. driftlessmap/herbs.png +0 -0
  20. driftlessmap/icons/backward.svg +15 -0
  21. driftlessmap/icons/dot.svg +11 -0
  22. driftlessmap/icons/down-arrow.svg +10 -0
  23. driftlessmap/icons/fast_backward.svg +14 -0
  24. driftlessmap/icons/fast_forward.svg +14 -0
  25. driftlessmap/icons/forward.svg +14 -0
  26. driftlessmap/icons/layers/add.png +0 -0
  27. driftlessmap/icons/layers/ai.png +0 -0
  28. driftlessmap/icons/layers/eye_off.png +0 -0
  29. driftlessmap/icons/layers/eye_on.png +0 -0
  30. driftlessmap/icons/layers/eye_white.png +0 -0
  31. driftlessmap/icons/layers/hi.png +0 -0
  32. driftlessmap/icons/layers/trash.png +0 -0
  33. driftlessmap/icons/object.svg +22 -0
  34. driftlessmap/icons/sidebar/add.png +0 -0
  35. driftlessmap/icons/sidebar/atlascontrol.png +0 -0
  36. driftlessmap/icons/sidebar/atlascontrol.svg +32 -0
  37. driftlessmap/icons/sidebar/bnd.svg +14 -0
  38. driftlessmap/icons/sidebar/c_section.png +0 -0
  39. driftlessmap/icons/sidebar/c_section2.png +0 -0
  40. driftlessmap/icons/sidebar/cell.svg +24 -0
  41. driftlessmap/icons/sidebar/check.svg +9 -0
  42. driftlessmap/icons/sidebar/compare.svg +18 -0
  43. driftlessmap/icons/sidebar/contour.svg +14 -0
  44. driftlessmap/icons/sidebar/h_section.png +0 -0
  45. driftlessmap/icons/sidebar/info.svg +14 -0
  46. driftlessmap/icons/sidebar/layers.png +0 -0
  47. driftlessmap/icons/sidebar/layers.svg +23 -0
  48. driftlessmap/icons/sidebar/line.svg +10 -0
  49. driftlessmap/icons/sidebar/link.svg +18 -0
  50. driftlessmap/icons/sidebar/link_off.svg +18 -0
  51. driftlessmap/icons/sidebar/merge.svg +11 -0
  52. driftlessmap/icons/sidebar/object.svg +13 -0
  53. driftlessmap/icons/sidebar/probe.png +0 -0
  54. driftlessmap/icons/sidebar/probe.svg +23 -0
  55. driftlessmap/icons/sidebar/rotation_horizontal.svg +14 -0
  56. driftlessmap/icons/sidebar/rotation_vertical.svg +14 -0
  57. driftlessmap/icons/sidebar/s_section.png +0 -0
  58. driftlessmap/icons/sidebar/tool.png +0 -0
  59. driftlessmap/icons/sidebar/tool.svg +19 -0
  60. driftlessmap/icons/sidebar/trash.png +0 -0
  61. driftlessmap/icons/sidebar/tree_checked.svg +10 -0
  62. driftlessmap/icons/sidebar/treeview.png +0 -0
  63. driftlessmap/icons/sidebar/treeview.svg +10 -0
  64. driftlessmap/icons/sidebar/treeview2.png +0 -0
  65. driftlessmap/icons/sidebar/virus.svg +24 -0
  66. driftlessmap/icons/tdown.svg +16 -0
  67. driftlessmap/icons/toolbar/accept.svg +18 -0
  68. driftlessmap/icons/toolbar/accept2.svg +24 -0
  69. driftlessmap/icons/toolbar/aim.svg +44 -0
  70. driftlessmap/icons/toolbar/aim_not.svg +28 -0
  71. driftlessmap/icons/toolbar/anchor.svg +14 -0
  72. driftlessmap/icons/toolbar/anticlockwise_rotation.svg +12 -0
  73. driftlessmap/icons/toolbar/atlas_icon.png +0 -0
  74. driftlessmap/icons/toolbar/boundary_register.svg +18 -0
  75. driftlessmap/icons/toolbar/cancel.svg +32 -0
  76. driftlessmap/icons/toolbar/cell_select.svg +22 -0
  77. driftlessmap/icons/toolbar/cell_select_not.svg +12 -0
  78. driftlessmap/icons/toolbar/check.svg +9 -0
  79. driftlessmap/icons/toolbar/clockwise_rotation.svg +11 -0
  80. driftlessmap/icons/toolbar/closed_path.svg +16 -0
  81. driftlessmap/icons/toolbar/closed_path2 copy.svg +19 -0
  82. driftlessmap/icons/toolbar/closed_path2.svg +20 -0
  83. driftlessmap/icons/toolbar/eraser.png +0 -0
  84. driftlessmap/icons/toolbar/eraser.svg +19 -0
  85. driftlessmap/icons/toolbar/eye.svg +17 -0
  86. driftlessmap/icons/toolbar/eye_closed.svg +19 -0
  87. driftlessmap/icons/toolbar/fill.svg +12 -0
  88. driftlessmap/icons/toolbar/gps.svg +15 -0
  89. driftlessmap/icons/toolbar/h_flip.png +0 -0
  90. driftlessmap/icons/toolbar/handle.png +0 -0
  91. driftlessmap/icons/toolbar/image_icon.png +0 -0
  92. driftlessmap/icons/toolbar/image_icon.svg +25 -0
  93. driftlessmap/icons/toolbar/info.svg +14 -0
  94. driftlessmap/icons/toolbar/inpart.png +0 -0
  95. driftlessmap/icons/toolbar/inpart.svg +17 -0
  96. driftlessmap/icons/toolbar/lasso.png +0 -0
  97. driftlessmap/icons/toolbar/lasso.svg +14 -0
  98. driftlessmap/icons/toolbar/left90.png +0 -0
  99. driftlessmap/icons/toolbar/line.svg +10 -0
  100. driftlessmap/icons/toolbar/line_sites.svg +11 -0
  101. driftlessmap/icons/toolbar/linear_silicon.png +0 -0
  102. driftlessmap/icons/toolbar/linear_silicon.svg +88 -0
  103. driftlessmap/icons/toolbar/list.svg +14 -0
  104. driftlessmap/icons/toolbar/location.svg +14 -0
  105. driftlessmap/icons/toolbar/magic-wand.svg +16 -0
  106. driftlessmap/icons/toolbar/magic_white.png +0 -0
  107. driftlessmap/icons/toolbar/mask.svg +10 -0
  108. driftlessmap/icons/toolbar/match.svg +20 -0
  109. driftlessmap/icons/toolbar/matchbnd.svg +18 -0
  110. driftlessmap/icons/toolbar/matching.svg +36 -0
  111. driftlessmap/icons/toolbar/merge.svg +11 -0
  112. driftlessmap/icons/toolbar/move_down.png +0 -0
  113. driftlessmap/icons/toolbar/move_left.png +0 -0
  114. driftlessmap/icons/toolbar/move_right.png +0 -0
  115. driftlessmap/icons/toolbar/move_up.png +0 -0
  116. driftlessmap/icons/toolbar/moving.png +0 -0
  117. driftlessmap/icons/toolbar/multi-probe.svg +119 -0
  118. driftlessmap/icons/toolbar/multi_pencil.svg +23 -0
  119. driftlessmap/icons/toolbar/multi_probe.png +0 -0
  120. driftlessmap/icons/toolbar/object.svg +13 -0
  121. driftlessmap/icons/toolbar/open_path.svg +22 -0
  122. driftlessmap/icons/toolbar/outpart.png +0 -0
  123. driftlessmap/icons/toolbar/outpart.svg +26 -0
  124. driftlessmap/icons/toolbar/pencil.png +0 -0
  125. driftlessmap/icons/toolbar/pencil.svg +19 -0
  126. driftlessmap/icons/toolbar/plasso.png +0 -0
  127. driftlessmap/icons/toolbar/probe.svg +19 -0
  128. driftlessmap/icons/toolbar/radar.svg +32 -0
  129. driftlessmap/icons/toolbar/rotation.svg +45 -0
  130. driftlessmap/icons/toolbar/rotation_clockwise.svg +18 -0
  131. driftlessmap/icons/toolbar/rotation_counter_clockwise.svg +18 -0
  132. driftlessmap/icons/toolbar/ruler.svg +27 -0
  133. driftlessmap/icons/toolbar/separate_sites.svg +13 -0
  134. driftlessmap/icons/toolbar/single_pencil.svg +16 -0
  135. driftlessmap/icons/toolbar/toa.svg +11 -0
  136. driftlessmap/icons/toolbar/toa_delete.svg +36 -0
  137. driftlessmap/icons/toolbar/toaa.svg +11 -0
  138. driftlessmap/icons/toolbar/toh.svg +11 -0
  139. driftlessmap/icons/toolbar/toh_delete.svg +36 -0
  140. driftlessmap/icons/toolbar/tohh.svg +11 -0
  141. driftlessmap/icons/toolbar/trans.png +0 -0
  142. driftlessmap/icons/toolbar/trans.svg +16 -0
  143. driftlessmap/icons/toolbar/triangulation.svg +10 -0
  144. driftlessmap/icons/toolbar/two_window.png +0 -0
  145. driftlessmap/icons/toolbar/unmerge.svg +16 -0
  146. driftlessmap/icons/toolbar/v_flip.png +0 -0
  147. driftlessmap/icons/toolbar/virus.svg +24 -0
  148. driftlessmap/icons/toolbar/virus_register.svg +31 -0
  149. driftlessmap/icons/toolbar/vis2d.svg +29 -0
  150. driftlessmap/icons/toolbar/window2.png +0 -0
  151. driftlessmap/icons/toolbar/window3.png +0 -0
  152. driftlessmap/icons/toolbar/window4.png +0 -0
  153. driftlessmap/icons/tree_close.svg +14 -0
  154. driftlessmap/icons/tree_open.svg +14 -0
  155. driftlessmap/icons/up-arrow.svg +10 -0
  156. driftlessmap/image_curves.py +579 -0
  157. driftlessmap/image_reader.py +186 -0
  158. driftlessmap/image_stacks.py +359 -0
  159. driftlessmap/image_view.py +646 -0
  160. driftlessmap/images_reader.py +5 -0
  161. driftlessmap/label_tree.py +278 -0
  162. driftlessmap/layer_validation.py +25 -0
  163. driftlessmap/layers_control.py +554 -0
  164. driftlessmap/main_window.ui +883 -0
  165. driftlessmap/movable_points.py +254 -0
  166. driftlessmap/obj_items.py +122 -0
  167. driftlessmap/object_control.py +1762 -0
  168. driftlessmap/persistence.py +376 -0
  169. driftlessmap/popup_message.py +16 -0
  170. driftlessmap/probe_csv.py +319 -0
  171. driftlessmap/probe_reconstruction.py +409 -0
  172. driftlessmap/probe_utiles.py +1442 -0
  173. driftlessmap/qss/atlas_view_group_box.qss +15 -0
  174. driftlessmap/qss/box_label.qss +7 -0
  175. driftlessmap/qss/channel_selector.qss +19 -0
  176. driftlessmap/qss/color_combo.qss +121 -0
  177. driftlessmap/qss/decor_label.qss +9 -0
  178. driftlessmap/qss/dialogs.qss +11 -0
  179. driftlessmap/qss/hidden_line_edit.qss +5 -0
  180. driftlessmap/qss/label_tree.qss +123 -0
  181. driftlessmap/qss/main_window.qss +243 -0
  182. driftlessmap/qss/menu_bar.qss +42 -0
  183. driftlessmap/qss/multi_handle_slider.qss +14 -0
  184. driftlessmap/qss/obj_ctrl_bottom_button.qss +29 -0
  185. driftlessmap/qss/object_text_button.qss +19 -0
  186. driftlessmap/qss/page_control.qss +36 -0
  187. driftlessmap/qss/rotation_button.qss +9 -0
  188. driftlessmap/qss/side_bar.qss +23 -0
  189. driftlessmap/qss/spinbox.qss +106 -0
  190. driftlessmap/qss/tabs.qss +211 -0
  191. driftlessmap/qss/tool_bar.qss +77 -0
  192. driftlessmap/resources.py +34 -0
  193. driftlessmap/roi_analysis.py +375 -0
  194. driftlessmap/run_driftlessmap.py +4 -0
  195. driftlessmap/slice_stacks.py +268 -0
  196. driftlessmap/slice_validation.py +20 -0
  197. driftlessmap/toolbox.py +569 -0
  198. driftlessmap/triangulation.py +517 -0
  199. driftlessmap/triangulation_points.py +108 -0
  200. driftlessmap/user_settings.py +92 -0
  201. driftlessmap/uuuuuu.py +1168 -0
  202. driftlessmap/version.py +3 -0
  203. driftlessmap/widgets_utils.py +140 -0
  204. driftlessmap/wtiles.py +715 -0
  205. driftlessmap-1.1.0.dist-info/METADATA +186 -0
  206. driftlessmap-1.1.0.dist-info/RECORD +210 -0
  207. driftlessmap-1.1.0.dist-info/WHEEL +5 -0
  208. driftlessmap-1.1.0.dist-info/entry_points.txt +2 -0
  209. driftlessmap-1.1.0.dist-info/licenses/LICENSE.txt +23 -0
  210. driftlessmap-1.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,254 @@
1
+ import os
2
+ import sys
3
+ import numpy as np
4
+ import pyqtgraph as pg
5
+ from PyQt6.QtCore import *
6
+ from pyqtgraph.Qt import QtGui, QtCore
7
+
8
+
9
+ class MovablePoints(pg.GraphItem):
10
+ mouseHovered = pyqtSignal(object)
11
+ mouseDragged = pyqtSignal(object)
12
+ mouseClicked = pyqtSignal(object)
13
+
14
+ def __init__(self):
15
+ self.dragPoint = None
16
+ self.dragOffset = None
17
+ pg.GraphItem.__init__(self)
18
+ self.data = None
19
+ self.y_range = None
20
+
21
+ def setData(self, **kwds):
22
+ self.data = kwds
23
+ if 'pos' in self.data:
24
+ if self.y_range is None:
25
+ self.y_range = self.data['pos'][-1, 1]
26
+ self.npts = self.data['pos'].shape[0]
27
+ self.data['data'] = np.empty(self.npts, dtype=[('index', int)])
28
+ self.data['data']['index'] = np.arange(self.npts)
29
+ self.updateGraph()
30
+
31
+ def updateGraph(self):
32
+ pg.GraphItem.setData(self, **self.data)
33
+
34
+ def mouseDragEvent(self, ev):
35
+ if ev.button() != QtCore.Qt.MouseButton.LeftButton:
36
+ ev.ignore()
37
+ return
38
+
39
+ if ev.isStart():
40
+ pos = ev.buttonDownPos()
41
+ pts = self.scatter.pointsAt(pos)
42
+ if len(pts) == 0:
43
+ # self.mouseClicked.emit(ev)
44
+ ev.ignore()
45
+ return
46
+ self.dragPoint = pts[0]
47
+ ind = pts[0].data()[0]
48
+ if ind in [0, self.npts-1]:
49
+ return
50
+ self.dragOffset = self.data['pos'][ind] - pos
51
+ elif ev.isFinish():
52
+ self.dragPoint = None
53
+ return
54
+ else:
55
+ if self.dragPoint is None:
56
+ ev.ignore()
57
+ return
58
+
59
+ ind = self.dragPoint.data()[0]
60
+ temp_pos = ev.pos()
61
+ if temp_pos[0] <= self.data['pos'][ind - 1, 0]:
62
+ temp_pos[0] = self.data['pos'][ind - 1, 0] + 1
63
+ if temp_pos[0] >= self.data['pos'][ind + 1, 0]:
64
+ temp_pos[0] = self.data['pos'][ind + 1, 0] - 1
65
+
66
+ self.data['pos'][ind] = temp_pos + self.dragOffset
67
+ self.data['pos'][self.data['pos'][:, 1] > self.y_range, 1] = self.y_range
68
+ self.data['pos'][self.data['pos'][:, 1] < 0, 1] = 0
69
+ self.updateGraph()
70
+ self.mouseDragged.emit((ev, ind))
71
+ ev.accept()
72
+
73
+ def clear(self):
74
+ self.scatter.clear()
75
+
76
+
77
+
78
+ class TriangulationPoints(pg.GraphItem):
79
+ mouseHovered = pyqtSignal(object)
80
+ mouseDragged = pyqtSignal(object)
81
+ mouseClicked = pyqtSignal(object)
82
+
83
+ def __init__(self):
84
+ self.dragPoint = None
85
+ self.dragOffset = None
86
+ pg.GraphItem.__init__(self)
87
+ self.scatter.sigClicked.connect(self.onclick)
88
+ self.data = None
89
+ self.y_range = None
90
+ self.x_range = None
91
+
92
+ def setData(self, **kwds):
93
+ self.data = kwds
94
+ if 'pos' in self.data:
95
+ self.npts = self.data['pos'].shape[0]
96
+ self.data['data'] = np.empty(self.npts, dtype=[('index', int)])
97
+ self.data['data']['index'] = np.arange(self.npts)
98
+ self.update_graph()
99
+
100
+ def set_range(self, x_range, y_range):
101
+ self.x_range = x_range
102
+ self.y_range = y_range
103
+
104
+ def mouseDragEvent(self, ev):
105
+ if ev.button() != Qt.MouseButton.LeftButton:
106
+ ev.ignore()
107
+ return
108
+
109
+ if ev.isStart():
110
+ pos = ev.buttonDownPos()
111
+ pts = self.scatter.pointsAt(pos)
112
+ if len(pts) == 0:
113
+ # self.mouseClicked.emit(ev)
114
+ ev.ignore()
115
+ return
116
+ self.dragPoint = pts[0]
117
+ ind = pts[0].data()[0]
118
+
119
+ self.dragOffset = self.data['pos'][ind] - pos
120
+ elif ev.isFinish():
121
+ self.dragPoint = None
122
+ return
123
+ else:
124
+ if self.dragPoint is None:
125
+ ev.ignore()
126
+ return
127
+
128
+ ind = self.dragPoint.data()[0]
129
+ temp_pos = ev.pos()
130
+ if temp_pos[0] <= 0:
131
+ temp_pos[0] = 0
132
+ if temp_pos[0] >= self.x_range:
133
+ temp_pos[0] = self.x_range
134
+ if temp_pos[1] <= 0:
135
+ temp_pos[1] = 0
136
+ if temp_pos[1] >= self.y_range:
137
+ temp_pos[1] = self.y_range
138
+
139
+ self.data['pos'][ind] = temp_pos + self.dragOffset
140
+
141
+ self.update_graph()
142
+ self.mouseDragged.emit((ev, ind))
143
+ ev.accept()
144
+
145
+ def update_graph(self):
146
+ pg.GraphItem.setData(self, **self.data)
147
+
148
+ def onclick(self, ev, point):
149
+ ind = point[0].data()[0]
150
+ self.mouseClicked.emit((ev, ind))
151
+
152
+
153
+
154
+
155
+
156
+ class TriangulationPointsTest(pg.ScatterPlotItem):
157
+ mouseHovered = pyqtSignal(object)
158
+ mouseDragged = pyqtSignal(object)
159
+ mouseClicked = pyqtSignal(object)
160
+
161
+ def __init__(self):
162
+
163
+ pg.ScatterPlotItem.__init__(self)
164
+ self.sigClicked.connect(self.onclick)
165
+
166
+ self.data = None
167
+
168
+ self.y_range = None
169
+ self.x_range = None
170
+
171
+ self.drag_point = None
172
+ self.drag_offset = None
173
+
174
+ dtype = [
175
+ ('x', float),
176
+ ('y', float),
177
+ ('size', float),
178
+ ('symbol', object),
179
+ ('pen', object),
180
+ ('brush', object),
181
+ ('visible', bool),
182
+ ('data', object),
183
+ ('hovered', bool),
184
+ ('item', object),
185
+ ('index', int),
186
+ ('sourceRect', [
187
+ ('x', int),
188
+ ('y', int),
189
+ ('w', int),
190
+ ('h', int)
191
+ ])
192
+ ]
193
+
194
+ self.data = np.empty(0, dtype=dtype)
195
+
196
+ def setData(self, **kwds):
197
+ self.data = kwds
198
+ if 'pos' in self.data:
199
+ self.npts = self.data['pos'].shape[0]
200
+ self.data['data'] = np.empty(self.npts, dtype=[('index', int)])
201
+ self.data['data']['index'] = np.arange(self.npts)
202
+ # self.update_graph()
203
+
204
+ def set_range(self, x_range, y_range):
205
+ self.x_range = x_range
206
+ self.y_range = y_range
207
+
208
+ def mouseDragEvent(self, ev):
209
+ if ev.button() != Qt.MouseButton.LeftButton:
210
+ ev.ignore()
211
+ return
212
+
213
+ if ev.isStart():
214
+ pos = ev.buttonDownPos()
215
+ pts = self.pointsAt(pos)
216
+ if len(pts) == 0:
217
+ # self.mouseClicked.emit(ev)
218
+ ev.ignore()
219
+ return
220
+ self.dragPoint = pts[0]
221
+ ind = pts[0].data()[0]
222
+
223
+ self.drag_offset = self.data['pos'][ind] - pos
224
+ elif ev.isFinish():
225
+ self.drag_point = None
226
+ return
227
+ else:
228
+ if self.drag_point is None:
229
+ ev.ignore()
230
+ return
231
+
232
+ ind = self.dragPoint.data()[0]
233
+ temp_pos = ev.pos()
234
+ if temp_pos[0] <= 0:
235
+ temp_pos[0] = 0
236
+ if temp_pos[0] >= self.x_range:
237
+ temp_pos[0] = self.x_range
238
+ if temp_pos[1] <= 0:
239
+ temp_pos[1] = 0
240
+ if temp_pos[1] >= self.y_range:
241
+ temp_pos[1] = self.y_range
242
+
243
+ self.data['pos'][ind] = temp_pos + self.dragOffset
244
+
245
+ self.setData(pos=self.data['pos'])
246
+ self.mouseDragged.emit((ev, ind))
247
+ ev.accept()
248
+
249
+ # def update_graph(self):
250
+ # pg.ScatterPlotItem.setData(self, **self.data)
251
+
252
+ def onclick(self, ev, point):
253
+ ind = point[0].data()[0]
254
+ self.mouseClicked.emit((ev, ind))
@@ -0,0 +1,122 @@
1
+ import os
2
+ import pickle
3
+ import pyqtgraph as pg
4
+ import pyqtgraph.opengl as gl
5
+ import numpy as np
6
+ import scipy.ndimage as ndi
7
+
8
+
9
+ def get_object_vis_color(color):
10
+ vis_color = (color[0] / 255, color[1] / 255, color[2] / 255, 1)
11
+ return vis_color
12
+
13
+
14
+ def create_plot_points_in_3d(data_dict):
15
+ data_list = data_dict['data']
16
+ pnts = data_list[0]
17
+ for i in range(1, len(data_list)):
18
+ pnts = np.vstack([pnts, data_list[i]])
19
+ vis_color = get_object_vis_color(data_dict['vis_color'])
20
+ vis_points = gl.GLScatterPlotItem(pos=pnts, color=vis_color, size=3)
21
+ return vis_points
22
+
23
+
24
+ def create_probe_line_in_3d(data_dict):
25
+ pos = np.stack([data_dict['insertion_coords_3d'], data_dict['terminus_coords_3d']], axis=0)
26
+ vis_color = get_object_vis_color(data_dict['vis_color'])
27
+ probe_line = gl.GLLinePlotItem(pos=pos, color=vis_color, width=2, mode='line_strip')
28
+ return probe_line
29
+
30
+
31
+ def create_drawing_in_3d(data_dict):
32
+ data_list = data_dict['data']
33
+ pos = data_list[0]
34
+ for i in range(1, len(data_list)):
35
+ pos = np.vstack([pos, data_list[i]])
36
+
37
+ vis_color = get_object_vis_color(data_dict['vis_color'])
38
+ if data_dict['plot_mode'] == 'area':
39
+ drawing_obj = gl.GLScatterPlotItem(pos=pos, color=vis_color, size=3, pxMode=True)
40
+ else:
41
+ drawing_obj = gl.GLLinePlotItem(pos=pos, color=vis_color, width=2, mode='line_strip')
42
+ return drawing_obj
43
+
44
+
45
+ def create_contour_line_in_3d(data_dict):
46
+ data_list = data_dict['data']
47
+ pos = data_list[0]
48
+ for i in range(1, len(data_list)):
49
+ pos = np.vstack([pos, data_list[i]])
50
+ if np.any(pos[0] != pos[-1]):
51
+ pos = np.vstack([pos, pos[0]])
52
+
53
+ vis_color = get_object_vis_color(data_dict['vis_color'])
54
+ contour_obj = gl.GLLinePlotItem(pos=pos, color=vis_color, width=2, mode='line_strip')
55
+ return contour_obj
56
+
57
+
58
+ def make_3d_gl_widget(data_dict, obj_type):
59
+ if obj_type == 'merged probe':
60
+ obj_3d = create_probe_line_in_3d(data_dict)
61
+ elif obj_type == 'merged virus':
62
+ obj_3d = create_plot_points_in_3d(data_dict)
63
+ elif obj_type == 'merged cells':
64
+ obj_3d = create_plot_points_in_3d(data_dict)
65
+ elif obj_type == 'merged contour':
66
+ obj_3d = create_contour_line_in_3d(data_dict)
67
+ else:
68
+ obj_3d = create_drawing_in_3d(data_dict)
69
+ return obj_3d
70
+
71
+
72
+ def render_volume(atlas_data, atlas_folder, factor=2, level=0.1):
73
+ da_data = atlas_data.copy()
74
+ img = np.ascontiguousarray(da_data[::factor, ::factor, ::factor])
75
+ verts, faces = pg.isosurface(ndi.gaussian_filter(img.astype('float64'), (2, 2, 2)), np.max(da_data) * level)
76
+
77
+ md = gl.MeshData(vertexes=verts * factor, faces=faces)
78
+
79
+ outfile = open(os.path.join(atlas_folder, 'atlas_meshdata.pkl'), 'wb')
80
+ pickle.dump(md, outfile)
81
+ outfile.close()
82
+
83
+ return md
84
+
85
+
86
+ def render_small_volume(
87
+ label_id,
88
+ save_path,
89
+ atlas_data,
90
+ atlas_label,
91
+ factor=2,
92
+ level=0.1,
93
+ progress=None,
94
+ ):
95
+ if progress is not None:
96
+ progress(0.0, "copying atlas intensities")
97
+ temp_atlas = atlas_data.copy()
98
+ if progress is not None:
99
+ progress(0.2, "masking the selected structure")
100
+ temp_atlas[atlas_label != label_id] = 0
101
+ if progress is not None:
102
+ progress(0.4, "downsampling the structure volume")
103
+ pimg = np.ascontiguousarray(temp_atlas[::factor, ::factor, ::factor])
104
+ if progress is not None:
105
+ progress(0.5, "smoothing the structure volume")
106
+ smoothed = ndi.gaussian_filter(pimg.astype("float64"), (2, 2, 2))
107
+ if progress is not None:
108
+ progress(0.75, "extracting the mesh surface")
109
+ verts, faces = pg.isosurface(smoothed, np.max(temp_atlas) * level)
110
+ # small_verts_list[str(id)] = verts
111
+ # small_faces_list[str(id)] = faces
112
+
113
+ md = gl.MeshData(vertexes=verts * factor, faces=faces)
114
+
115
+ if progress is not None:
116
+ progress(0.9, "saving the generated mesh")
117
+ outfile = open(os.path.join(save_path, '{}.pkl'.format(label_id)), 'wb')
118
+ pickle.dump(md, outfile)
119
+ outfile.close()
120
+ if progress is not None:
121
+ progress(1.0, "mesh complete")
122
+