def test_decode_errors(self): with self.assertRaises(ValueError): pyslim.decode_mutation(2.0) with self.assertRaises(ValueError): pyslim.decode_mutation([2.0, 3.0]) with self.assertRaises(ValueError): pyslim.decode_node(2.0) with self.assertRaises(ValueError): pyslim.decode_node([1, 2]) with self.assertRaises(ValueError): pyslim.decode_individual(3.0) with self.assertRaises(ValueError): pyslim.decode_individual([1, 2]) with self.assertRaises(ValueError): pyslim.decode_population(1.0) with self.assertRaises(ValueError): pyslim.decode_population([2, 3])
def test_individual_metadata(self): md = pyslim.IndividualMetadata( age=2, pedigree_id=23, population=0, sex=pyslim.INDIVIDUAL_TYPE_MALE, flags=pyslim.INDIVIDUAL_FLAG_MIGRATED) md_bytes = pyslim.encode_individual(md) new_md = pyslim.decode_individual(md_bytes) self.assertEqual(md, new_md)
def test_decode_already_individual(self): m = pyslim.IndividualMetadata(pedigree_id=24, age=8, population=1, sex=1, flags=0) dm = pyslim.decode_individual(m) self.assertEqual(m, dm)
def test_legacy_errors(self): defaults = pyslim.default_slim_metadata with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_mutation(defaults('mutation')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_population(defaults('population')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_individual(defaults('individual')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_node(defaults('node')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_mutation(defaults('mutation')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_population(defaults('population')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_individual(defaults('individual')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_node(defaults('node'))
def test_individual_derived_info(self): for ts in self.get_slim_examples(): for j, ind in enumerate(ts.individuals()): a = ts.tables.individuals.metadata_offset[j] b = ts.tables.individuals.metadata_offset[j+1] raw_md = ts.tables.individuals.metadata[a:b] md = pyslim.decode_individual(raw_md) self.assertEqual(ind.metadata, md) self.assertEqual(ts.individual(j).metadata, md) for n in ind.nodes: self.assertEqual(ts.node(n).population, ind.population) self.assertEqual(ts.node(n).time, ind.time)
def test_annotate_individuals(self): for ts in self.get_slim_examples(): tables = ts.tables new_tables = ts.tables metadata = [] for md in tskit.unpack_bytes(tables.individuals.metadata, tables.individuals.metadata_offset): dm = pyslim.decode_individual(md) edm = pyslim.encode_individual(dm) self.assertEqual(md, edm) metadata.append(dm) pyslim.annotate_individual_metadata(new_tables, metadata) self.assertEqual(tables, new_tables)
def test_annotate_individuals(self): for ts in get_msprime_examples(): slim_ts = pyslim.annotate_defaults(ts, model_type="nonWF", slim_generation=1) tables = slim_ts.tables metadata = list(pyslim.extract_individual_metadata(tables)) self.assertEqual(len(metadata), slim_ts.num_individuals) sexes = [random.choice([pyslim.INDIVIDUAL_TYPE_FEMALE, pyslim.INDIVIDUAL_TYPE_MALE]) for _ in metadata] for j in range(len(metadata)): metadata[j].sex = sexes[j] pyslim.annotate_individual_metadata(tables, metadata) new_ts = pyslim.load_tables(tables) for j, ind in enumerate(new_ts.individuals()): md = pyslim.decode_individual(ind.metadata) self.assertEqual(md.sex, sexes[j])
def test_annotate_individuals(self): for ts in self.get_slim_examples(): tables = ts.tables new_tables = ts.tables metadata = [] for md in tskit.unpack_bytes(tables.individuals.metadata, tables.individuals.metadata_offset): with self.assertWarns(DeprecationWarning): dm = pyslim.decode_individual(md) with self.assertWarns(DeprecationWarning): edm = pyslim.encode_individual(dm) self.assertEqual(md, edm) metadata.append(dm) with self.assertWarns(DeprecationWarning): pyslim.annotate_individual_metadata(new_tables, metadata) self.assertTableCollectionsEqual(tables, new_tables)
def individual_populations(self, inds=None): if inds is None: inds = self.individuals() return np.fromiter(map(lambda x: pyslim.decode_individual(x.metadata).population, inds), 'int')
node_metadata = [] for md in msprime.unpack_bytes(tables.nodes.metadata, tables.nodes.metadata_offset): dn = pyslim.decode_node(md) edn = pyslim.encode_node(dn) assert (md == edn) node_metadata.append(dn) pyslim.annotate_nodes(tables, node_metadata) # individuals individual_metadata = [] for md in msprime.unpack_bytes(tables.individuals.metadata, tables.individuals.metadata_offset): di = pyslim.decode_individual(md) edi = pyslim.encode_individual(di) assert (md == edi) individual_metadata.append(di) pyslim.annotate_individuals(tables, individual_metadata) # populations population_metadata = [] for md in msprime.unpack_bytes(tables.populations.metadata, tables.populations.metadata_offset): if len(md) > 0: dp = pyslim.decode_population(md) edp = pyslim.encode_population(dp) assert (md == edp)