# 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#

 TreeSequence.time_units String describing the units of the time dimension for this TreeSequence. TreeSequence.nbytes Returns the total number of bytes required to store the data in this tree sequence. TreeSequence.sequence_length Returns the sequence length in this tree sequence. TreeSequence.max_root_time Returns the time of the oldest root in any of the trees in this tree sequence. TreeSequence.discrete_genome Returns True if all genome coordinates in this TreeSequence are discrete integer values. TreeSequence.discrete_time Returns True if all time coordinates in this TreeSequence are discrete integer values. TreeSequence.metadata The decoded metadata for this TreeSequence. TreeSequence.metadata_schema The tskit.MetadataSchema for this TreeSequence. TreeSequence.reference_sequence The ReferenceSequence associated with this TreeSequence if one is defined (see TreeSequence.has_reference_sequence()), or None otherwise.

#### Efficient table column access#

The TreeSequence class provides access to underlying numerical data defined in the data model in two ways:

1. Via the TreeSequence.tables property and the Tables API

2. Via 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.

 TreeSequence.individuals_flags Efficient access to the flags column in the Individual Table as a numpy array (dtype=np.uint32). TreeSequence.nodes_time Efficient access to the time column in the Node Table as a numpy array (dtype=np.float64). TreeSequence.nodes_flags Efficient access to the flags column in the Node Table as a numpy array (dtype=np.uint32). TreeSequence.nodes_population Efficient access to the population column in the Node Table as a numpy array (dtype=np.int32). TreeSequence.nodes_individual Efficient access to the individual column in the Node Table as a numpy array (dtype=np.int32). TreeSequence.edges_left Efficient access to the left column in the Edge Table as a numpy array (dtype=np.float64). TreeSequence.edges_right Efficient access to the right column in the Edge Table as a numpy array (dtype=np.float64). TreeSequence.edges_parent Efficient access to the parent column in the Edge Table as a numpy array (dtype=np.int32). TreeSequence.edges_child Efficient access to the child column in the Edge Table as a numpy array (dtype=np.int32). TreeSequence.sites_position Efficient access to the position column in the Site Table as a numpy array (dtype=np.float64). TreeSequence.mutations_site Efficient access to the site column in the Mutation Table as a numpy array (dtype=np.int32). TreeSequence.mutations_node Efficient access to the node column in the Mutation Table as a numpy array (dtype=np.int32). TreeSequence.mutations_parent Efficient access to the parent column in the Mutation Table as a numpy array (dtype=np.int32). TreeSequence.mutations_time Efficient access to the time column in the Mutation Table as a numpy array (dtype=np.float64). TreeSequence.migrations_left Efficient access to the left column in the Migration Table as a numpy array (dtype=np.float64). TreeSequence.migrations_right Efficient access to the right column in the Migration Table as a numpy array (dtype=np.float64). TreeSequence.migrations_right Efficient access to the right column in the Migration Table as a numpy array (dtype=np.float64). TreeSequence.migrations_node Efficient access to the node column in the Migration Table as a numpy array (dtype=np.int32). TreeSequence.migrations_source Efficient access to the source column in the Migration Table as a numpy array (dtype=np.int32). TreeSequence.migrations_dest Efficient access to the dest column in the Migration Table as a numpy array (dtype=np.int32). TreeSequence.migrations_time Efficient access to the time column in the Migration Table as a numpy array (dtype=np.float64). TreeSequence.indexes_edge_insertion_order Efficient access to the edge_insertion_order column in the Table indexes as a numpy array (dtype=np.int32). TreeSequence.indexes_edge_removal_order Efficient access to the edge_removal_order column in the Table indexes as a numpy array (dtype=np.int32).

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(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 this TableCollection, building the required indexes if they have not yet been created by build_index().
Save a tree sequence
 TreeSequence.dump(file_or_path[, ...]) Writes the tree sequence to the specified path or file object.

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.

 TreeSequence.num_trees Returns the number of distinct trees in this tree sequence. TreeSequence.trees([tracked_samples, ...]) Returns an iterator over the trees in this tree sequence. TreeSequence.breakpoints([as_array]) Returns the breakpoints that separate trees along the chromosome, including the two extreme points 0 and L. TreeSequence.coiterate(other, **kwargs) Returns an iterator over the pairs of trees for each distinct interval in the specified pair of tree sequences. TreeSequence.first(**kwargs) Returns the first tree in this TreeSequence. TreeSequence.last(**kwargs) Returns the last tree in this TreeSequence. TreeSequence.aslist(**kwargs) Returns the trees in this tree sequence as a list. TreeSequence.at(position, **kwargs) Returns the tree covering the specified genomic location. TreeSequence.at_index(index, **kwargs) 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. TreeSequence.num_nodes Returns the number of nodes in this tree sequence. TreeSequence.nodes(*[, order]) Returns an iterable sequence of all the nodes in this tree sequence. Returns the node in this tree sequence with the specified ID. TreeSequence.num_samples 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
 Edge(left, right, parent, child[, metadata, ...]) An edge in a tree sequence. TreeSequence.num_edges Returns the number of edges in this tree sequence. Returns an iterable sequence of all the edges in this tree sequence. Returns the edge in this tree sequence with the specified ID.
##### Genetic variation#
Sites
 Site(*args[, metadata_decoder]) A site in a tree sequence. TreeSequence.num_sites 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) and right (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
 Mutation(*args[, metadata_decoder]) A mutation in a tree sequence. TreeSequence.num_mutations Returns the number of mutations in this tree sequence. Returns an iterator over all the mutations in this tree sequence. Returns the mutation in this tree sequence with the specified ID.
##### Demography#
Populations
 Population(*args[, metadata_decoder]) A population in a tree sequence. TreeSequence.num_populations 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. TreeSequence.num_migrations 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. TreeSequence.num_individuals 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). TreeSequence.num_provenances 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.

 TreeSequence.simplify([samples, map_nodes, ...]) Returns a simplified tree sequence that retains only the history of the nodes given in the list samples. TreeSequence.subset(nodes[, ...]) Returns a tree sequence containing only information directly referencing the provided list of nodes to retain. TreeSequence.union(other, node_mapping[, ...]) Returns an expanded tree sequence which contains the node-wise union of self and other, obtained by adding the non-shared portions of other onto self. TreeSequence.keep_intervals(intervals[, ...]) Returns a copy of this tree sequence which includes only information in the specified list of genomic intervals. TreeSequence.delete_intervals(intervals[, ...]) Returns a copy of this tree sequence for which information in the specified list of genomic intervals has been deleted. TreeSequence.delete_sites(site_ids[, ...]) Returns a copy of this tree sequence with the specified sites (and their associated mutations) entirely removed. TreeSequence.trim([record_provenance]) 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. TreeSequence.split_edges(time, *[, flags, ...]) Returns a copy of this tree sequence in which we replace any edge (left, right, parent, child) in which node_time[child] < time < node_time[parent] with two edges (left, right, parent, u) and (left, right, u, child), where u is a newly added node for each intersecting edge. TreeSequence.decapitate(time, *[, flags, ...]) Delete all edge topology and mutational information at least as old as the specified time from this tree sequence.

#### 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.

 TreeSequence.ibd_segments(*[, within, ...]) Finds pairs of samples that are identical by descent (IBD) and returns the result as an IdentitySegments instance.

#### 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.

 TreeSequence.tables Returns the tables underlying this tree sequence, intended for read-only access. Returns a modifiable copy of the tables defining this tree sequence. TreeSequence.table_metadata_schemas The set of metadata schemas for the tables in this tree sequence. TreeSequence.tables_dict Returns a dictionary mapping names to tables in the underlying TableCollection.

#### 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. 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:

 TreeSequence.count_topologies([sample_sets]) Returns a generator that produces the same distribution of topologies as Tree.count_topologies() but sequentially for every tree in a tree sequence.

#### Display#

 TreeSequence.draw_svg([path, size, x_scale, ...]) Return an SVG representation of a tree sequence. TreeSequence.draw_text(*[, node_labels, ...]) 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#

 TreeSequence.as_fasta(**kwargs) Return the result of write_fasta() as a string. TreeSequence.as_nexus(**kwargs) Return the result of write_nexus() as a string. TreeSequence.dump_text([nodes, edges, ...]) Writes a text representation of the tables underlying the tree sequence to the specified connections. Return a macs encoding of this tree sequence. TreeSequence.write_fasta(file_or_path, *[, ...]) Writes the alignments() for this tree sequence to file in FASTA format. TreeSequence.write_nexus(file_or_path, *[, ...]) Returns a nexus encoding of this tree sequence. TreeSequence.write_vcf(output[, ploidy, ...]) 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#

 Tree.tree_sequence Returns the tree sequence that this tree is from. Tree.total_branch_length Returns the sum of all the branch lengths in this tree (in units of time). Tree.root_threshold Returns the minimum number of samples that a node must be an ancestor of to be considered a potential root. Tree.virtual_root The ID of the virtual root in this tree. Tree.num_edges The total number of edges in this tree. Tree.num_roots The number of roots in this tree, as defined in the roots attribute. Tree.has_single_root True if this tree has a single root, False otherwise. Tree.has_multiple_roots True if this tree has more than one root, False otherwise. Tree.root The root of this tree. Tree.roots The list of roots in this tree. Tree.index Returns the index this tree occupies in the parent tree sequence. Tree.interval Returns the coordinates of the genomic interval that this tree represents the history of. Tree.span 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 node u with greater than 2 children --- a multifurcation or "polytomy" --- is resolved into successive bifurcations.

Tree.unrank() for creating a new one-tree sequence from its topological rank.

Note

Several of these methods are static, so should be called e.g. as tskit.Tree.generate_balanced(4) rather than used on a specific Tree instance.

#### 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). Returns True if the specified node is a leaf. Returns True if the specified node is not a leaf. Returns the parent of the specified node. Returns the number of children of the specified node (i.e., len(tree.children(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. Returns the number of nodes on the path from u to a root, not including u. 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. Returns the id of the edge encoding the relationship between u and its parent, or tskit.NULL if u is a root, virtual root or is not a node in the current tree.
Descendant nodes
 Returns an iterator over all the leaves in this tree that descend from the specified node. Returns an iterator over the numerical IDs of all the sample nodes in this tree that are underneath node 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 the TreeSequence.trees() method underneath the specified node.
Multiple nodes
 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(u, v) 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.

 Tree.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 all 0 <= u <= ts.num_nodes. Tree.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 all 0 <= u <= ts.num_nodes. Tree.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 all 0 <= u <= ts.num_nodes. Tree.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 all 0 <= u <= ts.num_nodes. Tree.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 all 0 <= u <= ts.num_nodes. Tree.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 all 0 <= u <= ts.num_nodes. Tree.edge_array A numpy array (dtype=np.int32) of edge ids encoding the relationship between the child node u and its parent, such that tree.edge_array[u] == tree.edge(u) for all 0 <= u <= ts.num_nodes.

#### 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.
Array access
 Returns a numpy array of node ids in postorder. Returns a numpy array of node ids in preorder. Returns a numpy array of node ids. 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 (see tskit.Tree.rank()) with num_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#

 Tree.kc_distance(other[, lambda_]) Returns the Kendall-Colijn distance between the specified pair of trees.

#### 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. Tree.b2_index([base]) Returns the B2 balance index this tree.

#### Sites and mutations#

 Returns an iterator over all the sites in this tree. Tree.num_sites Returns the number of sites on this tree. Returns an iterator over all the mutations in this tree. Tree.num_mutations Returns the total number of mutations across all sites on this tree. Tree.map_mutations(genotypes, alleles[, ...]) 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 first()). Calling next on the last tree in the sequence results in the tree being cleared back into the null initial state (equivalent to calling clear()). 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::. 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()). Calling prev on the first tree in the sequence results in the tree being cleared back into the null initial state (equivalent to calling clear()). 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::. Seeks to the first tree in the sequence. Seeks to the last tree in the sequence. Tree.seek(position) Sets the state to represent the tree that covers the specified position in the parent tree sequence. Tree.seek_index(index) 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#

 Tree.draw_svg([path, size, time_scale, ...]) Return an SVG representation of a single tree. Tree.draw_text([orientation, node_labels, ...]) 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. Tree.as_newick(*[, root, precision, ...]) Returns a newick encoding of this tree. For example, a binary tree with 3 leaves generated by Tree.generate_balanced(3) encodes as::.

## 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
 TableCollection.individuals The Individual Table in this collection. TableCollection.nodes The Node Table in this collection. TableCollection.edges The Edge Table in this collection. TableCollection.migrations The Migration Table in this collection TableCollection.sites The Site Table in this collection. TableCollection.mutations The Mutation Table in this collection. TableCollection.populations The Population Table in this collection. TableCollection.provenances The Provenance Table in this collection.
Other properties
 TableCollection.file_uuid The UUID for the file this TableCollection is derived from, or None if not derived from a file. TableCollection.indexes The edge insertion and removal indexes. TableCollection.nbytes Returns the total number of bytes required to store the data in this table collection. TableCollection.table_name_map Returns a dictionary mapping table names to the corresponding table instances. TableCollection.metadata The decoded metadata for this object. TableCollection.metadata_bytes The raw bytes of metadata for this TableCollection TableCollection.metadata_schema The tskit.MetadataSchema for this object. TableCollection.sequence_length The sequence length defining the coordinate space. TableCollection.time_units 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).

 TableCollection.clear([clear_provenance, ...]) Remove all rows of the data tables, optionally remove provenance, metadata schemas and ts-level metadata. TableCollection.simplify([samples, ...]) Simplifies the tables in place to retain only the information necessary to reconstruct the tree sequence describing the given samples. TableCollection.subset(nodes[, ...]) 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. TableCollection.delete_intervals(intervals) Delete all information from this set of tables which lies within the specified list of genomic intervals. TableCollection.keep_intervals(intervals[, ...]) Delete all information from this set of tables which lies outside the specified list of genomic intervals. TableCollection.delete_sites(site_ids[, ...]) Remove the specified sites entirely from the sites and mutations tables in this collection. TableCollection.trim([record_provenance]) Trim away any empty regions on the right and left of the tree sequence encoded by these tables. TableCollection.union(other, node_mapping[, ...]) Modifies the table collection in place by adding the non-shared portions of other to itself. 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. 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 the site 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. TableCollection.equals(other, *[, ...]) Returns True if self and other are equal. TableCollection.link_ancestors(samples, ...) Returns an EdgeTable instance describing a subset of the genealogical relationships between the nodes in samples and ancestors.

#### Export#

 Returns a TreeSequence instance from the tables defined in this TableCollection, building the required indexes if they have not yet been created by build_index(). TableCollection.dump(file_or_path) 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.

 IndividualTable([max_rows_increment, ll_table]) A table defining the individuals in a tree sequence. NodeTable([max_rows_increment, ll_table]) A table defining the nodes in a tree sequence. EdgeTable([max_rows_increment, ll_table]) A table defining the edges in a tree sequence. MigrationTable([max_rows_increment, ll_table]) A table defining the migrations in a tree sequence. SiteTable([max_rows_increment, ll_table]) A table defining the sites in a tree sequence. MutationTable([max_rows_increment, ll_table]) A table defining the mutations in a tree sequence. PopulationTable([max_rows_increment, ll_table]) A table defining the populations referred to in a tree sequence. ProvenanceTable([max_rows_increment, ll_table]) 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()
print("The table contains", len(t), "rows")
print(t)

The table contains 2 rows
╔══╤════╤═════╤══════╤═════╤════════╗
╠══╪════╪═════╪══════╪═════╪════════╣
║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)

╔══╤════╤═════╤══════╤═════╤════════╗
╠══╪════╪═════╪══════╪═════╪════════╣
║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)
print(t2)

╔══╤════╤═════╤══════╤═════╤════════╗
╠══╪════╪═════╪══════╪═════╪════════╣
║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

╔══╤════╤═════╤══════╤═════╤════════╗
╠══╪════╪═════╪══════╪═════╪════════╣
║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()
print(t)
print(t[0])
print(t[1])
print(t[2])
print(t[3])

╔══╤════════╤═══════════════╤════════╗
╠══╪════════╪═══════════════╪════════╣
║0 │       0│              A│        ║
║1 │       1│             BB│        ║
║2 │       2│               │        ║
║3 │       3│            CCC│        ║
╚══╧════════╧═══════════════╧════════╝



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)

╔══╤════════╤═══════════════╤════════╗
╠══╪════════╪═══════════════╪════════╣
║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)

╔══╤════════╤═══════════════╤════════╗
╠══╪════════╪═══════════════╪════════╣
║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)

╔══╤════╤════╤════╤═════════════╤══════╤════════╗
╠══╪════╪════╪════╪═════════════╪══════╪════════╣
║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()
print(t)

╔══╤═════╤══════════╤══════════╤════╤════════════════════════════════════════╗
╠══╪═════╪══════════╪══════════╪════╪════════════════════════════════════════╣
║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)

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)

╔══╤═════╤══════════╤══════════╤════╤════════════════════════════════════════╗
╠══╪═════╪══════════╪══════════╪════╪════════════════════════════════════════╣
║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)

[ 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_nodes(source[, strict, encoding, ...]) Parse the specified file-like object containing a whitespace delimited description of a node table and returns the corresponding NodeTable instance. parse_edges(source[, strict, table]) Parse the specified file-like object containing a whitespace delimited description of a edge table and returns the corresponding EdgeTable instance. parse_sites(source[, strict, encoding, ...]) Parse the specified file-like object containing a whitespace delimited description of a site table and returns the corresponding SiteTable instance. parse_mutations(source[, strict, encoding, ...]) Parse the specified file-like object containing a whitespace delimited description of a mutation table and returns the corresponding MutationTable instance. parse_individuals(source[, strict, ...]) Parse the specified file-like object containing a whitespace delimited description of an individual table and returns the corresponding IndividualTable instance. parse_populations(source[, strict, ...]) Parse the specified file-like object containing a whitespace delimited description of a population table and returns the corresponding PopulationTable instance. parse_migrations(source[, strict, encoding, ...]) Parse the specified file-like object containing a whitespace delimited description of a migration table and returns the corresponding MigrationTable instance. pack_strings(strings[, encoding]) Packs the specified list of strings into a flattened numpy array of 8 bit integers and corresponding offsets using the specified text encoding. unpack_strings(packed, offset[, encoding]) Unpacks a list of strings from the specified numpy arrays of packed byte data and corresponding offsets using the specified text encoding. pack_bytes(data) Packs the specified list of bytes into a flattened numpy array of 8 bit integers and corresponding offsets. unpack_bytes(packed, offset) Unpacks a list of bytes from the specified numpy arrays of packed byte data and corresponding offsets.

The metadata module provides validation, encoding and decoding of metadata using a schema. See Metadata, Python Metadata API Overview and Working with Metadata.

 MetadataSchema(schema) Class for validating, encoding and decoding metadata. register_metadata_codec(codec_cls, codec_id) Register a metadata codec class.

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.

 validate_provenance(provenance) Validates the specified dict-like object against the tskit provenance schema.

## Utility functions#

Miscellaneous top-level utility functions.

 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). random_nucleotides(length, *[, seed]) 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.DuplicatePositionsError[source]#

Duplicate positions in the list of sites.

A metadata object was of a type that could not be encoded

A metadata schema object did not validate against the metaschema.

A metadata object did not validate against the provenance schema.

exception tskit.ProvenanceValidationError[source]#

A JSON document did not validate against the provenance schema.

### 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:
• num_leaves (int) – The number of leaves of the tree to generate.

• span (float) – The genomic span of each returned tree.

Return type:

tskit.Tree

tskit.all_tree_shapes(num_leaves, span=1)[source]#

Generates all unique shapes of trees with num_leaves leaves.

Parameters:
• num_leaves (int) – The number of leaves of the tree to generate.

• span (float) – The genomic span of each returned tree.

Return type:

tskit.Tree

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) where n is the number of leaves of tree.

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.Tree

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 for tskit.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]]

Return a TreeSequence instance loaded from the specified file object or path. The file must be in the tree sequence file format produced by the TreeSequence.dump() method.

Warning

With any of the skip_tables or skip_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 to tskit.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.

Returns:

The tree sequence object containing the information stored in the specified file path.

Return type:

tskit.TreeSequence

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 the TreeSequence.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 by tskit.load() is many times more efficient than this text format.

The nodes and edges parameters are mandatory and must be file-like objects containing text with whitespace delimited columns, parsable by parse_nodes() and parse_edges(), respectively. sites, individuals, populations, mutations, and migrations are optional, and must be parsable by parse_sites(), parse_individuals(), parse_populations(), parse_mutations(), and parse_migrations(), respectively. For convenience, if the node table refers to populations, but the populations 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 the TreeSequence.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. If strict is True (the default), we require exactly one tab character separating each field. If strict 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 when strict=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:
Returns:

The tree sequence object containing the information stored in the specified file paths.

Return type:

tskit.TreeSequence

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:

data (list[bytes]) – The list of bytes values to encode.

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:
• data (list[str]) – The list of strings to encode.

• 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 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 the strict 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.

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 the strict 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.

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 the time column is missing its entries are filled with UNKNOWN_TIME.

See tskit.load_text() for a detailed explanation of the strict 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.

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 the strict 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.

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 the strict 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.

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 with UNKNOWN_TIME.

See tskit.load_text() for a detailed explanation of the strict 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.

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 the strict 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”.

Parameters:

length (int) – The length of the random sequence.

Returns:

A string of the specified length consisting of random nucleotide characters.

Return type:

str

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.

Parameters:

codec_id (str) – String to use to refer to the codec in the schema.

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:

tskit.ProvenanceValidationError

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:

list[str]

### 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. If sample_lists is True a more efficient algorithm is used in the Tree.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 the Tree.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 like Tree.first(), Tree.last(), Tree.seek() and Tree.seek_index(). There is one more state, the so-called “null” or “cleared” state. This is the state that a Tree is in immediately after initialisation; it has an index of -1, and no edges. We can also enter the null state by calling Tree.next() on the last tree in a sequence, calling Tree.prev() on the first tree in a sequence or calling calling the Tree.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 give 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:

Tree

property tree_sequence#

Returns the tree sequence that this tree is from.

Returns:

The parent tree sequence for this tree.

Return type:

TreeSequence

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:

TreeSequence

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()). Calling next on the last tree in the sequence results in the tree being cleared back into the null initial state (equivalent to calling clear()). 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:

bool

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()). Calling prev on the first tree in the sequence results in the tree being cleared back into the null initial state (equivalent to calling clear()). 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:

bool

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:

Rank

static unrank(num_leaves, rank, *, span=1, branch_length=1)[source]#

Reconstruct the tree of the given rank (see tskit.Tree.rank()) with num_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 specified branch_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.

• rank (tuple(int)) – The rank 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 its sequence_length equal to span.

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:

Tree

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 counter topology_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:

TopologyCounter

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.

Parameters:

u (int) – The node of interest.

Returns:

The branch length from u to its parent.

Return type:

float

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:

float

mrca(*args)[source]#

Returns the most recent common ancestor of the specified nodes.

Parameters:

*args (int) – input node IDs, must be at least 2.

Returns:

The most recent common ancestor of input nodes.

Return type:

int

tmrca(u, v)[source]#

Returns the time of the most recent common ancestor of the specified nodes. This is equivalent to:

>>> tree.time(tree.mrca(u, v))


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 the TreeSequence.divergence() or TreeSequence.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:
• u (int) – The first node.

• v (int) – The second node.

Returns:

The time of the most recent common ancestor of u and v.

Return type:

float

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.

Parameters:

u (int) – The node of interest.

Returns:

The parent of u.

Return type:

int

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 all 0 <= u <= ts.num_nodes. See the parent() 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.

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.

Parameters:

u (int) – The node of interest.

Returns:

The leftmost child of u.

Return type:

int

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 all 0 <= u <= ts.num_nodes. See the left_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.

Parameters:

u (int) – The node of interest.

Returns:

The rightmost child of u.

Return type:

int

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 all 0 <= u <= ts.num_nodes. See the right_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.

Parameters:

u (int) – The node of interest.

Returns:

The sibling node to the left of u.

Return type:

int

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 all 0 <= u <= ts.num_nodes. See the left_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.

Parameters:

u (int) – The node of interest.

Returns:

The sibling node to the right of u.

Return type:

int

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 all 0 <= u <= ts.num_nodes. See the right_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. If u has no siblings or is not a node in the current tree, returns an empty tuple. If u is the root of a single-root tree, returns an empty tuple; if u is the root of a multi-root tree, returns the other roots (note all the roots are related by the virtual root). If u is the virtual root (which has no siblings), returns an empty tuple. If u 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.

Parameters:

u (int) – The node of interest.

Returns:

The siblings of u.

Return type:

tuple(int)

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 all 0 <= u <= ts.num_nodes. See the num_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, or tskit.NULL if u is a root, virtual root or is not a node in the current tree.

Parameters:

u (int) – The node of interest.

Returns:

Id of edge connecting u to its parent.

Return type:

int

property edge_array#

A numpy array (dtype=np.int32) of edge ids encoding the relationship between the child node u and its parent, such that tree.edge_array[u] == tree.edge(u) for all 0 <= u <= ts.num_nodes. See the edge() 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 the root 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:

int

children(u)[source]#

Returns the children of the specified node u as a tuple of integer node IDs. If u 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.

Parameters:

u (int) – The node of interest.

Returns:

The children of u as a tuple of integers

Return type:

tuple(int)

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.

Parameters:

u (int) – The node of interest.

Returns:

The time of u.

Return type:

float

depth(u)[source]#

Returns the number of nodes on the path from u to a root, not including u. Thus, the depth of a root is zero.

As a special case, the depth of the virtual root is defined as -1.

Parameters:

u (int) – The node of interest.

Returns:

The depth of u.

Return type:

int

population(u)[source]#

Returns the population associated with the specified node. Equivalent to tree.tree_sequence.node(u).population.

Parameters:

u (int) – The node of interest.

Returns:

The ID of the population associated with node u.

Return type:

int

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.

Parameters:

u (int) – The node of interest.

Returns:

True if u is not a leaf node.

Return type:

bool

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 return True 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.

Parameters:

u (int) – The node of interest.

Returns:

True if u is a leaf node.

Return type:

bool

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.

Parameters:

u (int) – The node of interest.

Returns:

True if u is an isolated node.

Return type:

bool

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.

Parameters:

u (int) – The node of interest.

Returns:

True if u is a sample.

Return type:

bool

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:
• u (int) – The descendant node.

• v (int) – The ancestral node.

Returns:

True if u is a descendant of v.

Return type:

bool

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 to tree.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, or len(tree.preorder()) to find the number of nodes that are reachable from all roots in this tree.

Return type:

int

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:

int

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:

bool

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:

bool

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 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:

list

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:

int

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 (see roots for the definition of a root). This is exactly equivalent to finding the node ID in roots, but is more efficient for trees with large numbers of roots, such as in regions with extensive Missing data. Note that False is returned for all other nodes, including isolated non-sample nodes which are not found in the topology of the current tree.

Parameters:

u (int) – The node of interest.

Return type:

bool

Returns:

True if u is a root.

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:

int

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 or 1) or equivalently by name (.left or .right)

Return type:

Interval

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:

float

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. If None (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. If True, 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 the 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.

Return type:

str

draw_svg(path=None, *, size=None, time_scale=None, tree_height_scale=None, max_time=None, min_time=None, max_tree_height=None, node_labels=None, mutation_labels=None, root_svg_attributes=None, style=None, order=None, force_root_branch=None, symbol_size=None, x_axis=None, x_label=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 and mutation_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). If None, 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)

• 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.

• 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 the 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 always plot a branch (edge) above the root(s) in the tree. If None (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.

• y_axis (bool) – Should the plot have an Y axis line, showing time (or ranked node time if time_scale="rank"). If None (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 (list) – A list of Y values at which to plot tickmarks ([] gives no tickmarks). If None, plot one tickmark for each unique node value.

• 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 or None (default) mutations are only drawn on an edge if their site position exists within the genomic interval covered by this tree. If True, 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 (see size, above). Default: None

Returns:

An SVG representation of a tree.

Return type:

SVGString

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 to None 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, and None 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 the 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".

• 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:

str

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:

int

property num_sites#

Returns the number of sites on this tree.

Returns:

The number of sites on this tree.

Return type:

int

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

Returns:

An iterator over all Mutation objects in this tree.

Return type:

iter(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:

collections.abc.Iterable

samples(u=None)[source]#

Returns an iterator over the numerical IDs of all the sample nodes in this tree that are underneath node u. If u is a sample, it is included in the returned iterator. If u is not specified, return all sample node IDs in the tree.

If the TreeSequence.trees() method is called with sample_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:

collections.abc.Iterable

num_children(u)[source]#

Returns the number of children of the specified node (i.e., len(tree.children(u)))

Parameters:

u (int) – The node of interest.

Returns:

The number of immediate children of the node u in this tree.

Return type:

int

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.

Parameters:

u (int) – The node of interest.

Returns:

The number of samples in the subtree rooted at u.

Return type:

int

num_tracked_samples(u=None)[source]#

Returns the number of samples in the set specified in the tracked_samples parameter of the TreeSequence.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.

Parameters:

u (int) – The node of interest.

Returns:

The number of samples within the set of tracked samples in the subtree rooted at u.

Return type:

int

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, not Node objects.

If the root parameter is not provided or None, iterate over all nodes reachable from the roots (see Tree.roots for details on which nodes are considered roots). If the root parameter is provided, only the nodes in the subtree rooted at this node (including the specified node) will be iterated over. If the virtual_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 first n // 2 children are visited in the first stage, and the remaining n - 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:
• root (int) – The root of the subtree we are traversing.

• order (str) – The traversal ordering. Currently ‘preorder’, ‘inorder’, ‘postorder’, ‘levelorder’ (‘breadthfirst’), ‘timeasc’ and ‘timedesc’ and ‘minlex_postorder’ are supported.

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 the node_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 setting include_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 setting include_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 a ValueError. 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:

str

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:

str

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).

__str__()[source]#

Return a plain text summary of a tree in a tree sequence

_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 sample j carries the allele at index k, then we have genotypes[j] = k. Missing observations can be specified for a sample using the value tskit.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), where ancestral_state is the allele assigned to the tree root(s) and mutations is a list of Mutation objects, ordered as required in a mutation table. For each mutation, derived_state is the new state after this mutation and node 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). The parent property contains the index in the returned list of the previous mutation on the path to root, or tskit.NULL if there are no previous mutations (see the Mutation Table for more information on the concept of mutation parents). All other attributes of the Mutation 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 the genotypes 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. If None (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:
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. If lambda_ 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.

Parameters:
• other (Tree) – The other tree to compare to.

• lambda (float) – The KC metric lambda parameter determining the relative weight of topology and branch length.

Returns:

The computed KC distance between this tree and other.

Return type:

float

path_length(u, v)[source]#

Returns the path length between two nodes (i.e., the number of edges between two nodes in this tree). 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.

See also the depth() method

Parameters:
• u (int) – The first node for path length computation.

• v (int) – The second node for path length computation.

Returns:

The number of edges between the two nodes.

Return type:

int

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 Shao and Sokal (1990) for details.

Returns:

The B1 balance index.

Return type:

float

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 Shao and Sokal (1990) for details.

Parameters:

base (int) – The base used for the logarithm in the Shannon entropy computation.

Returns:

The B2 balance index.

Return type:

float

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 Shao and Sokal (1990) for details.

Returns:

The Colless imbalance index.

Return type:

int

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 Shao and Sokal (1990) for details.

Returns:

The Sackin imbalance index.

Return type:

int

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 with t. Thus, tree.num_lineages(t) is equal to 0 for any t 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.

Parameters:

t (int) – The time to count lineages at.

Returns:

The number of lineages in the tree at time t.

Return type:

int

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 node u 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 node u. 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, node u 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 example tree.split_polytomies(sample_lists=True) will return a Tree created with sample_lists=True.

Returns:

A new tree with polytomies split into random bifurcations.

Return type:

tskit.Tree

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 large n.

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 the tree_sequence property of the returned Tree.

• 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 example tskit.Tree.generate_star(sample_lists=True) will return a Tree created with sample_lists=True.

Returns:

A star-shaped tree. Its corresponding TreeSequence is available via the tree_sequence attribute.

Return type:

Tree

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 the arity 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 the tree_sequence property of the returned Tree.

• 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 example tskit.Tree.generate_balanced(sample_lists=True) will return a Tree created with sample_lists=True.

Returns:

A balanced tree. Its corresponding TreeSequence is available via the tree_sequence attribute.

Return type:

Tree

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 the tree_sequence property of the returned Tree.

• 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 example tskit.Tree.generate_comb(sample_lists=True) will return a Tree created with sample_lists=True.

Returns:

A comb-shaped bifurcating tree. Its corresponding TreeSequence is available via the tree_sequence attribute.

Return type:

Tree

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 the tree_sequence property of the returned Tree.

• 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 example tskit.Tree.generate_comb(sample_lists=True) will return a Tree created with sample_lists=True.

Returns:

A random binary tree. Its corresponding TreeSequence is available via the tree_sequence attribute.

Return type:

Tree

#### 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 using tskit.load_text(), or loaded from a native binary file using tskit.load().

TreeSequences are immutable. To change the data held in a particular tree sequence, first get the table information as a TableCollection instance (using dump_tables()), edit those tables using the tables api, and create a new tree sequence using TableCollection.tree_sequence().

The trees() method iterates over all trees in a tree sequence, and the variants() method iterates over all sites and their genotypes.

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. The trees() method is the recommended way to efficiently iterate over the trees in a tree sequence.

Parameters:

**kwargs – Further arguments used as parameters when constructing the returned trees. For example ts.aslist(sample_lists=True) will result in a list of Tree instances created with sample_lists=True.

Returns:

A list of the trees in this tree sequence.

Return type:

list

dump(file_or_path, zlib_compression=False)[source]#

Writes the tree sequence to the specified path or file object.

Parameters:
• file_or_path (str) – The file object or path to write the TreeSequence to.

• zlib_compression (bool) – This parameter is deprecated and ignored.

property reference_sequence#

The ReferenceSequence associated with this TreeSequence if one is defined (see TreeSequence.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 calling ts.tables.table_name_map.

property tables#

Returns the tables underlying this tree sequence, intended for read-only access. See dump_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:

TableCollection

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:

TableCollection

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.

__str__()[source]#

Return a plain text summary of the contents of a tree sequence

_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:

int

The set of metadata schemas for the tables in this tree sequence.

Return type:

TableMetadataSchemas

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:

bool

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:

bool

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:

float

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:

float

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:

float

The decoded metadata for this TreeSequence.

Return type:

Any

The tskit.MetadataSchema for this TreeSequence.

Return type:

MetadataSchema

property time_units#

String describing the units of the time dimension for this TreeSequence.

Return type:

str

property num_edges#

Returns the number of edges in this tree sequence.

Returns:

The number of edges in this tree sequence.

Return type:

int

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:

int

property num_sites#

Returns the number of sites in this tree sequence.

Returns:

The number of sites in this tree sequence.

Return type:

int

property num_mutations#

Returns the number of mutations in this tree sequence.

Returns:

The number of mutations in this tree sequence.

Return type:

int

property num_individuals#

Returns the number of individuals in this tree sequence.

Returns:

The number of individuals in this tree sequence.

Return type:

int

property num_nodes#

Returns the number of nodes in this tree sequence.

Returns:

The number of nodes in this tree sequence.

Return type:

int

property num_provenances#

Returns the number of provenances in this tree sequence.

Returns:

The number of provenances in this tree sequence.

Return type:

int

property num_populations#

Returns the number of populations in this tree sequence.

Returns:

The number of populations in this tree sequence.

Return type:

int

property num_migrations#

Returns the number of migrations in this tree sequence.

Returns:

The number of migrations in this tree sequence.

Return type:

int

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:

float

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 Python reversed() 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 (see Tree.interval). The second, edges_out is a list of the edges that were just-removed to create the tree covering the interval (hence edges_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 each edges_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 both left and right equal to the sequence length).

• direction (int) – The direction of travel along the sequence for diffs. Must be one of FORWARD or REVERSE. (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:

collections.abc.Iterable

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 also Tree.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:
• position (float) – A genomic location.

• **kwargs – Further arguments used as parameters when constructing the returned Tree. For example ts.at(2.5, sample_lists=True) will result in a Tree created with sample_lists=True.

Returns:

A new instance of Tree positioned to cover the specified genomic location.

Return type:

Tree

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:
• index (int) – The index of the required tree.

• **kwargs – Further arguments used as parameters when constructing the returned Tree. For example ts.at_index(4, sample_lists=True) will result in a Tree created with sample_lists=True.

Returns:

A new instance of Tree positioned at the specified index.

Return type:

Tree

first(**kwargs)[source]#

Returns the first tree in this TreeSequence. To iterate over all trees in the sequence, use the trees() method.

Parameters:

**kwargs – Further arguments used as parameters when constructing the returned Tree. For example ts.first(sample_lists=True) will result in a Tree created with sample_lists=True.

Returns:

The first tree in this tree sequence.

Return type:
last(**kwargs)[source]#

Returns the last tree in this TreeSequence. To iterate over all trees in the sequence, use the trees() method.

Parameters:

**kwargs – Further arguments used as parameters when constructing the returned Tree. For example ts.first(sample_lists=True) will result in a Tree created with sample_lists=True.

Returns:

The last tree in this tree sequence.

Return type:
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 and tracked_samples parameters are passed to the Tree 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 the other 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 and right 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 haplotype h, the value of h[j] will therefore be the observed allelic state at site j.

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 the missing_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 the samples() 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) assume right 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:

collections.abc.Iterable

Raises:

TypeError if the missing_data_character or any of the alleles at a site are not a single ascii character.

Raises:

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) and right (exclusive) genomic positions in this tree sequence. Each returned Variant object has a site, a list of possible allelic states and an array of genotypes for the specified samples. The genotypes value is a numpy array containing indexes into the alleles 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 the alleles parameter. For example, if we set alleles=("A", "C", "G", "T"), this will map allele “A” to 0, “C” to 1 and so on (the ALLELES_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 the alleles tuple will end with the value None (note that this will be the case whether or not we specify a fixed mapping using the alleles parameter; see the Variant class for more details). Alternatively, if isolated_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) assume right 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 the Variant 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 length L where the first character is the genomic sequence at the start position in the genome (defaulting to 0) and the last character is the genomic sequence one position before the stop value (defaulting to the sequence_length of this tree sequence, which must have discrete_genome equal to True). By default L is therefore equal to the sequence_length, and a[j] is the nucleotide value at genomic position j.

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 the reference_sequence parameter to this method, or embedded within with the tree sequence itself via the TreeSequence.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 the missing_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 the reference_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 the random_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 https://github.com/tskit-dev/tskit/issues/1896 for more information.

See also the variants() iterator for site-centric access to sample genotypes and haplotypes() 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 the samples() 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:

collections.abc.Iterable

Raises:

ValueError if any genome coordinate in this tree sequence is not discrete, or if the reference_sequence is not of the correct length.

Raises:

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, the population attribute of their nodes, or tskit.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, the time attribute of their nodes or np.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 the location property of the k-th individual. The method only works if all individuals’ locations have the same length (which is n), and errors otherwise.

property individuals_flags#

Efficient access to the flags column in the Individual Table as a numpy array (dtype=np.uint32). Equivalent to ts.tables.individuals.flags (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property nodes_time#

Efficient access to the time column in the Node Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.nodes.time (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property nodes_flags#

Efficient access to the flags column in the Node Table as a numpy array (dtype=np.uint32). Equivalent to ts.tables.nodes.flags (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property nodes_population#

Efficient access to the population column in the Node Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.nodes.population (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property nodes_individual#

Efficient access to the individual column in the Node Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.nodes.individual (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property edges_left#

Efficient access to the left column in the Edge Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.edges.left (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property edges_right#

Efficient access to the right column in the Edge Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.edges.right (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property edges_parent#

Efficient access to the parent column in the Edge Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.edges.parent (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property edges_child#

Efficient access to the child column in the Edge Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.edges.child (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property sites_position#

Efficient access to the position column in the Site Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.sites.position (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property mutations_site#

Efficient access to the site column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.mutations.site (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property mutations_node#

Efficient access to the node column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.mutations.node (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property mutations_parent#

Efficient access to the parent column in the Mutation Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.mutations.parent (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property mutations_time#

Efficient access to the time column in the Mutation Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.mutations.time (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_left#

Efficient access to the left column in the Migration Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.migrations.left (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_right#

Efficient access to the right column in the Migration Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.migrations.right (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_node#

Efficient access to the node column in the Migration Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.migrations.node (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_source#

Efficient access to the source column in the Migration Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.migrations.source (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_dest#

Efficient access to the dest column in the Migration Table as a numpy array (dtype=np.int32). Equivalent to ts.tables.migrations.dest (but avoiding the full copy of the table data that accessing ts.tables currently entails).

property migrations_time#

Efficient access to the time column in the Migration Table as a numpy array (dtype=np.float64). Equivalent to ts.tables.migrations.time (but avoiding the full copy of the table data that accessing ts.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 to ts.tables.indexes.edge_insertion_order (but avoiding the full copy of the table data that accessing ts.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 to ts.tables.indexes.edge_removal_order (but avoiding the full copy of the table data that accessing ts.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:

Individual

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:

Node

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:

Edge

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:

Migration

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:

Mutation

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:

Site

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:

Population

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:
• population (int) – The population of interest. If None, do not filter samples by population.

• population_id (int) – Deprecated alias for population.

• time (float,tuple) – The time or time interval of interest. If None, do not filter samples by time.

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 in write_vcf().

Returns:

A VCF encoding of the variants in this tree sequence as a string.

Return type:

str

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 a ploidy 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 the individual_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 by msprime.sim_ancestry( )), this is not necessary, and the ploidy 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 sample j will be marked as missing using a “.”. If sample_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 corresponding Variant 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.

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 the alignments() 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 label f"n{u}", following the same convention as the write_nexus() and Tree.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, set wrap_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 https://github.com/tskit-dev/tskit/issues/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 in write_fasta().

Returns:

A FASTA encoding of the alignments in this tree sequence as a string.

Return type:

str

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 and include_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 label f"n{u}", following the same convention as the Tree.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 as Tree.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 setting include_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 the missing_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 https://github.com/tskit-dev/tskit/issues/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:

str

as_nexus(**kwargs)[source]#

Return the result of write_nexus() as a string. Keyword parameters are as defined in write_nexus().

Returns:

A nexus encoding of the alignments in this tree sequence as a string.

Return type:

str

to_macs()[source]#

Return a macs encoding of this tree sequence.

Returns:

The macs representation of this TreeSequence as a string.

Return type:

str

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. If map_nodes is true, also return a numpy array whose u-th element is the ID of the node in the simplified tree sequence that corresponds to node u in the original tree sequence, or tskit.NULL (-1) if u 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, or filter_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 the filter_individuals and filter_populations options are enabled). Nodes that are in the specified list of samples 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 of samples will have their tskit.NODE_IS_SAMPLE flag cleared. Note also that the order of the samples list is not meaningful when filter_nodes is False. In this case, the returned node mapping is always the identity mapping, such that a[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 the filter_nodes=False, filter_populations=False and filter_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. If True 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 calling tree_sequence.delete_sites([0, 1]).

Parameters:
• site_ids (list[int]) – A list of site IDs specifying the sites to remove.

• record_provenance (bool) – If True, add details of this operation to the provenance information of the returned tree sequence. (Default: True).

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, specify simplify=False.

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:

tskit.TreeSequence

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, specify simplify=False.

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:

tskit.TreeSequence

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 new sequence_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 to rtrim() followed by ltrim(). 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).

Returns a copy of this tree sequence in which we replace any edge (left, right, parent, child) in which node_time[child] < time < node_time[parent] with two edges (left, right, parent, u) and (left, right, u, child), where u is a newly added node for each intersecting edge.

If metadata, flags, or population 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 is tskit.NULL. Newly added have a default flags 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 to u. 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:

tskit.TreeSequence

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 with t. For each edge intersecting with t we create a new node with time equal to t, 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 for flags, population and metadata controlled by parameters to this function in the same way as split_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 associated time 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.

This method is implemented using the split_edges() and TableCollection.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:

tskit.TreeSequence

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 in nodes, only mutations whose node is in nodes, 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, see simplify().

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 (unless reorder_populations=False).

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:

tskit.TreeSequence

Returns an expanded tree sequence which contains the node-wise union of self and other, obtained by adding the non-shared portions of other onto self. The “shared” portions are specified using a map that specifies which nodes in other are equivalent to those in self: the node_mapping argument should be an array of length equal to the number of nodes in other and whose entries are the ID of the matching node in self, or tskit.NULL if there is no matching node. Those nodes in other that map to tskit.NULL will be added to self, along with:

1. Individuals whose nodes are new to self.

2. Edges whose parent or child are new to self.

3. Mutations whose nodes are new to self.

4. 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 in self.

• 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 and other on the equivalent nodes specified in node_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, node_labels=None, mutation_labels=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, 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). If None, 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)

• 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.

• 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 the Tree.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. If None (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. If None (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 is None, then plot up to the end of the last non-empty region of the tree sequence. The default value x_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, specify x_lim=[0, ts.sequence_length].

• y_axis (bool) – Should the plot have an Y axis line, showing time (or ranked node time if time_scale="rank". If None (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 (list) – A list of Y values at which to plot tickmarks ([] gives no tickmarks). If None, plot one tickmark for each unique node value.

• 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 (see size, above). Default: None

• max_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:

SVGString

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 at empty_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 at empty_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. If True, 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 the Tree.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:

str

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 function f is applied to the weights, giving a summary for each node in each tree. How this is then aggregated depends on mode:

“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 has k columns, and f takes a k-vector and returns an m-vector, then the output will be m-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 and f(np.sum(W, axis=0)) = 0), unless strict=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. If sample_sets is a list of k sets of samples, then f should be a function that takes an argument of length k and returns a one-dimensional array. The j-th element of the argument to f will be the number of samples in sample_sets[j] that lie below the node that f is being evaluated for. See general_stat() for more details.

Here is a contrived example: suppose that A and B are two sets of samples with nA and nB elements, respectively. Passing these as sample sets will give f an argument of length two, giving the number of samples in A and B below the node in question. So, if we define

def 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 returns np.array([pA, pB, pA * pB]), then the output would be a (num sites, 3) array, with the first two columns giving the allele frequencies in A and B, respectively.

Note

The summary function f should return zero when given both 0 and the sample size (i.e., f(0) = 0 and f(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 its diversity (see the note below).

Operates on k = 2 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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 the diversity of sample_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.

genetic_relatedness(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True, polarised=False, proportion=True)[source]#

Computes genetic relatedness between (and within) pairs of sets of nodes from sample_sets. Operates on k = 2 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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, polarised, and return value.

What is computed depends on mode:

“site”

Number of pairwise allelic matches in the window between two sample sets relative to the rest of the sample sets. To be precise, let m(u,v) denote the total number of alleles shared between nodes u and v, and let m(I,J) be the sum of m(u,v) over all nodes u in sample set I and v in sample set J. Let S and T be independently chosen sample sets. Then, for sample sets I and J, this computes E[m(I,J) - m(I,S) - m(J,T) + m(S,T)]. This can also be seen as the covariance of a quantitative trait determined by additive contributions from the genomes in each sample set. Let each allele be associated with an effect drawn from a N(0,1/2) distribution, and let the trait value of a sample set be the sum of its allele effects. Then, this computes the covariance between the trait values of two sample sets. For example, to compute covariance between the traits of diploid individuals, each sample set would be the pair of genomes of each individual; if proportion=True, this then corresponds to $$K_{c0}$$ in Speed & Balding (2014).

“branch”

Total area of branches in the window ancestral to pairs of samples in two sample sets relative to the rest of the sample sets. To be precise, let B(u,v) denote the total area of all branches ancestral to nodes u and v, and let B(I,J) be the sum of B(u,v) over all nodes u in sample set I and v in sample set J. Let S and T be two independently chosen sample sets. Then for sample sets I and J, this computes E[B(I,J) - B(I,S) - B(J,T) + B(S,T)].

“node”

For each node, the proportion of the window over which pairs of samples in two sample sets are descendants, relative to the rest of the sample sets. To be precise, for each node n, let N(u,v) denote the proportion of the window over which samples u and v are descendants of n, and let and let N(I,J) be the sum of N(u,v) over all nodes u in sample set I and v in sample set J. Let S and T be two independently chosen sample sets. Then for sample sets I and J, this computes E[N(I,J) - N(I,S) - N(J,T) + N(S,T)].

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). Has no effect if proportion is True.

• proportion (bool) – Defaults to True. Whether to divide the result by segregating_sites(), called with the same windows, mode, and span_normalise. Note that this counts sites that are segregating between any of the samples of any of the sample sets (rather than segregating between all of the samples of the tree sequence).

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.

trait_covariance(W, windows=None, mode='site', span_normalise=True)[source]#

Computes the mean squared covariances between each of the columns of W (the “phenotypes”) and inheritance along the tree sequence. See the statistics interface section for details on windows, mode, span normalise, and return value. Operates on all samples in the tree sequence.

Concretely, if g is a binary vector that indicates inheritance from an allele, branch, or node and w is a column of W, normalised to have mean zero, then the covariance of g and w is $$\sum_i g_i w_i$$, the sum of the weights corresponding to entries of g that are 1. Since weights sum to zero, this is also equal to the sum of weights whose entries of g are 0. So, $$cov(g,w)^2 = ((\sum_i g_i w_i)^2 + (\sum_i (1-g_i) w_i)^2)/2$$.

What is computed depends on mode:

“site”

The sum of squared covariances between presence/absence of each allele and phenotypes, divided by length of the window (if span_normalise=True). This is computed as sum_a (sum(w[a])^2 / 2), where w is a column of W with the average subtracted off, and w[a] is the sum of all entries of w corresponding to samples carrying allele “a”, and the first sum is over all alleles.

“branch”

The sum of squared covariances between the split induced by each branch and phenotypes, multiplied by branch length, averaged across trees in the window. This is computed as above: a branch with total weight w[b] below b contributes (branch length) * w[b]^2 to the total value for a tree. (Since the sum of w is zero, the total weight below b and not below b are equal, canceling the factor of 2 above.)

“node”

For each node, the squared covariance between the property of inheriting from this node and phenotypes, computed as in “branch”.

Parameters:
• W (numpy.ndarray) – An array of values with one row for each sample and one column for each “phenotype”.

• 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 windows=None and W is a single column, a numpy scalar is returned.

trait_correlation(W, windows=None, mode='site', span_normalise=True)[source]#

Computes the mean squared correlations between each of the columns of W (the “phenotypes”) and inheritance along the tree sequence. See the statistics interface section for details on windows, mode, span normalise, and return value. Operates on all samples in the tree sequence.

This is computed as squared covariance in trait_covariance, but divided by $$p (1-p)$$, where p is the proportion of samples inheriting from the allele, branch, or node in question.

What is computed depends on mode:

“site”

The sum of squared correlations between presence/absence of each allele and phenotypes, divided by length of the window (if span_normalise=True). This is computed as the trait_covariance divided by the variance of the relevant column of W and by $$p * (1 - p)$$, where $$p$$ is the allele frequency.

“branch”

The sum of squared correlations between the split induced by each branch and phenotypes, multiplied by branch length, averaged across trees in the window. This is computed as the trait_covariance, divided by the variance of the column of w and by $$p * (1 - p)$$, where $$p$$ is the proportion of the samples lying below the branch.

“node”

For each node, the squared correlation between the property of inheriting from this node and phenotypes, computed as in “branch”.

Note that above we divide by the sample variance, which for a vector x of length n is np.var(x) * n / (n-1).

Parameters:
• W (numpy.ndarray) – An array of values with one row for each sample and one column for each “phenotype”. Each column must have positive standard deviation.

• 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 windows=None and W is a single column, a numpy scalar is returned.

trait_regression(*args, **kwargs)[source]#

Deprecated synonym for trait_linear_model.

trait_linear_model(W, Z=None, windows=None, mode='site', span_normalise=True)[source]#

Finds the relationship between trait and genotype after accounting for covariates. Concretely, for each trait w (i.e., each column of W), this does a least-squares fit of the linear model $$w \sim g + Z$$, where $$g$$ is inheritance in the tree sequence (e.g., genotype) and the columns of $$Z$$ are covariates, and returns the squared coefficient of $$g$$ in this linear model. See the statistics interface section for details on windows, mode, span normalise, and return value. Operates on all samples in the tree sequence.

To do this, if g is a binary vector that indicates inheritance from an allele, branch, or node and w is a column of W, there are $$k$$ columns of $$Z$$, and the $$k+2$$-vector $$b$$ minimises $$\sum_i (w_i - b_0 - b_1 g_i - b_2 z_{2,i} - ... b_{k+2} z_{k+2,i})^2$$ then this returns the number $$b_1^2$$. If $$g$$ lies in the linear span of the columns of $$Z$$, then $$b_1$$ is set to 0. To fit the linear model without covariates (only the intercept), set Z = None.

What is computed depends on mode:

“site”

Computes the sum of $$b_1^2/2$$ for each allele in the window, as above with $$g$$ indicating presence/absence of the allele, then divided by the length of the window if span_normalise=True. (For biallelic loci, this number is the same for both alleles, and so summing over each cancels the factor of two.)

“branch”

The squared coefficient $$b_1^2$$, computed for the split induced by each branch (i.e., with $$g$$ indicating inheritance from that branch), multiplied by branch length and tree span, summed over all trees in the window, and divided by the length of the window if span_normalise=True.

“node”

For each node, the squared coefficient $$b_1^2$$, computed for the property of inheriting from this node, as in “branch”.

Parameters:
• W (numpy.ndarray) – An array of values with one row for each sample and one column for each “phenotype”.

• Z (numpy.ndarray) – An array of values with one row for each sample and one column for each “covariate”, or None. Columns of Z must be linearly independent.

• 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 windows=None and W is a single column, a numpy scalar is returned.

segregating_sites(sample_sets=None, windows=None, mode='site', span_normalise=True)[source]#

Computes the density of segregating sites for each of the sets of nodes from sample_sets, and related quantities. 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.

What is computed depends on mode. For a sample set A, computes:

“site”

The sum over sites of the number of alleles found in A at each site minus one, per unit of chromosome length. If all sites have at most two alleles, this is the density of sites that are polymorphic in A. To get the number of segregating minor alleles per window, pass span_normalise=False.

“branch”

The total length of all branches in the tree subtended by the samples in A, averaged across the window.

“node”

The proportion of the window on which the node is ancestral to some, but not all, of the samples in A.

Parameters:
• sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes to compute the statistic with.

• 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 sample set and windows=None, a numpy scalar is returned.

allele_frequency_spectrum(sample_sets=None, windows=None, mode='site', span_normalise=True, polarised=False)[source]#

Computes the allele frequency spectrum (AFS) in windows across the genome for with respect to the specified sample_sets. See the statistics interface section for details on sample sets, windows, mode, span normalise, polarised, and return value. and see Allele frequency spectra for examples of how to use this method.

Similar to other windowed stats, the first dimension in the returned array corresponds to windows, such that result[i] is the AFS in the ith window. The AFS in each window is a k-dimensional numpy array, where k is the number of input sample sets, such that result[i, j0, j1, ...] is the value associated with frequency j0 in sample_sets[0], j1 in sample_sets[1], etc, in window i. From here, we will assume that afs corresponds to the result in a single window, i.e., afs = result[i].

If a single sample set is specified, the allele frequency spectrum within this set is returned, such that afs[j] is the value associated with frequency j. Thus, singletons are counted in afs[1], doubletons in afs[2], and so on. The zeroth entry counts alleles or branches not seen in the samples but that are polymorphic among the rest of the samples of the tree sequence; likewise, the last entry counts alleles fixed in the sample set but polymorphic in the entire set of samples. Please see the Zeroth and final entries in the AFS for an illustration.

Warning

Please note that singletons are not counted in the initial entry in each AFS array (i.e., afs[0]), but in afs[1].

If sample_sets is None (the default), the allele frequency spectrum for all samples in the tree sequence is returned.

If more than one sample set is specified, the joint allele frequency spectrum within windows is returned. For example, if we set sample_sets = [S0, S1], then afs[1, 2] counts the number of sites that are singletons within S0 and doubletons in S1. The dimensions of the output array will be [num_windows] + [1 + len(S) for S in sample_sets].

If polarised is False (the default) the AFS will be folded, so that the counts do not depend on knowing which allele is ancestral. If folded, the frequency spectrum for a single sample set S has afs[j] = 0 for all j > len(S) / 2, so that alleles at frequency j and len(S) - j both add to the same entry. If there is more than one sample set, the returned array is “lower triangular” in a similar way. For more details, especially about handling of multiallelic sites, see Allele frequency spectrum.

What is computed depends on mode:

“site”

The number of alleles at a given frequency within the specified sample sets for each window, per unit of sequence length. To obtain the total number of alleles, set span_normalise to False.

“branch”

The total length of branches in the trees subtended by subsets of the specified sample sets, per unit of sequence length. To obtain the total, set span_normalise to False.

“node”

Not supported for this method (raises a ValueError).

For example, suppose that S0 is a list of 5 sample IDs, and S1 is a list of 3 other sample IDs. Then afs = ts.allele_frequency_spectrum([S0, S1], mode=”site”, span_normalise=False) will be a 5x3 numpy array, and if there are six alleles that are present in only one sample of S0 but two samples of S1, then afs[1,2] will be equal to 6. Similarly, branch_afs = ts.allele_frequency_spectrum([S0, S1], mode=”branch”, span_normalise=False) will also be a 5x3 array, and branch_afs[1,2] will be the total area (i.e., length times span) of all branches that are above exactly one sample of S0 and two samples of S1.

Parameters:
• sample_sets (list) – A list of lists of Node IDs, specifying the groups of samples to compute the joint allele frequency

• windows (list) – An increasing list of breakpoints between windows along the genome.

• 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 (k + 1) dimensional numpy array, where k is the number of sample sets specified. If there is one sample set and windows=None, a 1 dimensional array is returned.

Tajimas_D(sample_sets=None, windows=None, mode='site')[source]#

Computes Tajima’s D of sets of nodes from sample_sets in windows. 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, and return value. Operates on k = 1 sample sets at a time. For a sample set X of n nodes, if and T is the mean number of pairwise differing sites in X and S is the number of sites segregating in X (computed with diversity and segregating sites, respectively, both not span normalised), then Tajima’s D is

D = (T - S / h) / sqrt(a * S + (b / c) * S * (S - 1))
h = 1 + 1 / 2 + ... + 1 / (n - 1)
g = 1 + 1 / 2**2 + ... + 1 / (n - 1) ** 2
a = (n + 1) / (3 * (n - 1) * h) - 1 / h**2
b = 2 * (n**2 + n + 3) / (9 * n * (n - 1)) - (n + 2) / (h * n) + g / h**2
c = h**2 + g


What is computed for diversity and divergence depends on mode; see those functions for more details.

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”).

Returns:

A ndarray with shape equal to (num windows, num statistics). If there is one sample set and windows=None, a numpy scalar is returned.

Fst(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes “windowed” Fst between pairs of sets of nodes from sample_sets. Operates on k = 2 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

For sample sets X and Y, if d(X, Y) is the divergence between X and Y, and d(X) is the diversity of X, then what is computed is

Fst = 1 - 2 * (d(X) + d(Y)) / (d(X) + 2 * d(X, Y) + d(Y))


What is computed for diversity and divergence depends on mode; see those functions for more details.

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.

• 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.

Y3(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes the ‘Y’ statistic between triples of sets of nodes from sample_sets. Operates on k = 3 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

What is computed depends on mode. Each is an average across every combination of trios of samples (a, b, c), one chosen from each sample set:

“site”

The average density of sites at which a differs from b and c, per unit of chromosome length.

“branch”

The average length of all branches that separate a from b and c (in units of time).

“node”

For each node, the average proportion of the window on which a inherits from that node but b and c do not, or vice-versa.

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 3-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 triple of sample sets and windows=None, a numpy scalar is returned.

Y2(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes the ‘Y2’ statistic between pairs of sets of nodes from sample_sets. Operates on k = 2 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

What is computed depends on mode. Each is computed exactly as Y3, except that the average is across every possible trio of samples (a, b1, b2), where a is chosen from the first sample set, and b1, b2 are chosen (without replacement) from the second sample set. See Y3 for more details.

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.

Y1(sample_sets, windows=None, mode='site', span_normalise=True)[source]#

Computes the ‘Y1’ statistic within each of the sets of nodes given by sample_sets. 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. Operates on k = 1 sample set at a time.

What is computed depends on mode. Each is computed exactly as Y3, except that the average is across every possible trio of samples samples (a1, a2, a3) all chosen without replacement from the same sample set. See Y3 for more details.

Parameters:
• sample_sets (list) – A list of lists of Node IDs, specifying the groups of nodes to compute the statistic with.

• 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 sample set and windows=None, a numpy scalar is returned.

f4(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes Patterson’s f4 statistic between four groups of nodes from sample_sets. Operates on k = 4 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

What is computed depends on mode. Each is an average across every possible combination of four samples (a, b; c, d), one chosen from each sample set:

“site”

The average density of sites at which a and c agree but differs from b and d, minus the average density of sites at which a and d agree but differs from b and c, per unit of chromosome length.

“branch”

The average length of all branches that separate a and c from b and d, minus the average length of all branches that separate a and d from b and c (in units of time).

“node”

For each node, the average proportion of the window on which a and c inherit from that node but b and d do not, or vice-versa, minus the average proportion of the window on which a and d inherit from that node but b and c do not, or vice-versa.

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 4-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 are four sample sets and windows=None, a numpy scalar is returned.

f3(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes Patterson’s f3 statistic between three groups of nodes from sample_sets. Note that the order of the arguments of f3 differs across the literature: here, f3([A, B, C]) for sample sets A, B, and C will estimate $$f_3(A; B, C) = \mathbb{E}[(p_A - p_B) (p_A - p_C)]$$, where $$p_A$$ is the allele frequency in A. When used as a test for admixture, the putatively admixed population is usually placed as population A (see Peter (2016) for more discussion).

Operates on k = 3 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

What is computed depends on mode. Each works exactly as f4, except the average is across every possible combination of four samples (a1, b; a2, c) where a1 and a2 have both been chosen (without replacement) from the first sample set. See f4 for more details.

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 3-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 are three sample sets and windows=None, a numpy scalar is returned.

f2(sample_sets, indexes=None, windows=None, mode='site', span_normalise=True)[source]#

Computes Patterson’s f2 statistic between two groups of nodes from sample_sets. Operates on k = 2 sample sets at a time; please see the multi-way statistics section for details on how the sample_sets and indexes 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.

What is computed depends on mode. Each works exactly as f4, except the average is across every possible combination of four samples (a1, b1; a2, b2) where a1 and a2 have both been chosen (without replacement) from the first sample set, and b1 and b2 have both been chosen (without replacement) from the second sample set. See f4 for more details.

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.

mean_descendants(sample_sets)[source]#

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. The output is an array, C[node, j], which reports the total span of all genomes in sample_sets[j] that inherit from node, divided by the total span of the genome on which node is an ancestor to any sample in the tree sequence.

Warning

The interface for this method is preliminary and may be subject to backwards incompatible changes in the near future. The long-term stable API for this method will be consistent with other Statistics. In particular, the normalization by proportion of the genome that node is an ancestor to anyone may not be the default behaviour in the future.

Parameters:

sample_sets (list) – A list of lists of node IDs.

Returns:

An array with dimensions (number of nodes in the tree sequence, number of reference 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.

The GNN proportions for a focal node in a single tree are given by first finding the most recent common ancestral node $$a$$ between the focal node and any other node present in the reference sets. The GNN proportion for a specific reference set, $$S$$ is the number of nodes in $$S$$ that descend from $$a$$, as a proportion of the total number of descendant nodes in any of the reference sets.

For example, consider a case with 2 sample sets, $$S_1$$ and $$S_2$$. For a given tree, $$a$$ is the node that includes at least one descendant in $$S_1$$ or $$S_2$$ (not including the focal node). If the descendants of $$a$$ include some nodes in $$S_1$$ but no nodes in $$S_2$$, then the GNN proportions for that tree will be 100% $$S_1$$ and 0% $$S_2$$, or $$[1.0, 0.0]$$.

For a given focal node, the GNN proportions returned by this function are an average of the GNNs for each tree, weighted by the genomic distance spanned by that tree.

For an precise mathematical definition of GNN, see https://doi.org/10.1101/458067

Note

The reference sets need not include all the samples, hence the most recent common ancestral node of the reference sets, $$a$$, need not be the immediate ancestor of the focal node. If the reference sets only comprise sequences from relatively distant individuals, the GNN statistic may end up as a measure of comparatively distant ancestry, even for tree sequences that contain many closely related individuals.

Warning

The interface for this method is preliminary and may be subject to backwards incompatible changes in the near future. The long-term stable API for this method will be consistent with other Statistics.

Parameters:
• focal (list) – A list of $$n$$ nodes whose GNNs should be calculated.

• sample_sets (list) – A list of $$m$$ lists of node IDs.

Returns:

An $$n$$ by $$m$$ array of focal nodes by GNN proportions. Every focal node corresponds to a row. The numbers in each row corresponding to the GNN proportion for each of the passed-in reference sets. Rows therefore sum to one.

Return type:

numpy.ndarray

kc_distance(other, lambda_=0.0)[source]#

Returns the average Tree.kc_distance() between pairs of trees along the sequence whose intervals overlap. The average is weighted by the fraction of the sequence on which each pair of trees overlap.

Parameters:
• other (TreeSequence) – The other tree sequence to compare to.

• lambda (float) – The KC metric lambda parameter determining the relative weight of topology and branch length.

Returns:

The computed KC distance between this tree sequence and other.

Return type:

float

count_topologies(sample_sets=None)[source]#

Returns a generator that produces the same distribution of topologies as Tree.count_topologies() but sequentially for every tree in a tree sequence. For use on a tree sequence this method is much faster than computing the result independently per tree.

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.

Return type:
Raises:

ValueError – If nodes in sample_sets are invalid or are internal samples.

ibd_segments(*, within=None, between=None, max_time=None, min_span=None, store_pairs=None, store_segments=None)[source]#

Finds pairs of samples that are identical by descent (IBD) and returns the result as an IdentitySegments instance. The information stored in this object is controlled by the store_pairs and store_segments parameters. By default only total counts and other statistics of the IBD segments are stored (i.e., store_pairs=False), since storing pairs and segments has a substantial CPU and memory overhead. Please see the Identity by descent section for more details on how to access the information stored in the IdentitySegments.

If within is specified, only IBD segments for pairs of nodes within that set will be recorded. If between is specified, only IBD segments from pairs that are in one or other of the specified sample sets will be reported. Note that within and between are mutually exclusive.

A pair of nodes (u, v) has an IBD segment with a left and right coordinate [left, right) and ancestral node a iff the most recent common ancestor of the segment [left, right) in nodes u and v is a, and the segment has been inherited along the same genealogical path (ie. it has not been broken by recombination). The segments returned are the longest possible ones.

Note that this definition is purely genealogical — allelic states are not considered here. If used without time or length thresholds, the segments returned for a given pair will partition the span of the contig represented by the tree sequence.

Parameters:
• within (list) – A list of node IDs defining set of nodes that we finding IBD segments for. If not specified, this defaults to all samples in the tree sequence.

• between (list[list]) – A list of lists of sample node IDs. Given two sample sets A and B, only IBD segments will be returned such that one of the samples is an element of A and the other is an element of B. Cannot be specified with within.

• max_time (float) – Only segments inherited from common ancestors whose node times are more recent than the specified time will be returned. Specifying a maximum time is strongly recommended when working with large tree sequences.

• min_span (float) – Only segments in which the difference between the right and left genome coordinates (i.e., the span of the segment) is greater than this value will be included. (Default=0)

• store_pairs (bool) – If True store information separately for each pair of samples (a, b) that are found to be IBD. Otherwise store summary information about all sample apirs. (Default=False)

• store_segments (bool) – If True store each IBD segment (left, right, c) and associate it with the corresponding sample pair (a, b). If True, implies store_pairs. (Default=False).

Returns:

An IdentitySegments object containing the recorded IBD information.

Return type:

IdentitySegments

pairwise_diversity(samples=None)[source]#

Returns the pairwise nucleotide site diversity, the average number of sites that differ between a every possible pair of distinct samples. If samples is specified, calculate the diversity within this set.

Deprecated since version 0.2.0: please use diversity() instead. Since version 0.2.0 the error semantics have also changed slightly. It is no longer an error when there is one sample and a tskit.LibraryError is raised when non-sample IDs are provided rather than a ValueError. It is also no longer an error to compute pairwise diversity at sites with multiple mutations.

Parameters:

samples (list) – The set of samples within which we calculate the diversity. If None, calculate diversity within the entire sample.

Returns:

The pairwise nucleotide site diversity.

Return type:

float

### Simple container classes#

#### The Individual class#

class tskit.Individual[source]#

An individual in a tree sequence. Since nodes correspond to genomes, individuals are associated with a collection of nodes (e.g., two nodes per diploid). See Nodes, Genomes, or Individuals? for more discussion of this distinction.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

id#

The integer ID of this individual. Varies from 0 to TreeSequence.num_individuals - 1.

flags#

The bitwise flags for this individual.

location#

The spatial location of this individual as a numpy array. The location is an empty array if no spatial location is defined.

parents#

The parent individual ids of this individual as a numpy array. The parents is an empty array if no parents are defined.

nodes#

The IDs of the nodes that are associated with this individual as a numpy array (dtype=np.int32). If no nodes are associated with the individual this array will be empty.

The metadata for this individual, decoded if a schema applies.

#### The Node class#

class tskit.Node[source]#

A node in a tree sequence, corresponding to a single genome. The time and population are attributes of the Node, rather than the Individual, as discussed in Nodes, Genomes, or Individuals?.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

id#

The integer ID of this node. Varies from 0 to TreeSequence.num_nodes - 1.

flags#

The bitwise flags for this node.

time#

The birth time of this node.

population#

The integer ID of the population that this node was born in.

individual#

The integer ID of the individual that this node was a part of.

The metadata for this node, decoded if a schema applies.

is_sample()[source]#

Returns True if this node is a sample. This value is derived from the flag variable.

Return type:

bool

#### The Edge class#

class tskit.Edge[source]#

An edge in a tree sequence.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

id#

The integer ID of this edge. Varies from 0 to TreeSequence.num_edges - 1.

left#

The left coordinate of this edge.

right#

The right coordinate of this edge.

parent#

The integer ID of the parent node for this edge. To obtain further information about a node with a given ID, use TreeSequence.node().

child#

The integer ID of the child node for this edge. To obtain further information about a node with a given ID, use TreeSequence.node().

The metadata for this edge, decoded if a schema applies.

property span#

Returns the span of this edge, i.e., the right position minus the left position

Returns:

The span of this edge.

Return type:

float

#### The Site class#

class tskit.Site[source]#

A site in a tree sequence.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

id#

The integer ID of this site. Varies from 0 to TreeSequence.num_sites - 1.

position#

The floating point location of this site in genome coordinates. Ranges from 0 (inclusive) to TreeSequence.sequence_length (exclusive).

ancestral_state#

The ancestral state at this site (i.e., the state inherited by nodes, unless mutations occur).

mutations#

The list of mutations at this site. Mutations within a site are returned in the order they are specified in the underlying MutationTable.

The metadata for this site, decoded if a schema applies.

property alleles#

Return the set of all the alleles defined at this site

Note

This deliberately returns an (unordered) set of the possible allelic states (as defined by the site’s ancestral allele and its associated mutations). If you wish to obtain an (ordered) list of alleles, for example to translate the numeric genotypes at a site into allelic states, you should instead use .alleles attribute of the Variant class, which unlike this attribute includes None as a state when there is missing data at a site.

#### The Mutation class#

class tskit.Mutation[source]#

A mutation in a tree sequence.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

id#

The integer ID of this mutation. Varies from 0 to TreeSequence.num_mutations - 1.

Modifying the attributes in this class will have no effect on the underlying tree sequence data.

site#

The integer ID of the site that this mutation occurs at. To obtain further information about a site with a given ID use TreeSequence.site().

node#

The integer ID of the first node that inherits this mutation. To obtain further information about a node with a given ID, use TreeSequence.node().

time#

The occurrence time of this mutation.

derived_state#

The derived state for this mutation. This is the state inherited by nodes in the subtree rooted at this mutation’s node, unless another mutation occurs.

parent#

The integer ID of this mutation’s parent mutation. When multiple mutations occur at a site along a path in the tree, mutations must record the mutation that is immediately above them. If the mutation does not have a parent, this is equal to the NULL (-1). To obtain further information about a mutation with a given ID, use TreeSequence.mutation()`.