@@ -161,6 +161,13 @@ def setUp(self):
161161 'frame' : np .arange (1 , N ), 'particle' : np .ones (N - 1 )})
162162 self .steppers = conformity (pandas_concat ([a , b ]))
163163
164+ self .badly_gapped_walks = conformity (DataFrame ({
165+ 'frame' : [1 , 2 , 3 , 4 , 5 , 6 , 1 , 2 , 6 ], # create an example trajectory where particle 2 disappears for a few frames and returns.
166+ 'x' : [4 , 5 , 4 , 5 , 3 , 2 , - 3 , - 1 , - 2 ],
167+ 'y' : [6 , 7 , 8 , 6 , 7 , 6 , 10 , 11 , 10 ],
168+ 'particle' : [1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 ]
169+ }))
170+
164171 def test_zero_emsd (self ):
165172 N = 10
166173 actual = tp .emsd (self .dead_still , 1 , 1 )
@@ -207,6 +214,33 @@ def test_linear_emsd_gaps(self):
207214 actual .index = expected .index
208215 assert_series_equal (np .round (actual ), expected )
209216
217+ def test_major_gap_imsd (self ):
218+ """Large gap that should strongly affect emsd.
219+
220+ Test data and fix (PR #773) by @vivarose
221+ """
222+ imsd = tp .imsd (self .badly_gapped_walks , mpp = 1 , fps = 1 )
223+ nans = imsd .isna ()
224+
225+ assert nans [2 ][2.0 ]
226+ assert nans [2 ][3.0 ]
227+ assert sum (nans .values .flatten ()) == 2
228+
229+ def test_major_gap_emsd (self ):
230+ """Large gap that should strongly affect emsd.
231+
232+ Test data and fix (PR #773) by @vivarose
233+ """
234+ actual = tp .emsd (self .badly_gapped_walks , mpp = 1 , fps = 1 )
235+ expected = Series ({
236+ 1.0 : 4.012847555129437 ,
237+ 2.0 : 4.000000000000007 ,
238+ 3.0 : 4.333333333333333 ,
239+ 4.0 : 4.193672099712366 ,
240+ 5.0 : 2.645254074784259
241+ })
242+ assert_almost_equal (expected .values , actual .values )
243+
210244 def test_direction_corr (self ):
211245 # just a smoke test
212246 f1 , f2 = 2 , 6
0 commit comments