LineageTree 1.8.0__py3-none-any.whl → 2.0.3__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.
- LineageTree/__init__.py +27 -2
- LineageTree/legacy/export_csv.py +70 -0
- LineageTree/legacy/to_lineajea.py +30 -0
- LineageTree/legacy/to_motile.py +36 -0
- LineageTree/lineageTree.py +2298 -1471
- LineageTree/lineageTreeManager.py +767 -79
- LineageTree/loaders.py +942 -864
- LineageTree/test/test_lineageTree.py +634 -0
- LineageTree/test/test_uted.py +233 -0
- LineageTree/tree_approximation.py +488 -0
- LineageTree/utils.py +103 -103
- lineagetree-2.0.3.dist-info/METADATA +130 -0
- lineagetree-2.0.3.dist-info/RECORD +16 -0
- {LineageTree-1.8.0.dist-info → lineagetree-2.0.3.dist-info}/WHEEL +1 -1
- LineageTree/tree_styles.py +0 -334
- LineageTree-1.8.0.dist-info/METADATA +0 -156
- LineageTree-1.8.0.dist-info/RECORD +0 -11
- {LineageTree-1.8.0.dist-info → lineagetree-2.0.3.dist-info/licenses}/LICENSE +0 -0
- {LineageTree-1.8.0.dist-info → lineagetree-2.0.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,634 @@
|
|
1
|
+
import warnings
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
import pytest
|
5
|
+
|
6
|
+
from LineageTree import (
|
7
|
+
lineageTree,
|
8
|
+
lineageTreeManager,
|
9
|
+
read_from_mamut_xml,
|
10
|
+
read_from_mastodon,
|
11
|
+
tree_approximation,
|
12
|
+
)
|
13
|
+
|
14
|
+
lT1 = read_from_mamut_xml("src/LineageTree/test/data/test-mamut.xml")
|
15
|
+
lT2 = read_from_mastodon("src/LineageTree/test/data/test.mastodon")
|
16
|
+
lt = lineageTree.load("src/LineageTree/test/data/demo.lT")
|
17
|
+
|
18
|
+
|
19
|
+
def test_read_MaMuT_xml():
|
20
|
+
assert lT1.name == "test-mamut"
|
21
|
+
assert len(lT1.nodes) == 2430
|
22
|
+
assert len(lT1.successor) == 2430
|
23
|
+
assert lT2.name == "test"
|
24
|
+
assert len(lT2.roots) == 3
|
25
|
+
assert len(lT2.nodes) == 41
|
26
|
+
assert len(lT2.successor) == 41
|
27
|
+
assert len(lT2.find_leaves(40)) == 2
|
28
|
+
|
29
|
+
|
30
|
+
@pytest.fixture(scope="session")
|
31
|
+
def test_write(tmp_path_factory):
|
32
|
+
tmp_path = str(tmp_path_factory.mktemp("lineagetree")) + ".lT"
|
33
|
+
lt.labels[list(lt.nodes)[0]] = "test"
|
34
|
+
lt._comparisons = {(1, 2): 30}
|
35
|
+
lt.write(str(tmp_path))
|
36
|
+
return tmp_path
|
37
|
+
|
38
|
+
|
39
|
+
def test_load(test_write):
|
40
|
+
lt2 = lineageTree.load(str(test_write))
|
41
|
+
assert lt2._comparisons == {(1, 2): 30}
|
42
|
+
assert lt.labels[list(lt.nodes)[0]] == "test"
|
43
|
+
assert lt == lt2
|
44
|
+
|
45
|
+
|
46
|
+
def test_all_chains():
|
47
|
+
assert len(lT1.all_chains) == 18
|
48
|
+
|
49
|
+
|
50
|
+
def test_uted_2levels_vs_3levels():
|
51
|
+
lT = lineageTree()
|
52
|
+
t1 = lT.add_root(0)
|
53
|
+
first_level_end = lT.add_chain(t1, 10, True)
|
54
|
+
|
55
|
+
second_level_1 = lT.add_chain(first_level_end, 10, downstream=True)
|
56
|
+
second_level_2 = lT.add_chain(first_level_end, 10, downstream=True)
|
57
|
+
|
58
|
+
lT.add_chain(second_level_1, 10, downstream=True)
|
59
|
+
lT.add_chain(second_level_1, 10, downstream=True)
|
60
|
+
lT.add_chain(second_level_2, 10, downstream=True)
|
61
|
+
lT.add_chain(second_level_2, 10, downstream=True)
|
62
|
+
|
63
|
+
t2 = lT.add_root(0)
|
64
|
+
first_level_end = lT.add_chain(t2, 10, downstream=True)
|
65
|
+
|
66
|
+
second_level_1 = lT.add_chain(first_level_end, 10, downstream=True)
|
67
|
+
second_level_2 = lT.add_chain(first_level_end, 10, downstream=True)
|
68
|
+
|
69
|
+
assert (
|
70
|
+
lT.unordered_tree_edit_distance(t1, t2, style="simple", norm=None)
|
71
|
+
== 40
|
72
|
+
)
|
73
|
+
assert lT.unordered_tree_edit_distance(t1, t2, style="downsampled")
|
74
|
+
assert (
|
75
|
+
lT.unordered_tree_edit_distance(t1, t2, style="full", norm=None) == 40
|
76
|
+
)
|
77
|
+
assert (
|
78
|
+
lT.unordered_tree_edit_distance(t1, t2, style="mini", norm=None) == 4
|
79
|
+
)
|
80
|
+
assert lT.unordered_tree_edit_distance(
|
81
|
+
t1, t2, style="normalized_simple", norm="max"
|
82
|
+
)
|
83
|
+
assert lT.plot_tree_distance_graphs(t1, t2, style="simple", norm=None)
|
84
|
+
assert lT.plot_tree_distance_graphs(
|
85
|
+
t1, t2, style="normalized_simple", norm=None
|
86
|
+
)
|
87
|
+
assert lT.plot_tree_distance_graphs(t1, t2, style="full", norm=None)
|
88
|
+
assert lT.plot_tree_distance_graphs(
|
89
|
+
t1, t2, style="downsampled", downsample=4, norm=None
|
90
|
+
)
|
91
|
+
assert lT.unordered_tree_edit_distances_at_time_t(10)
|
92
|
+
assert lT.labelled_mappings(t1, t2)
|
93
|
+
|
94
|
+
|
95
|
+
def test_adding_nodes():
|
96
|
+
lT = lineageTree()
|
97
|
+
t1 = lT.add_root(0)
|
98
|
+
first_level_end = lT.add_chain(t1, 9, downstream=True)
|
99
|
+
|
100
|
+
lT.add_chain(first_level_end, 10, downstream=True)
|
101
|
+
lT.add_chain(first_level_end, 10, downstream=True)
|
102
|
+
|
103
|
+
assert len(lT.get_subtree_nodes(t1)) == 30
|
104
|
+
|
105
|
+
|
106
|
+
def test_removing_nodes():
|
107
|
+
lT = lineageTree()
|
108
|
+
t1 = lT.add_root(0)
|
109
|
+
first_level_end = lT.add_chain(t1, 9, downstream=True)
|
110
|
+
|
111
|
+
second_level_1 = lT.add_chain(first_level_end, 10, downstream=True)
|
112
|
+
lT.add_chain(first_level_end, 10, downstream=True)
|
113
|
+
lT.remove_nodes(lT.get_chain_of_node(second_level_1))
|
114
|
+
assert len(lT.get_subtree_nodes(t1)) == 20
|
115
|
+
|
116
|
+
|
117
|
+
def test_time_resolution():
|
118
|
+
lT = lineageTree()
|
119
|
+
lT.time_resolution = 3
|
120
|
+
assert lT.time_resolution == 3
|
121
|
+
|
122
|
+
|
123
|
+
def test_loading():
|
124
|
+
lT = lineageTree.load("src/LineageTree/test/data/test-mamut.lT")
|
125
|
+
assert lT.time_resolution == 0
|
126
|
+
lT.time_resolution = 1.51
|
127
|
+
assert lT.time_resolution == 1.5
|
128
|
+
|
129
|
+
|
130
|
+
def test_cross_comparison():
|
131
|
+
lT_1 = lineageTree()
|
132
|
+
t1 = lT_1.add_root(0)
|
133
|
+
first_level_end = lT_1.add_chain(t1, 9, downstream=True)
|
134
|
+
node_1 = lT_1.get_chain_of_node(t1)[0]
|
135
|
+
|
136
|
+
second_level_1 = lT_1.add_chain(first_level_end, 10, downstream=True)
|
137
|
+
second_level_2 = lT_1.add_chain(first_level_end, 10, downstream=True)
|
138
|
+
|
139
|
+
lT_1.add_chain(second_level_1, 10, downstream=True)
|
140
|
+
lT_1.add_chain(second_level_1, 10, downstream=True)
|
141
|
+
lT_1.add_chain(second_level_2, 10, downstream=True)
|
142
|
+
lT_1.add_chain(second_level_2, 10, downstream=True)
|
143
|
+
lT_1.time_resolution = 5
|
144
|
+
|
145
|
+
lT_2 = lineageTree()
|
146
|
+
t2 = lT_2.add_root(0)
|
147
|
+
first_level_end = lT_2.add_chain(t2, 4, downstream=True)
|
148
|
+
node_2 = lT_2.get_chain_of_node(t2)[0]
|
149
|
+
|
150
|
+
second_level_1 = lT_2.add_chain(first_level_end, 5, downstream=True)
|
151
|
+
second_level_2 = lT_2.add_chain(first_level_end, 5, downstream=True)
|
152
|
+
|
153
|
+
lT_2.add_chain(second_level_1, 5, downstream=True)
|
154
|
+
lT_2.add_chain(second_level_1, 5, downstream=True)
|
155
|
+
lT_2.add_chain(second_level_2, 5, downstream=True)
|
156
|
+
lT_2.add_chain(second_level_2, 5, downstream=True)
|
157
|
+
lT_2.time_resolution = 10
|
158
|
+
|
159
|
+
lTm1 = lineageTreeManager()
|
160
|
+
lTm1.add(lT_1, name="embryo_1")
|
161
|
+
lTm1.add(lT_2, name="embryo_2")
|
162
|
+
assert lT_2.time_resolution == lT_2._time_resolution / 10
|
163
|
+
assert (
|
164
|
+
len(lT_1.get_subtree_nodes(node_1))
|
165
|
+
== len(lT_2.get_subtree_nodes(node_2)) * 2
|
166
|
+
)
|
167
|
+
assert (
|
168
|
+
lTm1.cross_lineage_edit_distance(
|
169
|
+
t1,
|
170
|
+
"embryo_1",
|
171
|
+
t2,
|
172
|
+
"embryo_2",
|
173
|
+
100,
|
174
|
+
100,
|
175
|
+
style="full",
|
176
|
+
)
|
177
|
+
== 0
|
178
|
+
)
|
179
|
+
assert (
|
180
|
+
lTm1.cross_lineage_edit_distance(
|
181
|
+
node_1,
|
182
|
+
"embryo_1",
|
183
|
+
node_2,
|
184
|
+
"embryo_2",
|
185
|
+
100,
|
186
|
+
100,
|
187
|
+
style="simple",
|
188
|
+
)
|
189
|
+
== 0
|
190
|
+
)
|
191
|
+
assert (
|
192
|
+
lTm1.cross_lineage_edit_distance(
|
193
|
+
node_1,
|
194
|
+
"embryo_1",
|
195
|
+
node_2,
|
196
|
+
"embryo_2",
|
197
|
+
100,
|
198
|
+
100,
|
199
|
+
style="normalized_simple",
|
200
|
+
)
|
201
|
+
== 0
|
202
|
+
)
|
203
|
+
assert (
|
204
|
+
lTm1.cross_lineage_edit_distance(
|
205
|
+
node_1,
|
206
|
+
"embryo_1",
|
207
|
+
node_2,
|
208
|
+
"embryo_2",
|
209
|
+
100,
|
210
|
+
100,
|
211
|
+
style="downsampled",
|
212
|
+
downsample=20,
|
213
|
+
)
|
214
|
+
== 0
|
215
|
+
)
|
216
|
+
lT_3 = lineageTree()
|
217
|
+
t1 = lT_3.add_root(0)
|
218
|
+
first_level_end = lT_3.add_chain(t1, 4, downstream=True)
|
219
|
+
node_3 = lT_3.get_chain_of_node(t1)[0]
|
220
|
+
|
221
|
+
second_level_1 = lT_3.add_chain(first_level_end, 5, downstream=True)
|
222
|
+
second_level_2 = lT_3.add_chain(first_level_end, 5, downstream=True)
|
223
|
+
lT_3.time_resolution = 10
|
224
|
+
lTm1.add(lT_3, "embryo_3")
|
225
|
+
assert (
|
226
|
+
0
|
227
|
+
< lTm1.cross_lineage_edit_distance(
|
228
|
+
node_1,
|
229
|
+
"embryo_1",
|
230
|
+
node_3,
|
231
|
+
"embryo_3",
|
232
|
+
100,
|
233
|
+
100,
|
234
|
+
style="simple",
|
235
|
+
downsample=20,
|
236
|
+
)
|
237
|
+
< 1
|
238
|
+
)
|
239
|
+
assert lTm1.plot_tree_distance_graphs(
|
240
|
+
t1,
|
241
|
+
"embryo_1",
|
242
|
+
t2,
|
243
|
+
"embryo_2",
|
244
|
+
100,
|
245
|
+
100,
|
246
|
+
style="full",
|
247
|
+
)
|
248
|
+
assert lTm1.plot_tree_distance_graphs(
|
249
|
+
t1,
|
250
|
+
"embryo_1",
|
251
|
+
t2,
|
252
|
+
"embryo_2",
|
253
|
+
100,
|
254
|
+
100,
|
255
|
+
style="simple",
|
256
|
+
)
|
257
|
+
assert lTm1.plot_tree_distance_graphs(
|
258
|
+
t1,
|
259
|
+
"embryo_1",
|
260
|
+
t2,
|
261
|
+
"embryo_2",
|
262
|
+
100,
|
263
|
+
100,
|
264
|
+
style="downsampled",
|
265
|
+
downsample=10,
|
266
|
+
)
|
267
|
+
assert lTm1.labelled_mappings(
|
268
|
+
t1,
|
269
|
+
"embryo_1",
|
270
|
+
t2,
|
271
|
+
"embryo_2",
|
272
|
+
100,
|
273
|
+
100,
|
274
|
+
style="full",
|
275
|
+
)
|
276
|
+
assert lTm1.labelled_mappings(
|
277
|
+
t1,
|
278
|
+
"embryo_1",
|
279
|
+
t2,
|
280
|
+
"embryo_2",
|
281
|
+
100,
|
282
|
+
100,
|
283
|
+
style="simple",
|
284
|
+
)
|
285
|
+
lTm1.clear_comparisons()
|
286
|
+
assert lTm1._comparisons == {}
|
287
|
+
|
288
|
+
|
289
|
+
def test_plots():
|
290
|
+
assert len(lT2.plot_all_lineages()) == 3
|
291
|
+
assert len(lT2.plot_subtree(40)) == 2
|
292
|
+
|
293
|
+
|
294
|
+
def test_removing_embryos_from_manager():
|
295
|
+
lT_1 = lineageTree()
|
296
|
+
t1 = lT_1.add_root(0)
|
297
|
+
first_level_end = lT_1.add_chain(t1, 9, downstream=True)
|
298
|
+
|
299
|
+
second_level_1 = lT_1.add_chain(first_level_end, 10, downstream=True)
|
300
|
+
second_level_2 = lT_1.add_chain(first_level_end, 10, downstream=True)
|
301
|
+
|
302
|
+
lT_1.add_chain(second_level_1, 10, downstream=True)
|
303
|
+
lT_1.add_chain(second_level_1, 10, downstream=True)
|
304
|
+
lT_1.add_chain(second_level_2, 10, downstream=True)
|
305
|
+
lT_1.add_chain(second_level_2, 10, downstream=True)
|
306
|
+
lT_1.time_resolution = 5
|
307
|
+
|
308
|
+
lT_2 = lineageTree()
|
309
|
+
t2 = lT_2.add_root(0)
|
310
|
+
first_level_end = lT_2.add_chain(t2, 4, downstream=True)
|
311
|
+
|
312
|
+
second_level_1 = lT_2.add_chain(first_level_end, 5, downstream=True)
|
313
|
+
second_level_2 = lT_2.add_chain(first_level_end, 5, downstream=True)
|
314
|
+
|
315
|
+
lT_2.add_chain(second_level_1, 5, downstream=True)
|
316
|
+
lT_2.add_chain(second_level_1, 5, downstream=True)
|
317
|
+
lT_2.add_chain(second_level_2, 5, downstream=True)
|
318
|
+
lT_2.add_chain(second_level_2, 5, downstream=True)
|
319
|
+
lT_2.time_resolution = 10
|
320
|
+
|
321
|
+
lTm1 = lineageTreeManager()
|
322
|
+
lTm1.add(lT_1, name="embryo_1")
|
323
|
+
lTm1.add(lT_2, name="embryo_2")
|
324
|
+
lTm1.remove_embryo("embryo_1")
|
325
|
+
assert len(lTm1.lineagetrees) == 1
|
326
|
+
for k, _e in lTm1:
|
327
|
+
assert k == "embryo_2"
|
328
|
+
assert lTm1["embryo_2"]
|
329
|
+
|
330
|
+
|
331
|
+
def test_successor():
|
332
|
+
test_lT = lineageTree(
|
333
|
+
successor={
|
334
|
+
1: (2,),
|
335
|
+
2: (3, 100),
|
336
|
+
100: (101,),
|
337
|
+
0: (1,),
|
338
|
+
10: (0,),
|
339
|
+
5: (),
|
340
|
+
3: (),
|
341
|
+
4: (),
|
342
|
+
101: (),
|
343
|
+
}
|
344
|
+
)
|
345
|
+
lT = lineageTree(
|
346
|
+
successor={
|
347
|
+
1: (2,),
|
348
|
+
2: (3, 100),
|
349
|
+
100: [
|
350
|
+
101,
|
351
|
+
],
|
352
|
+
3: (),
|
353
|
+
4: None,
|
354
|
+
5: set(),
|
355
|
+
0: (1,),
|
356
|
+
10: (0,),
|
357
|
+
}
|
358
|
+
)
|
359
|
+
assert lT == test_lT
|
360
|
+
|
361
|
+
|
362
|
+
def test_predecessor():
|
363
|
+
test_lT = lineageTree(
|
364
|
+
successor={
|
365
|
+
1: (2,),
|
366
|
+
2: (3, 100),
|
367
|
+
100: (101,),
|
368
|
+
0: (1,),
|
369
|
+
10: (0,),
|
370
|
+
5: (),
|
371
|
+
3: (),
|
372
|
+
4: (),
|
373
|
+
101: (),
|
374
|
+
}
|
375
|
+
)
|
376
|
+
lT = lineageTree(
|
377
|
+
predecessor={
|
378
|
+
2: (1,),
|
379
|
+
3: [2],
|
380
|
+
100: 2,
|
381
|
+
101: (100,),
|
382
|
+
4: set(),
|
383
|
+
5: None,
|
384
|
+
1: 0,
|
385
|
+
0: 10,
|
386
|
+
}
|
387
|
+
)
|
388
|
+
assert lT == test_lT
|
389
|
+
|
390
|
+
|
391
|
+
def test_empty():
|
392
|
+
lineageTree()
|
393
|
+
|
394
|
+
|
395
|
+
def test_time_warning():
|
396
|
+
warnings.filterwarnings(
|
397
|
+
"error"
|
398
|
+
) # raises warnings as errors so we can catch them when expected
|
399
|
+
with pytest.raises(UserWarning) as excinfo:
|
400
|
+
lineageTree(successor={0: (1,)}, time={0: 1, 1: 2}, starting_time=3)
|
401
|
+
assert (
|
402
|
+
str(excinfo.value)
|
403
|
+
== "Both `time` and `starting_time` were provided, `starting_time` was ignored."
|
404
|
+
)
|
405
|
+
warnings.filterwarnings("default")
|
406
|
+
|
407
|
+
|
408
|
+
def test_bad_leaf():
|
409
|
+
with pytest.raises(ValueError) as excinfo:
|
410
|
+
lineageTree(
|
411
|
+
successor={
|
412
|
+
1: (2,),
|
413
|
+
2: (3, 100),
|
414
|
+
100: [
|
415
|
+
101,
|
416
|
+
],
|
417
|
+
3: (),
|
418
|
+
4: None,
|
419
|
+
5: set(),
|
420
|
+
0: (1,),
|
421
|
+
10: (0,),
|
422
|
+
},
|
423
|
+
root_leaf_value=[None],
|
424
|
+
)
|
425
|
+
assert (
|
426
|
+
str(excinfo.value)
|
427
|
+
== "() was not declared as a leaf but was found as a successor.\nPlease lift the ambiguity."
|
428
|
+
)
|
429
|
+
|
430
|
+
|
431
|
+
def test_multiple_predecessors():
|
432
|
+
with pytest.raises(ValueError) as excinfo:
|
433
|
+
lineageTree(successor={2: (1,), 3: (2,), 4: (2,)})
|
434
|
+
assert str(excinfo.value) == "Node can have at most one predecessor."
|
435
|
+
|
436
|
+
|
437
|
+
def test_bad_root_leaf_value():
|
438
|
+
with pytest.raises(ValueError) as excinfo:
|
439
|
+
lineageTree(successor={1: (2,), 2: set()}, root_leaf_value=set())
|
440
|
+
assert (
|
441
|
+
str(excinfo.value)
|
442
|
+
== "root_leaf_value should have at least one element."
|
443
|
+
)
|
444
|
+
|
445
|
+
|
446
|
+
def test_successor_and_predecessor():
|
447
|
+
with pytest.raises(ValueError) as excinfo:
|
448
|
+
lineageTree(successor={1: (2, 3)}, predecessor={2: 1, 3: 1})
|
449
|
+
assert (
|
450
|
+
str(excinfo.value)
|
451
|
+
== "You cannot have both successors and predecessors."
|
452
|
+
)
|
453
|
+
|
454
|
+
|
455
|
+
def test_cycles():
|
456
|
+
with pytest.raises(ValueError) as excinfo:
|
457
|
+
lineageTree(successor={0: (1,), 1: (0,)})
|
458
|
+
assert (
|
459
|
+
str(excinfo.value)
|
460
|
+
== "Cycles were found in the tree, there should not be any."
|
461
|
+
)
|
462
|
+
|
463
|
+
|
464
|
+
def test_time_nodes():
|
465
|
+
assert lT1.time_nodes[131] == {
|
466
|
+
108735,
|
467
|
+
114627,
|
468
|
+
129407,
|
469
|
+
138526,
|
470
|
+
148274,
|
471
|
+
165742,
|
472
|
+
169927,
|
473
|
+
178305,
|
474
|
+
}
|
475
|
+
all_cells = set(lT1.nodes)
|
476
|
+
no_cells = set()
|
477
|
+
for c in lT1.time_nodes.values():
|
478
|
+
all_cells.difference_update(c)
|
479
|
+
no_cells.update(set(c))
|
480
|
+
|
481
|
+
assert no_cells == lT1.nodes
|
482
|
+
assert all_cells == set()
|
483
|
+
|
484
|
+
|
485
|
+
def test_equality():
|
486
|
+
assert lT1 == lT1
|
487
|
+
assert lT2 == lT2
|
488
|
+
assert lT1 != lT2
|
489
|
+
|
490
|
+
|
491
|
+
def test_next_id():
|
492
|
+
assert lT1.get_next_id() == 182893
|
493
|
+
assert lT1.get_next_id() == 182894
|
494
|
+
|
495
|
+
|
496
|
+
def test_dynamic_property():
|
497
|
+
lT = lineageTree()
|
498
|
+
assert lT.nodes == frozenset()
|
499
|
+
t1 = lT.add_root(0)
|
500
|
+
assert lT.nodes == frozenset({1})
|
501
|
+
lT.add_chain(t1, 10, True)
|
502
|
+
assert lT.nodes == frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11})
|
503
|
+
|
504
|
+
|
505
|
+
def test_idx3d():
|
506
|
+
kdtree, idxs = lT1.get_idx3d(0)
|
507
|
+
assert np.isclose(kdtree.query((0, 0, 0))[0], 1131.2352660153383)
|
508
|
+
assert idxs[kdtree.query((0, 0, 0))[1]] == 110826
|
509
|
+
assert idxs[kdtree.query((1000, 2000, 1000))[1]] == 132063
|
510
|
+
|
511
|
+
|
512
|
+
def test_gabriel_graph():
|
513
|
+
gg = lT1.get_gabriel_graph(0)
|
514
|
+
assert gg[173618] == {110832, 168322}
|
515
|
+
|
516
|
+
|
517
|
+
def test_get_chain_of_node():
|
518
|
+
chain = lT1.get_chain_of_node(173618)
|
519
|
+
assert len(chain) == 273
|
520
|
+
assert chain[-1] == 181669
|
521
|
+
|
522
|
+
|
523
|
+
def test_get_all_chains_of_subtree():
|
524
|
+
assert (
|
525
|
+
lT1.get_chain_of_node(173618)
|
526
|
+
== lT1.get_all_chains_of_subtree(173618)[0]
|
527
|
+
)
|
528
|
+
|
529
|
+
|
530
|
+
def test_find_leaves():
|
531
|
+
assert lT1.find_leaves(173618) == {lT1.get_chain_of_node(173618)[-1]}
|
532
|
+
|
533
|
+
|
534
|
+
def test_get_subtree_nodes():
|
535
|
+
assert lT1.get_chain_of_node(173618) == lT1.get_subtree_nodes(173618)
|
536
|
+
|
537
|
+
|
538
|
+
def test_spatial_density():
|
539
|
+
density = list(lT1.compute_spatial_density(0, th=40).values())
|
540
|
+
assert np.count_nonzero(density) == 1669
|
541
|
+
|
542
|
+
|
543
|
+
def test_compute_k_nearest_neighbours():
|
544
|
+
assert lT1.compute_k_nearest_neighbours()[169994] == {
|
545
|
+
108588,
|
546
|
+
114722,
|
547
|
+
129276,
|
548
|
+
139163,
|
549
|
+
148361,
|
550
|
+
165681,
|
551
|
+
169994,
|
552
|
+
178396,
|
553
|
+
}
|
554
|
+
|
555
|
+
|
556
|
+
def test_compute_spatial_edges():
|
557
|
+
assert lT1.compute_spatial_edges()[129294] == {139162, 148358}
|
558
|
+
|
559
|
+
|
560
|
+
def test_get_ancestor_at_t():
|
561
|
+
assert lT1.get_ancestor_at_t(175903, 0) == 173618
|
562
|
+
|
563
|
+
|
564
|
+
def get_labelled_ancestor():
|
565
|
+
assert lT1.get_labelled_ancestor(175903) == 173618
|
566
|
+
|
567
|
+
|
568
|
+
def test_unordered_tree_edit_distances_at_time_t():
|
569
|
+
assert np.isclose(
|
570
|
+
lT1.unordered_tree_edit_distances_at_time_t(0, style="simple")[
|
571
|
+
(110832, 132129)
|
572
|
+
],
|
573
|
+
0.7321711568938193,
|
574
|
+
)
|
575
|
+
|
576
|
+
|
577
|
+
def test_unordered_tree_edit_distance():
|
578
|
+
assert np.isclose(
|
579
|
+
lT1.unordered_tree_edit_distance(110832, 132129), 0.7321711568938193
|
580
|
+
)
|
581
|
+
|
582
|
+
|
583
|
+
def test_non_return_functions():
|
584
|
+
lT1.plot_all_lineages()
|
585
|
+
lT1.plot_subtree(110832)
|
586
|
+
lT1.plot_dtw_heatmap(110832, 132129)
|
587
|
+
lT1.plot_dtw_trajectory(110832, 132129)
|
588
|
+
|
589
|
+
|
590
|
+
def test_nodes_at_t():
|
591
|
+
assert sorted(lT1.nodes_at_t(0)) == sorted(
|
592
|
+
[
|
593
|
+
110832,
|
594
|
+
132129,
|
595
|
+
168322,
|
596
|
+
173618,
|
597
|
+
110826,
|
598
|
+
132063,
|
599
|
+
]
|
600
|
+
)
|
601
|
+
|
602
|
+
|
603
|
+
def test_calculate_dtw():
|
604
|
+
assert np.isclose(lT1.calculate_dtw(110832, 132129)[0], 25.550036305019194)
|
605
|
+
|
606
|
+
|
607
|
+
def test_create_new_style():
|
608
|
+
class new_tree(tree_approximation.simple_tree):
|
609
|
+
def __init__(self, **kwargs):
|
610
|
+
super().__init__(**kwargs)
|
611
|
+
|
612
|
+
def delta(self, x, y, corres1, corres2, times1, times2):
|
613
|
+
if x is None:
|
614
|
+
return 1
|
615
|
+
if y is None:
|
616
|
+
return 1
|
617
|
+
return abs(times1[corres1[x]] - times2[corres2[y]]) / (
|
618
|
+
times1[corres1[x]] + times2[corres2[y]]
|
619
|
+
)
|
620
|
+
|
621
|
+
def get_norm(self, root) -> int:
|
622
|
+
return len(
|
623
|
+
self.lT.get_all_chains_of_subtree(root, end_time=self.end_time)
|
624
|
+
)
|
625
|
+
|
626
|
+
assert lt.unordered_tree_edit_distance(
|
627
|
+
176, 29345, style=new_tree
|
628
|
+
) == lt.unordered_tree_edit_distance(176, 29345, style="normalized_simple")
|
629
|
+
|
630
|
+
|
631
|
+
def test_get_ancestor_with():
|
632
|
+
assert lt.get_labelled_ancestor(
|
633
|
+
list(lt.nodes)[0]
|
634
|
+
) == lt.get_ancestor_with_attribute(list(lt.nodes)[0], "labels")
|