Python API#
This page documents the full tskit Python API. Brief thematic summaries of common classes and methods are presented first. The Reference documentation section at the end then contains full details which aim to be concise, precise and exhaustive. Note that this may not therefore be the best place to start if you are new to a particular piece of functionality.
Trees and tree sequences#
The TreeSequence
class represents a sequence of correlated
evolutionary trees along a genome. The Tree
class represents a
single tree in this sequence. These classes are the interfaces used to
interact with the trees and mutational information stored in a tree sequence,
for example as returned from a simulation or inferred from a set of DNA
sequences.
TreeSequence
API#
General properties#
String describing the units of the time dimension for this TreeSequence. |
|
Returns the total number of bytes required to store the data in this tree sequence. |
|
Returns the sequence length in this tree sequence. |
|
Returns the time of the oldest root in any of the trees in this tree sequence. |
|
Returns True if all genome coordinates in this TreeSequence are discrete integer values. |
|
Returns True if all time coordinates in this TreeSequence are discrete integer values. |
|
The decoded metadata for this TreeSequence. |
|
The |
|
The |
Efficient table column access#
The TreeSequence
class provides access to underlying numerical
data defined in the data model in two ways:
Via the
TreeSequence.tables
property and the Tables APIVia a set of properties on the
TreeSequence
class that provide direct and efficient access to the underlying memory.
Warning
Accessing table data via TreeSequence.tables
can be very inefficient
at the moment because accessing the .tables
property incurs a full copy
of the data model. While we intend to implement this as a read-only view
in the future, the engineering involved is nontrivial, and so we recommend
using the properties listed here like ts.nodes_time
in favour of
ts.tables.nodes.time
.
Please see issue #760
for more information.
Efficient access to the bitwise |
|
Efficient access to the |
|
Efficient access to the bitwise |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
|
Efficient access to the |
Loading and saving#
There are several methods for loading data into a TreeSequence
instance. The simplest and most convenient is the use the tskit.load()
function to load a tree sequence file. For small
scale data and debugging, it is often convenient to use the tskit.load_text()
function to read data in the text file format.
The TableCollection.tree_sequence()
function
efficiently creates a TreeSequence
object from a
collection of tables
using the Tables API.
- Load a tree sequence
load
(file, *[, skip_tables, ...])Return a
TreeSequence
instance loaded from the specified file object or path.load_text
(nodes, edges[, sites, mutations, ...])Return a
TreeSequence
instance parsed from tabulated text data contained in the specified file-like objects.Returns a
TreeSequence
instance from the tables defined in thisTableCollection
, building the required indexes if they have not yet been created bybuild_index()
.- Save a tree sequence
TreeSequence.dump
(file_or_path[, ...])Writes the tree sequence to the specified path or file object.
See also
Tree sequences with a single simple topology can also be created from scratch by
generating a Tree
and accessing its
tree_sequence
property.
Obtaining trees#
The following properties and methods return information about the
trees
that are generated along a tree sequence.
Returns the number of distinct trees in this tree sequence. |
|
|
Returns an iterator over the trees in this tree sequence. |
|
Returns the breakpoints that separate trees along the chromosome, including the two extreme points 0 and L. |
|
Returns an iterator over the pairs of trees for each distinct interval in the specified pair of tree sequences. |
|
Returns the first tree in this |
|
Returns the last tree in this |
|
Returns the trees in this tree sequence as a list. |
|
Returns the tree covering the specified genomic location. |
|
Returns the tree at the specified index. |
Obtaining other objects#
Various components make up a tree sequence, such as nodes and edges, sites and mutations, and populations and individuals. These can be counted or converted into Python objects using the following classes, properties, and methods.
Tree topology#
- Nodes
Node
(*args[, metadata_decoder])A node in a tree sequence, corresponding to a single genome.
Returns the number of nodes in this tree sequence.
TreeSequence.nodes
(*[, order])Returns an iterable sequence of all the nodes in this tree sequence.
TreeSequence.node
(id_)Returns the node in this tree sequence with the specified ID.
Returns the number of sample nodes in this tree sequence.
TreeSequence.samples
([population, ...])Returns an array of the sample node IDs in this tree sequence.
- Edges
Genetic variation#
- Sites
Site
(*args[, metadata_decoder])A site in a tree sequence.
Returns the number of sites in this tree sequence.
Returns an iterable sequence of all the sites in this tree sequence.
TreeSequence.site
([id_, position])Returns the site in this tree sequence with either the specified ID or position.
Variant
(tree_sequence[, samples, ...])A variant in a tree sequence, describing the observed genetic variation among samples for a given site.
TreeSequence.variants
(*[, samples, ...])Returns an iterator over the variants between the
left
(inclusive) andright
(exclusive) genomic positions in this tree sequence.TreeSequence.genotype_matrix
(*[, samples, ...])Returns an \(m \times n\) numpy array of the genotypes in this tree sequence, where \(m\) is the number of sites and \(n\) the number of samples.
TreeSequence.haplotypes
(*[, ...])Returns an iterator over the strings of haplotypes that result from the trees and mutations in this tree sequence.
TreeSequence.alignments
(*[, ...])Returns an iterator over the full sequence alignments for the defined samples in this tree sequence.
- Mutations
Demography#
- Populations
Population
(*args[, metadata_decoder])A population in a tree sequence.
Returns the number of populations in this tree sequence.
Returns an iterable sequence of all the populations in this tree sequence.
Returns the population in this tree sequence with the specified ID.
- Migrations
Migration
(*args[, metadata_decoder])A migration in a tree sequence.
Returns the number of migrations in this tree sequence.
Returns an iterable sequence of all the migrations in this tree sequence.
Returns the migration in this tree sequence with the specified ID.
Other#
- Individuals
Individual
(*args[, tree_sequence])An individual in a tree sequence.
Returns the number of individuals in this tree sequence.
Returns an iterable sequence of all the individuals in this tree sequence.
Returns the individual in this tree sequence with the specified ID.
- Provenance entries (also see Provenance)
Provenance
(id, timestamp, record)A provenance entry in a tree sequence, detailing how this tree sequence was generated, or subsequent operations on it (see Provenance).
Returns the number of provenances in this tree sequence.
Returns an iterable sequence of all the provenances in this tree sequence.
Returns the provenance in this tree sequence with the specified ID.
Tree sequence modification#
Although tree sequences are immutable, several methods will taken an existing tree
sequence and return a modifed version. These are thin wrappers around the
identically named methods of a TableCollection,
which perform the same actions but modify the TableCollection
in place.
|
Returns a simplified tree sequence that retains only the history of the nodes given in the list |
|
Returns a tree sequence containing only information directly referencing the provided list of nodes to retain. |
|
Returns an expanded tree sequence which contains the node-wise union of |
|
Returns a copy of this tree sequence which includes only information in the specified list of genomic intervals. |
|
Returns a copy of this tree sequence for which information in the specified list of genomic intervals has been deleted. |
|
Returns a copy of this tree sequence with the specified sites (and their associated mutations) entirely removed. |
|
Returns a copy of this tree sequence with any empty regions (i.e., those not covered by any edge) on the right and left trimmed away. |
|
Returns a copy of this tree sequence in which we replace any edge |
|
Delete all edge topology and mutational information at least as old as the specified time from this tree sequence. |
|
Returns a new tree sequence in which the span covered by ancestral nodes is "extended" to regions of the genome according to the following rule: If an ancestral segment corresponding to node n has ancestor p and descendant c on some portion of the genome, and on an adjacent segment of genome p is still an ancestor of c, then n is inserted into the path from p to c. |
Identity by descent#
The TreeSequence.ibd_segments()
method allows us to compute
identity relationships between pairs of samples. See the
Identity by descent section for more details and examples
and the Identity classes section for
API documentation on the associated classes.
|
Finds pairs of samples that are identical by descent (IBD) and returns the result as an |
Tables#
The underlying data in a tree sequence is stored in a collection of tables. The following methods give access to tables and associated functionality. Since tables can be modified, this allows tree sequences to be edited: see the Tables and editing tutorial for an introduction.
Returns the |
|
Returns a modifiable copy of the |
|
The set of metadata schemas for the tables in this tree sequence. |
|
Returns a dictionary mapping names to tables in the underlying |
Statistics#
- Single site
Computes the allele frequency spectrum (AFS) in windows across the genome for with respect to the specified
sample_sets
.TreeSequence.divergence
(sample_sets[, ...])Computes mean genetic divergence between (and within) pairs of sets of nodes from
sample_sets
.TreeSequence.diversity
([sample_sets, ...])Computes mean genetic diversity (also known as "pi") in each of the sets of nodes from
sample_sets
.TreeSequence.f2
(sample_sets[, indexes, ...])Computes Patterson's f2 statistic between two groups of nodes from
sample_sets
.TreeSequence.f3
(sample_sets[, indexes, ...])Computes Patterson's f3 statistic between three groups of nodes from
sample_sets
.TreeSequence.f4
(sample_sets[, indexes, ...])Computes Patterson's f4 statistic between four groups of nodes from
sample_sets
.TreeSequence.Fst
(sample_sets[, indexes, ...])Computes "windowed" Fst between pairs of sets of nodes from
sample_sets
.Return the genealogical nearest neighbours (GNN) proportions for the given focal nodes, with reference to two or more sets of interest, averaged over all trees in the tree sequence.
TreeSequence.genetic_relatedness
(sample_sets)Computes genetic relatedness between (and within) pairs of sets of nodes from
sample_sets
.Computes weighted genetic relatedness.
TreeSequence.genetic_relatedness_vector
(W[, ...])Computes the product of the genetic relatedness matrix and a vector of weights (one per sample).
TreeSequence.general_stat
(W, f, output_dim)Compute a windowed statistic from weights and a summary function.
Computes the density of segregating sites for each of the sets of nodes from
sample_sets
, and related quantities.TreeSequence.sample_count_stat
(sample_sets, ...)Compute a windowed statistic from sample counts and a summary function.
TreeSequence.mean_descendants
(sample_sets)Computes for every node the mean number of samples in each of the sample_sets that descend from that node, averaged over the portions of the genome for which the node is ancestral to any sample.
TreeSequence.Tajimas_D
([sample_sets, ...])Computes Tajima's D of sets of nodes from
sample_sets
in windows.TreeSequence.trait_correlation
(W[, windows, ...])Computes the mean squared correlations between each of the columns of
W
(the "phenotypes") and inheritance along the tree sequence.TreeSequence.trait_covariance
(W[, windows, ...])Computes the mean squared covariances between each of the columns of
W
(the "phenotypes") and inheritance along the tree sequence.TreeSequence.trait_linear_model
(W[, Z, ...])Finds the relationship between trait and genotype after accounting for covariates.
TreeSequence.Y2
(sample_sets[, indexes, ...])Computes the 'Y2' statistic between pairs of sets of nodes from
sample_sets
.TreeSequence.Y3
(sample_sets[, indexes, ...])Computes the 'Y' statistic between triples of sets of nodes from
sample_sets
.- Comparative
TreeSequence.kc_distance
(other[, lambda_])Returns the average
Tree.kc_distance()
between pairs of trees along the sequence whose intervals overlap.
Topological analysis#
The topology of a tree in a tree sequence refers to the relationship among samples ignoring branch lengths. Functionality as described in Topological analysis is mainly provided via methods on trees, but more efficient methods sometimes exist for entire tree sequences:
|
Returns a generator that produces the same distribution of topologies as |
Display#
|
Return an SVG representation of a tree sequence. |
|
Create a text representation of a tree sequence. |
Return a plain text summary of the contents of a tree sequence |
|
Return an html summary of a tree sequence. |
Export#
|
Return the result of |
|
Return the result of |
|
Writes a text representation of the tables underlying the tree sequence to the specified connections. |
Return a macs encoding of this tree sequence. |
|
|
Writes the |
|
Returns a nexus encoding of this tree sequence. |
|
Convert the genetic variation data in this tree sequence to Variant Call Format and write to the specified file-like object. |
Tree
API#
A tree is an instance of the Tree
class. These trees cannot exist
independently of the TreeSequence
from which they are generated.
Usually, therefore, a Tree
instance is created by
Obtaining trees from an existing tree
sequence (although it is also possible to generate a new instance of a
Tree
belonging to the same tree sequence using Tree.copy()
).
Note
For efficiency, each instance of a Tree
is a state-machine
whose internal state corresponds to one of the trees in the parent tree sequence:
Moving to other trees in the tree sequence does not require a
new instance to be created, but simply the internal state to be changed.
General properties#
Returns the tree sequence that this tree is from. |
|
Returns the sum of all the branch lengths in this tree (in units of time). |
|
Returns the minimum number of samples that a node must be an ancestor of to be considered a potential root. |
|
The ID of the virtual root in this tree. |
|
The total number of edges in this tree. |
|
The number of roots in this tree, as defined in the |
|
|
|
|
|
The root of this tree. |
|
The list of roots in this tree. |
|
Returns the index this tree occupies in the parent tree sequence. |
|
Returns the coordinates of the genomic interval that this tree represents the history of. |
|
Returns the genomic distance that this tree spans. |
Creating new trees#
It is sometimes useful to create an entirely new tree sequence consisting
of just a single tree (a “one-tree sequence”). The follow methods create such an
object and return a Tree
instance corresponding to that tree.
The new tree sequence to which the tree belongs is available through the
tree_sequence
property.
- Creating a new tree
Tree.generate_balanced
(num_leaves, *[, ...])Generate a
Tree
with the specified number of leaves that is maximally balanced.Tree.generate_comb
(num_leaves, *[, span, ...])Generate a
Tree
in which all internal nodes have two children and the left child is a leaf.Tree.generate_random_binary
(num_leaves, *[, ...])Generate a random binary
Tree
with \(n\) =num_leaves
leaves with an equal probability of returning any topology and leaf label permutation among the \((2n - 3)! / (2^{n - 2} (n - 2)!)\) leaf-labelled binary trees.Tree.generate_star
(num_leaves, *[, span, ...])Generate a
Tree
whose leaf nodes all have the same parent (i.e., a "star" tree).- Creating a new tree from an existing tree
Tree.split_polytomies
(*[, epsilon, method, ...])Return a new
Tree
where extra nodes and edges have been inserted so that any any nodeu
with greater than 2 children --- a multifurcation or "polytomy" --- is resolved into successive bifurcations.
See also
Tree.unrank()
for creating a new one-tree sequence from its
topological rank.
Node measures#
Often it is useful to access information pertinant to a specific node or set of nodes
but which might also change from tree to tree in the tree sequence. Examples include
the encoding of the tree via parent
, left_child
, etc.
(see Tree structure), the number of samples under a node,
or the most recent common ancestor (MRCA) of two nodes. This sort of information is
available via simple and high performance Tree
methods
Simple measures#
These return a simple number, or (usually) short list of numbers relevant to a specific node or limited set of nodes.
- Node information
Returns True if the specified node is a sample.
Returns True if the specified node is isolated in this tree: that is it has no parents and no children (note that all isolated nodes in the tree are therefore also
leaves
).Tree.is_leaf
(u)Returns True if the specified node is a leaf.
Returns True if the specified node is not a leaf.
Tree.parent
(u)Returns the parent of the specified node.
Returns the number of children of the specified node (i.e.,
len(tree.children(u))
)Tree.time
(u)Returns the time of the specified node.
Returns the length of the branch (in units of time) joining the specified node to its parent.
Tree.depth
(u)Returns the number of nodes on the path from
u
to a root, not includingu
.Returns the population associated with the specified node.
Returns the sibling node to the right of u, or
tskit.NULL
if u does not have a right sibling.Returns the sibling node to the left of u, or
tskit.NULL
if u does not have a left sibling.Returns the rightmost child of the specified node.
Returns the leftmost child of the specified node.
Returns the children of the specified node
u
as a tuple of integer node IDs.Tree.edge
(u)Returns the id of the edge encoding the relationship between
u
and its parent, ortskit.NULL
ifu
is a root, virtual root or is not a node in the current tree.- Descendant nodes
Tree.leaves
([u])Returns an iterator over all the leaves in this tree that descend from the specified node.
Tree.samples
([u])Returns an iterator over the numerical IDs of all the sample nodes in this tree that are underneath the node with ID
u
.Tree.num_samples
([u])Returns the number of sample nodes in this tree underneath the specified node (including the node itself).
Returns the number of samples in the set specified in the
tracked_samples
parameter of theTreeSequence.trees()
method underneath the specified node.- Multiple nodes
Tree.is_descendant
(u, v)Returns True if the specified node u is a descendant of node v and False otherwise.
Tree.mrca
(*args)Returns the most recent common ancestor of the specified nodes.
Tree.tmrca
(*args)Returns the time of the most recent common ancestor of the specified nodes. This is equivalent to::.
Array access#
These all return a numpy array whose length corresponds to the total number of nodes in the tree sequence. They provide direct access to the underlying memory structures, and are thus very efficient, providing a high performance interface which can be used in conjunction with the equivalent traversal methods.
A numpy array (dtype=np.int32) encoding the parent of each node in this tree, such that |
|
A numpy array (dtype=np.int32) encoding the left child of each node in this tree, such that |
|
A numpy array (dtype=np.int32) encoding the right child of each node in this tree, such that |
|
A numpy array (dtype=np.int32) encoding the left sib of each node in this tree, such that |
|
A numpy array (dtype=np.int32) encoding the right sib of each node in this tree, such that |
|
A numpy array (dtype=np.int32) encoding the number of children of each node in this tree, such that |
|
A numpy array (dtype=np.int32) of edge ids encoding the relationship between the child node |
Tree traversal#
Moving around within a tree usually involves visiting the tree nodes in some sort of
order. Often, given a particular order, it is convenient to iterate over each node
using the Tree.nodes()
method. However, for high performance algorithms, it
may be more convenient to access the node indices for a particular order as
an array, and use this, for example, to index into one of the node arrays (see
Visiting nodes).
- Iterator access
Tree.nodes
([root, order])Returns an iterator over the node IDs reachable from the specified node in this tree in the specified traversal order.
Returns an iterator over the ancestors of node
u
in this tree (i.e. the chain of parents fromu
to the root).- Array access
Tree.postorder
([u])Returns a numpy array of node ids in postorder.
Tree.preorder
([u])Returns a numpy array of node ids in preorder.
Tree.timeasc
([u])Returns a numpy array of node ids.
Tree.timedesc
([u])Returns a numpy array of node ids.
Topological analysis#
The topology of a tree refers to the simple relationship among samples (i.e. ignoring branch lengths), see Identifying and counting topologies for more details. These methods provide ways to enumerate and count tree topologies.
Briefly, the position of a tree in the enumeration all_trees
can be obtained using
the tree’s rank()
method. Inversely, a Tree
can be constructed
from a position in the enumeration with Tree.unrank()
.
- Methods of a tree
Produce the rank of this tree in the enumeration of all leaf-labelled trees of n leaves.
Tree.count_topologies
([sample_sets])Calculates the distribution of embedded topologies for every combination of the sample sets in
sample_sets
.- Functions and static methods
Tree.unrank
(num_leaves, rank, *[, span, ...])Reconstruct the tree of the given
rank
(seetskit.Tree.rank()
) withnum_leaves
leaves.all_tree_shapes
(num_leaves[, span])Generates all unique shapes of trees with
num_leaves
leaves.all_tree_labellings
(tree[, span])Generates all unique labellings of the leaves of a
tskit.Tree
.all_trees
(num_leaves[, span])Generates all unique leaf-labelled trees with
num_leaves
leaves.
Comparing trees#
|
Returns the Kendall-Colijn distance between the specified pair of trees. |
|
Returns the (unweighted) Robinson-Foulds distance between the specified pair of trees, where corresponding samples between the two trees are identified by node ID. |
Balance/imbalance indices#
Returns the Colless imbalance index for this tree. |
|
Returns the Sackin imbalance index for this tree. |
|
Returns the B1 balance index for this tree. |
|
|
Returns the B2 balance index this tree. |
Sites and mutations#
Returns an iterator over all the sites in this tree. |
|
Returns the number of sites on this tree. |
|
Returns an iterator over all the mutations in this tree. |
|
Returns the total number of mutations across all sites on this tree. |
|
|
Given observations for the samples in this tree described by the specified set of genotypes and alleles, return a parsimonious set of state transitions explaining these observations. |
Moving to other trees#
Seeks to the next tree in the sequence. If the tree is in the initial null state we seek to the first tree (equivalent to calling |
|
Seeks to the previous tree in the sequence. If the tree is in the initial null state we seek to the last tree (equivalent to calling |
|
Seeks to the first tree in the sequence. |
|
Seeks to the last tree in the sequence. |
|
|
Sets the state to represent the tree that covers the specified position in the parent tree sequence. |
|
Sets the state to represent the tree at the specified index in the parent tree sequence. |
Resets this tree back to the initial null state. |
Display#
|
Return an SVG representation of a single tree. |
|
Create a text representation of a tree. |
Return a plain text summary of a tree in a tree sequence |
|
Return an html summary of a tree in a tree sequence. |
Export#
Convert tree to dict of dicts for conversion to a networkx graph. |
|
|
Returns a newick encoding of this tree. For example, a binary tree with 3 leaves generated by |
Tables and Table Collections#
The information required to construct a tree sequence is stored in a collection of tables, each defining a different aspect of the structure of a tree sequence. These tables are described individually in the next section. However, these are interrelated, and so many operations work on the entire collection of tables, known as a table collection.
TableCollection
API#
The TableCollection
and TreeSequence
classes are
deeply related. A TreeSequence
instance is based on the information
encoded in a TableCollection
. Tree sequences are immutable, and
provide methods for obtaining trees from the sequence. A TableCollection
is mutable, and does not have any methods for obtaining trees.
The TableCollection
class thus allows creation and modification of
tree sequences (see the Tables and editing tutorial).
General properties#
Specific tables in the TableCollection
are be accessed using the plural version of their name, so that, for instance, the
individual table can be accessed using table_collection.individuals
. A table
collection also has other properties containing, for example, number of bytes taken
to store it and the top-level metadata associated with the tree sequence as a whole.
- Table access
The Individual Table in this collection.
The Node Table in this collection.
The Edge Table in this collection.
The Migration Table in this collection
The Site Table in this collection.
The Mutation Table in this collection.
The Population Table in this collection.
The Provenance Table in this collection.
- Other properties
The UUID for the file this TableCollection is derived from, or None if not derived from a file.
The edge insertion and removal indexes.
Returns the total number of bytes required to store the data in this table collection.
Returns a dictionary mapping table names to the corresponding table instances.
The decoded metadata for this object.
The raw bytes of metadata for this TableCollection
The
tskit.MetadataSchema
for this object.The sequence length defining the coordinate space.
The units used for the time dimension of this TableCollection
Transformation#
These methods act in-place to transform the contents of a TableCollection
,
either by modifying the underlying tables (removing, editing, or adding to them) or
by adjusting the table collection so that it meets the
Valid tree sequence requirements.
Modification#
These methods modify the data stored in a TableCollection
. They also have
equivalant TreeSequence versions
(unlike the methods described below those do not operate in place, but rather act in
a functional way, returning a new tree sequence while leaving the original unchanged).
|
Remove all rows of the data tables, optionally remove provenance, metadata schemas and ts-level metadata. |
|
Simplifies the tables in place to retain only the information necessary to reconstruct the tree sequence describing the given |
|
Modifies the tables in place to contain only the entries referring to the provided list of node IDs, with nodes reordered according to the order they appear in the list. |
|
Delete all information from this set of tables which lies within the specified list of genomic intervals. |
|
Delete all information from this set of tables which lies outside the specified list of genomic intervals. |
|
Remove the specified sites entirely from the sites and mutations tables in this collection. |
|
Trim away any empty regions on the right and left of the tree sequence encoded by these tables. |
|
Modifies the table collection in place by adding the non-shared portions of |
Deletes edge, mutation and migration information at least as old as the specified time. |
Creating a valid tree sequence#
These methods can be used to help reorganise or rationalise the
TableCollection
so that it is in the form
required for
it to be converted
into a TreeSequence
. This may require sorting the tables,
ensuring they are logically consistent, and adding Table indexes.
Note
These methods are not guaranteed to make valid a TableCollection
which is
logically inconsistent, for example if multiple edges have the same child at a
given position on the genome or if non-existent node IDs are referenced.
- Sorting
TableCollection.sort
([edge_start, ...])Sorts the tables in place.
Sorts the individual table in place, so that parents come before children, and the parent column is remapped as required.
TableCollection.canonicalise
([...])This puts the tables in canonical form, imposing a stricter order on the tables than required for a valid tree sequence.
- Logical consistency
Modifies the tables in place, computing the
parent
column of the mutation table.Modifies the tables in place, computing valid values for the
time
column of the mutation table.Modifies the tables in place, removing entries in the site table with duplicate
position
(and keeping only the first entry for each site), and renumbering thesite
column of the mutation table appropriately.- Indexing
Returns True if this TableCollection is indexed.
Builds an index on this TableCollection.
Drops any indexes present on this table collection.
Miscellaneous methods#
Returns a deep copy of this TableCollection. |
|
|
Returns True if self and other are equal. |
|
Returns an |
Export#
Returns a |
|
|
Writes the table collection to the specified path or file object. |
Table APIs#
Here we outline the table classes and the common methods and variables available for each. For description and definition of each table’s meaning and use, see the table definitions.
|
A table defining the individuals in a tree sequence. |
|
A table defining the nodes in a tree sequence. |
|
A table defining the edges in a tree sequence. |
|
A table defining the migrations in a tree sequence. |
|
A table defining the sites in a tree sequence. |
|
A table defining the mutations in a tree sequence. |
|
A table defining the populations referred to in a tree sequence. |
|
A table recording the provenance (i.e., history) of this table, so that the origin of the underlying data and sequence of subsequent operations can be traced. |
Accessing table data#
The tables API provides an efficient way of working
with and interchanging tree sequence data. Each table class
(e.g, NodeTable
, EdgeTable
, SiteTable
) has a specific set
of columns with fixed types, and a set of methods for setting and getting the data
in these columns. The number of rows in the table t
is given by len(t)
.
import tskit
t = tskit.EdgeTable()
t.add_row(left=0, right=1, parent=10, child=11)
t.add_row(left=1, right=2, parent=9, child=11)
print("The table contains", len(t), "rows")
print(t)
The table contains 2 rows
╔══╤════╤═════╤══════╤═════╤════════╗
║id│left│right│parent│child│metadata║
╠══╪════╪═════╪══════╪═════╪════════╣
║0 │ 0│ 1│ 10│ 11│ ║
║1 │ 1│ 2│ 9│ 11│ ║
╚══╧════╧═════╧══════╧═════╧════════╝
Each table supports accessing the data either by row or column. To access the data in a column, we can use standard attribute access which will return a copy of the column data as a numpy array:
t.left
array([0., 1.])
t.parent
array([10, 9], dtype=int32)
To access the data in a row, say row number j
in table t
, simply use t[j]
:
t[0]
EdgeTableRow(left=0.0, right=1.0, parent=10, child=11, metadata=b'')
This also works as expected with negative j
, counting rows from the end of the table
t[-1]
EdgeTableRow(left=1.0, right=2.0, parent=9, child=11, metadata=b'')
The returned row has attributes allowing contents to be accessed by name, e.g.
site_table[0].position
, site_table[0].ancestral_state
, site_table[0].metadata
etc.:
t[-1].right
2.0
Row attributes cannot be modified directly. Instead, the replace
method of a row
object can be used to create a new row with one or more changed column
values, which can then be used to replace the original. For example:
t[-1] = t[-1].replace(child=4, right=3)
print(t)
╔══╤════╤═════╤══════╤═════╤════════╗
║id│left│right│parent│child│metadata║
╠══╪════╪═════╪══════╪═════╪════════╣
║0 │ 0│ 1│ 10│ 11│ ║
║1 │ 1│ 3│ 9│ 4│ ║
╚══╧════╧═════╧══════╧═════╧════════╝
Tables also support the pickle
protocol, and so can be easily serialised and
deserialised. This can be useful, for example, when performing parallel computations
using the multiprocessing
module (however, pickling will not be as efficient
as storing tables in the native format).
import pickle
serialised = pickle.dumps(t)
t2 = pickle.loads(serialised)
print(t2)
╔══╤════╤═════╤══════╤═════╤════════╗
║id│left│right│parent│child│metadata║
╠══╪════╪═════╪══════╪═════╪════════╣
║0 │ 0│ 1│ 10│ 11│ ║
║1 │ 1│ 3│ 9│ 4│ ║
╚══╧════╧═════╧══════╧═════╧════════╝
Tables support the equality operator ==
based on the data
held in the columns:
t == t2
True
t is t2
False
t2.add_row(0, 1, 2, 3)
print(t2)
t == t2
╔══╤════╤═════╤══════╤═════╤════════╗
║id│left│right│parent│child│metadata║
╠══╪════╪═════╪══════╪═════╪════════╣
║0 │ 0│ 1│ 10│ 11│ ║
║1 │ 1│ 3│ 9│ 4│ ║
║2 │ 0│ 1│ 2│ 3│ ║
╚══╧════╧═════╧══════╧═════╧════════╝
False
Todo
Move some or all of these examples into a suitable alternative chapter.
Text columns#
As described in the Encoding ragged columns, working with variable length columns is somewhat more involved. Columns encoding text data store the encoded bytes of the flattened strings, and the offsets into this column in two separate arrays.
Consider the following example:
t = tskit.SiteTable()
t.add_row(0, "A")
t.add_row(1, "BB")
t.add_row(2, "")
t.add_row(3, "CCC")
print(t)
print(t[0])
print(t[1])
print(t[2])
print(t[3])
╔══╤════════╤═══════════════╤════════╗
║id│position│ancestral_state│metadata║
╠══╪════════╪═══════════════╪════════╣
║0 │ 0│ A│ ║
║1 │ 1│ BB│ ║
║2 │ 2│ │ ║
║3 │ 3│ CCC│ ║
╚══╧════════╧═══════════════╧════════╝
SiteTableRow(position=0.0, ancestral_state='A', metadata=b'')
SiteTableRow(position=1.0, ancestral_state='BB', metadata=b'')
SiteTableRow(position=2.0, ancestral_state='', metadata=b'')
SiteTableRow(position=3.0, ancestral_state='CCC', metadata=b'')
Here we create a SiteTable
and add four rows, each with a different
ancestral_state
. We can then access this information from each
row in a straightforward manner. Working with columns of text data
is a little trickier, however:
print(t.ancestral_state)
print(t.ancestral_state_offset)
[65 66 66 67 67 67]
[0 1 3 3 6]
tskit.unpack_strings(t.ancestral_state, t.ancestral_state_offset)
['A', 'BB', '', 'CCC']
Here, the ancestral_state
array is the UTF8 encoded bytes of the flattened
strings, and the ancestral_state_offset
is the offset into this array
for each row. The tskit.unpack_strings()
function, however, is a convient
way to recover the original strings from this encoding. We can also use the
tskit.pack_strings()
to insert data using this approach:
a, off = tskit.pack_strings(["0", "12", ""])
t.set_columns(position=[0, 1, 2], ancestral_state=a, ancestral_state_offset=off)
print(t)
╔══╤════════╤═══════════════╤════════╗
║id│position│ancestral_state│metadata║
╠══╪════════╪═══════════════╪════════╣
║0 │ 0│ 0│ ║
║1 │ 1│ 12│ ║
║2 │ 2│ │ ║
╚══╧════════╧═══════════════╧════════╝
When inserting many rows with standard infinite sites mutations (i.e.,
ancestral state is “0”), it is more efficient to construct the
numpy arrays directly than to create a list of strings and use
pack_strings()
. When doing this, it is important to note that
it is the encoded byte values that are stored; by default, we
use UTF8 (which corresponds to ASCII for simple printable characters).:
import numpy as np
t_s = tskit.SiteTable()
m = 10
a = ord("0") + np.zeros(m, dtype=np.int8)
off = np.arange(m + 1, dtype=np.uint32)
t_s.set_columns(position=np.arange(m), ancestral_state=a, ancestral_state_offset=off)
print(t_s)
print("ancestral state data", t_s.ancestral_state)
print("ancestral state offsets", t_s.ancestral_state_offset)
╔══╤════════╤═══════════════╤════════╗
║id│position│ancestral_state│metadata║
╠══╪════════╪═══════════════╪════════╣
║0 │ 0│ 0│ ║
║1 │ 1│ 0│ ║
║2 │ 2│ 0│ ║
║3 │ 3│ 0│ ║
║4 │ 4│ 0│ ║
║5 │ 5│ 0│ ║
║6 │ 6│ 0│ ║
║7 │ 7│ 0│ ║
║8 │ 8│ 0│ ║
║9 │ 9│ 0│ ║
╚══╧════════╧═══════════════╧════════╝
ancestral state data [48 48 48 48 48 48 48 48 48 48]
ancestral state offsets [ 0 1 2 3 4 5 6 7 8 9 10]
In the mutation table, the derived state of each mutation can be handled similarly:
t_m = tskit.MutationTable()
site = np.arange(m, dtype=np.int32)
d, off = tskit.pack_strings(["1"] * m)
node = np.zeros(m, dtype=np.int32)
t_m.set_columns(site=site, node=node, derived_state=d, derived_state_offset=off)
print(t_m)
╔══╤════╤════╤════╤═════════════╤══════╤════════╗
║id│site│node│time│derived_state│parent│metadata║
╠══╪════╪════╪════╪═════════════╪══════╪════════╣
║0 │ 0│ 0│ nan│ 1│ -1│ ║
║1 │ 1│ 0│ nan│ 1│ -1│ ║
║2 │ 2│ 0│ nan│ 1│ -1│ ║
║3 │ 3│ 0│ nan│ 1│ -1│ ║
║4 │ 4│ 0│ nan│ 1│ -1│ ║
║5 │ 5│ 0│ nan│ 1│ -1│ ║
║6 │ 6│ 0│ nan│ 1│ -1│ ║
║7 │ 7│ 0│ nan│ 1│ -1│ ║
║8 │ 8│ 0│ nan│ 1│ -1│ ║
║9 │ 9│ 0│ nan│ 1│ -1│ ║
╚══╧════╧════╧════╧═════════════╧══════╧════════╝
Todo
Move some or all of these examples into a suitable alternative chapter.
Binary columns#
Columns storing binary data take the same approach as
Text columns to encoding
variable length data.
The difference between the two is only raw bytes
values are accepted: no
character encoding or decoding is done on the data. Consider the following example
where a table has no metadata_schema
such that arbitrary bytes can be stored and
no automatic encoding or decoding of objects is performed by the Python API and we can
store and retrieve raw bytes
. (See Metadata for details):
Below, we add two rows to a NodeTable
, with different
metadata. The first row contains a simple
byte string, and the second contains a Python dictionary serialised using
pickle
.
t = tskit.NodeTable()
t.add_row(metadata=b"these are raw bytes")
t.add_row(metadata=pickle.dumps({"x": 1.1}))
print(t)
╔══╤═════╤══════════╤══════════╤════╤════════════════════════════════════════╗
║id│flags│population│individual│time│metadata ║
╠══╪═════╪══════════╪══════════╪════╪════════════════════════════════════════╣
║0 │ 0│ -1│ -1│ 0│ b'these are raw bytes'║
║1 │ 0│ -1│ -1│ 0│b'\x80\x04\x95\x11\x00\x00\x00\x00\x0...║
╚══╧═════╧══════════╧══════════╧════╧════════════════════════════════════════╝
Note that the pickled dictionary is encoded in 24 bytes containing unprintable characters. It appears to be unrelated to the original contents, because the binary data is base64 encoded to ensure that it is print-safe (and doesn’t break your terminal). (See the Metadata section for more information on the use of base64 encoding.).
We can access the metadata in a row (e.g., t[0].metadata
) which returns a Python
bytes object containing precisely the bytes that were inserted.
print(t[0].metadata)
print(t[1].metadata)
b'these are raw bytes'
b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00}\x94\x8c\x01x\x94G?\xf1\x99\x99\x99\x99\x99\x9as.'
The metadata containing the pickled dictionary can be unpickled using
pickle.loads()
:
print(pickle.loads(t[1].metadata))
{'x': 1.1}
As previously, the replace
method can be used to change the metadata,
by overwriting an existing row with an updated one:
t[0] = t[0].replace(metadata=b"different raw bytes")
print(t)
╔══╤═════╤══════════╤══════════╤════╤════════════════════════════════════════╗
║id│flags│population│individual│time│metadata ║
╠══╪═════╪══════════╪══════════╪════╪════════════════════════════════════════╣
║0 │ 0│ -1│ -1│ 0│ b'different raw bytes'║
║1 │ 0│ -1│ -1│ 0│b'\x80\x04\x95\x11\x00\x00\x00\x00\x0...║
╚══╧═════╧══════════╧══════════╧════╧════════════════════════════════════════╝
Finally, when we print the metadata
column, we see the raw byte values
encoded as signed integers. As for Text columns,
the metadata_offset
column encodes the offsets into this array. So, we
see that the first metadata value is 9 bytes long and the second is 24.
print(t.metadata)
print(t.metadata_offset)
[ 100 105 102 102 101 114 101 110 116 32 114 97 119 32
98 121 116 101 115 -128 4 -107 17 0 0 0 0 0
0 0 125 -108 -116 1 120 -108 71 63 -15 -103 -103 -103
-103 -103 -102 115 46]
[ 0 19 47]
The tskit.pack_bytes()
and tskit.unpack_bytes()
functions are
also useful for encoding data in these columns.
Todo
Move some or all of these examples into a suitable alternative chapter.
Table functions#
|
Parse the specified file-like object containing a whitespace delimited description of a node table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of a edge table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of a site table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of a mutation table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of an individual table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of a population table and returns the corresponding |
|
Parse the specified file-like object containing a whitespace delimited description of a migration table and returns the corresponding |
|
Packs the specified list of strings into a flattened numpy array of 8 bit integers and corresponding offsets using the specified text encoding. |
|
Unpacks a list of strings from the specified numpy arrays of packed byte data and corresponding offsets using the specified text encoding. |
|
Packs the specified list of bytes into a flattened numpy array of 8 bit integers and corresponding offsets. |
|
Unpacks a list of bytes from the specified numpy arrays of packed byte data and corresponding offsets. |
Metadata API#
The metadata
module provides validation, encoding and decoding of metadata
using a schema. See Metadata, Python Metadata API Overview and
Working with Metadata.
|
Class for validating, encoding and decoding metadata. |
|
Register a metadata codec class. |
See also
Refer to the top level metadata-related properties of TreeSequences and TableCollections,
such as TreeSequence.metadata
and TreeSequence.metadata_schema
. Also the
metadata fields of
objects accessed through
the TreeSequence
API.
Provenance#
We provide some preliminary support for validating JSON documents against the provenance schema. Programmatic access to provenance information is planned for future versions.
|
Validates the specified dict-like object against the tskit provenance schema. |
Utility functions#
Miscellaneous top-level utility functions.
|
As the default unknown mutation time ( |
|
Returns a random string of nucleotides of the specified length. |
Reference documentation#
Constants#
The following constants are used throughout the tskit
API.
- tskit.NULL = -1#
Special reserved value representing a null ID.
- tskit.MISSING_DATA = -1#
Special value representing missing data in a genotype array
- tskit.NODE_IS_SAMPLE = 1#
Node flag value indicating that it is a sample.
- tskit.FORWARD = 1#
Constant representing the forward direction of travel (i.e., increasing genomic coordinate values).
- tskit.REVERSE = -1#
Constant representing the reverse direction of travel (i.e., decreasing genomic coordinate values).
- tskit.ALLELES_01 = ('0', '1')#
The allele mapping where the strings “0” and “1” map to genotype values 0 and 1.
- tskit.ALLELES_ACGT = ('A', 'C', 'G', 'T')#
The allele mapping where the four nucleotides A, C, G and T map to the genotype integers 0, 1, 2, and 3, respectively.
- tskit.UNKNOWN_TIME = nan#
Special NAN value used to indicate unknown mutation times. Since this is a NAN value, you cannot use == to test for it. Use
is_unknown_time()
instead.
- tskit.TIME_UNITS_UNKNOWN = 'unknown'#
Default value of ts.time_units
- tskit.TIME_UNITS_UNCALIBRATED = 'uncalibrated'#
ts.time_units value when dimension is uncalibrated
Exceptions#
- exception tskit.MetadataEncodingError[source]#
A metadata object was of a type that could not be encoded
- exception tskit.MetadataSchemaValidationError[source]#
A metadata schema object did not validate against the metaschema.
Top-level functions#
- tskit.all_trees(num_leaves, span=1)[source]#
Generates all unique leaf-labelled trees with
num_leaves
leaves. See Identifying and counting topologies on the details of this enumeration. The leaf labels are selected from the set[0, num_leaves)
. The times and labels on internal nodes are chosen arbitrarily.- Parameters:
- Return type:
- tskit.all_tree_shapes(num_leaves, span=1)[source]#
Generates all unique shapes of trees with
num_leaves
leaves.- Parameters:
- Return type:
- tskit.all_tree_labellings(tree, span=1)[source]#
Generates all unique labellings of the leaves of a
tskit.Tree
. Leaves are labelled from the set[0, n)
wheren
is the number of leaves oftree
.- Parameters:
tree (tskit.Tree) – The tree used to generate labelled trees of the same shape.
span (float) – The genomic span of each returned tree.
- Return type:
- tskit.is_unknown_time(time)[source]#
As the default unknown mutation time (
UNKNOWN_TIME
) is a specific NAN value, equality always fails (A NAN value is not equal to itself by definition). This method compares the bitfield such that unknown times can be detected. Either single floats can be passed or lists/arrays.Note that NANs are a set of floating-point values. tskit.UNKNOWN_TIME is a specific value in this set. np.nan is a differing value, but both are NAN. See https://en.wikipedia.org/wiki/NaN
This function only returns true for
tskit.is_unknown_time(tskit.UNKNOWN_TIME)
and will return false fortskit.is_unknown_time(np.nan)
or any other NAN or non-NAN value.- Parameters:
time (Union[float, array-like]) – Value or array to check.
- Returns:
A single boolean or array of booleans the same shape as
time
.- Return type:
Union[bool, numpy.ndarray[bool]]
- tskit.load(file, *, skip_tables=False, skip_reference_sequence=False)[source]#
Return a
TreeSequence
instance loaded from the specified file object or path. The file must be in the tree sequence file format produced by theTreeSequence.dump()
method.Warning
With any of the
skip_tables
orskip_reference_sequence
options set, it is not possible to load data from a non-seekable stream (e.g. a socket or STDIN) of multiple tree sequences using consecutive calls totskit.load()
.- Parameters:
file (str) – The file object or path of the
.trees
file containing the tree sequence we wish to load.skip_tables (bool) – If True, no tables are read from the
.trees
file and only the top-level information is populated in the tree sequence object.skip_reference_sequence (bool) – If True, the tree sequence is read without loading its reference sequence.
- Returns:
The tree sequence object containing the information stored in the specified file path.
- Return type:
- tskit.load_text(nodes, edges, sites=None, mutations=None, individuals=None, populations=None, migrations=None, sequence_length=0, strict=True, encoding='utf8', base64_metadata=True)[source]#
Return a
TreeSequence
instance parsed from tabulated text data contained in the specified file-like objects. The format for these files is documented in the Text file formats section, and is produced by theTreeSequence.dump_text()
method. Further properties required for an input tree sequence are described in the Valid tree sequence requirements section. This method is intended as a convenient interface for importing external data into tskit; the binary file format using bytskit.load()
is many times more efficient than this text format.The
nodes
andedges
parameters are mandatory and must be file-like objects containing text with whitespace delimited columns, parsable byparse_nodes()
andparse_edges()
, respectively.sites
,individuals
,populations
,mutations
, andmigrations
are optional, and must be parsable byparse_sites()
,parse_individuals()
,parse_populations()
,parse_mutations()
, andparse_migrations()
, respectively. For convenience, if the node table refers to populations, but thepopulations
parameter is not provided, a minimal set of rows are added to the population table, so that a valid tree sequence can be returned.The
sequence_length
parameter determines theTreeSequence.sequence_length
of the returned tree sequence. If it is 0 or not specified, the value is taken to be the maximum right coordinate of the input edges. This parameter is useful in degenerate situations (such as when there are zero edges), but can usually be ignored.The
strict
parameter controls the field delimiting algorithm that is used. Ifstrict
is True (the default), we require exactly one tab character separating each field. Ifstrict
is False, a more relaxed whitespace delimiting algorithm is used, such that any run of whitespace is regarded as a field separator. In most situations,strict=False
is more convenient, but it can lead to error in certain situations. For example, if a deletion is encoded in the mutation table this will not be parseable whenstrict=False
.After parsing the tables,
TableCollection.sort()
is called to ensure that the loaded tables satisfy the tree sequence ordering requirements. Note that this may result in the IDs of various entities changing from their positions in the input file.- Parameters:
nodes (io.TextIOBase) – The file-like object containing text describing a
NodeTable
.edges (io.TextIOBase) – The file-like object containing text describing an
EdgeTable
.sites (io.TextIOBase) – The file-like object containing text describing a
SiteTable
.mutations (io.TextIOBase) – The file-like object containing text describing a
MutationTable
.individuals (io.TextIOBase) – The file-like object containing text describing a
IndividualTable
.populations (io.TextIOBase) – The file-like object containing text describing a
PopulationTable
.migrations (io.TextIOBase) – The file-like object containing text describing a
MigrationTable
.sequence_length (float) – The sequence length of the returned tree sequence. If not supplied or zero this will be inferred from the set of edges.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
- Returns:
The tree sequence object containing the information stored in the specified file paths.
- Return type:
- tskit.pack_bytes(data)[source]#
Packs the specified list of bytes into a flattened numpy array of 8 bit integers and corresponding offsets. See Encoding ragged columns for details of this encoding.
- Parameters:
- Returns:
The tuple (packed, offset) of numpy arrays representing the flattened input data and offsets.
- Return type:
numpy.ndarray (dtype=np.int8), numpy.ndarray (dtype=np.uint32)
- tskit.pack_strings(strings, encoding='utf8')[source]#
Packs the specified list of strings into a flattened numpy array of 8 bit integers and corresponding offsets using the specified text encoding. See Encoding ragged columns for details of this encoding of columns of variable length data.
- Parameters:
- Returns:
The tuple (packed, offset) of numpy arrays representing the flattened input data and offsets.
- Return type:
numpy.ndarray (dtype=np.int8), numpy.ndarray (dtype=np.uint32)
- tskit.parse_edges(source, strict=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a edge table and returns the corresponding
EdgeTable
instance. See the edge text format section for the details of the required format and the edge table definition section for the required properties of the contents.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
table (EdgeTable) – If specified, write the edges into this table. If not, create a new
EdgeTable
instance and return.
- tskit.parse_individuals(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of an individual table and returns the corresponding
IndividualTable
instance. See the individual text format section for the details of the required format and the individual table definition section for the required properties of the contents.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (IndividualTable) – If specified write into this table. If not, create a new
IndividualTable
instance.
- tskit.parse_mutations(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a mutation table and returns the corresponding
MutationTable
instance. See the mutation text format section for the details of the required format and the mutation table definition section for the required properties of the contents. Note that if thetime
column is missing its entries are filled withUNKNOWN_TIME
.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (MutationTable) – If specified, write mutations into this table. If not, create a new
MutationTable
instance.
- tskit.parse_nodes(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a node table and returns the corresponding
NodeTable
instance. See the node text format section for the details of the required format and the node table definition section for the required properties of the contents.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (NodeTable) – If specified write into this table. If not, create a new
NodeTable
instance.
- tskit.parse_populations(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a population table and returns the corresponding
PopulationTable
instance. See the population text format section for the details of the required format and the population table definition section for the required properties of the contents.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (PopulationTable) – If specified write into this table. If not, create a new
PopulationTable
instance.
- tskit.parse_migrations(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a migration table and returns the corresponding
MigrationTable
instance.See the migration text format section for the details of the required format and the migration table definition section for the required properties of the contents. Note that if the
time
column is missing its entries are filled withUNKNOWN_TIME
.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (MigrationTable) – If specified, write migrations into this table. If not, create a new
MigrationTable
instance.
- tskit.parse_sites(source, strict=True, encoding='utf8', base64_metadata=True, table=None)[source]#
Parse the specified file-like object containing a whitespace delimited description of a site table and returns the corresponding
SiteTable
instance. See the site text format section for the details of the required format and the site table definition section for the required properties of the contents.See
tskit.load_text()
for a detailed explanation of thestrict
parameter.- Parameters:
source (io.TextIOBase) – The file-like object containing the text.
strict (bool) – If True, require strict tab delimiting (default). If False, a relaxed whitespace splitting algorithm is used.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
table (SiteTable) – If specified write site into this table. If not, create a new
SiteTable
instance.
- tskit.random_nucleotides(length, *, seed=None)[source]#
Returns a random string of nucleotides of the specified length. Characters are drawn uniformly from the alphabet “ACTG”.
- tskit.register_metadata_codec(codec_cls, codec_id)[source]#
Register a metadata codec class. This function maintains a mapping from metadata codec identifiers used in schemas to codec classes. When a codec class is registered, it will replace any class previously registered under the same codec identifier, if present.
- tskit.validate_provenance(provenance)[source]#
Validates the specified dict-like object against the tskit provenance schema. If the input does not represent a valid instance of the schema an exception is raised.
- Parameters:
provenance (dict) – The dictionary representing a JSON document to be validated against the schema.
- Raises:
ProvenanceValidationError – if the schema is not valid.
- tskit.unpack_bytes(packed, offset)[source]#
Unpacks a list of bytes from the specified numpy arrays of packed byte data and corresponding offsets. See Encoding ragged columns for details of this encoding.
- Parameters:
packed (numpy.ndarray) – The flattened array of byte values.
offset (numpy.ndarray) – The array of offsets into the
packed
array.
- Returns:
The list of bytes values unpacked from the parameter arrays.
- Return type:
- tskit.unpack_strings(packed, offset, encoding='utf8')[source]#
Unpacks a list of strings from the specified numpy arrays of packed byte data and corresponding offsets using the specified text encoding. See Encoding ragged columns for details of this encoding of columns of variable length data.
- Parameters:
packed (numpy.ndarray) – The flattened array of byte values.
offset (numpy.ndarray) – The array of offsets into the
packed
array.encoding (str) – The text encoding to use when converting string data to bytes. See the
codecs
module for information on available string encodings.
- Returns:
The list of strings unpacked from the parameter arrays.
- Return type:
Tree and tree sequence classes#
The Tree
class#
Also see the Tree API summary.
- class tskit.Tree[source]#
A single tree in a
TreeSequence
. Please see the Processing trees section for information on how efficiently access trees sequentially or obtain a list of individual trees in a tree sequence.The
sample_lists
parameter controls the features that are enabled for this tree. Ifsample_lists
is True a more efficient algorithm is used in theTree.samples()
method.The
tracked_samples
parameter can be used to efficiently count the number of samples in a given set that exist in a particular subtree using theTree.num_tracked_samples()
method.The
Tree
class is a state-machine which has a state corresponding to each of the trees in the parent tree sequence. We transition between these states by using the seek functions likeTree.first()
,Tree.last()
,Tree.seek()
andTree.seek_index()
. There is one more state, the so-called “null” or “cleared” state. This is the state that aTree
is in immediately after initialisation; it has an index of -1, and no edges. We can also enter the null state by callingTree.next()
on the last tree in a sequence, callingTree.prev()
on the first tree in a sequence or calling calling theTree.clear()
method at any time.The high-level TreeSequence seeking and iterations methods (e.g,
TreeSequence.trees()
) are built on these low-level state-machine seek operations. We recommend these higher level operations for most users.- Parameters:
tree_sequence (TreeSequence) – The parent tree sequence.
tracked_samples (list) – The list of samples to be tracked and counted using the
Tree.num_tracked_samples()
method.sample_lists (bool) – If True, provide more efficient access to the samples beneath a given node using the
Tree.samples()
method.root_threshold (int) – The minimum number of samples that a node must be ancestral to for it to be in the list of roots. By default this is 1, so that isolated samples (representing missing data) are roots. To efficiently restrict the roots of the tree to those subtending meaningful topology, set this to 2. This value is only relevant when trees have multiple roots.
sample_counts (bool) – Deprecated since 0.2.4.
- copy()[source]#
Returns a deep copy of this tree. The returned tree will have identical state to this tree.
- Returns:
A copy of this tree.
- Return type:
- property tree_sequence#
Returns the tree sequence that this tree is from.
- Returns:
The parent tree sequence for this tree.
- Return type:
- property root_threshold#
Returns the minimum number of samples that a node must be an ancestor of to be considered a potential root. This can be set, for example, when calling the
TreeSequence.trees()
iterator.- Returns:
The root threshold.
- Return type:
- first()[source]#
Seeks to the first tree in the sequence. This can be called whether the tree is in the null state or not.
- last()[source]#
Seeks to the last tree in the sequence. This can be called whether the tree is in the null state or not.
- next()[source]#
Seeks to the next tree in the sequence. If the tree is in the initial null state we seek to the first tree (equivalent to calling
first()
). Callingnext
on the last tree in the sequence results in the tree being cleared back into the null initial state (equivalent to callingclear()
). The return value of the function indicates whether the tree is in a non-null state, and can be used to loop over the trees:# Iterate over the trees from left-to-right tree = tskit.Tree(tree_sequence) while tree.next() # Do something with the tree. print(tree.index) # tree is now back in the null state.
- Returns:
True if the tree has been transformed into one of the trees in the sequence; False if the tree has been transformed into the null state.
- Return type:
- prev()[source]#
Seeks to the previous tree in the sequence. If the tree is in the initial null state we seek to the last tree (equivalent to calling
last()
). Callingprev
on the first tree in the sequence results in the tree being cleared back into the null initial state (equivalent to callingclear()
). The return value of the function indicates whether the tree is in a non-null state, and can be used to loop over the trees:# Iterate over the trees from right-to-left tree = tskit.Tree(tree_sequence) while tree.prev() # Do something with the tree. print(tree.index) # tree is now back in the null state.
- Returns:
True if the tree has been transformed into one of the trees in the sequence; False if the tree has been transformed into the null state.
- Return type:
- clear()[source]#
Resets this tree back to the initial null state. Calling this method on a tree already in the null state has no effect.
- seek_index(index)[source]#
Sets the state to represent the tree at the specified index in the parent tree sequence. Negative indexes following the standard Python conventions are allowed, i.e.,
index=-1
will seek to the last tree in the sequence.Warning
The current implementation of this operation is linear in the number of trees, so may be inefficient for large tree sequences. See this issue for more information.
- Parameters:
index (int) – The tree index to seek to.
- Raises:
IndexError – If an index outside the acceptable range is provided.
- seek(position)[source]#
Sets the state to represent the tree that covers the specified position in the parent tree sequence. After a successful return of this method we have
tree.interval.left
<=position
<tree.interval.right
.Warning
The current implementation of this operation is linear in the number of trees, so may be inefficient for large tree sequences. See this issue for more information.
- Parameters:
position (float) – The position along the sequence length to seek to.
- Raises:
ValueError – If 0 < position or position >=
TreeSequence.sequence_length
.
- rank()[source]#
Produce the rank of this tree in the enumeration of all leaf-labelled trees of n leaves. See the Interpreting Tree Ranks section for details on ranking and unranking trees.
- Raises:
ValueError – If the tree has multiple roots.
- Return type:
- static unrank(num_leaves, rank, *, span=1, branch_length=1)[source]#
Reconstruct the tree of the given
rank
(seetskit.Tree.rank()
) withnum_leaves
leaves. The labels and times of internal nodes are assigned by a postorder traversal of the nodes, such that the time of each internal node is the maximum time of its children plus the specifiedbranch_length
. The time of each leaf is 0.See the Interpreting Tree Ranks section for details on ranking and unranking trees and what constitutes valid ranks.
- Parameters:
num_leaves (int) – The number of leaves of the tree to generate.
span (float) – The genomic span of the returned tree. The tree will cover the interval \([0, \text{span})\) and the
tree_sequence
from which the tree is taken will have itssequence_length
equal tospan
.
- Param:
float branch_length: The minimum length of a branch in this tree.
- Raises:
ValueError – If the given rank is out of bounds for trees with
num_leaves
leaves.- Return type:
- count_topologies(sample_sets=None)[source]#
Calculates the distribution of embedded topologies for every combination of the sample sets in
sample_sets
.sample_sets
defaults to all samples in the tree grouped by population.sample_sets
need not include all samples but must be pairwise disjoint.The returned object is a
tskit.TopologyCounter
that contains counts of topologies per combination of sample sets. For example,>>> topology_counter = tree.count_topologies() >>> rank, count = topology_counter[0, 1, 2].most_common(1)[0]
produces the most common tree topology, with populations 0, 1 and 2 as its tips, according to the genealogies of those populations’ samples in this tree.
The counts for each topology in the
tskit.TopologyCounter
are absolute counts that we would get if we were to select all combinations of samples from the relevant sample sets. For sample sets \([s_0, s_1, ..., s_n]\), the total number of topologies for those sample sets is equal to \(|s_0| * |s_1| * ... * |s_n|\), so the counts in the countertopology_counter[0, 1, ..., n]
should sum to \(|s_0| * |s_1| * ... * |s_n|\).To convert the topology counts to probabilities, divide by the total possible number of sample combinations from the sample sets in question:
>>> set_sizes = [len(sample_set) for sample_set in sample_sets] >>> p = count / (set_sizes[0] * set_sizes[1] * set_sizes[2])
Warning
The interface for this method is preliminary and may be subject to backwards incompatible changes in the near future.
- Parameters:
sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes to compute the statistic with. Defaults to all samples grouped by population.
- Raises:
ValueError – If nodes in
sample_sets
are invalid or are internal samples.- Return type:
- branch_length(u)[source]#
Returns the length of the branch (in units of time) joining the specified node to its parent. This is equivalent to
>>> tree.time(tree.parent(u)) - tree.time(u)
The branch length for a node that has no parent (e.g., a root) is defined as zero.
Note that this is not related to the property .length which is a deprecated alias for the genomic
span
covered by a tree.
- property total_branch_length#
Returns the sum of all the branch lengths in this tree (in units of time). This is equivalent to
>>> sum(tree.branch_length(u) for u in tree.nodes())
Note that the branch lengths for root nodes are defined as zero.
As this is defined by a traversal of the tree, technically we return the sum of all branch lengths that are reachable from roots. Thus, this is the total length of all branches that are connected to at least one sample. This distinction is only important in tree sequences that contain ‘dead branches’, i.e., those that define topology that is not connected to a tree root (see Dead leaves and branches)
- Returns:
The sum of lengths of branches in this tree.
- Return type:
- mrca(*args)[source]#
Returns the most recent common ancestor of the specified nodes.
- Parameters:
*args (int) – input node IDs, at least 2 arguments are required.
- Returns:
The node ID of the most recent common ancestor of the input nodes, or
tskit.NULL
if the nodes do not share a common ancestor in the tree.- Return type:
- tmrca(*args)[source]#
Returns the time of the most recent common ancestor of the specified nodes. This is equivalent to:
>>> tree.time(tree.mrca(*args))
Note
If you are using this method to calculate average tmrca values along the genome between pairs of sample nodes, for efficiency reasons you should instead consider the
mode="branch"
option of theTreeSequence.divergence()
orTreeSequence.diversity()
methods. Since these calculate the average branch length between pairs of sample nodes, for samples at time 0 the resulting statistics will be exactly twice the tmrca value.- Parameters:
*args – input node IDs, at least 2 arguments are required.
- Returns:
The time of the most recent common ancestor of all the nodes.
- Return type:
- Raises:
ValueError – If the nodes do not share a single common ancestor in this tree (i.e., if
tree.mrca(*args) == tskit.NULL
)
- parent(u)[source]#
Returns the parent of the specified node. Returns
tskit.NULL
if u is a root or is not a node in the current tree.
- property parent_array#
A numpy array (dtype=np.int32) encoding the parent of each node in this tree, such that
tree.parent_array[u] == tree.parent(u)
for all0 <= u <= ts.num_nodes
. See theparent()
method for details on the semantics of tree parents and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- ancestors(u)[source]#
Returns an iterator over the ancestors of node
u
in this tree (i.e. the chain of parents fromu
to the root).
- left_child(u)[source]#
Returns the leftmost child of the specified node. Returns
tskit.NULL
if u is a leaf or is not a node in the current tree. The left-to-right ordering of children is arbitrary and should not be depended on; see the data model section for details.This is a low-level method giving access to the quintuply linked tree structure in memory; the
children()
method is a more convenient way to obtain the children of a given node.
- property left_child_array#
A numpy array (dtype=np.int32) encoding the left child of each node in this tree, such that
tree.left_child_array[u] == tree.left_child(u)
for all0 <= u <= ts.num_nodes
. See theleft_child()
method for details on the semantics of tree left_child and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- right_child(u)[source]#
Returns the rightmost child of the specified node. Returns
tskit.NULL
if u is a leaf or is not a node in the current tree. The left-to-right ordering of children is arbitrary and should not be depended on; see the data model section for details.This is a low-level method giving access to the quintuply linked tree structure in memory; the
children()
method is a more convenient way to obtain the children of a given node.
- property right_child_array#
A numpy array (dtype=np.int32) encoding the right child of each node in this tree, such that
tree.right_child_array[u] == tree.right_child(u)
for all0 <= u <= ts.num_nodes
. See theright_child()
method for details on the semantics of tree right_child and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- left_sib(u)[source]#
Returns the sibling node to the left of u, or
tskit.NULL
if u does not have a left sibling. The left-to-right ordering of children is arbitrary and should not be depended on; see the data model section for details.
- property left_sib_array#
A numpy array (dtype=np.int32) encoding the left sib of each node in this tree, such that
tree.left_sib_array[u] == tree.left_sib(u)
for all0 <= u <= ts.num_nodes
. See theleft_sib()
method for details on the semantics of tree left_sib and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- right_sib(u)[source]#
Returns the sibling node to the right of u, or
tskit.NULL
if u does not have a right sibling. The left-to-right ordering of children is arbitrary and should not be depended on; see the data model section for details.
- property right_sib_array#
A numpy array (dtype=np.int32) encoding the right sib of each node in this tree, such that
tree.right_sib_array[u] == tree.right_sib(u)
for all0 <= u <= ts.num_nodes
. See theright_sib()
method for details on the semantics of tree right_sib and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- siblings(u)[source]#
Returns the sibling(s) of the specified node
u
as a tuple of integer node IDs. Ifu
has no siblings or is not a node in the current tree, returns an empty tuple. Ifu
is the root of a single-root tree, returns an empty tuple; ifu
is the root of a multi-root tree, returns the other roots (note all the roots are related by the virtual root). Ifu
is the virtual root (which has no siblings), returns an empty tuple. Ifu
is an isolated node, whether it has siblings or not depends on whether it is a sample or non-sample node; if it is a sample node, returns the root(s) of the tree, otherwise, returns an empty tuple. The ordering of siblings is arbitrary and should not be depended on; see the data model section for details.
- property num_children_array#
A numpy array (dtype=np.int32) encoding the number of children of each node in this tree, such that
tree.num_children_array[u] == tree.num_children(u)
for all0 <= u <= ts.num_nodes
. See thenum_children()
method for details on the semantics of tree num_children and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- edge(u)[source]#
Returns the id of the edge encoding the relationship between
u
and its parent, ortskit.NULL
ifu
is a root, virtual root or is not a node in the current tree.
- property edge_array#
A numpy array (dtype=np.int32) of edge ids encoding the relationship between the child node
u
and its parent, such thattree.edge_array[u] == tree.edge(u)
for all0 <= u <= ts.num_nodes
. See theedge()
method for details on the semantics of tree edge and the Tree structure section for information on the quintuply linked tree encoding.Note
The length of these arrays is equal to the number of nodes in the tree sequence plus 1, with the final element corresponding to the tree’s
virtual_root()
. Please see the tree roots section for more details.Warning
This is a high-performance interface which provides zero-copy access to memory used in the C library. As a consequence, the values stored in this array will change as the Tree state is modified as we move along the tree sequence. See the
Tree
documentation for more details. Therefore, if you want to compare arrays representing different trees along the sequence, you must take copies of the arrays.
- property virtual_root#
The ID of the virtual root in this tree. This is equal to
TreeSequence.num_nodes
.Please see the tree roots section for more details.
- property num_edges#
The total number of edges in this tree. This is equal to the number of tree sequence edges that intersect with this tree’s genomic interval.
Note that this may be greater than the number of branches that are reachable from the tree’s roots, since we can have topology that is not associated with any samples.
- property left_root#
The leftmost root in this tree. If there are multiple roots in this tree, they are siblings of this node, and so we can use
right_sib()
to iterate over all roots:u = tree.left_root while u != tskit.NULL: print("Root:", u) u = tree.right_sib(u)
The left-to-right ordering of roots is arbitrary and should not be depended on; see the data model section for details.
This is a low-level method giving access to the quintuply linked tree structure in memory; the
roots
attribute is a more convenient way to obtain the roots of a tree. If you are assuming that there is a single root in the tree you should use theroot
property.Warning
Do not use this property if you are assuming that there is a single root in trees that are being processed. The
root
property should be used in this case, as it will raise an error when multiple roots exists.- Return type:
- children(u)[source]#
Returns the children of the specified node
u
as a tuple of integer node IDs. Ifu
is a leaf, return the empty tuple. The ordering of children is arbitrary and should not be depended on; see the data model section for details.
- time(u)[source]#
Returns the time of the specified node. This is equivalently to
tree.tree_sequence.node(u).time
except for the special case of the tree’s virtual root, which is defined as positive infinity.
- depth(u)[source]#
Returns the number of nodes on the path from
u
to a root, not includingu
. Thus, the depth of a root is zero.As a special case, the depth of the virtual root is defined as -1.
- population(u)[source]#
Returns the population associated with the specified node. Equivalent to
tree.tree_sequence.node(u).population
.
- is_internal(u)[source]#
Returns True if the specified node is not a leaf. A node is internal if it has one or more children in the current tree.
- is_leaf(u)[source]#
Returns True if the specified node is a leaf. A node \(u\) is a leaf if it has zero children.
Note
\(u\) can be any node in the entire tree sequence, including ones which are not connected via branches to a root node of the tree (and which are therefore not conventionally considered part of the tree). Indeed, if there are many trees in the tree sequence, it is common for the majority of non-sample nodes to be
isolated
in any one tree. By the definition above, this method will returnTrue
for such a tree when a node of this sort is specified. Such nodes can be thought of as “dead leaves”, see Dead leaves and branches.
- is_isolated(u)[source]#
Returns True if the specified node is isolated in this tree: that is it has no parents and no children (note that all isolated nodes in the tree are therefore also
leaves
). Sample nodes that are isolated and have no mutations above them are used to represent missing data.
- is_sample(u)[source]#
Returns True if the specified node is a sample. A node \(u\) is a sample if it has been marked as a sample in the parent tree sequence.
- is_descendant(u, v)[source]#
Returns True if the specified node u is a descendant of node v and False otherwise. A node \(u\) is a descendant of another node \(v\) if \(v\) is on the path from \(u\) to root. A node is considered to be a descendant of itself, so
tree.is_descendant(u, u)
will be True for any valid node.- Parameters:
- Returns:
True if u is a descendant of v.
- Return type:
- Raises:
ValueError – If u or v are not valid node IDs.
- property num_nodes#
Returns the number of nodes in the
TreeSequence
this tree is in. Equivalent totree.tree_sequence.num_nodes
.Deprecated since version 0.4: Use
Tree.tree_sequence.num_nodes
if you want the number of nodes in the entire tree sequence, orlen(tree.preorder())
to find the number of nodes that are reachable from all roots in this tree.- Return type:
- property num_roots#
The number of roots in this tree, as defined in the
roots
attribute.Only requires O(number of roots) time.
- Return type:
- property has_single_root#
True
if this tree has a single root,False
otherwise. Equivalent to tree.num_roots == 1. This is a O(1) operation.- Return type:
- property has_multiple_roots#
True
if this tree has more than one root,False
otherwise. Equivalent to tree.num_roots > 1. This is a O(1) operation.- Return type:
- property roots#
The list of roots in this tree. A root is defined as a unique endpoint of the paths starting at samples, subject to the condition that it is connected to at least
root_threshold
samples. We can define the set of roots as follows:roots = set() for u in tree_sequence.samples(): while tree.parent(u) != tskit.NULL: u = tree.parent(u) if tree.num_samples(u) >= tree.root_threshold: roots.add(u) # roots is now the set of all roots in this tree. assert sorted(roots) == sorted(tree.roots)
The roots of the tree are returned in a list, in no particular order.
Only requires O(number of roots) time.
Note
In trees with large amounts of Missing data, for example where a region of the genome lacks any ancestral information, there can be a very large number of roots, potentially all the samples in the tree sequence.
- Returns:
The list of roots in this tree.
- Return type:
- property root#
The root of this tree. If the tree contains multiple roots, a ValueError is raised indicating that the
roots
attribute should be used instead.- Returns:
The root node.
- Return type:
- Raises:
ValueError – if this tree contains more than one root.
- is_root(u)[source]#
Returns
True
if the specified node is a root in this tree (seeroots
for the definition of a root). This is exactly equivalent to finding the node ID inroots
, but is more efficient for trees with large numbers of roots, such as in regions with extensive Missing data. Note thatFalse
is returned for all other nodes, including isolated non-sample nodes which are not found in the topology of the current tree.
- property index#
Returns the index this tree occupies in the parent tree sequence. This index is zero based, so the first tree in the sequence has index 0.
- Returns:
The index of this tree.
- Return type:
- property interval#
Returns the coordinates of the genomic interval that this tree represents the history of. The interval is returned as a tuple \((l, r)\) and is a half-open interval such that the left coordinate is inclusive and the right coordinate is exclusive. This tree therefore applies to all genomic locations \(x\) such that \(l \leq x < r\).
- Returns:
A named tuple (l, r) representing the left-most (inclusive) and right-most (exclusive) coordinates of the genomic region covered by this tree. The coordinates can be accessed by index (
0
or1
) or equivalently by name (.left
or.right
)- Return type:
- property span#
Returns the genomic distance that this tree spans. This is defined as \(r - l\), where \((l, r)\) is the genomic interval returned by
interval
.- Returns:
The genomic distance covered by this tree.
- Return type:
- property mid#
Returns the midpoint of the genomic interval that this tree represents the history of. This is defined as \((l + (r - l) / 2)\), where \((l, r)\) is the genomic interval returned by
interval
.- Returns:
The genomic distance covered by this tree.
- Return type:
- draw_text(orientation=None, *, node_labels=None, max_time=None, use_ascii=False, order=None)[source]#
Create a text representation of a tree.
- Parameters:
orientation (str) – one of
"top"
,"left"
,"bottom"
, or"right"
, specifying the margin on which the root is placed. Specifying"left"
or"right"
will lead to time being shown on the x axis (i.e. a “horizontal” tree. IfNone
(default) use the standard coalescent arrangement of a vertical tree with recent nodes at the bottom of the plot and older nodes above.node_labels (dict) – If specified, show custom labels for the nodes that are present in the map. Any nodes not specified in the map will not have a node label.
max_time (str) – If equal to
"tree"
(the default), the maximum time is set to be that of the oldest root in the tree. If equal to"ts"
the maximum time is set to be the time of the oldest root in the tree sequence; this is useful when drawing trees from the same tree sequence as it ensures that node heights are consistent.use_ascii (bool) – If
False
(default) then use unicode box drawing characters to render the tree. IfTrue
, use plain ascii characters, which look cruder but are less susceptible to misalignment or font substitution. Alternatively, if you are having alignment problems with Unicode, you can try out the solution documented here.order (str) – The left-to-right ordering of child nodes in the drawn tree. This can be either:
"minlex"
, which minimises the differences between adjacent trees (see also the"minlex_postorder"
traversal order for thenodes()
method); or"tree"
which draws trees in the left-to-right order defined by the quintuply linked tree structure. If not specified or None, this defaults to"minlex"
.
- Returns:
A text representation of a tree.
- Return type:
- draw_svg(path=None, *, size=None, time_scale=None, tree_height_scale=None, title=None, max_time=None, min_time=None, max_tree_height=None, node_labels=None, mutation_labels=None, node_titles=None, mutation_titles=None, root_svg_attributes=None, style=None, order=None, force_root_branch=None, symbol_size=None, x_axis=None, x_label=None, x_regions=None, y_axis=None, y_label=None, y_ticks=None, y_gridlines=None, all_edge_mutations=None, omit_sites=None, canvas_size=None, **kwargs)[source]#
Return an SVG representation of a single tree. By default, numeric labels are drawn beside nodes and mutations: these can be altered using the
node_labels
andmutation_labels
parameters. See the visualization tutorial for more details.- Parameters:
path (str) – The path to the file to write the output. If None, do not write to file.
size (tuple(int, int)) – A tuple of (width, height) specifying a target drawing size in abstract user units (usually interpreted as pixels on initial display). Components of the drawing will be scaled so that the total plot including labels etc. normally fits onto a canvas of this size (see
canvas_size
below). IfNone
, pick a size appropriate for a tree with a reasonably small number (i.e. tens) of samples. Default:None
time_scale (str) – Control how height values for nodes are computed. If this is equal to
"time"
(the default), node heights are proportional to their time values. If this is equal to"log_time"
, node heights are proportional to their log(time) values. If it is equal to"rank"
, node heights are spaced equally according to their ranked times.tree_height_scale (str) – Deprecated alias for time_scale. (Deprecated in 0.3.6)
title (str) – A title string to be included in the SVG output. If
None
(default) no title is shown, which gives more vertical space for the tree.max_time (str,float) – The maximum plotted time value in the current scaling system (see
time_scale
). Can be either a string or a numeric value. If equal to"tree"
(the default), the maximum time is set to be that of the oldest root in the tree. If equal to"ts"
the maximum time is set to be the time of the oldest root in the tree sequence; this is useful when drawing trees from the same tree sequence as it ensures that node heights are consistent. If a numeric value, this is used as the maximum plotted time by which to scale other nodes.min_time (str,float) – The minimum plotted time value in the current scaling system (see
time_scale
). Can be either a string or a numeric value. If equal to"tree"
(the default), the minimum time is set to be that of the youngest node in the tree. If equal to"ts"
the minimum time is set to be the time of the youngest node in the tree sequence; this is useful when drawing trees from the same tree sequence as it ensures that node heights are consistent. If a numeric value, this is used as the minimum plotted time.max_tree_height (str,float) – Deprecated alias for max_time. (Deprecated in 0.3.6)
node_labels (dict(int, str)) – If specified, show custom labels for the nodes (specified by ID) that are present in this map; any nodes not present will not have a label.
mutation_labels (dict(int, str)) – If specified, show custom labels for the mutations (specified by ID) that are present in the map; any mutations not present will not have a label.
node_titles (dict(int, str)) – If specified, add a
<title>
string to symbols for each node (specified by ID) present in this map. SVG visualizers such as web browsers will commonly display this string on mousing over the node symbol.mutation_titles (dict(int, str)) – If specified, add a
<title>
string to symbols for each mutation (specified by ID) present in this map. SVG visualizers such as web browsers will commonly display this string on mousing over the mutation symbol in the tree and (if show) on the x axis.root_svg_attributes (dict) – Additional attributes, such as an id, that will be embedded in the root
<svg>
tag of the generated drawing.style (str) – A css style string that will be included in the
<style>
tag of the generated svg.order (str) – The left-to-right ordering of child nodes in the drawn tree. This can be either:
"minlex"
, which minimises the differences between adjacent trees (see also the"minlex_postorder"
traversal order for thenodes()
method); or"tree"
which draws trees in the left-to-right order defined by the quintuply linked tree structure. If not specified or None, this defaults to"minlex"
.force_root_branch (bool) – If
True
always plot a branch (edge) above the root(s) in the tree. IfNone
(default) then only plot such root branches if there is a mutation above a root of the tree.symbol_size (float) – Change the default size of the node and mutation plotting symbols. If
None
(default) use a standard size.x_axis (bool) – Should the plot have an X axis line, showing the start and end position of this tree along the genome. If
None
(default) do not plot an X axis.x_label (str) – Place a label under the plot. If
None
(default) and there is an X axis, create and place an appropriate label.x_regions (dict) – A dictionary mapping (left, right) tuples to names. This draws a box, labelled with the name, on the X axis between the left and right positions, and can be used for annotating genomic regions (e.g. genes) on the X axis. If
None
(default) do not plot any regions.y_axis (bool) – Should the plot have an Y axis line, showing time (or ranked node time if
time_scale="rank"
). IfNone
(default) do not plot a Y axis.y_label (str) – Place a label to the left of the plot. If
None
(default) and there is a Y axis, create and place an appropriate label.y_ticks (Union[list, dict]) – A list of Y values at which to plot tickmarks, or a dictionary mapping Y values to labels (
[]
gives no tickmarks). IfNone
(default), plot one tickmark for each unique node value. Note that iftime_scale="rank"
, the Y values refer to the zero-based rank of the plotted nodes, rather than the node time itself.y_gridlines (bool) – Whether to plot horizontal lines behind the tree at each y tickmark.
all_edge_mutations (bool) – The edge on which a mutation occurs may span multiple trees. If
False
orNone
(default) mutations are only drawn on an edge if their site position exists within the genomic interval covered by this tree. IfTrue
, all mutations on each edge of the tree are drawn, even if their genomic position is to the left or right of the tree itself. Note that this means that independent drawings of different trees from the same tree sequence may share some plotted mutations.omit_sites (bool) – If True, omit sites and mutations from the drawing. Default: False
canvas_size (tuple(int, int)) – The (width, height) of the SVG canvas. This will change the SVG width and height without rescaling graphical elements, allowing extra room e.g. for unusually long labels. If
None
take the canvas size to be the same as the target drawing size (seesize
, above). Default: None
- Returns:
An SVG representation of a tree.
- Return type:
- draw(path=None, width=None, height=None, node_labels=None, node_colours=None, mutation_labels=None, mutation_colours=None, format=None, edge_colours=None, time_scale=None, tree_height_scale=None, max_time=None, min_time=None, max_tree_height=None, order=None, omit_sites=None)[source]#
Returns a drawing of this tree.
When working in a Jupyter notebook, use the
IPython.display.SVG
function to display the SVG output from this function inline in the notebook:>>> SVG(tree.draw())
The unicode format uses unicode box drawing characters to render the tree. This allows rendered trees to be printed out to the terminal:
>>> print(tree.draw(format="unicode")) 6 ┏━┻━┓ ┃ 5 ┃ ┏━┻┓ ┃ ┃ 4 ┃ ┃ ┏┻┓ 3 0 1 2
The
node_labels
argument allows the user to specify custom labels for nodes, or no labels at all:>>> print(tree.draw(format="unicode", node_labels={})) ┃ ┏━┻━┓ ┃ ┃ ┃ ┏━┻┓ ┃ ┃ ┃ ┃ ┃ ┏┻┓ ┃ ┃ ┃ ┃
Note: in some environments such as Jupyter notebooks with Windows or Mac, users have observed that the Unicode box drawings can be misaligned. In these cases, we recommend using the SVG or ASCII display formats instead. If you have a strong preference for aligned Unicode, you can try out the solution documented here.
- Parameters:
path (str) – The path to the file to write the output. If None, do not write to file.
width (int) – The width of the image in pixels. If not specified, either defaults to the minimum size required to depict the tree (text formats) or 200 pixels.
height (int) – The height of the image in pixels. If not specified, either defaults to the minimum size required to depict the tree (text formats) or 200 pixels.
node_labels (dict) – If specified, show custom labels for the nodes that are present in the map. Any nodes not specified in the map will not have a node label.
node_colours (dict) – If specified, show custom colours for the nodes given in the map. Any nodes not specified in the map will take the default colour; a value of
None
is treated as transparent and hence the node symbol is not plotted. (Only supported in the SVG format.)mutation_labels (dict) – If specified, show custom labels for the mutations (specified by ID) that are present in the map. Any mutations not in the map will not have a label. (Showing mutations is currently only supported in the SVG format)
mutation_colours (dict) – If specified, show custom colours for the mutations given in the map (specified by ID). As for
node_colours
, mutations not present in the map take the default colour, and those mapping toNone
are not drawn. (Only supported in the SVG format.)format (str) – The format of the returned image. Currently supported are ‘svg’, ‘ascii’ and ‘unicode’. Note that the
Tree.draw_svg()
method provides more comprehensive functionality for creating SVGs.edge_colours (dict) – If specified, show custom colours for the edge joining each node in the map to its parent. As for
node_colours
, unspecified edges take the default colour, andNone
values result in the edge being omitted. (Only supported in the SVG format.)time_scale (str) – Control how height values for nodes are computed. If this is equal to
"time"
, node heights are proportional to their time values. If this is equal to"log_time"
, node heights are proportional to their log(time) values. If it is equal to"rank"
, node heights are spaced equally according to their ranked times. For SVG output the default is ‘time’-scale whereas for text output the default is ‘rank’-scale. Time scaling is not currently supported for text output.tree_height_scale (str) – Deprecated alias for time_scale. (Deprecated in 0.3.6)
max_time (str,float) – The maximum time value in the current scaling system (see
time_scale
). Can be either a string or a numeric value. If equal to"tree"
, the maximum time is set to be that of the oldest root in the tree. If equal to"ts"
the maximum time is set to be the time of the oldest root in the tree sequence; this is useful when drawing trees from the same tree sequence as it ensures that node heights are consistent. If a numeric value, this is used as the maximum time by which to scale other nodes. This parameter is not currently supported for text output.min_time (str,float) – The minimum time value in the current scaling system (see
time_scale
). Can be either a string or a numeric value. If equal to"tree"
, the minimum time is set to be that of the youngest node in the tree. If equal to"ts"
the minimum time is set to be the time of the youngest node in the tree sequence; this is useful when drawing trees from the same tree sequence as it ensures that node heights are consistent. If a numeric value, this is used as the minimum time to display. This parameter is not currently supported for text output.max_tree_height (str) – Deprecated alias for max_time. (Deprecated in 0.3.6)
order (str) – The left-to-right ordering of child nodes in the drawn tree. This can be either:
"minlex"
, which minimises the differences between adjacent trees (see also the"minlex_postorder"
traversal order for thenodes()
method); or"tree"
which draws trees in the left-to-right order defined by the quintuply linked tree structure. If not specified or None, this defaults to"minlex"
.omit_sites (bool) – If True, omit sites and mutations from the drawing (only relevant to the SVG format). Default: False
- Returns:
A representation of this tree in the requested format.
- Return type:
- property num_mutations#
Returns the total number of mutations across all sites on this tree.
- Returns:
The total number of mutations over all sites on this tree.
- Return type:
- property num_sites#
Returns the number of sites on this tree.
- Returns:
The number of sites on this tree.
- Return type:
- sites()[source]#
Returns an iterator over all the sites in this tree. Sites are returned in order of increasing ID (and also position). See the
Site
class for details on the available fields for each site.- Returns:
An iterator over all sites in this tree.
- mutations()[source]#
Returns an iterator over all the mutations in this tree. Mutations are returned in their order in the mutations table, that is, by nondecreasing site ID, and within a site, by decreasing mutation time with parent mutations before their children. See the
Mutation
class for details on the available fields for each mutation.The returned iterator is equivalent to iterating over all sites and all mutations in each site, i.e.:
>>> for site in tree.sites(): >>> for mutation in site.mutations: >>> yield mutation
- leaves(u=None)[source]#
Returns an iterator over all the leaves in this tree that descend from the specified node. If \(u\) is not specified, return all leaves on the tree (i.e. all leaves reachable from the tree root(s), see note below).
Note
\(u\) can be any node in the entire tree sequence, including ones which are not connected via branches to a root node of the tree. If called on such a node, the iterator will return “dead” leaves (see Dead leaves and branches) which cannot be reached from a root of this tree. However, dead leaves will never be returned if \(u\) is left unspecified.
- Parameters:
u (int) – The node of interest.
- Returns:
An iterator over all leaves in the subtree rooted at u.
- Return type:
- samples(u=None)[source]#
Returns an iterator over the numerical IDs of all the sample nodes in this tree that are underneath the node with ID
u
. Ifu
is a sample, it is included in the returned iterator. Ifu
is not a sample, it is possible for the returned iterator to be empty, for example ifu
is anisolated
node that is not part of the the current topology. If u is not specified, return all sample node IDs in the tree (equivalent to all the sample node IDs in the tree sequence).If the
TreeSequence.trees()
method is called withsample_lists=True
, this method uses an efficient algorithm to find the sample nodes. If not, a simple traversal based method is used.Note
The iterator is not guaranteed to return the sample node IDs in numerical or any other particular order.
- Parameters:
u (int) – The node of interest.
- Returns:
An iterator over all sample node IDs in the subtree rooted at u.
- Return type:
- num_children(u)[source]#
Returns the number of children of the specified node (i.e.,
len(tree.children(u))
)
- num_samples(u=None)[source]#
Returns the number of sample nodes in this tree underneath the specified node (including the node itself). If u is not specified return the total number of samples in the tree.
This is a constant time operation.
- num_tracked_samples(u=None)[source]#
Returns the number of samples in the set specified in the
tracked_samples
parameter of theTreeSequence.trees()
method underneath the specified node. If the input node is not specified, return the total number of tracked samples in the tree.This is a constant time operation.
- preorder(u=-1)[source]#
Returns a numpy array of node ids in preorder. If the node u is specified the traversal is rooted at this node (and it will be the first element in the returned array). Otherwise, all nodes reachable from the tree roots will be returned. See Tree traversals for examples.
- Parameters:
u (int) – If specified, return all nodes in the subtree rooted at u (including u) in traversal order.
- Returns:
Array of node ids
- Return type:
numpy.ndarray (dtype=np.int32)
- postorder(u=-1)[source]#
Returns a numpy array of node ids in postorder. If the node u is specified the traversal is rooted at this node (and it will be the last element in the returned array). Otherwise, all nodes reachable from the tree roots will be returned. See Tree traversals for examples.
- Parameters:
u (int) – If specified, return all nodes in the subtree rooted at u (including u) in traversal order.
- Returns:
Array of node ids
- Return type:
numpy.ndarray (dtype=np.int32)
- timeasc(u=-1)[source]#
Returns a numpy array of node ids. Starting at u, returns the reachable descendant nodes in order of increasing time (most recent first), falling back to increasing ID if times are equal. Also see Tree traversals for examples of how to use traversals.
- Parameters:
u (int) – If specified, return all nodes in the subtree rooted at u (including u) in traversal order.
- Returns:
Array of node ids
- Return type:
numpy.ndarray (dtype=np.int32)
- timedesc(u=-1)[source]#
Returns a numpy array of node ids. Starting at u, returns the reachable descendant nodes in order of decreasing time (least recent first), falling back to decreasing ID if times are equal. Also see Tree traversals for examples of how to use traversals.
- Parameters:
u (int) – If specified, return all nodes in the subtree rooted at u (including u) in traversal order.
- Returns:
Array of node ids
- Return type:
numpy.ndarray (dtype=np.int32)
- nodes(root=None, order='preorder')[source]#
Returns an iterator over the node IDs reachable from the specified node in this tree in the specified traversal order.
Note
Unlike the
TreeSequence.nodes()
method, this iterator produces integer node IDs, notNode
objects.If the
root
parameter is not provided orNone
, iterate over all nodes reachable from the roots (seeTree.roots
for details on which nodes are considered roots). If theroot
parameter is provided, only the nodes in the subtree rooted at this node (including the specified node) will be iterated over. If thevirtual_root
is specified as the traversal root, it will be included in the traversed nodes in the appropriate position for the given ordering. (See the tree roots section for more information on the virtual root.)The
order
parameter defines the order in which tree nodes are visited in the iteration (also see the Tree traversals section in the tutorials). The available orders are:‘preorder’: starting at root, yield the current node, then recurse and do a preorder on each child of the current node. See also Wikipedia.
‘inorder’: starting at root, assuming binary trees, recurse and do an inorder on the first child, then yield the current node, then recurse and do an inorder on the second child. In the case of
n
child nodes (not necessarily 2), the firstn // 2
children are visited in the first stage, and the remainingn - n // 2
children are visited in the second stage. See also Wikipedia.‘postorder’: starting at root, recurse and do a postorder on each child of the current node, then yield the current node. See also Wikipedia.
‘levelorder’ (‘breadthfirst’): visit the nodes under root (including the root) in increasing order of their depth from root. See also Wikipedia.
‘timeasc’: visits the nodes in order of increasing time, falling back to increasing ID if times are equal.
‘timedesc’: visits the nodes in order of decreasing time, falling back to decreasing ID if times are equal.
‘minlex_postorder’: a usual postorder has ambiguity in the order in which children of a node are visited. We constrain this by outputting a postorder such that the leaves visited, when their IDs are listed out, have minimum lexicographic order out of all valid traversals. This traversal is useful for drawing multiple trees of a
TreeSequence
, as it leads to more consistency between adjacent trees. Note that internal non-leaf nodes are not counted in assessing the lexicographic order.
- Parameters:
- Returns:
An iterator over the node IDs in the tree in some traversal order.
- Return type:
- as_newick(*, root=None, precision=None, node_labels=None, include_branch_lengths=None)[source]#
Returns a newick encoding of this tree. For example, a binary tree with 3 leaves generated by
Tree.generate_balanced(3)
encodes as:(n0:2,(n1:1,n2:1):1);
By default sample nodes are labelled using the form
f"n{node_id}"
, i.e. the sample node’s ID prefixed with the string"n"
. Node labels can be specified explicitly using thenode_labels
argument, which is a mapping from integer node IDs to the corresponding string label. If a node is not present in the mapping, no label is associated with the node in output.Warning
Node labels are not Newick escaped, so care must be taken to provide labels that will not break the encoding.
Note
Specifying a
node_labels
dictionary or settinginclude_branch_lengths=False
results in a less efficient method being used to generate the newick output. The performance difference can be substantial for large trees.By default, branch lengths are printed out with sufficient precision for them to be recovered exactly in double precision (although note that this does not necessarily mean that we can precisely recover the corresponding node times, since branch lengths are obtained by subtraction). If all times on the tree sequence are discrete, then branch lengths are printed as integers. Otherwise, branch lengths are printed with 17 digits of precision (i.e.,
"%.17f"
in printf-notation).The precision for branch lengths can be specified using the
precision
argument. Branch lengths can be omitted entirely by settinginclude_branch_lengths=False
.If the
root
argument is specified, we return the newick encoding of the specified subtree, otherwise the full tree is returned. If the tree has multiple roots and a root node is not explicitly specified, we raise aValueError
. This is because most libraries and downstream software consider a newick string that contains multiple disconnected subtrees an error, and it is therefore best to consider how such topologies should be interchanged on a case-by-base basis. A list of the newick strings for each root can be obtained by[tree.as_newick(root=root) for root in tree.roots]
.- Parameters:
precision (int) – The numerical precision with which branch lengths are printed. If not specified or None default to 0 if the tree sequence contains only integer node times, or 17 otherwise.
root (int) – If specified, return the tree rooted at this node.
node_labels (dict) – If specified, show custom labels for the nodes that are present in the map. Any nodes not specified in the map will not have a node label.
include_branch_lengths – If True (default), output branch lengths in the Newick string. If False, only output the topology, without branch lengths.
- Returns:
A newick representation of this tree.
- Return type:
- newick(precision=14, *, root=None, node_labels=None, include_branch_lengths=True)[source]#
Warning
This method is deprecated and may be removed in future versions of tskit. Please use the
as_newick()
method in new code.This method is a deprecated version of the
as_newick()
method. Functionality is equivalent, except for the default node labels.By default, leaf nodes are labelled with their numerical ID + 1, and internal nodes are not labelled. This default strategy was originally used to mimic the output of the
ms
simulator. However, the choice of labelling leaf nodes rather than samples is problematic, and this behaviour is only retained to avoid breaking existing code which may rely on it.Other parameters behave as documented in the
as_newick()
method.- Parameters:
precision (int) – The numerical precision with which branch lengths are printed. Defaults to 14.
root (int) – If specified, return the tree rooted at this node.
node_labels (dict) – If specified, show custom labels for the nodes that are present in the map. Any nodes not specified in the map will not have a node label.
include_branch_lengths – If True (default), output branch lengths in the Newick string. If False, only output the topology, without branch lengths.
- Returns:
A newick representation of this tree.
- Return type:
- as_dict_of_dicts()[source]#
Convert tree to dict of dicts for conversion to a networkx graph.
For example:
>>> import networkx as nx >>> nx.DiGraph(tree.as_dict_of_dicts()) >>> # undirected graphs work as well >>> nx.Graph(tree.as_dict_of_dicts())
- Returns:
Dictionary of dictionaries of dictionaries where the first key is the source, the second key is the target of an edge, and the third key is an edge annotation. At this point the only annotation is “branch_length”, the length of the branch (in units of time).
- _repr_html_()[source]#
Return an html summary of a tree in a tree sequence. Called by jupyter notebooks to render trees
- map_mutations(genotypes, alleles, ancestral_state=None)[source]#
Given observations for the samples in this tree described by the specified set of genotypes and alleles, return a parsimonious set of state transitions explaining these observations. The genotypes array is interpreted as indexes into the alleles list in the same manner as described in the
TreeSequence.variants()
method. Thus, if samplej
carries the allele at indexk
, then we havegenotypes[j] = k
. Missing observations can be specified for a sample using the valuetskit.MISSING_DATA
(-1), in which case the state at this sample does not influence the ancestral state or the position of mutations returned. At least one non-missing observation must be provided. A maximum of 64 alleles are supported.The current implementation uses the Hartigan parsimony algorithm to determine the minimum number of state transitions required to explain the data. In this model, transitions between any of the non-missing states is equally likely.
The returned values correspond directly to the data model for describing variation at sites using mutations. See the Site Table and Mutation Table definitions for details and background.
The state reconstruction is returned as two-tuple,
(ancestral_state, mutations)
, whereancestral_state
is the allele assigned to the tree root(s) andmutations
is a list ofMutation
objects, ordered as required in a mutation table. For each mutation,derived_state
is the new state after this mutation andnode
is the tree node immediately beneath the mutation (if there are unary nodes between two branch points, hence multiple nodes above which the mutation could be parsimoniously placed, the oldest node is used). Theparent
property contains the index in the returned list of the previous mutation on the path to root, ortskit.NULL
if there are no previous mutations (see the Mutation Table for more information on the concept of mutation parents). All other attributes of theMutation
object are undefined and should not be used.Note
Sample states observed as missing in the input
genotypes
need not correspond to samples whose nodes are actually “missing” (i.e., isolated) in the tree. In this case, mapping the mutations returned by this method onto the tree will result in these missing observations being imputed to the most parsimonious state.Because the
parent
in the returned list of mutations refers to the index in that list, if you are adding mutations to an existing tree sequence, you will need to maintain a map of list IDs to the newly added mutations, for instance:last_tree = ts.last() anc_state, parsimonious_muts = last_tree.map_mutations([0, 1, 0], ("A", "T")) # Edit the tree sequence, see the "Tables and Editing" tutorial tables = ts.dump_tables() # add a new site at the end of ts, assumes there isn't one there already site_id = tables.sites.add_row(ts.sequence_length - 1, anc_state) mut_id_map = {tskit.NULL: tskit.NULL} # don't change if parent id is -1 for list_id, mutation in enumerate(parsimonious_muts): mut_id_map[list_id] = tables.mutations.append( mutation.replace(site=site_id, parent=mut_id_map[mutation.parent])) tables.sort() # Redundant here, but needed if the site is not the last one new_ts = tables.tree_sequence()
See the Parsimony section in the tutorial for further examples of how to use this method.
- Parameters:
genotypes (array_like) – The input observations for the samples in this tree.
alleles (tuple(str)) – The alleles for the specified
genotypes
. Each positive value in thegenotypes
array is treated as an index into this list of alleles.ancestral_state (Union[int, str]) – A fixed ancestral state, specified either as a non-negative integer less than the number of alleles, or a string which must be one of the
alleles
provided above. IfNone
(default) then an ancestral state is chosen arbitrarily from among those that provide the most parsimonious placement of mutations. Note that if the ancestral state is specified, the placement of mutations may not be as parsimonious as that which could be achieved by leaving the ancestral state unspecified; additionally it may lead to mutations being placed above the root node(s) of the tree (for example if all the samples have a genotype of 1 but the ancestral state is fixed to be 0).
- Returns:
The inferred ancestral state and list of mutations on this tree that encode the specified observations.
- Return type:
(str, list(tskit.Mutation))
- kc_distance(other, lambda_=0.0)[source]#
Returns the Kendall-Colijn distance between the specified pair of trees. The
lambda_
parameter determines the relative weight of topology vs branch lengths in calculating the distance. Iflambda_
is 0 (the default) we only consider topology, and if it is 1 we only consider branch lengths. See Kendall & Colijn (2016) for details.The trees we are comparing to must have identical lists of sample nodes (i.e., the same IDs in the same order). The metric operates on samples, not leaves, so internal samples are treated identically to sample tips. Subtrees with no samples do not contribute to the metric.
- rf_distance(other)[source]#
Returns the (unweighted) Robinson-Foulds distance between the specified pair of trees, where corresponding samples between the two trees are identified by node ID. The Robinson-Foulds distance (also known as the symmetric difference) is defined as the number of bipartitions that are present in one tree but not the other (see Robinson & Foulds (1981)). This method returns the unnormalised RF distance: if the trees are strictly bifurcating, i.e. binary, the value can be normalised by dividing by the maximum, which is $2n-4$ for two rooted trees of $n$ samples (however, if the trees contain polytomies, the maximum RF distance is less easily defined).
Note
The RF distance can be sensitive to small changes in topology: in some cases, changing the position of a single leaf can result in the maximum RF distance. Therefore even if adjacent trees in a tree sequence differ by a single subtree-prune-and-regraft operation, the RF distance between them can be large.
- Parameters:
other (Tree) – The other tree to compare to. Trees are treated as rooted.
- Returns:
The unweighted Robinson-Foulds distance between this tree and
other
.- Return type:
- Raises:
ValueError – If either tree has multiple roots, or the trees have different sample nodes.
- path_length(u, v)[source]#
Returns the number of edges on the path in this tree between the two nodes. If the two nodes have a most recent common ancestor, then this is defined as
tree.depth(u) + tree.depth(v) - 2 * tree.depth(tree.mrca(u, v))
. If the nodes do not have an MRCA (i.e., they are in disconnected subtrees) the path length is infinity.Note
This counts the number of “hops” between two nodes. To find the branch length distance between them, in units of time (i.e. the sum of edge lengths that separate two nodes) use the
distance_between()
method instead.See also
See also the
depth()
method
- distance_between(u, v)[source]#
Returns the total distance between two nodes in the tree, expressed as the sum of “branch lengths” from both nodes to their most recent common ancestor.
- b1_index()[source]#
Returns the B1 balance index for this tree. This is defined as the inverse of the sum of all longest paths to leaves for each node besides roots.
See also
See Shao and Sokal (1990) for details.
- Returns:
The B1 balance index.
- Return type:
- b2_index(base=10)[source]#
Returns the B2 balance index this tree. This is defined as the Shannon entropy of the probability distribution to reach leaves assuming a random walk from a root. The default base is 10, following Shao and Sokal (1990).
See also
See Shao and Sokal (1990) for details.
- colless_index()[source]#
Returns the Colless imbalance index for this tree. This is defined as the sum of all differences between number of leaves subtended by the left and right child of each node. The Colless index is undefined for non-binary trees and trees with multiple roots. This method will raise a LibraryError if the tree is not singly-rooted and binary.
See also
See Shao and Sokal (1990) for details.
- Returns:
The Colless imbalance index.
- Return type:
- sackin_index()[source]#
Returns the Sackin imbalance index for this tree. This is defined as the sum of the depths of all leaves in the tree. Equivalent to
sum(tree.depth(u) for u in tree.leaves())
See also
See Shao and Sokal (1990) for details.
- Returns:
The Sackin imbalance index.
- Return type:
- num_lineages(t)[source]#
Returns the number of lineages present in this tree at time
t
. This is defined as the number of branches in this tree (reachable from the samples) that intersect witht
. Thus,tree.num_lineages(t)
is equal to 0 for anyt
greater than or equal to the time of the root in a singly-rooted tree.Note
Note that this definition means that if a (non root) node with three children has time
t
, then it will count as one lineage, not three.
- split_polytomies(*, epsilon=None, method=None, record_provenance=True, random_seed=None, **kwargs)[source]#
Return a new
Tree
where extra nodes and edges have been inserted so that any any nodeu
with greater than 2 children — a multifurcation or “polytomy” — is resolved into successive bifurcations. New nodes are inserted at times fractionally less than than the time of nodeu
. Times are allocated to different levels of the tree, such that any newly inserted sibling nodes will have the same time.By default, the times of the newly generated children of a particular node are the minimum representable distance in floating point arithmetic from their parents (using the nextafter function). Thus, the generated branches have the shortest possible nonzero length. A fixed branch length between inserted nodes and their parents can also be specified by using the
epsilon
parameter.Note
A tree sequence requires that parents be older than children and that mutations are younger than the parent of the edge on which they lie. If a fixed
epsilon
is specifed and is not small enough compared to the distance between a polytomy and its oldest child (or oldest child mutation) these requirements may not be met. In this case an error will be raised.If the
method
is"random"
(currently the only option, and the default when no method is specified), then for a node with \(n\) children, the \((2n - 3)! / (2^(n - 2) (n - 2!))\) possible binary trees with equal probability.The returned
Tree
will have the same genomic span as this tree, and node IDs will be conserved (that is, nodeu
in this tree will be the same node in the returned tree). The returned tree is derived from a tree sequence that contains only one non-degenerate tree, that is, where edges cover only the interval spanned by this tree.- Parameters:
epsilon – If specified, the fixed branch length between inserted nodes and their parents. If None (the default), the minimal possible nonzero branch length is generated for each node.
method (str) – The method used to break polytomies. Currently only “random” is supported, which can also be specified by
method=None
(Default:None
).record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
random_seed (int) – The random seed. If this is None, a random seed will be automatically generated. Valid random seeds must be between 1 and \(2^32 − 1\).
**kwargs – Further arguments used as parameters when constructing the returned
Tree
. For exampletree.split_polytomies(sample_lists=True)
will return aTree
created withsample_lists=True
.
- Returns:
A new tree with polytomies split into random bifurcations.
- Return type:
- static generate_star(num_leaves, *, span=1, branch_length=1, record_provenance=True, **kwargs)[source]#
Generate a
Tree
whose leaf nodes all have the same parent (i.e., a “star” tree). The leaf nodes are all at time 0 and are marked as sample nodes.The tree produced by this method is identical to
tskit.Tree.unrank(n, (0, 0))
, but generated more efficiently for largen
.- Parameters:
num_leaves (int) – The number of leaf nodes in the returned tree (must be 2 or greater).
span (float) – The span of the tree, and therefore the
sequence_length
of thetree_sequence
property of the returnedTree
.branch_length (float) – The length of every branch in the tree (equivalent to the time of the root node).
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
**kwargs – Further arguments used as parameters when constructing the returned
Tree
. For exampletskit.Tree.generate_star(sample_lists=True)
will return aTree
created withsample_lists=True
.
- Returns:
A star-shaped tree. Its corresponding
TreeSequence
is available via thetree_sequence
attribute.- Return type:
- static generate_balanced(num_leaves, *, arity=2, span=1, branch_length=1, record_provenance=True, **kwargs)[source]#
Generate a
Tree
with the specified number of leaves that is maximally balanced. By default, the tree returned is binary, such that for each node that subtends \(n\) leaves, the left child will subtend \(\lfloor{n / 2}\rfloor\) leaves and the right child the remainder. Balanced trees with higher arity can also generated using thearity
parameter, where the leaves subtending a node are distributed among its children analogously.In the returned tree, the leaf nodes are all at time 0, marked as samples, and labelled 0 to n from left-to-right. Internal node IDs are assigned sequentially from n in a postorder traversal, and the time of an internal node is the maximum time of its children plus the specified
branch_length
.- Parameters:
num_leaves (int) – The number of leaf nodes in the returned tree (must be be 2 or greater).
arity (int) – The maximum number of children a node can have in the returned tree.
span (float) – The span of the tree, and therefore the
sequence_length
of thetree_sequence
property of the returnedTree
.branch_length (float) – The minimum length of a branch in the tree (see above for details on how internal node times are assigned).
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
**kwargs – Further arguments used as parameters when constructing the returned
Tree
. For exampletskit.Tree.generate_balanced(sample_lists=True)
will return aTree
created withsample_lists=True
.
- Returns:
A balanced tree. Its corresponding
TreeSequence
is available via thetree_sequence
attribute.- Return type:
- static generate_comb(num_leaves, *, span=1, branch_length=1, record_provenance=True, **kwargs)[source]#
Generate a
Tree
in which all internal nodes have two children and the left child is a leaf. This is a “comb”, “ladder” or “pectinate” phylogeny, and also known as a caterpillar tree.The leaf nodes are all at time 0, marked as samples, and labelled 0 to n from left-to-right. Internal node IDs are assigned sequentially from n as we ascend the tree, and the time of an internal node is the maximum time of its children plus the specified
branch_length
.- Parameters:
num_leaves (int) – The number of leaf nodes in the returned tree (must be 2 or greater).
span (float) – The span of the tree, and therefore the
sequence_length
of thetree_sequence
property of the returnedTree
.branch_length (float) – The branch length between each internal node; the root node is therefore placed at time
branch_length * (num_leaves - 1)
.record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
**kwargs – Further arguments used as parameters when constructing the returned
Tree
. For exampletskit.Tree.generate_comb(sample_lists=True)
will return aTree
created withsample_lists=True
.
- Returns:
A comb-shaped bifurcating tree. Its corresponding
TreeSequence
is available via thetree_sequence
attribute.- Return type:
- static generate_random_binary(num_leaves, *, span=1, branch_length=1, random_seed=None, record_provenance=True, **kwargs)[source]#
Generate a random binary
Tree
with \(n\) =num_leaves
leaves with an equal probability of returning any topology and leaf label permutation among the \((2n - 3)! / (2^{n - 2} (n - 2)!)\) leaf-labelled binary trees.The leaf nodes are marked as samples, labelled 0 to n, and placed at time 0. Internal node IDs are assigned sequentially from n as we ascend the tree, and the time of an internal node is the maximum time of its children plus the specified
branch_length
.Note
The returned tree has not been created under any explicit model of evolution. In order to simulate such trees, additional software such as msprime <https://github.com/tskit-dev/msprime>` is required.
- Parameters:
num_leaves (int) – The number of leaf nodes in the returned tree (must be 2 or greater).
span (float) – The span of the tree, and therefore the
sequence_length
of thetree_sequence
property of the returnedTree
.branch_length (float) – The minimum time between parent and child nodes.
random_seed (int) – The random seed. If this is None, a random seed will be automatically generated. Valid random seeds must be between 1 and \(2^32 − 1\).
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
**kwargs – Further arguments used as parameters when constructing the returned
Tree
. For exampletskit.Tree.generate_comb(sample_lists=True)
will return aTree
created withsample_lists=True
.
- Returns:
A random binary tree. Its corresponding
TreeSequence
is available via thetree_sequence
attribute.- Return type:
The TreeSequence
class#
Also see the TreeSequence API summary.
- class tskit.TreeSequence[source]#
A single tree sequence, as defined by the data model. A TreeSequence instance can be created from a set of tables using
TableCollection.tree_sequence()
, or loaded from a set of text files usingtskit.load_text()
, or loaded from a native binary file usingtskit.load()
.TreeSequences are immutable. To change the data held in a particular tree sequence, first get the table information as a
TableCollection
instance (usingdump_tables()
), edit those tables using the tables api, and create a new tree sequence usingTableCollection.tree_sequence()
.The
trees()
method iterates over all trees in a tree sequence, and thevariants()
method iterates over all sites and their genotypes.- equals(other, *, ignore_metadata=False, ignore_ts_metadata=False, ignore_provenance=False, ignore_timestamps=False, ignore_tables=False, ignore_reference_sequence=False)[source]#
Returns True if self and other are equal. Uses the underlying table equality, see
TableCollection.equals()
for details and options.
- aslist(**kwargs)[source]#
Returns the trees in this tree sequence as a list. Each tree is represented by a different instance of
Tree
. As such, this method is inefficient and may use a large amount of memory, and should not be used when performance is a consideration. Thetrees()
method is the recommended way to efficiently iterate over the trees in a tree sequence.
- dump(file_or_path, zlib_compression=False)[source]#
Writes the tree sequence to the specified path or file object.
- property reference_sequence#
The
ReferenceSequence
associated with thisTreeSequence
if one is defined (seeTreeSequence.has_reference_sequence()
), or None otherwise.
- has_reference_sequence()[source]#
Returns True if this
TreeSequence
has an associated reference sequence.
- property tables_dict#
Returns a dictionary mapping names to tables in the underlying
TableCollection
. Equivalent to callingts.tables.table_name_map
.
- property tables#
Returns the
tables
underlying this tree sequence, intended for read-only access. Seedump_tables()
if you wish to modify the tables.Warning
This property currently returns a copy of the tables underlying a tree sequence but it may return a read-only view in the future. Thus, if the tables will subsequently be updated, please use the
dump_tables()
method instead as this will always return a new copy of the TableCollection.- Returns:
A
TableCollection
containing all a copy of the tables underlying this tree sequence.- Return type:
- property nbytes#
Returns the total number of bytes required to store the data in this tree sequence. Note that this may not be equal to the actual memory footprint.
- dump_tables()[source]#
Returns a modifiable copy of the
tables
defining this tree sequence.- Returns:
A
TableCollection
containing all tables underlying the tree sequence.- Return type:
- dump_text(nodes=None, edges=None, sites=None, mutations=None, individuals=None, populations=None, migrations=None, provenances=None, precision=6, encoding='utf8', base64_metadata=True)[source]#
Writes a text representation of the tables underlying the tree sequence to the specified connections.
If Base64 encoding is not used, then metadata will be saved directly, possibly resulting in errors reading the tables back in if metadata includes whitespace.
- Parameters:
nodes (io.TextIOBase) – The file-like object (having a .write() method) to write the NodeTable to.
edges (io.TextIOBase) – The file-like object to write the EdgeTable to.
sites (io.TextIOBase) – The file-like object to write the SiteTable to.
mutations (io.TextIOBase) – The file-like object to write the MutationTable to.
individuals (io.TextIOBase) – The file-like object to write the IndividualTable to.
populations (io.TextIOBase) – The file-like object to write the PopulationTable to.
migrations (io.TextIOBase) – The file-like object to write the MigrationTable to.
provenances (io.TextIOBase) – The file-like object to write the ProvenanceTable to.
precision (int) – The number of digits of precision.
encoding (str) – Encoding used for text representation.
base64_metadata (bool) – Only used if a schema is not present on each table being dumped. If True, metadata is encoded using Base64 encoding; otherwise, as plain text.
- _repr_html_()[source]#
Return an html summary of a tree sequence. Called by jupyter notebooks to render a TreeSequence.
- property num_samples#
Returns the number of sample nodes in this tree sequence. This is also the number of sample nodes in each tree.
- Returns:
The number of sample nodes in this tree sequence.
- Return type:
- property table_metadata_schemas#
The set of metadata schemas for the tables in this tree sequence.
- property discrete_genome#
Returns True if all genome coordinates in this TreeSequence are discrete integer values. This is true iff all the following are true:
The sequence length is discrete
All site positions are discrete
All left and right edge coordinates are discrete
All migration left and right coordinates are discrete
- Returns:
True if this TreeSequence uses discrete genome coordinates.
- Return type:
- property discrete_time#
Returns True if all time coordinates in this TreeSequence are discrete integer values. This is true iff all the following are true:
All node times are discrete
All mutation times are discrete
All migration times are discrete
Note that
tskit.UNKNOWN_TIME
counts as discrete.- Returns:
True if this TreeSequence uses discrete time coordinates.
- Return type:
- property min_time#
Returns the min time in this tree sequence. This is the minimum of the node times and mutation times.
Note that mutation times with the value
tskit.UNKNOWN_TIME
are ignored.- Returns:
The min time of the nodes and mutations in this tree sequence.
- Return type:
- property max_time#
Returns the max time in this tree sequence. This is the maximum of the node times and mutation times.
Note that mutation times with the value
tskit.UNKNOWN_TIME
are ignored.- Returns:
The max time of the nodes and mutations in this tree sequence.
- Return type:
- property sequence_length#
Returns the sequence length in this tree sequence. This defines the genomic scale over which tree coordinates are defined. Given a tree sequence with a sequence length \(L\), the constituent trees will be defined over the half-closed interval \([0, L)\). Each tree then covers some subset of this interval — see
tskit.Tree.interval
for details.- Returns:
The length of the sequence in this tree sequence in bases.
- Return type:
- property metadata#
The decoded metadata for this TreeSequence.
- property metadata_schema#
The
tskit.MetadataSchema
for this TreeSequence.
- property time_units#
String describing the units of the time dimension for this TreeSequence.
- property num_edges#
Returns the number of edges in this tree sequence.
- Returns:
The number of edges in this tree sequence.
- Return type:
- property num_trees#
Returns the number of distinct trees in this tree sequence. This is equal to the number of trees returned by the
trees()
method.- Returns:
The number of trees in this tree sequence.
- Return type:
- property num_sites#
Returns the number of sites in this tree sequence.
- Returns:
The number of sites in this tree sequence.
- Return type:
- property num_mutations#
Returns the number of mutations in this tree sequence.
- Returns:
The number of mutations in this tree sequence.
- Return type:
- property num_individuals#
Returns the number of individuals in this tree sequence.
- Returns:
The number of individuals in this tree sequence.
- Return type:
- property num_nodes#
Returns the number of nodes in this tree sequence.
- Returns:
The number of nodes in this tree sequence.
- Return type:
- property num_provenances#
Returns the number of provenances in this tree sequence.
- Returns:
The number of provenances in this tree sequence.
- Return type:
- property num_populations#
Returns the number of populations in this tree sequence.
- Returns:
The number of populations in this tree sequence.
- Return type:
- property num_migrations#
Returns the number of migrations in this tree sequence.
- Returns:
The number of migrations in this tree sequence.
- Return type:
- property max_root_time#
Returns the time of the oldest root in any of the trees in this tree sequence. This is usually equal to
np.max(ts.tables.nodes.time)
but may not be since there can be non-sample nodes that are not present in any tree. Note that isolated samples are also defined as roots (so there can be a max_root_time even in a tree sequence with no edges).- Returns:
The maximum time of a root in this tree sequence.
- Return type:
- Raises:
ValueError – If there are no samples in the tree, and hence no roots (as roots are defined by the ends of the upward paths from the set of samples).
- migrations()[source]#
Returns an iterable sequence of all the migrations in this tree sequence.
Migrations are returned in nondecreasing order of the
time
value.- Returns:
An iterable sequence of all migrations.
- Return type:
Sequence(
Migration
)
- individuals()[source]#
Returns an iterable sequence of all the individuals in this tree sequence.
- Returns:
An iterable sequence of all individuals.
- Return type:
Sequence(
Individual
)
- nodes(*, order=None)[source]#
Returns an iterable sequence of all the nodes in this tree sequence.
Note
Although node ids are commonly ordered by node time, this is not a formal tree sequence requirement. If you wish to iterate over nodes in time order, you should therefore use
order="timeasc"
(and wrap the resulting sequence in the standard Pythonreversed()
function if you wish to iterate over older nodes before younger ones)- Parameters:
order (str) – The order in which the nodes should be returned: must be one of “id” (default) or “timeasc” (ascending order of time, then by ascending node id, matching the first two ordering requirements of parent nodes in a
sorted
edge table).- Returns:
An iterable sequence of all nodes.
- Return type:
Sequence(
Node
)
- edges()[source]#
Returns an iterable sequence of all the edges in this tree sequence. Edges are returned in the order required for a valid tree sequence. So, edges are guaranteed to be ordered such that (a) all parents with a given ID are contiguous; (b) edges are returned in non-decreasing order of parent time ago; (c) within the edges for a given parent, edges are sorted first by child ID and then by left coordinate.
- Returns:
An iterable sequence of all edges.
- Return type:
Sequence(
Edge
)
- edge_diffs(include_terminal=False, *, direction=1)[source]#
Returns an iterator over all the edges that are inserted and removed to build the trees as we move from left-to-right along the tree sequence. Each iteration yields a named tuple consisting of 3 values,
(interval, edges_out, edges_in)
. The first value,interval
, is the genomic interval(left, right)
covered by the incoming tree (seeTree.interval
). The second,edges_out
is a list of the edges that were just-removed to create the tree covering the interval (henceedges_out
will always be empty for the first tree). The last value,edges_in
, is a list of edges that were just inserted to construct the tree covering the current interval.The edges returned within each
edges_in
list are ordered by ascending time of the parent node, then ascending parent id, then ascending child id. The edges within eachedges_out
list are the reverse order (e.g. descending parent time, parent id, then child_id). This means that within each list, edges with the same parent appear consecutively.The
direction
argument can be used to control whether diffs are produced in the forward (left-to-right, increasing genome coordinate value) or reverse (right-to-left, decreasing genome coordinate value) direction.- Parameters:
include_terminal (bool) – If False (default), the iterator terminates after the final interval in the tree sequence (i.e., it does not report a final removal of all remaining edges), and the number of iterations will be equal to the number of trees in the tree sequence. If True, an additional iteration takes place, with the last
edges_out
value reporting all the edges contained in the final tree (with bothleft
andright
equal to the sequence length).direction (int) – The direction of travel along the sequence for diffs. Must be one of
FORWARD
orREVERSE
. (Default:FORWARD
).
- Returns:
An iterator over the (interval, edges_out, edges_in) tuples. This is a named tuple, so the 3 values can be accessed by position (e.g.
returned_tuple[0]
) or name (e.g.returned_tuple.interval
).- Return type:
- sites()[source]#
Returns an iterable sequence of all the sites in this tree sequence. Sites are returned in order of increasing ID (and also position). See the
Site
class for details on the available fields for each site.- Returns:
An iterable sequence of all sites.
- Return type:
Sequence(
Site
)
- mutations()[source]#
Returns an iterator over all the mutations in this tree sequence. Mutations are returned in order of nondecreasing site ID. See the
Mutation
class for details on the available fields for each mutation.The returned iterator is equivalent to iterating over all sites and all mutations in each site, i.e.:
>>> for site in tree_sequence.sites(): >>> for mutation in site.mutations: >>> yield mutation
- Returns:
An iterator over all mutations in this tree sequence.
- Return type:
iter(
Mutation
)
- populations()[source]#
Returns an iterable sequence of all the populations in this tree sequence.
- Returns:
An iterable sequence of all populations.
- Return type:
Sequence(
Population
)
- provenances()[source]#
Returns an iterable sequence of all the provenances in this tree sequence.
- Returns:
An iterable sequence of all provenances.
- Return type:
Sequence(
Provenance
)
- breakpoints(as_array=False)[source]#
Returns the breakpoints that separate trees along the chromosome, including the two extreme points 0 and L. This is equivalent to
>>> iter([0] + [t.interval.right for t in self.trees()])
By default we return an iterator over the breakpoints as Python float objects; if
as_array
is True we return them as a numpy array.Note that the
as_array
form will be more efficient and convenient in most cases; the default iterator behaviour is mainly kept to ensure compatibility with existing code.- Parameters:
as_array (bool) – If True, return the breakpoints as a numpy array.
- Returns:
The breakpoints defined by the tree intervals along the sequence.
- Return type:
- at(position, **kwargs)[source]#
Returns the tree covering the specified genomic location. The returned tree will have
tree.interval.left
<=position
<tree.interval.right
. See alsoTree.seek()
.Warning
The current implementation of this operation is linear in the number of trees, so may be inefficient for large tree sequences. See this issue for more information.
- Parameters:
- Returns:
A new instance of
Tree
positioned to cover the specified genomic location.- Return type:
- at_index(index, **kwargs)[source]#
Returns the tree at the specified index. See also
Tree.seek_index()
.Warning
The current implementation of this operation is linear in the number of trees, so may be inefficient for large tree sequences. See this issue for more information.
- Parameters:
- Returns:
A new instance of
Tree
positioned at the specified index.- Return type:
- first(**kwargs)[source]#
Returns the first tree in this
TreeSequence
. To iterate over all trees in the sequence, use thetrees()
method.
- last(**kwargs)[source]#
Returns the last tree in this
TreeSequence
. To iterate over all trees in the sequence, use thetrees()
method.
- trees(tracked_samples=None, *, sample_lists=False, root_threshold=1, sample_counts=None, tracked_leaves=None, leaf_counts=None, leaf_lists=None)[source]#
Returns an iterator over the trees in this tree sequence. Each value returned in this iterator is an instance of
Tree
. Upon successful termination of the iterator, the tree will be in the “cleared” null state.The
sample_lists
andtracked_samples
parameters are passed to theTree
constructor, and control the options that are set in the returned tree instance.Warning
Do not store the results of this iterator in a list! For performance reasons, the same underlying object is used for every tree returned which will most likely lead to unexpected behaviour. If you wish to obtain a list of trees in a tree sequence please use
ts.aslist()
instead.- Parameters:
tracked_samples (list) – The list of samples to be tracked and counted using the
Tree.num_tracked_samples()
method.sample_lists (bool) – If True, provide more efficient access to the samples beneath a given node using the
Tree.samples()
method.root_threshold (int) – The minimum number of samples that a node must be ancestral to for it to be in the list of roots. By default this is 1, so that isolated samples (representing missing data) are roots. To efficiently restrict the roots of the tree to those subtending meaningful topology, set this to 2. This value is only relevant when trees have multiple roots.
sample_counts (bool) – Deprecated since 0.2.4.
- Returns:
An iterator over the Trees in this tree sequence.
- Return type:
collections.abc.Iterable,
Tree
- coiterate(other, **kwargs)[source]#
Returns an iterator over the pairs of trees for each distinct interval in the specified pair of tree sequences.
- Parameters:
other (TreeSequence) – The other tree sequence from which to take trees. The sequence length must be the same as the current tree sequence.
**kwargs – Further named arguments that will be passed to the
trees()
method when constructing the returned trees.
- Returns:
An iterator returning successive tuples of the form
(interval, tree_self, tree_other)
. For example, the first item returned will consist of an tuple of the initial interval, the first tree of the current tree sequence, and the first tree of theother
tree sequence; the.left
attribute of the initial interval will be 0 and the.right
attribute will be the smallest non-zero breakpoint of the 2 tree sequences.- Return type:
- haplotypes(*, isolated_as_missing=None, missing_data_character=None, samples=None, left=None, right=None, impute_missing_data=None)[source]#
Returns an iterator over the strings of haplotypes that result from the trees and mutations in this tree sequence. Each haplotype string is guaranteed to be of the same length. A tree sequence with \(n\) samples and with \(s\) sites lying between
left
andright
will return a total of \(n\) strings of \(s\) alleles concatenated together, where an allele consists of a single ascii character (tree sequences that include alleles which are not a single character in length, or where the character is non-ascii, will raise an error). The first string returned is the haplotype for the first requested sample, and so on.The alleles at each site must be represented by single byte characters, (i.e., variants must be single nucleotide polymorphisms, or SNPs), hence the strings returned will all be of length \(s\). If the
left
position is less than or equal to the position of the first site, for a haplotypeh
, the value ofh[j]
will therefore be the observed allelic state at sitej
.If
isolated_as_missing
is True (the default), isolated samples without mutations directly above them will be treated as missing data and will be represented in the string by themissing_data_character
. If instead it is set to False, missing data will be assigned the ancestral state (unless they have mutations directly above them, in which case they will take the most recent derived mutational state for that node). This was the default behaviour in versions prior to 0.2.0. Prior to 0.3.0 the impute_missing_data argument controlled this behaviour.See also the
variants()
iterator for site-centric access to sample genotypes.Warning
For large datasets, this method can consume a very large amount of memory! To output all the sample data, it is more efficient to iterate over sites rather than over samples.
- Returns:
An iterator over the haplotype strings for the samples in this tree sequence.
- Parameters:
isolated_as_missing (bool) – If True, the allele assigned to missing samples (i.e., isolated samples without mutations) is the
missing_data_character
. If False, missing samples will be assigned the ancestral state. Default: True.missing_data_character (str) – A single ascii character that will be used to represent missing data. If any normal allele contains this character, an error is raised. Default: ‘N’.
samples (list[int]) – The samples for which to output haplotypes. If
None
(default), return haplotypes for all the samples in the tree sequence, in the order given by thesamples()
method.left (int) – Haplotype strings will start with the first site at or after this genomic position. If
None
(default) start at the first site.right (int) – Haplotype strings will end with the last site before this position. If
None
(default) assumeright
is the sequence length (i.e. the last character in the string will be the last site in the tree sequence).impute_missing_data (bool) – Deprecated in 0.3.0. Use ``isolated_as_missing``, but inverting value. Will be removed in a future version
- Return type:
- Raises:
TypeError – if the
missing_data_character
or any of the alleles at a site are not a single ascii character.ValueError – if the
missing_data_character
exists in one of the alleles
- variants(*, samples=None, isolated_as_missing=None, alleles=None, impute_missing_data=None, copy=None, left=None, right=None)[source]#
Returns an iterator over the variants between the
left
(inclusive) andright
(exclusive) genomic positions in this tree sequence. Each returnedVariant
object has a site, a list of possible allelic states and an array of genotypes for the specifiedsamples
. Thegenotypes
value is a numpy array containing indexes into thealleles
list. By default, this list is generated automatically for each site such that the first entry,alleles[0]
, is the ancestral state and subsequent alleles are listed in no particular order. This means that the encoding of alleles in terms of genotype values can vary from site-to-site, which is sometimes inconvenient. It is possible to specify a fixed mapping from allele strings to genotype values using thealleles
parameter. For example, if we setalleles=("A", "C", "G", "T")
, this will map allele “A” to 0, “C” to 1 and so on (theALLELES_ACGT
constant provides a shortcut for this common mapping).By default, genotypes are generated for all samples. The
samples
parameter allows us to specify the nodes for which genotypes are generated; output order of genotypes in the returned variants corresponds to the order of the samples in this list. It is also possible to provide non-sample nodes as an argument here, if you wish to generate genotypes for (e.g.) internal nodes. However,isolated_as_missing
must be False in this case, as it is not possible to detect missing data for non-sample nodes.If isolated samples are present at a given site without mutations above them, they are interpreted by default as missing data, and the genotypes array will contain a special value
MISSING_DATA
(-1) to identify them while thealleles
tuple will end with the valueNone
(note that this will be the case whether or not we specify a fixed mapping using thealleles
parameter; see theVariant
class for more details). Alternatively, ifisolated_as_missing
is set to to False, such isolated samples will not be treated as missing, and instead assigned the ancestral state (this was the default behaviour in versions prior to 0.2.0). Prior to 0.3.0 the impute_missing_data argument controlled this behaviour.- Parameters:
samples (array_like) – An array of node IDs for which to generate genotypes, or None for all sample nodes. Default: None.
isolated_as_missing (bool) – If True, the genotype value assigned to missing samples (i.e., isolated samples without mutations) is
MISSING_DATA
(-1). If False, missing samples will be assigned the allele index for the ancestral state. Default: True.alleles (tuple) – A tuple of strings defining the encoding of alleles as integer genotype values. At least one allele must be provided. If duplicate alleles are provided, output genotypes will always be encoded as the first occurrence of the allele. If None (the default), the alleles are encoded as they are encountered during genotype generation.
impute_missing_data (bool) – Deprecated in 0.3.0. Use ``isolated_as_missing``, but inverting value. Will be removed in a future version
copy (bool) – If False re-use the same Variant object for each site such that any references held to it are overwritten when the next site is visited. If True return a fresh
Variant
for each site. Default: True.left (int) – Start with the first site at or after this genomic position. If
None
(default) start at the first site.right (int) – End with the last site before this position. If
None
(default) assumeright
is the sequence length, so that the last variant corresponds to the last site in the tree sequence.
- Returns:
An iterator over all variants in this tree sequence.
- Return type:
iter(
Variant
)
- genotype_matrix(*, samples=None, isolated_as_missing=None, alleles=None, impute_missing_data=None)[source]#
Returns an \(m \times n\) numpy array of the genotypes in this tree sequence, where \(m\) is the number of sites and \(n\) the number of samples. The genotypes are the indexes into the array of
alleles
, as described for theVariant
class.If isolated samples are present at a given site without mutations above them, they will be interpreted as missing data the genotypes array will contain a special value
MISSING_DATA
(-1) to identify these missing samples.Such samples are treated as missing data by default, but if
isolated_as_missing
is set to to False, they will not be treated as missing, and so assigned the ancestral state. This was the default behaviour in versions prior to 0.2.0. Prior to 0.3.0 the impute_missing_data argument controlled this behaviour.Warning
This method can consume a very large amount of memory! If all genotypes are not needed at once, it is usually better to access them sequentially using the
variants()
iterator.- Parameters:
samples (array_like) – An array of node IDs for which to generate genotypes, or None for all sample nodes. Default: None.
isolated_as_missing (bool) – If True, the genotype value assigned to missing samples (i.e., isolated samples without mutations) is
MISSING_DATA
(-1). If False, missing samples will be assigned the allele index for the ancestral state. Default: True.alleles (tuple) – A tuple of strings describing the encoding of alleles to genotype values. At least one allele must be provided. If duplicate alleles are provided, output genotypes will always be encoded as the first occurrence of the allele. If None (the default), the alleles are encoded as they are encountered during genotype generation.
impute_missing_data (bool) – Deprecated in 0.3.0. Use ``isolated_as_missing``, but inverting value. Will be removed in a future version
- Returns:
The full matrix of genotypes.
- Return type:
numpy.ndarray (dtype=np.int32)
- alignments(*, reference_sequence=None, missing_data_character=None, samples=None, left=None, right=None)[source]#
Returns an iterator over the full sequence alignments for the defined samples in this tree sequence. Each alignment
a
is a string of lengthL
where the first character is the genomic sequence at thestart
position in the genome (defaulting to 0) and the last character is the genomic sequence one position before thestop
value (defaulting to thesequence_length
of this tree sequence, which must havediscrete_genome
equal to True). By defaultL
is therefore equal to thesequence_length
, anda[j]
is the nucleotide value at genomic positionj
.Note
This is inherently a zero-based representation of the sequence coordinate space. Care will be needed when interacting with other libraries and upstream coordinate spaces.
The sites in a tree sequence will usually only define the variation for a subset of the
L
nucleotide positions along the genome, and the remaining positions are filled using a reference sequence. The reference sequence data is defined either via thereference_sequence
parameter to this method, or embedded within with the tree sequence itself via theTreeSequence.reference_sequence
.Site information from the tree sequence takes precedence over the reference sequence so that, for example, at a site with no mutations all samples will have the site’s ancestral state.
The reference sequence bases are determined in the following way:
If the
reference_sequence
parameter is supplied this will be used, regardless of whether the tree sequence has an embedded reference sequence.Otherwise, if the tree sequence has an embedded reference sequence, this will be used.
If the
reference_sequence
parameter is not specified and there is no embedded reference sequence,L
copies of themissing_data_character
(which defaults to ‘N’) are used instead.
Warning
The
ReferenceSequence
API is preliminary and some behaviours may change in the future. In particular, a tree sequence is currently regarded as having an embedded reference sequence even if it only has some metadata defined. In this case thereference_sequence
parameter will need to be explicitly set.Note
Two common options for setting a reference sequence are:
Mark them as missing data, by setting
reference_sequence="N" * int(ts.sequence_length)
Fill the gaps with random nucleotides, by setting
reference_sequence=tskit.random_nucleotides(ts.sequence_length)
. See therandom_nucleotides()
function for more information.
Warning
Insertions and deletions are not currently supported and the alleles at each site must be represented by single byte characters, (i.e., variants must be single nucleotide polymorphisms, or SNPs).
Warning
Missing data is not currently supported by this method and it will raise a ValueError if called on tree sequences containing isolated samples. See tskit-dev/tskit#1896 for more information.
See also the
variants()
iterator for site-centric access to sample genotypes andhaplotypes()
for access to sample sequences at just the sites in the tree sequence.- Parameters:
reference_sequence (str) – The reference sequence to fill in gaps between sites in the alignments.
missing_data_character (str) – A single ascii character that will be used to represent missing data. If any normal allele contains this character, an error is raised. Default: ‘N’.
samples (list[int]) – The samples for which to output alignments. If
None
(default), return alignments for all the samples in the tree sequence, in the order given by thesamples()
method.left (int) – Alignments will start at this genomic position. If
None
(default) alignments start at 0.right (int) – Alignments will stop before this genomic position. If
None
(default) alignments will continue until the end of the tree sequence.
- Returns:
An iterator over the alignment strings for specified samples in this tree sequence, in the order given in
samples
.- Return type:
- Raises:
ValueError – if any genome coordinate in this tree sequence is not discrete, or if the
reference_sequence
is not of the correct length.TypeError – if any of the alleles at a site are not a single ascii character.
- property individuals_population#
Returns the length-
num_individuals
array containing, for each individual, thepopulation
attribute of their nodes, ortskit.NULL
for individuals with no nodes. Errors if any individual has nodes with inconsistent non-NULL populations.
- property individuals_time#
Returns the length-
num_individuals
array containing, for each individual, thetime
attribute of their nodes ornp.nan
for individuals with no nodes. Errors if any individual has nodes with inconsistent times.
- property individuals_location#
Convenience method returning the
num_individuals x n
array whose row k-th row contains thelocation
property of the k-th individual. The method only works if all individuals’ locations have the same length (which isn
), and errors otherwise.
- property individuals_flags#
Efficient access to the bitwise
flags
column in the Individual Table as a numpy array (dtype=np.uint32). Equivalent tots.tables.individuals.flags
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property nodes_time#
Efficient access to the
time
column in the Node Table as a numpy array (dtype=np.float64). Equivalent tots.tables.nodes.time
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property nodes_flags#
Efficient access to the bitwise
flags
column in the Node Table as a numpy array (dtype=np.uint32). Equivalent tots.tables.nodes.flags
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property nodes_population#
Efficient access to the
population
column in the Node Table as a numpy array (dtype=np.int32). Equivalent tots.tables.nodes.population
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property nodes_individual#
Efficient access to the
individual
column in the Node Table as a numpy array (dtype=np.int32). Equivalent tots.tables.nodes.individual
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property edges_left#
Efficient access to the
left
column in the Edge Table as a numpy array (dtype=np.float64). Equivalent tots.tables.edges.left
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property edges_right#
Efficient access to the
right
column in the Edge Table as a numpy array (dtype=np.float64). Equivalent tots.tables.edges.right
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property edges_parent#
Efficient access to the
parent
column in the Edge Table as a numpy array (dtype=np.int32). Equivalent tots.tables.edges.parent
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property edges_child#
Efficient access to the
child
column in the Edge Table as a numpy array (dtype=np.int32). Equivalent tots.tables.edges.child
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property sites_position#
Efficient access to the
position
column in the Site Table as a numpy array (dtype=np.float64). Equivalent tots.tables.sites.position
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property mutations_site#
Efficient access to the
site
column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent tots.tables.mutations.site
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property mutations_node#
Efficient access to the
node
column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent tots.tables.mutations.node
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property mutations_parent#
Efficient access to the
parent
column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent tots.tables.mutations.parent
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property mutations_time#
Efficient access to the
time
column in the Mutation Table as a numpy array (dtype=np.float64). Equivalent tots.tables.mutations.time
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_left#
Efficient access to the
left
column in the Migration Table as a numpy array (dtype=np.float64). Equivalent tots.tables.migrations.left
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_right#
Efficient access to the
right
column in the Migration Table as a numpy array (dtype=np.float64). Equivalent tots.tables.migrations.right
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_node#
Efficient access to the
node
column in the Migration Table as a numpy array (dtype=np.int32). Equivalent tots.tables.migrations.node
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_source#
Efficient access to the
source
column in the Migration Table as a numpy array (dtype=np.int32). Equivalent tots.tables.migrations.source
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_dest#
Efficient access to the
dest
column in the Migration Table as a numpy array (dtype=np.int32). Equivalent tots.tables.migrations.dest
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property migrations_time#
Efficient access to the
time
column in the Migration Table as a numpy array (dtype=np.float64). Equivalent tots.tables.migrations.time
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property indexes_edge_insertion_order#
Efficient access to the
edge_insertion_order
column in the Table indexes as a numpy array (dtype=np.int32). Equivalent tots.tables.indexes.edge_insertion_order
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- property indexes_edge_removal_order#
Efficient access to the
edge_removal_order
column in the Table indexes as a numpy array (dtype=np.int32). Equivalent tots.tables.indexes.edge_removal_order
(but avoiding the full copy of the table data that accessingts.tables
currently entails).
- individual(id_)[source]#
Returns the individual in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last individual.
- Return type:
- node(id_)[source]#
Returns the node in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last node.
- Return type:
- edge(id_)[source]#
Returns the edge in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last edge.
- Return type:
- migration(id_)[source]#
Returns the migration in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last migration.
- Return type:
- mutation(id_)[source]#
Returns the mutation in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last mutation.
- Return type:
- site(id_=None, *, position=None)[source]#
Returns the site in this tree sequence with either the specified ID or position. As with python lists, negative IDs can be used to index backwards from the last site.
When position is specified instead of site ID, a binary search is done on the list of positions of the sites to try to find a site with the user-specified position.
- Return type:
- population(id_)[source]#
Returns the population in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last population.
- Return type:
- provenance(id_)[source]#
Returns the provenance in this tree sequence with the specified ID. As with python lists, negative IDs can be used to index backwards from the last provenance.
- samples(population=None, *, population_id=None, time=None)[source]#
Returns an array of the sample node IDs in this tree sequence. If population is specified, only return sample IDs from that population. It is also possible to restrict samples by time using the parameter time. If time is a numeric value, only return sample IDs whose node time is approximately equal to the specified time. If time is a pair of values of the form (min_time, max_time), only return sample IDs whose node time t is in this interval such that min_time <= t < max_time.
- Parameters:
- Returns:
A numpy array of the node IDs for the samples of interest, listed in numerical order.
- Return type:
numpy.ndarray (dtype=np.int32)
- as_vcf(*args, **kwargs)[source]#
Return the result of
write_vcf()
as a string. Keyword parameters are as defined inwrite_vcf()
.- Returns:
A VCF encoding of the variants in this tree sequence as a string.
- Return type:
- write_vcf(output, ploidy=None, *, contig_id='1', individuals=None, individual_names=None, position_transform=None, site_mask=None, sample_mask=None, isolated_as_missing=None, allow_position_zero=None)[source]#
Convert the genetic variation data in this tree sequence to Variant Call Format and write to the specified file-like object.
Multiploid samples in the output VCF are generated either using individual information in the data model (see Individual Table), or by combining genotypes for adjacent sample nodes using the
ploidy
argument. See the Constructing GT values section for more details and examples.If individuals that are associated with sample nodes are defined in the data model (see Individual Table), the genotypes for each of the individual’s samples are combined into a phased multiploid values at each site. By default, all individuals associated with sample nodes are included in increasing order of individual ID.
Subsets or permutations of the sample individuals may be specified using the
individuals
argument. It is an error to specify any individuals that are not associated with any nodes, or whose nodes are not all samples.Mixed-sample individuals (e.g., those associated with one node that is a sample and another that is not) in the data model will result in an error by default. However, such individuals can be excluded using the
individuals
argument.If there are no individuals in the tree sequence, synthetic individuals are created by combining adjacent samples, and the number of samples combined is equal to the
ploidy
value (1 by default). For example, if we have aploidy
of 2 and 6 sample nodes, then we will have 3 diploid samples in the VCF, consisting of the combined genotypes for samples [0, 1], [2, 3] and [4, 5]. If we had genotypes 011110 at a particular variant, then we would output the diploid genotypes 0|1, 1|1 and 1|0 in VCF.Each individual in the output is identified by a string; these are the VCF “sample” names. By default, these are of the form
tsk_0
,tsk_1
etc, up to the number of individuals, but can be manually specified using theindividual_names
argument. We do not check for duplicates in this array, or perform any checks to ensure that the output VCF is well-formed.Note
The default individual names (VCF sample IDs) are always of the form
tsk_0
,tsk_1
, …,tsk_{N - 1}
, where N is the number of individuals we output. These numbers are not necessarily the individual IDs.The REF value in the output VCF is the ancestral allele for a site and ALT values are the remaining alleles. It is important to note, therefore, that for real data this means that the REF value for a given site may not be equal to the reference allele. We also do not check that the alleles result in a valid VCF—for example, it is possible to use the tab character as an allele, leading to a broken VCF.
The ID value in the output VCF file is the integer ID of the corresponding site (
site.id
). These ID values can be utilized to match the contents of the VCF file to the sites in the tree sequence object.Note
Older code often uses the
ploidy=2
argument, because old versions of msprime did not output individual data. Specifying individuals in the tree sequence is more robust, and since tree sequences now typically contain individuals (e.g., as produced bymsprime.sim_ancestry( )
), this is not necessary, and theploidy
argument can safely be removed as part of the process of updating from the msprime 0.x legacy API.- Parameters:
output (io.IOBase) – The file-like object to write the VCF output.
ploidy (int) – The ploidy of the individuals to be written to VCF. This sample size must be evenly divisible by ploidy. Cannot be used if there is individual data in the tree sequence.
contig_id (str) – The value of the CHROM column in the output VCF.
individuals (list(int)) – A list containing the individual IDs to corresponding to the VCF samples. Defaults to all individuals associated with sample nodes in the tree sequence. See the {ref}`sec_export_vcf_constructing_gt` section for more details and examples.
individual_names (list(str)) – A list of string names to identify individual columns in the VCF. In VCF nomenclature, these are the sample IDs. If specified, this must be a list of strings of length equal to the number of individuals to be output. Note that we do not check the form of these strings in any way, so that is is possible to output malformed VCF (for example, by embedding a tab character within on of the names). The default is to output
tsk_j
for the jth individual. See the Individual names for examples and more information.position_transform – A callable that transforms the site position values into integer valued coordinates suitable for VCF. The function takes a single positional parameter x and must return an integer numpy array the same dimension as x. By default, this is set to
numpy.round()
which will round values to the nearest integer. If the string “legacy” is provided here, the pre 0.2.0 legacy behaviour of rounding values to the nearest integer (starting from 1) and avoiding the output of identical positions by incrementing is used. See the Modifying coordinates for examples and more information.site_mask – A numpy boolean array (or something convertable to a numpy boolean array) with num_sites elements, used to mask out sites in the output. If
site_mask[j]
is True, then this site (i.e., the line in the VCF file) will be omitted. See the Masking output for examples and more information.sample_mask – A numpy boolean array (or something convertable to a numpy boolean array) with num_samples elements, or a callable that returns such an array, such that if
sample_mask[j]
is True, then the genotype for samplej
will be marked as missing using a “.”. Ifsample_mask
is a callable, it must take a single argument and return a boolean numpy array. This function will be called for each (unmasked) site with the correspondingVariant
object, allowing for dynamic masks to be generated. See the Masking output for examples and more information.isolated_as_missing (bool) – If True, the genotype value assigned to missing samples (i.e., isolated samples without mutations) is “.” If False, missing samples will be assigned the ancestral allele. See
variants()
for more information. Default: True.allow_position_zero (bool) – If True allow sites with position zero to be output to the VCF, otherwise if one is present an error will be raised. The VCF spec does not allow for sites at position 0. However, in practise many tools will be fine with this. Default: False.
- write_fasta(file_or_path, *, wrap_width=60, reference_sequence=None, missing_data_character=None)[source]#
Writes the
alignments()
for this tree sequence to file in FASTA format. Please see thealignments()
method for details on how reference sequences are handled.Alignments are returned for the sample nodes in this tree sequence, and a sample with node id
u
is given the labelf"n{u}"
, following the same convention as thewrite_nexus()
andTree.as_newick()
methods.The
wrap_width
parameter controls the maximum width of lines of sequence data in the output. By default this is 60 characters in accordance with fasta standard outputs. To turn off line-wrapping of sequences, setwrap_width
= 0.Example usage:
ts.write_fasta("output.fa")
Warning
Missing data is not currently supported by this method and it will raise a ValueError if called on tree sequences containing isolated samples. See tskit-dev/tskit#1896 for more information.
- Parameters:
file_or_path – The file object or path to write the output. Paths can be either strings or
pathlib.Path
objects.wrap_width (int) – The number of sequence characters to include on each line in the fasta file, before wrapping to the next line for each sequence, or 0 to turn off line wrapping. (Default=60).
reference_sequence (str) – As for the
alignments()
method.missing_data_character (str) – As for the
alignments()
method.
- as_fasta(**kwargs)[source]#
Return the result of
write_fasta()
as a string. Keyword parameters are as defined inwrite_fasta()
.- Returns:
A FASTA encoding of the alignments in this tree sequence as a string.
- Return type:
- write_nexus(file_or_path, *, precision=None, include_trees=None, include_alignments=None, reference_sequence=None, missing_data_character=None)[source]#
Returns a nexus encoding of this tree sequence. By default, tree topologies are included in the output, and sequence data alignments are included by default if this tree sequence has discrete genome coordinates and one or more sites. Inclusion of these sections can be controlled manually using the
include_trees
andinclude_alignments
parameters.Tree topologies and branch lengths are listed sequentially in the TREES block and the spatial location of each tree encoded within the tree name labels. Specifically, a tree spanning the interval \([x, y)`\) is given the name
f"t{x}^{y}"
(See below for a description of the precision at which these spatial coordinates are printed out).The sample nodes in this tree sequence are regarded as taxa, and a sample with node id
u
is given the labelf"n{u}"
, following the same convention as theTree.as_newick()
method.By default, genome positions are printed out with with sufficient precision for them to be recovered exactly in double precision. If the tree sequence is defined on a
discrete_genome
, then positions are written out as integers. Otherwise, 17 digits of precision is used. Branch length precision defaults are handled in the same way asTree.as_newick()
.If the
precision
argument is provided, genome positions and branch lengths are printed out with this many digits of precision.For example, here is the nexus encoding of a simple tree sequence with integer times and genome coordinates with three samples and two trees:
#NEXUS BEGIN TAXA; DIMENSIONS NTAX=3; TAXLABELS n0 n1 n2; END; BEGIN TREES; TREE t0^2 = [&R] (n0:3,(n1:2,n2:2):1); TREE t2^10 = [&R] (n1:2,(n0:1,n2:1):1); END;
If sequence data
alignments()
are defined for this tree sequence and there is at least one site present, sequence alignment data will also be included by default (this can be suppressed by settinginclude_alignments=False
). For example, this tree sequence has a sequence length of 10, two variable sites and no reference sequence:#NEXUS BEGIN TAXA; DIMENSIONS NTAX=3; TAXLABELS n0 n1 n2; END; BEGIN DATA; DIMENSIONS NCHAR=10; FORMAT DATATYPE=DNA MISSING=?; MATRIX n0 ??G??????T n1 ??A??????C n2 ??A??????C ; END; BEGIN TREES; TREE t0^10 = [&R] (n0:2,(n1:1,n2:1):1); END;
Please see the
alignments()
method for details on how reference sequences are handled.Note
Note the default
missing_data_character
for this method is “?” rather then “N”, in keeping with common conventions for nexus data. This can be changed using themissing_data_character
parameter.Warning
Missing data is not supported for encoding tree topology information as our convention of using trees with multiple roots is not often supported by newick parsers. Thus, the method will raise a ValueError if we try to output trees with multiple roots. Additionally, missing data is not currently supported for alignment data. See tskit-dev/tskit#1896 for more information.
- Parameters:
precision (int) – The numerical precision with which branch lengths and tree positions are printed.
include_trees (bool) – True if the tree topology information should be included; False otherwise (default=True).
include_alignments (bool) – True if the sequence data alignment information should be included; False otherwise (default=True if sequence alignments are well-defined and the tree sequence contains at least one site).
reference_sequence (str) – As for the
alignments()
method.missing_data_character (str) – As for the
alignments()
method, but defaults to “?”.
- Returns:
A nexus representation of this
TreeSequence
- Return type:
- as_nexus(**kwargs)[source]#
Return the result of
write_nexus()
as a string. Keyword parameters are as defined inwrite_nexus()
.- Returns:
A nexus encoding of the alignments in this tree sequence as a string.
- Return type:
- to_macs()[source]#
Return a macs encoding of this tree sequence.
- Returns:
The macs representation of this TreeSequence as a string.
- Return type:
- simplify(samples=None, *, map_nodes=False, reduce_to_site_topology=False, filter_populations=None, filter_individuals=None, filter_sites=None, filter_nodes=None, update_sample_flags=None, keep_unary=False, keep_unary_in_individuals=None, keep_input_roots=False, record_provenance=True, filter_zero_mutation_sites=None)[source]#
Returns a simplified tree sequence that retains only the history of the nodes given in the list
samples
. Ifmap_nodes
is true, also return a numpy array whoseu
-th element is the ID of the node in the simplified tree sequence that corresponds to nodeu
in the original tree sequence, ortskit.NULL
(-1) ifu
is no longer present in the simplified tree sequence.Note
If you wish to simplify a set of tables that do not satisfy all requirements for building a TreeSequence, then use
TableCollection.simplify()
.If the
reduce_to_site_topology
parameter is True, the returned tree sequence will contain only topological information that is necessary to represent the trees that contain sites. If there are zero sites in this tree sequence, this will result in an output tree sequence with zero edges. When the number of sites is greater than zero, every tree in the output tree sequence will contain at least one site. For a given site, the topology of the tree containing that site will be identical (up to node ID remapping) to the topology of the corresponding tree in the input tree sequence.If
filter_populations
,filter_individuals
,filter_sites
, orfilter_nodes
is True, any of the corresponding objects that are not referenced elsewhere are filtered out. As this is the default behaviour, it is important to realise IDs for these objects may change through simplification. By setting these parameters to False, however, the corresponding tables can be preserved without changes.If
filter_nodes
is False, then the output node table will be unchanged except for updating the sample status of nodes and any ID remappings caused by filtering individuals and populations (if thefilter_individuals
andfilter_populations
options are enabled). Nodes that are in the specified list ofsamples
will be marked as samples in the output, and nodes that are currently marked as samples in the node table but not in the specified list ofsamples
will have theirtskit.NODE_IS_SAMPLE
flag cleared. Note also that the order of thesamples
list is not meaningful whenfilter_nodes
is False. In this case, the returned node mapping is always the identity mapping, such thata[u] == u
for all nodes.Setting the
update_sample_flags
parameter to False disables the automatic sample status update of nodes (described above) from occuring, making it the responsibility of calling code to keep track of the ultimate sample status of nodes. This is an advanced option, mostly of use when combined with thefilter_nodes=False
,filter_populations=False
andfilter_individuals=False
options, which then guarantees that the node table will not be altered by simplification.- Parameters:
samples (list[int]) – A list of node IDs to retain as samples. They need not be nodes marked as samples in the original tree sequence, but will constitute the entire set of samples in the returned tree sequence. If not specified or None, use all nodes marked with the IS_SAMPLE flag. The list may be provided as a numpy array (or array-like) object (dtype=np.int32).
map_nodes (bool) – If True, return a tuple containing the resulting tree sequence and a numpy array mapping node IDs in the current tree sequence to their corresponding node IDs in the returned tree sequence. If False (the default), return only the tree sequence object itself.
reduce_to_site_topology (bool) – Whether to reduce the topology down to the trees that are present at sites. (Default: False)
filter_populations (bool) – If True, remove any populations that are not referenced by nodes after simplification; new population IDs are allocated sequentially from zero. If False, the population table will not be altered in any way. (Default: None, treated as True)
filter_individuals (bool) – If True, remove any individuals that are not referenced by nodes after simplification; new individual IDs are allocated sequentially from zero. If False, the individual table will not be altered in any way. (Default: None, treated as True)
filter_sites (bool) – If True, remove any sites that are not referenced by mutations after simplification; new site IDs are allocated sequentially from zero. If False, the site table will not be altered in any way. (Default: None, treated as True)
filter_nodes (bool) – If True, remove any nodes that are not referenced by edges after simplification. If False, the only potential change to the node table may be to change the node flags (if
samples
is specified and different from the existing samples). (Default: None, treated as True)update_sample_flags (bool) – If True, update node flags to so that nodes in the specified list of samples have the NODE_IS_SAMPLE flag after simplification, and nodes that are not in this list do not. (Default: None, treated as True)
keep_unary (bool) – If True, preserve unary nodes (i.e., nodes with exactly one child) that exist on the path from samples to root. (Default: False)
keep_unary_in_individuals (bool) – If True, preserve unary nodes that exist on the path from samples to root, but only if they are associated with an individual in the individuals table. Cannot be specified at the same time as
keep_unary
. (Default:None
, equivalent to False)keep_input_roots (bool) – Whether to retain history ancestral to the MRCA of the samples. If
False
, no topology older than the MRCAs of the samples will be included. IfTrue
the roots of all trees in the returned tree sequence will be the same roots as in the original tree sequence. (Default: False)record_provenance (bool) – If True, record details of this call to simplify in the returned tree sequence’s provenance information (Default: True).
filter_zero_mutation_sites (bool) – Deprecated alias for
filter_sites
.
- Returns:
The simplified tree sequence, or (if
map_nodes
is True) a tuple consisting of the simplified tree sequence and a numpy array mapping source node IDs to their corresponding IDs in the new tree sequence.- Return type:
- delete_sites(site_ids, record_provenance=True)[source]#
Returns a copy of this tree sequence with the specified sites (and their associated mutations) entirely removed. The site IDs do not need to be in any particular order, and specifying the same ID multiple times does not have any effect (i.e., calling
tree_sequence.delete_sites([0, 1, 1])
has the same effect as callingtree_sequence.delete_sites([0, 1])
.Note
To remove only the mutations associated with a site, but keep the site itself, use the
MutationTable.keep_rows()
method.
- delete_intervals(intervals, simplify=True, record_provenance=True)[source]#
Returns a copy of this tree sequence for which information in the specified list of genomic intervals has been deleted. Edges spanning these intervals are truncated or deleted, and sites and mutations falling within them are discarded. Note that it is the information in the intervals that is deleted, not the intervals themselves, so in particular, all samples will be isolated in the deleted intervals.
Note that node IDs may change as a result of this operation, as by default
simplify()
is called on the returned tree sequence to remove redundant nodes. If you wish to map node IDs onto the same nodes before and after this method has been called, specifysimplify=False
.See also
keep_intervals()
,ltrim()
,rtrim()
, and missing data.- Parameters:
intervals (array_like) – A list (start, end) pairs describing the genomic intervals to delete. Intervals must be non-overlapping and in increasing order. The list of intervals must be interpretable as a 2D numpy array with shape (N, 2), where N is the number of intervals.
simplify (bool) – If True, return a simplified tree sequence where nodes no longer used are discarded. (Default: True).
record_provenance (bool) – If
True
, add details of this operation to the provenance information of the returned tree sequence. (Default:True
).
- Return type:
- keep_intervals(intervals, simplify=True, record_provenance=True)[source]#
Returns a copy of this tree sequence which includes only information in the specified list of genomic intervals. Edges are truncated to lie within these intervals, and sites and mutations falling outside these intervals are discarded. Note that it is the information outside the intervals that is deleted, not the intervals themselves, so in particular, all samples will be isolated outside of the retained intervals.
Note that node IDs may change as a result of this operation, as by default
simplify()
is called on the returned tree sequence to remove redundant nodes. If you wish to map node IDs onto the same nodes before and after this method has been called, specifysimplify=False
.See also
keep_intervals()
,ltrim()
,rtrim()
, and missing data.- Parameters:
intervals (array_like) – A list (start, end) pairs describing the genomic intervals to keep. Intervals must be non-overlapping and in increasing order. The list of intervals must be interpretable as a 2D numpy array with shape (N, 2), where N is the number of intervals.
simplify (bool) – If True, return a simplified tree sequence where nodes no longer used are discarded. (Default: True).
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
- Return type:
- ltrim(record_provenance=True)[source]#
Returns a copy of this tree sequence with a potentially changed coordinate system, such that empty regions (i.e., those not covered by any edge) at the start of the tree sequence are trimmed away, and the leftmost edge starts at position 0. This affects the reported position of sites and edges. Additionally, sites and their associated mutations to the left of the new zero point are thrown away.
- Parameters:
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
- rtrim(record_provenance=True)[source]#
Returns a copy of this tree sequence with the
sequence_length
property reset so that the sequence ends at the end of the rightmost edge. Additionally, sites and their associated mutations at positions greater than the newsequence_length
are thrown away.- Parameters:
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
- trim(record_provenance=True)[source]#
Returns a copy of this tree sequence with any empty regions (i.e., those not covered by any edge) on the right and left trimmed away. This may reset both the coordinate system and the
sequence_length
property. It is functionally equivalent tortrim()
followed byltrim()
. Sites and their associated mutations in the empty regions are thrown away.- Parameters:
record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).
- split_edges(time, *, flags=None, population=None, metadata=None)[source]#
Returns a copy of this tree sequence in which we replace any edge
(left, right, parent, child)
in whichnode_time[child] < time < node_time[parent]
with two edges(left, right, parent, u)
and(left, right, u, child)
, whereu
is a newly added node for each intersecting edge.If
metadata
,flags
, orpopulation
are specified, newly added nodes will be assigned these values. Otherwise, default values will be used. The default metadata is an empty dictionary if a metadata schema is defined for the node table, and is an empty byte string otherwise. The default population for the new node istskit.NULL
. Newly added have a defaultflags
value of 0.Any metadata associated with a split edge will be copied to the new edge.
Warning
This method currently does not support migrations and a error will be raised if the migration table is not empty. Future versions may take migrations that intersect with the edge into account when determining the default population assignments for new nodes.
Any mutations lying on the edge whose time is >=
time
will have their node value set tou
. Note that the time of the mutation is defined as the time of the child node if the mutation’s time is unknown.- Parameters:
time (float) – The cutoff time.
flags (int) – The flags value for newly-inserted nodes. (Default = 0)
population (int) – The population value for newly inserted nodes. Defaults to
tskit.NULL
if not specified.metadata – The metadata for any newly inserted nodes. See
NodeTable.add_row()
for details on how default metadata is produced for a given schema (or none).
- Returns:
A copy of this tree sequence with edges split at the specified time.
- Return type:
- decapitate(time, *, flags=None, population=None, metadata=None)[source]#
Delete all edge topology and mutational information at least as old as the specified time from this tree sequence.
Removes all edges in which the time of the child is >= the specified time
t
, and breaks edges that intersect witht
. For each edge intersecting witht
we create a new node with time equal tot
, and set the parent of the edge to this new node. The node table is not altered in any other way. Newly added nodes have values forflags
,population
andmetadata
controlled by parameters to this function in the same way assplit_edges()
.Note
Note that each edge is treated independently, so that even if two edges that are broken by this operation share the same parent and child nodes, there will be two different new parent nodes inserted.
Any mutation whose time is >=
t
will be removed. A mutation’s time is its associatedtime
value, or the time of its node if the mutation’s time was marked as unknown (UNKNOWN_TIME
).Migrations are not supported, and a LibraryError will be raise if called on a tree sequence containing migration information.
See also
This method is implemented using the
split_edges()
andTableCollection.delete_older()
functions.- Parameters:
time (float) – The cutoff time.
flags (int) – The flags value for newly-inserted nodes. (Default = 0)
population (int) – The population value for newly inserted nodes. Defaults to
tskit.NULL
if not specified.metadata – The metadata for any newly inserted nodes. See
NodeTable.add_row()
for details on how default metadata is produced for a given schema (or none).
- Returns:
A copy of this tree sequence with edges split at the specified time.
- Return type:
- extend_haplotypes(max_iter=10)[source]#
Returns a new tree sequence in which the span covered by ancestral nodes is “extended” to regions of the genome according to the following rule: If an ancestral segment corresponding to node n has ancestor p and descendant c on some portion of the genome, and on an adjacent segment of genome p is still an ancestor of c, then n is inserted into the path from p to c. For instance, if p is the parent of n and n is the parent of c, then the span of the edges from p to n and n to c are extended, and the span of the edge from p to c is reduced. Thus, the ancestral haplotype represented by n is extended to a longer span of the genome. However, any edges whose child node is a sample are not modified.
Since some edges may be removed entirely, this process usually reduces the number of edges in the tree sequence.
The method works by iterating over the genome to look for paths that can be extended in this way; the maximum number of such iterations is controlled by
max_iter
.The rationale is that we know that n carries a portion of the segment of ancestral genome inherited by c from p, and so likely carries the entire inherited segment (since the implication otherwise would be that distinct recombined segments were passed down separately from p to c).
In the example above, if there was a mutation on the node above c older than the time of n in the span into which n was extended, then the mutation will now occur above n. So, this operation may change mutations’ nodes (but will not affect genotypes). This is only unambiguous if the mutation’s time is known, so the method requires known mutation times. See
impute_unknown_mutations_time()
if mutation times are not known.The method will not affect the marginal trees (so, if the original tree sequence was simplified, then following up with simplify will recover the original tree sequence, possibly with edges in a different order). It will also not affect the genotype matrix, or any of the tables other than the edge table or the node column in the mutation table.
- Parameters:
max_iters (int) – The maximum number of iterations over the tree sequence. Defaults to 10.
- Returns:
A new tree sequence with unary nodes extended.
- Return type:
- subset(nodes, record_provenance=True, reorder_populations=True, remove_unreferenced=True)[source]#
Returns a tree sequence containing only information directly referencing the provided list of nodes to retain. The result will retain only the nodes whose IDs are listed in
nodes
, only edges for which both parent and child are innodes`
, only mutations whose node is innodes
, and only individuals that are referred to by one of the retained nodes. Note that this does not retain the ancestry of these nodes - for that, seesimplify()
.This has the side effect that it may change the order of the nodes, individuals, populations, and migrations in the tree sequence: the nodes in the new tree sequence will be in the order provided in
nodes
, and both individuals and populations will be ordered by the earliest retained node that refers to them. (However,reorder_populations
may be set to False to keep the population table unchanged.)By default, the method removes all individuals and populations not referenced by any nodes, and all sites not referenced by any mutations. To retain these unreferenced individuals, populations, and sites, pass
remove_unreferenced=False
. If this is done, the site table will remain unchanged, unreferenced individuals will appear at the end of the individuals table (and in their original order), and unreferenced populations will appear at the end of the population table (unlessreorder_populations=False
).See also
keep_intervals()
for subsetting a given portion of the genome;simplify()
for retaining the ancestry of a subset of nodes.- Parameters:
nodes (list) – The list of nodes for which to retain information. This may be a numpy array (or array-like) object (dtype=np.int32).
record_provenance (bool) – Whether to record a provenance entry in the provenance table for this operation.
reorder_populations (bool) – Whether to reorder populations (default: True). If False, the population table will not be altered in any way.
remove_unreferenced (bool) – Whether sites, individuals, and populations that are not referred to by any retained entries in the tables should be removed (default: True). See the description for details.
- Return type:
- union(other, node_mapping, check_shared_equality=True, add_populations=True, record_provenance=True)[source]#
Returns an expanded tree sequence which contains the node-wise union of
self
andother
, obtained by adding the non-shared portions ofother
ontoself
. The “shared” portions are specified using a map that specifies which nodes inother
are equivalent to those inself
: thenode_mapping
argument should be an array of length equal to the number of nodes inother
and whose entries are the ID of the matching node inself
, ortskit.NULL
if there is no matching node. Those nodes inother
that map totskit.NULL
will be added toself
, along with:Individuals whose nodes are new to
self
.Edges whose parent or child are new to
self
.Mutations whose nodes are new to
self
.Sites which were not present in
self
, if the site contains a newly added mutation.
By default, populations of newly added nodes are assumed to be new populations, and added to the population table as well.
Note that this operation also sorts the resulting tables, so the resulting tree sequence may not be equal to
self
even if nothing new was added (although it would differ only in ordering of the tables).- Parameters:
other (TableCollection) – Another table collection.
node_mapping (list) – An array of node IDs that relate nodes in
other
to nodes inself
.check_shared_equality (bool) – If True, the shared portions of the tree sequences will be checked for equality. It does so by subsetting both
self
andother
on the equivalent nodes specified innode_mapping
, and then checking for equality of the subsets.add_populations (bool) – If True, nodes new to
self
will be assigned new population IDs.record_provenance (bool) – Whether to record a provenance entry in the provenance table for this operation.
- draw_svg(path=None, *, size=None, x_scale=None, time_scale=None, tree_height_scale=None, title=None, node_labels=None, mutation_labels=None, node_titles=None, mutation_titles=None, root_svg_attributes=None, style=None, order=None, force_root_branch=None, symbol_size=None, x_axis=None, x_label=None, x_lim=None, x_regions=None, y_axis=None, y_label=None, y_ticks=None, y_gridlines=None, omit_sites=None, canvas_size=None, max_num_trees=None, **kwargs)[source]#
Return an SVG representation of a tree sequence. See the visualization tutorial for more details.
- Parameters:
path (str) – The path to the file to write the output. If None, do not write to file.
size (tuple(int, int)) – A tuple of (width, height) specifying a target drawing size in abstract user units (usually interpreted as pixels on initial display). Components of the drawing will be scaled so that the total plot including labels etc. normally fits onto a canvas of this size (see
canvas_size
below). IfNone
, chose values such that each tree is drawn at a size appropriate for a reasonably small set of samples (this will nevertheless result in a very wide drawing if there are many trees to display). Default:None
x_scale (str) – Control how the X axis is drawn. If “physical” (the default) the axis scales linearly with physical distance along the sequence, background shading is used to indicate the position of the trees along the X axis, and sites (with associated mutations) are marked at the appropriate physical position on axis line. If “treewise”, each axis tick corresponds to a tree boundary, which are positioned evenly along the axis, so that the X axis is of variable scale, no background scaling is required, and site positions are not marked on the axis.
time_scale (str) – Control how height values for nodes are computed. If this is equal to
"time"
, node heights are proportional to their time values (this is the default). If this is equal to"log_time"
, node heights are proportional to their log(time) values. If it is equal to"rank"
, node heights are spaced equally according to their ranked times.tree_height_scale (str) – Deprecated alias for time_scale. (Deprecated in 0.3.6)
title (str) – A title string to be included in the SVG output. If
None
(default) no title is shown, which gives more vertical space for the tree.node_labels (dict(int, str)) – If specified, show custom labels for the nodes (specified by ID) that are present in this map; any nodes not present will not have a label.
mutation_labels – If specified, show custom labels for the mutations (specified by ID) that are present in the map; any mutations not present will not have a label.
node_titles (dict(int, str)) – If specified, add a
<title>
string to symbols for each node (specified by ID) present in this map. SVG visualizers such as web browsers will commonly display this string on mousing over node symbol.mutation_titles (dict(int, str)) – If specified, add a
<title>
string to symbols for each mutation (specified by ID) present in this map. SVG visualizers such as web browsers will commonly display this string on mousing over the mutation symbol in the tree and (if show) on the x axis.root_svg_attributes (dict) – Additional attributes, such as an id, that will be embedded in the root
<svg>
tag of the generated drawing.style (str) – A css string that will be included in the
<style>
tag of the generated svg.order (str) – The left-to-right ordering of child nodes in each drawn tree. This can be either:
"minlex"
, which minimises the differences between adjacent trees (see also the"minlex_postorder"
traversal order for theTree.nodes()
method); or"tree"
which draws trees in the left-to-right order defined by the quintuply linked tree structure. If not specified or None, this defaults to"minlex"
.force_root_branch (bool) – If
True
plot a branch (edge) above every tree root in the tree sequence. IfNone
(default) then only plot such root branches if any root in the tree sequence has a mutation above it.symbol_size (float) – Change the default size of the node and mutation plotting symbols. If
None
(default) use a standard size.x_axis (bool) – Should the plot have an X axis line, showing the positions of trees along the genome. The scale used is determined by the
x_scale
parameter. IfNone
(default) plot an X axis.x_label (str) – Place a label under the plot. If
None
(default) and there is an X axis, create and place an appropriate label.x_lim (list) – A list of size two giving the genomic positions between which trees should be plotted. If the first is
None
, then plot from the first non-empty region of the tree sequence. If the second isNone
, then plot up to the end of the last non-empty region of the tree sequence. The default valuex_lim=None
is shorthand for the list [None
,None
]. If numerical values are given, then regions outside the interval have all information discarded: this means that mutations outside the interval will not be shown. To force display of the entire tree sequence, including empty flanking regions, specifyx_lim=[0, ts.sequence_length]
.x_regions (dict) – A dictionary mapping (left, right) tuples to names. This draws a box, labelled with the name, on the X axis between the left and right positions, and can be used for annotating genomic regions (e.g. genes) on the X axis. If
None
(default) do not plot any regions.y_axis (bool) – Should the plot have an Y axis line, showing time (or ranked node time if
time_scale="rank"
. IfNone
(default) do not plot a Y axis.y_label (str) – Place a label to the left of the plot. If
None
(default) and there is a Y axis, create and place an appropriate label.y_ticks (Union[list, dict]) – A list of Y values at which to plot tickmarks, or a dictionary mapping Y values to labels (
[]
gives no tickmarks). IfNone
(default), plot one tickmark for each unique node value. Note that iftime_scale="rank"
, the Y values refer to the zero-based rank of the plotted nodes, rather than the node time itself.y_gridlines (bool) – Whether to plot horizontal lines behind the tree at each y tickmark.
omit_sites (bool) – If True, omit sites and mutations from the drawing. Default: False
canvas_size (tuple(int, int)) – The (width, height) of the SVG canvas. This will change the SVG width and height without rescaling graphical elements, allowing extra room e.g. for unusually long labels. If
None
take the canvas size to be the same as the target drawing size (seesize
, above). Default: Nonemax_num_trees (int) – The maximum number of trees to plot. If there are more trees than this in the tree sequence, the middle trees will be skipped from the plot and a message “XX trees skipped” displayed in their place. If
None
, all the trees will be plotted: this can produce a very wide plot if there are many trees in the tree sequence. Default: None
- Returns:
An SVG representation of a tree sequence.
- Return type:
Note
Technically, x_lim[0] specifies a minimum value for the start of the X axis, and x_lim[1] specifies a maximum value for the end. This is only relevant if the tree sequence contains “empty” regions with no edges or mutations. In this case if x_lim[0] lies strictly within an empty region (i.e.,
empty_tree.interval.left < x_lim[0] < empty_tree.interval.right
) then that tree will not be plotted on the left hand side, and the X axis will start atempty_tree.interval.right
. Similarly, if x_lim[1] lies strictly within an empty region then that tree will not be plotted on the right hand side, and the X axis will end atempty_tree.interval.left
- draw_text(*, node_labels=None, use_ascii=False, time_label_format=None, position_label_format=None, order=None, **kwargs)[source]#
Create a text representation of a tree sequence.
- Parameters:
node_labels (dict) – If specified, show custom labels for the nodes that are present in the map. Any nodes not specified in the map will not have a node label.
use_ascii (bool) – If
False
(default) then use unicode box drawing characters to render the tree. IfTrue
, use plain ascii characters, which look cruder but are less susceptible to misalignment or font substitution. Alternatively, if you are having alignment problems with Unicode, you can try out the solution documented here.time_label_format (str) – A python format string specifying the format (e.g. number of decimal places or significant figures) used to print the numerical time values on the time axis. If
None
, this defaults to"{:.2f}"
.position_label_format (str) – A python format string specifying the format (e.g. number of decimal places or significant figures) used to print genomic positions. If
None
, this defaults to"{:.2f}"
.order (str) – The left-to-right ordering of child nodes in the drawn tree. This can be either:
"minlex"
, which minimises the differences between adjacent trees (see also the"minlex_postorder"
traversal order for theTree.nodes()
method); or"tree"
which draws trees in the left-to-right order defined by the quintuply linked tree structure. If not specified or None, this defaults to"minlex"
.
- Returns:
A text representation of a tree sequence.
- Return type:
- general_stat(W, f, output_dim, windows=None, polarised=False, mode=None, span_normalise=True, strict=True)[source]#
Compute a windowed statistic from weights and a summary function. See the statistics interface section for details on windows, mode, span normalise, and return value. On each tree, this propagates the weights
W
up the tree, so that the “weight” of each node is the sum of the weights of all samples at or below the node. Then the summary functionf
is applied to the weights, giving a summary for each node in each tree. How this is then aggregated depends onmode
:- “site”
Adds together the total summary value across all alleles in each window.
- “branch”
Adds together the summary value for each node, multiplied by the length of the branch above the node and the span of the tree.
- “node”
Returns each node’s summary value added across trees and multiplied by the span of the tree.
Both the weights and the summary can be multidimensional: if
W
hask
columns, andf
takes ak
-vector and returns anm
-vector, then the output will bem
-dimensional for each node or window (depending on “mode”).Note
The summary function
f
should return zero when given both 0 and the total weight (i.e.,f(0) = 0
andf(np.sum(W, axis=0)) = 0
), unlessstrict=False
. This is necessary for the statistic to be unaffected by parts of the tree sequence ancestral to none or all of the samples, respectively.- Parameters:
W (numpy.ndarray) – An array of values with one row for each sample and one column for each weight.
f – A function that takes a one-dimensional array of length equal to the number of columns of
W
and returns a one-dimensional array.output_dim (int) – The length of
f
’s return value.windows (list) – An increasing list of breakpoints between the windows to compute the statistic in.
polarised (bool) – Whether to leave the ancestral state out of computations: see Statistics for more details.
mode (str) – A string giving the “type” of the statistic to be computed (defaults to “site”).
span_normalise (bool) – Whether to divide the result by the span of the window (defaults to True).
strict (bool) – Whether to check that f(0) and f(total weight) are zero.
- Returns:
A ndarray with shape equal to (num windows, num statistics).
- sample_count_stat(sample_sets, f, output_dim, windows=None, polarised=False, mode=None, span_normalise=True, strict=True)[source]#
Compute a windowed statistic from sample counts and a summary function. This is a wrapper around
general_stat()
for the common case in which the weights are all either 1 or 0, i.e., functions of the joint allele frequency spectrum. See the statistics interface section for details on sample sets, windows, mode, span normalise, and return value. Ifsample_sets
is a list ofk
sets of samples, thenf
should be a function that takes an argument of lengthk
and returns a one-dimensional array. Thej
-th element of the argument tof
will be the number of samples insample_sets[j]
that lie below the node thatf
is being evaluated for. Seegeneral_stat()
for more details.Here is a contrived example: suppose that
A
andB
are two sets of samples withnA
andnB
elements, respectively. Passing these as sample sets will givef
an argument of length two, giving the number of samples inA
andB
below the node in question. So, if we definedef f(x): pA = x[0] / nA pB = x[1] / nB return np.array([pA * pB])
then if all sites are biallelic,
ts.sample_count_stat([A, B], f, 1, windows="sites", polarised=False, mode="site")
would compute, for each site, the product of the derived allele frequencies in the two sample sets, in a (num sites, 1) array. If instead
f
returnsnp.array([pA, pB, pA * pB])
, then the output would be a (num sites, 3) array, with the first two columns giving the allele frequencies inA
andB
, respectively.Note
The summary function
f
should return zero when given both 0 and the sample size (i.e.,f(0) = 0
andf(np.array([len(x) for x in sample_sets])) = 0
). This is necessary for the statistic to be unaffected by parts of the tree sequence ancestral to none or all of the samples, respectively.- Parameters:
sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes to compute the statistic with.
f – A function that takes a one-dimensional array of length equal to the number of sample sets and returns a one-dimensional array.
output_dim (int) – The length of
f
’s return value.windows (list) – An increasing list of breakpoints between the windows to compute the statistic in.
polarised (bool) – Whether to leave the ancestral state out of computations: see Statistics for more details.
mode (str) – A string giving the “type” of the statistic to be computed (defaults to “site”).
span_normalise (bool) – Whether to divide the result by the span of the window (defaults to True).
strict (bool) – Whether to check that f(0) and f(total weight) are zero.
- Returns:
A ndarray with shape equal to (num windows, num statistics).
- diversity(sample_sets=None, windows=None, mode='site', span_normalise=True)[source]#
Computes mean genetic diversity (also known as “pi”) in each of the sets of nodes from
sample_sets
. The statistic is also known as “sample heterozygosity”; a common citation for the definition is Nei and Li (1979) (equation 22), so it is sometimes called called “Nei’s pi” (but also sometimes “Tajima’s pi”).Please see the one-way statistics section for details on how the
sample_sets
argument is interpreted and how it interacts with the dimensions of the output array. See the statistics interface section for details on windows, mode, span normalise, and return value.Note that this quantity can also be computed by the
divergence
method.What is computed depends on
mode
:- “site”
Mean pairwise genetic diversity: the average over all n choose 2 pairs of sample nodes, of the density of sites at which the two carry different alleles, per unit of chromosome length.
- “branch”
Mean distance in the tree: the average across over all n choose 2 pairs of sample nodes and locations in the window, of the mean distance in the tree between the two samples (in units of time).
- “node”
For each node, the proportion of genome on which the node is an ancestor to only one of a pair of sample nodes from the sample set, averaged over over all n choose 2 pairs of sample nodes.
- Parameters:
sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes for which the statistic is computed. If any of the sample sets contain only a single node, the returned diversity will be NaN. If
None
(default), average over all n choose 2 pairs of distinct sample nodes in the tree sequence.windows (list) – An increasing list of breakpoints between the windows to compute the statistic in.
mode (str) – A string giving the “type” of the statistic to be computed (defaults to “site”).
span_normalise (bool) – Whether to divide the result by the span of the window (defaults to True).
- Returns:
A numpy array whose length is equal to the number of sample sets. If there is one sample set and windows=None, a numpy scalar is returned.
- divergence(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#
Computes mean genetic divergence between (and within) pairs of sets of nodes from
sample_sets
. This is the “average number of differences”, usually referred to as “dxy”; a common citation for this definition is Nei and Li (1979), who called it \(\pi_{XY}\). Note that the mean pairwise nucleotide diversity of a sample set to itself (computed by passing an index of the form (j,j)) is itsdiversity
(see the note below).Operates on
k = 2
sample sets at a time; please see the multi-way statistics section for details on how thesample_sets
andindexes
arguments are interpreted and how they interact with the dimensions of the output array. See the statistics interface section for details on windows, mode, span normalise, and return value.Note
To avoid unexpected results, sample sets should be nonoverlapping, since comparisons of individuals to themselves are not removed when computing divergence between distinct sample sets. (However, specifying an index
(j, j)
computes thediversity
ofsample_set[j]
, which removes self comparisons to provide an unbiased estimate.)What is computed depends on
mode
:- “site”
Mean pairwise genetic divergence: the average across every possible pair of chromosomes (one from each sample set), of the density of sites at which the two carry different alleles, per unit of chromosome length.
- “branch”
Mean distance in the tree: the average across every possible pair of chromosomes (one from each sample set) and locations in the window, of the mean distance in the tree between the two samples (in units of time).
- “node”
For each node, the proportion of genome on which the node is an ancestor to only one of a pair of chromosomes from the sample set, averaged over all possible pairs.
- Parameters:
sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes to compute the statistic with.
indexes (list) – A list of 2-tuples, or None.
windows (list) – An increasing list of breakpoints between the windows to compute the statistic in.
mode (str) – A string giving the “type” of the statistic to be computed (defaults to “site”).
span_normalise (bool) – Whether to divide the result by the span of the window (defaults to True).
- Returns:
A ndarray with shape equal to (num windows, num statistics). If there is one pair of sample sets and windows=None, a numpy scalar is returned.