@@ -366,7 +366,7 @@ def test_from_tree_sequence_simple(self):
366
366
ts = tsutil .get_example_ts (10 , 10 , 1 )
367
367
sd1 = formats .SampleData (sequence_length = ts .sequence_length )
368
368
self .verify_data_round_trip (ts , sd1 )
369
- sd2 = formats .SampleData .from_tree_sequence (ts )
369
+ sd2 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
370
370
assert sd1 .data_equal (sd2 )
371
371
372
372
def test_from_tree_sequence_variable_allele_number (self ):
@@ -398,7 +398,7 @@ def test_from_tree_sequence_variable_allele_number(self):
398
398
num_alleles = sd1 .num_alleles ()
399
399
for var in ts .variants ():
400
400
assert len (var .alleles ) == num_alleles [var .site .id ]
401
- sd2 = formats .SampleData .from_tree_sequence (ts )
401
+ sd2 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
402
402
assert sd1 .data_equal (sd2 )
403
403
404
404
def test_from_tree_sequence_with_metadata (self ):
@@ -412,34 +412,63 @@ def test_from_tree_sequence_with_metadata(self):
412
412
ts_no_individuals = tables .tree_sequence ()
413
413
sd1 = formats .SampleData (sequence_length = ts .sequence_length )
414
414
self .verify_data_round_trip (ts_no_individuals , sd1 )
415
- sd2 = formats .SampleData .from_tree_sequence (ts_no_individuals )
415
+ sd2 = formats .SampleData .from_tree_sequence (
416
+ ts_no_individuals , use_sites_time = True
417
+ )
416
418
assert sd1 .data_equal (sd2 )
417
419
418
420
def test_from_tree_sequence_with_metadata_and_individuals (self ):
419
421
ts = tsutil .get_example_individuals_ts_with_metadata (5 , 3 , 10 )
420
422
sd1 = formats .SampleData (sequence_length = ts .sequence_length )
421
423
self .verify_data_round_trip (ts , sd1 )
422
- sd2 = formats .SampleData .from_tree_sequence (ts )
424
+ sd2 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
423
425
sd1 .assert_data_equal (sd2 )
424
426
425
- def test_from_historical_tree_sequence (self ):
427
+ def test_from_historical_tree_sequence_with_times (self ):
428
+ n_indiv = 5
426
429
ploidy = 2
427
- individual_times = np .arange (5 )
430
+ individual_times = np .arange (n_indiv )
428
431
ts = tsutil .get_example_historical_sampled_ts (individual_times , ploidy , 10 )
432
+ # Test on a tree seq containing an individual with no nodes
433
+ keep_samples = [u for i in ts .individuals () for u in i .nodes if i .id < n_indiv ]
434
+ ts = ts .simplify (samples = keep_samples , filter_individuals = False )
429
435
sd1 = formats .SampleData (sequence_length = ts .sequence_length )
430
436
self .verify_data_round_trip (ts , sd1 )
431
- sd2 = formats .SampleData .from_tree_sequence (ts )
437
+ sd2 = formats .SampleData .from_tree_sequence (
438
+ ts , use_sites_time = True , use_individuals_time = True
439
+ )
432
440
assert sd1 .data_equal (sd2 )
441
+ # Fails if use_individuals_time is not set
442
+ sd2 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
443
+ assert not sd1 .data_equal (sd2 )
433
444
434
- def test_from_tree_sequence_use_time (self ):
445
+ def test_from_tree_sequence_no_times (self ):
446
+ n_indiv = 5
435
447
ploidy = 2
436
- individual_times = np .arange (5 )
448
+ individual_times = np .arange (n_indiv + 1 )
437
449
ts = tsutil .get_example_historical_sampled_ts (individual_times , ploidy , 10 )
438
- sd1 = formats .SampleData .from_tree_sequence (ts , use_individuals_time = False )
450
+ # Test on a tree seq containing an individual with no nodes
451
+ keep_samples = [u for i in ts .individuals () for u in i .nodes if i .id < n_indiv ]
452
+ ts = ts .simplify (samples = keep_samples , filter_individuals = False )
453
+ sd1 = formats .SampleData .from_tree_sequence (ts )
454
+ assert sd1 .num_individuals == n_indiv
439
455
assert np .all (sd1 .individuals_time [:] == 0 )
440
- sd2 = formats .SampleData .from_tree_sequence (ts , use_sites_time = False )
441
- assert np .all (tskit .is_unknown_time (sd2 .sites_time [:]))
442
- assert np .array_equal (sd2 .individuals_time [:], individual_times )
456
+
457
+ def test_from_tree_sequence_time_incompatibilities (self ):
458
+ ploidy = 2
459
+ individual_times = np .arange (5 )
460
+ ts = tsutil .get_example_historical_sampled_ts (individual_times , ploidy , 10 )
461
+ with pytest .raises (ValueError , match = "Incompatible timescales" ):
462
+ _ = formats .SampleData .from_tree_sequence (ts , use_individuals_time = True )
463
+ # Similar error if no individuals in the TS
464
+ tables = ts .dump_tables ()
465
+ tables .individuals .clear ()
466
+ tables .nodes .individual = np .full (
467
+ tables .nodes .num_rows , tskit .NULL , dtype = tables .nodes .individual .dtype
468
+ )
469
+ ts = tables .tree_sequence ()
470
+ with pytest .raises (ValueError , match = "Incompatible timescales" ):
471
+ _ = formats .SampleData .from_tree_sequence (ts , use_individuals_time = True )
443
472
444
473
def test_chunk_size (self ):
445
474
ts = tsutil .get_example_ts (4 , 2 )
@@ -802,7 +831,7 @@ def test_sites(self):
802
831
def test_sites_subset (self ):
803
832
ts = tsutil .get_example_ts (11 , 15 )
804
833
assert ts .num_sites > 1
805
- input_file = formats .SampleData .from_tree_sequence (ts )
834
+ input_file = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
806
835
assert list (input_file .sites ([])) == []
807
836
index = np .arange (input_file .num_sites )
808
837
site_list = list (input_file .sites ())
@@ -1587,7 +1616,7 @@ def verify(self, sd1, sd2):
1587
1616
def test_merge_identical (self ):
1588
1617
n = 10
1589
1618
ts = tsutil .get_example_ts (n , 10 , 1 )
1590
- sd1 = formats .SampleData .from_tree_sequence (ts )
1619
+ sd1 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
1591
1620
sd2 = sd1 .merge (sd1 )
1592
1621
assert sd2 .num_sites == sd1 .num_sites
1593
1622
assert sd2 .num_samples == 2 * sd1 .num_samples
@@ -1721,7 +1750,7 @@ class TestMinSiteTimes:
1721
1750
1722
1751
def test_no_historical (self ):
1723
1752
ts = tsutil .get_example_ts (10 , 10 , 1 )
1724
- sd1 = formats .SampleData .from_tree_sequence (ts )
1753
+ sd1 = formats .SampleData .from_tree_sequence (ts , use_sites_time = True )
1725
1754
# No arguments and individuals_only=True should give array of zeros
1726
1755
bounds_individuals_only = sd1 .min_site_times (individuals_only = True )
1727
1756
assert np .array_equal (bounds_individuals_only , np .zeros (sd1 .num_sites ))
@@ -1731,7 +1760,9 @@ def test_no_historical(self):
1731
1760
def test_simple_case (self ):
1732
1761
individual_times = [0 , 0 , 0.5 , 1 ]
1733
1762
ts = tsutil .get_example_historical_sampled_ts (individual_times , ploidy = 1 )
1734
- sd1 = formats .SampleData .from_tree_sequence (ts )
1763
+ sd1 = formats .SampleData .from_tree_sequence (
1764
+ ts , use_sites_time = True , use_individuals_time = True
1765
+ )
1735
1766
time_bound_individuals_only = sd1 .min_site_times (individuals_only = True )
1736
1767
# Because this is a haploid tree sequence we can use the
1737
1768
# individual and sample IDs interchangably.
0 commit comments