celldetective 1.4.1__py3-none-any.whl → 1.4.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -1,6 +1,6 @@
1
1
  celldetective/__init__.py,sha256=ZygAIkX6Nbjag1czWdQa-yP-GM1mBE_9ss21Xh__JFc,34
2
2
  celldetective/__main__.py,sha256=bxTlSvbKhqn3LW_azd2baDCnDsgb37PAP9DfuAJ1_5M,1844
3
- celldetective/_version.py,sha256=BqOI5y46o1G1RWC9bF1DPL-YM68lGYPmZt1pn6FZFZs,22
3
+ celldetective/_version.py,sha256=qjngKmjcwKn1c_BwAouVdai-TbnuKZo56EbqRdILxaI,22
4
4
  celldetective/events.py,sha256=n15R53c7QZ2wT8gjb0oeNikQbuRBrVVbyNsRCqXjzXA,8166
5
5
  celldetective/exceptions.py,sha256=f3VmIYOthWTiqMEV5xQCox2rw5c5e7yog88h-CcV4oI,356
6
6
  celldetective/extra_properties.py,sha256=QxXl-zug3NyxZMNTJUsDxo8PHLIRt0AwOFUkTyYBv7E,19987
@@ -12,7 +12,7 @@ celldetective/preprocessing.py,sha256=YpffYSYZxnd8A0KLfVANEQGWb2I9JW663_aSvZbt3n
12
12
  celldetective/relative_measurements.py,sha256=vQhgkHokUtt2xBpZbR-MHWUukfJ02WbiBsBJqV9A_90,30964
13
13
  celldetective/segmentation.py,sha256=WApzoU1s3Ntvp0eIw_pRZXNwCA8LDKC9YoyR52tioz4,30943
14
14
  celldetective/signals.py,sha256=-AnJOwU4S4T7y-xaH5vjrau2ZJgYDwFf3JjakdHJMog,112236
15
- celldetective/tracking.py,sha256=4ngFo5-slTmmOdYCqIjH3gqzQ4e3Zovk_X5P3uFAifQ,40567
15
+ celldetective/tracking.py,sha256=oOpb6CWuKwnMrBDlaPieku7Zlfefw3fI5lkQFiztAOg,48635
16
16
  celldetective/utils.py,sha256=R2S1_lAoxhlSgEjuebr9Zs8NiQGwvehTdrzozQYoX7Q,105316
17
17
  celldetective/datasets/segmentation_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  celldetective/datasets/signal_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -22,7 +22,7 @@ celldetective/gui/about.py,sha256=TaPAAiOrDcyaYQMEZQLQmhNfZH3QKoasIV1gbbPc8iU,18
22
22
  celldetective/gui/analyze_block.py,sha256=ukLlqqooP6UkJG00tZGnNWe3vqjVKj4zhtXcUnjOJj8,3048
23
23
  celldetective/gui/base_annotator.py,sha256=hDeYhppFAuRb-h2GkbfQMpUv077rCPzQ3B3a2Y18jRM,25898
24
24
  celldetective/gui/base_components.py,sha256=gYC0Gc3axDC241RpjNCXe7UKYG2uCDnMLx7at0kHKjA,768
25
- celldetective/gui/classifier_widget.py,sha256=J6FBgwa_P5Sw_40Ruh6uQ6Z1-aBwDduOH07E5CxcWoU,20548
25
+ celldetective/gui/classifier_widget.py,sha256=_gU6GoTLuM9DUcKWZ6RiQ66oJkuMVSspZrB4pWdeTNs,25857
26
26
  celldetective/gui/configure_new_exp.py,sha256=kYmWCqMK7F4yflS9b05gWvMEAoS1PoNV0siNNITNY1Y,24742
27
27
  celldetective/gui/control_panel.py,sha256=GDJaEmE9sWP8dfepvVw8sS1D9oWWMdBAEWVaAb6YFVM,18104
28
28
  celldetective/gui/event_annotator.py,sha256=SwX5s98UIzsh-nIvNLBXRfsiLqXHKOjzM37-9Yl76BQ,57110
@@ -37,7 +37,7 @@ celldetective/gui/process_block.py,sha256=od5I_ZM1_GE_H5ApDB_l9_o4nWbWOhk5pZ1VGs
37
37
  celldetective/gui/seg_model_loader.py,sha256=xTzJ02DJxBoyqeanmEybheVbn8uoxP1eay2odZbGH04,18108
38
38
  celldetective/gui/styles.py,sha256=3yYr2-fMxGczsjPqlZ7VRfLRoWypWhsHimPALMvbKSU,5138
39
39
  celldetective/gui/survival_ui.py,sha256=e5SqthRgylqwD9EZjJQ1pnJ0CAMwuW8VrMtgnUDdgOE,12296
40
- celldetective/gui/tableUI.py,sha256=LWfq63N1sdTUjYaCKhZQbjJiqAOhliRnf8v4LytYBek,59249
40
+ celldetective/gui/tableUI.py,sha256=tItH3RscHI42-Co33e2DO_u9CiPFZRoaK7VjvxeYymA,59220
41
41
  celldetective/gui/thresholds_gui.py,sha256=d_vncQO837yPw9OMTJmrT0zl02G3___ynUHh1uU8k7A,29235
42
42
  celldetective/gui/viewers.py,sha256=ZMbgVeVXGnYJHlYpiCzHoToB_HowpSnMc6za9f3C2n4,50019
43
43
  celldetective/gui/workers.py,sha256=1sdRDwBsGJjjTNsf8YqnKuf2m6Fa5E7YFLnncFWqbjU,4298
@@ -55,7 +55,7 @@ celldetective/gui/help/tracking.json,sha256=yIAoOToqCSQ_XF4gwEZCcyXcvQ3mROju263Z
55
55
  celldetective/gui/processes/compute_neighborhood.py,sha256=J0T1DaG58p1nB0_WseVbl3AL5jb76W0hzFaSNci5EDU,29181
56
56
  celldetective/gui/processes/downloader.py,sha256=jnNitmQ9xUCGJHSvr3Myts5soe6rdYDBx_AGJKr1AWk,3406
57
57
  celldetective/gui/processes/measure_cells.py,sha256=XAw6SnT14EXfJXZ01bQ2FmPLGYWJHnX9Nko25RH0ZIo,13388
58
- celldetective/gui/processes/segment_cells.py,sha256=nhoeOQ8YbIWpFZl-I6Ig8oFQpupvufwUAXXhDXTfLNE,12668
58
+ celldetective/gui/processes/segment_cells.py,sha256=SS1Pg-vPDYo2qfcCB9wDBi5nWr7Mmp9IBpPRAqZaOJ4,16266
59
59
  celldetective/gui/processes/track_cells.py,sha256=4t6UZE_dyiryDH9e-G6jdINzdXHXi8BTta2v1gI0w3Q,10165
60
60
  celldetective/gui/processes/train_segmentation_model.py,sha256=bvcPG19hBjhNY9hd6Ch5_wk2FOJYQg97Azoz4RKeP-0,10776
61
61
  celldetective/gui/processes/train_signal_model.py,sha256=qqqkq9gdvNyvycYkmzWgRXWvsbEozyzNWP_POGvnlIs,3816
@@ -101,7 +101,7 @@ celldetective/scripts/segment_cells_thresholds.py,sha256=JanfXVbekgxDosKJDU9SejM
101
101
  celldetective/scripts/track_cells.py,sha256=GfCqXHsuS8k5jizY4tGye2l6Vwkoenb4_VjBq_dMDyI,8892
102
102
  celldetective/scripts/train_segmentation_model.py,sha256=8QXyhQtxBhdYBNleqCbkP3II1AztfrtpyeVyx0Ijy6s,9710
103
103
  celldetective/scripts/train_signal_model.py,sha256=D643wKVYg-LWHF2VU9FWKSuazXrpCpQK0YjGqoIimD0,3167
104
- celldetective-1.4.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
104
+ celldetective-1.4.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
105
105
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
106
  tests/test_events.py,sha256=eLFwwEEJfQAdwhews3-fn1HSvzozcNNFN_Qn0gOvQkE,685
107
107
  tests/test_filters.py,sha256=iJksl_HgquqGzPPv46qpNtlD4rkBpZ5eVtIotgZ7LDs,656
@@ -111,13 +111,13 @@ tests/test_neighborhood.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,20
111
111
  tests/test_preprocessing.py,sha256=c0rKS9d5h37uDcV7fVOTnn5GMVbEB84b8ZTCTdRmvFs,1422
112
112
  tests/test_segmentation.py,sha256=k1b_zIZdlytEdJcHjAUQEO3gTBAHtv5WvrwQN2xD4kc,3470
113
113
  tests/test_signals.py,sha256=No4cah6KxplhDcKXnU8RrA7eDla4hWw6ccf7xGnBokU,3599
114
- tests/test_tracking.py,sha256=8hebWSqEIuttD1ABn-6dKCT7EXKRR7-4RwyFWi1WPFo,8800
114
+ tests/test_tracking.py,sha256=tADuoSl7D6sxPMYKeJ5CdXNJQM6RKzlaM83OaVj9n0Y,10689
115
115
  tests/test_utils.py,sha256=NKRCAC1d89aBK5cWjTb7-pInYow901RrT-uBlIdz4KI,3692
116
116
  tests/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  tests/gui/test_new_project.py,sha256=D3166GefxQeOBw3Uc2nC_wzklF6b_86xrPiLC46jbUk,8228
118
118
  tests/gui/test_project.py,sha256=scDr50WAZybTkeTPPphGvor1VL9nHQXUIjvScdxmAmI,4146
119
- celldetective-1.4.1.dist-info/METADATA,sha256=uy2o-Y7v7jvhCq5wYIAHNYj5N-FNkeCbf1Ui_duW1js,10945
120
- celldetective-1.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
121
- celldetective-1.4.1.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
122
- celldetective-1.4.1.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
123
- celldetective-1.4.1.dist-info/RECORD,,
119
+ celldetective-1.4.2.dist-info/METADATA,sha256=ml8zqUVlOCwg4DiS4Btcf7F0aO5AMab1m500XWreZFk,10945
120
+ celldetective-1.4.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
121
+ celldetective-1.4.2.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
122
+ celldetective-1.4.2.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
123
+ celldetective-1.4.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
tests/test_tracking.py CHANGED
@@ -1,164 +1,226 @@
1
1
  import unittest
2
2
  import numpy as np
3
3
  import pandas as pd
4
- from celldetective.tracking import filter_by_endpoints, extrapolate_tracks, filter_by_tracklength, interpolate_time_gaps
4
+ from celldetective.tracking import (
5
+ filter_by_endpoints,
6
+ extrapolate_tracks,
7
+ filter_by_tracklength,
8
+ interpolate_time_gaps,
9
+ )
5
10
 
6
- class TestTrackFilteringByEndpoint(unittest.TestCase):
7
-
8
- @classmethod
9
- def setUpClass(self):
10
- self.tracks = pd.DataFrame([{"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
11
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
12
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 30, "POSITION_Y": 5},
13
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 40, "POSITION_Y": 0},
14
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
15
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
16
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
17
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 10, "POSITION_Y": 25}
18
-
19
- ])
20
11
 
21
- def test_filter_not_in_last(self):
22
- self.filtered_tracks = filter_by_endpoints(self.tracks, remove_not_in_first=False, remove_not_in_last=True)
23
- track_ids = list(self.filtered_tracks['TRACK_ID'].unique())
24
- self.assertEqual(track_ids,[0.])
25
-
26
- def test_filter_not_in_first(self):
27
- self.filtered_tracks = filter_by_endpoints(self.tracks, remove_not_in_first=True, remove_not_in_last=False)
28
- track_ids = list(self.filtered_tracks['TRACK_ID'].unique())
29
- self.assertEqual(track_ids,[0.,2.])
12
+ class TestTrackFilteringByEndpoint(unittest.TestCase):
30
13
 
31
- def test_no_filter_does_nothing(self):
32
- self.filtered_tracks = filter_by_endpoints(self.tracks, remove_not_in_first=False, remove_not_in_last=False)
33
- track_ids = list(self.filtered_tracks['TRACK_ID'].unique())
34
- self.assertEqual(track_ids,list(self.tracks['TRACK_ID'].unique()))
14
+ @classmethod
15
+ def setUpClass(self):
16
+ self.tracks = pd.DataFrame(
17
+ [
18
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
19
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
20
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 30, "POSITION_Y": 5},
21
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 40, "POSITION_Y": 0},
22
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
23
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
24
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
25
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 10, "POSITION_Y": 25},
26
+ ]
27
+ )
28
+
29
+ def test_filter_not_in_last(self):
30
+ self.filtered_tracks = filter_by_endpoints(
31
+ self.tracks, remove_not_in_first=False, remove_not_in_last=True
32
+ )
33
+ track_ids = list(self.filtered_tracks["TRACK_ID"].unique())
34
+ self.assertEqual(track_ids, [0.0])
35
+
36
+ def test_filter_not_in_first(self):
37
+ self.filtered_tracks = filter_by_endpoints(
38
+ self.tracks, remove_not_in_first=True, remove_not_in_last=False
39
+ )
40
+ track_ids = list(self.filtered_tracks["TRACK_ID"].unique())
41
+ self.assertEqual(track_ids, [0.0, 2.0])
42
+
43
+ def test_no_filter_does_nothing(self):
44
+ self.filtered_tracks = filter_by_endpoints(
45
+ self.tracks, remove_not_in_first=False, remove_not_in_last=False
46
+ )
47
+ track_ids = list(self.filtered_tracks["TRACK_ID"].unique())
48
+ self.assertEqual(track_ids, list(self.tracks["TRACK_ID"].unique()))
35
49
 
36
50
 
37
51
  class TestTrackFilteringByLength(unittest.TestCase):
38
52
 
39
- @classmethod
40
- def setUpClass(self):
41
- self.tracks = pd.DataFrame([{"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
42
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
43
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 30, "POSITION_Y": 5},
44
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 40, "POSITION_Y": 0},
45
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
46
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
47
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
48
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 10, "POSITION_Y": 25}
49
- ])
50
-
51
- def test_filter_by_tracklength_of_zero(self):
52
- self.filtered_tracks = filter_by_tracklength(self.tracks, minimum_tracklength=0)
53
- track_ids = list(self.filtered_tracks['TRACK_ID'].unique())
54
- self.assertEqual(track_ids,[0.,1.,2.])
55
-
56
- def test_filter_by_tracklength_of_three(self):
57
- self.filtered_tracks = filter_by_tracklength(self.tracks, minimum_tracklength=3)
58
- track_ids = list(self.filtered_tracks['TRACK_ID'].unique())
59
- self.assertEqual(track_ids,[0.])
53
+ @classmethod
54
+ def setUpClass(self):
55
+ self.tracks = pd.DataFrame(
56
+ [
57
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
58
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
59
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 30, "POSITION_Y": 5},
60
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 40, "POSITION_Y": 0},
61
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
62
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
63
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
64
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 10, "POSITION_Y": 25},
65
+ ]
66
+ )
67
+
68
+ def test_filter_by_tracklength_of_zero(self):
69
+ self.filtered_tracks = filter_by_tracklength(self.tracks, minimum_tracklength=0)
70
+ track_ids = list(self.filtered_tracks["TRACK_ID"].unique())
71
+ self.assertEqual(track_ids, [0.0, 1.0, 2.0])
72
+
73
+ def test_filter_by_tracklength_of_three(self):
74
+ self.filtered_tracks = filter_by_tracklength(self.tracks, minimum_tracklength=3)
75
+ track_ids = list(self.filtered_tracks["TRACK_ID"].unique())
76
+ self.assertEqual(track_ids, [0.0])
60
77
 
61
78
 
62
79
  class TestTrackInterpolation(unittest.TestCase):
63
80
 
64
- @classmethod
65
- def setUpClass(self):
66
-
67
- self.tracks = pd.DataFrame([{"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
68
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
69
- #{"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
70
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
71
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
72
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
73
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
74
- #{"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
75
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25}
76
- ])
77
- self.tracks_real_intep = pd.DataFrame([{"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
78
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
79
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
80
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
81
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
82
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
83
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
84
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
85
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25}
86
- ])
87
-
88
-
89
- def test_interpolate_tracks_as_expected(self):
90
- self.interpolated_tracks = interpolate_time_gaps(self.tracks)
91
- self.assertTrue(np.array_equal(self.interpolated_tracks.to_numpy(), self.tracks_real_intep.to_numpy(), equal_nan=True))
81
+ @classmethod
82
+ def setUpClass(self):
83
+
84
+ self.tracks = pd.DataFrame(
85
+ [
86
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
87
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
88
+ # {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
89
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
90
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
91
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
92
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
93
+ # {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
94
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
95
+ ]
96
+ )
97
+ self.tracks_real_intep = pd.DataFrame(
98
+ [
99
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
100
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
101
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
102
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
103
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
104
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
105
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
106
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
107
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
108
+ ]
109
+ )
110
+
111
+ def test_interpolate_tracks_as_expected(self):
112
+ self.interpolated_tracks = interpolate_time_gaps(self.tracks)
113
+ # Sort columns to ensure order is consistent
114
+ self.interpolated_tracks = self.interpolated_tracks.sort_index(axis=1)
115
+ self.tracks_real_intep = self.tracks_real_intep.sort_index(axis=1)
116
+
117
+ # Allow for some floating point tolerance and ignore int/float differences
118
+ pd.testing.assert_frame_equal(
119
+ self.interpolated_tracks,
120
+ self.tracks_real_intep,
121
+ check_dtype=False,
122
+ check_index_type=False,
123
+ check_column_type=False,
124
+ rtol=1e-5,
125
+ atol=1e-8,
126
+ )
127
+
92
128
 
93
129
  class TestTrackExtrapolation(unittest.TestCase):
94
130
 
95
- @classmethod
96
- def setUpClass(self):
97
-
98
- self.tracks = pd.DataFrame([{"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
99
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
100
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
101
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
102
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
103
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
104
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
105
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
106
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25}
107
- ])
108
- self.tracks_pre_extrapol = pd.DataFrame([
109
- {"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
110
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
111
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
112
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
113
- {"TRACK_ID": 1., "FRAME": 0, "POSITION_X": 5, "POSITION_Y": 20},
114
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
115
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
116
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
117
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
118
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25}
119
- ])
120
- self.tracks_post_extrapol = pd.DataFrame([
121
- {"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
122
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
123
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
124
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
125
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
126
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
127
- {"TRACK_ID": 1., "FRAME": 3, "POSITION_X": 10, "POSITION_Y": 25},
128
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
129
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
130
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
131
- {"TRACK_ID": 2., "FRAME": 3, "POSITION_X": 0, "POSITION_Y": 25}
132
- ])
133
-
134
- self.tracks_full_extrapol = pd.DataFrame([
135
- {"TRACK_ID": 0., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
136
- {"TRACK_ID": 0., "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
137
- {"TRACK_ID": 0., "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
138
- {"TRACK_ID": 0., "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
139
- {"TRACK_ID": 1., "FRAME": 0, "POSITION_X": 5, "POSITION_Y": 20},
140
- {"TRACK_ID": 1., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
141
- {"TRACK_ID": 1., "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
142
- {"TRACK_ID": 1., "FRAME": 3, "POSITION_X": 10, "POSITION_Y": 25},
143
- {"TRACK_ID": 2., "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
144
- {"TRACK_ID": 2., "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
145
- {"TRACK_ID": 2., "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
146
- {"TRACK_ID": 2., "FRAME": 3, "POSITION_X": 0, "POSITION_Y": 25}
147
- ])
148
-
149
-
150
- def test_pre_extrapolate(self):
151
- self.extrapolated_tracks = extrapolate_tracks(self.tracks,post=False, pre=True)
152
- self.assertTrue(np.array_equal(self.extrapolated_tracks.to_numpy(), self.tracks_pre_extrapol.to_numpy(), equal_nan=True))
153
-
154
- def test_post_extrapolate(self):
155
- self.extrapolated_tracks = extrapolate_tracks(self.tracks,post=True, pre=False)
156
- self.assertTrue(np.array_equal(self.extrapolated_tracks.to_numpy(), self.tracks_post_extrapol.to_numpy(), equal_nan=True))
157
-
158
- def test_full_extrapolate(self):
159
- self.extrapolated_tracks = extrapolate_tracks(self.tracks,post=True, pre=True)
160
- self.assertTrue(np.array_equal(self.extrapolated_tracks.to_numpy(), self.tracks_full_extrapol.to_numpy(), equal_nan=True))
161
-
162
-
163
- if __name__=="__main__":
164
- unittest.main()
131
+ @classmethod
132
+ def setUpClass(self):
133
+
134
+ self.tracks = pd.DataFrame(
135
+ [
136
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
137
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
138
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
139
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
140
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
141
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
142
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
143
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
144
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
145
+ ]
146
+ )
147
+ self.tracks_pre_extrapol = pd.DataFrame(
148
+ [
149
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
150
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
151
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
152
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
153
+ {"TRACK_ID": 1.0, "FRAME": 0, "POSITION_X": 5, "POSITION_Y": 20},
154
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
155
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
156
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
157
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
158
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
159
+ ]
160
+ )
161
+ self.tracks_post_extrapol = pd.DataFrame(
162
+ [
163
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
164
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
165
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
166
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
167
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
168
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
169
+ {"TRACK_ID": 1.0, "FRAME": 3, "POSITION_X": 10, "POSITION_Y": 25},
170
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
171
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
172
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
173
+ {"TRACK_ID": 2.0, "FRAME": 3, "POSITION_X": 0, "POSITION_Y": 25},
174
+ ]
175
+ )
176
+
177
+ self.tracks_full_extrapol = pd.DataFrame(
178
+ [
179
+ {"TRACK_ID": 0.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 15},
180
+ {"TRACK_ID": 0.0, "FRAME": 1, "POSITION_X": 15, "POSITION_Y": 10},
181
+ {"TRACK_ID": 0.0, "FRAME": 2, "POSITION_X": 20, "POSITION_Y": 5},
182
+ {"TRACK_ID": 0.0, "FRAME": 3, "POSITION_X": 25, "POSITION_Y": 0},
183
+ {"TRACK_ID": 1.0, "FRAME": 0, "POSITION_X": 5, "POSITION_Y": 20},
184
+ {"TRACK_ID": 1.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 20},
185
+ {"TRACK_ID": 1.0, "FRAME": 2, "POSITION_X": 10, "POSITION_Y": 25},
186
+ {"TRACK_ID": 1.0, "FRAME": 3, "POSITION_X": 10, "POSITION_Y": 25},
187
+ {"TRACK_ID": 2.0, "FRAME": 0, "POSITION_X": 10, "POSITION_Y": 25},
188
+ {"TRACK_ID": 2.0, "FRAME": 1, "POSITION_X": 5, "POSITION_Y": 25},
189
+ {"TRACK_ID": 2.0, "FRAME": 2, "POSITION_X": 0, "POSITION_Y": 25},
190
+ {"TRACK_ID": 2.0, "FRAME": 3, "POSITION_X": 0, "POSITION_Y": 25},
191
+ ]
192
+ )
193
+
194
+ def test_pre_extrapolate(self):
195
+ self.extrapolated_tracks = extrapolate_tracks(self.tracks, post=False, pre=True)
196
+ self.assertTrue(
197
+ np.array_equal(
198
+ self.extrapolated_tracks.to_numpy(),
199
+ self.tracks_pre_extrapol.to_numpy(),
200
+ equal_nan=True,
201
+ )
202
+ )
203
+
204
+ def test_post_extrapolate(self):
205
+ self.extrapolated_tracks = extrapolate_tracks(self.tracks, post=True, pre=False)
206
+ self.assertTrue(
207
+ np.array_equal(
208
+ self.extrapolated_tracks.to_numpy(),
209
+ self.tracks_post_extrapol.to_numpy(),
210
+ equal_nan=True,
211
+ )
212
+ )
213
+
214
+ def test_full_extrapolate(self):
215
+ self.extrapolated_tracks = extrapolate_tracks(self.tracks, post=True, pre=True)
216
+ self.assertTrue(
217
+ np.array_equal(
218
+ self.extrapolated_tracks.to_numpy(),
219
+ self.tracks_full_extrapol.to_numpy(),
220
+ equal_nan=True,
221
+ )
222
+ )
223
+
224
+
225
+ if __name__ == "__main__":
226
+ unittest.main()