Skip to content

Commit 22ef437

Browse files
committed
New semantics after recent discussion
1 parent d4188d6 commit 22ef437

File tree

1 file changed

+23
-52
lines changed

1 file changed

+23
-52
lines changed

python/tskit/trees.py

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10533,6 +10533,7 @@ def map_to_vcf_model(
1053310533
ploidy=None,
1053410534
name_metadata_key=None,
1053510535
individual_names=None,
10536+
include_non_sample_nodes=None,
1053610537
):
1053710538
"""
1053810539
Maps the sample nodes in this tree sequence to a representation suitable for
@@ -10571,6 +10572,8 @@ def map_to_vcf_model(
1057110572
ID is specified, if a specified individual has no nodes, or if the number of
1057210573
individuals doesn't match the number of names.
1057310574
"""
10575+
if include_non_sample_nodes is None:
10576+
include_non_sample_nodes = False
1057410577

1057510578
if name_metadata_key is not None and individual_names is not None:
1057610579
raise ValueError(
@@ -10596,63 +10599,31 @@ def map_to_vcf_model(
1059610599
if ploidy is None:
1059710600
ploidy = 1
1059810601
individuals_nodes = self.sample_nodes_by_ploidy(ploidy)
10599-
ts_individual_names = [f"tsk_{i}" for i in range(len(individuals_nodes))]
10602+
if individual_names is None:
10603+
individual_names = [f"tsk_{i}" for i in range(len(individuals_nodes))]
1060010604
else:
10601-
individuals_nodes = []
10602-
ts_individual_names = []
1060310605
if individuals is None:
10604-
for ind in self.individuals():
10605-
if len(ind.nodes) == 0:
10606-
warnings.warn(
10607-
f"Individual {ind.id} has no nodes associated with it.",
10608-
stacklevel=1,
10609-
)
10610-
continue
10611-
is_sample = np.array(
10612-
[self.nodes_flags[u] & tskit.NODE_IS_SAMPLE for u in ind.nodes]
10606+
individuals = np.arange(self.num_individuals, dtype=np.int32)
10607+
if min(individuals) < 0 or max(individuals) >= self.num_individuals:
10608+
raise ValueError("Invalid individual ID")
10609+
10610+
individuals_nodes = self.individuals_nodes[individuals]
10611+
if not include_non_sample_nodes:
10612+
individuals_nodes[
10613+
np.logical_not(
10614+
self.nodes_flags[individuals_nodes] & tskit.NODE_IS_SAMPLE
1061310615
)
10614-
if all(is_sample):
10615-
individuals_nodes.append(ind.nodes)
10616-
if name_metadata_key is not None:
10617-
ts_individual_names.append(ind.metadata[name_metadata_key])
10618-
else:
10619-
ts_individual_names.append(f"tsk_{ind.id}")
10620-
elif all(np.logical_not(is_sample)):
10621-
continue
10622-
else:
10623-
warnings.warn(
10624-
f"Individual {ind.id} has both sample and non-sample nodes "
10625-
"associated with it.",
10626-
stacklevel=1,
10627-
)
10628-
else:
10629-
for i in individuals:
10630-
if i < 0 or i >= self.num_individuals:
10631-
raise ValueError(f"Invalid individual ID {i}")
10632-
ind = self.individual(i)
10633-
if len(ind.nodes) == 0:
10634-
raise ValueError(
10635-
f"Individual {i} has no nodes associated with it."
10636-
)
10637-
individuals_nodes.append(ind.nodes)
10638-
if name_metadata_key is not None:
10639-
ts_individual_names.append(ind.metadata[name_metadata_key])
10640-
else:
10641-
ts_individual_names.append(f"tsk_{ind.id}")
10616+
] = -1
1064210617

10643-
if len(individuals_nodes) > 0:
10644-
max_nodes = max(len(nodes) for nodes in individuals_nodes)
10645-
result = np.full(
10646-
(len(individuals_nodes), max_nodes), -1, dtype=np.int32
10647-
)
10648-
for i, nodes in enumerate(individuals_nodes):
10649-
result[i, : len(nodes)] = nodes
10650-
individuals_nodes = result
10651-
else:
10652-
individuals_nodes = np.empty((0, 0), dtype=np.int32)
10618+
if individual_names is None:
10619+
if name_metadata_key is not None:
10620+
individual_names = [
10621+
self.individual(i).metadata[name_metadata_key]
10622+
for i in individuals
10623+
]
10624+
else:
10625+
individual_names = [f"tsk_{i}" for i in individuals]
1065310626

10654-
if individual_names is None:
10655-
individual_names = ts_individual_names
1065610627
individual_names = np.array(individual_names, dtype=object)
1065710628

1065810629
if len(individuals_nodes) != len(individual_names):

0 commit comments

Comments
 (0)