From 118416e40601b3fb02a45441743ff8157086403e Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 16:18:42 -0700 Subject: [PATCH 01/32] starting to refactor away a gctree python package --- README.md | 12 +- bin/gctree.py | 1079 ----------------------------- environment.yml | 17 + gctree/cli.py | 662 ++++++++++++++++++ gctree/gctree.py | 732 +++++++++++++++++++ {bin => gctree}/mutation_model.py | 0 {bin => gctree}/phylip_parse.py | 0 setup.py | 36 + 8 files changed, 1453 insertions(+), 1085 deletions(-) delete mode 100755 bin/gctree.py create mode 100644 environment.yml create mode 100644 gctree/cli.py create mode 100755 gctree/gctree.py rename {bin => gctree}/mutation_model.py (100%) rename {bin => gctree}/phylip_parse.py (100%) create mode 100644 setup.py diff --git a/README.md b/README.md index 596a13d9..5f178129 100644 --- a/README.md +++ b/README.md @@ -15,17 +15,17 @@ All commands should be issued from within the gctree repo directory. ### Linux/MacOS 0. For installing dependencies, [conda](https://conda.io/docs/) environment management is recommended. First install conda or miniconda. -1. Create a python 3.7 conda environment (named gctree in this example): +1. Create a python 3 conda environment called gctree from the included environment file: ```bash - conda create --name gctree -c bioconda -c etetoolkit -c conda-forge -c cswarth python=3.7 ete3 biopython matplotlib pandas scipy scons seaborn nestly phylip seqmagick + conda env create -f environment.yml ``` -2. Activate the environment: +2. Install the gctree package locally (with `-e` flag for editable, if developing) ```bash - conda activate gctree + pip install -e . ``` -3. Install jellyfish for faster string comparison (optional) +3. Activate the environment: ```bash - conda install -c conda-forge jellyfish + conda activate gctree ``` ## QUICK START diff --git a/bin/gctree.py b/bin/gctree.py deleted file mode 100755 index a22e467f..00000000 --- a/bin/gctree.py +++ /dev/null @@ -1,1079 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -''' -This module contains classes for simulation and inference for a binary -branching process with mutation in which the tree is collapsed to nodes that -count the number of clonal leaves of each type''' - -import phylip_parse -import numpy as np -import warnings -import random -import pandas as pd -import os -from scipy.special import logsumexp -from scipy.special import softmax -from scipy.optimize import minimize, check_grad -from itertools import cycle -from scipy.stats import poisson -from ete3 import TreeNode, NodeStyle, TreeStyle, TextFace, add_face_to_node, CircleFace, PieChartFace, faces, SVG_COLORS -from Bio.Seq import Seq -from Bio.SeqRecord import SeqRecord -from Bio import AlignIO -from Bio.Phylo.TreeConstruction import MultipleSeqAlignment -from matplotlib import pyplot as plt - -import pickle -from functools import lru_cache -from utils import hamming_distance -import selection_utils -from mutation_model import MutationModel - -np.seterr(all='raise') - - -class LeavesAndClades(): - '''This is a base class for simulating, and computing likelihood for, an - infinite type branching process with branching probability p, mutation - probability q, and we collapse mutant clades off the root type and consider - just the number of clone leaves, c, and mutant clades, m. - - /\ - /\ ^ (3) - /\ ==> / \\ - /\\ - ^ - ''' - def __init__(self, params=None, c=None, m=None): - '''initialize with branching probability p and mutation probability q, - both in the unit interval''' - if params is not None: - p, q = params - if not (0 <= p <= 1 and 0 <= q <= 1): - raise ValueError('p and q must be in the unit interval: ' - f'p = {p}, q = {q}') - self.params = params - if c is not None or m is not None: - if not (c >= 0) and (m >= 0) and (c+m > 0): - raise ValueError('c and m must be nonnegative integers ' - 'summing greater than zero: ' - f'c = {c}, m = {m}') - self.c = c - self.m = m - - def simulate(self): - '''simulate the number of clone leaves and mutant clades off a root - node''' - if self.params[0] >= .5: - warnings.warn(f'p = {self.p} is not subcritical, tree simulations' - ' not garanteed to terminate') - if self.params is None: - raise ValueError('params must be defined for simulation\n') - - # let's track the tree in breadth first order, listing number of clonal - # and mutant descendants of each node mutant clades terminate in this - # view - cumsum_clones = 0 - len_tree = 0 - self.c = 0 - self.m = 0 - # while termination condition not met - while cumsum_clones > len_tree - 1: - if random.random() < self.params[0]: - mutants = sum(random.random() < self.params[1] - for child in range(2)) - clones = 2 - mutants - self.m += mutants - else: - mutants = 0 - clones = 0 - self.c += 1 - cumsum_clones += clones - len_tree += 1 - assert cumsum_clones == len_tree - 1 - - @staticmethod - @lru_cache(maxsize=None) - def logf(c, m, *params): - ''' - Log-probability of getting c leaves that are clones of the root and m mutant - clades off the root lineage, given branching probability p and mutation - probability q. AKA the spaceship distribution. Also returns gradient wrt - params (p, q). Computed by dynamic programming.''' - p, q = params - if c==m==0 or (c==0 and m==1): - logf_result = -np.inf - dlogfdp_result = 0 - dlogfdq_result = 0 - elif c==1 and m==0: - logf_result = np.log(1 - p) - dlogfdp_result = -1 / (1 - p) - dlogfdq_result = 0 - elif c==0 and m==2: - logf_result = np.log(p) + 2 * np.log(q) - dlogfdp_result = 1 / p - dlogfdq_result = 2 / q - else: - if m >= 1: - neighbor_logf, (neighbor_dlogfdp, neighbor_dlogfdq) = LeavesAndClades.logf(c, - m - 1, - *params) - logf_result = (np.log(2) + np.log(p) + np.log(q) + np.log(1-q) - + neighbor_logf) - dlogfdp_result = 1 / p + neighbor_dlogfdp - dlogfdq_result = 1 / q - 1 / (1 - q) + neighbor_dlogfdq - else: - logf_result = -np.inf - dlogfdp_result = 0. - dlogfdq_result = 0. - logg_array = [logf_result] - dloggdp_array = [dlogfdp_result] - dloggdq_array = [dlogfdq_result] - for cx in range(c+1): - for mx in range(m+1): - if (not (cx==0 and mx==0)) and (not (cx==c and mx==m)): - (neighbor1_logf, - (neighbor1_dlogfdp, - neighbor1_dlogfdq)) = LeavesAndClades.logf(cx, mx, *params) - (neighbor2_logf, - (neighbor2_dlogfdp, - neighbor2_dlogfdq)) = LeavesAndClades.logf(c - cx, m - mx, *params) - logg = (np.log(p) + 2 * np.log(1 - q) + neighbor1_logf + - + neighbor2_logf) - dloggdp = 1 / p + neighbor1_dlogfdp + neighbor2_dlogfdp - dloggdq = (- 2 / (1 - q) - + neighbor1_dlogfdq + neighbor2_dlogfdq) - logg_array.append(logg) - dloggdp_array.append(dloggdp) - dloggdq_array.append(dloggdq) - logf_result = logsumexp(logg_array) - softmax_logg_array = softmax(logg_array) - dlogfdp_result = np.multiply(softmax_logg_array, dloggdp_array).sum() - dlogfdq_result = np.multiply(softmax_logg_array, dloggdq_array).sum() - - return (logf_result, np.array([dlogfdp_result, dlogfdq_result])) - - @staticmethod - def build_logf_cache(c_max, m_max, *params): - ''' build up the lru_cache from the bottom to avoid recursion depth - issues''' - LeavesAndClades.logf.cache_clear() - print(f'building likelihood cache for parameters {params}') - for c in range(c_max + 1): - for m in range(m_max + 1): - LeavesAndClades.logf(c, m, *params) - - - -class CollapsedTree(LeavesAndClades): - ''' - Here's a derived class for a collapsed tree, where we recurse into the - mutant clades - (4) - / | \\ - (3)(1)(2) - | \\ - (2) (1) - ''' - def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, - allow_repeats=False): - ''' - For intialization, either params or tree (or both) must be provided - params: offspring distribution parameters - tree: ete tree with frequency node feature. If uncollapsed, it will be - collapsed - frame: tranlation frame, with default None, no tranlation attempted - ''' - LeavesAndClades.__init__(self, params=params) - if frame is not None and frame not in (1, 2, 3): - raise RuntimeError('frame must be 1, 2, 3, or None') - self.frame = frame - - if collapse_syn is True: - tree.dist = 0 # no branch above root - for node in tree.iter_descendants(): - aa = Seq(node.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() - aa_parent = Seq(node.up.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() - node.dist = hamming_distance(aa, aa_parent) - - if tree is not None: - self.tree = tree.copy() - # remove unobserved internal unifurcations - for node in self.tree.iter_descendants(): - parent = node.up - if node.frequency == 0 and len(node.children) == 1: - node.delete(prevent_nondicotomic=False) - node.children[0].dist = hamming_distance(node.children[0].sequence, parent.sequence) - - # iterate over the tree below root and collapse edges of zero length - # if the node is a leaf and it's parent has nonzero frequency we combine taxa names to a set - # this acommodates bootstrap samples that result in repeated genotypes - observed_genotypes = set((leaf.name for leaf in self.tree)) - observed_genotypes.add(self.tree.name) - for node in self.tree.get_descendants(strategy='postorder'): - if node.dist == 0: - node.up.frequency += node.frequency - node_set = set([node.name]) if isinstance(node.name, str) else set(node.name) - node_up_set = set([node.up.name]) if isinstance(node.up.name, str) else set(node.up.name) - if node_up_set < observed_genotypes: - if node_set < observed_genotypes: - node.up.name = tuple(node_set | node_up_set) - if len(node.up.name) == 1: - node.up.name = node.up.name[0] - elif node_set < observed_genotypes: - node.up.name = tuple(node_set) - if len(node.up.name) == 1: - node.up.name = node.up.name[0] - node.delete(prevent_nondicotomic=False) - - final_observed_genotypes = set([name for node in self.tree.traverse() if node.frequency > 0 or node == self.tree for name in ((node.name,) if isinstance(node.name, str) else node.name)]) - if final_observed_genotypes != observed_genotypes: - raise RuntimeError(f'observed genotypes don\'t match after collapse\n\tbefore: {observed_genotypes}\n\tafter: {final_observed_genotypes}\n\tsymmetric diff: {observed_genotypes ^ final_observed_genotypes}') - assert sum(node.frequency for node in tree.traverse()) == sum(node.frequency for node in self.tree.traverse()) - - rep_seq = sum(node.frequency > 0 for node in self.tree.traverse()) - len(set([node.sequence for node in self.tree.traverse() if node.frequency > 0])) - if not allow_repeats and rep_seq: - raise RuntimeError(f'Repeated observed sequences in collapsed tree. {rep_seq} sequences were found repeated.') - elif allow_repeats and rep_seq: - rep_seq = sum(node.frequency > 0 for node in self.tree.traverse()) - len(set([node.sequence for node in self.tree.traverse() if node.frequency > 0])) - print(f'Repeated observed sequences in collapsed tree. {rep_seq} sequences were found repeated.') - # a custom ladderize accounting for abundance and sequence to break ties in abundance - for node in self.tree.traverse(strategy='postorder'): - # add a partition feature and compute it recursively up the tree - node.add_feature('partition', node.frequency + sum(node2.partition for node2 in node.children)) - # sort children of this node based on partion and sequence - node.children.sort(key=lambda node: (node.partition, node.sequence)) - else: - self.tree = tree - - def l(self, params, sign=1, build_cache=True): - ''' - log likelihood of params, conditioned on collapsed tree, and its gradient wrt params - optional parameter sign must be 1 or -1, with the latter useful for MLE by minimization - ''' - if self.tree is None: - raise ValueError('tree data must be defined to compute likelihood') - if sign not in (-1, 1): - raise ValueError('sign must be 1 or -1') - if build_cache: - c_max = max(node.frequency for node in self.tree.traverse()) - m_max = max(len(node.children) for node in self.tree.traverse()) - LeavesAndClades.build_logf_cache(c_max, m_max, *params) - leaves_and_clades_list = [LeavesAndClades(c=node.frequency, m=len(node.children)) for node in self.tree.traverse()] - if leaves_and_clades_list[0].c == 0 and \ - leaves_and_clades_list[0].m == 1 and \ - leaves_and_clades_list[0].logf(leaves_and_clades_list[0].c, - leaves_and_clades_list[0].m, - *params)[0] == -np.inf: - # if unifurcation not possible under current model, add a psuedocount for the naive - leaves_and_clades_list[0].c = 1 - # extract vector of function values and gradient components - logf_data = [leaves_and_clades.logf(leaves_and_clades.c, - leaves_and_clades.m, - *params) for leaves_and_clades in leaves_and_clades_list] - logf = np.array([[x[0]] for x in logf_data]).sum() - grad_logf = np.array([x[1] for x in logf_data]).sum(axis=0) - return sign*logf, sign*grad_logf - - def mle(self, **kwargs): - ''' - Maximum likelihood estimate for params given tree - updates params if not None - returns optimization result - ''' - # random initalization - x_0 = (random.random(), random.random()) - bounds = ((1e-6, 1 - 1e-6), (1e-6, 1 - 1e-6)) - kwargs['sign'] = -1 - grad_check = check_grad(lambda x: self.l(x, **kwargs)[0], - lambda x: self.l(x, **kwargs)[1], - x_0) - if grad_check > 1e-3: - warnings.warn(f'gradient mismatches finite difference approximation by {grad_check}', RuntimeWarning) - result = minimize(lambda x: self.l(x, **kwargs), jac=True, x0=x_0, - method='L-BFGS-B', options={'ftol':1e-10}, - bounds=bounds) - # update params if None and optimization successful - if not result.success: - warnings.warn('optimization not sucessful, '+result.message, RuntimeWarning) - elif self.params is None: - self.params = result.x.tolist() - return result - - def simulate(self): - ''' - simulate a collapsed tree given params - replaces existing tree data member with simulation result, and returns self - ''' - if self.params is None: - raise ValueError('params must be defined for simulation') - - # initiate by running a LeavesAndClades simulation to get the number of clones and mutants - # in the root node of the collapsed tree - LeavesAndClades.simulate(self) - self.tree = TreeNode() - self.tree.add_feature('frequency', self.c) - if self.m == 0: - return self - for _ in range(self.m): - # ooooh, recursion - child = CollapsedTree(params=self.params, frame=self.frame).simulate().tree - child.dist = 1 - self.tree.add_child(child) - - return self - - def __str__(self): - '''return a string representation for printing''' - return 'params = ' + str(self.params)+ '\ntree:\n' + str(self.tree) - - def render(self, outfile, idlabel=False, colormap=None, show_support=False, chain_split=None): - '''render to image file, filetype inferred from suffix, svg for color images''' - def my_layout(node): - circle_color = 'lightgray' if colormap is None or node.name not in colormap else colormap[node.name] - text_color = 'black' - if isinstance(circle_color, str): - C = CircleFace(radius=max(3, 10*np.sqrt(node.frequency)), color=circle_color, label={'text':str(node.frequency), 'color':text_color} if node.frequency > 0 else None) - C.rotation = -90 - C.hz_align = 1 - faces.add_face_to_node(C, node, 0) - else: - P = PieChartFace([100*x/node.frequency for x in circle_color.values()], 2*10*np.sqrt(node.frequency), 2*10*np.sqrt(node.frequency), colors=[(color if color != 'None' else 'lightgray') for color in list(circle_color.keys())], line_color=None) - T = TextFace(' '.join([str(x) for x in list(circle_color.values())]), tight_text=True) - T.hz_align = 1 - T.rotation = -90 - faces.add_face_to_node(P, node, 0, position='branch-right') - faces.add_face_to_node(T, node, 1, position='branch-right') - if idlabel: - T = TextFace(node.name, tight_text=True, fsize=6) - T.rotation = -90 - T.hz_align = 1 - faces.add_face_to_node(T, node, 1 if isinstance(circle_color, str) else 2, position='branch-right') - for node in self.tree.traverse(): - nstyle = NodeStyle() - nstyle['size'] = 0 - if node.up is not None: - if set(node.sequence.upper()) == set('ACGT'): - if chain_split is not None: - if self.frame is not None: - raise NotImplementedError('frame not implemented with chain_split') - leftseq_mutated = hamming_distance(node.sequence[:chain_split], node.up.sequence[:chain_split]) > 0 - rightseq_mutated = hamming_distance(node.sequence[chain_split:], node.up.sequence[chain_split:]) > 0 - if leftseq_mutated and rightseq_mutated: - nstyle['hz_line_color'] = 'purple' - nstyle['hz_line_width'] = 3 - elif leftseq_mutated: - nstyle['hz_line_color'] = 'red' - nstyle['hz_line_width'] = 2 - elif rightseq_mutated: - nstyle['hz_line_color'] = 'blue' - nstyle['hz_line_width'] = 2 - if self.frame is not None: - aa = Seq(node.sequence[(self.frame-1):(self.frame-1+(3*(((len(node.sequence)-(self.frame-1))//3))))] - ).translate() - aa_parent = Seq(node.up.sequence[(self.frame-1):(self.frame-1+(3*(((len(node.sequence)-(self.frame-1))//3))))] - ).translate() - nonsyn = hamming_distance(aa, aa_parent) - if '*' in aa: - nstyle['bgcolor'] = 'red' - if nonsyn > 0: - nstyle['hz_line_color'] = 'black' - nstyle['hz_line_width'] = nonsyn - else: - nstyle['hz_line_type'] = 1 - node.set_style(nstyle) - - ts = TreeStyle() - ts.show_leaf_name = False - ts.rotation = 90 - ts.draw_aligned_faces_as_table = False - ts.allow_face_overlap = True - ts.layout_fn = my_layout - ts.show_scale = False - ts.show_branch_support = show_support - self.tree.render(outfile, tree_style=ts) - # if we labelled seqs, let's also write the alignment out so we have the sequences (including of internal nodes) - if idlabel: - aln = MultipleSeqAlignment([]) - for node in self.tree.traverse(): - aln.append(SeqRecord(Seq(str(node.sequence)), id=str(node.name), description=f'abundance={node.frequency}')) - AlignIO.write(aln, open(os.path.splitext(outfile)[0] + '.fasta', 'w'), 'fasta') - - def write(self, file_name): - '''serialize tree to file''' - with open(file_name, 'wb') as f: - pickle.dump(self, f) - - def newick(self, file_name): - '''write to newick file''' - self.tree.write(format=1, outfile=file_name) - - def compare(self, tree2, method='identity'): - '''compare this tree to the other tree''' - if method == 'identity': - # we compare lists of seq, parent, abundance - # return true if these lists are identical, else false - list1 = sorted((node.sequence, node.frequency, node.up.sequence if node.up is not None else None) for node in self.tree.traverse()) - list2 = sorted((node.sequence, node.frequency, node.up.sequence if node.up is not None else None) for node in tree2.tree.traverse()) - return list1 == list2 - elif method == 'MRCA': - # matrix of hamming distance of common ancestors of taxa - # takes a true and inferred tree as CollapsedTree objects - taxa = [node.sequence for node in self.tree.traverse() if node.frequency] - n_taxa = len(taxa) - d = np.zeros(shape=(n_taxa, n_taxa)) - sum_sites = np.zeros(shape=(n_taxa, n_taxa)) - for i in range(n_taxa): - nodei_true = self.tree.iter_search_nodes(sequence=taxa[i]).__next__() - nodei = tree2.tree.iter_search_nodes(sequence=taxa[i]).__next__() - for j in range(i + 1, n_taxa): - nodej_true = self.tree.iter_search_nodes(sequence=taxa[j]).__next__() - nodej = tree2.tree.iter_search_nodes(sequence=taxa[j]).__next__() - MRCA_true = self.tree.get_common_ancestor((nodei_true, nodej_true)).sequence - MRCA = tree2.tree.get_common_ancestor((nodei, nodej)).sequence - d[i, j] = hamming_distance(MRCA_true, MRCA) - sum_sites[i, j] = len(MRCA_true) - return d.sum() / sum_sites.sum() - elif method == 'RF': - tree1_copy = self.tree.copy(method='deepcopy') - tree2_copy = tree2.tree.copy(method='deepcopy') - for treex in (tree1_copy, tree2_copy): - for node in list(treex.traverse()): - if node.frequency > 0: - child = TreeNode() - child.add_feature('sequence', node.sequence) - node.add_child(child) - try: - return tree1_copy.robinson_foulds(tree2_copy, attr_t1='sequence', attr_t2='sequence', unrooted_trees=True)[0] - except: - return tree1_copy.robinson_foulds(tree2_copy, attr_t1='sequence', attr_t2='sequence', unrooted_trees=True, allow_dup=True)[0] - else: - raise ValueError('invalid distance method: ' + method) - - def get_split(self, node): - '''return the bipartition resulting from clipping this node's edge above''' - if node.get_tree_root() != self.tree: - raise ValueError('node not found') - if node == self.tree: - raise ValueError('this node is the root (no split above)') - parent = node.up - taxa1 = [] - for node2 in node.traverse(): - if node2.frequency > 0 or node2 == self.tree: - if isinstance(node2.name, str): - taxa1.append(node2.name) - else: - taxa1.extend(node2.name) - taxa1 = set(taxa1) - node.detach() - taxa2 = [] - for node2 in self.tree.traverse(): - if node2.frequency > 0 or node2 == self.tree: - if isinstance(node2.name, str): - taxa2.append(node2.name) - else: - taxa2.extend(node2.name) - taxa2 = set(taxa2) - parent.add_child(node) - assert taxa1.isdisjoint(taxa2) - assert taxa1.union(taxa2) == set((name for node in self.tree.traverse() if node.frequency > 0 or node == self.tree for name in ((node.name,) if isinstance(node.name, str) else node.name))) - return tuple(sorted([taxa1, taxa2])) - - @staticmethod - def split_compatibility(split1, split2): - diff = split1[0].union(split1[1]) ^ split2[0].union(split2[1]) - if diff: - raise ValueError(f'splits do not cover the same taxa\n\ttaxa not in both: {diff}') - for partition1 in split1: - for partition2 in split2: - if partition1.isdisjoint(partition2): - return True - return False - - def support(self, bootstrap_trees_list, weights=None, compatibility=False): - ''' - compute support from a list of bootstrap GCtrees - weights (optional) is needed for weighting parsimony degenerate trees - compatibility mode counts trees that don't disconfirm the split - ''' - for node in self.tree.get_descendants(): - split = self.get_split(node) - support = 0 - compatibility_ = 0 - for i, tree in enumerate(bootstrap_trees_list): - compatible = True - supported = False - for boot_node in tree.tree.get_descendants(): - boot_split = tree.get_split(boot_node) - if compatibility and compatible and not self.split_compatibility(split, boot_split): - compatible = False - if not compatibility and not supported and boot_split == split: - supported = True - if supported: - support += weights[i] if weights is not None else 1 - if compatible: - compatibility_ += weights[i] if weights is not None else 1 - node.support = compatibility_ if compatibility else support - - return self - - - -class CollapsedForest(CollapsedTree): - ''' - simply a set of CollapsedTrees, with the same p and q parameters - (4) (3) - / | \\ / \\ - (3)(1)(2) (1) (2) - | \\ , , ... - (2) (1) - ''' - def __init__(self, params=None, n_trees=None, forest=None): - ''' - in addition to p and q, we need number of trees - can also intialize with forest, a list of trees, each an instance of CollapsedTree - ''' - CollapsedTree.__init__(self, params=params) - if forest is None and params is None: - raise ValueError('either params or forest (or both) must be provided') - if forest is not None: - if len(forest) == 0: - raise ValueError('passed empty tree list') - if n_trees is not None and len(forest) != n_trees: - raise ValueError('n_trees not consistent with forest') - self.forest = forest - if n_trees is not None: - if type(n_trees) is not int or n_trees < 1: - raise ValueError('number of trees must be at least one') - self.n_trees = n_trees - if n_trees is None and forest is not None: - self.n_trees = len(forest) - - def simulate(self): - ''' - simulate a forest of collapsed trees given params and number of trees - replaces existing forest data member with simulation result, and returns self - ''' - if self.params is None or self.n_trees is None: - raise ValueError('params and n_trees parameters must be defined for simulation') - self.forest = [CollapsedTree(self.params).simulate() for x in range(self.n_trees)] - return self - - def l(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): - ''' - likelihood of params, given forest, and it's gradient wrt params - optional parameter sign must be 1 or -1, with the latter useful for MLE by minimization - if optional parameter empirical_bayes_sum is true, we're estimating params for - a set of parsimony trees - ''' - if self.forest is None: - raise ValueError('forest data must be defined to compute likelihood') - if sign not in (-1, 1): - raise ValueError('sign must be 1 or -1') - if build_cache: - c_max = max(node.frequency for tree in self.forest for node in tree.tree.traverse()) - m_max = max(len(node.children) for tree in self.forest for node in tree.tree.traverse()) - LeavesAndClades.build_logf_cache(c_max, m_max, *params) - # we don't want to build the cache again in each tree - terms = [tree.l(params, build_cache=False) for tree in self.forest] - ls = np.array([term[0] for term in terms]) - grad_ls = np.array([term[1] for term in terms]) - if empirical_bayes_sum: - # we need to find the smallest derivative component for each - # coordinate, then subtract off to get positive things to logsumexp - grad_l = [] - for j in range(len(params)): - i_prime = grad_ls[:,j].argmin() - grad_l.append(grad_ls[i_prime,j] + - np.exp(logsumexp(ls - ls[i_prime], - b=grad_ls[:,j]-grad_ls[i_prime,j]) - - logsumexp(ls - ls[i_prime]))) - return sign*(-np.log(len(ls)) + logsumexp(ls)), sign*np.array(grad_l) - else: - return sign*ls.sum(), sign*grad_ls.sum(axis=0) - - # NOTE: we get mle() method for free by inheritance/polymorphism magic - - def __str__(self): - '''return a string representation for printing''' - return f'params = {self.params}, n_trees = {self.n_trees}\n' + \ - '\n'.join([str(tree) for tree in self.forest]) - -def test(args): - ''' - test subprogram - checks likelihood against a by-hand calculation for a simple tree, simulates a forest, computes MLE parameters, and plots some sanity check figures to plot_file - command line arguments are p, q, number of trees to simulate, and plot file name - ''' - - import seaborn as sns - sns.set(style='white', color_codes=True) - sns.set_style('ticks') - - # compare likelihood to empirical likelihood (might need large n) - n = 10000 - df = pd.DataFrame(columns=('p', 'q', 'parameters', 'f', 'L')) - ct = 0 - ps = (.1, .2, .3, .4) - qs = (.2, .4, .6, .8) - np.seterr(all='ignore') - for p in ps: - for q in qs: - forest = CollapsedForest((p, q), n) - print(f'parameters: p = {p}, q = {q}') - forest.simulate() - tree_dict = {} - for tree in forest.forest: - tree_hash = tuple((node.frequency, len(node.children)) for node in tree.tree.traverse()) - if tree_hash not in tree_dict: - tree_dict[tree_hash] = [tree, tree.l((p, q))[0], 1] - else: - tree_dict[tree_hash][-1] += 1 - L_empirical, L_theoretical = zip(*[(tree_dict[tree_hash][2], np.exp(tree_dict[tree_hash][1])) for tree_hash in tree_dict if tree_dict[tree_hash][2]]) - for tree_hash in tree_dict: - df.loc[ct] = (p, q, f'p={p}, q={q}', tree_dict[tree_hash][2], np.exp(tree_dict[tree_hash][1])) - ct += 1 - print() - - plt.figure() - limx = (1/n, 1.1) - limy = (1, 1.1*n) - g = sns.lmplot(x='L', y='f', col='p', row='q', hue='parameters', data=df, - fit_reg=False, scatter_kws={'alpha':.3}, height=1.5, legend=False, - row_order=reversed(qs)) - g.set(xscale='log', yscale='log', xlim=limx, ylim=limy) - for i in range(len(ps)): - for j in range(len(qs)): - g.axes[i, j].plot(limx, limy, ls='--', c='black', lw=.5, zorder=0, markeredgewidth=.1) - g.axes[i, j].set_title(f'p={ps[j]}\nq={list(reversed(qs))[i]}', x=.05, y=.7, size='x-small', ha='left') - g.set_axis_labels('', '') - g.fig.text(0.45, .02, s='GCtree likelihood', multialignment='center') - g.fig.text(.02, 0.7, s=f'frequency among {n} simulations', rotation=90, multialignment='center') - plt.savefig(args.outbase+'.pdf') - - # MLE check - n = 20 - n2 = 500 - df = pd.DataFrame(columns=('true parameters', '$\hat{p}$', '$\hat{q}$')) - ct = 0 - for p in ps: - for q in qs: - for _ in range(n): - forest = CollapsedForest((p, q), n2) - print(f'parameters: p = {p}, q = {q}') - forest.simulate() - result = forest.mle() - df.loc[ct] = (f'p={p}, q={q}', result.x[0], result.x[1]) - ct += 1 - - plt.figure() - g = sns.lmplot(x='$\hat{p}$', y='$\hat{q}$', hue='true parameters', data=df, - fit_reg=False, scatter_kws={'alpha':.2}, height=6, legend=False) - g.set(xlim=(0.05, .45), xticks=np.arange(0., .6, .1), ylim=(.1, .9), yticks=np.arange(0., 1.2, .2)) - for i in range(len(ps)): - for j in range(len(qs)): - plt.scatter([ps[i]], [qs[j]], c='black', marker='+') - plt.savefig(args.outbase+'.2.pdf') - - return - - -def infer(args): - '''inference subprogram''' - outfiles = [phylip_parse.parse_outfile(args.phylipfile, args.countfile, args.naive)] - if args.bootstrap_phylipfile is not None: - outfiles.extend(phylip_parse.parse_outfile(args.bootstrap_phylipfile, args.countfile, args.naive)) - bootstrap = len(outfiles) > 1 - if bootstrap: - # store bootstrap parameter data - df = pd.DataFrame(columns=('$\hat{p}$', '$\hat{q}$')) - gctrees = [] # we'll store the mle gctrees here for computing support later - - for i, content in enumerate(outfiles): - if i > 0: - print(f'bootstrap sample {i}') - print('----------------------') - outbase = args.outbase + f'.bootstrap_{i}' - else: - outbase = args.outbase - phylip_collapsed = [CollapsedTree(tree=tree, frame=args.frame, allow_repeats=(i>0)) for tree in content] - phylip_collapsed_unique = [] - for tree in phylip_collapsed: - if sum(tree.compare(tree2, method='identity') for tree2 in phylip_collapsed_unique) == 0: - phylip_collapsed_unique.append(tree) - - parsimony_forest = CollapsedForest(forest=phylip_collapsed_unique) - - if parsimony_forest.n_trees == 1: - warnings.warn('only one parsimony tree reported from dnapars') - - print('number of trees with integer branch lengths:', parsimony_forest.n_trees) - - # check for unifurcations at root - unifurcations = sum(tree.tree.frequency == 0 and len(tree.tree.children) == 1 for tree in parsimony_forest.forest) - if unifurcations: - print(f'{unifurcations} trees exhibit unobserved unifurcation from root. Adding psuedocounts to these roots') - - # fit p and q using all trees - # if we get floating point errors, try a few more times (starting params are random) - max_tries = 10 - for tries in range(max_tries): - try: - parsimony_forest.mle(empirical_bayes_sum=True) - break - except FloatingPointError as e: - if tries + 1 < max_tries: - print(f'floating point error in MLE: {e}. Attempt {tries + 1} of {max_tries}. Rerunning with new random start.') - else: - raise - else: - raise - - print(f'params = {parsimony_forest.params}') - - if i > 0: - df.loc[i-1] = parsimony_forest.params - - # get likelihoods and sort by them - ls = [tree.l(parsimony_forest.params, build_cache=False)[0] for tree in parsimony_forest.forest] - ls, parsimony_forest.forest = zip(*sorted(zip(ls, parsimony_forest.forest), - key = lambda x: x[0], reverse=True)) - - if bootstrap: - gctrees.append(parsimony_forest.forest[0]) - - with open(outbase+'.inference.parsimony_forest.p', 'wb') as f: - pickle.dump(parsimony_forest, f) - - if args.colormapfile is not None: - with open(args.colormapfile, 'r') as f: - colormap = {} - for line in f: - seqid, color = line.rstrip().split('\t') - if ',' in color: - colors = {x.split(':')[0]:int(x.split(':')[1]) for x in color.split(',')} - colormap[seqid] = colors - else: - colormap[seqid] = color - else: - colormap = None - - print('tree\talleles\tlogLikelihood') - for j, (l, collapsed_tree) in enumerate(zip(ls, parsimony_forest.forest), 1): - alleles = sum(1 for _ in collapsed_tree.tree.traverse()) - print(f'{j}\t{alleles}\t{l}') - collapsed_tree.render(f'{outbase}.inference.{j}.svg', - idlabel=args.idlabel, - colormap=colormap, - chain_split=args.chain_split) - collapsed_tree.newick(f'{outbase}.inference.{j}.nk') - - # rank plot of likelihoods - plt.figure(figsize=(6.5,2)) - try: - plt.plot(np.exp(ls), 'ko', clip_on=False, markersize=4) - plt.ylabel('GCtree likelihood') - plt.yscale('log') - plt.ylim([None, 1.1*max(np.exp(ls))]) - except FloatingPointError: - plt.plot(ls, 'ko', clip_on=False, markersize=4) - plt.ylabel('GCtree log-likelihood') - plt.ylim([None, 1.1*max(ls)]) - plt.xlabel('parsimony tree') - plt.xlim([-1, len(ls)]) - plt.tick_params(axis='y', direction='out', which='both') - plt.tick_params( - axis='x', # changes apply to the x-axis - which='both', # both major and minor ticks are affected - bottom='off', # ticks along the bottom edge are off - top='off', # ticks along the top edge are off - labelbottom='off') # labels along the bottom edge are off - plt.savefig(outbase + '.inference.likelihood_rank.pdf') - - # rank plot of observed allele frequencies - y = sorted((node.frequency for node in parsimony_forest.forest[0].tree.traverse() if node.frequency != 0), reverse=True) - plt.figure() - plt.bar(range(1, len(y) + 1), y, color='black') - plt.xlabel('genotype') - plt.ylabel('abundance') - plt.savefig(outbase + '.inference.abundance_rank.pdf') - - if bootstrap: - import seaborn as sns; sns.set(style="white", color_codes=True) - sns.set_style("ticks") - plt.figure() - np.seterr(all='ignore') - g = sns.jointplot('$\hat{p}$', '$\hat{q}$', data=df, joint_kws={'alpha':.1, 's':.1}, - space=0, color='k', stat_func=None, xlim=(0, 1), ylim=(0, 1), height=3) - plt.savefig(args.outbase+'.inference.bootstrap_theta.pdf') - gctrees[0].support(gctrees[1:]) - gctrees[0].render(args.outbase+'.inference.bootstrap_support.svg', - colormap=colormap, - idlabel=args.idlabel, - chain_split=args.chain_split, - show_support=True) - gctrees[0].support(gctrees[1:], compatibility=True) - gctrees[0].render(args.outbase+'.inference.bootstrap_compatibility.svg', - colormap=colormap, - idlabel=args.idlabel, - chain_split=args.chain_split, - show_support=True) - - -def simulate(args): - ''' - Simulation subprogram. Can simulate in two modes. - a) Neutral mode. A Galton–Watson process, with mutation probabilities according to a user defined motif model e.g. S5F - b) Selection mode. Using the same mutation process as in a), but in selection mode the poisson progeny distribution's lambda - is variable accordring to the hamming distance to a list of target sequences. The closer a sequence gets to one of the targets - the higher fitness and the closer lambda will approach 2, vice versa when the sequence is far away lambda approaches 0. - ''' - random.seed(a=args.seed) - mutation_model = MutationModel(args.mutability, args.substitution) - if args.lambda0 is None: - args.lambda0 = [max([1, int(.01*len(args.sequence))])] - args.sequence = args.sequence.upper() - if args.sequence2 is not None: - if len(args.lambda0) == 1: # Use the same mutation rate on both sequences - args.lambda0 = [args.lambda0[0], args.lambda0[0]] - elif len(args.lambda0) != 2: - raise Exception('Only one or two lambda0 can be defined for a two sequence simulation.') - # Require both sequences to be in frame 1: - if args.frame is not None and args.frame != 1: - print('Warning: When simulating with two sequences they are truncated to be beginning at frame 1.') - args.sequence = args.sequence[(args.frame-1):(args.frame-1+(3*(((len(args.sequence)-(args.frame-1))//3))))] - args.sequence2 = args.sequence2[(args.frame-1):(args.frame-1+(3*(((len(args.sequence2)-(args.frame-1))//3))))] - # Extract the bounds between sequence 1 and 2: - seq_bounds = ((0, len(args.sequence)), (len(args.sequence), len(args.sequence)+len(args.sequence2))) - # Merge the two seqeunces to simplify future dealing with the pair: - args.sequence += args.sequence2.upper() - else: - seq_bounds = None - if args.selection: - if args.frame is None: - raise Exception('Frame must be defined when simulating with selection.') - assert(args.B_total >= args.f_full) # the fully activating fraction on BA must be possible to reach within B_total - # Make a list of target sequences: - targetAAseqs = [mutation_model.one_mutant(args.sequence, args.target_dist, frame=args.frame) for i in range(args.target_count)] - # Find the total amount of A necessary for sustaining the inputted carrying capacity: - print((args.carry_cap, args.B_total, args.f_full, args.mature_affy)) - A_total = selection_utils.find_A_total(args.carry_cap, args.B_total, args.f_full, args.mature_affy, args.U) - # Calculate the parameters for the logistic function: - Lp = selection_utils.find_Lp(args.f_full, args.U) - selection_params = [args.stop_dist, args.mature_affy, args.naive_affy, args.target_dist, args.skip_update, targetAAseqs, A_total, args.B_total, Lp, args.k, args.outbase] - else: - selection_params = None - - trials = 1000 - # this loop makes us resimulate if size too small, or backmutation - for trial in range(trials): - try: - tree = mutation_model.simulate(args.sequence, - seq_bounds=seq_bounds, - progeny=poisson(args.lambda_), - lambda0=args.lambda0, - n=args.n, - N=args.N, - T=args.T, - frame=args.frame, - verbose=args.verbose, - selection_params=selection_params) - if args.selection: - collapsed_tree = CollapsedTree(tree=tree, frame=args.frame, collapse_syn=False, allow_repeats=True) - else: - collapsed_tree = CollapsedTree(tree=tree, frame=args.frame) # <-- this will fail if backmutations - tree.ladderize() - uniques = sum(node.frequency > 0 for node in collapsed_tree.tree.traverse()) - if uniques < 2: - raise RuntimeError(f'collapsed tree contains {uniques} sampled sequences') - break - except RuntimeError as e: - print(f'{e}, trying again') - else: - raise - if trial == trials - 1: - raise RuntimeError(f'{trials} attempts exceeded') - - # In the case of a sequence pair print them to separate files: - if args.sequence2 is not None: - fh1 = open(args.outbase+'.simulation_seq1.fasta', 'w') - fh2 = open(args.outbase+'.simulation_seq2.fasta', 'w') - fh1.write('>naive\n') - fh1.write(args.sequence[seq_bounds[0][0]:seq_bounds[0][1]]+'\n') - fh2.write('>naive\n') - fh2.write(args.sequence[seq_bounds[1][0]:seq_bounds[1][1]]+'\n') - for leaf in tree.iter_leaves(): - if leaf.frequency != 0:# and '*' not in Seq(leaf.sequence).translate(): - fh1.write('>' + leaf.name + '\n') - fh1.write(leaf.sequence[seq_bounds[0][0]:seq_bounds[0][1]]+'\n') - fh2.write('>' + leaf.name + '\n') - fh2.write(leaf.sequence[seq_bounds[1][0]:seq_bounds[1][1]]+'\n') - else: - with open(args.outbase+'.simulation.fasta', 'w') as f: - f.write('>naive\n') - f.write(args.sequence+'\n') - for leaf in tree.iter_leaves(): - if leaf.frequency != 0:# and '*' not in Seq(leaf.sequence).translate(): - f.write('>' + leaf.name + '\n') - f.write(leaf.sequence + '\n') - - # some observable simulation stats to write - frequency, distance_from_naive, degree = zip(*[(node.frequency, - hamming_distance(node.sequence, args.sequence), - sum(hamming_distance(node.sequence, node2.sequence) == 1 for node2 in collapsed_tree.tree.traverse() if node2.frequency and node2 is not node)) - for node in collapsed_tree.tree.traverse() if node.frequency]) - stats = pd.DataFrame({'genotype abundance':frequency, - 'Hamming distance to root genotype':distance_from_naive, - 'Hamming neighbor genotypes':degree}) - stats.to_csv(args.outbase+'.simulation.stats.tsv', sep='\t', index=False) - - print(f'{sum(leaf.frequency for leaf in collapsed_tree.tree.traverse())} simulated observed sequences') - - # render the full lineage tree - ts = TreeStyle() - ts.rotation = 90 - ts.show_leaf_name = False - ts.show_scale = False - - colors = {} - palette = SVG_COLORS - palette -= set(['black', 'white', 'gray']) - palette = cycle(list(palette)) # <-- circular iterator - - # Either plot by DNA sequence or amino acid sequence: - if args.plotAA and args.selection: - colors[tree.AAseq] = 'gray' - else: - colors[tree.sequence] = 'gray' - - for n in tree.traverse(): - nstyle = NodeStyle() - nstyle["size"] = 10 - if args.plotAA: - if n.AAseq not in colors: - colors[n.AAseq] = next(palette) - nstyle['fgcolor'] = colors[n.AAseq] - else: - if n.sequence not in colors: - colors[n.sequence] = next(palette) - nstyle['fgcolor'] = colors[n.sequence] - n.set_style(nstyle) - - # this makes the rendered branch lenths correspond to time - for node in tree.iter_descendants(): - node.dist = node.time - node.up.time - tree.render(args.outbase+'.simulation.lineage_tree.svg', tree_style=ts) - - # render collapsed tree - # create an id-wise colormap - # NOTE: node.name can be a set - if args.plotAA and args.selection: - colormap = {node.name:colors[node.AAseq] for node in collapsed_tree.tree.traverse()} - else: - colormap = {node.name:colors[node.sequence] for node in collapsed_tree.tree.traverse()} - collapsed_tree.write( args.outbase+'.simulation.collapsed_tree.p') - collapsed_tree.render(args.outbase+'.simulation.collapsed_tree.svg', - idlabel=args.idlabel, - colormap=colormap) - # print colormap to file - with open(args.outbase+'.simulation.collapsed_tree.colormap.tsv', 'w') as f: - for name, color in colormap.items(): - f.write((name if isinstance(name, str) else ','.join(name)) + '\t' + color + '\n') - - - if args.selection: - # Define a list a suitable colors that are easy to distinguish: - palette = ['crimson', 'purple', 'hotpink', 'limegreen', 'darkorange', 'darkkhaki', 'brown', 'lightsalmon', 'darkgreen', 'darkseagreen', 'darkslateblue', 'teal', 'olive', 'wheat', 'magenta', 'lightsteelblue', 'plum', 'gold'] - palette = cycle(list(palette)) # <-- circular iterator - colors = {i: next(palette) for i in range(int(len(args.sequence) // 3))} - # The minimum distance to the target is colored: - colormap = {node.name:colors[node.target_dist] for node in collapsed_tree.tree.traverse()} - collapsed_tree.write( args.outbase+'.simulation.collapsed_runstat_color_tree.p') - collapsed_tree.render(args.outbase+'.simulation.collapsed_runstat_color_tree.svg', - idlabel=args.idlabel, - colormap=colormap) - # Write a file with the selection run stats. These are also plotted: - with open(args.outbase + 'selection_sim.runstats.p', 'rb') as fh: - runstats = pickle.load(fh) - selection_utils.plot_runstats(runstats, args.outbase, colors) - - -def main(): - import argparse - parser = argparse.ArgumentParser(description='germinal center tree inference and simulation') - subparsers = parser.add_subparsers(help='which program to run') - - # parser for test subprogram - parser_test = subparsers.add_parser('test', - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='run tests on library functions') - parser_test.set_defaults(func=test) - - # parser for inference subprogram - parser_infer = subparsers.add_parser('infer', - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='likelihood ranking of parsimony trees') - parser_infer.add_argument('--naive', type=str, default=None, help='name of naive sequence (outgroup root)') - parser_infer.add_argument('phylipfile', type=str, help='dnapars outfile (verbose output with sequences at each site)') - parser_infer.add_argument('countfile', type=str, help='File containing allele frequencies (sequence counts) in the format: "SeqID,Nobs"') - parser_infer.add_argument('--bootstrap_phylipfile', type=str, help='dnapars outfile from seqboot (multiple data sets)') - parser_infer.add_argument('--colormapfile', type=str, default=None, help='File containing color map in the format: "SeqID\tcolor"') - parser_infer.add_argument('--chain_split', type=int, default=None, help='split between heavy and light for combined seqs') - parser_infer.set_defaults(func=infer) - - # parser for simulation subprogram - parser_sim = subparsers.add_parser('simulate', - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='Neutral, and target selective, model gctree simulation') - parser_sim.add_argument('sequence', type=str, help='seed naive nucleotide sequence') - parser_sim.add_argument('mutability', type=str, help='path to mutability model file') - parser_sim.add_argument('substitution', type=str, help='path to substitution model file') - parser_sim.add_argument('--sequence2', type=str, default=None, help='Second seed naive nucleotide sequence. For simulating heavy/light chain co-evolution.') - parser_sim.add_argument('--lambda', dest='lambda_', type=float, default=.9, help='poisson branching parameter') - parser_sim.add_argument('--lambda0', type=float, default=None, nargs='*', help='List of one or two elements with the baseline mutation rates. Space separated input values.' - 'First element belonging to seed sequence one and optionally the next to sequence 2. If only one rate is provided for two sequences,' - 'this rate will be used on both.') - parser_sim.add_argument('--n', type=int, default=None, help='cells downsampled') - parser_sim.add_argument('--N', type=int, default=None, help='target simulation size') - parser_sim.add_argument('--T', type=int, nargs='+', default=None, help='observation time, if None we run until termination and take all leaves') - parser_sim.add_argument('--seed', type=int, default=None, help='integer random seed') - parser_sim.add_argument('--selection', type=bool, default=False, help='Simulation with selection? true/false. When doing simulation with selection an observation time cut must be set.') - parser_sim.add_argument('--stop_dist', type=int, default=None, help='Stop when this distance has been reached in the selection model.') - parser_sim.add_argument('--carry_cap', type=int, default=1000, help='The carrying capacity of the simulation with selection. This number affects the fixation time of a new mutation.' - 'Fixation time is approx. log2(carry_cap), e.g. log2(1000) ~= 10.') - parser_sim.add_argument('--target_count', type=int, default=10, help='The number of targets to generate.') - parser_sim.add_argument('--target_dist', type=int, default=10, help='The number of non-synonymous mutations the target should be away from the naive.') - parser_sim.add_argument('--naive_affy', type=float, default=100, help='Affinity of the naive sequence in nano molar.') - parser_sim.add_argument('--mature_affy', type=float, default=1, help='Affinity of the mature sequences in nano molar.') - parser_sim.add_argument('--skip_update', type=int, default=100, help='When iterating through the leafs the B:A fraction is recalculated every time.' - 'It is possible though to update less often and get the same approximate results. This parameter sets the number of iterations to skip,' - 'before updating the B:A results. skip_update < carry_cap/10 recommended.') - parser_sim.add_argument('--B_total', type=float, default=1, help='Total number of BCRs per B cell normalized to 10e4. So 1 equals 10e4, 100 equals 10e6 etc.' - 'It is recommended to keep this as the default.') - parser_sim.add_argument('--U', type=float, default=5, help='Controls the fraction of BCRs binding antigen necessary to only sustain the life of the B cell' - 'It is recommended to keep this as the default.') - parser_sim.add_argument('--f_full', type=float, default=1, help='The fraction of antigen bound BCRs on a B cell that is needed to elicit close to maximum reponse.' - 'Cannot be smaller than B_total. It is recommended to keep this as the default.') - parser_sim.add_argument('--k', type=float, default=2, help='The exponent in the function to map hamming distance to affinity.' - 'It is recommended to keep this as the default.') - parser_sim.add_argument('--plotAA', type=bool, default=False, help='Plot trees with collapsing and coloring on amino acid level.') - parser_sim.add_argument('--verbose', type=bool, default=False, help='Print progress during simulation. Mostly useful for simulation with selection since this can take a while.') - parser_sim.set_defaults(func=simulate) - - # a common outbase parameter - for subparser in [parser_test, parser_infer, parser_sim]: - subparser.add_argument('--outbase', type=str, default='gctree.out', help='output file base name') - - # common parameters for the inference and simulation subprograms - for subparser in [parser_infer, parser_sim]: - subparser.add_argument('--frame', type=int, default=None, choices=(1, 2, 3), help='codon frame') - subparser.add_argument('--idlabel', action='store_true', help='flag for labeling the sequence ids of the nodes in the output tree images, also write associated fasta alignment if True') - - args = parser.parse_args() - args.func(args) - -if __name__ == '__main__': - main() diff --git a/environment.yml b/environment.yml new file mode 100644 index 00000000..ae6ab44c --- /dev/null +++ b/environment.yml @@ -0,0 +1,17 @@ +name: gctree +channels: + - conda-forge + - defaults + - bioconda + - etetoolkit +dependencies: + - scons + - nestly + - phylip + - seqmagick + - black + - flake8 + - pytest + - pip + - pip: + - -e . # installs gctree package from current directory "." in editable mode diff --git a/gctree/cli.py b/gctree/cli.py new file mode 100644 index 00000000..3d7878fd --- /dev/null +++ b/gctree/cli.py @@ -0,0 +1,662 @@ +#! /usr/bin/env python + +import gctree +import phylip_parse as pp +import mutation_model as mm +import selection_utils as su +import utils + +import argparse +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import warnings +import pickle +import random +import scipy.stats +import ete +import itertools + + +def test(args): + """Test subprogram. Checks likelihood against a by-hand calculation for a + simple tree, simulates a forest, computes MLE parameters, and plots some + sanity check figures to plot_file command line arguments are p, q, number + of trees to simulate, and plot file name + """ + + import seaborn as sns + sns.set(style='white', color_codes=True) + sns.set_style('ticks') + + # compare likelihood to empirical likelihood (might need large n) + n = 10000 + df = pd.DataFrame(columns=('p', 'q', 'parameters', 'f', 'L')) + ct = 0 + ps = (.1, .2, .3, .4) + qs = (.2, .4, .6, .8) + np.seterr(all='ignore') + for p in ps: + for q in qs: + forest = gctree.CollapsedForest((p, q), n) + print(f'parameters: p = {p}, q = {q}') + forest.simulate() + tree_dict = {} + for tree in forest.forest: + tree_hash = tuple((node.frequency, len(node.children)) + for node in tree.tree.traverse()) + if tree_hash not in tree_dict: + tree_dict[tree_hash] = [tree, tree.l((p, q))[0], 1] + else: + tree_dict[tree_hash][-1] += 1 + L_empirical, L_theoretical = zip( + *[(tree_dict[tree_hash][2], + np.exp(tree_dict[tree_hash][1])) + for tree_hash in tree_dict + if tree_dict[tree_hash][2]]) + for tree_hash in tree_dict: + df.loc[ct] = (p, q, f'p={p}, q={q}', tree_dict[tree_hash][2], + np.exp(tree_dict[tree_hash][1])) + ct += 1 + print() + + plt.figure() + limx = (1/n, 1.1) + limy = (1, 1.1*n) + g = sns.lmplot(x='L', y='f', col='p', row='q', hue='parameters', data=df, + fit_reg=False, scatter_kws={'alpha': .3}, height=1.5, + legend=False, row_order=reversed(qs)) + g.set(xscale='log', yscale='log', xlim=limx, ylim=limy) + for i in range(len(ps)): + for j in range(len(qs)): + g.axes[i, j].plot(limx, limy, ls='--', c='black', lw=.5, zorder=0, + markeredgewidth=.1) + g.axes[i, j].set_title(f'p={ps[j]}\nq={list(reversed(qs))[i]}', + x=.05, y=.7, size='x-small', ha='left') + g.set_axis_labels('', '') + g.fig.text(0.45, .02, s='GCtree likelihood', multialignment='center') + g.fig.text(.02, 0.7, s=f'frequency among {n} simulations', rotation=90, + multialignment='center') + plt.savefig(args.outbase+'.pdf') + + # MLE check + n = 20 + n2 = 500 + df = pd.DataFrame(columns=('true parameters', '$\\hat{p}$', '$\\hat{q}$')) + ct = 0 + for p in ps: + for q in qs: + for _ in range(n): + forest = gctree.CollapsedForest((p, q), n2) + print(f'parameters: p = {p}, q = {q}') + forest.simulate() + result = forest.mle() + df.loc[ct] = (f'p={p}, q={q}', result.x[0], result.x[1]) + ct += 1 + + plt.figure() + g = sns.lmplot(x='$\\hat{p}$', y='$\\hat{q}$', hue='true parameters', + data=df, fit_reg=False, scatter_kws={'alpha': .2}, height=6, + legend=False) + g.set(xlim=(0.05, .45), xticks=np.arange(0., .6, .1), ylim=(.1, .9), + yticks=np.arange(0., 1.2, .2)) + for i in range(len(ps)): + for j in range(len(qs)): + plt.scatter([ps[i]], [qs[j]], c='black', marker='+') + plt.savefig(args.outbase+'.2.pdf') + + return + + +def infer(args): + """inference subprogram""" + outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.naive)] + if args.bootstrap_phylipfile is not None: + outfiles.extend(pp.parse_outfile(args.bootstrap_phylipfile, + args.countfile, args.naive)) + bootstrap = len(outfiles) > 1 + if bootstrap: + # store bootstrap parameter data + df = pd.DataFrame(columns=('$\\hat{p}$', '$\\hat{q}$')) + # we'll store the mle gctrees here for computing support later + gctrees = [] + + for i, content in enumerate(outfiles): + if i > 0: + print(f'bootstrap sample {i}') + print('----------------------') + outbase = args.outbase + f'.bootstrap_{i}' + else: + outbase = args.outbase + phylip_collapsed = [gctree.CollapsedTree(tree=tree, frame=args.frame, + allow_repeats=(i > 0)) + for tree in content] + phylip_collapsed_unique = [] + for tree in phylip_collapsed: + if sum(tree.compare(tree2, method='identity') + for tree2 in phylip_collapsed_unique) == 0: + phylip_collapsed_unique.append(tree) + + parsimony_forest = gctree.CollapsedForest( + forest=phylip_collapsed_unique) + + if parsimony_forest.n_trees == 1: + warnings.warn('only one parsimony tree reported from dnapars') + + print('number of trees with integer branch lengths:', + parsimony_forest.n_trees) + + # check for unifurcations at root + unifurcations = sum(tree.tree.frequency == 0 + and len(tree.tree.children) == 1 + for tree in parsimony_forest.forest) + if unifurcations: + print(f'{unifurcations} trees exhibit unobserved unifurcation from' + ' root. Adding psuedocounts to these roots') + + # fit p and q using all trees + # if we get floating point errors, try a few more times + # (starting params are random) + max_tries = 10 + for tries in range(max_tries): + try: + parsimony_forest.mle(empirical_bayes_sum=True) + break + except FloatingPointError as e: + if tries + 1 < max_tries: + print(f'floating point error in MLE: {e}. ' + f'Attempt {tries + 1} of {max_tries}. ' + 'Rerunning with new random start.') + else: + raise + else: + raise + + print(f'params = {parsimony_forest.params}') + + if i > 0: + df.loc[i-1] = parsimony_forest.params + + # get likelihoods and sort by them + ls = [tree.l(parsimony_forest.params, build_cache=False)[0] + for tree in parsimony_forest.forest] + ls, parsimony_forest.forest = zip( + *sorted(zip(ls, parsimony_forest.forest), key=lambda x: x[0], + reverse=True)) + + if bootstrap: + gctrees.append(parsimony_forest.forest[0]) + + with open(outbase+'.inference.parsimony_forest.p', 'wb') as f: + pickle.dump(parsimony_forest, f) + + if args.colormapfile is not None: + with open(args.colormapfile, 'r') as f: + colormap = {} + for line in f: + seqid, color = line.rstrip().split('\t') + if ',' in color: + colors = {x.split(':')[0]: int(x.split(':')[1]) + for x in color.split(',')} + colormap[seqid] = colors + else: + colormap[seqid] = color + else: + colormap = None + + print('tree\talleles\tlogLikelihood') + for j, (l, collapsed_tree) in enumerate( + zip(ls, parsimony_forest.forest), 1): + alleles = sum(1 for _ in collapsed_tree.tree.traverse()) + print(f'{j}\t{alleles}\t{l}') + collapsed_tree.render(f'{outbase}.inference.{j}.svg', + idlabel=args.idlabel, + colormap=colormap, + chain_split=args.chain_split) + collapsed_tree.newick(f'{outbase}.inference.{j}.nk') + + # rank plot of likelihoods + plt.figure(figsize=(6.5, 2)) + try: + plt.plot(np.exp(ls), 'ko', clip_on=False, markersize=4) + plt.ylabel('GCtree likelihood') + plt.yscale('log') + plt.ylim([None, 1.1*max(np.exp(ls))]) + except FloatingPointError: + plt.plot(ls, 'ko', clip_on=False, markersize=4) + plt.ylabel('GCtree log-likelihood') + plt.ylim([None, 1.1*max(ls)]) + plt.xlabel('parsimony tree') + plt.xlim([-1, len(ls)]) + plt.tick_params(axis='y', direction='out', which='both') + plt.tick_params( + axis='x', + which='both', + bottom='off', + top='off', + labelbottom='off') + plt.savefig(outbase + '.inference.likelihood_rank.pdf') + + # rank plot of observed allele frequencies + y = sorted((node.frequency + for node in parsimony_forest.forest[0].tree.traverse() + if node.frequency != 0), + reverse=True) + plt.figure() + plt.bar(range(1, len(y) + 1), y, color='black') + plt.xlabel('genotype') + plt.ylabel('abundance') + plt.savefig(outbase + '.inference.abundance_rank.pdf') + + if bootstrap: + import seaborn as sns + sns.set(style="white", color_codes=True) + sns.set_style("ticks") + plt.figure() + np.seterr(all='ignore') + sns.jointplot('$\\hat{p}$', '$\\hat{q}$', data=df, + joint_kws={'alpha': .1, 's': .1}, + space=0, color='k', stat_func=None, xlim=(0, 1), + ylim=(0, 1), height=3) + plt.savefig(args.outbase+'.inference.bootstrap_theta.pdf') + gctrees[0].support(gctrees[1:]) + gctrees[0].render(args.outbase+'.inference.bootstrap_support.svg', + colormap=colormap, + idlabel=args.idlabel, + chain_split=args.chain_split, + show_support=True) + gctrees[0].support(gctrees[1:], compatibility=True) + gctrees[0].render(args.outbase + + '.inference.bootstrap_compatibility.svg', + colormap=colormap, + idlabel=args.idlabel, + chain_split=args.chain_split, + show_support=True) + + +def simulate(args): + """Simulation subprogram. Can simulate in two modes. + a) Neutral mode. A Galton–Watson process, with mutation probabilities + according to a user defined motif model e.g. S5F + b) Selection mode. Using the same mutation process as in a), but in + selection mode the poisson progeny distribution's lambda is variable + according to the hamming distance to a list of target sequences. The closer + a sequence gets to one of the targets the higher fitness and the closer + lambda will approach 2, vice versa when the sequence is far away lambda + approaches 0. + """ + random.seed(a=args.seed) + mutation_model = mm.MutationModel(args.mutability, args.substitution) + if args.lambda0 is None: + args.lambda0 = [max([1, int(.01*len(args.sequence))])] + args.sequence = args.sequence.upper() + if args.sequence2 is not None: + # Use the same mutation rate on both sequences + if len(args.lambda0) == 1: + args.lambda0 = [args.lambda0[0], args.lambda0[0]] + elif len(args.lambda0) != 2: + raise Exception('Only one or two lambda0 can be defined for a two ' + 'sequence simulation.') + # Require both sequences to be in frame 1: + if args.frame is not None and args.frame != 1: + print('Warning: When simulating with two sequences they are ' + 'truncated to be beginning at frame 1.') + args.sequence = args.sequence[ + (args.frame - 1): + (args.frame - 1 + (3 * (((len(args.sequence) + - (args.frame - 1)) // 3))))] + args.sequence2 = args.sequence2[ + (args.frame - 1): + (args.frame - 1 + (3 * (((len(args.sequence2) + - (args.frame - 1)) // 3))))] + # Extract the bounds between sequence 1 and 2: + seq_bounds = ((0, len(args.sequence)), + (len(args.sequence), + len(args.sequence) + len(args.sequence2))) + # Merge the two seqeunces to simplify future dealing with the pair: + args.sequence += args.sequence2.upper() + else: + seq_bounds = None + if args.selection: + if args.frame is None: + raise Exception('Frame must be defined when simulating with ' + 'selection.') + # the fully activating fraction on BA must be possible to reach within + # B_total + assert(args.B_total >= args.f_full) + # Make a list of target sequences: + targetAAseqs = [mutation_model.one_mutant(args.sequence, + args.target_dist, + frame=args.frame) + for i in range(args.target_count)] + # Find the total amount of A necessary for sustaining the inputted + # carrying capacity: + print((args.carry_cap, args.B_total, args.f_full, args.mature_affy)) + A_total = su.find_A_total(args.carry_cap, args.B_total, args.f_full, + args.mature_affy, args.U) + # Calculate the parameters for the logistic function: + Lp = su.find_Lp(args.f_full, args.U) + selection_params = [args.stop_dist, args.mature_affy, args.naive_affy, + args.target_dist, args.skip_update, targetAAseqs, + A_total, args.B_total, Lp, args.k, args.outbase] + else: + selection_params = None + + trials = 1000 + # this loop makes us resimulate if size too small, or backmutation + for trial in range(trials): + try: + tree = mutation_model.simulate(args.sequence, + seq_bounds=seq_bounds, + progeny=scipy.stats.poisson( + args.lambda_), + lambda0=args.lambda0, + n=args.n, + N=args.N, + T=args.T, + frame=args.frame, + verbose=args.verbose, + selection_params=selection_params) + if args.selection: + collapsed_tree = gctree.CollapsedTree(tree=tree, + frame=args.frame, + collapse_syn=False, + allow_repeats=True) + else: + # this will fail if backmutations + collapsed_tree = gctree.CollapsedTree(tree=tree, + frame=args.frame) + tree.ladderize() + uniques = sum(node.frequency > 0 + for node in collapsed_tree.tree.traverse()) + if uniques < 2: + raise RuntimeError(f'collapsed tree contains {uniques} ' + 'sampled sequences') + break + except RuntimeError as e: + print(f'{e}, trying again') + else: + raise + if trial == trials - 1: + raise RuntimeError(f'{trials} attempts exceeded') + + # In the case of a sequence pair print them to separate files: + if args.sequence2 is not None: + fh1 = open(args.outbase+'.simulation_seq1.fasta', 'w') + fh2 = open(args.outbase+'.simulation_seq2.fasta', 'w') + fh1.write('>naive\n') + fh1.write(args.sequence[seq_bounds[0][0]:seq_bounds[0][1]]+'\n') + fh2.write('>naive\n') + fh2.write(args.sequence[seq_bounds[1][0]:seq_bounds[1][1]]+'\n') + for leaf in tree.iter_leaves(): + if leaf.frequency != 0: + fh1.write('>' + leaf.name + '\n') + fh1.write(leaf.sequence[seq_bounds[0][0]:seq_bounds[0][1]] + + '\n') + fh2.write('>' + leaf.name + '\n') + fh2.write(leaf.sequence[seq_bounds[1][0]:seq_bounds[1][1]] + + '\n') + else: + with open(args.outbase+'.simulation.fasta', 'w') as f: + f.write('>naive\n') + f.write(args.sequence+'\n') + for leaf in tree.iter_leaves(): + if leaf.frequency != 0: + f.write('>' + leaf.name + '\n') + f.write(leaf.sequence + '\n') + + # some observable simulation stats to write + frequency, distance_from_naive, degree = zip( + *[(node.frequency, + utils.hamming_distance(node.sequence, args.sequence), + sum(utils.hamming_distance(node.sequence, node2.sequence) == 1 + for node2 in collapsed_tree.tree.traverse() + if node2.frequency and node2 is not node)) + for node in collapsed_tree.tree.traverse() if node.frequency]) + stats = pd.DataFrame({ + 'genotype abundance': frequency, + 'Hamming distance to root genotype': distance_from_naive, + 'Hamming neighbor genotypes': degree}) + stats.to_csv(args.outbase+'.simulation.stats.tsv', sep='\t', index=False) + + print(f'{sum(leaf.frequency for leaf in collapsed_tree.tree.traverse())}' + ' simulated observed sequences') + + # render the full lineage tree + ts = ete.TreeStyle() + ts.rotation = 90 + ts.show_leaf_name = False + ts.show_scale = False + + colors = {} + palette = ete.SVG_COLORS + palette -= set(['black', 'white', 'gray']) + palette = itertools.cycle(list(palette)) # <-- circular iterator + + # Either plot by DNA sequence or amino acid sequence: + if args.plotAA and args.selection: + colors[tree.AAseq] = 'gray' + else: + colors[tree.sequence] = 'gray' + + for n in tree.traverse(): + nstyle = ete.NodeStyle() + nstyle["size"] = 10 + if args.plotAA: + if n.AAseq not in colors: + colors[n.AAseq] = next(palette) + nstyle['fgcolor'] = colors[n.AAseq] + else: + if n.sequence not in colors: + colors[n.sequence] = next(palette) + nstyle['fgcolor'] = colors[n.sequence] + n.set_style(nstyle) + + # this makes the rendered branch lenths correspond to time + for node in tree.iter_descendants(): + node.dist = node.time - node.up.time + tree.render(args.outbase+'.simulation.lineage_tree.svg', tree_style=ts) + + # render collapsed tree + # create an id-wise colormap + # NOTE: node.name can be a set + if args.plotAA and args.selection: + colormap = {node.name: colors[node.AAseq] + for node in collapsed_tree.tree.traverse()} + else: + colormap = {node.name: colors[node.sequence] + for node in collapsed_tree.tree.traverse()} + collapsed_tree.write(args.outbase+'.simulation.collapsed_tree.p') + collapsed_tree.render(args.outbase+'.simulation.collapsed_tree.svg', + idlabel=args.idlabel, + colormap=colormap) + # print colormap to file + with open(args.outbase + '.simulation.collapsed_tree.colormap.tsv', + 'w') as f: + for name, color in colormap.items(): + f.write((name if isinstance(name, str) else ','.join(name)) + + '\t' + color + '\n') + + if args.selection: + # Define a list a suitable colors that are easy to distinguish: + palette = ['crimson', 'purple', 'hotpink', 'limegreen', 'darkorange', + 'darkkhaki', 'brown', 'lightsalmon', 'darkgreen', + 'darkseagreen', 'darkslateblue', 'teal', 'olive', 'wheat', + 'magenta', 'lightsteelblue', 'plum', 'gold'] + # circular iterator + palette = itertools.cycle(list(palette)) + colors = {i: next(palette) + for i in range(int(len(args.sequence) // 3))} + # The minimum distance to the target is colored: + colormap = {node.name: colors[node.target_dist] + for node in collapsed_tree.tree.traverse()} + collapsed_tree.write(args.outbase + + '.simulation.collapsed_runstat_color_tree.p') + collapsed_tree.render(args.outbase + + '.simulation.collapsed_runstat_color_tree.svg', + idlabel=args.idlabel, + colormap=colormap) + # Write a file with the selection run stats. These are also plotted: + with open(args.outbase + 'selection_sim.runstats.p', 'rb') as fh: + runstats = pickle.load(fh) + su.plot_runstats(runstats, args.outbase, colors) + + +def get_parser(): + parser = argparse.ArgumentParser( + description='germinal center tree inference and simulation') + subparsers = parser.add_subparsers( + title='subcommands', + description='specify one of these', + required=True, + help='additional help available for each subcommand') + + # parser for test subprogram + parser_test = subparsers.add_parser( + 'test', + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help='run tests on library functions') + parser_test.set_defaults(func=test) + + # parser for inference subprogram + parser_infer = subparsers.add_parser( + 'infer', + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help='likelihood ranking of parsimony trees') + parser_infer.add_argument('--naive', type=str, default=None, + help='name of naive sequence (outgroup root)') + parser_infer.add_argument( + 'phylipfile', type=str, + help='dnapars outfile (verbose output with sequences at each site)') + parser_infer.add_argument( + 'countfile', type=str, + help='File containing allele frequencies (sequence counts) in the ' + 'format: "SeqID,Nobs"') + parser_infer.add_argument( + '--bootstrap_phylipfile', type=str, + help='dnapars outfile from seqboot (multiple data sets)') + parser_infer.add_argument( + '--colormapfile', type=str, default=None, + help='File containing color map in the format: "SeqID\tcolor"') + parser_infer.add_argument( + '--chain_split', type=int, default=None, + help='split between heavy and light for combined seqs') + parser_infer.set_defaults(func=infer) + + # parser for simulation subprogram + parser_sim = subparsers.add_parser( + 'simulate', formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help='Neutral, and target selective, model gctree simulation') + parser_sim.add_argument( + 'sequence', type=str, help='seed naive nucleotide sequence') + parser_sim.add_argument( + 'mutability', type=str, help='path to mutability model file') + parser_sim.add_argument( + 'substitution', type=str, help='path to substitution model file') + parser_sim.add_argument( + '--sequence2', type=str, default=None, + help='Second seed naive nucleotide sequence. ' + 'For simulating heavy/light chain co-evolution.') + parser_sim.add_argument( + '--lambda', dest='lambda_', type=float, default=.9, + help='poisson branching parameter') + parser_sim.add_argument( + '--lambda0', type=float, default=None, nargs='*', + help='List of one or two elements with the baseline mutation rates. ' + 'Space separated input values. First element belonging to seed ' + 'sequence one and optionally the next to sequence 2. If only one ' + 'rate is provided for two sequences, this rate will be used on ' + 'both.') + parser_sim.add_argument( + '--n', type=int, default=None, help='cells downsampled') + parser_sim.add_argument( + '--N', type=int, default=None, help='target simulation size') + parser_sim.add_argument( + '--T', type=int, nargs='+', default=None, + help='observation time, if None we run until termination and take all' + ' leaves') + parser_sim.add_argument( + '--seed', type=int, default=None, help='integer random seed') + parser_sim.add_argument( + '--selection', type=bool, default=False, + help='Simulation with selection? true/false. When doing simulation ' + 'with selection an observation time cut must be set.') + parser_sim.add_argument( + '--stop_dist', type=int, default=None, + help='Stop when this distance has been reached in the selection ' + 'model.') + parser_sim.add_argument( + '--carry_cap', type=int, default=1000, + help='The carrying capacity of the simulation with selection. This ' + 'number affects the fixation time of a new mutation. Fixation ' + 'time is approx. log2(carry_cap), e.g. log2(1000) ~= 10.') + parser_sim.add_argument( + '--target_count', type=int, default=10, + help='The number of targets to generate.') + parser_sim.add_argument( + '--target_dist', type=int, default=10, + help='The number of non-synonymous mutations the target should be ' + 'away from the naive.') + parser_sim.add_argument( + '--naive_affy', type=float, default=100, + help='Affinity of the naive sequence in nano molar.') + parser_sim.add_argument( + '--mature_affy', type=float, default=1, + help='Affinity of the mature sequences in nano molar.') + parser_sim.add_argument( + '--skip_update', type=int, default=100, + help='When iterating through the leafs the B:A fraction is ' + 'recalculated every time. It is possible though to update less ' + 'often and get the same approximate results. This parameter sets ' + 'the number of iterations to skip, before updating the B:A ' + 'results. skip_update < carry_cap/10 recommended.') + parser_sim.add_argument( + '--B_total', type=float, default=1, + help='Total number of BCRs per B cell normalized to 10e4. So 1 equals ' + '10e4, 100 equals 10e6 etc. It is recommended to keep this as ' + 'the default.') + parser_sim.add_argument( + '--U', type=float, default=5, + help='Controls the fraction of BCRs binding antigen necessary to ' + 'only sustain the life of the B cell It is recommended to keep ' + 'this as the default.') + parser_sim.add_argument( + '--f_full', type=float, default=1, + help='The fraction of antigen bound BCRs on a B cell that is needed ' + 'to elicit close to maximum reponse. Cannot be smaller than ' + 'B_total. It is recommended to keep this as the default.') + parser_sim.add_argument( + '--k', type=float, default=2, + help='The exponent in the function to map hamming distance to ' + 'affinity. It is recommended to keep this as the default.') + parser_sim.add_argument( + '--plotAA', type=bool, default=False, + help='Plot trees with collapsing and coloring on amino acid level.') + parser_sim.add_argument( + '--verbose', type=bool, default=False, + help='Print progress during simulation. Mostly useful for simulation ' + 'with selection since this can take a while.') + parser_sim.set_defaults(func=simulate) + + # a common outbase parameter + for subparser in [parser_test, parser_infer, parser_sim]: + subparser.add_argument( + '--outbase', type=str, default='gctree.out', + help='output file base name') + + # common parameters for the inference and simulation subprograms + for subparser in [parser_infer, parser_sim]: + subparser.add_argument('--frame', type=int, default=None, + choices=(1, 2, 3), help='codon frame') + subparser.add_argument( + '--idlabel', action='store_true', + help='flag for labeling the sequence ids of the nodes in the ' + 'output tree images, also write associated fasta alignment ' + 'if True') + + return parser + + +def main(arg_list=None): + args = get_parser().parse_args(arg_list) + args.func(args) diff --git a/gctree/gctree.py b/gctree/gctree.py new file mode 100755 index 00000000..99959020 --- /dev/null +++ b/gctree/gctree.py @@ -0,0 +1,732 @@ +#! /usr/bin/env python + +''' +This module contains classes for simulation and inference for a binary +branching process with mutation in which the tree is collapsed to nodes that +count the number of clonal leaves of each type''' + +import numpy as np +import warnings +import random +import os +from scipy.special import logsumexp +from scipy.special import softmax +from scipy.optimize import minimize, check_grad +import ete3 +from Bio.Seq import Seq +from Bio.SeqRecord import SeqRecord +from Bio import AlignIO +from Bio.Phylo.TreeConstruction import MultipleSeqAlignment + +import pickle +from functools import lru_cache +from utils import hamming_distance + +np.seterr(all='raise') + + +class LeavesAndClades(): + r"""This is a base class for simulating, and computing likelihood for, an + infinite type branching process with branching probability p, mutation + probability q, and we collapse mutant clades off the root type and consider + just the number of clone leaves, c, and mutant clades, m. + + /\ + /\ ^ (3) + /\ ==> / \\ + /\\ + ^ + """ + + def __init__(self, params=None, c=None, m=None): + """initialize with branching probability p and mutation probability q, + both in the unit interval""" + if params is not None: + p, q = params + if not (0 <= p <= 1 and 0 <= q <= 1): + raise ValueError('p and q must be in the unit interval: ' + f'p = {p}, q = {q}') + self.params = params + if c is not None or m is not None: + if not (c >= 0) and (m >= 0) and (c+m > 0): + raise ValueError('c and m must be nonnegative integers ' + 'summing greater than zero: ' + f'c = {c}, m = {m}') + self.c = c + self.m = m + + def simulate(self): + '''simulate the number of clone leaves and mutant clades off a root + node''' + if self.params[0] >= .5: + warnings.warn(f'p = {self.p} is not subcritical, tree simulations' + ' not garanteed to terminate') + if self.params is None: + raise ValueError('params must be defined for simulation\n') + + # let's track the tree in breadth first order, listing number of clonal + # and mutant descendants of each node mutant clades terminate in this + # view + cumsum_clones = 0 + len_tree = 0 + self.c = 0 + self.m = 0 + # while termination condition not met + while cumsum_clones > len_tree - 1: + if random.random() < self.params[0]: + mutants = sum(random.random() < self.params[1] + for child in range(2)) + clones = 2 - mutants + self.m += mutants + else: + mutants = 0 + clones = 0 + self.c += 1 + cumsum_clones += clones + len_tree += 1 + assert cumsum_clones == len_tree - 1 + + @staticmethod + @lru_cache(maxsize=None) + def logf(c, m, *params): + """Log-probability of getting c leaves that are clones of the root and + m mutant clades off the root lineage, given branching probability p and + mutation probability q. AKA the spaceship distribution. Also returns + gradient wrt params (p, q). Computed by dynamic programming. + """ + p, q = params + if c == m == 0 or (c == 0 and m == 1): + logf_result = -np.inf + dlogfdp_result = 0 + dlogfdq_result = 0 + elif c == 1 and m == 0: + logf_result = np.log(1 - p) + dlogfdp_result = -1 / (1 - p) + dlogfdq_result = 0 + elif c == 0 and m == 2: + logf_result = np.log(p) + 2 * np.log(q) + dlogfdp_result = 1 / p + dlogfdq_result = 2 / q + else: + if m >= 1: + neighbor_logf, (neighbor_dlogfdp, + neighbor_dlogfdq) = LeavesAndClades.logf( + c, + m - 1, + *params) + logf_result = (np.log(2) + np.log(p) + np.log(q) + np.log(1-q) + + neighbor_logf) + dlogfdp_result = 1 / p + neighbor_dlogfdp + dlogfdq_result = 1 / q - 1 / (1 - q) + neighbor_dlogfdq + else: + logf_result = -np.inf + dlogfdp_result = 0. + dlogfdq_result = 0. + logg_array = [logf_result] + dloggdp_array = [dlogfdp_result] + dloggdq_array = [dlogfdq_result] + for cx in range(c+1): + for mx in range(m + 1): + if ((not (cx == mx == 0)) and (not (cx == c and mx == m))): + (neighbor1_logf, + (neighbor1_dlogfdp, + neighbor1_dlogfdq)) = LeavesAndClades.logf(cx, mx, + *params) + (neighbor2_logf, + (neighbor2_dlogfdp, + neighbor2_dlogfdq)) = LeavesAndClades.logf( + c - cx, m - mx, *params) + logg = (np.log(p) + 2 * np.log(1 - q) + neighbor1_logf + + neighbor2_logf) + dloggdp = 1 / p + neighbor1_dlogfdp + neighbor2_dlogfdp + dloggdq = (- 2 / (1 - q) + + neighbor1_dlogfdq + neighbor2_dlogfdq) + logg_array.append(logg) + dloggdp_array.append(dloggdp) + dloggdq_array.append(dloggdq) + logf_result = logsumexp(logg_array) + softmax_logg_array = softmax(logg_array) + dlogfdp_result = np.multiply(softmax_logg_array, + dloggdp_array).sum() + dlogfdq_result = np.multiply(softmax_logg_array, + dloggdq_array).sum() + + return (logf_result, np.array([dlogfdp_result, dlogfdq_result])) + + @staticmethod + def build_logf_cache(c_max, m_max, *params): + ''' build up the lru_cache from the bottom to avoid recursion depth + issues''' + LeavesAndClades.logf.cache_clear() + print(f'building likelihood cache for parameters {params}') + for c in range(c_max + 1): + for m in range(m_max + 1): + LeavesAndClades.logf(c, m, *params) + + +class CollapsedTree(LeavesAndClades): + r"""Here's a derived class for a collapsed tree, where we recurse into the + mutant clades + (4) + / | \\ + (3)(1)(2) + | \\ + (2) (1) + """ + + def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, + allow_repeats=False): + ''' + For intialization, either params or tree (or both) must be provided + params: offspring distribution parameters + tree: ete tree with frequency node feature. If uncollapsed, it will be + collapsed + frame: tranlation frame, with default None, no tranlation attempted + ''' + LeavesAndClades.__init__(self, params=params) + if frame is not None and frame not in (1, 2, 3): + raise RuntimeError('frame must be 1, 2, 3, or None') + self.frame = frame + + if collapse_syn is True: + tree.dist = 0 # no branch above root + for node in tree.iter_descendants(): + aa = Seq(node.sequence[(frame-1): + (frame - 1 + (3 * (((len(node.sequence) + - (frame - 1)) // 3 + ))))] + ).translate() + aa_parent = Seq(node.up.sequence[ + (frame - 1): + (frame - 1 + (3 * (((len(node.sequence) + - (frame - 1)) // 3))))] + ).translate() + node.dist = hamming_distance(aa, aa_parent) + + if tree is not None: + self.tree = tree.copy() + # remove unobserved internal unifurcations + for node in self.tree.iter_descendants(): + parent = node.up + if node.frequency == 0 and len(node.children) == 1: + node.delete(prevent_nondicotomic=False) + node.children[0].dist = hamming_distance( + node.children[0].sequence, parent.sequence) + + # iterate over the tree below root and collapse edges of zero + # length if the node is a leaf and it's parent has nonzero + # frequency we combine taxa names to a set this acommodates + # bootstrap samples that result in repeated genotypes + observed_genotypes = set((leaf.name for leaf in self.tree)) + observed_genotypes.add(self.tree.name) + for node in self.tree.get_descendants(strategy='postorder'): + if node.dist == 0: + node.up.frequency += node.frequency + if isinstance(node.name, str): + node_set = set([node.name]) + else: + node_set = set(node.name) + if isinstance(node.up.name, str): + node_up_set = set([node.up.name]) + else: + node_up_set = set(node.up.name) + if node_up_set < observed_genotypes: + if node_set < observed_genotypes: + node.up.name = tuple(node_set | node_up_set) + if len(node.up.name) == 1: + node.up.name = node.up.name[0] + elif node_set < observed_genotypes: + node.up.name = tuple(node_set) + if len(node.up.name) == 1: + node.up.name = node.up.name[0] + node.delete(prevent_nondicotomic=False) + + final_observed_genotypes = set() + for node in self.tree.traverse(): + if node.frequency > 0 or node == self.tree: + for name in ((node.name,) if isinstance(node.name, str) + else node.name): + final_observed_genotypes.add(name) + if final_observed_genotypes != observed_genotypes: + raise RuntimeError( + 'observed genotypes don\'t match after ' + f'collapse\n\tbefore: {observed_genotypes}' + f'\n\tafter: {final_observed_genotypes}\n\t' + 'symmetric diff: ' + f'{observed_genotypes ^ final_observed_genotypes}') + assert (sum(node.frequency for node in tree.traverse()) + == sum(node.frequency for node in self.tree.traverse())) + + rep_seq = (sum(node.frequency > 0 for node in self.tree.traverse()) + - len(set([node.sequence + for node in self.tree.traverse() + if node.frequency > 0]))) + if not allow_repeats and rep_seq: + raise RuntimeError( + 'Repeated observed sequences in collapsed ' + f'tree. {rep_seq} sequences were found repeated.') + elif allow_repeats and rep_seq: + rep_seq = (sum(node.frequency > 0 + for node in self.tree.traverse()) + - len(set([node.sequence + for node in self.tree.traverse() + if node.frequency > 0]))) + print('Repeated observed sequences in collapsed tree. ' + f'{rep_seq} sequences were found repeated.') + # a custom ladderize accounting for abundance and sequence to break + # ties in abundance + for node in self.tree.traverse(strategy='postorder'): + # add a partition feature and compute it recursively up tree + node.add_feature( + 'partition', + node.frequency + sum(node2.partition + for node2 in node.children)) + # sort children of this node based on partion and sequence + node.children.sort( + key=lambda node: (node.partition, node.sequence)) + else: + self.tree = tree + + def ll(self, params, sign=1, build_cache=True): + """log likelihood of params, conditioned on collapsed tree, and its + gradient wrt params optional parameter sign must be 1 or -1, with the + latter useful for MLE by minimization + """ + if self.tree is None: + raise ValueError('tree data must be defined to compute likelihood') + if sign not in (-1, 1): + raise ValueError('sign must be 1 or -1') + if build_cache: + c_max = max(node.frequency for node in self.tree.traverse()) + m_max = max(len(node.children) for node in self.tree.traverse()) + LeavesAndClades.build_logf_cache(c_max, m_max, *params) + leaves_and_clades_list = [ + LeavesAndClades( + c=node.frequency, m=len(node.children)) + for node in self.tree.traverse()] + if leaves_and_clades_list[0].c == 0 and \ + leaves_and_clades_list[0].m == 1 and \ + leaves_and_clades_list[0].logf(leaves_and_clades_list[0].c, + leaves_and_clades_list[0].m, + *params)[0] == -np.inf: + # if unifurcation not possible under current model, add a + # psuedocount for the naive + leaves_and_clades_list[0].c = 1 + # extract vector of function values and gradient components + logf_data = [ + leaves_and_clades.logf( + leaves_and_clades.c, + leaves_and_clades.m, + *params) + for leaves_and_clades in leaves_and_clades_list] + logf = np.array([[x[0]] for x in logf_data]).sum() + grad_logf = np.array([x[1] for x in logf_data]).sum(axis=0) + return sign*logf, sign*grad_logf + + def mle(self, **kwargs): + ''' + Maximum likelihood estimate for params given tree + updates params if not None + returns optimization result + ''' + # random initalization + x_0 = (random.random(), random.random()) + bounds = ((1e-6, 1 - 1e-6), (1e-6, 1 - 1e-6)) + kwargs['sign'] = -1 + grad_check = check_grad(lambda x: self.ll(x, **kwargs)[0], + lambda x: self.ll(x, **kwargs)[1], + x_0) + if grad_check > 1e-3: + warnings.warn('gradient mismatches finite difference ' + f'approximation by {grad_check}', RuntimeWarning) + result = minimize(lambda x: self.ll(x, **kwargs), jac=True, x0=x_0, + method='L-BFGS-B', options={'ftol': 1e-10}, + bounds=bounds) + # update params if None and optimization successful + if not result.success: + warnings.warn('optimization not sucessful, ' + result.message, + RuntimeWarning) + elif self.params is None: + self.params = result.x.tolist() + return result + + def simulate(self): + """simulate a collapsed tree given params + replaces existing tree data member with simulation result, and returns + self + """ + if self.params is None: + raise ValueError('params must be defined for simulation') + + # initiate by running a LeavesAndClades simulation to get the number of + # clones and mutants in the root node of the collapsed tree + LeavesAndClades.simulate(self) + self.tree = ete3.TreeNode() + self.tree.add_feature('frequency', self.c) + if self.m == 0: + return self + for _ in range(self.m): + # ooooh, recursion + child = CollapsedTree( + params=self.params, frame=self.frame).simulate().tree + child.dist = 1 + self.tree.add_child(child) + + return self + + def __str__(self): + """return a string representation for printing""" + return 'params = ' + str(self.params) + '\ntree:\n' + str(self.tree) + + def render(self, outfile, idlabel=False, colormap=None, show_support=False, + chain_split=None): + """render to image file, filetype inferred from suffix, svg for color + images + """ + def my_layout(node): + if colormap is None or node.name not in colormap: + circle_color = 'lightgray' + else: + circle_color = colormap[node.name] + text_color = 'black' + if isinstance(circle_color, str): + C = ete3.CircleFace( + radius=max(3, 10*np.sqrt(node.frequency)), + color=circle_color, + label={'text': str(node.frequency), + 'color': text_color} + if node.frequency > 0 else None) + C.rotation = -90 + C.hz_align = 1 + ete3.faces.add_face_to_node(C, node, 0) + else: + P = ete3.PieChartFace( + [100 * x / node.frequency + for x in circle_color.values()], + 2 * 10 * np.sqrt(node.frequency), + 2 * 10 * np.sqrt(node.frequency), + colors=[(color if color != 'None' else 'lightgray') + for color in list(circle_color.keys())], + line_color=None) + T = ete3.TextFace( + ' '.join([str(x) for x in list(circle_color.values())]), + tight_text=True) + T.hz_align = 1 + T.rotation = -90 + ete3.faces.add_face_to_node(P, node, 0, + position='branch-right') + ete3.faces.add_face_to_node(T, node, 1, + position='branch-right') + if idlabel: + T = ete3.TextFace(node.name, tight_text=True, fsize=6) + T.rotation = -90 + T.hz_align = 1 + ete3.faces.add_face_to_node( + T, node, + 1 if isinstance(circle_color, str) else 2, + position='branch-right') + for node in self.tree.traverse(): + nstyle = ete3.NodeStyle() + nstyle['size'] = 0 + if node.up is not None: + if set(node.sequence.upper()) == set('ACGT'): + if chain_split is not None: + if self.frame is not None: + raise NotImplementedError( + 'frame not implemented with chain_split') + leftseq_mutated = hamming_distance( + node.sequence[:chain_split], + node.up.sequence[:chain_split]) > 0 + rightseq_mutated = hamming_distance( + node.sequence[chain_split:], + node.up.sequence[chain_split:]) > 0 + if leftseq_mutated and rightseq_mutated: + nstyle['hz_line_color'] = 'purple' + nstyle['hz_line_width'] = 3 + elif leftseq_mutated: + nstyle['hz_line_color'] = 'red' + nstyle['hz_line_width'] = 2 + elif rightseq_mutated: + nstyle['hz_line_color'] = 'blue' + nstyle['hz_line_width'] = 2 + if self.frame is not None: + aa = Seq(node.sequence[ + (self.frame-1): + (self.frame - 1 + + (3 * ((len(node.sequence) + - (self.frame - 1)) // 3)))] + ).translate() + aa_parent = Seq(node.up.sequence[ + (self.frame - 1): + (self.frame - 1 + + (3 * ((len(node.sequence) + - (self.frame - 1)) + // 3)))] + ).translate() + nonsyn = hamming_distance(aa, aa_parent) + if '*' in aa: + nstyle['bgcolor'] = 'red' + if nonsyn > 0: + nstyle['hz_line_color'] = 'black' + nstyle['hz_line_width'] = nonsyn + else: + nstyle['hz_line_type'] = 1 + node.set_style(nstyle) + + ts = ete3.TreeStyle() + ts.show_leaf_name = False + ts.rotation = 90 + ts.draw_aligned_faces_as_table = False + ts.allow_face_overlap = True + ts.layout_fn = my_layout + ts.show_scale = False + ts.show_branch_support = show_support + self.tree.render(outfile, tree_style=ts) + # if we labelled seqs, let's also write the alignment out so we have + # the sequences (including of internal nodes) + if idlabel: + aln = MultipleSeqAlignment([]) + for node in self.tree.traverse(): + aln.append(SeqRecord( + Seq(str(node.sequence)), id=str(node.name), + description=f'abundance={node.frequency}')) + AlignIO.write(aln, + open(os.path.splitext(outfile)[0] + '.fasta', 'w'), + 'fasta') + + def write(self, file_name): + '''serialize tree to file''' + with open(file_name, 'wb') as f: + pickle.dump(self, f) + + def newick(self, file_name): + '''write to newick file''' + self.tree.write(format=1, outfile=file_name) + + def compare(self, tree2, method='identity'): + '''compare this tree to the other tree''' + if method == 'identity': + # we compare lists of seq, parent, abundance + # return true if these lists are identical, else false + list1 = sorted((node.sequence, node.frequency, + node.up.sequence if node.up is not None else None) + for node in self.tree.traverse()) + list2 = sorted((node.sequence, node.frequency, + node.up.sequence if node.up is not None else None) + for node in tree2.tree.traverse()) + return list1 == list2 + elif method == 'MRCA': + # matrix of hamming distance of common ancestors of taxa + # takes a true and inferred tree as CollapsedTree objects + taxa = [node.sequence for node in self.tree.traverse() + if node.frequency] + n_taxa = len(taxa) + d = np.zeros(shape=(n_taxa, n_taxa)) + sum_sites = np.zeros(shape=(n_taxa, n_taxa)) + for i in range(n_taxa): + nodei_true = self.tree.iter_search_nodes( + sequence=taxa[i]).__next__() + nodei = tree2.tree.iter_search_nodes( + sequence=taxa[i]).__next__() + for j in range(i + 1, n_taxa): + nodej_true = self.tree.iter_search_nodes( + sequence=taxa[j]).__next__() + nodej = tree2.tree.iter_search_nodes( + sequence=taxa[j]).__next__() + MRCA_true = self.tree.get_common_ancestor( + (nodei_true, nodej_true)).sequence + MRCA = tree2.tree.get_common_ancestor( + (nodei, nodej)).sequence + d[i, j] = hamming_distance(MRCA_true, MRCA) + sum_sites[i, j] = len(MRCA_true) + return d.sum() / sum_sites.sum() + elif method == 'RF': + tree1_copy = self.tree.copy(method='deepcopy') + tree2_copy = tree2.tree.copy(method='deepcopy') + for treex in (tree1_copy, tree2_copy): + for node in list(treex.traverse()): + if node.frequency > 0: + child = ete3.TreeNode() + child.add_feature('sequence', node.sequence) + node.add_child(child) + try: + return tree1_copy.robinson_foulds( + tree2_copy, attr_t1='sequence', attr_t2='sequence', + unrooted_trees=True)[0] + except: + return tree1_copy.robinson_foulds( + tree2_copy, attr_t1='sequence', attr_t2='sequence', + unrooted_trees=True, allow_dup=True)[0] + else: + raise ValueError('invalid distance method: ' + method) + + def get_split(self, node): + """return the bipartition resulting from clipping this node's edge + above + """ + if node.get_tree_root() != self.tree: + raise ValueError('node not found') + if node == self.tree: + raise ValueError('this node is the root (no split above)') + parent = node.up + taxa1 = [] + for node2 in node.traverse(): + if node2.frequency > 0 or node2 == self.tree: + if isinstance(node2.name, str): + taxa1.append(node2.name) + else: + taxa1.extend(node2.name) + taxa1 = set(taxa1) + node.detach() + taxa2 = [] + for node2 in self.tree.traverse(): + if node2.frequency > 0 or node2 == self.tree: + if isinstance(node2.name, str): + taxa2.append(node2.name) + else: + taxa2.extend(node2.name) + taxa2 = set(taxa2) + parent.add_child(node) + assert taxa1.isdisjoint(taxa2) + assert taxa1.union(taxa2) == set((name + for node in self.tree.traverse() + if node.frequency > 0 + or node == self.tree + for name in ((node.name,) + if isinstance(node.name, + str) + else node.name))) + return tuple(sorted([taxa1, taxa2])) + + @staticmethod + def split_compatibility(split1, split2): + diff = split1[0].union(split1[1]) ^ split2[0].union(split2[1]) + if diff: + raise ValueError('splits do not cover the same taxa\n' + f'\ttaxa not in both: {diff}') + for partition1 in split1: + for partition2 in split2: + if partition1.isdisjoint(partition2): + return True + return False + + def support(self, bootstrap_trees_list, weights=None, compatibility=False): + ''' + compute support from a list of bootstrap GCtrees + weights (optional) is needed for weighting parsimony degenerate trees + compatibility mode counts trees that don't disconfirm the split + ''' + for node in self.tree.get_descendants(): + split = self.get_split(node) + support = 0 + compatibility_ = 0 + for i, tree in enumerate(bootstrap_trees_list): + compatible = True + supported = False + for boot_node in tree.tree.get_descendants(): + boot_split = tree.get_split(boot_node) + if (compatibility + and compatible + and not self.split_compatibility(split, + boot_split)): + compatible = False + if (not compatibility and not supported + and boot_split == split): + supported = True + if supported: + support += weights[i] if weights is not None else 1 + if compatible: + compatibility_ += weights[i] if weights is not None else 1 + node.support = compatibility_ if compatibility else support + + return self + + +class CollapsedForest(CollapsedTree): + r"""simply a set of CollapsedTrees, with the same p and q parameters + (4) (3) + / | \\ / \\ + (3)(1)(2) (1) (2) + | \\ , , ... + (2) (1) + """ + + def __init__(self, params=None, n_trees=None, forest=None): + """in addition to p and q, we need number of trees + can also intialize with forest, a list of trees, each an instance of + CollapsedTree + """ + CollapsedTree.__init__(self, params=params) + if forest is None and params is None: + raise ValueError('either params or forest (or both) must be ' + 'provided') + if forest is not None: + if len(forest) == 0: + raise ValueError('passed empty tree list') + if n_trees is not None and len(forest) != n_trees: + raise ValueError('n_trees not consistent with forest') + self.forest = forest + if n_trees is not None: + if type(n_trees) is not int or n_trees < 1: + raise ValueError('number of trees must be at least one') + self.n_trees = n_trees + if n_trees is None and forest is not None: + self.n_trees = len(forest) + + def simulate(self): + """simulate a forest of collapsed trees given params and number of + trees replaces existing forest data member with simulation result, and + returns self + """ + if self.params is None or self.n_trees is None: + raise ValueError( + 'params and n_trees parameters must be defined for simulation') + self.forest = [CollapsedTree(self.params).simulate() + for x in range(self.n_trees)] + return self + + def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): + """likelihood of params, given forest, and it's gradient wrt params + optional parameter sign must be 1 or -1, with the latter useful for MLE + by minimization if optional parameter empirical_bayes_sum is true, + we're estimating params for a set of parsimony trees + """ + if self.forest is None: + raise ValueError( + 'forest data must be defined to compute likelihood') + if sign not in (-1, 1): + raise ValueError('sign must be 1 or -1') + if build_cache: + c_max = max(node.frequency + for tree in self.forest + for node in tree.tree.traverse()) + m_max = max(len(node.children) + for tree in self.forest + for node in tree.tree.traverse()) + LeavesAndClades.build_logf_cache(c_max, m_max, *params) + # we don't want to build the cache again in each tree + terms = [tree.ll(params, build_cache=False) for tree in self.forest] + ls = np.array([term[0] for term in terms]) + grad_ls = np.array([term[1] for term in terms]) + if empirical_bayes_sum: + # we need to find the smallest derivative component for each + # coordinate, then subtract off to get positive things to logsumexp + grad_l = [] + for j in range(len(params)): + i_prime = grad_ls[:, j].argmin() + grad_l.append(grad_ls[i_prime, j] + + np.exp(logsumexp( + ls - ls[i_prime], + b=grad_ls[:, j] - grad_ls[i_prime, j]) + - logsumexp(ls - ls[i_prime]))) + return sign*(-np.log(len(ls)) + + logsumexp(ls)), sign*np.array(grad_l) + else: + return sign*ls.sum(), sign*grad_ls.sum(axis=0) + + # NOTE: we get mle() method for free by inheritance/polymorphism magic + + def __str__(self): + '''return a string representation for printing''' + return (f'params = {self.params}, n_trees = {self.n_trees}\n' + '\n'.join([str(tree) for tree in self.forest])) diff --git a/bin/mutation_model.py b/gctree/mutation_model.py similarity index 100% rename from bin/mutation_model.py rename to gctree/mutation_model.py diff --git a/bin/phylip_parse.py b/gctree/phylip_parse.py similarity index 100% rename from bin/phylip_parse.py rename to gctree/phylip_parse.py diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..dad82db6 --- /dev/null +++ b/setup.py @@ -0,0 +1,36 @@ +import setuptools +import versioneer + + +with open('README.md', 'r') as fh: + long_description = fh.read() + +setuptools.setup( + name='mutyper', + version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), + author='William DeWitt', + author_email='wsdewitt@gmail.com', + description='phylogenetic inference of genotype-collapsed trees', + long_description=long_description, + long_description_content_type='text/markdown', + url='https://github.com/matsengrp/gctree', + entry_points={'console_scripts': ['gctree=gctree.cli:main']}, + # packages=setuptools.find_packages(exclude=['tests', 'docs', 'docsrc']), + # packages=['gctree'], + classifiers=[ + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + ], + python_requires='>=3.7', + install_requires=[ + 'ete3', + 'biopython', + 'matplotlib', + 'pandas', + 'scipy', + 'seaborn', + 'jellyfish' + ] +) From a36797db35248f9736376bdeba2ba39740d7b11a Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 16:35:44 -0700 Subject: [PATCH 02/32] versioneer --- .gitattributes | 1 + MANIFEST.in | 2 + gctree/_version.py | 520 +++++++++++++ setup.cfg | 9 + setup.py | 2 +- versioneer.py | 1822 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 2355 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 MANIFEST.in create mode 100644 gctree/_version.py create mode 100644 setup.cfg create mode 100644 versioneer.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..84fb3c8a --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +gctree/_version.py export-subst diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..4e7d72b6 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include versioneer.py +include gctree/_version.py diff --git a/gctree/_version.py b/gctree/_version.py new file mode 100644 index 00000000..3f1701dd --- /dev/null +++ b/gctree/_version.py @@ -0,0 +1,520 @@ + +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. Generated by +# versioneer-0.18 (https://github.com/warner/python-versioneer) + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys + + +def get_keywords(): + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "$Format:%d$" + git_full = "$Format:%H$" + git_date = "$Format:%ci$" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_config(): + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "" + cfg.tag_prefix = "" + cfg.parentdir_prefix = "None" + cfg.versionfile_source = "gctree/_version.py" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, p.returncode + return stdout, p.returncode + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %s but none started with prefix %s" % + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%s*" % tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%d" % pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions(): + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for i in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..94243911 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,9 @@ +[versioneer] +VCS = git +versionfile_source = gctree/_version.py +versionfile_build = gctree/_version.py +tag_prefix = + +[flake8] +exclude = gctree/_version.py, + versioneer.py, diff --git a/setup.py b/setup.py index dad82db6..6d5d6933 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ long_description = fh.read() setuptools.setup( - name='mutyper', + name='gctree', version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), author='William DeWitt', diff --git a/versioneer.py b/versioneer.py new file mode 100644 index 00000000..64fea1c8 --- /dev/null +++ b/versioneer.py @@ -0,0 +1,1822 @@ + +# Version: 0.18 + +"""The Versioneer - like a rocketeer, but for versions. + +The Versioneer +============== + +* like a rocketeer, but for versions! +* https://github.com/warner/python-versioneer +* Brian Warner +* License: Public Domain +* Compatible With: python2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, and pypy +* [![Latest Version] +(https://pypip.in/version/versioneer/badge.svg?style=flat) +](https://pypi.python.org/pypi/versioneer/) +* [![Build Status] +(https://travis-ci.org/warner/python-versioneer.png?branch=master) +](https://travis-ci.org/warner/python-versioneer) + +This is a tool for managing a recorded version number in distutils-based +python projects. The goal is to remove the tedious and error-prone "update +the embedded version string" step from your release process. Making a new +release should be as easy as recording a new tag in your version-control +system, and maybe making new tarballs. + + +## Quick Install + +* `pip install versioneer` to somewhere to your $PATH +* add a `[versioneer]` section to your setup.cfg (see below) +* run `versioneer install` in your source tree, commit the results + +## Version Identifiers + +Source trees come from a variety of places: + +* a version-control system checkout (mostly used by developers) +* a nightly tarball, produced by build automation +* a snapshot tarball, produced by a web-based VCS browser, like github's + "tarball from tag" feature +* a release tarball, produced by "setup.py sdist", distributed through PyPI + +Within each source tree, the version identifier (either a string or a number, +this tool is format-agnostic) can come from a variety of places: + +* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows + about recent "tags" and an absolute revision-id +* the name of the directory into which the tarball was unpacked +* an expanded VCS keyword ($Id$, etc) +* a `_version.py` created by some earlier build step + +For released software, the version identifier is closely related to a VCS +tag. Some projects use tag names that include more than just the version +string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool +needs to strip the tag prefix to extract the version identifier. For +unreleased software (between tags), the version identifier should provide +enough information to help developers recreate the same tree, while also +giving them an idea of roughly how old the tree is (after version 1.2, before +version 1.3). Many VCS systems can report a description that captures this, +for example `git describe --tags --dirty --always` reports things like +"0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the +0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has +uncommitted changes. + +The version identifier is used for multiple purposes: + +* to allow the module to self-identify its version: `myproject.__version__` +* to choose a name and prefix for a 'setup.py sdist' tarball + +## Theory of Operation + +Versioneer works by adding a special `_version.py` file into your source +tree, where your `__init__.py` can import it. This `_version.py` knows how to +dynamically ask the VCS tool for version information at import time. + +`_version.py` also contains `$Revision$` markers, and the installation +process marks `_version.py` to have this marker rewritten with a tag name +during the `git archive` command. As a result, generated tarballs will +contain enough information to get the proper version. + +To allow `setup.py` to compute a version too, a `versioneer.py` is added to +the top level of your source tree, next to `setup.py` and the `setup.cfg` +that configures it. This overrides several distutils/setuptools commands to +compute the version when invoked, and changes `setup.py build` and `setup.py +sdist` to replace `_version.py` with a small static file that contains just +the generated version data. + +## Installation + +See [INSTALL.md](./INSTALL.md) for detailed installation instructions. + +## Version-String Flavors + +Code which uses Versioneer can learn about its version string at runtime by +importing `_version` from your main `__init__.py` file and running the +`get_versions()` function. From the "outside" (e.g. in `setup.py`), you can +import the top-level `versioneer.py` and run `get_versions()`. + +Both functions return a dictionary with different flavors of version +information: + +* `['version']`: A condensed version string, rendered using the selected + style. This is the most commonly used value for the project's version + string. The default "pep440" style yields strings like `0.11`, + `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section + below for alternative styles. + +* `['full-revisionid']`: detailed revision identifier. For Git, this is the + full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". + +* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the + commit date in ISO 8601 format. This will be None if the date is not + available. + +* `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that + this is only accurate if run in a VCS checkout, otherwise it is likely to + be False or None + +* `['error']`: if the version string could not be computed, this will be set + to a string describing the problem, otherwise it will be None. It may be + useful to throw an exception in setup.py if this is set, to avoid e.g. + creating tarballs with a version string of "unknown". + +Some variants are more useful than others. Including `full-revisionid` in a +bug report should allow developers to reconstruct the exact code being tested +(or indicate the presence of local changes that should be shared with the +developers). `version` is suitable for display in an "about" box or a CLI +`--version` output: it can be easily compared against release notes and lists +of bugs fixed in various releases. + +The installer adds the following text to your `__init__.py` to place a basic +version in `YOURPROJECT.__version__`: + + from ._version import get_versions + __version__ = get_versions()['version'] + del get_versions + +## Styles + +The setup.cfg `style=` configuration controls how the VCS information is +rendered into a version string. + +The default style, "pep440", produces a PEP440-compliant string, equal to the +un-prefixed tag name for actual releases, and containing an additional "local +version" section with more detail for in-between builds. For Git, this is +TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags +--dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the +tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and +that this commit is two revisions ("+2") beyond the "0.11" tag. For released +software (exactly equal to a known tag), the identifier will only contain the +stripped tag, e.g. "0.11". + +Other styles are available. See [details.md](details.md) in the Versioneer +source tree for descriptions. + +## Debugging + +Versioneer tries to avoid fatal errors: if something goes wrong, it will tend +to return a version of "0+unknown". To investigate the problem, run `setup.py +version`, which will run the version-lookup code in a verbose mode, and will +display the full contents of `get_versions()` (including the `error` string, +which may help identify what went wrong). + +## Known Limitations + +Some situations are known to cause problems for Versioneer. This details the +most significant ones. More can be found on Github +[issues page](https://github.com/warner/python-versioneer/issues). + +### Subprojects + +Versioneer has limited support for source trees in which `setup.py` is not in +the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are +two common reasons why `setup.py` might not be in the root: + +* Source trees which contain multiple subprojects, such as + [Buildbot](https://github.com/buildbot/buildbot), which contains both + "master" and "slave" subprojects, each with their own `setup.py`, + `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI + distributions (and upload multiple independently-installable tarballs). +* Source trees whose main purpose is to contain a C library, but which also + provide bindings to Python (and perhaps other langauges) in subdirectories. + +Versioneer will look for `.git` in parent directories, and most operations +should get the right version string. However `pip` and `setuptools` have bugs +and implementation details which frequently cause `pip install .` from a +subproject directory to fail to find a correct version string (so it usually +defaults to `0+unknown`). + +`pip install --editable .` should work correctly. `setup.py install` might +work too. + +Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in +some later version. + +[Bug #38](https://github.com/warner/python-versioneer/issues/38) is tracking +this issue. The discussion in +[PR #61](https://github.com/warner/python-versioneer/pull/61) describes the +issue from the Versioneer side in more detail. +[pip PR#3176](https://github.com/pypa/pip/pull/3176) and +[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve +pip to let Versioneer work correctly. + +Versioneer-0.16 and earlier only looked for a `.git` directory next to the +`setup.cfg`, so subprojects were completely unsupported with those releases. + +### Editable installs with setuptools <= 18.5 + +`setup.py develop` and `pip install --editable .` allow you to install a +project into a virtualenv once, then continue editing the source code (and +test) without re-installing after every change. + +"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a +convenient way to specify executable scripts that should be installed along +with the python package. + +These both work as expected when using modern setuptools. When using +setuptools-18.5 or earlier, however, certain operations will cause +`pkg_resources.DistributionNotFound` errors when running the entrypoint +script, which must be resolved by re-installing the package. This happens +when the install happens with one version, then the egg_info data is +regenerated while a different version is checked out. Many setup.py commands +cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into +a different virtualenv), so this can be surprising. + +[Bug #83](https://github.com/warner/python-versioneer/issues/83) describes +this one, but upgrading to a newer version of setuptools should probably +resolve it. + +### Unicode version strings + +While Versioneer works (and is continually tested) with both Python 2 and +Python 3, it is not entirely consistent with bytes-vs-unicode distinctions. +Newer releases probably generate unicode version strings on py2. It's not +clear that this is wrong, but it may be surprising for applications when then +write these strings to a network connection or include them in bytes-oriented +APIs like cryptographic checksums. + +[Bug #71](https://github.com/warner/python-versioneer/issues/71) investigates +this question. + + +## Updating Versioneer + +To upgrade your project to a new release of Versioneer, do the following: + +* install the new Versioneer (`pip install -U versioneer` or equivalent) +* edit `setup.cfg`, if necessary, to include any new configuration settings + indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. +* re-run `versioneer install` in your source tree, to replace + `SRC/_version.py` +* commit any changed files + +## Future Directions + +This tool is designed to make it easily extended to other version-control +systems: all VCS-specific components are in separate directories like +src/git/ . The top-level `versioneer.py` script is assembled from these +components by running make-versioneer.py . In the future, make-versioneer.py +will take a VCS name as an argument, and will construct a version of +`versioneer.py` that is specific to the given VCS. It might also take the +configuration arguments that are currently provided manually during +installation by editing setup.py . Alternatively, it might go the other +direction and include code from all supported VCS systems, reducing the +number of intermediate scripts. + + +## License + +To make Versioneer easier to embed, all its code is dedicated to the public +domain. The `_version.py` that it creates is also in the public domain. +Specifically, both are released under the Creative Commons "Public Domain +Dedication" license (CC0-1.0), as described in +https://creativecommons.org/publicdomain/zero/1.0/ . + +""" + +from __future__ import print_function +try: + import configparser +except ImportError: + import ConfigParser as configparser +import errno +import json +import os +import re +import subprocess +import sys + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_root(): + """Get the project root directory. + + We require that all commands are run from the project root, i.e. the + directory that contains setup.py, setup.cfg, and versioneer.py . + """ + root = os.path.realpath(os.path.abspath(os.getcwd())) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + # allow 'python path/to/setup.py COMMAND' + root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + err = ("Versioneer was unable to run the project root directory. " + "Versioneer requires setup.py to be executed from " + "its immediate directory (like 'python setup.py COMMAND'), " + "or in a way that lets it use sys.argv[0] to find the root " + "(like 'python path/to/setup.py COMMAND').") + raise VersioneerBadRootError(err) + try: + # Certain runtime workflows (setup.py install/develop in a setuptools + # tree) execute all dependencies in a single python process, so + # "versioneer" may be imported multiple times, and python's shared + # module-import table will cache the first one. So we can't use + # os.path.dirname(__file__), as that will find whichever + # versioneer.py was first imported, even in later projects. + me = os.path.realpath(os.path.abspath(__file__)) + me_dir = os.path.normcase(os.path.splitext(me)[0]) + vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) + if me_dir != vsr_dir: + print("Warning: build in %s is using versioneer.py from %s" + % (os.path.dirname(me), versioneer_py)) + except NameError: + pass + return root + + +def get_config_from_root(root): + """Read the project setup.cfg file to determine Versioneer config.""" + # This might raise EnvironmentError (if setup.cfg is missing), or + # configparser.NoSectionError (if it lacks a [versioneer] section), or + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") + parser = configparser.SafeConfigParser() + with open(setup_cfg, "r") as f: + parser.readfp(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): + if parser.has_option("versioneer", name): + return parser.get("versioneer", name) + return None + cfg = VersioneerConfig() + cfg.VCS = VCS + cfg.style = get(parser, "style") or "" + cfg.versionfile_source = get(parser, "versionfile_source") + cfg.versionfile_build = get(parser, "versionfile_build") + cfg.tag_prefix = get(parser, "tag_prefix") + if cfg.tag_prefix in ("''", '""'): + cfg.tag_prefix = "" + cfg.parentdir_prefix = get(parser, "parentdir_prefix") + cfg.verbose = get(parser, "verbose") + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +# these dictionaries contain VCS-specific tools +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, p.returncode + return stdout, p.returncode + + +LONG_VERSION_PY['git'] = ''' +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. Generated by +# versioneer-0.18 (https://github.com/warner/python-versioneer) + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys + + +def get_keywords(): + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" + git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" + git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_config(): + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "%(STYLE)s" + cfg.tag_prefix = "%(TAG_PREFIX)s" + cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" + cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %%s" %% dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %%s" %% (commands,)) + return None, None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %%s (error)" %% dispcmd) + print("stdout was %%s" %% stdout) + return None, p.returncode + return stdout, p.returncode + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %%s but none started with prefix %%s" %% + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %%d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%%s', no digits" %% ",".join(refs - tags)) + if verbose: + print("likely tags: %%s" %% ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %%s" %% r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %%s not under git control" %% root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%%s*" %% tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%%s'" + %% describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%%s' doesn't start with prefix '%%s'" + print(fmt %% (full_tag, tag_prefix)) + pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" + %% (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%%d" %% pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%%d" %% pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%%s" %% pieces["short"] + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%%s" %% pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%%s'" %% style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions(): + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for i in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} +''' + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if not keywords: + raise NotThisMethod("no keywords at all, weird") + date = keywords.get("date") + if date is not None: + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%s*" % tag_prefix], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], + cwd=root)[0].strip() + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def do_vcs_install(manifest_in, versionfile_source, ipy): + """Git-specific installation logic for Versioneer. + + For Git, this means creating/changing .gitattributes to mark _version.py + for export-subst keyword substitution. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + files = [manifest_in, versionfile_source] + if ipy: + files.append(ipy) + try: + me = __file__ + if me.endswith(".pyc") or me.endswith(".pyo"): + me = os.path.splitext(me)[0] + ".py" + versioneer_file = os.path.relpath(me) + except NameError: + versioneer_file = "versioneer.py" + files.append(versioneer_file) + present = False + try: + f = open(".gitattributes", "r") + for line in f.readlines(): + if line.strip().startswith(versionfile_source): + if "export-subst" in line.strip().split()[1:]: + present = True + f.close() + except EnvironmentError: + pass + if not present: + f = open(".gitattributes", "a+") + f.write("%s export-subst\n" % versionfile_source) + f.close() + files.append(".gitattributes") + run_command(GITS, ["add", "--"] + files) + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for i in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + else: + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %s but none started with prefix %s" % + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +SHORT_VERSION_PY = """ +# This file was generated by 'versioneer.py' (0.18) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json + +version_json = ''' +%s +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) +""" + + +def versions_from_file(filename): + """Try to determine the version from _version.py if present.""" + try: + with open(filename) as f: + contents = f.read() + except EnvironmentError: + raise NotThisMethod("unable to read _version.py") + mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) + if not mo: + mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) + if not mo: + raise NotThisMethod("no version_json in _version.py") + return json.loads(mo.group(1)) + + +def write_to_version_file(filename, versions): + """Write the given version number to the given _version.py file.""" + os.unlink(filename) + contents = json.dumps(versions, sort_keys=True, + indent=1, separators=(",", ": ")) + with open(filename, "w") as f: + f.write(SHORT_VERSION_PY % contents) + + print("set %s to '%s'" % (filename, versions["version"])) + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + """TAG[.post.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post.devDISTANCE + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%d" % pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Eexceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +class VersioneerBadRootError(Exception): + """The project root directory is unknown or missing key files.""" + + +def get_versions(verbose=False): + """Get the project version from whatever source is available. + + Returns dict with two keys: 'version' and 'full'. + """ + if "versioneer" in sys.modules: + # see the discussion in cmdclass.py:get_cmdclass() + del sys.modules["versioneer"] + + root = get_root() + cfg = get_config_from_root(root) + + assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" + handlers = HANDLERS.get(cfg.VCS) + assert handlers, "unrecognized VCS '%s'" % cfg.VCS + verbose = verbose or cfg.verbose + assert cfg.versionfile_source is not None, \ + "please set versioneer.versionfile_source" + assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" + + versionfile_abs = os.path.join(root, cfg.versionfile_source) + + # extract version from first of: _version.py, VCS command (e.g. 'git + # describe'), parentdir. This is meant to work for developers using a + # source checkout, for users of a tarball created by 'setup.py sdist', + # and for users of a tarball/zipball created by 'git archive' or github's + # download-from-tag feature or the equivalent in other VCSes. + + get_keywords_f = handlers.get("get_keywords") + from_keywords_f = handlers.get("keywords") + if get_keywords_f and from_keywords_f: + try: + keywords = get_keywords_f(versionfile_abs) + ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) + if verbose: + print("got version from expanded keyword %s" % ver) + return ver + except NotThisMethod: + pass + + try: + ver = versions_from_file(versionfile_abs) + if verbose: + print("got version from file %s %s" % (versionfile_abs, ver)) + return ver + except NotThisMethod: + pass + + from_vcs_f = handlers.get("pieces_from_vcs") + if from_vcs_f: + try: + pieces = from_vcs_f(cfg.tag_prefix, root, verbose) + ver = render(pieces, cfg.style) + if verbose: + print("got version from VCS %s" % ver) + return ver + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + if verbose: + print("got version from parentdir %s" % ver) + return ver + except NotThisMethod: + pass + + if verbose: + print("unable to compute version") + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, "error": "unable to compute version", + "date": None} + + +def get_version(): + """Get the short version string for this project.""" + return get_versions()["version"] + + +def get_cmdclass(): + """Get the custom setuptools/distutils subclasses used by Versioneer.""" + if "versioneer" in sys.modules: + del sys.modules["versioneer"] + # this fixes the "python setup.py develop" case (also 'install' and + # 'easy_install .'), in which subdependencies of the main project are + # built (using setup.py bdist_egg) in the same python process. Assume + # a main project A and a dependency B, which use different versions + # of Versioneer. A's setup.py imports A's Versioneer, leaving it in + # sys.modules by the time B's setup.py is executed, causing B to run + # with the wrong versioneer. Setuptools wraps the sub-dep builds in a + # sandbox that restores sys.modules to it's pre-build state, so the + # parent is protected against the child's "import versioneer". By + # removing ourselves from sys.modules here, before the child build + # happens, we protect the child from the parent's versioneer too. + # Also see https://github.com/warner/python-versioneer/issues/52 + + cmds = {} + + # we add "version" to both distutils and setuptools + from distutils.core import Command + + class cmd_version(Command): + description = "report generated version string" + user_options = [] + boolean_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + vers = get_versions(verbose=True) + print("Version: %s" % vers["version"]) + print(" full-revisionid: %s" % vers.get("full-revisionid")) + print(" dirty: %s" % vers.get("dirty")) + print(" date: %s" % vers.get("date")) + if vers["error"]: + print(" error: %s" % vers["error"]) + cmds["version"] = cmd_version + + # we override "build_py" in both distutils and setuptools + # + # most invocation pathways end up running build_py: + # distutils/build -> build_py + # distutils/install -> distutils/build ->.. + # setuptools/bdist_wheel -> distutils/install ->.. + # setuptools/bdist_egg -> distutils/install_lib -> build_py + # setuptools/install -> bdist_egg ->.. + # setuptools/develop -> ? + # pip install: + # copies source tree to a tempdir before running egg_info/etc + # if .git isn't copied too, 'git describe' will fail + # then does setup.py bdist_wheel, or sometimes setup.py install + # setup.py egg_info -> ? + + # we override different "build_py" commands for both environments + if "setuptools" in sys.modules: + from setuptools.command.build_py import build_py as _build_py + else: + from distutils.command.build_py import build_py as _build_py + + class cmd_build_py(_build_py): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + _build_py.run(self) + # now locate _version.py in the new build/ directory and replace + # it with an updated value + if cfg.versionfile_build: + target_versionfile = os.path.join(self.build_lib, + cfg.versionfile_build) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + cmds["build_py"] = cmd_build_py + + if "cx_Freeze" in sys.modules: # cx_freeze enabled? + from cx_Freeze.dist import build_exe as _build_exe + # nczeczulin reports that py2exe won't like the pep440-style string + # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. + # setup(console=[{ + # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION + # "product_version": versioneer.get_version(), + # ... + + class cmd_build_exe(_build_exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _build_exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % + {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + cmds["build_exe"] = cmd_build_exe + del cmds["build_py"] + + if 'py2exe' in sys.modules: # py2exe enabled? + try: + from py2exe.distutils_buildexe import py2exe as _py2exe # py3 + except ImportError: + from py2exe.build_exe import py2exe as _py2exe # py2 + + class cmd_py2exe(_py2exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _py2exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % + {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + cmds["py2exe"] = cmd_py2exe + + # we override different "sdist" commands for both environments + if "setuptools" in sys.modules: + from setuptools.command.sdist import sdist as _sdist + else: + from distutils.command.sdist import sdist as _sdist + + class cmd_sdist(_sdist): + def run(self): + versions = get_versions() + self._versioneer_generated_versions = versions + # unless we update this, the command will keep using the old + # version + self.distribution.metadata.version = versions["version"] + return _sdist.run(self) + + def make_release_tree(self, base_dir, files): + root = get_root() + cfg = get_config_from_root(root) + _sdist.make_release_tree(self, base_dir, files) + # now locate _version.py in the new base_dir directory + # (remembering that it may be a hardlink) and replace it with an + # updated value + target_versionfile = os.path.join(base_dir, cfg.versionfile_source) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, + self._versioneer_generated_versions) + cmds["sdist"] = cmd_sdist + + return cmds + + +CONFIG_ERROR = """ +setup.cfg is missing the necessary Versioneer configuration. You need +a section like: + + [versioneer] + VCS = git + style = pep440 + versionfile_source = src/myproject/_version.py + versionfile_build = myproject/_version.py + tag_prefix = + parentdir_prefix = myproject- + +You will also need to edit your setup.py to use the results: + + import versioneer + setup(version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), ...) + +Please read the docstring in ./versioneer.py for configuration instructions, +edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. +""" + +SAMPLE_CONFIG = """ +# See the docstring in versioneer.py for instructions. Note that you must +# re-run 'versioneer.py setup' after changing this section, and commit the +# resulting files. + +[versioneer] +#VCS = git +#style = pep440 +#versionfile_source = +#versionfile_build = +#tag_prefix = +#parentdir_prefix = + +""" + +INIT_PY_SNIPPET = """ +from ._version import get_versions +__version__ = get_versions()['version'] +del get_versions +""" + + +def do_setup(): + """Main VCS-independent setup function for installing Versioneer.""" + root = get_root() + try: + cfg = get_config_from_root(root) + except (EnvironmentError, configparser.NoSectionError, + configparser.NoOptionError) as e: + if isinstance(e, (EnvironmentError, configparser.NoSectionError)): + print("Adding sample versioneer config to setup.cfg", + file=sys.stderr) + with open(os.path.join(root, "setup.cfg"), "a") as f: + f.write(SAMPLE_CONFIG) + print(CONFIG_ERROR, file=sys.stderr) + return 1 + + print(" creating %s" % cfg.versionfile_source) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write(LONG % {"DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + }) + + ipy = os.path.join(os.path.dirname(cfg.versionfile_source), + "__init__.py") + if os.path.exists(ipy): + try: + with open(ipy, "r") as f: + old = f.read() + except EnvironmentError: + old = "" + if INIT_PY_SNIPPET not in old: + print(" appending to %s" % ipy) + with open(ipy, "a") as f: + f.write(INIT_PY_SNIPPET) + else: + print(" %s unmodified" % ipy) + else: + print(" %s doesn't exist, ok" % ipy) + ipy = None + + # Make sure both the top-level "versioneer.py" and versionfile_source + # (PKG/_version.py, used by runtime code) are in MANIFEST.in, so + # they'll be copied into source distributions. Pip won't be able to + # install the package without this. + manifest_in = os.path.join(root, "MANIFEST.in") + simple_includes = set() + try: + with open(manifest_in, "r") as f: + for line in f: + if line.startswith("include "): + for include in line.split()[1:]: + simple_includes.add(include) + except EnvironmentError: + pass + # That doesn't cover everything MANIFEST.in can do + # (http://docs.python.org/2/distutils/sourcedist.html#commands), so + # it might give some false negatives. Appending redundant 'include' + # lines is safe, though. + if "versioneer.py" not in simple_includes: + print(" appending 'versioneer.py' to MANIFEST.in") + with open(manifest_in, "a") as f: + f.write("include versioneer.py\n") + else: + print(" 'versioneer.py' already in MANIFEST.in") + if cfg.versionfile_source not in simple_includes: + print(" appending versionfile_source ('%s') to MANIFEST.in" % + cfg.versionfile_source) + with open(manifest_in, "a") as f: + f.write("include %s\n" % cfg.versionfile_source) + else: + print(" versionfile_source already in MANIFEST.in") + + # Make VCS-specific changes. For git, this means creating/changing + # .gitattributes to mark _version.py for export-subst keyword + # substitution. + do_vcs_install(manifest_in, cfg.versionfile_source, ipy) + return 0 + + +def scan_setup_py(): + """Validate the contents of setup.py against Versioneer's expectations.""" + found = set() + setters = False + errors = 0 + with open("setup.py", "r") as f: + for line in f.readlines(): + if "import versioneer" in line: + found.add("import") + if "versioneer.get_cmdclass()" in line: + found.add("cmdclass") + if "versioneer.get_version()" in line: + found.add("get_version") + if "versioneer.VCS" in line: + setters = True + if "versioneer.versionfile_source" in line: + setters = True + if len(found) != 3: + print("") + print("Your setup.py appears to be missing some important items") + print("(but I might be wrong). Please make sure it has something") + print("roughly like the following:") + print("") + print(" import versioneer") + print(" setup( version=versioneer.get_version(),") + print(" cmdclass=versioneer.get_cmdclass(), ...)") + print("") + errors += 1 + if setters: + print("You should remove lines like 'versioneer.VCS = ' and") + print("'versioneer.versionfile_source = ' . This configuration") + print("now lives in setup.cfg, and should be removed from setup.py") + print("") + errors += 1 + return errors + + +if __name__ == "__main__": + cmd = sys.argv[1] + if cmd == "setup": + errors = do_setup() + errors += scan_setup_py() + if errors: + sys.exit(1) From c9ac9535736f05346af481ec078759791006a0c4 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 16:35:57 -0700 Subject: [PATCH 03/32] ignore py package stuff --- .gitignore | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/.gitignore b/.gitignore index 6ddbc03d..4b12d645 100755 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,111 @@ # example output dir test + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# scons +.sconsign.dblite From b2d81e208cef1097621575eebbcbf6dc040cd6b4 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 20:22:05 -0700 Subject: [PATCH 04/32] lots more refactoring and little fixes --- README.md | 23 +++--- SConscript.inference | 14 ++-- SConscript.simulation | 14 ++-- {bin => gctree}/__init__.py | 0 gctree/{gctree.py => branching_processes.py} | 9 ++- gctree/cli.py | 43 ++++++----- gctree/mutation_model.py | 7 +- gctree/phylip_parse.py | 52 ++----------- {bin => gctree}/selection_utils.py | 3 +- {bin => gctree}/utils.py | 0 scripts/__init__.py | 0 {bin => scripts}/aggregate.py | 0 {bin => scripts}/aggregate_compare.py | 43 +++++------ {bin => scripts}/consensus.py | 0 {bin => scripts}/deduplicate.py | 0 {bin => scripts}/heavy_light_compare.py | 0 {bin => scripts}/mkconfig.py | 0 scripts/phylip_parse.py | 43 +++++++++++ {bin => scripts}/plot_config.json | 0 {bin => scripts}/plot_tree.py | 0 {bin => scripts}/simstatagg.py | 2 +- {bin => scripts}/summary_stats.py | 2 +- {bin => scripts}/tree_functions.py | 0 {bin => scripts}/validaggreg.py | 0 {bin => scripts}/validaggreg_compare.py | 0 {bin => scripts}/validation.py | 12 ++- setup.py | 1 + spec-file.txt | 78 -------------------- 28 files changed, 140 insertions(+), 206 deletions(-) rename {bin => gctree}/__init__.py (100%) mode change 100755 => 100644 rename gctree/{gctree.py => branching_processes.py} (99%) rename {bin => gctree}/selection_utils.py (99%) rename {bin => gctree}/utils.py (100%) create mode 100755 scripts/__init__.py rename {bin => scripts}/aggregate.py (100%) rename {bin => scripts}/aggregate_compare.py (83%) rename {bin => scripts}/consensus.py (100%) rename {bin => scripts}/deduplicate.py (100%) rename {bin => scripts}/heavy_light_compare.py (100%) rename {bin => scripts}/mkconfig.py (100%) create mode 100644 scripts/phylip_parse.py rename {bin => scripts}/plot_config.json (100%) rename {bin => scripts}/plot_tree.py (100%) rename {bin => scripts}/simstatagg.py (98%) rename {bin => scripts}/summary_stats.py (99%) rename {bin => scripts}/tree_functions.py (100%) rename {bin => scripts}/validaggreg.py (100%) rename {bin => scripts}/validaggreg_compare.py (100%) rename {bin => scripts}/validation.py (96%) delete mode 100644 spec-file.txt diff --git a/README.md b/README.md index 5f178129..cce96d47 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,16 @@ All commands should be issued from within the gctree repo directory. ```bash conda env create -f environment.yml ``` -2. Install the gctree package locally (with `-e` flag for editable, if developing) - ```bash - pip install -e . - ``` -3. Activate the environment: +2. Activate the environment: ```bash conda activate gctree ``` +Alternatively, if you only want the base gctree python package (without the pipelines and scripts), you can +```bash +pip intall . +``` + ## QUICK START ### inference @@ -224,13 +225,13 @@ scons --simulate --outdir= --N= $TARGET'.format(bootstrap)) + buffarg + 'python scripts/mkconfig.py ${SOURCE} seqboot '+bootstrap_arg+' > $TARGET'.format(bootstrap)) seqboot = CommandRunner([os.path.join(outdir, x) for x in ['seqboot/outfile', 'seqboot/log.log']], seqboot_config, @@ -78,7 +78,7 @@ naiveID = naiveID.lower() if dnaml: dnaml_config = env.Command(os.path.join(outdir, 'dnaml/config.cfg'), phylip[0], - buffarg + 'python bin/mkconfig.py ${SOURCE} dnaml > $TARGET') + buffarg + 'python scripts/mkconfig.py ${SOURCE} dnaml > $TARGET') # run dnaml (from phylip package) to generate maximum likelihood tree dnaml = CommandRunner([os.path.join(outdir, x) for x in ['dnaml/outtree', 'dnaml/outfile', 'dnaml/log.log']], @@ -91,7 +91,7 @@ if dnaml: dnaml_tree = env.Command([os.path.join(outdir, 'dnaml.inferred_tree.p'), os.path.join(outdir, 'dnaml.inferred_tree.log')], [dnaml[1], phylip[1]], - xarg + 'python bin/phylip_parse.py ${SOURCES} --outputfile ${TARGETS[0]} --naive '+naiveID+' > ${TARGETS[1]}') + xarg + 'python scripts/phylip_parse.py ${SOURCES} --outputfile ${TARGETS[0]} --naive '+naiveID+' > ${TARGETS[1]}') return_list.append(dnaml_tree) @@ -100,7 +100,7 @@ if gctree: quick_arg = ' --quick ' if quick else '' dnapars_config = env.Command(os.path.join(outdir, 'dnapars/config.cfg'), phylip[0], - buffarg + 'python bin/mkconfig.py ${SOURCE} dnapars ' + quick_arg + ' > $TARGET') + buffarg + 'python scripts/mkconfig.py ${SOURCE} dnapars ' + quick_arg + ' > $TARGET') # run dnapars (from phylip package) to generate parsimony trees dnapars = CommandRunner([os.path.join(outdir, x) for x in ['dnapars/outtree', 'dnapars/outfile', 'dnapars/log.log']], @@ -117,7 +117,7 @@ if gctree: if bootstrap: dnapars_config_bootstrap = env.Command(os.path.join(outdir, 'dnapars_bootstrap/config.cfg'), seqboot[0], - buffarg + 'python bin/mkconfig.py ${SOURCE} dnapars ' + quick_arg + bootstrap_arg + ' > $TARGET') + buffarg + 'python scripts/mkconfig.py ${SOURCE} dnapars ' + quick_arg + bootstrap_arg + ' > $TARGET') dnapars_bootstrap = CommandRunner([os.path.join(outdir, x) for x in ['dnapars_bootstrap/outtree', 'dnapars_bootstrap/outfile', 'dnapars_bootstrap/log.log']], dnapars_config_bootstrap, 'cd ' + outdir + '/dnapars_bootstrap && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}') @@ -131,7 +131,7 @@ if gctree: [dnapars[1], phylip[1]] + ([dnapars_bootstrap[1]] if bootstrap else []) + ([phylip[3]] if colorfile is not None else []), - xarg + buffarg + 'python -u bin/gctree.py infer ${SOURCES[0]} ${SOURCES[1]} --naive ' + naiveID + + xarg + buffarg + 'gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive ' + naiveID + ' --outbase ' + gctree_outbase + frame_arg + idlabel_arg + diff --git a/SConscript.simulation b/SConscript.simulation index 81f554ad..49de4ac8 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -44,7 +44,7 @@ def gctree_sim(outdir, c): os.path.join(outdir, 'gctree.simulation.collapsed_tree.colormap.tsv'), os.path.join(outdir, 'gctree.simulation.log')], [mutability, substitution], - xarg + buffarg + 'python bin/gctree.py simulate '+naive+ + xarg + buffarg + 'gctree simulate '+naive+ ' ${SOURCES[0]} ${SOURCES[1]}'+ ' --outbase '+os.path.join(outdir, 'gctree')+ ' --lambda {0[lambda]} --lambda0 {0[lambda0]}'.format(c)+ @@ -79,7 +79,7 @@ def validate(outdir, c): outputs.append(os.path.join(outdir, 'validation.gctree.tsv')) # <-- special gctree output evaluating parsimony tree ranking tgt = CommandRunner(outputs, [c['gctree_sim'][2:4]] + [x[0] for x in c['infer']], - xarg + buffarg + 'python bin/validation.py $SOURCES --outbase '+os.path.join(outdir, 'validation')+' > ${TARGETS[1]}') + xarg + buffarg + 'python scripts/validation.py $SOURCES --outbase '+os.path.join(outdir, 'validation')+' > ${TARGETS[1]}') if gctree: c['gctree_agg'].append(tgt[2]) c['agg'].append(tgt[0]) @@ -96,7 +96,7 @@ if gctree: tgt = env.Command([os.path.join(outdir, 'gctree.validaggreg.tsv'), os.path.join(outdir, 'gctree.validaggreg.log')], c['gctree_agg'], - buffarg + 'python bin/validaggreg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.validaggreg') + allmetrics_arg + ' > ${TARGETS[1]}') + buffarg + 'python scripts/validaggreg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.validaggreg') + allmetrics_arg + ' > ${TARGETS[1]}') env.AlwaysBuild(tgt) c['gctree_outeragg'].append(tgt[0]) return tgt @@ -106,7 +106,7 @@ def simstat_aggregate(outdir, c): '''aggregate simulation stats''' tgt = env.Command([os.path.join(outdir, 'gctree.simulation.stats.log')], c['simstat_agg'], - buffarg + 'python bin/simstatagg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.stats')+ + buffarg + 'python scripts/simstatagg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.stats')+ ' --experimental example/150228_Clone_3-8.fasta > ${TARGETS[0]}') env.AlwaysBuild(tgt) return tgt @@ -117,7 +117,7 @@ def summary_stats(outdir, c): exp_arg = ' --experimental ' + ' '.join(experimental_list) if len(experimental_list) > 0 else '' tgt = env.Command([os.path.join(outdir, 'gctree.simulation.summary_stats.log')], c['summary_stats'], - buffarg + 'python bin/summary_stats.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.summary_stats')+ + buffarg + 'python scripts/summary_stats.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.summary_stats')+ exp_arg + ' --naiveIDexp ' + naiveIDexp + ' > ${TARGETS[0]}') env.AlwaysBuild(tgt) @@ -129,7 +129,7 @@ def inner_aggregate(outdir, c): tgt = env.Command([os.path.join(outdir, 'validaggreg.tsv'), os.path.join(outdir, 'validaggreg.log')], c['agg'], - buffarg + 'python bin/validaggreg_compare.py $SOURCES --outbase '+os.path.join(outdir, 'validaggreg')+' > ${TARGETS[1]}') + buffarg + 'python scripts/validaggreg_compare.py $SOURCES --outbase '+os.path.join(outdir, 'validaggreg')+' > ${TARGETS[1]}') env.AlwaysBuild(tgt) c['outeragg'].append(tgt[0]) return tgt @@ -142,6 +142,6 @@ def outer_aggregate(outdir, c): tgt = env.Command([os.path.join(outdir, 'aggregation.tsv'), os.path.join(outdir, 'aggregation.log')], c['outeragg'], - buffarg + 'python bin/aggregate_compare.py $SOURCES --outbase '+os.path.join(outdir, 'aggregation')+' > ${TARGETS[1]}') + buffarg + 'python scripts/aggregate_compare.py $SOURCES --outbase '+os.path.join(outdir, 'aggregation')+' > ${TARGETS[1]}') env.AlwaysBuild(tgt) return tgt diff --git a/bin/__init__.py b/gctree/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from bin/__init__.py rename to gctree/__init__.py diff --git a/gctree/gctree.py b/gctree/branching_processes.py similarity index 99% rename from gctree/gctree.py rename to gctree/branching_processes.py index 99959020..52531a1c 100755 --- a/gctree/gctree.py +++ b/gctree/branching_processes.py @@ -1,9 +1,12 @@ #! /usr/bin/env python -''' +""" This module contains classes for simulation and inference for a binary branching process with mutation in which the tree is collapsed to nodes that -count the number of clonal leaves of each type''' +count the number of clonal leaves of each type +""" + +from gctree.utils import hamming_distance import numpy as np import warnings @@ -17,10 +20,8 @@ from Bio.SeqRecord import SeqRecord from Bio import AlignIO from Bio.Phylo.TreeConstruction import MultipleSeqAlignment - import pickle from functools import lru_cache -from utils import hamming_distance np.seterr(all='raise') diff --git a/gctree/cli.py b/gctree/cli.py index 3d7878fd..0555793b 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -1,10 +1,10 @@ #! /usr/bin/env python -import gctree -import phylip_parse as pp -import mutation_model as mm -import selection_utils as su -import utils +import gctree.branching_processes as bp +import gctree.phylip_parse as pp +import gctree.mutation_model as mm +import gctree.selection_utils as su +import gctree.utils as utils import argparse import pandas as pd @@ -14,7 +14,7 @@ import pickle import random import scipy.stats -import ete +import ete3 import itertools @@ -38,7 +38,7 @@ def test(args): np.seterr(all='ignore') for p in ps: for q in qs: - forest = gctree.CollapsedForest((p, q), n) + forest = bp.CollapsedForest((p, q), n) print(f'parameters: p = {p}, q = {q}') forest.simulate() tree_dict = {} @@ -46,7 +46,7 @@ def test(args): tree_hash = tuple((node.frequency, len(node.children)) for node in tree.tree.traverse()) if tree_hash not in tree_dict: - tree_dict[tree_hash] = [tree, tree.l((p, q))[0], 1] + tree_dict[tree_hash] = [tree, tree.ll((p, q))[0], 1] else: tree_dict[tree_hash][-1] += 1 L_empirical, L_theoretical = zip( @@ -87,7 +87,7 @@ def test(args): for p in ps: for q in qs: for _ in range(n): - forest = gctree.CollapsedForest((p, q), n2) + forest = bp.CollapsedForest((p, q), n2) print(f'parameters: p = {p}, q = {q}') forest.simulate() result = forest.mle() @@ -128,8 +128,8 @@ def infer(args): outbase = args.outbase + f'.bootstrap_{i}' else: outbase = args.outbase - phylip_collapsed = [gctree.CollapsedTree(tree=tree, frame=args.frame, - allow_repeats=(i > 0)) + phylip_collapsed = [bp.CollapsedTree(tree=tree, frame=args.frame, + allow_repeats=(i > 0)) for tree in content] phylip_collapsed_unique = [] for tree in phylip_collapsed: @@ -137,7 +137,7 @@ def infer(args): for tree2 in phylip_collapsed_unique) == 0: phylip_collapsed_unique.append(tree) - parsimony_forest = gctree.CollapsedForest( + parsimony_forest = bp.CollapsedForest( forest=phylip_collapsed_unique) if parsimony_forest.n_trees == 1: @@ -178,7 +178,7 @@ def infer(args): df.loc[i-1] = parsimony_forest.params # get likelihoods and sort by them - ls = [tree.l(parsimony_forest.params, build_cache=False)[0] + ls = [tree.ll(parsimony_forest.params, build_cache=False)[0] for tree in parsimony_forest.forest] ls, parsimony_forest.forest = zip( *sorted(zip(ls, parsimony_forest.forest), key=lambda x: x[0], @@ -358,14 +358,13 @@ def simulate(args): verbose=args.verbose, selection_params=selection_params) if args.selection: - collapsed_tree = gctree.CollapsedTree(tree=tree, - frame=args.frame, - collapse_syn=False, - allow_repeats=True) + collapsed_tree = bp.CollapsedTree(tree=tree, + frame=args.frame, + collapse_syn=False, + allow_repeats=True) else: # this will fail if backmutations - collapsed_tree = gctree.CollapsedTree(tree=tree, - frame=args.frame) + collapsed_tree = bp.CollapsedTree(tree=tree, frame=args.frame) tree.ladderize() uniques = sum(node.frequency > 0 for node in collapsed_tree.tree.traverse()) @@ -423,13 +422,13 @@ def simulate(args): ' simulated observed sequences') # render the full lineage tree - ts = ete.TreeStyle() + ts = ete3.TreeStyle() ts.rotation = 90 ts.show_leaf_name = False ts.show_scale = False colors = {} - palette = ete.SVG_COLORS + palette = ete3.SVG_COLORS palette -= set(['black', 'white', 'gray']) palette = itertools.cycle(list(palette)) # <-- circular iterator @@ -440,7 +439,7 @@ def simulate(args): colors[tree.sequence] = 'gray' for n in tree.traverse(): - nstyle = ete.NodeStyle() + nstyle = ete3.NodeStyle() nstyle["size"] = 10 if args.plotAA: if n.AAseq not in colors: diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index 52d7adca..7b72a5c5 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -1,9 +1,14 @@ +#! /usr/bin/env python + +"""Mutation models""" + +from gctree.utils import hamming_distance + from ete3 import TreeNode from scipy.stats import poisson import random import scipy from Bio.Seq import Seq -from utils import hamming_distance class MutationModel(): '''a class for a mutation model, and functions to mutate sequences''' diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index e7fd796e..8ec448e9 100755 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -1,17 +1,17 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -""" -Given an outputfile from one of the PHYLIP tools - `dnaml` or `dnapars` - produce an alignment (including + +"""Given an outputfile from one of the PHYLIP tools - `dnaml` or `dnapars` - produce an alignment (including ancestral sequences), a newick tree (with matching internal node lables), and an svg rendering of said tree. """ + +from gctree.utils import hamming_distance + from ete3 import Tree import re import random from collections import defaultdict - from Bio.Data.IUPACData import ambiguous_dna_values -import gctree - # iterate over recognized sections in the phylip output file. def sections(fh): @@ -155,7 +155,7 @@ def build_tree(sequences, parents, counts=None, naive='naive'): # remove possible unecessary unifurcation after rerooting if len(naive_parent.children) == 1: naive_parent.delete(prevent_nondicotomic=False) - naive_parent.children[0].dist = gctree.hamming_distance(naive_parent.children[0].sequence, nodes[naive_id].sequence) + naive_parent.children[0].dist = hamming_distance(naive_parent.children[0].sequence, nodes[naive_id].sequence) tree = nodes[naive_id] # make random choices for ambiguous bases @@ -164,44 +164,6 @@ def build_tree(sequences, parents, counts=None, naive='naive'): # compute branch lengths tree.dist = 0 # no branch above root for node in tree.iter_descendants(): - node.dist = gctree.hamming_distance(node.sequence, node.up.sequence) + node.dist = hamming_distance(node.sequence, node.up.sequence) return tree - -def main(): - - import pickle, argparse, os - - def existing_file(fname): - """ - Argparse type for an existing file - """ - if not os.path.isfile(fname): - raise ValueError("Invalid file: " + str(fname)) - return fname - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - 'phylip_outfile', type=existing_file, help='dnaml outfile (verbose output with inferred ancestral sequences, option 5).') - parser.add_argument( - 'countfile', type=existing_file, help="count file") - parser.add_argument( - '--outputfile', default=None, help="output file.") - parser.add_argument( - '--naive', default='naive', help="naive sequence id") - - args = parser.parse_args() - - if args.outputfile is None: - args.outputfile = args.phylip_outfile + '.collapsed_forest.p' - trees = parse_outfile(args.phylip_outfile, args.countfile, args.naive) - if isinstance(trees[0], list): - print(trees[0][0]) - print(gctree.CollapsedTree(tree=trees[0][0])) - bootstraps = [[gctree.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees] - pickle.dump([gctree.CollapsedForest(forest=trees) for trees in bootstraps], open(args.outputfile, 'w')) - else: - trees = [gctree.CollapsedTree(tree=tree) for tree in trees] - pickle.dump(gctree.CollapsedForest(forest=trees), open(args.outputfile, 'w')) - -if __name__ == "__main__": - main() diff --git a/bin/selection_utils.py b/gctree/selection_utils.py similarity index 99% rename from bin/selection_utils.py rename to gctree/selection_utils.py index 3be3a7a8..ed4bb2a7 100755 --- a/bin/selection_utils.py +++ b/gctree/selection_utils.py @@ -5,10 +5,11 @@ utility functions for selection simulation ''' +from gctree.utils import hamming_distance + import scipy from scipy.optimize import minimize, fsolve from matplotlib import pyplot as plt -from utils import hamming_distance def calc_Kd(seqAA, targetAAseqs, hd2affy): '''Find the closest target sequence to and apply the "hamming distance to affinity" transformation function.''' diff --git a/bin/utils.py b/gctree/utils.py similarity index 100% rename from bin/utils.py rename to gctree/utils.py diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/bin/aggregate.py b/scripts/aggregate.py similarity index 100% rename from bin/aggregate.py rename to scripts/aggregate.py diff --git a/bin/aggregate_compare.py b/scripts/aggregate_compare.py similarity index 83% rename from bin/aggregate_compare.py rename to scripts/aggregate_compare.py index 30dd5854..5ea66f7f 100755 --- a/bin/aggregate_compare.py +++ b/scripts/aggregate_compare.py @@ -45,35 +45,36 @@ plot_func = {v:f for v, f in zip(variables, plot2var)} plot_options = {v:o for v, o in zip(variables, options)} +if numb_variables > 0: -gs = gridspec.GridSpec(numb_variables, 2) -fig = plt.figure(figsize=(8, 4*numb_variables)) + gs = gridspec.GridSpec(numb_variables, 2) + fig = plt.figure(figsize=(8, 4*numb_variables)) -i = 0 -for var in variables: - if not len(set(df[var])) > 1 or var == 'N_taxa': - continue + i = 0 + for var in variables: + if not len(set(df[var])) > 1 or var == 'N_taxa': + continue - plf = plot_func[var] - kwargs = plot_options[var] - ax = plt.subplot(gs[i, 0]) - plot_data = df.loc[df.loc[:,'metric'] == 'RF', :] - sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) - plf(x=var, y="value", hue="method", data=plot_data, **kwargs) - ax.set(ylabel='RF distance') + plf = plot_func[var] + kwargs = plot_options[var] + ax = plt.subplot(gs[i, 0]) + plot_data = df.loc[df.loc[:,'metric'] == 'RF', :] + sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) + plf(x=var, y="value", hue="method", data=plot_data, **kwargs) + ax.set(ylabel='RF distance') - ax = plt.subplot(gs[i, 1]) - plot_data = df.loc[df.loc[:,'metric'] == 'logMRCA', :] - sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) - plf(x=var, y="value", hue="method", data=plot_data, **kwargs) - ax.set(ylabel='MRCA distance') + ax = plt.subplot(gs[i, 1]) + plot_data = df.loc[df.loc[:,'metric'] == 'logMRCA', :] + sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) + plf(x=var, y="value", hue="method", data=plot_data, **kwargs) + ax.set(ylabel='MRCA distance') - i += 1 + i += 1 -plt.tight_layout() -plt.savefig(args.outbase+'.pdf') + plt.tight_layout() + plt.savefig(args.outbase+'.pdf') var = 'N_taxa' diff --git a/bin/consensus.py b/scripts/consensus.py similarity index 100% rename from bin/consensus.py rename to scripts/consensus.py diff --git a/bin/deduplicate.py b/scripts/deduplicate.py similarity index 100% rename from bin/deduplicate.py rename to scripts/deduplicate.py diff --git a/bin/heavy_light_compare.py b/scripts/heavy_light_compare.py similarity index 100% rename from bin/heavy_light_compare.py rename to scripts/heavy_light_compare.py diff --git a/bin/mkconfig.py b/scripts/mkconfig.py similarity index 100% rename from bin/mkconfig.py rename to scripts/mkconfig.py diff --git a/scripts/phylip_parse.py b/scripts/phylip_parse.py new file mode 100644 index 00000000..56b7a30e --- /dev/null +++ b/scripts/phylip_parse.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import gctree.phylip_parse as pp +import gctree.branching_processes as bp + +def main(): + + import pickle, argparse, os + + def existing_file(fname): + """ + Argparse type for an existing file + """ + if not os.path.isfile(fname): + raise ValueError("Invalid file: " + str(fname)) + return fname + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + 'phylip_outfile', type=existing_file, help='dnaml outfile (verbose output with inferred ancestral sequences, option 5).') + parser.add_argument( + 'countfile', type=existing_file, help="count file") + parser.add_argument( + '--outputfile', default=None, help="output file.") + parser.add_argument( + '--naive', default='naive', help="naive sequence id") + + args = parser.parse_args() + + if args.outputfile is None: + args.outputfile = args.phylip_outfile + '.collapsed_forest.p' + trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.naive) + if isinstance(trees[0], list): + print(trees[0][0]) + print(bp.CollapsedTree(tree=trees[0][0])) + bootstraps = [[bp.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees] + pickle.dump([bp.CollapsedForest(forest=trees) for trees in bootstraps], open(args.outputfile, 'w')) + else: + trees = [bp.CollapsedTree(tree=tree) for tree in trees] + pickle.dump(bp.CollapsedForest(forest=trees), open(args.outputfile, 'w')) + +if __name__ == "__main__": + main() diff --git a/bin/plot_config.json b/scripts/plot_config.json similarity index 100% rename from bin/plot_config.json rename to scripts/plot_config.json diff --git a/bin/plot_tree.py b/scripts/plot_tree.py similarity index 100% rename from bin/plot_tree.py rename to scripts/plot_tree.py diff --git a/bin/simstatagg.py b/scripts/simstatagg.py similarity index 98% rename from bin/simstatagg.py rename to scripts/simstatagg.py index 152f38d8..37f3d9a4 100755 --- a/bin/simstatagg.py +++ b/scripts/simstatagg.py @@ -9,7 +9,7 @@ import pandas as pd import argparse from deduplicate import fasta_parse -from utils import hamming_distance +from gctree.utils import hamming_distance import seaborn as sns sns.set(style="white", color_codes=True) diff --git a/bin/summary_stats.py b/scripts/summary_stats.py similarity index 99% rename from bin/summary_stats.py rename to scripts/summary_stats.py index 27896bdd..26340ad8 100755 --- a/bin/summary_stats.py +++ b/scripts/summary_stats.py @@ -12,7 +12,7 @@ import argparse import seaborn as sns sns.set(style="white", color_codes=True) -from utils import hamming_distance +from gctree.utils import hamming_distance def main(): diff --git a/bin/tree_functions.py b/scripts/tree_functions.py similarity index 100% rename from bin/tree_functions.py rename to scripts/tree_functions.py diff --git a/bin/validaggreg.py b/scripts/validaggreg.py similarity index 100% rename from bin/validaggreg.py rename to scripts/validaggreg.py diff --git a/bin/validaggreg_compare.py b/scripts/validaggreg_compare.py similarity index 100% rename from bin/validaggreg_compare.py rename to scripts/validaggreg_compare.py diff --git a/bin/validation.py b/scripts/validation.py similarity index 96% rename from bin/validation.py rename to scripts/validation.py index 05effd9f..2a111e1a 100755 --- a/bin/validation.py +++ b/scripts/validation.py @@ -5,8 +5,7 @@ comparison of inference and simulated trees ''' -from gctree import CollapsedTree, CollapsedForest -from utils import hamming_distance +from gctree.utils import hamming_distance from random import randint try: import cPickle as pickle @@ -14,11 +13,10 @@ import pickle import pandas as pd import scipy -import matplotlib from matplotlib import pyplot as plt import seaborn as sns sns.set(style='white', color_codes=True) -import os, sys +import os import numpy as np @@ -223,12 +221,12 @@ def validate(true_tree, inferences, true_tree_colormap, outbase): # note: the unrooted_trees flag is needed because, for some reason, the RF # function sometimes thinks the collapsed trees are unrooted and barfs distances, likelihoods = zip(*[(true_tree.compare(tree, method='RF'), - tree.l(inferences['gctree'].params)[0]) for tree in inferences['gctree'].forest]) + tree.ll(inferences['gctree'].params)[0]) for tree in inferences['gctree'].forest]) MRCAs = [true_tree.compare(tree, method='MRCA') for tree in inferences['gctree'].forest] lineage_distances = [all_lineage_dist(true_tree, tree) for tree in inferences['gctree'].forest] lineage_distances = list(zip(*lineage_distances)) # Unzip the forest tuple to get lineage_distances[ld0-3][tree_n] - mean_frequencies = [scipy.mean([node.frequency for node in tree.tree.traverse()]) for tree in inferences['gctree'].forest] - mean_branch_lengths = [scipy.mean([node.dist for node in tree.tree.iter_descendants()]) for tree in inferences['gctree'].forest] + mean_frequencies = [np.mean([node.frequency for node in tree.tree.traverse()]) for tree in inferences['gctree'].forest] + mean_branch_lengths = [np.mean([node.dist for node in tree.tree.iter_descendants()]) for tree in inferences['gctree'].forest] df = pd.DataFrame({'log-likelihood':likelihoods, 'RF':distances, 'MRCA':MRCAs, diff --git a/setup.py b/setup.py index 6d5d6933..1ae68b5d 100644 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ ], python_requires='>=3.7', install_requires=[ + 'PyQt5', 'ete3', 'biopython', 'matplotlib', diff --git a/spec-file.txt b/spec-file.txt deleted file mode 100644 index ad0665bf..00000000 --- a/spec-file.txt +++ /dev/null @@ -1,78 +0,0 @@ -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-64 -@EXPLICIT -https://conda.anaconda.org/etetoolkit/linux-64/argtable2-2.13-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/backports_abc-0.5-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/biopython-1.70-np112py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/blas-1.1-openblas.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2017.7.27.1-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.14.6-4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/certifi-2017.7.27.1-py27_0.tar.bz2 -https://repo.continuum.io/pkgs/free/linux-64/cloog-0.18.0-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/cycler-0.10.0-py27_0.tar.bz2 -https://conda.anaconda.org/etetoolkit/noarch/ete3-3.0.0b36-py_0.tar.bz2 -https://conda.anaconda.org/etetoolkit/linux-64/ete3_external_apps-2.0.4-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.12.1-4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.7-1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/functools32-3.2.3.2-py27_1.tar.bz2 -https://repo.continuum.io/pkgs/free/linux-64/gcc-4.8.5-7.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.7-1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.51.4-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.1.2-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.9-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-1.4.3-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/icu-58.1-1.tar.bz2 -https://repo.continuum.io/pkgs/free/linux-64/isl-0.12.2-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9b-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.2.1-3.tar.bz2 -https://repo.continuum.io/pkgs/free/linux-64/libgfortran-3.0.0-1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.14-4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.28-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.0.6-7.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.4-4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.29-5.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/lxml-3.8.0-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-2.0.0-np112py27_2.tar.bz2 -https://repo.continuum.io/pkgs/free/linux-64/mkl-2017.0.3-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/mmtf-python-1.0.7-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/mpc-1.0.3-4.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/mpfr-3.1.5-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-0.4.8-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-5.9-10.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/nestly-0.6-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.12.1-py27_blas_openblas_200.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/olefile-0.44-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/openblas-0.2.19-2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.0.2l-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pandas-0.20.3-py27_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.40.4-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/patsy-0.4.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pcre-8.39-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pillow-4.2.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pip-9.0.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.34.0-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pyparsing-2.2.0-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-4.11.4-py27_2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/python-2.7.13-1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/python-dateutil-2.6.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/pytz-2017.2-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/qt-4.8.7-7.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/readline-6.2-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/reportlab-3.4.0-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/scipy-0.19.1-py27_blas_openblas_202.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/scons-2.5.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/seaborn-0.8.0-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/setuptools-36.2.2-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/singledispatch-3.4.0.3-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/sip-4.18-py27_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/six-1.10.0-py27_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.13.0-1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/ssl_match_hostname-3.5.0.1-py27_1.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.8.0-np112py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/subprocess32-3.2.7-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.5.19-2.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/tornado-4.5.1-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/wheel-0.29.0-py27_0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.3-0.tar.bz2 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-0.tar.bz2 From 394a8fdd80f8922e9889f5e0e32f73254b7d42ac Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 20:33:33 -0700 Subject: [PATCH 05/32] black formatting --- SConscript.inference | 339 +++++++++---- SConscript.simulation | 252 ++++++---- SConstruct | 398 ++++++++------- gctree/_version.py | 154 +++--- gctree/branching_processes.py | 646 ++++++++++++++---------- gctree/cli.py | 882 ++++++++++++++++++++------------- gctree/mutation_model.py | 420 ++++++++++++---- gctree/phylip_parse.py | 83 ++-- gctree/selection_utils.py | 150 +++--- gctree/utils.py | 11 +- scripts/aggregate.py | 81 +-- scripts/aggregate_compare.py | 144 +++--- scripts/consensus.py | 52 +- scripts/deduplicate.py | 185 ++++--- scripts/heavy_light_compare.py | 143 ++++-- scripts/mkconfig.py | 78 +-- scripts/phylip_parse.py | 30 +- scripts/plot_tree.py | 408 ++++++++++----- scripts/simstatagg.py | 153 ++++-- scripts/summary_stats.py | 196 +++++--- scripts/tree_functions.py | 4 +- scripts/validaggreg.py | 268 +++++++--- scripts/validaggreg_compare.py | 79 ++- scripts/validation.py | 324 +++++++----- setup.py | 42 +- 25 files changed, 3572 insertions(+), 1950 deletions(-) diff --git a/SConscript.inference b/SConscript.inference index c9bed381..977e2742 100644 --- a/SConscript.inference +++ b/SConscript.inference @@ -1,34 +1,45 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" Infer trees from germinal center data -''' +""" import os import atexit import shutil import re + def which(executable): for path in os.environ["PATH"].split(os.pathsep): if os.path.exists(os.path.join(path, executable)): return os.path.realpath(os.path.join(path, executable)) return None + # the following must be exported by parent SConstruct/SConscript -Import('env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile') +Import( + "env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile" +) + def delete_on_failure(): from SCons.Script import GetBuildFailures + for bf in GetBuildFailures(): try: if False: # Turn on if failed folder should be deleted # shutil.rmtree(os.path.dirname(bf.node.abspath)) - print('There was an error for target:', bf.node.abspath) - print('To resolve this the base folder was deleted. ' - 'Restarting will possibly solve the issue in case ' - 'this was just a bad simulation. Deleted folder:', os.path.dirname(bf.node.abspath)) + print("There was an error for target:", bf.node.abspath) + print( + "To resolve this the base folder was deleted. " + "Restarting will possibly solve the issue in case " + "this was just a bad simulation. Deleted folder:", + os.path.dirname(bf.node.abspath), + ) except OSError: pass # Allow this + + # atexit.register(delete_on_failure) return_list = [] @@ -36,38 +47,67 @@ return_list = [] if gctree or igphyml or dnaml: if input_file2 is not None: - basename = 'combined' + basename = "combined" elif isinstance(input_file, str): - basename = '.'.join(os.path.basename(input_file).split('.')[:-1]) + basename = ".".join(os.path.basename(input_file).split(".")[:-1]) else: - basename = 'gctree.simulation' - frame_arg = ' --frame {} '.format(frame) if frame is not None else '' - converter_arg = ' --converter {} '.format(converter) if converter is not None else '' - phylip = env.Command([os.path.join(outdir, os.path.splitext(os.path.basename(input_file))[0] + '.phylip') if input_file2 is None and isinstance(input_file, str) else os.path.join(outdir, 'gctree.combined.phylip') if input_file2 is not None else os.path.join(outdir, 'gctree.simulation.phylip'), - os.path.join(outdir, basename)+'.counts', - os.path.join(outdir, basename)+'.idmap'] + - ([os.path.join(outdir, basename)+'.colormap'] if colorfile is not None else []), - input_file if colorfile is None else [input_file, colorfile], - buffarg + 'python scripts/deduplicate.py ${SOURCES[0]} ' + - (' --colorfile ${SOURCES[1]} ' if colorfile is not None else '') + - (' --colormap ${TARGETS[3]} ' if colorfile is not None else '') + - ' --countfile ${TARGETS[1]} --idmapfile ${TARGETS[2]} '+ - frame_arg+converter_arg + - '--naive '+naiveID+' > ${TARGETS[0]}') + basename = "gctree.simulation" + frame_arg = " --frame {} ".format(frame) if frame is not None else "" + converter_arg = ( + " --converter {} ".format(converter) if converter is not None else "" + ) + phylip = env.Command( + [ + os.path.join( + outdir, os.path.splitext(os.path.basename(input_file))[0] + ".phylip" + ) + if input_file2 is None and isinstance(input_file, str) + else os.path.join(outdir, "gctree.combined.phylip") + if input_file2 is not None + else os.path.join(outdir, "gctree.simulation.phylip"), + os.path.join(outdir, basename) + ".counts", + os.path.join(outdir, basename) + ".idmap", + ] + + ( + [os.path.join(outdir, basename) + ".colormap"] + if colorfile is not None + else [] + ), + input_file if colorfile is None else [input_file, colorfile], + buffarg + + "python scripts/deduplicate.py ${SOURCES[0]} " + + (" --colorfile ${SOURCES[1]} " if colorfile is not None else "") + + (" --colormap ${TARGETS[3]} " if colorfile is not None else "") + + " --countfile ${TARGETS[1]} --idmapfile ${TARGETS[2]} " + + frame_arg + + converter_arg + + "--naive " + + naiveID + + " > ${TARGETS[0]}", + ) if bootstrap: if igphyml or dnaml: - raise NotImplementedError('bootstrap not implemented for dnaml or igphyml') + raise NotImplementedError("bootstrap not implemented for dnaml or igphyml") - bootstrap_arg = ' --bootstrap {} '.format(bootstrap) - seqboot_config = env.Command(os.path.join(outdir, 'seqboot/config.cfg'), - phylip[0], - buffarg + 'python scripts/mkconfig.py ${SOURCE} seqboot '+bootstrap_arg+' > $TARGET'.format(bootstrap)) + bootstrap_arg = " --bootstrap {} ".format(bootstrap) + seqboot_config = env.Command( + os.path.join(outdir, "seqboot/config.cfg"), + phylip[0], + buffarg + + "python scripts/mkconfig.py ${SOURCE} seqboot " + + bootstrap_arg + + " > $TARGET".format(bootstrap), + ) - seqboot = CommandRunner([os.path.join(outdir, x) for x in ['seqboot/outfile', 'seqboot/log.log']], - seqboot_config, - 'cd ' + outdir + '/seqboot && rm -f outfile && seqboot < ${SOURCE.file} > ${TARGETS[1].file}') + seqboot = CommandRunner( + [os.path.join(outdir, x) for x in ["seqboot/outfile", "seqboot/log.log"]], + seqboot_config, + "cd " + + outdir + + "/seqboot && rm -f outfile && seqboot < ${SOURCE.file} > ${TARGETS[1].file}", + ) # Manually depend on phylip so that we rerun seqboot if the input sequences change (without this, dnaml will # only get rerun if one of the targets are removed or if the input dnaml_config file is changed). env.Depends(seqboot, phylip) @@ -76,36 +116,64 @@ if gctree or igphyml or dnaml: naiveID = naiveID.lower() if dnaml: - dnaml_config = env.Command(os.path.join(outdir, 'dnaml/config.cfg'), - phylip[0], - buffarg + 'python scripts/mkconfig.py ${SOURCE} dnaml > $TARGET') + dnaml_config = env.Command( + os.path.join(outdir, "dnaml/config.cfg"), + phylip[0], + buffarg + "python scripts/mkconfig.py ${SOURCE} dnaml > $TARGET", + ) # run dnaml (from phylip package) to generate maximum likelihood tree - dnaml = CommandRunner([os.path.join(outdir, x) for x in ['dnaml/outtree', 'dnaml/outfile', 'dnaml/log.log']], - dnaml_config, - 'cd ' + outdir + '/dnaml && rm -f outfile outtree && dnaml < ${SOURCE.file} > ${TARGETS[2].file}') + dnaml = CommandRunner( + [ + os.path.join(outdir, x) + for x in ["dnaml/outtree", "dnaml/outfile", "dnaml/log.log"] + ], + dnaml_config, + "cd " + + outdir + + "/dnaml && rm -f outfile outtree && dnaml < ${SOURCE.file} > ${TARGETS[2].file}", + ) # Manually depend on phylip so that we rerun dnaml if the input sequences change (without this, dnaml will # only get rerun if one of the targets are removed or if the input dnaml_config file is changed). env.Depends(dnaml, phylip) - dnaml_tree = env.Command([os.path.join(outdir, 'dnaml.inferred_tree.p'), - os.path.join(outdir, 'dnaml.inferred_tree.log')], - [dnaml[1], phylip[1]], - xarg + 'python scripts/phylip_parse.py ${SOURCES} --outputfile ${TARGETS[0]} --naive '+naiveID+' > ${TARGETS[1]}') + dnaml_tree = env.Command( + [ + os.path.join(outdir, "dnaml.inferred_tree.p"), + os.path.join(outdir, "dnaml.inferred_tree.log"), + ], + [dnaml[1], phylip[1]], + xarg + + "python scripts/phylip_parse.py ${SOURCES} --outputfile ${TARGETS[0]} --naive " + + naiveID + + " > ${TARGETS[1]}", + ) return_list.append(dnaml_tree) if gctree: # make config file for dnapars - quick_arg = ' --quick ' if quick else '' - dnapars_config = env.Command(os.path.join(outdir, 'dnapars/config.cfg'), - phylip[0], - buffarg + 'python scripts/mkconfig.py ${SOURCE} dnapars ' + quick_arg + ' > $TARGET') + quick_arg = " --quick " if quick else "" + dnapars_config = env.Command( + os.path.join(outdir, "dnapars/config.cfg"), + phylip[0], + buffarg + + "python scripts/mkconfig.py ${SOURCE} dnapars " + + quick_arg + + " > $TARGET", + ) # run dnapars (from phylip package) to generate parsimony trees - dnapars = CommandRunner([os.path.join(outdir, x) for x in ['dnapars/outtree', 'dnapars/outfile', 'dnapars/log.log']], - dnapars_config, - 'cd ' + outdir + '/dnapars && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}') + dnapars = CommandRunner( + [ + os.path.join(outdir, x) + for x in ["dnapars/outtree", "dnapars/outfile", "dnapars/log.log"] + ], + dnapars_config, + "cd " + + outdir + + "/dnapars && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", + ) # Manually depend on phylip so that we rerun dnapars if the input sequences change (without this, dnapars will # only get rerun if one of the targets are removed or if the input dnapars_config file is changed). env.Depends(dnapars, phylip) @@ -115,78 +183,145 @@ if gctree: # NOTE: TMPDIR is needed due for xvfb if bootstrap: - dnapars_config_bootstrap = env.Command(os.path.join(outdir, 'dnapars_bootstrap/config.cfg'), - seqboot[0], - buffarg + 'python scripts/mkconfig.py ${SOURCE} dnapars ' + quick_arg + bootstrap_arg + ' > $TARGET') - dnapars_bootstrap = CommandRunner([os.path.join(outdir, x) for x in ['dnapars_bootstrap/outtree', 'dnapars_bootstrap/outfile', 'dnapars_bootstrap/log.log']], - dnapars_config_bootstrap, - 'cd ' + outdir + '/dnapars_bootstrap && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}') + dnapars_config_bootstrap = env.Command( + os.path.join(outdir, "dnapars_bootstrap/config.cfg"), + seqboot[0], + buffarg + + "python scripts/mkconfig.py ${SOURCE} dnapars " + + quick_arg + + bootstrap_arg + + " > $TARGET", + ) + dnapars_bootstrap = CommandRunner( + [ + os.path.join(outdir, x) + for x in [ + "dnapars_bootstrap/outtree", + "dnapars_bootstrap/outfile", + "dnapars_bootstrap/log.log", + ] + ], + dnapars_config_bootstrap, + "cd " + + outdir + + "/dnapars_bootstrap && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", + ) env.Depends(dnapars_bootstrap, seqboot) - gctree_outbase = os.path.join(outdir, 'gctree') - frame_arg = ' --frame {} '.format(frame) if frame is not None else '' - idlabel_arg = ' --idlabel' if idlabel else '' - gctree_infer = CommandRunner([gctree_outbase+'.inference.parsimony_forest.p', - gctree_outbase+'.inference.log'], - [dnapars[1], phylip[1]] + - ([dnapars_bootstrap[1]] if bootstrap else []) + - ([phylip[3]] if colorfile is not None else []), - xarg + buffarg + 'gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive ' + naiveID + - ' --outbase ' + gctree_outbase + - frame_arg + - idlabel_arg + - (' --colormap ${SOURCES[-1]} ' if colorfile is not None else '') + - (' --bootstrap_phylipfile ${SOURCES[2]}' if bootstrap else '') + - ' | tee ${TARGETS[1]}') + gctree_outbase = os.path.join(outdir, "gctree") + frame_arg = " --frame {} ".format(frame) if frame is not None else "" + idlabel_arg = " --idlabel" if idlabel else "" + gctree_infer = CommandRunner( + [ + gctree_outbase + ".inference.parsimony_forest.p", + gctree_outbase + ".inference.log", + ], + [dnapars[1], phylip[1]] + + ([dnapars_bootstrap[1]] if bootstrap else []) + + ([phylip[3]] if colorfile is not None else []), + xarg + + buffarg + + "gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive " + + naiveID + + " --outbase " + + gctree_outbase + + frame_arg + + idlabel_arg + + (" --colormap ${SOURCES[-1]} " if colorfile is not None else "") + + (" --bootstrap_phylipfile ${SOURCES[2]}" if bootstrap else "") + + " | tee ${TARGETS[1]}", + ) return_list.append(gctree_infer) - - if igphyml: # basename = 'igphyml' # Need the dedup phy as fa for ASR: - dedup_fasta = env.Command([os.path.join(outdir, basename+'.dedup.fasta'), - os.path.join(outdir, basename+'.dedup.log')], - phylip[0], - 'seqmagick convert $SOURCE ${TARGETS[0]} > ${TARGETS[1]}') + dedup_fasta = env.Command( + [ + os.path.join(outdir, basename + ".dedup.fasta"), + os.path.join(outdir, basename + ".dedup.log"), + ], + phylip[0], + "seqmagick convert $SOURCE ${TARGETS[0]} > ${TARGETS[1]}", + ) # Run IgPhyML with the GY94 model to get the initial topology: - igphyml_gy94_topology = CommandRunner([os.path.join(outdir, basename+'.phylip_igphyml_tree.txt_gy94'), - os.path.join(outdir, basename+'.phylip_igphyml_tree.txt_gy94.log')], - phylip[0], - 'igphyml -i $SOURCE -m GY -w M0 -t e --run_id gy94 > ${TARGETS[1]}') + igphyml_gy94_topology = CommandRunner( + [ + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt_gy94"), + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt_gy94.log"), + ], + phylip[0], + "igphyml -i $SOURCE -m GY -w M0 -t e --run_id gy94 > ${TARGETS[1]}", + ) # Run IgPhyML with the HLP16 model using the GY94 tree topology as starting point: - igphyml_opti = 'tlr -s' # <--- can be changed to 'lr' or 'r' + igphyml_opti = "tlr -s" # <--- can be changed to 'lr' or 'r' ### Full motif model: --motifs WRC_2:0,GYW_0:1,WA_1:2,TW_0:3,SYC_2:4,GRS_0:5 --hotness e,e,e,e,e,e ### Less parameter rich motif model: --motifs WRC_2:0,GYW_0:0,WA_1:1,TW_0:2,SYC_2:3,GRS_0:3 --hotness e,e,e,e - igphyml_hlp16 = CommandRunner([os.path.join(outdir, basename+'.phylip_igphyml_tree.txt'), - os.path.join(outdir, basename+'.phylip_igphyml_stats.txt'), - os.path.join(outdir, basename+'.phylip_igphyml_tree.txt.log')], - [phylip[0], igphyml_gy94_topology[0]], - 'igphyml --motifs WRC_2:0,GYW_0:1,WA_1:2,TW_0:3,SYC_2:4,GRS_0:5 --hotness e,e,e,e,e,e -i ${SOURCES[0]} -u ${SOURCES[1]} -m HLP17 --root '+naiveID+' -o '+igphyml_opti+' --run_id hlp16 > ${TARGETS[2]}') + igphyml_hlp16 = CommandRunner( + [ + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt"), + os.path.join(outdir, basename + ".phylip_igphyml_stats.txt"), + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.log"), + ], + [phylip[0], igphyml_gy94_topology[0]], + "igphyml --motifs WRC_2:0,GYW_0:1,WA_1:2,TW_0:3,SYC_2:4,GRS_0:5 --hotness e,e,e,e,e,e -i ${SOURCES[0]} -u ${SOURCES[1]} -m HLP17 --root " + + naiveID + + " -o " + + igphyml_opti + + " --run_id hlp16 > ${TARGETS[2]}", + ) # On the HLP16 output tree make the naive sequence an outgroup: - naive_outgroup = env.Command([os.path.join(outdir, basename+'.phylip_igphyml_tree.txt.outgroup'), - os.path.join(outdir, basename+'.phylip_igphyml_tree.txt.outgroup.log')], - igphyml_hlp16[0], - 'python igphyml_files/igphyml_tools.py reroot --tree $SOURCE --reroot_tree ${TARGETS[0]} --pattern '+naiveID+' --outgroup 1 > ${TARGETS[1]}') - - igphyml_dir = which('igphyml') - assert(igphyml_dir is not None) - igphyml_dir = re.sub(r'/src/\w+$', '', igphyml_dir) + naive_outgroup = env.Command( + [ + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.outgroup"), + os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.outgroup.log"), + ], + igphyml_hlp16[0], + "python igphyml_files/igphyml_tools.py reroot --tree $SOURCE --reroot_tree ${TARGETS[0]} --pattern " + + naiveID + + " --outgroup 1 > ${TARGETS[1]}", + ) + + igphyml_dir = which("igphyml") + assert igphyml_dir is not None + igphyml_dir = re.sub(r"/src/\w+$", "", igphyml_dir) # Run IgPhyML ASR script: - run_ASR = CommandRunner([os.path.join(outdir, basename+'.MLcodons.fa'), - os.path.join(outdir, basename+'.igphyml_hlp16.MLcodons.log')], - [igphyml_hlp16[1], naive_outgroup[0], dedup_fasta[0]], - buffarg + 'perl igphyml_files/ancReconstructHLP16.pl PLACEHOLDER_CONFIG_FILE -rooted 1 -length D -stats ${SOURCES[0]} -tree ${SOURCES[1]} -seqfile ${SOURCES[2]} -outdir '+outdir+' -stem '+basename+' -rootid '+naiveID+' -igphyml '+igphyml_dir+'> ${TARGETS[1]}') + run_ASR = CommandRunner( + [ + os.path.join(outdir, basename + ".MLcodons.fa"), + os.path.join(outdir, basename + ".igphyml_hlp16.MLcodons.log"), + ], + [igphyml_hlp16[1], naive_outgroup[0], dedup_fasta[0]], + buffarg + + "perl igphyml_files/ancReconstructHLP16.pl PLACEHOLDER_CONFIG_FILE -rooted 1 -length D -stats ${SOURCES[0]} -tree ${SOURCES[1]} -seqfile ${SOURCES[2]} -outdir " + + outdir + + " -stem " + + basename + + " -rootid " + + naiveID + + " -igphyml " + + igphyml_dir + + "> ${TARGETS[1]}", + ) # Convert the ASR output to an collapsed forest with an ete3 tree and pickle it: - igphyml_infer = env.Command([os.path.join(outdir, 'igphyml.inferred_tree.p'), - os.path.join(outdir, 'igphyml.inferred_tree.log')], - [naive_outgroup[0], phylip[1], run_ASR], - xarg + 'python igphyml_files/igphyml_tools.py ASR_parser --tree ${SOURCES[0]} --counts ${SOURCES[1]} --asr_seq ${SOURCES[2]} --outbase '+os.path.join(outdir, 'igphyml.inferred_tree')+ ' --naive '+naiveID+' > ${TARGETS[1]}') + igphyml_infer = env.Command( + [ + os.path.join(outdir, "igphyml.inferred_tree.p"), + os.path.join(outdir, "igphyml.inferred_tree.log"), + ], + [naive_outgroup[0], phylip[1], run_ASR], + xarg + + "python igphyml_files/igphyml_tools.py ASR_parser --tree ${SOURCES[0]} --counts ${SOURCES[1]} --asr_seq ${SOURCES[2]} --outbase " + + os.path.join(outdir, "igphyml.inferred_tree") + + " --naive " + + naiveID + + " > ${TARGETS[1]}", + ) return_list.append(igphyml_infer) -Return('return_list') +Return("return_list") diff --git a/SConscript.simulation b/SConscript.simulation index 49de4ac8..1830f99e 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -1,147 +1,233 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -'''Simulate tree''' +"""Simulate tree""" import os from nestly import Nest from nestly.scons import SConsWrap + # the following must be exported by parent SConstruct/SConscript -Import('env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg') +Import( + "env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg" +) nest = Nest() w = SConsWrap(nest, outdir, alias_environment=env) if gctree: - w.add_aggregate('gctree_outeragg', list) # <-- aggregating results across parameters -w.add_aggregate('outeragg', list) # <-- aggregating results across parameters + w.add_aggregate( + "gctree_outeragg", list + ) # <-- aggregating results across parameters +w.add_aggregate("outeragg", list) # <-- aggregating results across parameters # Initialize our first nest level, -w.add('lambda', lambda_list) -w.add('lambda0', lambda0_list) +w.add("lambda", lambda_list) +w.add("lambda0", lambda0_list) if gctree: - w.add_aggregate('gctree_agg', list) # <-- for aggregating repeated simulations with the same parameters -w.add_aggregate('agg', list) # <-- for aggregating inference result from repeated simulations with the same parameters -w.add_aggregate('simstat_agg', list) # <-- for aggregating simulation stats with the same parameters -w.add_aggregate('summary_stats', list) # <-- summary stats for CFT study (no abundance) + w.add_aggregate( + "gctree_agg", list + ) # <-- for aggregating repeated simulations with the same parameters +w.add_aggregate( + "agg", list +) # <-- for aggregating inference result from repeated simulations with the same parameters +w.add_aggregate( + "simstat_agg", list +) # <-- for aggregating simulation stats with the same parameters +w.add_aggregate("summary_stats", list) # <-- summary stats for CFT study (no abundance) # next nest, just random simulation reruns, same params -w.add('runs', range(1, nsim+1)) +w.add("runs", range(1, nsim + 1)) + @w.add_target() def gctree_sim(outdir, c): - ''' + """ GCtree simulation NOTE: xvfb-run is needed because of issue https://github.com/etetoolkit/ete/issues/101 - ''' - frame_arg = ' --frame {} '.format(frame) if frame is not None else '' - idlabel_arg = ' --idlabel' if idlabel else '' - T_arg = ' --T {} '.format(' '.join(map(str, T))) if T else '' - N_arg = ' --N {} '.format(N) if N is not None else '' - n_arg = ' --n {} '.format(n) if n is not None else '' - sele_arg = ' --selection True --target_dist {} --target_count {} --verbose {} --carry_cap {} --skip_update {}'.format(*selection_param) if selection_param is not None else '' - tgt = CommandRunner([os.path.join(outdir, 'gctree.simulation.fasta'), - os.path.join(outdir, 'gctree.simulation.stats.tsv'), - os.path.join(outdir, 'gctree.simulation.collapsed_tree.p'), - os.path.join(outdir, 'gctree.simulation.collapsed_tree.colormap.tsv'), - os.path.join(outdir, 'gctree.simulation.log')], - [mutability, substitution], - xarg + buffarg + 'gctree simulate '+naive+ - ' ${SOURCES[0]} ${SOURCES[1]}'+ - ' --outbase '+os.path.join(outdir, 'gctree')+ - ' --lambda {0[lambda]} --lambda0 {0[lambda0]}'.format(c)+ - frame_arg+ - idlabel_arg+ - T_arg+ - N_arg+ - n_arg+ - sele_arg+ - ' | tee ${TARGETS[4]}') - c['simstat_agg'].append(tgt[1]) - c['summary_stats'].append(tgt[0]) + """ + frame_arg = " --frame {} ".format(frame) if frame is not None else "" + idlabel_arg = " --idlabel" if idlabel else "" + T_arg = " --T {} ".format(" ".join(map(str, T))) if T else "" + N_arg = " --N {} ".format(N) if N is not None else "" + n_arg = " --n {} ".format(n) if n is not None else "" + sele_arg = ( + " --selection True --target_dist {} --target_count {} --verbose {} --carry_cap {} --skip_update {}".format( + *selection_param + ) + if selection_param is not None + else "" + ) + tgt = CommandRunner( + [ + os.path.join(outdir, "gctree.simulation.fasta"), + os.path.join(outdir, "gctree.simulation.stats.tsv"), + os.path.join(outdir, "gctree.simulation.collapsed_tree.p"), + os.path.join(outdir, "gctree.simulation.collapsed_tree.colormap.tsv"), + os.path.join(outdir, "gctree.simulation.log"), + ], + [mutability, substitution], + xarg + + buffarg + + "gctree simulate " + + naive + + " ${SOURCES[0]} ${SOURCES[1]}" + + " --outbase " + + os.path.join(outdir, "gctree") + + " --lambda {0[lambda]} --lambda0 {0[lambda0]}".format(c) + + frame_arg + + idlabel_arg + + T_arg + + N_arg + + n_arg + + sele_arg + + " | tee ${TARGETS[4]}", + ) + c["simstat_agg"].append(tgt[1]) + c["summary_stats"].append(tgt[0]) return tgt + @w.add_target() def infer(outdir, c): - '''now do inference on the simulation results''' - input_file = c['gctree_sim'][0] + """now do inference on the simulation results""" + input_file = c["gctree_sim"][0] input_file2 = None - naiveID = 'naive' # this is what the simulation routine names the naive + naiveID = "naive" # this is what the simulation routine names the naive converter = None # No problem with weird fasta formating from the simulated data bootstrap = 0 colorfile = None - return SConscript('SConscript.inference', exports='env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile') + return SConscript( + "SConscript.inference", + exports="env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + ) + @w.add_target() def validate(outdir, c): - '''do validation''' - outputs = [os.path.join(outdir, 'validation.tsv'), # <-- this one compares different methods - os.path.join(outdir, 'validation.log')] + """do validation""" + outputs = [ + os.path.join( + outdir, "validation.tsv" + ), # <-- this one compares different methods + os.path.join(outdir, "validation.log"), + ] if gctree: - outputs.append(os.path.join(outdir, 'validation.gctree.tsv')) # <-- special gctree output evaluating parsimony tree ranking - tgt = CommandRunner(outputs, - [c['gctree_sim'][2:4]] + [x[0] for x in c['infer']], - xarg + buffarg + 'python scripts/validation.py $SOURCES --outbase '+os.path.join(outdir, 'validation')+' > ${TARGETS[1]}') + outputs.append( + os.path.join(outdir, "validation.gctree.tsv") + ) # <-- special gctree output evaluating parsimony tree ranking + tgt = CommandRunner( + outputs, + [c["gctree_sim"][2:4]] + [x[0] for x in c["infer"]], + xarg + + buffarg + + "python scripts/validation.py $SOURCES --outbase " + + os.path.join(outdir, "validation") + + " > ${TARGETS[1]}", + ) if gctree: - c['gctree_agg'].append(tgt[2]) - c['agg'].append(tgt[0]) + c["gctree_agg"].append(tgt[2]) + c["agg"].append(tgt[0]) return tgt -w.pop('runs') + +w.pop("runs") if gctree: + @w.add_target() def gctree_aggregate(outdir, c): - '''aggregate validation results''' - allmetrics_arg = ' --allmetrics' if igphyml or dnaml else '' - tgt = env.Command([os.path.join(outdir, 'gctree.validaggreg.tsv'), - os.path.join(outdir, 'gctree.validaggreg.log')], - c['gctree_agg'], - buffarg + 'python scripts/validaggreg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.validaggreg') + allmetrics_arg + ' > ${TARGETS[1]}') + """aggregate validation results""" + allmetrics_arg = " --allmetrics" if igphyml or dnaml else "" + tgt = env.Command( + [ + os.path.join(outdir, "gctree.validaggreg.tsv"), + os.path.join(outdir, "gctree.validaggreg.log"), + ], + c["gctree_agg"], + buffarg + + "python scripts/validaggreg.py $SOURCES --outbase " + + os.path.join(outdir, "gctree.validaggreg") + + allmetrics_arg + + " > ${TARGETS[1]}", + ) env.AlwaysBuild(tgt) - c['gctree_outeragg'].append(tgt[0]) + c["gctree_outeragg"].append(tgt[0]) return tgt + @w.add_target() def simstat_aggregate(outdir, c): - '''aggregate simulation stats''' - tgt = env.Command([os.path.join(outdir, 'gctree.simulation.stats.log')], - c['simstat_agg'], - buffarg + 'python scripts/simstatagg.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.stats')+ - ' --experimental example/150228_Clone_3-8.fasta > ${TARGETS[0]}') + """aggregate simulation stats""" + tgt = env.Command( + [os.path.join(outdir, "gctree.simulation.stats.log")], + c["simstat_agg"], + buffarg + + "python scripts/simstatagg.py $SOURCES --outbase " + + os.path.join(outdir, "gctree.simulation.stats") + + " --experimental example/150228_Clone_3-8.fasta > ${TARGETS[0]}", + ) env.AlwaysBuild(tgt) return tgt + @w.add_target() def summary_stats(outdir, c): - '''aggregate simulation stats CFT version''' - exp_arg = ' --experimental ' + ' '.join(experimental_list) if len(experimental_list) > 0 else '' - tgt = env.Command([os.path.join(outdir, 'gctree.simulation.summary_stats.log')], - c['summary_stats'], - buffarg + 'python scripts/summary_stats.py $SOURCES --outbase '+os.path.join(outdir, 'gctree.simulation.summary_stats')+ - exp_arg + - ' --naiveIDexp ' + naiveIDexp + ' > ${TARGETS[0]}') + """aggregate simulation stats CFT version""" + exp_arg = ( + " --experimental " + " ".join(experimental_list) + if len(experimental_list) > 0 + else "" + ) + tgt = env.Command( + [os.path.join(outdir, "gctree.simulation.summary_stats.log")], + c["summary_stats"], + buffarg + + "python scripts/summary_stats.py $SOURCES --outbase " + + os.path.join(outdir, "gctree.simulation.summary_stats") + + exp_arg + + " --naiveIDexp " + + naiveIDexp + + " > ${TARGETS[0]}", + ) env.AlwaysBuild(tgt) return tgt + @w.add_target() def inner_aggregate(outdir, c): - '''aggregate validation results''' - tgt = env.Command([os.path.join(outdir, 'validaggreg.tsv'), - os.path.join(outdir, 'validaggreg.log')], - c['agg'], - buffarg + 'python scripts/validaggreg_compare.py $SOURCES --outbase '+os.path.join(outdir, 'validaggreg')+' > ${TARGETS[1]}') + """aggregate validation results""" + tgt = env.Command( + [ + os.path.join(outdir, "validaggreg.tsv"), + os.path.join(outdir, "validaggreg.log"), + ], + c["agg"], + buffarg + + "python scripts/validaggreg_compare.py $SOURCES --outbase " + + os.path.join(outdir, "validaggreg") + + " > ${TARGETS[1]}", + ) env.AlwaysBuild(tgt) - c['outeragg'].append(tgt[0]) + c["outeragg"].append(tgt[0]) return tgt -w.pop('lambda') + +w.pop("lambda") + @w.add_target() def outer_aggregate(outdir, c): - '''aggregate different parameter values''' - tgt = env.Command([os.path.join(outdir, 'aggregation.tsv'), - os.path.join(outdir, 'aggregation.log')], - c['outeragg'], - buffarg + 'python scripts/aggregate_compare.py $SOURCES --outbase '+os.path.join(outdir, 'aggregation')+' > ${TARGETS[1]}') + """aggregate different parameter values""" + tgt = env.Command( + [ + os.path.join(outdir, "aggregation.tsv"), + os.path.join(outdir, "aggregation.log"), + ], + c["outeragg"], + buffarg + + "python scripts/aggregate_compare.py $SOURCES --outbase " + + os.path.join(outdir, "aggregation") + + " > ${TARGETS[1]}", + ) env.AlwaysBuild(tgt) return tgt diff --git a/SConstruct b/SConstruct index 54853147..51f6909c 100644 --- a/SConstruct +++ b/SConstruct @@ -1,8 +1,8 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" Infer trees from germinal center data, and validate inference method with simulation -''' +""" from __future__ import print_function import os import sys @@ -18,224 +18,238 @@ environ = os.environ.copy() env = Environment(ENV=environ) # Add stuff to PATH -env.PrependENVPath('PATH', 'bin') +env.PrependENVPath("PATH", "bin") # Setting up command line arguments/options -AddOption('--inference', - action='store_true', - help='Run inference') -inference = GetOption('inference') -AddOption('--simulate', - action='store_true', - help='validation subprogram, instead of inference') -simulate = GetOption('simulate') -AddOption('--srun', - action='store_true', - help='Should jobs be submitted with srun?') -if GetOption('srun'): +AddOption("--inference", action="store_true", help="Run inference") +inference = GetOption("inference") +AddOption( + "--simulate", + action="store_true", + help="validation subprogram, instead of inference", +) +simulate = GetOption("simulate") +AddOption("--srun", action="store_true", help="Should jobs be submitted with srun?") +if GetOption("srun"): CommandRunner = env.SRun else: CommandRunner = env.Command -AddOption('--frame', - type='int', - default=None, - help='codon frame') -frame = GetOption('frame') -AddOption('--nogctree', - action='store_true', - help='don''t use gctree inference') -gctree = (GetOption('nogctree') != True) -AddOption('--igphyml', - action='store_true', - help='use igphyml inference') -igphyml = GetOption('igphyml') -AddOption('--dnaml', - action='store_true', - help='use dnaml inference') -dnaml = GetOption('dnaml') -AddOption('--outdir', - type='string', - help="directory in which to output results") -outdir = GetOption('outdir') -AddOption('--quick', - action='store_true', - help='less thourough dnapars tree search (faster)') -quick = GetOption('quick') -AddOption('--idlabel', - action='store_true', - help='label sequence ids on tree, and write associated alignment') -idlabel = GetOption('idlabel') -AddOption('--xvfb', - action='store_true', - help='use virtual X, for rendering ETE trees on a remote server') -xarg = 'TMPDIR=/tmp xvfb-run -a ' if GetOption('xvfb') else '' -AddOption('--nobuff', - action='store_true', - help='use stdbuf to prevent line buffering on linux') -buffarg = 'stdbuf -oL ' if GetOption('nobuff') else '' +AddOption("--frame", type="int", default=None, help="codon frame") +frame = GetOption("frame") +AddOption("--nogctree", action="store_true", help="don" "t use gctree inference") +gctree = GetOption("nogctree") != True +AddOption("--igphyml", action="store_true", help="use igphyml inference") +igphyml = GetOption("igphyml") +AddOption("--dnaml", action="store_true", help="use dnaml inference") +dnaml = GetOption("dnaml") +AddOption("--outdir", type="string", help="directory in which to output results") +outdir = GetOption("outdir") +AddOption( + "--quick", action="store_true", help="less thourough dnapars tree search (faster)" +) +quick = GetOption("quick") +AddOption( + "--idlabel", + action="store_true", + help="label sequence ids on tree, and write associated alignment", +) +idlabel = GetOption("idlabel") +AddOption( + "--xvfb", + action="store_true", + help="use virtual X, for rendering ETE trees on a remote server", +) +xarg = "TMPDIR=/tmp xvfb-run -a " if GetOption("xvfb") else "" +AddOption( + "--nobuff", + action="store_true", + help="use stdbuf to prevent line buffering on linux", +) +buffarg = "stdbuf -oL " if GetOption("nobuff") else "" + class InputError(Exception): """Exception raised for errors in the input.""" -if not gctree and not igphyml and not GetOption('help'): - raise InputError('must set at least one inference method') + +if not gctree and not igphyml and not GetOption("help"): + raise InputError("must set at least one inference method") if igphyml and frame != 1: - raise InputError('frame must equal 1 for igphyml') + raise InputError("frame must equal 1 for igphyml") -if not simulate and not inference and not GetOption('help'): - raise InputError('Please provide one of the required arguments. Either "--inference" or "--simulate".' - 'Command line help can then be evoked by "-h" or "--help" and found in the bottom' - 'of the output under "Local Options".') +if not simulate and not inference and not GetOption("help"): + raise InputError( + 'Please provide one of the required arguments. Either "--inference" or "--simulate".' + 'Command line help can then be evoked by "-h" or "--help" and found in the bottom' + 'of the output under "Local Options".' + ) if simulate: - AddOption('--naive', - type='string', - default='ggacctagcctcgtgaaaccttctcagactctgtccctcacctgttctgtcactg' - 'gcgactccatcaccagtggttactggaactggatccggaaattcccagggaataa' - 'acttgagtacatggggtacataagctacagtggtagcacttactacaatccatct' - 'ctcaaaagtcgaatctccatcactcgagacacatccaagaaccagtactacctgc' - 'agttgaattctgtgactactgaggacacagccacatattactgt', - help='sequence of naive from which to simulate') - naive = GetOption('naive') - AddOption('--mutability', - type='string', - metavar='PATH', - default='S5F/Mutability.csv', - help='path to S5F mutability data') - mutability = GetOption('mutability') - AddOption('--substitution', - type='string', - metavar='PATH', - default='S5F/Substitution.csv', - help='path to S5F substitution data') - substitution = GetOption('substitution') - AddOption('--lambda', - type='float', - action='append', - default=[], - help='Poisson branching parameter for simulation') - lambda_list = GetOption('lambda') + AddOption( + "--naive", + type="string", + default="ggacctagcctcgtgaaaccttctcagactctgtccctcacctgttctgtcactg" + "gcgactccatcaccagtggttactggaactggatccggaaattcccagggaataa" + "acttgagtacatggggtacataagctacagtggtagcacttactacaatccatct" + "ctcaaaagtcgaatctccatcactcgagacacatccaagaaccagtactacctgc" + "agttgaattctgtgactactgaggacacagccacatattactgt", + help="sequence of naive from which to simulate", + ) + naive = GetOption("naive") + AddOption( + "--mutability", + type="string", + metavar="PATH", + default="S5F/Mutability.csv", + help="path to S5F mutability data", + ) + mutability = GetOption("mutability") + AddOption( + "--substitution", + type="string", + metavar="PATH", + default="S5F/Substitution.csv", + help="path to S5F substitution data", + ) + substitution = GetOption("substitution") + AddOption( + "--lambda", + type="float", + action="append", + default=[], + help="Poisson branching parameter for simulation", + ) + lambda_list = GetOption("lambda") if len(lambda_list) == 0: - lambda_list = [2.] - AddOption('--lambda0', - type='float', - action='append', - default=[], - help='baseline mutation rate') - lambda0_list = GetOption('lambda0') + lambda_list = [2.0] + AddOption( + "--lambda0", + type="float", + action="append", + default=[], + help="baseline mutation rate", + ) + lambda0_list = GetOption("lambda0") if len(lambda0_list) == 0: - lambda0_list = [.25] - AddOption('--n', - type='int', - default=None, - help='cells downsampled') - n = GetOption('n') - AddOption('--N', - type='int', - default=None, - help='simulation size (number of cells observerved)') - N = GetOption('N') - AddOption('--T', - type='int', - action='append', - default=[], - help='observation time') - T = GetOption('T') - AddOption('--nsim', - type='int', - default=10, - help='number of simulations with each parameter parameter choice') - nsim = GetOption('nsim') - AddOption('--experimental', - type='string', - action='append', - default=[], - help='experimental fastas for comparing summary stats') - experimental_list = GetOption('experimental') - AddOption('--naiveIDexp', - type='string', - default='naive0', - help='id of naive seq in the experimental data') - naiveIDexp = GetOption('naiveIDexp') - AddOption('--selection', - action='store_true', - help='Simulation with affinity selection.') - selection = GetOption('selection') + lambda0_list = [0.25] + AddOption("--n", type="int", default=None, help="cells downsampled") + n = GetOption("n") + AddOption( + "--N", + type="int", + default=None, + help="simulation size (number of cells observerved)", + ) + N = GetOption("N") + AddOption("--T", type="int", action="append", default=[], help="observation time") + T = GetOption("T") + AddOption( + "--nsim", + type="int", + default=10, + help="number of simulations with each parameter parameter choice", + ) + nsim = GetOption("nsim") + AddOption( + "--experimental", + type="string", + action="append", + default=[], + help="experimental fastas for comparing summary stats", + ) + experimental_list = GetOption("experimental") + AddOption( + "--naiveIDexp", + type="string", + default="naive0", + help="id of naive seq in the experimental data", + ) + naiveIDexp = GetOption("naiveIDexp") + AddOption( + "--selection", action="store_true", help="Simulation with affinity selection." + ) + selection = GetOption("selection") if selection: - AddOption('--target_dist', - type='int', - default=10, - help='Distance to selection target.') - target_dist = GetOption('target_dist') - AddOption('--target_count', - type='int', - default=10, - help='Number of targets.') - target_count = GetOption('target_count') - AddOption('--verbose', - action='store_true', - help='Verbose printing.') - verbose = GetOption('verbose') - AddOption('--carry_cap', - type='int', - default=1000, - help='Number of targets.') - carry_cap = GetOption('carry_cap') - AddOption('--skip_update', - type='int', - default=100, - help='Skip update step.') - skip_update = GetOption('skip_update') + AddOption( + "--target_dist", + type="int", + default=10, + help="Distance to selection target.", + ) + target_dist = GetOption("target_dist") + AddOption("--target_count", type="int", default=10, help="Number of targets.") + target_count = GetOption("target_count") + AddOption("--verbose", action="store_true", help="Verbose printing.") + verbose = GetOption("verbose") + AddOption("--carry_cap", type="int", default=1000, help="Number of targets.") + carry_cap = GetOption("carry_cap") + AddOption("--skip_update", type="int", default=100, help="Skip update step.") + skip_update = GetOption("skip_update") selection_param = (target_dist, target_count, verbose, carry_cap, skip_update) else: selection_param = None elif inference: - AddOption('--input', - dest='input', - type='string', - action='append', - default=[], - metavar='PATH', - help='path to input fasta or phylip') - input_file = GetOption('input') + AddOption( + "--input", + dest="input", + type="string", + action="append", + default=[], + metavar="PATH", + help="path to input fasta or phylip", + ) + input_file = GetOption("input") if len(input_file) == 1: input_file = input_file[0] input_file2 = None else: input_file, input_file2 = input_file - AddOption('--colorfile', - dest='colorfile', - type='string', - default=None, - metavar='PATH', - help='optional two column csv file with colors to associate with each cell') - colorfile = GetOption('colorfile') - AddOption('--naiveID', - type='string', - metavar='seqID', - default='naive', - help='id of naive sequence') - naiveID = GetOption('naiveID') - AddOption('--converter', - type='string', - default=None, - help='Converter to convert input format e.g. the Victora lab GC fasta format') - converter = GetOption('converter') - AddOption('--bootstrap', - type='int', - default=0, - help='boostrap resampling, and inference on each (default no bootstrap)') - bootstrap = GetOption('bootstrap') + AddOption( + "--colorfile", + dest="colorfile", + type="string", + default=None, + metavar="PATH", + help="optional two column csv file with colors to associate with each cell", + ) + colorfile = GetOption("colorfile") + AddOption( + "--naiveID", + type="string", + metavar="seqID", + default="naive", + help="id of naive sequence", + ) + naiveID = GetOption("naiveID") + AddOption( + "--converter", + type="string", + default=None, + help="Converter to convert input format e.g. the Victora lab GC fasta format", + ) + converter = GetOption("converter") + AddOption( + "--bootstrap", + type="int", + default=0, + help="boostrap resampling, and inference on each (default no bootstrap)", + ) + bootstrap = GetOption("bootstrap") # First call after all arguments have been parsed # to enable correct command line help. -if simulate and not GetOption('help'): +if simulate and not GetOption("help"): if outdir is None: - raise InputError('outdir must be specified') - SConscript('SConscript.simulation', - exports='env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg') -elif inference and not GetOption('help'): + raise InputError("outdir must be specified") + SConscript( + "SConscript.simulation", + exports="env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg", + ) +elif inference and not GetOption("help"): if None in [input_file, outdir]: - raise InputError('input fasta or phylip and outdir must be specified') - SConscript('SConscript.inference', exports='env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile') + raise InputError("input fasta or phylip and outdir must be specified") + SConscript( + "SConscript.inference", + exports="env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + ) diff --git a/gctree/_version.py b/gctree/_version.py index 3f1701dd..a61d4083 100644 --- a/gctree/_version.py +++ b/gctree/_version.py @@ -1,4 +1,3 @@ - # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build @@ -58,17 +57,18 @@ class NotThisMethod(Exception): def register_vcs_handler(vcs, method): # decorator """Decorator to mark a method as the handler for a particular VCS.""" + def decorate(f): """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: HANDLERS[vcs] = {} HANDLERS[vcs][method] = f return f + return decorate -def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, - env=None): +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) p = None @@ -76,10 +76,13 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, try: dispcmd = str([c] + args) # remember shell=False, so use git.cmd on windows, not just git - p = subprocess.Popen([c] + args, cwd=cwd, env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None)) + p = subprocess.Popen( + [c] + args, + cwd=cwd, + env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr else None), + ) break except EnvironmentError: e = sys.exc_info()[1] @@ -116,16 +119,22 @@ def versions_from_parentdir(parentdir_prefix, root, verbose): for i in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): - return {"version": dirname[len(parentdir_prefix):], - "full-revisionid": None, - "dirty": False, "error": None, "date": None} + return { + "version": dirname[len(parentdir_prefix) :], + "full-revisionid": None, + "dirty": False, + "error": None, + "date": None, + } else: rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: - print("Tried directories %s but none started with prefix %s" % - (str(rootdirs), parentdir_prefix)) + print( + "Tried directories %s but none started with prefix %s" + % (str(rootdirs), parentdir_prefix) + ) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") @@ -181,7 +190,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " - tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + tags = set([r[len(TAG) :] for r in refs if r.startswith(TAG)]) if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d @@ -190,7 +199,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". - tags = set([r for r in refs if re.search(r'\d', r)]) + tags = set([r for r in refs if re.search(r"\d", r)]) if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: @@ -198,19 +207,26 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): - r = ref[len(tag_prefix):] + r = ref[len(tag_prefix) :] if verbose: print("picking %s" % r) - return {"version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": None, - "date": date} + return { + "version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, + "error": None, + "date": date, + } # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") - return {"version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": "no suitable tags", "date": None} + return { + "version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, + "error": "no suitable tags", + "date": None, + } @register_vcs_handler("git", "pieces_from_vcs") @@ -225,8 +241,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] - out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, - hide_stderr=True) + out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True) if rc != 0: if verbose: print("Directory %s not under git control" % root) @@ -234,10 +249,19 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", - "--always", "--long", - "--match", "%s*" % tag_prefix], - cwd=root) + describe_out, rc = run_command( + GITS, + [ + "describe", + "--tags", + "--dirty", + "--always", + "--long", + "--match", + "%s*" % tag_prefix, + ], + cwd=root, + ) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") @@ -260,17 +284,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: - git_describe = git_describe[:git_describe.rindex("-dirty")] + git_describe = git_describe[: git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX - mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? - pieces["error"] = ("unable to parse git-describe output: '%s'" - % describe_out) + pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out return pieces # tag @@ -279,10 +302,12 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): if verbose: fmt = "tag '%s' doesn't start with prefix '%s'" print(fmt % (full_tag, tag_prefix)) - pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" - % (full_tag, tag_prefix)) + pieces["error"] = "tag '%s' doesn't start with prefix '%s'" % ( + full_tag, + tag_prefix, + ) return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix):] + pieces["closest-tag"] = full_tag[len(tag_prefix) :] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) @@ -293,13 +318,13 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): else: # HEX: no tags pieces["closest-tag"] = None - count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], - cwd=root) + count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], - cwd=root)[0].strip() + date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[ + 0 + ].strip() pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces @@ -330,8 +355,7 @@ def render_pep440(pieces): rendered += ".dirty" else: # exception #1 - rendered = "0+untagged.%d.g%s" % (pieces["distance"], - pieces["short"]) + rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered @@ -445,11 +469,13 @@ def render_git_describe_long(pieces): def render(pieces, style): """Render the given version pieces into the requested style.""" if pieces["error"]: - return {"version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None} + return { + "version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None, + } if not style or style == "default": style = "pep440" # the default @@ -469,9 +495,13 @@ def render(pieces, style): else: raise ValueError("unknown style '%s'" % style) - return {"version": rendered, "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], "error": None, - "date": pieces.get("date")} + return { + "version": rendered, + "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], + "error": None, + "date": pieces.get("date"), + } def get_versions(): @@ -485,8 +515,7 @@ def get_versions(): verbose = cfg.verbose try: - return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, - verbose) + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) except NotThisMethod: pass @@ -495,13 +524,16 @@ def get_versions(): # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. - for i in cfg.versionfile_source.split('/'): + for i in cfg.versionfile_source.split("/"): root = os.path.dirname(root) except NameError: - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to find root of source tree", - "date": None} + return { + "version": "0+unknown", + "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None, + } try: pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) @@ -515,6 +547,10 @@ def get_versions(): except NotThisMethod: pass - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", "date": None} + return { + "version": "0+unknown", + "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", + "date": None, + } diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index 52531a1c..8ee7a0f6 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -23,10 +23,10 @@ import pickle from functools import lru_cache -np.seterr(all='raise') +np.seterr(all="raise") -class LeavesAndClades(): +class LeavesAndClades: r"""This is a base class for simulating, and computing likelihood for, an infinite type branching process with branching probability p, mutation probability q, and we collapse mutant clades off the root type and consider @@ -45,25 +45,30 @@ def __init__(self, params=None, c=None, m=None): if params is not None: p, q = params if not (0 <= p <= 1 and 0 <= q <= 1): - raise ValueError('p and q must be in the unit interval: ' - f'p = {p}, q = {q}') + raise ValueError( + "p and q must be in the unit interval: " f"p = {p}, q = {q}" + ) self.params = params if c is not None or m is not None: - if not (c >= 0) and (m >= 0) and (c+m > 0): - raise ValueError('c and m must be nonnegative integers ' - 'summing greater than zero: ' - f'c = {c}, m = {m}') + if not (c >= 0) and (m >= 0) and (c + m > 0): + raise ValueError( + "c and m must be nonnegative integers " + "summing greater than zero: " + f"c = {c}, m = {m}" + ) self.c = c self.m = m def simulate(self): - '''simulate the number of clone leaves and mutant clades off a root - node''' - if self.params[0] >= .5: - warnings.warn(f'p = {self.p} is not subcritical, tree simulations' - ' not garanteed to terminate') + """simulate the number of clone leaves and mutant clades off a root + node""" + if self.params[0] >= 0.5: + warnings.warn( + f"p = {self.p} is not subcritical, tree simulations" + " not garanteed to terminate" + ) if self.params is None: - raise ValueError('params must be defined for simulation\n') + raise ValueError("params must be defined for simulation\n") # let's track the tree in breadth first order, listing number of clonal # and mutant descendants of each node mutant clades terminate in this @@ -75,8 +80,7 @@ def simulate(self): # while termination condition not met while cumsum_clones > len_tree - 1: if random.random() < self.params[0]: - mutants = sum(random.random() < self.params[1] - for child in range(2)) + mutants = sum(random.random() < self.params[1] for child in range(2)) clones = 2 - mutants self.m += mutants else: @@ -110,56 +114,57 @@ def logf(c, m, *params): dlogfdq_result = 2 / q else: if m >= 1: - neighbor_logf, (neighbor_dlogfdp, - neighbor_dlogfdq) = LeavesAndClades.logf( - c, - m - 1, - *params) - logf_result = (np.log(2) + np.log(p) + np.log(q) + np.log(1-q) - + neighbor_logf) + neighbor_logf, ( + neighbor_dlogfdp, + neighbor_dlogfdq, + ) = LeavesAndClades.logf(c, m - 1, *params) + logf_result = ( + np.log(2) + np.log(p) + np.log(q) + np.log(1 - q) + neighbor_logf + ) dlogfdp_result = 1 / p + neighbor_dlogfdp dlogfdq_result = 1 / q - 1 / (1 - q) + neighbor_dlogfdq else: logf_result = -np.inf - dlogfdp_result = 0. - dlogfdq_result = 0. + dlogfdp_result = 0.0 + dlogfdq_result = 0.0 logg_array = [logf_result] dloggdp_array = [dlogfdp_result] dloggdq_array = [dlogfdq_result] - for cx in range(c+1): + for cx in range(c + 1): for mx in range(m + 1): - if ((not (cx == mx == 0)) and (not (cx == c and mx == m))): - (neighbor1_logf, - (neighbor1_dlogfdp, - neighbor1_dlogfdq)) = LeavesAndClades.logf(cx, mx, - *params) - (neighbor2_logf, - (neighbor2_dlogfdp, - neighbor2_dlogfdq)) = LeavesAndClades.logf( - c - cx, m - mx, *params) - logg = (np.log(p) + 2 * np.log(1 - q) + neighbor1_logf - + neighbor2_logf) + if (not (cx == mx == 0)) and (not (cx == c and mx == m)): + ( + neighbor1_logf, + (neighbor1_dlogfdp, neighbor1_dlogfdq), + ) = LeavesAndClades.logf(cx, mx, *params) + ( + neighbor2_logf, + (neighbor2_dlogfdp, neighbor2_dlogfdq), + ) = LeavesAndClades.logf(c - cx, m - mx, *params) + logg = ( + np.log(p) + + 2 * np.log(1 - q) + + neighbor1_logf + + neighbor2_logf + ) dloggdp = 1 / p + neighbor1_dlogfdp + neighbor2_dlogfdp - dloggdq = (- 2 / (1 - q) - + neighbor1_dlogfdq + neighbor2_dlogfdq) + dloggdq = -2 / (1 - q) + neighbor1_dlogfdq + neighbor2_dlogfdq logg_array.append(logg) dloggdp_array.append(dloggdp) dloggdq_array.append(dloggdq) logf_result = logsumexp(logg_array) softmax_logg_array = softmax(logg_array) - dlogfdp_result = np.multiply(softmax_logg_array, - dloggdp_array).sum() - dlogfdq_result = np.multiply(softmax_logg_array, - dloggdq_array).sum() + dlogfdp_result = np.multiply(softmax_logg_array, dloggdp_array).sum() + dlogfdq_result = np.multiply(softmax_logg_array, dloggdq_array).sum() return (logf_result, np.array([dlogfdp_result, dlogfdq_result])) @staticmethod def build_logf_cache(c_max, m_max, *params): - ''' build up the lru_cache from the bottom to avoid recursion depth - issues''' + """build up the lru_cache from the bottom to avoid recursion depth + issues""" LeavesAndClades.logf.cache_clear() - print(f'building likelihood cache for parameters {params}') + print(f"building likelihood cache for parameters {params}") for c in range(c_max + 1): for m in range(m_max + 1): LeavesAndClades.logf(c, m, *params) @@ -175,33 +180,47 @@ class CollapsedTree(LeavesAndClades): (2) (1) """ - def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, - allow_repeats=False): - ''' + def __init__( + self, + params=None, + tree=None, + frame=None, + collapse_syn=False, + allow_repeats=False, + ): + """ For intialization, either params or tree (or both) must be provided params: offspring distribution parameters tree: ete tree with frequency node feature. If uncollapsed, it will be collapsed frame: tranlation frame, with default None, no tranlation attempted - ''' + """ LeavesAndClades.__init__(self, params=params) if frame is not None and frame not in (1, 2, 3): - raise RuntimeError('frame must be 1, 2, 3, or None') + raise RuntimeError("frame must be 1, 2, 3, or None") self.frame = frame if collapse_syn is True: tree.dist = 0 # no branch above root for node in tree.iter_descendants(): - aa = Seq(node.sequence[(frame-1): - (frame - 1 + (3 * (((len(node.sequence) - - (frame - 1)) // 3 - ))))] - ).translate() - aa_parent = Seq(node.up.sequence[ - (frame - 1): - (frame - 1 + (3 * (((len(node.sequence) - - (frame - 1)) // 3))))] - ).translate() + aa = Seq( + node.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + aa_parent = Seq( + node.up.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() node.dist = hamming_distance(aa, aa_parent) if tree is not None: @@ -212,7 +231,8 @@ def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, if node.frequency == 0 and len(node.children) == 1: node.delete(prevent_nondicotomic=False) node.children[0].dist = hamming_distance( - node.children[0].sequence, parent.sequence) + node.children[0].sequence, parent.sequence + ) # iterate over the tree below root and collapse edges of zero # length if the node is a leaf and it's parent has nonzero @@ -220,7 +240,7 @@ def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, # bootstrap samples that result in repeated genotypes observed_genotypes = set((leaf.name for leaf in self.tree)) observed_genotypes.add(self.tree.name) - for node in self.tree.get_descendants(strategy='postorder'): + for node in self.tree.get_descendants(strategy="postorder"): if node.dist == 0: node.up.frequency += node.frequency if isinstance(node.name, str): @@ -245,46 +265,62 @@ def __init__(self, params=None, tree=None, frame=None, collapse_syn=False, final_observed_genotypes = set() for node in self.tree.traverse(): if node.frequency > 0 or node == self.tree: - for name in ((node.name,) if isinstance(node.name, str) - else node.name): + for name in ( + (node.name,) if isinstance(node.name, str) else node.name + ): final_observed_genotypes.add(name) if final_observed_genotypes != observed_genotypes: raise RuntimeError( - 'observed genotypes don\'t match after ' - f'collapse\n\tbefore: {observed_genotypes}' - f'\n\tafter: {final_observed_genotypes}\n\t' - 'symmetric diff: ' - f'{observed_genotypes ^ final_observed_genotypes}') - assert (sum(node.frequency for node in tree.traverse()) - == sum(node.frequency for node in self.tree.traverse())) - - rep_seq = (sum(node.frequency > 0 for node in self.tree.traverse()) - - len(set([node.sequence - for node in self.tree.traverse() - if node.frequency > 0]))) + "observed genotypes don't match after " + f"collapse\n\tbefore: {observed_genotypes}" + f"\n\tafter: {final_observed_genotypes}\n\t" + "symmetric diff: " + f"{observed_genotypes ^ final_observed_genotypes}" + ) + assert sum(node.frequency for node in tree.traverse()) == sum( + node.frequency for node in self.tree.traverse() + ) + + rep_seq = sum(node.frequency > 0 for node in self.tree.traverse()) - len( + set( + [ + node.sequence + for node in self.tree.traverse() + if node.frequency > 0 + ] + ) + ) if not allow_repeats and rep_seq: raise RuntimeError( - 'Repeated observed sequences in collapsed ' - f'tree. {rep_seq} sequences were found repeated.') + "Repeated observed sequences in collapsed " + f"tree. {rep_seq} sequences were found repeated." + ) elif allow_repeats and rep_seq: - rep_seq = (sum(node.frequency > 0 - for node in self.tree.traverse()) - - len(set([node.sequence - for node in self.tree.traverse() - if node.frequency > 0]))) - print('Repeated observed sequences in collapsed tree. ' - f'{rep_seq} sequences were found repeated.') + rep_seq = sum( + node.frequency > 0 for node in self.tree.traverse() + ) - len( + set( + [ + node.sequence + for node in self.tree.traverse() + if node.frequency > 0 + ] + ) + ) + print( + "Repeated observed sequences in collapsed tree. " + f"{rep_seq} sequences were found repeated." + ) # a custom ladderize accounting for abundance and sequence to break # ties in abundance - for node in self.tree.traverse(strategy='postorder'): + for node in self.tree.traverse(strategy="postorder"): # add a partition feature and compute it recursively up tree node.add_feature( - 'partition', - node.frequency + sum(node2.partition - for node2 in node.children)) + "partition", + node.frequency + sum(node2.partition for node2 in node.children), + ) # sort children of this node based on partion and sequence - node.children.sort( - key=lambda node: (node.partition, node.sequence)) + node.children.sort(key=lambda node: (node.partition, node.sequence)) else: self.tree = tree @@ -294,59 +330,69 @@ def ll(self, params, sign=1, build_cache=True): latter useful for MLE by minimization """ if self.tree is None: - raise ValueError('tree data must be defined to compute likelihood') + raise ValueError("tree data must be defined to compute likelihood") if sign not in (-1, 1): - raise ValueError('sign must be 1 or -1') + raise ValueError("sign must be 1 or -1") if build_cache: c_max = max(node.frequency for node in self.tree.traverse()) m_max = max(len(node.children) for node in self.tree.traverse()) LeavesAndClades.build_logf_cache(c_max, m_max, *params) leaves_and_clades_list = [ - LeavesAndClades( - c=node.frequency, m=len(node.children)) - for node in self.tree.traverse()] - if leaves_and_clades_list[0].c == 0 and \ - leaves_and_clades_list[0].m == 1 and \ - leaves_and_clades_list[0].logf(leaves_and_clades_list[0].c, - leaves_and_clades_list[0].m, - *params)[0] == -np.inf: + LeavesAndClades(c=node.frequency, m=len(node.children)) + for node in self.tree.traverse() + ] + if ( + leaves_and_clades_list[0].c == 0 + and leaves_and_clades_list[0].m == 1 + and leaves_and_clades_list[0].logf( + leaves_and_clades_list[0].c, leaves_and_clades_list[0].m, *params + )[0] + == -np.inf + ): # if unifurcation not possible under current model, add a # psuedocount for the naive leaves_and_clades_list[0].c = 1 # extract vector of function values and gradient components logf_data = [ - leaves_and_clades.logf( - leaves_and_clades.c, - leaves_and_clades.m, - *params) - for leaves_and_clades in leaves_and_clades_list] + leaves_and_clades.logf(leaves_and_clades.c, leaves_and_clades.m, *params) + for leaves_and_clades in leaves_and_clades_list + ] logf = np.array([[x[0]] for x in logf_data]).sum() grad_logf = np.array([x[1] for x in logf_data]).sum(axis=0) - return sign*logf, sign*grad_logf + return sign * logf, sign * grad_logf def mle(self, **kwargs): - ''' + """ Maximum likelihood estimate for params given tree updates params if not None returns optimization result - ''' + """ # random initalization x_0 = (random.random(), random.random()) bounds = ((1e-6, 1 - 1e-6), (1e-6, 1 - 1e-6)) - kwargs['sign'] = -1 - grad_check = check_grad(lambda x: self.ll(x, **kwargs)[0], - lambda x: self.ll(x, **kwargs)[1], - x_0) + kwargs["sign"] = -1 + grad_check = check_grad( + lambda x: self.ll(x, **kwargs)[0], lambda x: self.ll(x, **kwargs)[1], x_0 + ) if grad_check > 1e-3: - warnings.warn('gradient mismatches finite difference ' - f'approximation by {grad_check}', RuntimeWarning) - result = minimize(lambda x: self.ll(x, **kwargs), jac=True, x0=x_0, - method='L-BFGS-B', options={'ftol': 1e-10}, - bounds=bounds) + warnings.warn( + "gradient mismatches finite difference " + f"approximation by {grad_check}", + RuntimeWarning, + ) + result = minimize( + lambda x: self.ll(x, **kwargs), + jac=True, + x0=x_0, + method="L-BFGS-B", + options={"ftol": 1e-10}, + bounds=bounds, + ) # update params if None and optimization successful if not result.success: - warnings.warn('optimization not sucessful, ' + result.message, - RuntimeWarning) + warnings.warn( + "optimization not sucessful, " + result.message, RuntimeWarning + ) elif self.params is None: self.params = result.x.tolist() return result @@ -357,19 +403,18 @@ def simulate(self): self """ if self.params is None: - raise ValueError('params must be defined for simulation') + raise ValueError("params must be defined for simulation") # initiate by running a LeavesAndClades simulation to get the number of # clones and mutants in the root node of the collapsed tree LeavesAndClades.simulate(self) self.tree = ete3.TreeNode() - self.tree.add_feature('frequency', self.c) + self.tree.add_feature("frequency", self.c) if self.m == 0: return self for _ in range(self.m): # ooooh, recursion - child = CollapsedTree( - params=self.params, frame=self.frame).simulate().tree + child = CollapsedTree(params=self.params, frame=self.frame).simulate().tree child.dist = 1 self.tree.add_child(child) @@ -377,101 +422,133 @@ def simulate(self): def __str__(self): """return a string representation for printing""" - return 'params = ' + str(self.params) + '\ntree:\n' + str(self.tree) - - def render(self, outfile, idlabel=False, colormap=None, show_support=False, - chain_split=None): + return "params = " + str(self.params) + "\ntree:\n" + str(self.tree) + + def render( + self, + outfile, + idlabel=False, + colormap=None, + show_support=False, + chain_split=None, + ): """render to image file, filetype inferred from suffix, svg for color images """ + def my_layout(node): if colormap is None or node.name not in colormap: - circle_color = 'lightgray' + circle_color = "lightgray" else: circle_color = colormap[node.name] - text_color = 'black' + text_color = "black" if isinstance(circle_color, str): C = ete3.CircleFace( - radius=max(3, 10*np.sqrt(node.frequency)), - color=circle_color, - label={'text': str(node.frequency), - 'color': text_color} - if node.frequency > 0 else None) + radius=max(3, 10 * np.sqrt(node.frequency)), + color=circle_color, + label={"text": str(node.frequency), "color": text_color} + if node.frequency > 0 + else None, + ) C.rotation = -90 C.hz_align = 1 ete3.faces.add_face_to_node(C, node, 0) else: P = ete3.PieChartFace( - [100 * x / node.frequency - for x in circle_color.values()], - 2 * 10 * np.sqrt(node.frequency), - 2 * 10 * np.sqrt(node.frequency), - colors=[(color if color != 'None' else 'lightgray') - for color in list(circle_color.keys())], - line_color=None) + [100 * x / node.frequency for x in circle_color.values()], + 2 * 10 * np.sqrt(node.frequency), + 2 * 10 * np.sqrt(node.frequency), + colors=[ + (color if color != "None" else "lightgray") + for color in list(circle_color.keys()) + ], + line_color=None, + ) T = ete3.TextFace( - ' '.join([str(x) for x in list(circle_color.values())]), - tight_text=True) + " ".join([str(x) for x in list(circle_color.values())]), + tight_text=True, + ) T.hz_align = 1 T.rotation = -90 - ete3.faces.add_face_to_node(P, node, 0, - position='branch-right') - ete3.faces.add_face_to_node(T, node, 1, - position='branch-right') + ete3.faces.add_face_to_node(P, node, 0, position="branch-right") + ete3.faces.add_face_to_node(T, node, 1, position="branch-right") if idlabel: T = ete3.TextFace(node.name, tight_text=True, fsize=6) T.rotation = -90 T.hz_align = 1 ete3.faces.add_face_to_node( - T, node, + T, + node, 1 if isinstance(circle_color, str) else 2, - position='branch-right') + position="branch-right", + ) + for node in self.tree.traverse(): nstyle = ete3.NodeStyle() - nstyle['size'] = 0 + nstyle["size"] = 0 if node.up is not None: - if set(node.sequence.upper()) == set('ACGT'): + if set(node.sequence.upper()) == set("ACGT"): if chain_split is not None: if self.frame is not None: raise NotImplementedError( - 'frame not implemented with chain_split') - leftseq_mutated = hamming_distance( - node.sequence[:chain_split], - node.up.sequence[:chain_split]) > 0 - rightseq_mutated = hamming_distance( - node.sequence[chain_split:], - node.up.sequence[chain_split:]) > 0 + "frame not implemented with chain_split" + ) + leftseq_mutated = ( + hamming_distance( + node.sequence[:chain_split], + node.up.sequence[:chain_split], + ) + > 0 + ) + rightseq_mutated = ( + hamming_distance( + node.sequence[chain_split:], + node.up.sequence[chain_split:], + ) + > 0 + ) if leftseq_mutated and rightseq_mutated: - nstyle['hz_line_color'] = 'purple' - nstyle['hz_line_width'] = 3 + nstyle["hz_line_color"] = "purple" + nstyle["hz_line_width"] = 3 elif leftseq_mutated: - nstyle['hz_line_color'] = 'red' - nstyle['hz_line_width'] = 2 + nstyle["hz_line_color"] = "red" + nstyle["hz_line_width"] = 2 elif rightseq_mutated: - nstyle['hz_line_color'] = 'blue' - nstyle['hz_line_width'] = 2 + nstyle["hz_line_color"] = "blue" + nstyle["hz_line_width"] = 2 if self.frame is not None: - aa = Seq(node.sequence[ - (self.frame-1): - (self.frame - 1 - + (3 * ((len(node.sequence) - - (self.frame - 1)) // 3)))] - ).translate() - aa_parent = Seq(node.up.sequence[ - (self.frame - 1): - (self.frame - 1 - + (3 * ((len(node.sequence) - - (self.frame - 1)) - // 3)))] - ).translate() + aa = Seq( + node.sequence[ + (self.frame - 1) : ( + self.frame + - 1 + + ( + 3 + * ((len(node.sequence) - (self.frame - 1)) // 3) + ) + ) + ] + ).translate() + aa_parent = Seq( + node.up.sequence[ + (self.frame - 1) : ( + self.frame + - 1 + + ( + 3 + * ((len(node.sequence) - (self.frame - 1)) // 3) + ) + ) + ] + ).translate() nonsyn = hamming_distance(aa, aa_parent) - if '*' in aa: - nstyle['bgcolor'] = 'red' + if "*" in aa: + nstyle["bgcolor"] = "red" if nonsyn > 0: - nstyle['hz_line_color'] = 'black' - nstyle['hz_line_width'] = nonsyn + nstyle["hz_line_color"] = "black" + nstyle["hz_line_width"] = nonsyn else: - nstyle['hz_line_type'] = 1 + nstyle["hz_line_type"] = 1 node.set_style(nstyle) ts = ete3.TreeStyle() @@ -488,87 +565,105 @@ def my_layout(node): if idlabel: aln = MultipleSeqAlignment([]) for node in self.tree.traverse(): - aln.append(SeqRecord( - Seq(str(node.sequence)), id=str(node.name), - description=f'abundance={node.frequency}')) - AlignIO.write(aln, - open(os.path.splitext(outfile)[0] + '.fasta', 'w'), - 'fasta') + aln.append( + SeqRecord( + Seq(str(node.sequence)), + id=str(node.name), + description=f"abundance={node.frequency}", + ) + ) + AlignIO.write( + aln, open(os.path.splitext(outfile)[0] + ".fasta", "w"), "fasta" + ) def write(self, file_name): - '''serialize tree to file''' - with open(file_name, 'wb') as f: + """serialize tree to file""" + with open(file_name, "wb") as f: pickle.dump(self, f) def newick(self, file_name): - '''write to newick file''' + """write to newick file""" self.tree.write(format=1, outfile=file_name) - def compare(self, tree2, method='identity'): - '''compare this tree to the other tree''' - if method == 'identity': + def compare(self, tree2, method="identity"): + """compare this tree to the other tree""" + if method == "identity": # we compare lists of seq, parent, abundance # return true if these lists are identical, else false - list1 = sorted((node.sequence, node.frequency, - node.up.sequence if node.up is not None else None) - for node in self.tree.traverse()) - list2 = sorted((node.sequence, node.frequency, - node.up.sequence if node.up is not None else None) - for node in tree2.tree.traverse()) + list1 = sorted( + ( + node.sequence, + node.frequency, + node.up.sequence if node.up is not None else None, + ) + for node in self.tree.traverse() + ) + list2 = sorted( + ( + node.sequence, + node.frequency, + node.up.sequence if node.up is not None else None, + ) + for node in tree2.tree.traverse() + ) return list1 == list2 - elif method == 'MRCA': + elif method == "MRCA": # matrix of hamming distance of common ancestors of taxa # takes a true and inferred tree as CollapsedTree objects - taxa = [node.sequence for node in self.tree.traverse() - if node.frequency] + taxa = [node.sequence for node in self.tree.traverse() if node.frequency] n_taxa = len(taxa) d = np.zeros(shape=(n_taxa, n_taxa)) sum_sites = np.zeros(shape=(n_taxa, n_taxa)) for i in range(n_taxa): - nodei_true = self.tree.iter_search_nodes( - sequence=taxa[i]).__next__() - nodei = tree2.tree.iter_search_nodes( - sequence=taxa[i]).__next__() + nodei_true = self.tree.iter_search_nodes(sequence=taxa[i]).__next__() + nodei = tree2.tree.iter_search_nodes(sequence=taxa[i]).__next__() for j in range(i + 1, n_taxa): nodej_true = self.tree.iter_search_nodes( - sequence=taxa[j]).__next__() - nodej = tree2.tree.iter_search_nodes( - sequence=taxa[j]).__next__() + sequence=taxa[j] + ).__next__() + nodej = tree2.tree.iter_search_nodes(sequence=taxa[j]).__next__() MRCA_true = self.tree.get_common_ancestor( - (nodei_true, nodej_true)).sequence - MRCA = tree2.tree.get_common_ancestor( - (nodei, nodej)).sequence + (nodei_true, nodej_true) + ).sequence + MRCA = tree2.tree.get_common_ancestor((nodei, nodej)).sequence d[i, j] = hamming_distance(MRCA_true, MRCA) sum_sites[i, j] = len(MRCA_true) return d.sum() / sum_sites.sum() - elif method == 'RF': - tree1_copy = self.tree.copy(method='deepcopy') - tree2_copy = tree2.tree.copy(method='deepcopy') + elif method == "RF": + tree1_copy = self.tree.copy(method="deepcopy") + tree2_copy = tree2.tree.copy(method="deepcopy") for treex in (tree1_copy, tree2_copy): for node in list(treex.traverse()): if node.frequency > 0: child = ete3.TreeNode() - child.add_feature('sequence', node.sequence) + child.add_feature("sequence", node.sequence) node.add_child(child) try: return tree1_copy.robinson_foulds( - tree2_copy, attr_t1='sequence', attr_t2='sequence', - unrooted_trees=True)[0] + tree2_copy, + attr_t1="sequence", + attr_t2="sequence", + unrooted_trees=True, + )[0] except: return tree1_copy.robinson_foulds( - tree2_copy, attr_t1='sequence', attr_t2='sequence', - unrooted_trees=True, allow_dup=True)[0] + tree2_copy, + attr_t1="sequence", + attr_t2="sequence", + unrooted_trees=True, + allow_dup=True, + )[0] else: - raise ValueError('invalid distance method: ' + method) + raise ValueError("invalid distance method: " + method) def get_split(self, node): """return the bipartition resulting from clipping this node's edge above """ if node.get_tree_root() != self.tree: - raise ValueError('node not found') + raise ValueError("node not found") if node == self.tree: - raise ValueError('this node is the root (no split above)') + raise ValueError("this node is the root (no split above)") parent = node.up taxa1 = [] for node2 in node.traverse(): @@ -589,22 +684,23 @@ def get_split(self, node): taxa2 = set(taxa2) parent.add_child(node) assert taxa1.isdisjoint(taxa2) - assert taxa1.union(taxa2) == set((name - for node in self.tree.traverse() - if node.frequency > 0 - or node == self.tree - for name in ((node.name,) - if isinstance(node.name, - str) - else node.name))) + assert taxa1.union(taxa2) == set( + ( + name + for node in self.tree.traverse() + if node.frequency > 0 or node == self.tree + for name in ((node.name,) if isinstance(node.name, str) else node.name) + ) + ) return tuple(sorted([taxa1, taxa2])) @staticmethod def split_compatibility(split1, split2): diff = split1[0].union(split1[1]) ^ split2[0].union(split2[1]) if diff: - raise ValueError('splits do not cover the same taxa\n' - f'\ttaxa not in both: {diff}') + raise ValueError( + "splits do not cover the same taxa\n" f"\ttaxa not in both: {diff}" + ) for partition1 in split1: for partition2 in split2: if partition1.isdisjoint(partition2): @@ -612,11 +708,11 @@ def split_compatibility(split1, split2): return False def support(self, bootstrap_trees_list, weights=None, compatibility=False): - ''' + """ compute support from a list of bootstrap GCtrees weights (optional) is needed for weighting parsimony degenerate trees compatibility mode counts trees that don't disconfirm the split - ''' + """ for node in self.tree.get_descendants(): split = self.get_split(node) support = 0 @@ -626,13 +722,13 @@ def support(self, bootstrap_trees_list, weights=None, compatibility=False): supported = False for boot_node in tree.tree.get_descendants(): boot_split = tree.get_split(boot_node) - if (compatibility - and compatible - and not self.split_compatibility(split, - boot_split)): + if ( + compatibility + and compatible + and not self.split_compatibility(split, boot_split) + ): compatible = False - if (not compatibility and not supported - and boot_split == split): + if not compatibility and not supported and boot_split == split: supported = True if supported: support += weights[i] if weights is not None else 1 @@ -659,17 +755,16 @@ def __init__(self, params=None, n_trees=None, forest=None): """ CollapsedTree.__init__(self, params=params) if forest is None and params is None: - raise ValueError('either params or forest (or both) must be ' - 'provided') + raise ValueError("either params or forest (or both) must be " "provided") if forest is not None: if len(forest) == 0: - raise ValueError('passed empty tree list') + raise ValueError("passed empty tree list") if n_trees is not None and len(forest) != n_trees: - raise ValueError('n_trees not consistent with forest') + raise ValueError("n_trees not consistent with forest") self.forest = forest if n_trees is not None: if type(n_trees) is not int or n_trees < 1: - raise ValueError('number of trees must be at least one') + raise ValueError("number of trees must be at least one") self.n_trees = n_trees if n_trees is None and forest is not None: self.n_trees = len(forest) @@ -681,9 +776,11 @@ def simulate(self): """ if self.params is None or self.n_trees is None: raise ValueError( - 'params and n_trees parameters must be defined for simulation') - self.forest = [CollapsedTree(self.params).simulate() - for x in range(self.n_trees)] + "params and n_trees parameters must be defined for simulation" + ) + self.forest = [ + CollapsedTree(self.params).simulate() for x in range(self.n_trees) + ] return self def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): @@ -693,17 +790,18 @@ def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): we're estimating params for a set of parsimony trees """ if self.forest is None: - raise ValueError( - 'forest data must be defined to compute likelihood') + raise ValueError("forest data must be defined to compute likelihood") if sign not in (-1, 1): - raise ValueError('sign must be 1 or -1') + raise ValueError("sign must be 1 or -1") if build_cache: - c_max = max(node.frequency - for tree in self.forest - for node in tree.tree.traverse()) - m_max = max(len(node.children) - for tree in self.forest - for node in tree.tree.traverse()) + c_max = max( + node.frequency for tree in self.forest for node in tree.tree.traverse() + ) + m_max = max( + len(node.children) + for tree in self.forest + for node in tree.tree.traverse() + ) LeavesAndClades.build_logf_cache(c_max, m_max, *params) # we don't want to build the cache again in each tree terms = [tree.ll(params, build_cache=False) for tree in self.forest] @@ -715,19 +813,23 @@ def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): grad_l = [] for j in range(len(params)): i_prime = grad_ls[:, j].argmin() - grad_l.append(grad_ls[i_prime, j] - + np.exp(logsumexp( - ls - ls[i_prime], - b=grad_ls[:, j] - grad_ls[i_prime, j]) - - logsumexp(ls - ls[i_prime]))) - return sign*(-np.log(len(ls)) - + logsumexp(ls)), sign*np.array(grad_l) + grad_l.append( + grad_ls[i_prime, j] + + np.exp( + logsumexp( + ls - ls[i_prime], b=grad_ls[:, j] - grad_ls[i_prime, j] + ) + - logsumexp(ls - ls[i_prime]) + ) + ) + return sign * (-np.log(len(ls)) + logsumexp(ls)), sign * np.array(grad_l) else: - return sign*ls.sum(), sign*grad_ls.sum(axis=0) + return sign * ls.sum(), sign * grad_ls.sum(axis=0) # NOTE: we get mle() method for free by inheritance/polymorphism magic def __str__(self): - '''return a string representation for printing''' - return (f'params = {self.params}, n_trees = {self.n_trees}\n' - '\n'.join([str(tree) for tree in self.forest])) + """return a string representation for printing""" + return f"params = {self.params}, n_trees = {self.n_trees}\n" "\n".join( + [str(tree) for tree in self.forest] + ) diff --git a/gctree/cli.py b/gctree/cli.py index 0555793b..8d44a1b1 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -26,84 +26,126 @@ def test(args): """ import seaborn as sns - sns.set(style='white', color_codes=True) - sns.set_style('ticks') + + sns.set(style="white", color_codes=True) + sns.set_style("ticks") # compare likelihood to empirical likelihood (might need large n) n = 10000 - df = pd.DataFrame(columns=('p', 'q', 'parameters', 'f', 'L')) + df = pd.DataFrame(columns=("p", "q", "parameters", "f", "L")) ct = 0 - ps = (.1, .2, .3, .4) - qs = (.2, .4, .6, .8) - np.seterr(all='ignore') + ps = (0.1, 0.2, 0.3, 0.4) + qs = (0.2, 0.4, 0.6, 0.8) + np.seterr(all="ignore") for p in ps: for q in qs: forest = bp.CollapsedForest((p, q), n) - print(f'parameters: p = {p}, q = {q}') + print(f"parameters: p = {p}, q = {q}") forest.simulate() tree_dict = {} for tree in forest.forest: - tree_hash = tuple((node.frequency, len(node.children)) - for node in tree.tree.traverse()) + tree_hash = tuple( + (node.frequency, len(node.children)) + for node in tree.tree.traverse() + ) if tree_hash not in tree_dict: tree_dict[tree_hash] = [tree, tree.ll((p, q))[0], 1] else: tree_dict[tree_hash][-1] += 1 L_empirical, L_theoretical = zip( - *[(tree_dict[tree_hash][2], - np.exp(tree_dict[tree_hash][1])) - for tree_hash in tree_dict - if tree_dict[tree_hash][2]]) + *[ + (tree_dict[tree_hash][2], np.exp(tree_dict[tree_hash][1])) + for tree_hash in tree_dict + if tree_dict[tree_hash][2] + ] + ) for tree_hash in tree_dict: - df.loc[ct] = (p, q, f'p={p}, q={q}', tree_dict[tree_hash][2], - np.exp(tree_dict[tree_hash][1])) + df.loc[ct] = ( + p, + q, + f"p={p}, q={q}", + tree_dict[tree_hash][2], + np.exp(tree_dict[tree_hash][1]), + ) ct += 1 print() plt.figure() - limx = (1/n, 1.1) - limy = (1, 1.1*n) - g = sns.lmplot(x='L', y='f', col='p', row='q', hue='parameters', data=df, - fit_reg=False, scatter_kws={'alpha': .3}, height=1.5, - legend=False, row_order=reversed(qs)) - g.set(xscale='log', yscale='log', xlim=limx, ylim=limy) + limx = (1 / n, 1.1) + limy = (1, 1.1 * n) + g = sns.lmplot( + x="L", + y="f", + col="p", + row="q", + hue="parameters", + data=df, + fit_reg=False, + scatter_kws={"alpha": 0.3}, + height=1.5, + legend=False, + row_order=reversed(qs), + ) + g.set(xscale="log", yscale="log", xlim=limx, ylim=limy) for i in range(len(ps)): for j in range(len(qs)): - g.axes[i, j].plot(limx, limy, ls='--', c='black', lw=.5, zorder=0, - markeredgewidth=.1) - g.axes[i, j].set_title(f'p={ps[j]}\nq={list(reversed(qs))[i]}', - x=.05, y=.7, size='x-small', ha='left') - g.set_axis_labels('', '') - g.fig.text(0.45, .02, s='GCtree likelihood', multialignment='center') - g.fig.text(.02, 0.7, s=f'frequency among {n} simulations', rotation=90, - multialignment='center') - plt.savefig(args.outbase+'.pdf') + g.axes[i, j].plot( + limx, limy, ls="--", c="black", lw=0.5, zorder=0, markeredgewidth=0.1 + ) + g.axes[i, j].set_title( + f"p={ps[j]}\nq={list(reversed(qs))[i]}", + x=0.05, + y=0.7, + size="x-small", + ha="left", + ) + g.set_axis_labels("", "") + g.fig.text(0.45, 0.02, s="GCtree likelihood", multialignment="center") + g.fig.text( + 0.02, + 0.7, + s=f"frequency among {n} simulations", + rotation=90, + multialignment="center", + ) + plt.savefig(args.outbase + ".pdf") # MLE check n = 20 n2 = 500 - df = pd.DataFrame(columns=('true parameters', '$\\hat{p}$', '$\\hat{q}$')) + df = pd.DataFrame(columns=("true parameters", "$\\hat{p}$", "$\\hat{q}$")) ct = 0 for p in ps: for q in qs: for _ in range(n): forest = bp.CollapsedForest((p, q), n2) - print(f'parameters: p = {p}, q = {q}') + print(f"parameters: p = {p}, q = {q}") forest.simulate() result = forest.mle() - df.loc[ct] = (f'p={p}, q={q}', result.x[0], result.x[1]) + df.loc[ct] = (f"p={p}, q={q}", result.x[0], result.x[1]) ct += 1 plt.figure() - g = sns.lmplot(x='$\\hat{p}$', y='$\\hat{q}$', hue='true parameters', - data=df, fit_reg=False, scatter_kws={'alpha': .2}, height=6, - legend=False) - g.set(xlim=(0.05, .45), xticks=np.arange(0., .6, .1), ylim=(.1, .9), - yticks=np.arange(0., 1.2, .2)) + g = sns.lmplot( + x="$\\hat{p}$", + y="$\\hat{q}$", + hue="true parameters", + data=df, + fit_reg=False, + scatter_kws={"alpha": 0.2}, + height=6, + legend=False, + ) + g.set( + xlim=(0.05, 0.45), + xticks=np.arange(0.0, 0.6, 0.1), + ylim=(0.1, 0.9), + yticks=np.arange(0.0, 1.2, 0.2), + ) for i in range(len(ps)): for j in range(len(qs)): - plt.scatter([ps[i]], [qs[j]], c='black', marker='+') - plt.savefig(args.outbase+'.2.pdf') + plt.scatter([ps[i]], [qs[j]], c="black", marker="+") + plt.savefig(args.outbase + ".2.pdf") return @@ -112,47 +154,55 @@ def infer(args): """inference subprogram""" outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.naive)] if args.bootstrap_phylipfile is not None: - outfiles.extend(pp.parse_outfile(args.bootstrap_phylipfile, - args.countfile, args.naive)) + outfiles.extend( + pp.parse_outfile(args.bootstrap_phylipfile, args.countfile, args.naive) + ) bootstrap = len(outfiles) > 1 if bootstrap: # store bootstrap parameter data - df = pd.DataFrame(columns=('$\\hat{p}$', '$\\hat{q}$')) + df = pd.DataFrame(columns=("$\\hat{p}$", "$\\hat{q}$")) # we'll store the mle gctrees here for computing support later gctrees = [] for i, content in enumerate(outfiles): if i > 0: - print(f'bootstrap sample {i}') - print('----------------------') - outbase = args.outbase + f'.bootstrap_{i}' + print(f"bootstrap sample {i}") + print("----------------------") + outbase = args.outbase + f".bootstrap_{i}" else: outbase = args.outbase - phylip_collapsed = [bp.CollapsedTree(tree=tree, frame=args.frame, - allow_repeats=(i > 0)) - for tree in content] + phylip_collapsed = [ + bp.CollapsedTree(tree=tree, frame=args.frame, allow_repeats=(i > 0)) + for tree in content + ] phylip_collapsed_unique = [] for tree in phylip_collapsed: - if sum(tree.compare(tree2, method='identity') - for tree2 in phylip_collapsed_unique) == 0: + if ( + sum( + tree.compare(tree2, method="identity") + for tree2 in phylip_collapsed_unique + ) + == 0 + ): phylip_collapsed_unique.append(tree) - parsimony_forest = bp.CollapsedForest( - forest=phylip_collapsed_unique) + parsimony_forest = bp.CollapsedForest(forest=phylip_collapsed_unique) if parsimony_forest.n_trees == 1: - warnings.warn('only one parsimony tree reported from dnapars') + warnings.warn("only one parsimony tree reported from dnapars") - print('number of trees with integer branch lengths:', - parsimony_forest.n_trees) + print("number of trees with integer branch lengths:", parsimony_forest.n_trees) # check for unifurcations at root - unifurcations = sum(tree.tree.frequency == 0 - and len(tree.tree.children) == 1 - for tree in parsimony_forest.forest) + unifurcations = sum( + tree.tree.frequency == 0 and len(tree.tree.children) == 1 + for tree in parsimony_forest.forest + ) if unifurcations: - print(f'{unifurcations} trees exhibit unobserved unifurcation from' - ' root. Adding psuedocounts to these roots') + print( + f"{unifurcations} trees exhibit unobserved unifurcation from" + " root. Adding psuedocounts to these roots" + ) # fit p and q using all trees # if we get floating point errors, try a few more times @@ -164,114 +214,134 @@ def infer(args): break except FloatingPointError as e: if tries + 1 < max_tries: - print(f'floating point error in MLE: {e}. ' - f'Attempt {tries + 1} of {max_tries}. ' - 'Rerunning with new random start.') + print( + f"floating point error in MLE: {e}. " + f"Attempt {tries + 1} of {max_tries}. " + "Rerunning with new random start." + ) else: raise else: raise - print(f'params = {parsimony_forest.params}') + print(f"params = {parsimony_forest.params}") if i > 0: - df.loc[i-1] = parsimony_forest.params + df.loc[i - 1] = parsimony_forest.params # get likelihoods and sort by them - ls = [tree.ll(parsimony_forest.params, build_cache=False)[0] - for tree in parsimony_forest.forest] + ls = [ + tree.ll(parsimony_forest.params, build_cache=False)[0] + for tree in parsimony_forest.forest + ] ls, parsimony_forest.forest = zip( - *sorted(zip(ls, parsimony_forest.forest), key=lambda x: x[0], - reverse=True)) + *sorted(zip(ls, parsimony_forest.forest), key=lambda x: x[0], reverse=True) + ) if bootstrap: gctrees.append(parsimony_forest.forest[0]) - with open(outbase+'.inference.parsimony_forest.p', 'wb') as f: + with open(outbase + ".inference.parsimony_forest.p", "wb") as f: pickle.dump(parsimony_forest, f) if args.colormapfile is not None: - with open(args.colormapfile, 'r') as f: + with open(args.colormapfile, "r") as f: colormap = {} for line in f: - seqid, color = line.rstrip().split('\t') - if ',' in color: - colors = {x.split(':')[0]: int(x.split(':')[1]) - for x in color.split(',')} + seqid, color = line.rstrip().split("\t") + if "," in color: + colors = { + x.split(":")[0]: int(x.split(":")[1]) + for x in color.split(",") + } colormap[seqid] = colors else: colormap[seqid] = color else: colormap = None - print('tree\talleles\tlogLikelihood') - for j, (l, collapsed_tree) in enumerate( - zip(ls, parsimony_forest.forest), 1): + print("tree\talleles\tlogLikelihood") + for j, (l, collapsed_tree) in enumerate(zip(ls, parsimony_forest.forest), 1): alleles = sum(1 for _ in collapsed_tree.tree.traverse()) - print(f'{j}\t{alleles}\t{l}') - collapsed_tree.render(f'{outbase}.inference.{j}.svg', - idlabel=args.idlabel, - colormap=colormap, - chain_split=args.chain_split) - collapsed_tree.newick(f'{outbase}.inference.{j}.nk') + print(f"{j}\t{alleles}\t{l}") + collapsed_tree.render( + f"{outbase}.inference.{j}.svg", + idlabel=args.idlabel, + colormap=colormap, + chain_split=args.chain_split, + ) + collapsed_tree.newick(f"{outbase}.inference.{j}.nk") # rank plot of likelihoods plt.figure(figsize=(6.5, 2)) try: - plt.plot(np.exp(ls), 'ko', clip_on=False, markersize=4) - plt.ylabel('GCtree likelihood') - plt.yscale('log') - plt.ylim([None, 1.1*max(np.exp(ls))]) + plt.plot(np.exp(ls), "ko", clip_on=False, markersize=4) + plt.ylabel("GCtree likelihood") + plt.yscale("log") + plt.ylim([None, 1.1 * max(np.exp(ls))]) except FloatingPointError: - plt.plot(ls, 'ko', clip_on=False, markersize=4) - plt.ylabel('GCtree log-likelihood') - plt.ylim([None, 1.1*max(ls)]) - plt.xlabel('parsimony tree') + plt.plot(ls, "ko", clip_on=False, markersize=4) + plt.ylabel("GCtree log-likelihood") + plt.ylim([None, 1.1 * max(ls)]) + plt.xlabel("parsimony tree") plt.xlim([-1, len(ls)]) - plt.tick_params(axis='y', direction='out', which='both') + plt.tick_params(axis="y", direction="out", which="both") plt.tick_params( - axis='x', - which='both', - bottom='off', - top='off', - labelbottom='off') - plt.savefig(outbase + '.inference.likelihood_rank.pdf') + axis="x", which="both", bottom="off", top="off", labelbottom="off" + ) + plt.savefig(outbase + ".inference.likelihood_rank.pdf") # rank plot of observed allele frequencies - y = sorted((node.frequency - for node in parsimony_forest.forest[0].tree.traverse() - if node.frequency != 0), - reverse=True) + y = sorted( + ( + node.frequency + for node in parsimony_forest.forest[0].tree.traverse() + if node.frequency != 0 + ), + reverse=True, + ) plt.figure() - plt.bar(range(1, len(y) + 1), y, color='black') - plt.xlabel('genotype') - plt.ylabel('abundance') - plt.savefig(outbase + '.inference.abundance_rank.pdf') + plt.bar(range(1, len(y) + 1), y, color="black") + plt.xlabel("genotype") + plt.ylabel("abundance") + plt.savefig(outbase + ".inference.abundance_rank.pdf") if bootstrap: import seaborn as sns + sns.set(style="white", color_codes=True) sns.set_style("ticks") plt.figure() - np.seterr(all='ignore') - sns.jointplot('$\\hat{p}$', '$\\hat{q}$', data=df, - joint_kws={'alpha': .1, 's': .1}, - space=0, color='k', stat_func=None, xlim=(0, 1), - ylim=(0, 1), height=3) - plt.savefig(args.outbase+'.inference.bootstrap_theta.pdf') + np.seterr(all="ignore") + sns.jointplot( + "$\\hat{p}$", + "$\\hat{q}$", + data=df, + joint_kws={"alpha": 0.1, "s": 0.1}, + space=0, + color="k", + stat_func=None, + xlim=(0, 1), + ylim=(0, 1), + height=3, + ) + plt.savefig(args.outbase + ".inference.bootstrap_theta.pdf") gctrees[0].support(gctrees[1:]) - gctrees[0].render(args.outbase+'.inference.bootstrap_support.svg', - colormap=colormap, - idlabel=args.idlabel, - chain_split=args.chain_split, - show_support=True) + gctrees[0].render( + args.outbase + ".inference.bootstrap_support.svg", + colormap=colormap, + idlabel=args.idlabel, + chain_split=args.chain_split, + show_support=True, + ) gctrees[0].support(gctrees[1:], compatibility=True) - gctrees[0].render(args.outbase - + '.inference.bootstrap_compatibility.svg', - colormap=colormap, - idlabel=args.idlabel, - chain_split=args.chain_split, - show_support=True) + gctrees[0].render( + args.outbase + ".inference.bootstrap_compatibility.svg", + colormap=colormap, + idlabel=args.idlabel, + chain_split=args.chain_split, + show_support=True, + ) def simulate(args): @@ -288,57 +358,78 @@ def simulate(args): random.seed(a=args.seed) mutation_model = mm.MutationModel(args.mutability, args.substitution) if args.lambda0 is None: - args.lambda0 = [max([1, int(.01*len(args.sequence))])] + args.lambda0 = [max([1, int(0.01 * len(args.sequence))])] args.sequence = args.sequence.upper() if args.sequence2 is not None: # Use the same mutation rate on both sequences if len(args.lambda0) == 1: args.lambda0 = [args.lambda0[0], args.lambda0[0]] elif len(args.lambda0) != 2: - raise Exception('Only one or two lambda0 can be defined for a two ' - 'sequence simulation.') + raise Exception( + "Only one or two lambda0 can be defined for a two " + "sequence simulation." + ) # Require both sequences to be in frame 1: if args.frame is not None and args.frame != 1: - print('Warning: When simulating with two sequences they are ' - 'truncated to be beginning at frame 1.') + print( + "Warning: When simulating with two sequences they are " + "truncated to be beginning at frame 1." + ) args.sequence = args.sequence[ - (args.frame - 1): - (args.frame - 1 + (3 * (((len(args.sequence) - - (args.frame - 1)) // 3))))] + (args.frame - 1) : ( + args.frame + - 1 + + (3 * (((len(args.sequence) - (args.frame - 1)) // 3))) + ) + ] args.sequence2 = args.sequence2[ - (args.frame - 1): - (args.frame - 1 + (3 * (((len(args.sequence2) - - (args.frame - 1)) // 3))))] + (args.frame - 1) : ( + args.frame + - 1 + + (3 * (((len(args.sequence2) - (args.frame - 1)) // 3))) + ) + ] # Extract the bounds between sequence 1 and 2: - seq_bounds = ((0, len(args.sequence)), - (len(args.sequence), - len(args.sequence) + len(args.sequence2))) + seq_bounds = ( + (0, len(args.sequence)), + (len(args.sequence), len(args.sequence) + len(args.sequence2)), + ) # Merge the two seqeunces to simplify future dealing with the pair: args.sequence += args.sequence2.upper() else: seq_bounds = None if args.selection: if args.frame is None: - raise Exception('Frame must be defined when simulating with ' - 'selection.') + raise Exception("Frame must be defined when simulating with " "selection.") # the fully activating fraction on BA must be possible to reach within # B_total - assert(args.B_total >= args.f_full) + assert args.B_total >= args.f_full # Make a list of target sequences: - targetAAseqs = [mutation_model.one_mutant(args.sequence, - args.target_dist, - frame=args.frame) - for i in range(args.target_count)] + targetAAseqs = [ + mutation_model.one_mutant(args.sequence, args.target_dist, frame=args.frame) + for i in range(args.target_count) + ] # Find the total amount of A necessary for sustaining the inputted # carrying capacity: print((args.carry_cap, args.B_total, args.f_full, args.mature_affy)) - A_total = su.find_A_total(args.carry_cap, args.B_total, args.f_full, - args.mature_affy, args.U) + A_total = su.find_A_total( + args.carry_cap, args.B_total, args.f_full, args.mature_affy, args.U + ) # Calculate the parameters for the logistic function: Lp = su.find_Lp(args.f_full, args.U) - selection_params = [args.stop_dist, args.mature_affy, args.naive_affy, - args.target_dist, args.skip_update, targetAAseqs, - A_total, args.B_total, Lp, args.k, args.outbase] + selection_params = [ + args.stop_dist, + args.mature_affy, + args.naive_affy, + args.target_dist, + args.skip_update, + targetAAseqs, + A_total, + args.B_total, + Lp, + args.k, + args.outbase, + ] else: selection_params = None @@ -346,80 +437,91 @@ def simulate(args): # this loop makes us resimulate if size too small, or backmutation for trial in range(trials): try: - tree = mutation_model.simulate(args.sequence, - seq_bounds=seq_bounds, - progeny=scipy.stats.poisson( - args.lambda_), - lambda0=args.lambda0, - n=args.n, - N=args.N, - T=args.T, - frame=args.frame, - verbose=args.verbose, - selection_params=selection_params) + tree = mutation_model.simulate( + args.sequence, + seq_bounds=seq_bounds, + progeny=scipy.stats.poisson(args.lambda_), + lambda0=args.lambda0, + n=args.n, + N=args.N, + T=args.T, + frame=args.frame, + verbose=args.verbose, + selection_params=selection_params, + ) if args.selection: - collapsed_tree = bp.CollapsedTree(tree=tree, - frame=args.frame, - collapse_syn=False, - allow_repeats=True) + collapsed_tree = bp.CollapsedTree( + tree=tree, frame=args.frame, collapse_syn=False, allow_repeats=True + ) else: # this will fail if backmutations collapsed_tree = bp.CollapsedTree(tree=tree, frame=args.frame) tree.ladderize() - uniques = sum(node.frequency > 0 - for node in collapsed_tree.tree.traverse()) + uniques = sum(node.frequency > 0 for node in collapsed_tree.tree.traverse()) if uniques < 2: - raise RuntimeError(f'collapsed tree contains {uniques} ' - 'sampled sequences') + raise RuntimeError( + f"collapsed tree contains {uniques} " "sampled sequences" + ) break except RuntimeError as e: - print(f'{e}, trying again') + print(f"{e}, trying again") else: raise if trial == trials - 1: - raise RuntimeError(f'{trials} attempts exceeded') + raise RuntimeError(f"{trials} attempts exceeded") # In the case of a sequence pair print them to separate files: if args.sequence2 is not None: - fh1 = open(args.outbase+'.simulation_seq1.fasta', 'w') - fh2 = open(args.outbase+'.simulation_seq2.fasta', 'w') - fh1.write('>naive\n') - fh1.write(args.sequence[seq_bounds[0][0]:seq_bounds[0][1]]+'\n') - fh2.write('>naive\n') - fh2.write(args.sequence[seq_bounds[1][0]:seq_bounds[1][1]]+'\n') + fh1 = open(args.outbase + ".simulation_seq1.fasta", "w") + fh2 = open(args.outbase + ".simulation_seq2.fasta", "w") + fh1.write(">naive\n") + fh1.write(args.sequence[seq_bounds[0][0] : seq_bounds[0][1]] + "\n") + fh2.write(">naive\n") + fh2.write(args.sequence[seq_bounds[1][0] : seq_bounds[1][1]] + "\n") for leaf in tree.iter_leaves(): if leaf.frequency != 0: - fh1.write('>' + leaf.name + '\n') - fh1.write(leaf.sequence[seq_bounds[0][0]:seq_bounds[0][1]] - + '\n') - fh2.write('>' + leaf.name + '\n') - fh2.write(leaf.sequence[seq_bounds[1][0]:seq_bounds[1][1]] - + '\n') + fh1.write(">" + leaf.name + "\n") + fh1.write(leaf.sequence[seq_bounds[0][0] : seq_bounds[0][1]] + "\n") + fh2.write(">" + leaf.name + "\n") + fh2.write(leaf.sequence[seq_bounds[1][0] : seq_bounds[1][1]] + "\n") else: - with open(args.outbase+'.simulation.fasta', 'w') as f: - f.write('>naive\n') - f.write(args.sequence+'\n') + with open(args.outbase + ".simulation.fasta", "w") as f: + f.write(">naive\n") + f.write(args.sequence + "\n") for leaf in tree.iter_leaves(): if leaf.frequency != 0: - f.write('>' + leaf.name + '\n') - f.write(leaf.sequence + '\n') + f.write(">" + leaf.name + "\n") + f.write(leaf.sequence + "\n") # some observable simulation stats to write frequency, distance_from_naive, degree = zip( - *[(node.frequency, - utils.hamming_distance(node.sequence, args.sequence), - sum(utils.hamming_distance(node.sequence, node2.sequence) == 1 - for node2 in collapsed_tree.tree.traverse() - if node2.frequency and node2 is not node)) - for node in collapsed_tree.tree.traverse() if node.frequency]) - stats = pd.DataFrame({ - 'genotype abundance': frequency, - 'Hamming distance to root genotype': distance_from_naive, - 'Hamming neighbor genotypes': degree}) - stats.to_csv(args.outbase+'.simulation.stats.tsv', sep='\t', index=False) - - print(f'{sum(leaf.frequency for leaf in collapsed_tree.tree.traverse())}' - ' simulated observed sequences') + *[ + ( + node.frequency, + utils.hamming_distance(node.sequence, args.sequence), + sum( + utils.hamming_distance(node.sequence, node2.sequence) == 1 + for node2 in collapsed_tree.tree.traverse() + if node2.frequency and node2 is not node + ), + ) + for node in collapsed_tree.tree.traverse() + if node.frequency + ] + ) + stats = pd.DataFrame( + { + "genotype abundance": frequency, + "Hamming distance to root genotype": distance_from_naive, + "Hamming neighbor genotypes": degree, + } + ) + stats.to_csv(args.outbase + ".simulation.stats.tsv", sep="\t", index=False) + + print( + f"{sum(leaf.frequency for leaf in collapsed_tree.tree.traverse())}" + " simulated observed sequences" + ) # render the full lineage tree ts = ete3.TreeStyle() @@ -429,14 +531,14 @@ def simulate(args): colors = {} palette = ete3.SVG_COLORS - palette -= set(['black', 'white', 'gray']) + palette -= set(["black", "white", "gray"]) palette = itertools.cycle(list(palette)) # <-- circular iterator # Either plot by DNA sequence or amino acid sequence: if args.plotAA and args.selection: - colors[tree.AAseq] = 'gray' + colors[tree.AAseq] = "gray" else: - colors[tree.sequence] = 'gray' + colors[tree.sequence] = "gray" for n in tree.traverse(): nstyle = ete3.NodeStyle() @@ -444,214 +546,320 @@ def simulate(args): if args.plotAA: if n.AAseq not in colors: colors[n.AAseq] = next(palette) - nstyle['fgcolor'] = colors[n.AAseq] + nstyle["fgcolor"] = colors[n.AAseq] else: if n.sequence not in colors: colors[n.sequence] = next(palette) - nstyle['fgcolor'] = colors[n.sequence] + nstyle["fgcolor"] = colors[n.sequence] n.set_style(nstyle) # this makes the rendered branch lenths correspond to time for node in tree.iter_descendants(): node.dist = node.time - node.up.time - tree.render(args.outbase+'.simulation.lineage_tree.svg', tree_style=ts) + tree.render(args.outbase + ".simulation.lineage_tree.svg", tree_style=ts) # render collapsed tree # create an id-wise colormap # NOTE: node.name can be a set if args.plotAA and args.selection: - colormap = {node.name: colors[node.AAseq] - for node in collapsed_tree.tree.traverse()} + colormap = { + node.name: colors[node.AAseq] for node in collapsed_tree.tree.traverse() + } else: - colormap = {node.name: colors[node.sequence] - for node in collapsed_tree.tree.traverse()} - collapsed_tree.write(args.outbase+'.simulation.collapsed_tree.p') - collapsed_tree.render(args.outbase+'.simulation.collapsed_tree.svg', - idlabel=args.idlabel, - colormap=colormap) + colormap = { + node.name: colors[node.sequence] for node in collapsed_tree.tree.traverse() + } + collapsed_tree.write(args.outbase + ".simulation.collapsed_tree.p") + collapsed_tree.render( + args.outbase + ".simulation.collapsed_tree.svg", + idlabel=args.idlabel, + colormap=colormap, + ) # print colormap to file - with open(args.outbase + '.simulation.collapsed_tree.colormap.tsv', - 'w') as f: + with open(args.outbase + ".simulation.collapsed_tree.colormap.tsv", "w") as f: for name, color in colormap.items(): - f.write((name if isinstance(name, str) else ','.join(name)) - + '\t' + color + '\n') + f.write( + (name if isinstance(name, str) else ",".join(name)) + + "\t" + + color + + "\n" + ) if args.selection: # Define a list a suitable colors that are easy to distinguish: - palette = ['crimson', 'purple', 'hotpink', 'limegreen', 'darkorange', - 'darkkhaki', 'brown', 'lightsalmon', 'darkgreen', - 'darkseagreen', 'darkslateblue', 'teal', 'olive', 'wheat', - 'magenta', 'lightsteelblue', 'plum', 'gold'] + palette = [ + "crimson", + "purple", + "hotpink", + "limegreen", + "darkorange", + "darkkhaki", + "brown", + "lightsalmon", + "darkgreen", + "darkseagreen", + "darkslateblue", + "teal", + "olive", + "wheat", + "magenta", + "lightsteelblue", + "plum", + "gold", + ] # circular iterator palette = itertools.cycle(list(palette)) - colors = {i: next(palette) - for i in range(int(len(args.sequence) // 3))} + colors = {i: next(palette) for i in range(int(len(args.sequence) // 3))} # The minimum distance to the target is colored: - colormap = {node.name: colors[node.target_dist] - for node in collapsed_tree.tree.traverse()} - collapsed_tree.write(args.outbase - + '.simulation.collapsed_runstat_color_tree.p') - collapsed_tree.render(args.outbase - + '.simulation.collapsed_runstat_color_tree.svg', - idlabel=args.idlabel, - colormap=colormap) + colormap = { + node.name: colors[node.target_dist] + for node in collapsed_tree.tree.traverse() + } + collapsed_tree.write( + args.outbase + ".simulation.collapsed_runstat_color_tree.p" + ) + collapsed_tree.render( + args.outbase + ".simulation.collapsed_runstat_color_tree.svg", + idlabel=args.idlabel, + colormap=colormap, + ) # Write a file with the selection run stats. These are also plotted: - with open(args.outbase + 'selection_sim.runstats.p', 'rb') as fh: + with open(args.outbase + "selection_sim.runstats.p", "rb") as fh: runstats = pickle.load(fh) su.plot_runstats(runstats, args.outbase, colors) def get_parser(): parser = argparse.ArgumentParser( - description='germinal center tree inference and simulation') + description="germinal center tree inference and simulation" + ) subparsers = parser.add_subparsers( - title='subcommands', - description='specify one of these', - required=True, - help='additional help available for each subcommand') + title="subcommands", + description="specify one of these", + required=True, + help="additional help available for each subcommand", + ) # parser for test subprogram parser_test = subparsers.add_parser( - 'test', - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='run tests on library functions') + "test", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help="run tests on library functions", + ) parser_test.set_defaults(func=test) # parser for inference subprogram parser_infer = subparsers.add_parser( - 'infer', - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='likelihood ranking of parsimony trees') - parser_infer.add_argument('--naive', type=str, default=None, - help='name of naive sequence (outgroup root)') + "infer", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help="likelihood ranking of parsimony trees", + ) + parser_infer.add_argument( + "--naive", type=str, default=None, help="name of naive sequence (outgroup root)" + ) parser_infer.add_argument( - 'phylipfile', type=str, - help='dnapars outfile (verbose output with sequences at each site)') + "phylipfile", + type=str, + help="dnapars outfile (verbose output with sequences at each site)", + ) parser_infer.add_argument( - 'countfile', type=str, - help='File containing allele frequencies (sequence counts) in the ' - 'format: "SeqID,Nobs"') + "countfile", + type=str, + help="File containing allele frequencies (sequence counts) in the " + 'format: "SeqID,Nobs"', + ) parser_infer.add_argument( - '--bootstrap_phylipfile', type=str, - help='dnapars outfile from seqboot (multiple data sets)') + "--bootstrap_phylipfile", + type=str, + help="dnapars outfile from seqboot (multiple data sets)", + ) parser_infer.add_argument( - '--colormapfile', type=str, default=None, - help='File containing color map in the format: "SeqID\tcolor"') + "--colormapfile", + type=str, + default=None, + help='File containing color map in the format: "SeqID\tcolor"', + ) parser_infer.add_argument( - '--chain_split', type=int, default=None, - help='split between heavy and light for combined seqs') + "--chain_split", + type=int, + default=None, + help="split between heavy and light for combined seqs", + ) parser_infer.set_defaults(func=infer) # parser for simulation subprogram parser_sim = subparsers.add_parser( - 'simulate', formatter_class=argparse.ArgumentDefaultsHelpFormatter, - help='Neutral, and target selective, model gctree simulation') + "simulate", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + help="Neutral, and target selective, model gctree simulation", + ) + parser_sim.add_argument("sequence", type=str, help="seed naive nucleotide sequence") parser_sim.add_argument( - 'sequence', type=str, help='seed naive nucleotide sequence') + "mutability", type=str, help="path to mutability model file" + ) parser_sim.add_argument( - 'mutability', type=str, help='path to mutability model file') + "substitution", type=str, help="path to substitution model file" + ) parser_sim.add_argument( - 'substitution', type=str, help='path to substitution model file') + "--sequence2", + type=str, + default=None, + help="Second seed naive nucleotide sequence. " + "For simulating heavy/light chain co-evolution.", + ) parser_sim.add_argument( - '--sequence2', type=str, default=None, - help='Second seed naive nucleotide sequence. ' - 'For simulating heavy/light chain co-evolution.') + "--lambda", + dest="lambda_", + type=float, + default=0.9, + help="poisson branching parameter", + ) parser_sim.add_argument( - '--lambda', dest='lambda_', type=float, default=.9, - help='poisson branching parameter') + "--lambda0", + type=float, + default=None, + nargs="*", + help="List of one or two elements with the baseline mutation rates. " + "Space separated input values. First element belonging to seed " + "sequence one and optionally the next to sequence 2. If only one " + "rate is provided for two sequences, this rate will be used on " + "both.", + ) + parser_sim.add_argument("--n", type=int, default=None, help="cells downsampled") parser_sim.add_argument( - '--lambda0', type=float, default=None, nargs='*', - help='List of one or two elements with the baseline mutation rates. ' - 'Space separated input values. First element belonging to seed ' - 'sequence one and optionally the next to sequence 2. If only one ' - 'rate is provided for two sequences, this rate will be used on ' - 'both.') + "--N", type=int, default=None, help="target simulation size" + ) parser_sim.add_argument( - '--n', type=int, default=None, help='cells downsampled') + "--T", + type=int, + nargs="+", + default=None, + help="observation time, if None we run until termination and take all" + " leaves", + ) parser_sim.add_argument( - '--N', type=int, default=None, help='target simulation size') + "--seed", type=int, default=None, help="integer random seed" + ) parser_sim.add_argument( - '--T', type=int, nargs='+', default=None, - help='observation time, if None we run until termination and take all' - ' leaves') + "--selection", + type=bool, + default=False, + help="Simulation with selection? true/false. When doing simulation " + "with selection an observation time cut must be set.", + ) parser_sim.add_argument( - '--seed', type=int, default=None, help='integer random seed') + "--stop_dist", + type=int, + default=None, + help="Stop when this distance has been reached in the selection " "model.", + ) parser_sim.add_argument( - '--selection', type=bool, default=False, - help='Simulation with selection? true/false. When doing simulation ' - 'with selection an observation time cut must be set.') + "--carry_cap", + type=int, + default=1000, + help="The carrying capacity of the simulation with selection. This " + "number affects the fixation time of a new mutation. Fixation " + "time is approx. log2(carry_cap), e.g. log2(1000) ~= 10.", + ) parser_sim.add_argument( - '--stop_dist', type=int, default=None, - help='Stop when this distance has been reached in the selection ' - 'model.') + "--target_count", + type=int, + default=10, + help="The number of targets to generate.", + ) parser_sim.add_argument( - '--carry_cap', type=int, default=1000, - help='The carrying capacity of the simulation with selection. This ' - 'number affects the fixation time of a new mutation. Fixation ' - 'time is approx. log2(carry_cap), e.g. log2(1000) ~= 10.') + "--target_dist", + type=int, + default=10, + help="The number of non-synonymous mutations the target should be " + "away from the naive.", + ) parser_sim.add_argument( - '--target_count', type=int, default=10, - help='The number of targets to generate.') + "--naive_affy", + type=float, + default=100, + help="Affinity of the naive sequence in nano molar.", + ) parser_sim.add_argument( - '--target_dist', type=int, default=10, - help='The number of non-synonymous mutations the target should be ' - 'away from the naive.') + "--mature_affy", + type=float, + default=1, + help="Affinity of the mature sequences in nano molar.", + ) parser_sim.add_argument( - '--naive_affy', type=float, default=100, - help='Affinity of the naive sequence in nano molar.') + "--skip_update", + type=int, + default=100, + help="When iterating through the leafs the B:A fraction is " + "recalculated every time. It is possible though to update less " + "often and get the same approximate results. This parameter sets " + "the number of iterations to skip, before updating the B:A " + "results. skip_update < carry_cap/10 recommended.", + ) parser_sim.add_argument( - '--mature_affy', type=float, default=1, - help='Affinity of the mature sequences in nano molar.') + "--B_total", + type=float, + default=1, + help="Total number of BCRs per B cell normalized to 10e4. So 1 equals " + "10e4, 100 equals 10e6 etc. It is recommended to keep this as " + "the default.", + ) parser_sim.add_argument( - '--skip_update', type=int, default=100, - help='When iterating through the leafs the B:A fraction is ' - 'recalculated every time. It is possible though to update less ' - 'often and get the same approximate results. This parameter sets ' - 'the number of iterations to skip, before updating the B:A ' - 'results. skip_update < carry_cap/10 recommended.') + "--U", + type=float, + default=5, + help="Controls the fraction of BCRs binding antigen necessary to " + "only sustain the life of the B cell It is recommended to keep " + "this as the default.", + ) parser_sim.add_argument( - '--B_total', type=float, default=1, - help='Total number of BCRs per B cell normalized to 10e4. So 1 equals ' - '10e4, 100 equals 10e6 etc. It is recommended to keep this as ' - 'the default.') + "--f_full", + type=float, + default=1, + help="The fraction of antigen bound BCRs on a B cell that is needed " + "to elicit close to maximum reponse. Cannot be smaller than " + "B_total. It is recommended to keep this as the default.", + ) parser_sim.add_argument( - '--U', type=float, default=5, - help='Controls the fraction of BCRs binding antigen necessary to ' - 'only sustain the life of the B cell It is recommended to keep ' - 'this as the default.') + "--k", + type=float, + default=2, + help="The exponent in the function to map hamming distance to " + "affinity. It is recommended to keep this as the default.", + ) parser_sim.add_argument( - '--f_full', type=float, default=1, - help='The fraction of antigen bound BCRs on a B cell that is needed ' - 'to elicit close to maximum reponse. Cannot be smaller than ' - 'B_total. It is recommended to keep this as the default.') + "--plotAA", + type=bool, + default=False, + help="Plot trees with collapsing and coloring on amino acid level.", + ) parser_sim.add_argument( - '--k', type=float, default=2, - help='The exponent in the function to map hamming distance to ' - 'affinity. It is recommended to keep this as the default.') - parser_sim.add_argument( - '--plotAA', type=bool, default=False, - help='Plot trees with collapsing and coloring on amino acid level.') - parser_sim.add_argument( - '--verbose', type=bool, default=False, - help='Print progress during simulation. Mostly useful for simulation ' - 'with selection since this can take a while.') + "--verbose", + type=bool, + default=False, + help="Print progress during simulation. Mostly useful for simulation " + "with selection since this can take a while.", + ) parser_sim.set_defaults(func=simulate) # a common outbase parameter for subparser in [parser_test, parser_infer, parser_sim]: subparser.add_argument( - '--outbase', type=str, default='gctree.out', - help='output file base name') + "--outbase", type=str, default="gctree.out", help="output file base name" + ) # common parameters for the inference and simulation subprograms for subparser in [parser_infer, parser_sim]: - subparser.add_argument('--frame', type=int, default=None, - choices=(1, 2, 3), help='codon frame') subparser.add_argument( - '--idlabel', action='store_true', - help='flag for labeling the sequence ids of the nodes in the ' - 'output tree images, also write associated fasta alignment ' - 'if True') + "--frame", type=int, default=None, choices=(1, 2, 3), help="codon frame" + ) + subparser.add_argument( + "--idlabel", + action="store_true", + help="flag for labeling the sequence ids of the nodes in the " + "output tree images, also write associated fasta alignment " + "if True", + ) return parser diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index 7b72a5c5..bd7cade4 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -10,9 +10,17 @@ import scipy from Bio.Seq import Seq -class MutationModel(): - '''a class for a mutation model, and functions to mutate sequences''' - def __init__(self, mutability_file=None, substitution_file=None, mutation_order=True, with_replacement=True): + +class MutationModel: + """a class for a mutation model, and functions to mutate sequences""" + + def __init__( + self, + mutability_file=None, + substitution_file=None, + mutation_order=True, + with_replacement=True, + ): """ initialized with input files of the S5F format @param mutation_order: whether or not to mutate sequences using a context sensitive manner @@ -23,74 +31,98 @@ def __init__(self, mutability_file=None, substitution_file=None, mutation_order= self.with_replacement = with_replacement if mutability_file is not None and substitution_file is not None: self.context_model = {} - with open(mutability_file, 'r') as f: + with open(mutability_file, "r") as f: # eat header f.readline() for line in f: - motif, score = line.replace('"', '').split()[:2] + motif, score = line.replace('"', "").split()[:2] self.context_model[motif] = float(score) # kmer k self.k = None - with open(substitution_file, 'r') as f: + with open(substitution_file, "r") as f: # eat header f.readline() for line in f: - fields = line.replace('"', '').split() + fields = line.replace('"', "").split() motif = fields[0] if self.k is None: self.k = len(motif) assert self.k % 2 == 1 else: assert len(motif) == self.k - self.context_model[motif] = (self.context_model[motif], {b:float(x) for b, x in zip('ACGT', fields[1:5])}) + self.context_model[motif] = ( + self.context_model[motif], + {b: float(x) for b, x in zip("ACGT", fields[1:5])}, + ) else: self.context_model = None @staticmethod def disambiguate(sequence): - '''generator of all possible nt sequences implied by a sequence containing Ns''' + """generator of all possible nt sequences implied by a sequence containing Ns""" # find the first N nucleotide - N_index = sequence.find('N') + N_index = sequence.find("N") # if there is no N nucleotide, yield the input sequence if N_index == -1: yield sequence else: - for n_replace in 'ACGT': + for n_replace in "ACGT": # ooooh, recursion # NOTE: in python3 we could simply use "yield from..." instead of this loop - for sequence_recurse in MutationModel.disambiguate(sequence[:N_index] + n_replace + sequence[N_index+1:]): + for sequence_recurse in MutationModel.disambiguate( + sequence[:N_index] + n_replace + sequence[N_index + 1 :] + ): yield sequence_recurse - def mutability(self, kmer): - ''' + """ returns the mutability of a central base of kmer, along with nucleotide bias averages over N nucleotide identities - ''' + """ if self.context_model is None: - raise ValueError('kmer mutability only defined for context models') + raise ValueError("kmer mutability only defined for context models") if len(kmer) != self.k: - raise ValueError('kmer of length {} inconsistent with context model kmer length {}'.format(len(kmer), self.k)) - if not all(n in 'ACGTN' for n in kmer): - raise ValueError('sequence {} must contain only characters A, C, G, T, or N'.format(kmer)) + raise ValueError( + "kmer of length {} inconsistent with context model kmer length {}".format( + len(kmer), self.k + ) + ) + if not all(n in "ACGTN" for n in kmer): + raise ValueError( + "sequence {} must contain only characters A, C, G, T, or N".format(kmer) + ) - mutabilities_to_average, substitutions_to_average = zip(*[self.context_model[x] for x in MutationModel.disambiguate(kmer)]) + mutabilities_to_average, substitutions_to_average = zip( + *[self.context_model[x] for x in MutationModel.disambiguate(kmer)] + ) average_mutability = scipy.mean(mutabilities_to_average) - average_substitution = {b:sum(substitution_dict[b] for substitution_dict in substitutions_to_average)/len(substitutions_to_average) for b in 'ACGT'} + average_substitution = { + b: sum( + substitution_dict[b] for substitution_dict in substitutions_to_average + ) + / len(substitutions_to_average) + for b in "ACGT" + } return average_mutability, average_substitution def mutabilities(self, sequence): - '''returns the mutability of a sequence at each site, along with nucleotide biases''' + """returns the mutability of a sequence at each site, along with nucleotide biases""" if self.context_model is None: - return [(1, dict((n2, 1/3) if n2 is not n else (n2, 0.) for n2 in 'ACGT')) for n in sequence] + return [ + (1, dict((n2, 1 / 3) if n2 is not n else (n2, 0.0) for n2 in "ACGT")) + for n in sequence + ] else: # pad with Ns to allow averaged edge effects - sequence = 'N'*(self.k//2) + sequence + 'N'*(self.k//2) + sequence = "N" * (self.k // 2) + sequence + "N" * (self.k // 2) # mutabilities of each nucleotide - return [self.mutability(sequence[(i-self.k//2):(i+self.k//2+1)]) for i in range(self.k//2, len(sequence) - self.k//2)] + return [ + self.mutability(sequence[(i - self.k // 2) : (i + self.k // 2 + 1)]) + for i in range(self.k // 2, len(sequence) - self.k // 2) + ] def mutate(self, sequence, lambda0=1, frame=None): """ @@ -102,41 +134,50 @@ def mutate(self, sequence, lambda0=1, frame=None): """ sequence_length = len(sequence) if frame is not None: - codon_start = frame-1 - codon_end = codon_start + 3*((sequence_length - codon_start)//3) - if '*' in Seq(sequence[codon_start:codon_end]).translate(): - raise RuntimeError('sequence contains stop codon!') + codon_start = frame - 1 + codon_end = codon_start + 3 * ((sequence_length - codon_start) // 3) + if "*" in Seq(sequence[codon_start:codon_end]).translate(): + raise RuntimeError("sequence contains stop codon!") mutabilities = self.mutabilities(sequence) - sequence_mutability = sum(mutability[0] for mutability in mutabilities)/sequence_length + sequence_mutability = ( + sum(mutability[0] for mutability in mutabilities) / sequence_length + ) # poisson rate for this sequence (given its relative mutability) - lambda_sequence = sequence_mutability*lambda0 + lambda_sequence = sequence_mutability * lambda0 # number of mutations m trials = 20 - for trial in range(1, trials+1): + for trial in range(1, trials + 1): m = scipy.random.poisson(lambda_sequence) if m <= sequence_length or self.with_replacement: break if trial == trials: - raise RuntimeError('mutations saturating, consider reducing lambda0') + raise RuntimeError("mutations saturating, consider reducing lambda0") # mutate the sites with mutations # if frame is not None and sequence contains stop codon, try again, up to 10 times unmutated_positions = range(sequence_length) for i in range(m): - sequence_list = list(sequence) # make string a list so we can modify it + sequence_list = list(sequence) # make string a list so we can modify it # Determine the position to mutate from the mutability matrix - mutability_p = scipy.array([mutabilities[pos][0] for pos in unmutated_positions]) - for trial in range(1, trials+1): - mut_pos = scipy.random.choice(unmutated_positions, p=mutability_p/mutability_p.sum()) + mutability_p = scipy.array( + [mutabilities[pos][0] for pos in unmutated_positions] + ) + for trial in range(1, trials + 1): + mut_pos = scipy.random.choice( + unmutated_positions, p=mutability_p / mutability_p.sum() + ) # Now draw the target nucleotide using the substitution matrix - substitution_p = [mutabilities[mut_pos][1][n] for n in 'ACGT'] - assert 0 <= abs(sum(substitution_p) - 1.) < 1e-10 + substitution_p = [mutabilities[mut_pos][1][n] for n in "ACGT"] + assert 0 <= abs(sum(substitution_p) - 1.0) < 1e-10 chosen_target = scipy.random.choice(4, p=substitution_p) original_base = sequence_list[mut_pos] - sequence_list[mut_pos] = 'ACGT'[chosen_target] - sequence = ''.join(sequence_list) # reconstruct our sequence - if frame is None or '*' not in Seq(sequence[codon_start:codon_end]).translate(): + sequence_list[mut_pos] = "ACGT"[chosen_target] + sequence = "".join(sequence_list) # reconstruct our sequence + if ( + frame is None + or "*" not in Seq(sequence[codon_start:codon_end]).translate() + ): if self.mutation_order: # if mutation order matters, the mutabilities of the sequence need to be updated mutabilities = self.mutabilities(sequence) @@ -145,82 +186,174 @@ def mutate(self, sequence, lambda0=1, frame=None): unmutated_positions.remove(mut_pos) break if trial == trials: - raise RuntimeError('stop codon in simulated sequence on '+str(trials)+' consecutive attempts') - sequence_list[mut_pos] = original_base # <-- we only get here if we are retrying + raise RuntimeError( + "stop codon in simulated sequence on " + + str(trials) + + " consecutive attempts" + ) + sequence_list[ + mut_pos + ] = original_base # <-- we only get here if we are retrying return sequence def one_mutant(self, sequence, Nmuts, frame=1, lambda0=0.1): - ''' + """ Make a single mutant with a distance, in amino acid sequence, of Nmuts away from the starting point. - ''' + """ trial = 100 # Allow 100 trials before quitting while trial > 0: mut_seq = sequence[:] - aa = str(Seq(sequence[(frame-1):(frame-1+(3*(((len(sequence)-(frame-1))//3))))]).translate()) - aa_mut = Seq(mut_seq[(frame-1):(frame-1+(3*(((len(mut_seq)-(frame-1))//3))))]).translate() + aa = str( + Seq( + sequence[ + (frame - 1) : ( + frame - 1 + (3 * (((len(sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + ) + aa_mut = Seq( + mut_seq[ + (frame - 1) : ( + frame - 1 + (3 * (((len(mut_seq) - (frame - 1)) // 3))) + ) + ] + ).translate() dist = hamming_distance(aa, aa_mut) while dist < Nmuts: mut_seq = self.mutate(mut_seq, lambda0=lambda0, frame=frame) - aa_mut = str(Seq(mut_seq[(frame-1):(frame-1+(3*(((len(mut_seq)-(frame-1))//3))))]).translate()) + aa_mut = str( + Seq( + mut_seq[ + (frame - 1) : ( + frame - 1 + (3 * (((len(mut_seq) - (frame - 1)) // 3))) + ) + ] + ).translate() + ) dist = hamming_distance(aa, aa_mut) if dist == Nmuts: return aa_mut else: trial -= 1 - raise RuntimeError('100 consecutive attempts for creating a target sequence failed.') + raise RuntimeError( + "100 consecutive attempts for creating a target sequence failed." + ) - def simulate(self, sequence, seq_bounds=None, progeny=poisson(.9), lambda0=[1], frame=None, - N=None, T=None, n=None, verbose=False, selection_params=None): - ''' + def simulate( + self, + sequence, + seq_bounds=None, + progeny=poisson(0.9), + lambda0=[1], + frame=None, + N=None, + T=None, + n=None, + verbose=False, + selection_params=None, + ): + """ simulate neutral binary branching process with mutation model progeny must be like a scipy.stats distribution, with rvs() and mean() methods - ''' + """ stop_dist = None # Default stopping criterium for affinity simulation # Checking the validity of the input parameters: if N is not None and T is not None: - raise ValueError('Only one of N and T can be used. One must be None.') + raise ValueError("Only one of N and T can be used. One must be None.") if selection_params is not None and T is None: - raise ValueError('Simulation with selection was chosen. A time, T, must be specified.') + raise ValueError( + "Simulation with selection was chosen. A time, T, must be specified." + ) elif N is None and T is None: - raise ValueError('Either N or T must be specified.') + raise ValueError("Either N or T must be specified.") if N is not None and n is not None and n > N: - raise ValueError('n ({}) must not larger than N ({})'.format(n, N)) + raise ValueError("n ({}) must not larger than N ({})".format(n, N)) if selection_params is not None and frame is None: - raise ValueError('Simulation with selection was chosen. A frame must must be specified.') + raise ValueError( + "Simulation with selection was chosen. A frame must must be specified." + ) # Planting the tree: tree = TreeNode() tree.dist = 0 - tree.add_feature('sequence', sequence) - tree.add_feature('terminated', False) - tree.add_feature('frequency', 0) - tree.add_feature('time', 0) + tree.add_feature("sequence", sequence) + tree.add_feature("terminated", False) + tree.add_feature("frequency", 0) + tree.add_feature("time", 0) if selection_params is not None: - hd_generation = list() # Collect an array of the counts of each hamming distance at each time step - stop_dist, mature_affy, naive_affy, target_dist, skip_update, targetAAseqs, A_total, B_total, Lp, k, outbase = selection_params + hd_generation = ( + list() + ) # Collect an array of the counts of each hamming distance at each time step + ( + stop_dist, + mature_affy, + naive_affy, + target_dist, + skip_update, + targetAAseqs, + A_total, + B_total, + Lp, + k, + outbase, + ) = selection_params # Assert that the target sequences are comparable to the naive sequence: - aa = Seq(tree.sequence[(frame-1):(frame-1+(3*(((len(tree.sequence)-(frame-1))//3))))]).translate() - assert(sum([1 for t in targetAAseqs if len(t) != len(aa)]) == 0) # All targets are same length - assert(sum([1 for t in targetAAseqs if hamming_distance(aa, t) == target_dist])) # All target are "target_dist" away from the naive sequence + aa = Seq( + tree.sequence[ + (frame - 1) : ( + frame - 1 + (3 * (((len(tree.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + assert ( + sum([1 for t in targetAAseqs if len(t) != len(aa)]) == 0 + ) # All targets are same length + assert sum( + [1 for t in targetAAseqs if hamming_distance(aa, t) == target_dist] + ) # All target are "target_dist" away from the naive sequence # Affinity is an exponential function of hamming distance: if target_dist > 0: - def hd2affy(hd): return(mature_affy + hd**k * (naive_affy - mature_affy) / target_dist**k) + + def hd2affy(hd): + return ( + mature_affy + + hd ** k * (naive_affy - mature_affy) / target_dist ** k + ) + else: - def hd2affy(hd): return(mature_affy) + + def hd2affy(hd): + return mature_affy + # We store both the amino acid sequence and the affinity as tree features: - tree.add_feature('AAseq', str(aa)) - tree.add_feature('Kd', selection_utils.calc_Kd(tree.AAseq, targetAAseqs, hd2affy)) - tree.add_feature('target_dist', min([hamming_distance(tree.AAseq, taa) for taa in targetAAseqs])) + tree.add_feature("AAseq", str(aa)) + tree.add_feature( + "Kd", selection_utils.calc_Kd(tree.AAseq, targetAAseqs, hd2affy) + ) + tree.add_feature( + "target_dist", + min([hamming_distance(tree.AAseq, taa) for taa in targetAAseqs]), + ) t = 0 # <-- time leaves_unterminated = 1 # Small lambdas are causing problems so make a minimum: lambda_min = 10e-10 - while leaves_unterminated > 0 and (leaves_unterminated < N if N is not None else True) and (t < max(T) if T is not None else True) and (stop_dist >= min(hd_distrib) if stop_dist is not None and t > 0 else True): + while ( + leaves_unterminated > 0 + and (leaves_unterminated < N if N is not None else True) + and (t < max(T) if T is not None else True) + and ( + stop_dist >= min(hd_distrib) + if stop_dist is not None and t > 0 + else True + ) + ): if verbose: - print('At time:', t) + print("At time:", t) skip_lambda_n = 0 # At every new round reset the all the lambdas t += 1 list_of_leaves = list(tree.iter_leaves()) @@ -229,8 +362,12 @@ def hd2affy(hd): return(mature_affy) if not leaf.terminated: if selection_params is not None: if skip_lambda_n == 0: - skip_lambda_n = skip_update + 1 # Add one so skip_update=0 is no skip - tree = selection_utils.lambda_selection(leaf, tree, targetAAseqs, hd2affy, A_total, B_total, Lp) + skip_lambda_n = ( + skip_update + 1 + ) # Add one so skip_update=0 is no skip + tree = selection_utils.lambda_selection( + leaf, tree, targetAAseqs, hd2affy, A_total, B_total, Lp + ) # Small lambdas are causing problems so make a minimum: lambda_min = 10e-10 if leaf.lambda_ > lambda_min: @@ -239,63 +376,130 @@ def hd2affy(hd): return(mature_affy) progeny = poisson(lambda_min) skip_lambda_n -= 1 n_children = progeny.rvs() - leaves_unterminated += n_children - 1 # <-- this kills the parent if we drew a zero + leaves_unterminated += ( + n_children - 1 + ) # <-- this kills the parent if we drew a zero if not n_children: leaf.terminated = True for child_count in range(n_children): # If sequence pair mutate them separately with their own mutation rate: if seq_bounds is not None: - mutated_sequence1 = self.mutate(leaf.sequence[seq_bounds[0][0]:seq_bounds[0][1]], lambda0=lambda0[0], frame=frame) - mutated_sequence2 = self.mutate(leaf.sequence[seq_bounds[1][0]:seq_bounds[1][1]], lambda0=lambda0[1], frame=frame) + mutated_sequence1 = self.mutate( + leaf.sequence[seq_bounds[0][0] : seq_bounds[0][1]], + lambda0=lambda0[0], + frame=frame, + ) + mutated_sequence2 = self.mutate( + leaf.sequence[seq_bounds[1][0] : seq_bounds[1][1]], + lambda0=lambda0[1], + frame=frame, + ) mutated_sequence = mutated_sequence1 + mutated_sequence2 else: - mutated_sequence = self.mutate(leaf.sequence, lambda0=lambda0[0], frame=frame) + mutated_sequence = self.mutate( + leaf.sequence, lambda0=lambda0[0], frame=frame + ) child = TreeNode() - child.dist = sum(x!=y for x,y in zip(mutated_sequence, leaf.sequence)) - child.add_feature('sequence', mutated_sequence) + child.dist = sum( + x != y for x, y in zip(mutated_sequence, leaf.sequence) + ) + child.add_feature("sequence", mutated_sequence) if selection_params is not None: - aa = Seq(child.sequence[(frame-1):(frame-1+(3*(((len(child.sequence)-(frame-1))//3))))]).translate() - child.add_feature('AAseq', str(aa)) - child.add_feature('Kd', selection_utils.calc_Kd(child.AAseq, targetAAseqs, hd2affy)) - child.add_feature('target_dist', min([hamming_distance(child.AAseq, taa) for taa in targetAAseqs])) - child.add_feature('frequency', 0) - child.add_feature('terminated' ,False) - child.add_feature('time', t) + aa = Seq( + child.sequence[ + (frame - 1) : ( + frame + - 1 + + ( + 3 + * ( + ( + (len(child.sequence) - (frame - 1)) + // 3 + ) + ) + ) + ) + ] + ).translate() + child.add_feature("AAseq", str(aa)) + child.add_feature( + "Kd", + selection_utils.calc_Kd( + child.AAseq, targetAAseqs, hd2affy + ), + ) + child.add_feature( + "target_dist", + min( + [ + hamming_distance(child.AAseq, taa) + for taa in targetAAseqs + ] + ), + ) + child.add_feature("frequency", 0) + child.add_feature("terminated", False) + child.add_feature("time", t) leaf.add_child(child) if selection_params is not None: - hd_distrib = [min([hamming_distance(tn.AAseq, ta) for ta in targetAAseqs]) for tn in tree.iter_leaves() if not tn.terminated] + hd_distrib = [ + min([hamming_distance(tn.AAseq, ta) for ta in targetAAseqs]) + for tn in tree.iter_leaves() + if not tn.terminated + ] if target_dist > 0: - hist = scipy.histogram(hd_distrib, bins=list(range(target_dist*10))) + hist = scipy.histogram( + hd_distrib, bins=list(range(target_dist * 10)) + ) else: # Just make a minimum of 10 bins hist = scipy.histogram(hd_distrib, bins=list(range(10))) hd_generation.append(hist) if verbose and hd_distrib: - print('Total cell population:', sum(hist[0])) - print('Majority hamming distance:', scipy.argmax(hist[0])) - print('Affinity of latest sampled leaf:', leaf.Kd) - print('Progeny distribution lambda for the latest sampled leaf:', leaf.lambda_) + print("Total cell population:", sum(hist[0])) + print("Majority hamming distance:", scipy.argmax(hist[0])) + print("Affinity of latest sampled leaf:", leaf.Kd) + print( + "Progeny distribution lambda for the latest sampled leaf:", + leaf.lambda_, + ) if selection_params is not None: # Keep a histogram of the hamming distances at each generation: - with open(outbase + 'selection_sim.runstats.p', 'wb') as f: + with open(outbase + "selection_sim.runstats.p", "wb") as f: pickle.dump(hd_generation, f) - if leaves_unterminated < N: - raise RuntimeError('tree terminated with {} leaves, {} desired'.format(leaves_unterminated, N)) + raise RuntimeError( + "tree terminated with {} leaves, {} desired".format( + leaves_unterminated, N + ) + ) # each leaf in final generation gets an observation frequency of 1, unless downsampled if T is not None and len(T) > 1: # Iterate the intermediate time steps: for Ti in sorted(T)[:-1]: # Only sample those that have been 'sampled' at intermediate sampling times: - final_leaves = [leaf for leaf in tree.iter_descendants() if leaf.time == Ti and leaf.sampled] + final_leaves = [ + leaf + for leaf in tree.iter_descendants() + if leaf.time == Ti and leaf.sampled + ] if len(final_leaves) < n: - raise RuntimeError('tree terminated with {} leaves, less than what desired after downsampling {}'.format(leaves_unterminated, n)) - for leaf in final_leaves: # No need to down-sample, this was already done in the simulation loop + raise RuntimeError( + "tree terminated with {} leaves, less than what desired after downsampling {}".format( + leaves_unterminated, n + ) + ) + for ( + leaf + ) in ( + final_leaves + ): # No need to down-sample, this was already done in the simulation loop leaf.frequency = 1 if selection_params and max(T) != t: - raise RuntimeError('tree terminated with before the requested sample time.') + raise RuntimeError("tree terminated with before the requested sample time.") # Do the normal sampling of the last time step: final_leaves = [leaf for leaf in tree.iter_leaves() if leaf.time == t] # by default, downsample to the target simulation size @@ -309,9 +513,13 @@ def hd2affy(hd): return(mature_affy) for leaf in final_leaves: leaf.frequency = 1 elif n is not None and len(final_leaves) < n: - raise RuntimeError('tree terminated with {} leaves, less than what desired after downsampling {}'.format(leaves_unterminated, n)) + raise RuntimeError( + "tree terminated with {} leaves, less than what desired after downsampling {}".format( + leaves_unterminated, n + ) + ) else: - raise RuntimeError('Unknown option.') + raise RuntimeError("Unknown option.") # prune away lineages that are unobserved for node in tree.iter_descendants(): @@ -327,7 +535,7 @@ def hd2affy(hd): return(mature_affy) # assign unique names to each node for i, node in enumerate(tree.traverse(), 1): - node.name = 'simcell_{}'.format(i) + node.name = "simcell_{}".format(i) # return the uncollapsed tree return tree diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index 8ec448e9..342779d3 100755 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -17,10 +17,11 @@ def sections(fh): patterns = { "parents": "\s+between\s+and\s+length", - ("sequences", 'dnaml'): "\s*node\s+reconstructed\s+sequence", - ('sequences', 'dnapars'): "from\s+to\s+any steps", - "seqboot_dataset": "Data\s*set"} - patterns = {k: re.compile(v, re.IGNORECASE) for (k,v) in patterns.items()} + ("sequences", "dnaml"): "\s*node\s+reconstructed\s+sequence", + ("sequences", "dnapars"): "from\s+to\s+any steps", + "seqboot_dataset": "Data\s*set", + } + patterns = {k: re.compile(v, re.IGNORECASE) for (k, v) in patterns.items()} for line in fh: for k, pat in patterns.items(): if pat.match(line): @@ -31,7 +32,9 @@ def sections(fh): # iterate over entries in the distance section def iter_edges(fh): # 152 >naive2 0.01208 ( zero, 0.02525) ** - pat = re.compile("\s*(?P\w+)\s+(?P[\w>_.-]+)\s+(?P\d+\.\d+)") + pat = re.compile( + "\s*(?P\w+)\s+(?P[\w>_.-]+)\s+(?P\d+\.\d+)" + ) # drop the header underline fh.readline() matches = 0 @@ -49,22 +52,24 @@ def iter_edges(fh): # iterate over entries in the sequences section -def parse_seqdict(fh, mode='dnaml'): +def parse_seqdict(fh, mode="dnaml"): # 152 sssssssssG AGGTGCAGCT GTTGGAGTCT GGGGGAGGCT TGGTACAGCC TGGGGGGTCC seqs = defaultdict(str) - if mode == 'dnaml': + if mode == "dnaml": patterns = re.compile("^\s*(?P[a-zA-Z0-9>_.-]*)\s+(?P[a-zA-Z \-]+)") - elif mode == 'dnapars': - patterns = re.compile("^\s*\S+\s+(?P[a-zA-Z0-9>_.-]*)\s+(yes\s+|no\s+|maybe\s+)?(?P[a-zA-Z \-\?]+)") + elif mode == "dnapars": + patterns = re.compile( + "^\s*\S+\s+(?P[a-zA-Z0-9>_.-]*)\s+(yes\s+|no\s+|maybe\s+)?(?P[a-zA-Z \-\?]+)" + ) else: - raise ValueError('invalid mode '+mode) + raise ValueError("invalid mode " + mode) fh.readline() for line in fh: m = patterns.match(line) - if m and m.group("id") is not '': + if m and m.group("id") is not "": last_blank = False seqs[m.group("id")] += m.group("seq").replace(" ", "").upper() - elif line.rstrip() == '': + elif line.rstrip() == "": if last_blank: break else: @@ -78,10 +83,10 @@ def parse_seqdict(fh, mode='dnaml'): # parse the dnaml output file and return data structures containing a # list biopython.SeqRecords and a dict containing adjacency # relationships and distances between nodes. -def parse_outfile(outfile, countfile=None, naive='naive'): - '''parse phylip outfile''' +def parse_outfile(outfile, countfile=None, naive="naive"): + """parse phylip outfile""" if countfile is not None: - counts = {l.split(',')[0]:int(l.split(',')[1]) for l in open(countfile)} + counts = {l.split(",")[0]: int(l.split(",")[1]) for l in open(countfile)} # No count, just make an empty count dictionary: else: counts = None @@ -89,20 +94,24 @@ def parse_outfile(outfile, countfile=None, naive='naive'): bootstrap = False # Ugg... for compilation need to let python know that these will definely both be defined :-/ sequences, parents = {}, {} - with open(outfile, 'rU') as fh: + with open(outfile, "rU") as fh: for sect in sections(fh): - if sect == 'parents': - parents = { child:parent for child, parent in iter_edges(fh) } - elif sect[0] == 'sequences': + if sect == "parents": + parents = {child: parent for child, parent in iter_edges(fh)} + elif sect[0] == "sequences": sequences = parse_seqdict(fh, sect[1]) # sanity check; a valid tree should have exactly one node that is parentless if not len(parents) == len(sequences) - 1: - raise RuntimeError('invalid results attempting to parse {}: there are {} parentless sequences'.format(outfile, len(sequences) - len(parents))) + raise RuntimeError( + "invalid results attempting to parse {}: there are {} parentless sequences".format( + outfile, len(sequences) - len(parents) + ) + ) if bootstrap: trees[-1].append(build_tree(sequences, parents, counts, naive)) else: trees.append(build_tree(sequences, parents, counts, naive)) - elif sect == 'seqboot_dataset': + elif sect == "seqboot_dataset": bootstrap = True trees.append([]) else: @@ -111,34 +120,42 @@ def parse_outfile(outfile, countfile=None, naive='naive'): def disambiguate(tree): - '''make random choices for ambiguous bases, respecting tree inheritance''' - ambiguous_dna_values['?'] = 'GATC-' + """make random choices for ambiguous bases, respecting tree inheritance""" + ambiguous_dna_values["?"] = "GATC-" sequence_length = len(tree.sequence) for node in tree.traverse(): for site in range(sequence_length): base = node.sequence[site] - if base not in 'ACGT-': + if base not in "ACGT-": new_base = random.choice(ambiguous_dna_values[base]) - for node2 in node.traverse(is_leaf_fn=lambda n: False if base in [n2.sequence[site] for n2 in n.children] else True): + for node2 in node.traverse( + is_leaf_fn=lambda n: False + if base in [n2.sequence[site] for n2 in n.children] + else True + ): if node2.sequence[site] == base: - node2.sequence = node2.sequence[:site] + new_base + node2.sequence[(site+1):] + node2.sequence = ( + node2.sequence[:site] + + new_base + + node2.sequence[(site + 1) :] + ) return tree # build a tree from a set of sequences and an adjacency dict. -def build_tree(sequences, parents, counts=None, naive='naive'): +def build_tree(sequences, parents, counts=None, naive="naive"): # build an ete tree # first a dictionary of disconnected nodes nodes = {} for name in sequences: node = Tree() node.name = name - node.add_feature('sequence', sequences[node.name]) + node.add_feature("sequence", sequences[node.name]) if counts is not None: if node.name in counts: - node.add_feature('frequency', counts[node.name]) + node.add_feature("frequency", counts[node.name]) else: - node.add_feature('frequency', 0) + node.add_feature("frequency", 0) nodes[name] = node for name in sequences: if name in parents: @@ -155,14 +172,16 @@ def build_tree(sequences, parents, counts=None, naive='naive'): # remove possible unecessary unifurcation after rerooting if len(naive_parent.children) == 1: naive_parent.delete(prevent_nondicotomic=False) - naive_parent.children[0].dist = hamming_distance(naive_parent.children[0].sequence, nodes[naive_id].sequence) + naive_parent.children[0].dist = hamming_distance( + naive_parent.children[0].sequence, nodes[naive_id].sequence + ) tree = nodes[naive_id] # make random choices for ambiguous bases tree = disambiguate(tree) # compute branch lengths - tree.dist = 0 # no branch above root + tree.dist = 0 # no branch above root for node in tree.iter_descendants(): node.dist = hamming_distance(node.sequence, node.up.sequence) diff --git a/gctree/selection_utils.py b/gctree/selection_utils.py index ed4bb2a7..f9a11d98 100755 --- a/gctree/selection_utils.py +++ b/gctree/selection_utils.py @@ -1,9 +1,9 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" utility functions for selection simulation -''' +""" from gctree.utils import hamming_distance @@ -11,50 +11,55 @@ from scipy.optimize import minimize, fsolve from matplotlib import pyplot as plt + def calc_Kd(seqAA, targetAAseqs, hd2affy): - '''Find the closest target sequence to and apply the "hamming distance to affinity" transformation function.''' + """Find the closest target sequence to and apply the "hamming distance to affinity" transformation function.""" hd = min([hamming_distance(seqAA, t) for t in targetAAseqs]) - return(hd2affy(hd)) + return hd2affy(hd) + def lambda_selection(node, tree, targetAAseqs, hd2affy, A_total, B_total, Lp): - ''' + """ Given a node and its tree and a "hamming distance to affinity" transformation function reutrn the poisson lambda parameter for the progeny distribution. - ''' + """ + def calc_BnA(Kd_n, A, B_total): - ''' + """ This calculated the fraction B:A (B bound to A), at equilibrium also referred to as "binding time", of all the different Bs in the population given the number of free As in solution. - ''' - BnA = B_total/(1+Kd_n/A) - return(BnA) + """ + BnA = B_total / (1 + Kd_n / A) + return BnA def return_objective_A(Kd_n, A_total, B_total): - ''' + """ The objective function that solves the set of differential equations setup to find the number of free As, at equilibrium, given a number of Bs with some affinity listed in Kd_n. - ''' - return lambda A: (A_total - (A + scipy.sum(B_total/(1+Kd_n/A))))**2 + """ + return lambda A: (A_total - (A + scipy.sum(B_total / (1 + Kd_n / A)))) ** 2 def calc_binding_time(Kd_n, A_total, B_total): - ''' + """ Solves the objective function to find the number of free As and then uses this, to calculate the fraction B:A (B bound to A) for all the different Bs. - ''' + """ obj = return_objective_A(Kd_n, A_total, B_total) # Different minimizers have been tested and 'L-BFGS-B' was significant faster than anything else: - obj_min = minimize(obj, A_total, bounds=[[1e-10, A_total]], method='L-BFGS-B', tol=1e-20) + obj_min = minimize( + obj, A_total, bounds=[[1e-10, A_total]], method="L-BFGS-B", tol=1e-20 + ) BnA = calc_BnA(Kd_n, obj_min.x[0], B_total) # Terminate if the precision is not good enough: - assert(BnA.sum()+obj_min.x[0]-A_total < A_total/100) - return(BnA) + assert BnA.sum() + obj_min.x[0] - A_total < A_total / 100 + return BnA def trans_BA(BA, Lp): - '''Transform the fraction B:A (B bound to A) to a poisson lambda between 0 and 2.''' + """Transform the fraction B:A (B bound to A) to a poisson lambda between 0 and 2.""" # We keep alpha to enable the possibility that there is a minimum lambda_: alpha, beta, Q = Lp - lambda_ = alpha + (2 - alpha) / (1 + Q*scipy.exp(-beta*BA)) - return(lambda_) + lambda_ = alpha + (2 - alpha) / (1 + Q * scipy.exp(-beta * BA)) + return lambda_ # Update the list of affinities for all the live nodes: Kd_n = scipy.array([n.Kd for n in tree.iter_leaves() if not n.terminated]) @@ -64,69 +69,87 @@ def trans_BA(BA, Lp): for n in tree.iter_leaves(): if n.terminated: continue - n.add_feature('lambda_', lambdas[i]) + n.add_feature("lambda_", lambdas[i]) i += 1 - return(tree) + return tree + def find_A_total(carry_cap, B_total, f_full, mature_affy, U): - def A_total_fun(A, B_total, Kd_n): return(A + scipy.sum(B_total/(1+Kd_n/A))) + def A_total_fun(A, B_total, Kd_n): + return A + scipy.sum(B_total / (1 + Kd_n / A)) - def C_A(A, A_total, f_full, U): return(U * (A_total - A) / f_full) + def C_A(A, A_total, f_full, U): + return U * (A_total - A) / f_full def A_obj(carry_cap, B_total, f_full, Kd_n, U): - def obj(A): return((carry_cap - C_A(A, A_total_fun(A, B_total, Kd_n), f_full, U))**2) - return(obj) + def obj(A): + return (carry_cap - C_A(A, A_total_fun(A, B_total, Kd_n), f_full, U)) ** 2 + + return obj Kd_n = scipy.array([mature_affy] * carry_cap) obj = A_obj(carry_cap, B_total, f_full, Kd_n, U) # Some funny "zero encountered in true_divide" errors are not affecting results so ignore them: - old_settings = scipy.seterr(all='ignore') # Keep old settings - scipy.seterr(divide='ignore') - obj_min = minimize(obj, 1e-20, bounds=[[1e-20, carry_cap]], method='L-BFGS-B', tol=1e-20) + old_settings = scipy.seterr(all="ignore") # Keep old settings + scipy.seterr(divide="ignore") + obj_min = minimize( + obj, 1e-20, bounds=[[1e-20, carry_cap]], method="L-BFGS-B", tol=1e-20 + ) scipy.seterr(**old_settings) # Reset to default A = obj_min.x[0] A_total = A_total_fun(A, B_total, Kd_n) - assert(C_A(A, A_total, f_full, U) > carry_cap * 99/100) - return(A_total) + assert C_A(A, A_total, f_full, U) > carry_cap * 99 / 100 + return A_total def find_Lp(f_full, U): - assert(U > 1) + assert U > 1 + def T_BA(BA, p): # We keep alpha to enable the possibility # that there is a minimum lambda_ alpha, beta, Q = p - lambda_ = alpha + (2 - alpha) / (1 + Q*scipy.exp(-beta*BA)) - return(lambda_) + lambda_ = alpha + (2 - alpha) / (1 + Q * scipy.exp(-beta * BA)) + return lambda_ def solve_T_BA(p, f_full, U): - epsilon = 1/1000 - C1 = (T_BA(0, p) - 0)**2 - C2 = (T_BA(f_full/U, p) - 1)**2 - C3 = (T_BA(1*f_full, p) - (2 - 2*epsilon))**2 - return(C1, C2, C3) + epsilon = 1 / 1000 + C1 = (T_BA(0, p) - 0) ** 2 + C2 = (T_BA(f_full / U, p) - 1) ** 2 + C3 = (T_BA(1 * f_full, p) - (2 - 2 * epsilon)) ** 2 + return (C1, C2, C3) def solve_T_BA_low_epsilon(p, f_full, U): - epsilon = 1/1000 - C1 = (T_BA(0, p) - 0)**2 - C2 = (T_BA(f_full/U, p) - 1)**2 - C3 = (T_BA(1*f_full, p) - (2 - 2*epsilon))**2 * ((2 - T_BA(1*f_full, p)) < 2*epsilon) - return(C1, C2, C3) + epsilon = 1 / 1000 + C1 = (T_BA(0, p) - 0) ** 2 + C2 = (T_BA(f_full / U, p) - 1) ** 2 + C3 = (T_BA(1 * f_full, p) - (2 - 2 * epsilon)) ** 2 * ( + (2 - T_BA(1 * f_full, p)) < 2 * epsilon + ) + return (C1, C2, C3) # FloatingPointError errors are not affecting results so ignore them: - old_settings = scipy.seterr(all='ignore') # Keep old settings - scipy.seterr(over='ignore') + old_settings = scipy.seterr(all="ignore") # Keep old settings + scipy.seterr(over="ignore") try: - def obj_T_A(p): return(solve_T_BA(p, f_full, U)) + + def obj_T_A(p): + return solve_T_BA(p, f_full, U) + p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000) - assert(sum(solve_T_BA(p, f_full, U)) < f_full * 1/1000) + assert sum(solve_T_BA(p, f_full, U)) < f_full * 1 / 1000 except: - print('The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution.') - def obj_T_A(p): return(solve_T_BA_low_epsilon(p, f_full, U)) + print( + "The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution." + ) + + def obj_T_A(p): + return solve_T_BA_low_epsilon(p, f_full, U) + p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000) - assert(sum(solve_T_BA(p, f_full, U)) < f_full * 1/1000) + assert sum(solve_T_BA(p, f_full, U)) < f_full * 1 / 1000 scipy.seterr(**old_settings) # Reset to default - return(p) + return p def plot_runstats(runstats, outbase, colors): @@ -141,7 +164,8 @@ def make_bounds(runstats): i = j elif c > 0: ii = j - return(i, ii) + return (i, ii) + # Total population size: pop_size = scipy.array([sum(r[0]) for r in runstats]) # min:max of the hamming distances to plot: @@ -150,11 +174,17 @@ def make_bounds(runstats): fig = plt.figure() ax = plt.subplot(111) t = scipy.array(list(range(len(pop_size)))) # The x-axis are generations - ax.plot(t, pop_size, lw=2, label='All cells') # Total population size is plotted + ax.plot(t, pop_size, lw=2, label="All cells") # Total population size is plotted # Then plot the counts for each hamming distance as a function on generation: for k in list(range(*bounds)): color = colors[k] - ax.plot(t, scipy.array([r[0][k] for r in runstats]), lw=2, color=color, label='Dist {}'.format(k)) + ax.plot( + t, + scipy.array([r[0][k] for r in runstats]), + lw=2, + color=color, + label="Dist {}".format(k), + ) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0) @@ -162,7 +192,7 @@ def make_bounds(runstats): box = ax.get_position() ax.set_position([box.x0, box.y0, box.width * 0.8, box.height]) - plt.ylabel('Count') - plt.xlabel('GC generation') - plt.title('Cell count as function of GC generation') - fig.savefig(outbase + '.selection_sim.runstats.pdf') + plt.ylabel("Count") + plt.xlabel("GC generation") + plt.title("Cell count as function of GC generation") + fig.savefig(outbase + ".selection_sim.runstats.pdf") diff --git a/gctree/utils.py b/gctree/utils.py index abf70fcd..4d5babc3 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -3,13 +3,20 @@ try: import jellyfish + def hamming_distance(s1, s2): if s1 == s2: return 0 else: return jellyfish.hamming_distance(s1, s2) + + except: + def hamming_distance(seq1, seq2): - '''Hamming distance between two sequences of equal length''' + """Hamming distance between two sequences of equal length""" return sum(x != y for x, y in zip(seq1, seq2)) - print('Couldn\'t find the python module "jellyfish" which is used for fast string comparison. Falling back to pure python function.') + + print( + 'Couldn\'t find the python module "jellyfish" which is used for fast string comparison. Falling back to pure python function.' + ) diff --git a/scripts/aggregate.py b/scripts/aggregate.py index 96fc6ba5..563df205 100755 --- a/scripts/aggregate.py +++ b/scripts/aggregate.py @@ -1,9 +1,9 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" aggregation plots of across parameters -''' +""" from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec @@ -12,54 +12,64 @@ import seaborn as sns from os import path, sep -parser = argparse.ArgumentParser(description='outer aggregation') -parser.add_argument('input', type=str, nargs='+', help='validaggreg.tsv files') -parser.add_argument('--outbase', type=str, help='output file base name') +parser = argparse.ArgumentParser(description="outer aggregation") +parser.add_argument("input", type=str, nargs="+", help="validaggreg.tsv files") +parser.add_argument("--outbase", type=str, help="output file base name") args = parser.parse_args() aggdat = pd.DataFrame() for i, fname in enumerate(args.input): - df = pd.read_csv(fname, sep='\t') + df = pd.read_csv(fname, sep="\t") lambda_, lambda0 = map(float, path.dirname(fname).split(sep)[-2:]) - df['lambda'] = lambda_ - df['lambda0'] = lambda0 + df["lambda"] = lambda_ + df["lambda0"] = lambda0 aggdat = aggdat.append(df) -aggdat.to_csv(args.outbase+'.tsv', sep='\t', index=False) +aggdat.to_csv(args.outbase + ".tsv", sep="\t", index=False) columns = aggdat.columns.values.tolist() -columns.remove('lambda0') +columns.remove("lambda0") -if len(set(aggdat['lambda'])) == 1: +if len(set(aggdat["lambda"])) == 1: gs = gridspec.GridSpec(5, 1, height_ratios=[1, 1, 2, 2, 2]) gs2 = gridspec.GridSpec(5, 1, height_ratios=[1, 1, 2, 2, 2]) gs.update(hspace=0.02) cut = 100 - fig = plt.figure(figsize=(10,10)) + fig = plt.figure(figsize=(10, 10)) ax = plt.subplot(gs[0]) plot_data = aggdat.copy() - plot_data.loc[plot_data['parsimony forest size'] <= cut, columns] = None - sns.swarmplot(x='lambda0', y='parsimony forest size', data=plot_data, palette=sns.color_palette("GnBu_d")) + plot_data.loc[plot_data["parsimony forest size"] <= cut, columns] = None + sns.swarmplot( + x="lambda0", + y="parsimony forest size", + data=plot_data, + palette=sns.color_palette("GnBu_d"), + ) ax.set_ylim(cut, None) - ax.spines['bottom'].set_visible(False) + ax.spines["bottom"].set_visible(False) ax.xaxis.tick_top() - ax.tick_params(labeltop='off') + ax.tick_params(labeltop="off") ax.get_xaxis().set_visible(False) - ax.yaxis.set_label_coords(-.06,-.1) + ax.yaxis.set_label_coords(-0.06, -0.1) - d = .005 # how big to make the diagonal lines in axes coordinates - kwargs = dict(transform=ax.transAxes, color='k', clip_on=False, linewidth=.5) - ax.plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal + d = 0.005 # how big to make the diagonal lines in axes coordinates + kwargs = dict(transform=ax.transAxes, color="k", clip_on=False, linewidth=0.5) + ax.plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal ax.plot((1 - d, 1 + d), (-d, +d), **kwargs) # top-right diagonal ax = plt.subplot(gs[1]) plot_data = aggdat.copy() - plot_data.loc[plot_data['parsimony forest size'] > cut, columns] = None - sns.swarmplot(x='lambda0', y='parsimony forest size', data=plot_data, palette=sns.color_palette("GnBu_d")) + plot_data.loc[plot_data["parsimony forest size"] > cut, columns] = None + sns.swarmplot( + x="lambda0", + y="parsimony forest size", + data=plot_data, + palette=sns.color_palette("GnBu_d"), + ) ax.set_ylim(1, cut) - ax.spines['top'].set_visible(False) + ax.spines["top"].set_visible(False) ax.xaxis.tick_bottom() ax.get_xaxis().set_visible(False) ax.yaxis.label.set_visible(False) @@ -69,17 +79,32 @@ ax.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # bottom-right diagonal ax = plt.subplot(gs2[2]) - sns.swarmplot(x='lambda0', y='mean allele frequency', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="mean allele frequency", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) ax.get_xaxis().set_visible(False) ax = plt.subplot(gs2[3]) - sns.swarmplot(x='lambda0', y='mean branch length', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="mean branch length", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) ax.get_xaxis().set_visible(False) ax = plt.subplot(gs2[4]) - sns.swarmplot(x='lambda0', y='RF distance to true tree', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="RF distance to true tree", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) # ax = fig.add_subplot(4,1,4) # sns.boxplot(x='lambda0', y='MRCA distance', data=aggdat) # ax.get_xaxis().set_visible(False) - ax.set_xlabel('baseline mutation rate') - plt.savefig(args.outbase+'.pdf') + ax.set_xlabel("baseline mutation rate") + plt.savefig(args.outbase + ".pdf") diff --git a/scripts/aggregate_compare.py b/scripts/aggregate_compare.py index 5ea66f7f..14ec323c 100755 --- a/scripts/aggregate_compare.py +++ b/scripts/aggregate_compare.py @@ -1,9 +1,9 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" aggregation plots of across parameters -''' +""" from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec @@ -13,100 +13,103 @@ from os import path, sep import numpy as np -parser = argparse.ArgumentParser(description='outer aggregation') -parser.add_argument('input', type=str, nargs='+', help='validaggreg.tsv files') -parser.add_argument('--outbase', type=str, help='output file base name') +parser = argparse.ArgumentParser(description="outer aggregation") +parser.add_argument("input", type=str, nargs="+", help="validaggreg.tsv files") +parser.add_argument("--outbase", type=str, help="output file base name") args = parser.parse_args() aggdat = pd.DataFrame() for i, fname in enumerate(args.input): - df = pd.read_csv(fname, sep='\t') + df = pd.read_csv(fname, sep="\t") lambda_, lambda0 = map(float, path.dirname(fname).split(sep)[-2:]) - df['lambda'] = lambda_ - df['lambda0'] = lambda0 + df["lambda"] = lambda_ + df["lambda0"] = lambda0 aggdat = aggdat.append(df) -aggdat.to_csv(args.outbase+'.tsv', sep='\t', index=False) +aggdat.to_csv(args.outbase + ".tsv", sep="\t", index=False) columns = aggdat.columns.values.tolist() # columns.remove('lambda0') -df = pd.melt(aggdat, id_vars=['method', 'N_taxa', 'lambda', 'lambda0'], value_vars=['RF','MRCA'], var_name='metric') -df.loc[df.loc[:,'metric'] == 'MRCA', 'value'] = np.log(1 + df.loc[df.loc[:,'metric'] == 'MRCA', 'value']) -df.loc[df.loc[:,'metric'] == 'MRCA', 'metric'] = 'logMRCA' +df = pd.melt( + aggdat, + id_vars=["method", "N_taxa", "lambda", "lambda0"], + value_vars=["RF", "MRCA"], + var_name="metric", +) +df.loc[df.loc[:, "metric"] == "MRCA", "value"] = np.log( + 1 + df.loc[df.loc[:, "metric"] == "MRCA", "value"] +) +df.loc[df.loc[:, "metric"] == "MRCA", "metric"] = "logMRCA" plot2var = [sns.swarmplot, sns.swarmplot, sns.lmplot] -variables = ['lambda', 'lambda0', 'N_taxa'] +variables = ["lambda", "lambda0", "N_taxa"] options = [dict(split=True, height=3), dict(split=True, height=3), dict(height=6)] -numb_variables = sum(len(set(df[var])) > 1 for var in variables) - 1 ### NOTICE -1 because of N_taxa cannot be plotted on same page because of "tight layout" +numb_variables = ( + sum(len(set(df[var])) > 1 for var in variables) - 1 +) ### NOTICE -1 because of N_taxa cannot be plotted on same page because of "tight layout" -plot_func = {v:f for v, f in zip(variables, plot2var)} -plot_options = {v:o for v, o in zip(variables, options)} +plot_func = {v: f for v, f in zip(variables, plot2var)} +plot_options = {v: o for v, o in zip(variables, options)} if numb_variables > 0: gs = gridspec.GridSpec(numb_variables, 2) - fig = plt.figure(figsize=(8, 4*numb_variables)) - + fig = plt.figure(figsize=(8, 4 * numb_variables)) i = 0 for var in variables: - if not len(set(df[var])) > 1 or var == 'N_taxa': + if not len(set(df[var])) > 1 or var == "N_taxa": continue plf = plot_func[var] kwargs = plot_options[var] ax = plt.subplot(gs[i, 0]) - plot_data = df.loc[df.loc[:,'metric'] == 'RF', :] + plot_data = df.loc[df.loc[:, "metric"] == "RF", :] sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) plf(x=var, y="value", hue="method", data=plot_data, **kwargs) - ax.set(ylabel='RF distance') + ax.set(ylabel="RF distance") ax = plt.subplot(gs[i, 1]) - plot_data = df.loc[df.loc[:,'metric'] == 'logMRCA', :] + plot_data = df.loc[df.loc[:, "metric"] == "logMRCA", :] sns.boxplot(x=var, y="value", hue="method", data=plot_data, showfliers=False) plf(x=var, y="value", hue="method", data=plot_data, **kwargs) - ax.set(ylabel='MRCA distance') + ax.set(ylabel="MRCA distance") i += 1 - plt.tight_layout() - plt.savefig(args.outbase+'.pdf') + plt.savefig(args.outbase + ".pdf") -var = 'N_taxa' +var = "N_taxa" gs = gridspec.GridSpec(1, 1) ax = plt.subplot(gs[0, 0]) fig = plt.figure(figsize=(8, 8)) plf = plot_func[var] kwargs = plot_options[var] -plot_data = df.loc[df.loc[:,'metric'] == 'RF', :] +plot_data = df.loc[df.loc[:, "metric"] == "RF", :] plf(x=var, y="value", hue="method", data=plot_data, legend_out=True, **kwargs) -#colors = {'gctree':'red', 'igphyml':'blue'} -#plot_data.plot(kind='scatter', x=var, y='value', c=plot_data['method'].apply(lambda x: colors[x])) -ax.set(ylabel='RF distance') -plt.title('Plot for tree size: {}. For RF.'.format(var)) +# colors = {'gctree':'red', 'igphyml':'blue'} +# plot_data.plot(kind='scatter', x=var, y='value', c=plot_data['method'].apply(lambda x: colors[x])) +ax.set(ylabel="RF distance") +plt.title("Plot for tree size: {}. For RF.".format(var)) plt.tight_layout() -plt.savefig(args.outbase+'1.pdf') +plt.savefig(args.outbase + "1.pdf") -plot_data = df.loc[df.loc[:,'metric'] == 'logMRCA', :] +plot_data = df.loc[df.loc[:, "metric"] == "logMRCA", :] plf(x=var, y="value", hue="method", data=plot_data, **kwargs) -ax.set(ylabel='MRCA distance') -plt.title('Plot for tree size: {}. For MRCA.'.format(var)) +ax.set(ylabel="MRCA distance") +plt.title("Plot for tree size: {}. For MRCA.".format(var)) plt.tight_layout() -plt.savefig(args.outbase+'2.pdf') - - - - +plt.savefig(args.outbase + "2.pdf") -#if len(set(aggdat['lambda'])) == 1 and len(set(aggdat['r'])) == 1: +# if len(set(aggdat['lambda'])) == 1 and len(set(aggdat['r'])) == 1: if False: gs = gridspec.GridSpec(5, 1, height_ratios=[1, 1, 2, 2, 2]) @@ -114,29 +117,39 @@ gs.update(hspace=0.02) cut = 100 - fig = plt.figure(figsize=(10,10)) + fig = plt.figure(figsize=(10, 10)) ax = plt.subplot(gs[0]) plot_data = aggdat.copy() - plot_data.loc[plot_data['parsimony forest size'] <= cut, columns] = None - sns.swarmplot(x='lambda0', y='parsimony forest size', data=plot_data, palette=sns.color_palette("GnBu_d")) + plot_data.loc[plot_data["parsimony forest size"] <= cut, columns] = None + sns.swarmplot( + x="lambda0", + y="parsimony forest size", + data=plot_data, + palette=sns.color_palette("GnBu_d"), + ) ax.set_ylim(cut, None) - ax.spines['bottom'].set_visible(False) + ax.spines["bottom"].set_visible(False) ax.xaxis.tick_top() - ax.tick_params(labeltop='off') + ax.tick_params(labeltop="off") ax.get_xaxis().set_visible(False) - ax.yaxis.set_label_coords(-.06,-.1) + ax.yaxis.set_label_coords(-0.06, -0.1) - d = .005 # how big to make the diagonal lines in axes coordinates - kwargs = dict(transform=ax.transAxes, color='k', clip_on=False, linewidth=.5) - ax.plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal + d = 0.005 # how big to make the diagonal lines in axes coordinates + kwargs = dict(transform=ax.transAxes, color="k", clip_on=False, linewidth=0.5) + ax.plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal ax.plot((1 - d, 1 + d), (-d, +d), **kwargs) # top-right diagonal ax = plt.subplot(gs[1]) plot_data = aggdat.copy() - plot_data.loc[plot_data['parsimony forest size'] > cut, columns] = None - sns.swarmplot(x='lambda0', y='parsimony forest size', data=plot_data, palette=sns.color_palette("GnBu_d")) + plot_data.loc[plot_data["parsimony forest size"] > cut, columns] = None + sns.swarmplot( + x="lambda0", + y="parsimony forest size", + data=plot_data, + palette=sns.color_palette("GnBu_d"), + ) ax.set_ylim(1, cut) - ax.spines['top'].set_visible(False) + ax.spines["top"].set_visible(False) ax.xaxis.tick_bottom() ax.get_xaxis().set_visible(False) ax.yaxis.label.set_visible(False) @@ -146,17 +159,32 @@ ax.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # bottom-right diagonal ax = plt.subplot(gs2[2]) - sns.swarmplot(x='lambda0', y='mean allele frequency', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="mean allele frequency", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) ax.get_xaxis().set_visible(False) ax = plt.subplot(gs2[3]) - sns.swarmplot(x='lambda0', y='mean branch length', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="mean branch length", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) ax.get_xaxis().set_visible(False) ax = plt.subplot(gs2[4]) - sns.swarmplot(x='lambda0', y='RF distance to true tree', data=aggdat, palette=sns.color_palette("GnBu_d")) + sns.swarmplot( + x="lambda0", + y="RF distance to true tree", + data=aggdat, + palette=sns.color_palette("GnBu_d"), + ) # ax = fig.add_subplot(4,1,4) # sns.boxplot(x='lambda0', y='MRCA distance', data=aggdat) # ax.get_xaxis().set_visible(False) - ax.set_xlabel('baseline mutation rate') - plt.savefig(args.outbase+'.pdf') + ax.set_xlabel("baseline mutation rate") + plt.savefig(args.outbase + ".pdf") diff --git a/scripts/consensus.py b/scripts/consensus.py index 81de2957..c61947e2 100755 --- a/scripts/consensus.py +++ b/scripts/consensus.py @@ -1,21 +1,34 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -'''compute GCtree for a phylip consensus tree''' +"""compute GCtree for a phylip consensus tree""" from gctree import * import argparse - def main(): - parser = argparse.ArgumentParser(description='consensus tree support') - parser.add_argument('consense', type=str, help='dnapars outfile for fixed consense tree') - parser.add_argument('countfile', type=str, help='File containing allele frequencies (sequence counts) in the format: "SeqID,Nobs"') - parser.add_argument('bootstrap', type=str, help='dnapars outfile from seqboot (multiple data sets)') - parser.add_argument('--naive', type=str, default=None, help='name of naive sequence (outgroup root)') - parser.add_argument('--frame', type=int, default=None, choices=(1, 2, 3), help='codon frame') - parser.add_argument('--outbase', type=str, default='gctree.out', help='output file base name') + parser = argparse.ArgumentParser(description="consensus tree support") + parser.add_argument( + "consense", type=str, help="dnapars outfile for fixed consense tree" + ) + parser.add_argument( + "countfile", + type=str, + help='File containing allele frequencies (sequence counts) in the format: "SeqID,Nobs"', + ) + parser.add_argument( + "bootstrap", type=str, help="dnapars outfile from seqboot (multiple data sets)" + ) + parser.add_argument( + "--naive", type=str, default=None, help="name of naive sequence (outgroup root)" + ) + parser.add_argument( + "--frame", type=int, default=None, choices=(1, 2, 3), help="codon frame" + ) + parser.add_argument( + "--outbase", type=str, default="gctree.out", help="output file base name" + ) args = parser.parse_args() consense = phylip_parse.parse_outfile(args.consense, args.countfile, args.naive) @@ -26,21 +39,32 @@ def main(): # fractional trees for parsimony degeneracy weights = [] - for bootstrap in phylip_parse.parse_outfile(args.bootstrap, args.countfile, args.naive): + for bootstrap in phylip_parse.parse_outfile( + args.bootstrap, args.countfile, args.naive + ): new_gctrees = [] for tree in bootstrap: gctree = CollapsedTree(tree=tree, frame=args.frame, allow_repeats=True) - if sum(gctree.compare(gctree2, method='identity') for gctree2 in new_gctrees) == 0: + if ( + sum( + gctree.compare(gctree2, method="identity") + for gctree2 in new_gctrees + ) + == 0 + ): new_gctrees.append(gctree) bootstrap_gctrees.extend(new_gctrees) - weights.extend([1/len(new_gctrees) for _ in range(len(new_gctrees))]) + weights.extend([1 / len(new_gctrees) for _ in range(len(new_gctrees))]) assert len(weights) == len(bootstrap_gctrees) consensus_gctree.support(bootstrap_gctrees, weights=weights) - consensus_gctree.render(args.outbase+'.bootstrap_support.svg', show_support=True) + consensus_gctree.render(args.outbase + ".bootstrap_support.svg", show_support=True) consensus_gctree.support(bootstrap_gctrees, weights=weights, compatibility=True) - consensus_gctree.render(args.outbase+'.bootstrap_compatibility.svg', show_support=True) + consensus_gctree.render( + args.outbase + ".bootstrap_compatibility.svg", show_support=True + ) + if __name__ == "__main__": main() diff --git a/scripts/deduplicate.py b/scripts/deduplicate.py index 4e13707d..cb54baee 100755 --- a/scripts/deduplicate.py +++ b/scripts/deduplicate.py @@ -8,37 +8,40 @@ from Bio.Phylo.TreeConstruction import MultipleSeqAlignment from collections import defaultdict, Counter + def fasta_parse(aln_file, naive, frame=None, aln_file2=None, converter=None): # naive = naive.lower() - if aln_file.endswith('fasta') or aln_file.endswith('fa'): - aln_format = 'fasta' - elif aln_file.endswith('phylip') or aln_file.endswith('phy'): - aln_format = 'phylip' + if aln_file.endswith("fasta") or aln_file.endswith("fa"): + aln_format = "fasta" + elif aln_file.endswith("phylip") or aln_file.endswith("phy"): + aln_format = "phylip" else: - raise ValueError('unrecognized alignment file type: ' + aln_file) + raise ValueError("unrecognized alignment file type: " + aln_file) aln = AlignIO.read(aln_file, aln_format) if aln_file2 is not None: assert frame is None aln_combined = MultipleSeqAlignment([]) - if aln_file2.endswith('fasta') or aln_file2.endswith('fa'): - aln_format2 = 'fasta' - elif aln_file2.endswith('phylip') or aln_file2.endswith('phy'): - aln_format2 = 'phylip' + if aln_file2.endswith("fasta") or aln_file2.endswith("fa"): + aln_format2 = "fasta" + elif aln_file2.endswith("phylip") or aln_file2.endswith("phy"): + aln_format2 = "phylip" else: - raise ValueError('unrecognized alignment file type: ' + aln_file2) + raise ValueError("unrecognized alignment file type: " + aln_file2) aln2 = AlignIO.read(aln_file2, aln_format2) for seq in aln: - cell = (seq.id[:-1] if seq.id != naive else naive) + cell = seq.id[:-1] if seq.id != naive else naive for seq2 in aln2: - cell2 = (seq2.id[:-1] if seq2.id != naive else naive) + cell2 = seq2.id[:-1] if seq2.id != naive else naive if cell2 == cell: - aln_combined.append(SeqRecord(Seq(str(seq.seq) + str(seq2.seq)), id=cell)) + aln_combined.append( + SeqRecord(Seq(str(seq.seq) + str(seq2.seq)), id=cell) + ) aln = aln_combined sequence_length = aln.get_alignment_length() if frame is not None: - start = frame-1 - end = start + 3*((sequence_length - start)//3) + start = frame - 1 + end = start + 3 * ((sequence_length - start) // 3) else: start = 0 end = sequence_length @@ -50,102 +53,158 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, converter=None): # seq.id = seq.id.lower() # if id is just an integer, assume it represents count of that sequence if seq.id in id_set: - raise ValueError('Sequence ID found multiple times:', seq.id) + raise ValueError("Sequence ID found multiple times:", seq.id) else: id_set.add(seq.id) seqstr = str(seq.seq)[start:end] if seq.id == naive: naive_seq = seqstr if seqstr not in seqs_unique_counts: - seqs_unique_counts[seqstr] = [] # no observed naive unless we see it elsewhere + seqs_unique_counts[ + seqstr + ] = [] # no observed naive unless we see it elsewhere elif seq.id.isdigit() and converter is not None: - if converter.lower() == 'tas': + if converter.lower() == "tas": seqs_unique_counts[seqstr] = [seq.id for _ in range(int(seq.id))] else: - raise ValueError('invalid converter: '+converter) + raise ValueError("invalid converter: " + converter) else: seqs_unique_counts[seqstr].append(seq.id) if naive_seq is None: - raise ValueError('naive seq id {} not found'.format(naive)) + raise ValueError("naive seq id {} not found".format(naive)) new_aln = MultipleSeqAlignment([SeqRecord(Seq(naive_seq), id=naive.lower())]) - counts = {naive.lower(): len(seqs_unique_counts[naive_seq])} # Add the count for the naive sequence + counts = { + naive.lower(): len(seqs_unique_counts[naive_seq]) + } # Add the count for the naive sequence id_map = {naive.lower(): [x for x in seqs_unique_counts[naive_seq] if x != naive]} - del seqs_unique_counts[naive_seq] # Now delete the naive so it does not appear twice + del seqs_unique_counts[ + naive_seq + ] # Now delete the naive so it does not appear twice for i, seq in enumerate(seqs_unique_counts, 1): - new_id = 'seq'+str(i) + new_id = "seq" + str(i) new_aln.append(SeqRecord(Seq(seq), id=new_id)) counts[new_id] = len(seqs_unique_counts[seq]) id_map[new_id] = seqs_unique_counts[seq] return new_aln, counts, id_map + def check_header(header): try: - header.decode('ascii') + header.decode("ascii") except UnicodeDecodeError as e: - print('Sequence header must be an ascii-encoded string:', header) + print("Sequence header must be an ascii-encoded string:", header) raise e if len(header) > 10: - print('Sequence headers must be shorter than 10 characters:', header) + print("Sequence headers must be shorter than 10 characters:", header) raise Exception try: int(header) - raise Exception('Sequence headers must be distinguishable from an integer. Please add a non number character.') + raise Exception( + "Sequence headers must be distinguishable from an integer. Please add a non number character." + ) except: pass def main(): - parser = argparse.ArgumentParser(description='Convert a fasta file to philyp format. Headers must be a unique ID of less than ' - 'or equal to 10 ASCII characters. A special option for converting a Victora lab ' - 'GC fasta file to phylip is also included. All headers are converted to lower case.') - parser.add_argument('infile', type=str, nargs='+', help='Fasta file with less than or equal to 10 characters unique header ID. ' - 'For Victora data any integer ids indicates frequency.' - 'Because dnapars will name internal nodes by intergers a node name must include' - 'at least one non number character.') - parser.add_argument('--countfile', type=str, default=None, help='filename for the output file containing the counts.') - parser.add_argument('--idmapfile', type=str, default=None, help='filename for the output file containing the map of new unique ids to original seq ids.') - parser.add_argument('--converter', type=str, default=None, help='use a special format convertion scheme e.g. for a Vitora lab GC fasta file. Options: [tas]') - specified_coverters = ['tas'] - parser.add_argument('--naive', type=str, default='naive', help='naive sequence id') - parser.add_argument('--frame', type=int, default=None, help='codon frame', choices=(1,2,3)) - parser.add_argument('--colorfile', type=str, default=None, help='optional input csv filename for colors of each cell.') - parser.add_argument('--colormap', type=str, default=None, help='optional output filename for colors map.') + parser = argparse.ArgumentParser( + description="Convert a fasta file to philyp format. Headers must be a unique ID of less than " + "or equal to 10 ASCII characters. A special option for converting a Victora lab " + "GC fasta file to phylip is also included. All headers are converted to lower case." + ) + parser.add_argument( + "infile", + type=str, + nargs="+", + help="Fasta file with less than or equal to 10 characters unique header ID. " + "For Victora data any integer ids indicates frequency." + "Because dnapars will name internal nodes by intergers a node name must include" + "at least one non number character.", + ) + parser.add_argument( + "--countfile", + type=str, + default=None, + help="filename for the output file containing the counts.", + ) + parser.add_argument( + "--idmapfile", + type=str, + default=None, + help="filename for the output file containing the map of new unique ids to original seq ids.", + ) + parser.add_argument( + "--converter", + type=str, + default=None, + help="use a special format convertion scheme e.g. for a Vitora lab GC fasta file. Options: [tas]", + ) + specified_coverters = ["tas"] + parser.add_argument("--naive", type=str, default="naive", help="naive sequence id") + parser.add_argument( + "--frame", type=int, default=None, help="codon frame", choices=(1, 2, 3) + ) + parser.add_argument( + "--colorfile", + type=str, + default=None, + help="optional input csv filename for colors of each cell.", + ) + parser.add_argument( + "--colormap", + type=str, + default=None, + help="optional output filename for colors map.", + ) args = parser.parse_args() if args.converter is not None and args.converter.lower() not in specified_coverters: - print('Cannot find the specified converter:', args.converter) - print('Allowed converters:', specified_coverters.join(',')) + print("Cannot find the specified converter:", args.converter) + print("Allowed converters:", specified_coverters.join(",")) raise Exception - new_aln, counts, id_map = fasta_parse(args.infile[0], - args.naive, - frame=args.frame, - aln_file2=args.infile[1] if len(args.infile) == 2 else None, - converter=args.converter) - print(format(new_aln, 'phylip')) + new_aln, counts, id_map = fasta_parse( + args.infile[0], + args.naive, + frame=args.frame, + aln_file2=args.infile[1] if len(args.infile) == 2 else None, + converter=args.converter, + ) + print(format(new_aln, "phylip")) if args.countfile is not None: - with open(args.countfile, 'w') as f: + with open(args.countfile, "w") as f: for seqID, count in counts.items(): - print('{},{}'.format(seqID, count), file=f) + print("{},{}".format(seqID, count), file=f) if args.idmapfile is not None: - with open(args.idmapfile, 'w') as f: + with open(args.idmapfile, "w") as f: for seq_id, cell_ids in id_map.items(): - print('{},{}'.format(seq_id, ':'.join(cell_ids)), file=f) + print("{},{}".format(seq_id, ":".join(cell_ids)), file=f) if args.colorfile is not None: - with open(args.colorfile, 'r') as f: - cell_colors = dict(line.rstrip().split(',') for line in f) - with open(args.colormap, 'w') as f: + with open(args.colorfile, "r") as f: + cell_colors = dict(line.rstrip().split(",") for line in f) + with open(args.colormap, "w") as f: for seq_id, cell_ids in id_map.items(): - colors_counts = list(Counter(cell_colors[cell_id] if cell_id in cell_colors else None for cell_id in cell_ids).items()) - if len(colors_counts) == 1 and colors_counts[0][0] != None and colors_counts != []: + colors_counts = list( + Counter( + cell_colors[cell_id] if cell_id in cell_colors else None + for cell_id in cell_ids + ).items() + ) + if ( + len(colors_counts) == 1 + and colors_counts[0][0] != None + and colors_counts != [] + ): colors_str = colors_counts[0][0] - print('{}\t{}'.format(seq_id, colors_str), file=f) + print("{}\t{}".format(seq_id, colors_str), file=f) elif len(colors_counts) > 1: - colors_strs = ['{}:{}'.format(color, count) for color, count in colors_counts] - print('{}\t{}'.format(seq_id, ','.join(colors_strs)), file=f) + colors_strs = [ + "{}:{}".format(color, count) for color, count in colors_counts + ] + print("{}\t{}".format(seq_id, ",".join(colors_strs)), file=f) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/heavy_light_compare.py b/scripts/heavy_light_compare.py index f484f2c1..119c7eef 100755 --- a/scripts/heavy_light_compare.py +++ b/scripts/heavy_light_compare.py @@ -1,15 +1,16 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" comparison of heavy and light trees -''' +""" import pandas as pd import scipy from matplotlib import pyplot as plt import seaborn as sns -sns.set(style='white', color_codes=True) + +sns.set(style="white", color_codes=True) import pickle from Bio import AlignIO from collections import defaultdict @@ -19,31 +20,33 @@ def main(): import argparse - parser = argparse.ArgumentParser(description='compare heavy and light chain trees', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('heavy_forest', type=str, help='.p forest file') - parser.add_argument('light_forest', type=str, help='.p forest file') - parser.add_argument('heavy_fasta', type=str, help='fasta') - parser.add_argument('light_fasta', type=str, help='fasta') - parser.add_argument('heavy_log', type=str, help='log') - parser.add_argument('light_log', type=str, help='log') - parser.add_argument('outbase', type=str, help='output file base name') - parser.add_argument('--naiveid', type=str, default='GL', help='fasta') + parser = argparse.ArgumentParser( + description="compare heavy and light chain trees", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser.add_argument("heavy_forest", type=str, help=".p forest file") + parser.add_argument("light_forest", type=str, help=".p forest file") + parser.add_argument("heavy_fasta", type=str, help="fasta") + parser.add_argument("light_fasta", type=str, help="fasta") + parser.add_argument("heavy_log", type=str, help="log") + parser.add_argument("light_log", type=str, help="log") + parser.add_argument("outbase", type=str, help="output file base name") + parser.add_argument("--naiveid", type=str, default="GL", help="fasta") # parser.add_argument('--outbase', type=str, required=True, help='output file base name') args = parser.parse_args() - with open(args.heavy_forest, 'rb') as f: + with open(args.heavy_forest, "rb") as f: heavy_forest = pickle.load(f) - with open(args.light_forest, 'rb') as f: + with open(args.light_forest, "rb") as f: light_forest = pickle.load(f) heavy_map = defaultdict(list) - for seq in AlignIO.read(args.heavy_fasta, 'fasta'): + for seq in AlignIO.read(args.heavy_fasta, "fasta"): if seq.id != args.naiveid: heavy_map[str(seq.seq).lower()].append(seq.id) light_map = defaultdict(list) - for seq in AlignIO.read(args.light_fasta, 'fasta'): + for seq in AlignIO.read(args.light_fasta, "fasta"): if seq.id != args.naiveid: light_map[str(seq.seq).lower()].append(seq.id) @@ -58,55 +61,88 @@ def main(): for cell_name in light_map[node.sequence.lower()]: node.add_child(name=cell_name) - heavy_log = pd.read_csv(args.heavy_log, sep='\t', usecols=('logLikelihood',), squeeze=True) - light_log = pd.read_csv(args.light_log, sep='\t', usecols=('logLikelihood',), squeeze=True) + heavy_log = pd.read_csv( + args.heavy_log, sep="\t", usecols=("logLikelihood",), squeeze=True + ) + light_log = pd.read_csv( + args.light_log, sep="\t", usecols=("logLikelihood",), squeeze=True + ) - dat = pd.DataFrame(columns=('l_heavy', 'l_light', 'l_heavy+l_light', 'RF', 'mle')) + dat = pd.DataFrame(columns=("l_heavy", "l_light", "l_heavy+l_light", "RF", "mle")) # dat = scipy.zeros((len(heavy_forest.forest), len(light_forest.forest)), dtype=int) ct = 0 for i, heavy_tree in enumerate(heavy_forest.forest): for j, light_tree in enumerate(light_forest.forest): # dat[i, j] = heavy_tree.tree.robinson_foulds(light_tree.tree, attr_t1='name', attr_t2='name', unrooted_trees=True)[0] - dat.loc[ct] = [heavy_log[i], - light_log[j], - heavy_log[i]+light_log[j], - heavy_tree.tree.robinson_foulds(light_tree.tree, attr_t1='name', attr_t2='name', unrooted_trees=True)[0], - 'both' if i == j == 0 else 'heavy' if i == 0 else 'light' if j == 0 else 'neither'] + dat.loc[ct] = [ + heavy_log[i], + light_log[j], + heavy_log[i] + light_log[j], + heavy_tree.tree.robinson_foulds( + light_tree.tree, attr_t1="name", attr_t2="name", unrooted_trees=True + )[0], + "both" + if i == j == 0 + else "heavy" + if i == 0 + else "light" + if j == 0 + else "neither", + ] ct += 1 - dat2 = pd.DataFrame(columns=('logLikelihood', 'chain', 'mle')) + dat2 = pd.DataFrame(columns=("logLikelihood", "chain", "mle")) # dat = scipy.zeros((len(heavy_forest.forest), len(light_forest.forest)), dtype=int) ct = 0 for i, heavy_tree in enumerate(heavy_log): - dat2.loc[i] = [heavy_log[i], 'IgH\n(n={})'.format(len(heavy_log)), True if i == 0 else False] + dat2.loc[i] = [ + heavy_log[i], + "IgH\n(n={})".format(len(heavy_log)), + True if i == 0 else False, + ] for j, light_tree in enumerate(light_log): - dat2.loc[i + 1 + j] = [light_log[j], 'IgL\n(n={})'.format(len(light_log)), True if j == 0 else False] + dat2.loc[i + 1 + j] = [ + light_log[j], + "IgL\n(n={})".format(len(light_log)), + True if j == 0 else False, + ] plt.figure(figsize=(1.75, 3)) - sns.boxplot(x='chain', y='logLikelihood', data=dat2[dat2['mle']==False], color='gray') - ax = sns.stripplot(x='chain', y='logLikelihood', data=dat2[dat2['mle']==True], color='red') - plt.xlabel('parsimony trees') - plt.gca().spines['right'].set_color('none') - plt.gca().spines['top'].set_color('none') + sns.boxplot( + x="chain", y="logLikelihood", data=dat2[dat2["mle"] == False], color="gray" + ) + ax = sns.stripplot( + x="chain", y="logLikelihood", data=dat2[dat2["mle"] == True], color="red" + ) + plt.xlabel("parsimony trees") + plt.gca().spines["right"].set_color("none") + plt.gca().spines["top"].set_color("none") plt.tight_layout() - plt.savefig(args.outbase+'.2.pdf') + plt.savefig(args.outbase + ".2.pdf") plt.figure(figsize=(4, 2.5)) # sns.barplot(x=scipy.argsort(-dat['RF']), y='RF', hue='mle', data=dat, palette=('red', 'orange', 'yellow', 'gray')) - plt.hist((dat['RF'][dat['mle']=='both'], dat['RF'][dat['mle']=='heavy'], dat['RF'][dat['mle']=='light'], dat['RF'][dat['mle']=='neither']), - bins=scipy.arange(-.5, max(dat['RF'])+1.5, 1.), - histtype='barstacked', - label=('IgH and IgL MLE', 'IgH MLE', 'IgL MLE'), - color=('red', 'indianred', 'rosybrown', 'gray'), - edgecolor='black') - plt.legend(loc=(0,.68)) - plt.xlim([min(dat['RF'])-.5, max(dat['RF'])+.5]) - plt.xlabel('RF distance between IgH tree and IgL tree\nlabelled by cell identity') - plt.ylabel('IgH/IgL parsimony tree pairs\n(n={})'.format(len(dat))) - plt.gca().spines['right'].set_color('none') - plt.gca().spines['top'].set_color('none') + plt.hist( + ( + dat["RF"][dat["mle"] == "both"], + dat["RF"][dat["mle"] == "heavy"], + dat["RF"][dat["mle"] == "light"], + dat["RF"][dat["mle"] == "neither"], + ), + bins=scipy.arange(-0.5, max(dat["RF"]) + 1.5, 1.0), + histtype="barstacked", + label=("IgH and IgL MLE", "IgH MLE", "IgL MLE"), + color=("red", "indianred", "rosybrown", "gray"), + edgecolor="black", + ) + plt.legend(loc=(0, 0.68)) + plt.xlim([min(dat["RF"]) - 0.5, max(dat["RF"]) + 0.5]) + plt.xlabel("RF distance between IgH tree and IgL tree\nlabelled by cell identity") + plt.ylabel("IgH/IgL parsimony tree pairs\n(n={})".format(len(dat))) + plt.gca().spines["right"].set_color("none") + plt.gca().spines["top"].set_color("none") plt.tight_layout() - plt.savefig(args.outbase+'.pdf') + plt.savefig(args.outbase + ".pdf") # return @@ -114,18 +150,20 @@ def main(): dat = scipy.zeros((len(light_forest.forest), len(heavy_forest.forest)), dtype=int) for j, heavy_tree in enumerate(heavy_forest.forest): for i, light_tree in enumerate(light_forest.forest): - dat[i, j] = heavy_tree.tree.robinson_foulds(light_tree.tree, attr_t1='name', attr_t2='name', unrooted_trees=True)[0] + dat[i, j] = heavy_tree.tree.robinson_foulds( + light_tree.tree, attr_t1="name", attr_t2="name", unrooted_trees=True + )[0] # dat.loc[-1] = [heavy_log[i], light_log[j], heavy_tree.tree.robinson_foulds(light_tree.tree, attr_t1='name', attr_t2='name', unrooted_trees=True)[0]] # dat.index += 1 - plt.figure(figsize=(.3*len(heavy_forest.forest), .3*len(light_forest.forest))) + plt.figure(figsize=(0.3 * len(heavy_forest.forest), 0.3 * len(light_forest.forest))) # sns.lmplot(x='l_heavy', y='l_light', hue='RF', data=dat, fit_reg=False, scatter_kws={'alpha':.5}, legend_out=False) # for x in heavy_log: # plt.axvline(x, ls='--', color='black', lw=.1, zorder=0) # for x in light_log: # plt.axhline(x, ls='--', color='black', lw=.1, zorder=0) # plt.subplot(2,2,3) - ax = sns.heatmap(dat, annot=True, fmt='d', cmap='Reds', cbar=False, linewidths=1) + ax = sns.heatmap(dat, annot=True, fmt="d", cmap="Reds", cbar=False, linewidths=1) ax.invert_yaxis() # plt.subplot(2,2,4) # plt.plot(list(reversed(heavy_log)), list(reversed(range(len(heavy_log)))), ls='none', marker='o', clip_on=False, c='k') @@ -135,7 +173,8 @@ def main(): # plt.ylabel('GCtree log likelihood') plt.tight_layout() sns.despine() - plt.savefig(args.outbase+'.3.pdf') + plt.savefig(args.outbase + ".3.pdf") + -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/mkconfig.py b/scripts/mkconfig.py index bf8ce273..f74ce730 100755 --- a/scripts/mkconfig.py +++ b/scripts/mkconfig.py @@ -46,51 +46,63 @@ import argparse from warnings import warn + def main(): parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('phylip', help='PHYLIP input', type=str) - parser.add_argument('treeprog', help='dnaml or dnapars', type=str) - parser.add_argument('--quick', action='store_true', help='quicker (less thourough) dnapars') - parser.add_argument('--bootstrap', type=int, default=0, help='input is seqboot output with this many samples') + parser.add_argument("phylip", help="PHYLIP input", type=str) + parser.add_argument("treeprog", help="dnaml or dnapars", type=str) + parser.add_argument( + "--quick", action="store_true", help="quicker (less thourough) dnapars" + ) + parser.add_argument( + "--bootstrap", + type=int, + default=0, + help="input is seqboot output with this many samples", + ) args = parser.parse_args() - print(os.path.realpath(args.phylip)) # phylip input file - if args.treeprog == 'seqboot': - print('R') + print(os.path.realpath(args.phylip)) # phylip input file + if args.treeprog == "seqboot": + print("R") print(args.bootstrap) - print('Y') - print(str(1+2*random.randint(0, 1000000))) # random seed for bootstrap (odd integer) + print("Y") + print( + str(1 + 2 * random.randint(0, 1000000)) + ) # random seed for bootstrap (odd integer) return - print('J') - print(str(1+2*random.randint(0, 1000000))) - print('10') + print("J") + print(str(1 + 2 * random.randint(0, 1000000))) + print("10") if args.bootstrap: - print('M') - print('D') + print("M") + print("D") print(args.bootstrap) - if args.treeprog == 'dnapars': - print("O") # Outgroup root - print(1) # arbitrary root on first + if args.treeprog == "dnapars": + print("O") # Outgroup root + print(1) # arbitrary root on first if args.quick: - print('S') - print('Y') - print('4') - print('5') - print('.') - print('Y') - elif args.treeprog == 'dnaml': - print("O") # Outgroup root - print(1) # arbitrary root on first - print("R") # gamma - print("5") # Reconstruct hypothetical seq - print("Y") # accept these - print("1.41421356237") # CV = sqrt(2) (alpha = .5) - print("4") # 4 catagories + print("S") + print("Y") + print("4") + print("5") + print(".") + print("Y") + elif args.treeprog == "dnaml": + print("O") # Outgroup root + print(1) # arbitrary root on first + print("R") # gamma + print("5") # Reconstruct hypothetical seq + print("Y") # accept these + print("1.41421356237") # CV = sqrt(2) (alpha = .5) + print("4") # 4 catagories else: - raise RuntimeError('treeprog='+args.treeprog+' is not "dnaml", "dnapars", or "seqboot"') + raise RuntimeError( + "treeprog=" + args.treeprog + ' is not "dnaml", "dnapars", or "seqboot"' + ) if __name__ == "__main__": - main() + main() diff --git a/scripts/phylip_parse.py b/scripts/phylip_parse.py index 56b7a30e..7b1a2e6c 100644 --- a/scripts/phylip_parse.py +++ b/scripts/phylip_parse.py @@ -4,6 +4,7 @@ import gctree.phylip_parse as pp import gctree.branching_processes as bp + def main(): import pickle, argparse, os @@ -15,29 +16,36 @@ def existing_file(fname): if not os.path.isfile(fname): raise ValueError("Invalid file: " + str(fname)) return fname + parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( - 'phylip_outfile', type=existing_file, help='dnaml outfile (verbose output with inferred ancestral sequences, option 5).') - parser.add_argument( - 'countfile', type=existing_file, help="count file") - parser.add_argument( - '--outputfile', default=None, help="output file.") - parser.add_argument( - '--naive', default='naive', help="naive sequence id") + "phylip_outfile", + type=existing_file, + help="dnaml outfile (verbose output with inferred ancestral sequences, option 5).", + ) + parser.add_argument("countfile", type=existing_file, help="count file") + parser.add_argument("--outputfile", default=None, help="output file.") + parser.add_argument("--naive", default="naive", help="naive sequence id") args = parser.parse_args() if args.outputfile is None: - args.outputfile = args.phylip_outfile + '.collapsed_forest.p' + args.outputfile = args.phylip_outfile + ".collapsed_forest.p" trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.naive) if isinstance(trees[0], list): print(trees[0][0]) print(bp.CollapsedTree(tree=trees[0][0])) - bootstraps = [[bp.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees] - pickle.dump([bp.CollapsedForest(forest=trees) for trees in bootstraps], open(args.outputfile, 'w')) + bootstraps = [ + [bp.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees + ] + pickle.dump( + [bp.CollapsedForest(forest=trees) for trees in bootstraps], + open(args.outputfile, "w"), + ) else: trees = [bp.CollapsedTree(tree=tree) for tree in trees] - pickle.dump(bp.CollapsedForest(forest=trees), open(args.outputfile, 'w')) + pickle.dump(bp.CollapsedForest(forest=trees), open(args.outputfile, "w")) + if __name__ == "__main__": main() diff --git a/scripts/plot_tree.py b/scripts/plot_tree.py index 617b8e95..baaba3d5 100755 --- a/scripts/plot_tree.py +++ b/scripts/plot_tree.py @@ -70,7 +70,7 @@ def ifhasthenget(obj, attr): def collapse_low_freq(tree, fk, cl_except): for node in tree.traverse(): - if node.is_leaf() is False and hasattr(node, 'cl') is False: + if node.is_leaf() is False and hasattr(node, "cl") is False: for child in node.get_children(): # Skip those node to keep: if has_true_attrlist(child, cl_except): @@ -92,7 +92,7 @@ def has_true_attrlist(node, attrlist): def keep_lineage(first_node, node, fk, cl_except): - ''' + """ Search for a lineage decending from a node that is longer than a given threshold, max_linlen. If node exception is meeet in cl_except e.g. a feature that should never be collapsed @@ -109,7 +109,7 @@ def keep_lineage(first_node, node, fk, cl_except): ---------* <--------------> linlen includes 2 nodes - ''' + """ if has_true_attrlist(node, cl_except): return True if node.is_leaf() and first_node is not node: @@ -137,7 +137,8 @@ def keep_lineage(first_node, node, fk, cl_except): def read_plot_config(fnam): import json - ''' + + """ ### File format is JSON ### { "frequency": "LNobs", @@ -159,46 +160,60 @@ def read_plot_config(fnam): ] ] } - ''' - allowed_keys = ['node_color', 'node_shape', 'frequency', 'node_label', 'node_size', 'no_default', 'prune_max_branch_length', 'collapse_low_freq', 'collapse_syn'] + """ + allowed_keys = [ + "node_color", + "node_shape", + "frequency", + "node_label", + "node_size", + "no_default", + "prune_max_branch_length", + "collapse_low_freq", + "collapse_syn", + ] with open(fnam) as json_data: d = json.load(json_data) not_found = [k for k in d if k not in allowed_keys] if not_found: - raise RuntimeError('Key not found in plot config: [{0}]\nPossible keys: [{1}]' - .format(", ".join(str(i) for i in not_found), ", ".join(str(i) for i in allowed_keys))) + raise RuntimeError( + "Key not found in plot config: [{0}]\nPossible keys: [{1}]".format( + ", ".join(str(i) for i in not_found), + ", ".join(str(i) for i in allowed_keys), + ) + ) return d def read_tree_stats(fnam): - ''' + """ Read a comma separated table into a dict of dicts. First line will be interpretted as the header with column names, the following lines will be interpretted as entries with the first element being the node name to map back to. - ''' + """ with open(fnam) as fh: lines = fh.readlines() lines[:] = [line.strip() for line in lines] - features = lines[0].split(',') + features = lines[0].split(",") lines.pop(0) tstat = dict() for line in lines: - cols = line.split(',') - assert(cols[0] not in tstat) - tstat[cols[0]] = {features[j+1]: try_cast(c) for j, c in enumerate(cols[1:])} + cols = line.split(",") + assert cols[0] not in tstat + tstat[cols[0]] = {features[j + 1]: try_cast(c) for j, c in enumerate(cols[1:])} return tstat def hamming_distance(seq1, seq2): - '''Hamming distance between two sequences of equal length''' + """Hamming distance between two sequences of equal length""" return sum(x != y for x, y in zip(seq1, seq2)) def tree_render_minimum(tree): - '''Set the minimum settings on a ete3 tree for rendering a GCtree.''' + """Set the minimum settings on a ete3 tree for rendering a GCtree.""" ts = TreeStyle() ts.show_leaf_name = False ts.rotation = 90 @@ -208,10 +223,11 @@ def tree_render_minimum(tree): def tree_render_default(tree, frame=None): - '''Set the default settings on a ete3 tree for rendering a GCtree.''' + """Set the default settings on a ete3 tree for rendering a GCtree.""" import sys from Bio.Seq import Seq import scipy + # Set the minimum requirements: tree, ts = tree_render_minimum(tree) # Then add the defaults: @@ -220,44 +236,58 @@ def tree_render_default(tree, frame=None): # Set node size according the allele frequency: small_node = 5 if node.frequency == 0: - nstyle['size'] = small_node - nstyle['fgcolor'] = 'grey' + nstyle["size"] = small_node + nstyle["fgcolor"] = "grey" else: - nstyle['size'] = small_node*scipy.sqrt(node.frequency) + small_node - nstyle['fgcolor'] = 'black' + nstyle["size"] = small_node * scipy.sqrt(node.frequency) + small_node + nstyle["fgcolor"] = "black" # Mark clades with stop codon and distinguish sense/missense mutations: if node.up is not None: - if set(node.sequence.upper()) == set('ACGT'): + if set(node.sequence.upper()) == set("ACGT"): if frame is not None: - aa = Seq(node.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() - aa_parent = Seq(node.up.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() + aa = Seq( + node.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + aa_parent = Seq( + node.up.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() nonsyn = hamming_distance(aa, aa_parent) - if '*' in aa: - nstyle['bgcolor'] = 'red' + if "*" in aa: + nstyle["bgcolor"] = "red" if nonsyn > 0: - nstyle['hz_line_color'] = 'black' - nstyle['hz_line_width'] = nonsyn + nstyle["hz_line_color"] = "black" + nstyle["hz_line_width"] = nonsyn else: - nstyle['hz_line_type'] = 1 + nstyle["hz_line_type"] = 1 node.set_style(nstyle) return tree, ts def tree_render_user(tree, frame=None, tree_features=None, namecolor=None): - ''' + """ Base function to add rendering attributes to an ete3 tree. The function can plot tree is default mode and/or take user input. - ''' + """ from Bio.Seq import Seq import scipy if tree_features is None: # No user defined tree features return tree_render_default(tree, frame=frame) - elif 'no_default' in tree_features and tree_features['no_default']: + elif "no_default" in tree_features and tree_features["no_default"]: tree, ts = tree_render_minimum(tree, frame=frame) no_default = True else: @@ -268,54 +298,75 @@ def tree_render_user(tree, frame=None, tree_features=None, namecolor=None): nstyle = NodeStyle() small_node = 5 - if not no_default and node.frequency == 0 and not hasattr(node, 'cl'): - nstyle['size'] = small_node - nstyle['fgcolor'] = 'grey' - elif not no_default and hasattr(node, 'cl'): - nstyle['size'] = 2 - nstyle['fgcolor'] = 'mediumblue' + if not no_default and node.frequency == 0 and not hasattr(node, "cl"): + nstyle["size"] = small_node + nstyle["fgcolor"] = "grey" + elif not no_default and hasattr(node, "cl"): + nstyle["size"] = 2 + nstyle["fgcolor"] = "mediumblue" else: # Assign node size: - if 'node_size' in tree_features and ifhasthenget(node, tree_features['node_size']): - nstyle['size'] = small_node*scipy.sqrt(getattr(node, tree_features['node_size'])) + small_node - nstyle['fgcolor'] = 'black' # Keep default color unless otherwise is specified below + if "node_size" in tree_features and ifhasthenget( + node, tree_features["node_size"] + ): + nstyle["size"] = ( + small_node * scipy.sqrt(getattr(node, tree_features["node_size"])) + + small_node + ) + nstyle[ + "fgcolor" + ] = "black" # Keep default color unless otherwise is specified below # Assign user defined colors: - if 'node_color' in tree_features: - for t in tree_features['node_color']: + if "node_color" in tree_features: + for t in tree_features["node_color"]: node_attr = ifhasthenget(node, t[0]) if node_attr: - nstyle['fgcolor'] = t[1] - if nstyle['size'] < small_node: - nstyle['size'] = small_node + nstyle["fgcolor"] = t[1] + if nstyle["size"] < small_node: + nstyle["size"] = small_node if namecolor is not None and node.name in namecolor: # print(node.name) - nstyle['fgcolor'] = 'DarkGreen' + nstyle["fgcolor"] = "DarkGreen" - if 'node_shape' in tree_features: - for t in tree_features['node_shape']: + if "node_shape" in tree_features: + for t in tree_features["node_shape"]: node_attr = ifhasthenget(node, t[0]) if node_attr: # Resize the area of the square to match a circle: - if t[1] == 'square': - nstyle['size'] = scipy.sqrt(scipy.pi) * nstyle['size'] / 2 - nstyle['shape'] = t[1] + if t[1] == "square": + nstyle["size"] = scipy.sqrt(scipy.pi) * nstyle["size"] / 2 + nstyle["shape"] = t[1] # Mark clades with stop codon and distinguish sense/missense mutations: if node.up is not None: - if set(node.sequence.upper()) == set('ACGT'): + if set(node.sequence.upper()) == set("ACGT"): if frame is not None: - aa = Seq(node.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() - aa_parent = Seq(node.up.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() + aa = Seq( + node.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + aa_parent = Seq( + node.up.sequence[ + (frame - 1) : ( + frame + - 1 + + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() nonsyn = hamming_distance(aa, aa_parent) - if '*' in aa: - nstyle['bgcolor'] = 'red' + if "*" in aa: + nstyle["bgcolor"] = "red" if nonsyn > 0: - nstyle['hz_line_color'] = 'black' - nstyle['hz_line_width'] = nonsyn + nstyle["hz_line_color"] = "black" + nstyle["hz_line_width"] = nonsyn else: - nstyle['hz_line_type'] = 1 + nstyle["hz_line_type"] = 1 node.set_style(nstyle) @@ -323,34 +374,41 @@ def tree_render_user(tree, frame=None, tree_features=None, namecolor=None): def my_layout(node): N = None # If user specified labels are specified add these: - if 'node_label' in tree_features: - for t in tree_features['node_label']: + if "node_label" in tree_features: + for t in tree_features["node_label"]: node_attr = ifhasthenget(node, t) if node_attr and to_string(node_attr): - if t == 'name' and hasattr(node, 'cl'): + if t == "name" and hasattr(node, "cl"): continue textface = to_string(node_attr) - N = TextFace(textface, fsize=12, fgcolor='black') - if 'e-' in textface and to_float(textface): # Stupid exception because ete3 rendering doesn't understand scientific notation - N = TextFace('%2.1e ' % to_float(textface), fsize=12, fgcolor='black') + N = TextFace(textface, fsize=12, fgcolor="black") + if "e-" in textface and to_float( + textface + ): # Stupid exception because ete3 rendering doesn't understand scientific notation + N = TextFace( + "%2.1e " % to_float(textface), fsize=12, fgcolor="black" + ) # Add default values: - elif not no_default and node.frequency > 1 and not hasattr(node, 'cl'): - N = TextFace(node.frequency, fsize=12, fgcolor='black') # Default: use node frequency as TextFace + elif not no_default and node.frequency > 1 and not hasattr(node, "cl"): + N = TextFace( + node.frequency, fsize=12, fgcolor="black" + ) # Default: use node frequency as TextFace if N is not None: N.rotation = -90 - faces.add_face_to_node(N, node, 0, position='branch-top') + faces.add_face_to_node(N, node, 0, position="branch-top") + ts.layout_fn = my_layout return tree, ts def prune_long_branches(tree, cutlength): - ''' + """ Detach the whole decending clade if a branch length is encountered above a given cutlength. - ''' + """ for node in tree.traverse(): if node.dist > cutlength: node.detach() @@ -358,50 +416,87 @@ def prune_long_branches(tree, cutlength): def update_after_collapse(node_up, node, tree_features=None): - ''' + """ Update the feature according to its type and specifications in the tree_features dict - ''' + """ feature_set = node_up.features.union(node.features) - feature_set.remove('dist') - feature_set.remove('name') + feature_set.remove("dist") + feature_set.remove("name") for feature in feature_set: if hasattr(node, feature) and not hasattr(node_up, feature): setattr(node_up, feature, getattr(node, feature)) - elif hasattr(node, feature) and hasattr(node_up, feature) and getattr(node_up, feature) == '': + elif ( + hasattr(node, feature) + and hasattr(node_up, feature) + and getattr(node_up, feature) == "" + ): setattr(node_up, feature, getattr(node, feature)) - elif hasattr(node, feature) and hasattr(node_up, feature) and getattr(node, feature) == '': + elif ( + hasattr(node, feature) + and hasattr(node_up, feature) + and getattr(node, feature) == "" + ): pass elif hasattr(node, feature) and hasattr(node_up, feature): - if is_number(getattr(node, feature)) and feature in tree_features['collapse_syn']: - if tree_features['collapse_syn'][feature] == 'sum': - setattr(node_up, feature, (getattr(node, feature) + getattr(node_up, feature))) - elif tree_features['collapse_syn'][feature] == 'mean': - setattr(node_up, feature, (getattr(node, feature) + getattr(node_up, feature))/2) + if ( + is_number(getattr(node, feature)) + and feature in tree_features["collapse_syn"] + ): + if tree_features["collapse_syn"][feature] == "sum": + setattr( + node_up, + feature, + (getattr(node, feature) + getattr(node_up, feature)), + ) + elif tree_features["collapse_syn"][feature] == "mean": + setattr( + node_up, + feature, + (getattr(node, feature) + getattr(node_up, feature)) / 2, + ) else: - raise Exception('Do not know this option:', tree_features['collapse_syn'][feature]) + raise Exception( + "Do not know this option:", + tree_features["collapse_syn"][feature], + ) elif is_number(getattr(node, feature)): - setattr(node_up, feature, (getattr(node, feature) + getattr(node_up, feature))) + setattr( + node_up, + feature, + (getattr(node, feature) + getattr(node_up, feature)), + ) else: pass return node_up def collapse_syn(tree, frame=None, tree_features=None): - ''' + """ Recalculate the branch lengths as hamming distance between amino acid sequences. Then collapse all branches with zero length and update the features by either taking the sum of the mean, if the feature is a number, if the feature is a string then just keep the parent feature. - ''' + """ from Bio.Seq import Seq + tree.dist = 0 # no branch above root for node in tree.iter_descendants(): - aa = Seq(node.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() - aa_parent = Seq(node.up.sequence[(frame-1):(frame-1+(3*(((len(node.sequence)-(frame-1))//3))))] - ).translate() + aa = Seq( + node.sequence[ + (frame - 1) : ( + frame - 1 + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() + aa_parent = Seq( + node.up.sequence[ + (frame - 1) : ( + frame - 1 + (3 * (((len(node.sequence) - (frame - 1)) // 3))) + ) + ] + ).translate() node.dist = hamming_distance(aa, aa_parent) for node in tree.get_descendants(): @@ -414,22 +509,25 @@ def collapse_syn(tree, frame=None, tree_features=None): return tree -def make_tree(tree, outfile, tree_features_file=None, statsfile=None, frame=None, namecolor=None): +def make_tree( + tree, outfile, tree_features_file=None, statsfile=None, frame=None, namecolor=None +): try: import cPickle as pickle except: import pickle from gctree import CollapsedForest, CollapsedTree - ''' + + """ This function wraps the rendering of an ete3 tree with custom user options and the adding to the default GCtree rendering. - ''' + """ if tree_features_file is not None and statsfile is not None: default_plot = False elif tree_features_file is None and statsfile is None: default_plot = True else: - raise RuntimeError('Both tree_features_file and statsfile must be provided.') + raise RuntimeError("Both tree_features_file and statsfile must be provided.") # No features, no fun, just render the default tree: if default_plot is True: tree, ts = tree_render_user(tree, frame=frame) @@ -447,58 +545,118 @@ def make_tree(tree, outfile, tree_features_file=None, statsfile=None, frame=None node.add_features(**tstat[node.name]) # Prune of clades with very long branch lengths: - if 'prune_max_branch_length' in tree_features and to_float(tree_features['prune_max_branch_length']): - tree = prune_long_branches(tree, to_float(tree_features['prune_max_branch_length'])) + if "prune_max_branch_length" in tree_features and to_float( + tree_features["prune_max_branch_length"] + ): + tree = prune_long_branches( + tree, to_float(tree_features["prune_max_branch_length"]) + ) # Collapse synonymous mutations upwards into single nodes: - if frame is not None and 'collapse_syn' in tree_features: + if frame is not None and "collapse_syn" in tree_features: tree = collapse_syn(tree, frame=frame, tree_features=tree_features) - elif 'collapse_syn' in tree_features and frame is None: - raise Exception('Cannot collapse synonymous mutations when frame parameter is not specified.') + elif "collapse_syn" in tree_features and frame is None: + raise Exception( + "Cannot collapse synonymous mutations when frame parameter is not specified." + ) # Collapse tree nodes with low frequencies: - if 'collapse_low_freq' in tree_features: + if "collapse_low_freq" in tree_features: try: - f = int(tree_features['collapse_low_freq']['f']) - k = int(tree_features['collapse_low_freq']['k']) - if 'except' in tree_features['collapse_low_freq']: - cl_except = list(tree_features['collapse_low_freq']['except']) + f = int(tree_features["collapse_low_freq"]["f"]) + k = int(tree_features["collapse_low_freq"]["k"]) + if "except" in tree_features["collapse_low_freq"]: + cl_except = list(tree_features["collapse_low_freq"]["except"]) else: cl_except = list() except Exception as e: - raise RuntimeError('Could not cast f and k to integers, or maybe they are not defined at all?:', e) + raise RuntimeError( + "Could not cast f and k to integers, or maybe they are not defined at all?:", + e, + ) tree = collapse_low_freq(tree, [f, k], cl_except) - tree, ts = tree_render_user(tree, frame=frame, tree_features=tree_features, namecolor=namecolor) + tree, ts = tree_render_user( + tree, frame=frame, tree_features=tree_features, namecolor=namecolor + ) tree.render(outfile, tree_style=ts) collapsed_tree = CollapsedTree(tree=tree) forest = CollapsedForest(forest=[collapsed_tree]) - with open(outfile[:-4] + '.p', 'wb') as f: + with open(outfile[:-4] + ".p", "wb") as f: pickle.dump(forest, f) def main(): import sys, os - sys.path.append(os.path.abspath('/'.join(os.path.realpath(__file__).split('/')[:-2]) + "/bin")) + + sys.path.append( + os.path.abspath("/".join(os.path.realpath(__file__).split("/")[:-2]) + "/bin") + ) import argparse import pickle from gctree import CollapsedTree - parser = argparse.ArgumentParser(description='Custom plotting of a GCtree output tree.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument("--forrest_file", required=True, type=str, dest="forrest_file", help="Output pickled forrest file from GCtree.") - parser.add_argument("--tree_numb", required=True, type=int, dest="tree_numb", metavar="INT", help="Index specifying which tree to pick from the forrest.") - parser.add_argument("--outfile", required=True, type=str, dest="outfile", metavar="FILENAME", help="Output tree filename.") - parser.add_argument("--frame", type=int, dest="frame", help="Which frame is the node sequences in? If unspecified frame is not enforced and stop codons are allowed.") - parser.add_argument("--config", type=str, dest="config", metavar="JSON", help="JSON formatted file that specifies which features to plot and how.") - parser.add_argument("--statsfile", type=str, dest="statsfile", help="Comman separated list of features linked to the node name.") + parser = argparse.ArgumentParser( + description="Custom plotting of a GCtree output tree.", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser.add_argument( + "--forrest_file", + required=True, + type=str, + dest="forrest_file", + help="Output pickled forrest file from GCtree.", + ) + parser.add_argument( + "--tree_numb", + required=True, + type=int, + dest="tree_numb", + metavar="INT", + help="Index specifying which tree to pick from the forrest.", + ) + parser.add_argument( + "--outfile", + required=True, + type=str, + dest="outfile", + metavar="FILENAME", + help="Output tree filename.", + ) + parser.add_argument( + "--frame", + type=int, + dest="frame", + help="Which frame is the node sequences in? If unspecified frame is not enforced and stop codons are allowed.", + ) + parser.add_argument( + "--config", + type=str, + dest="config", + metavar="JSON", + help="JSON formatted file that specifies which features to plot and how.", + ) + parser.add_argument( + "--statsfile", + type=str, + dest="statsfile", + help="Comman separated list of features linked to the node name.", + ) args = parser.parse_args() with open(args.forrest_file) as forest_fh: forest = pickle.load(forest_fh) - collapsed_tree = CollapsedTree(tree=forest.forest[args.tree_numb].tree, frame=args.frame) - make_tree(collapsed_tree.tree, args.outfile, tree_features_file=args.config, statsfile=args.statsfile, frame=args.frame) - - -if __name__ == '__main__': + collapsed_tree = CollapsedTree( + tree=forest.forest[args.tree_numb].tree, frame=args.frame + ) + make_tree( + collapsed_tree.tree, + args.outfile, + tree_features_file=args.config, + statsfile=args.statsfile, + frame=args.frame, + ) + + +if __name__ == "__main__": main() diff --git a/scripts/simstatagg.py b/scripts/simstatagg.py index 37f3d9a4..f80fea65 100755 --- a/scripts/simstatagg.py +++ b/scripts/simstatagg.py @@ -1,9 +1,9 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" aggregation plots of metrics from several simulation runs with same parameters -''' +""" from matplotlib import pyplot as plt import pandas as pd @@ -11,65 +11,142 @@ from deduplicate import fasta_parse from gctree.utils import hamming_distance import seaborn as sns + sns.set(style="white", color_codes=True) -parser = argparse.ArgumentParser(description='aggregate validation of repeated runs with same parameters') -parser.add_argument('input', type=str, nargs='+', help='gctree.simulation.stats.tsv files') -parser.add_argument('--outbase', type=str, help='output file base name') -parser.add_argument('--experimental', type=str, help='experimental .fasta (like Tas et al. data)', default=None) +parser = argparse.ArgumentParser( + description="aggregate validation of repeated runs with same parameters" +) +parser.add_argument( + "input", type=str, nargs="+", help="gctree.simulation.stats.tsv files" +) +parser.add_argument("--outbase", type=str, help="output file base name") +parser.add_argument( + "--experimental", + type=str, + help="experimental .fasta (like Tas et al. data)", + default=None, +) args = parser.parse_args() for i, fname in enumerate(args.input): - df = pd.read_csv(fname, sep='\t') - df['simulation'] = i + 1 + df = pd.read_csv(fname, sep="\t") + df["simulation"] = i + 1 if i == 0: aggdat = df else: aggdat = aggdat.append(df, ignore_index=True) -sims = set(aggdat['simulation']) +sims = set(aggdat["simulation"]) nsims = len(sims) if args.experimental is not None: - new_aln, counts = fasta_parse(args.experimental, naive='GL', converter='tas')[:2] - exp_dict = {seq.id:str(seq.seq) for seq in new_aln} - naive_id = [seq for seq in exp_dict if 'gl' in seq][0] - frequency, distance_from_naive, degree = zip(*[(counts[seq], - hamming_distance(exp_dict[seq], exp_dict[naive_id]), - sum(hamming_distance(exp_dict[seq], exp_dict[seq2]) == 1 for seq2 in exp_dict if seq2 is not seq and counts[seq2] != 0)) - for seq in exp_dict if counts[seq] != 0]) - exp_stats = pd.DataFrame({'genotype abundance':frequency, - 'Hamming distance to root genotype':distance_from_naive, - 'Hamming neighbor genotypes':degree}) + new_aln, counts = fasta_parse(args.experimental, naive="GL", converter="tas")[:2] + exp_dict = {seq.id: str(seq.seq) for seq in new_aln} + naive_id = [seq for seq in exp_dict if "gl" in seq][0] + frequency, distance_from_naive, degree = zip( + *[ + ( + counts[seq], + hamming_distance(exp_dict[seq], exp_dict[naive_id]), + sum( + hamming_distance(exp_dict[seq], exp_dict[seq2]) == 1 + for seq2 in exp_dict + if seq2 is not seq and counts[seq2] != 0 + ), + ) + for seq in exp_dict + if counts[seq] != 0 + ] + ) + exp_stats = pd.DataFrame( + { + "genotype abundance": frequency, + "Hamming distance to root genotype": distance_from_naive, + "Hamming neighbor genotypes": degree, + } + ) # bw = .3 -alpha = min([.9, 20/nsims]) -bins = range(max(aggdat['Hamming distance to root genotype'].max(), exp_stats['Hamming distance to root genotype'].max() if args.experimental is not None else 0) + 2) +alpha = min([0.9, 20 / nsims]) +bins = range( + max( + aggdat["Hamming distance to root genotype"].max(), + exp_stats["Hamming distance to root genotype"].max() + if args.experimental is not None + else 0, + ) + + 2 +) plt.figure(figsize=(6, 3)) plt.subplot(1, 2, 1) -for simulation, simulation_aggdat in aggdat.groupby('simulation'): - sns.distplot(simulation_aggdat['Hamming distance to root genotype'], bins=bins, kde=False, hist_kws={'histtype':'step', 'cumulative':True, 'alpha':alpha, 'lw':1}) +for simulation, simulation_aggdat in aggdat.groupby("simulation"): + sns.distplot( + simulation_aggdat["Hamming distance to root genotype"], + bins=bins, + kde=False, + hist_kws={"histtype": "step", "cumulative": True, "alpha": alpha, "lw": 1}, + ) if args.experimental is not None: - sns.distplot(exp_stats['Hamming distance to root genotype'], bins=bins, kde=False, hist_kws={'histtype':'step', 'cumulative':True, 'color':'k', 'lw':3, 'alpha':.8}) -plt.xlabel('Hamming distance to root genotype') + sns.distplot( + exp_stats["Hamming distance to root genotype"], + bins=bins, + kde=False, + hist_kws={ + "histtype": "step", + "cumulative": True, + "color": "k", + "lw": 3, + "alpha": 0.8, + }, + ) +plt.xlabel("Hamming distance to root genotype") plt.xlim([0, bins[-1]]) -plt.ylabel('observed genotypes') +plt.ylabel("observed genotypes") plt.tight_layout() plt.subplot(1, 2, 2) -xbins = range(max(aggdat['genotype abundance'].max(), exp_stats['genotype abundance'].max() if args.experimental is not None else 0) + 2) -ybins = range(max(aggdat['Hamming neighbor genotypes'].max(), exp_stats['Hamming neighbor genotypes'].max() if args.experimental is not None else 0) + 2) -for simulation, simulation_aggdat in aggdat.groupby('simulation'): - plt.plot(simulation_aggdat['genotype abundance'], simulation_aggdat['Hamming neighbor genotypes'], '+', mew=1, alpha=alpha/2) +xbins = range( + max( + aggdat["genotype abundance"].max(), + exp_stats["genotype abundance"].max() if args.experimental is not None else 0, + ) + + 2 +) +ybins = range( + max( + aggdat["Hamming neighbor genotypes"].max(), + exp_stats["Hamming neighbor genotypes"].max() + if args.experimental is not None + else 0, + ) + + 2 +) +for simulation, simulation_aggdat in aggdat.groupby("simulation"): + plt.plot( + simulation_aggdat["genotype abundance"], + simulation_aggdat["Hamming neighbor genotypes"], + "+", + mew=1, + alpha=alpha / 2, + ) if args.experimental is not None: - plt.plot(exp_stats['genotype abundance'], exp_stats['Hamming neighbor genotypes'], 'o', mew=2, alpha=.8, markerfacecolor='none', color='k') -plt.xlabel('genotype abundance') -plt.ylabel('Hamming neighbor genotypes') -plt.xscale('symlog') -plt.yscale('symlog') -plt.xlim([.9, None]) -plt.ylim([-.1, None]) + plt.plot( + exp_stats["genotype abundance"], + exp_stats["Hamming neighbor genotypes"], + "o", + mew=2, + alpha=0.8, + markerfacecolor="none", + color="k", + ) +plt.xlabel("genotype abundance") +plt.ylabel("Hamming neighbor genotypes") +plt.xscale("symlog") +plt.yscale("symlog") +plt.xlim([0.9, None]) +plt.ylim([-0.1, None]) plt.tight_layout() -plt.savefig(args.outbase+'.pdf') +plt.savefig(args.outbase + ".pdf") diff --git a/scripts/summary_stats.py b/scripts/summary_stats.py index 26340ad8..6eeaef60 100755 --- a/scripts/summary_stats.py +++ b/scripts/summary_stats.py @@ -1,123 +1,197 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" summary stats of the seq data going into tree inference for CFT -''' +""" from deduplicate import fasta_parse from matplotlib import pyplot as plt import pandas as pd import argparse import seaborn as sns + sns.set(style="white", color_codes=True) from gctree.utils import hamming_distance def main(): - parser = argparse.ArgumentParser(description='summary statistics of pre-tree data') - parser.add_argument('input', type=str, nargs='+', help='simulated fasta files') - parser.add_argument('--experimental', type=str, nargs='*', help='experimental fasta files') - parser.add_argument('--outbase', type=str, help='output file base name') - parser.add_argument('--naiveIDexp', type=str, default='naive0', help='naive sequence ID') + parser = argparse.ArgumentParser(description="summary statistics of pre-tree data") + parser.add_argument("input", type=str, nargs="+", help="simulated fasta files") + parser.add_argument( + "--experimental", type=str, nargs="*", help="experimental fasta files" + ) + parser.add_argument("--outbase", type=str, help="output file base name") + parser.add_argument( + "--naiveIDexp", type=str, default="naive0", help="naive sequence ID" + ) args = parser.parse_args() # simulations - naiveID = 'naive' + naiveID = "naive" for i, fname in enumerate(args.input): print(fname) - seqs = {seq.id:str(seq.seq) for seq in fasta_parse(fname, 'naive')[0]} + seqs = {seq.id: str(seq.seq) for seq in fasta_parse(fname, "naive")[0]} nseqs = len(seqs) - if nseqs <= 2: continue - - distance_from_naive, degree = zip(*[(hamming_distance(seqs[seqid], seqs[naiveID]), - min(hamming_distance(seqs[seqid], seqs[seqid2]) for seqid2 in seqs if seqid2 != naiveID and seqid2 != seqid)) - for seqid in seqs if seqid != naiveID]) - df = pd.DataFrame({'distance to naive sequence':distance_from_naive, - 'nearest neighbor distance':degree}) - df['data set'] = i + 1 + if nseqs <= 2: + continue + + distance_from_naive, degree = zip( + *[ + ( + hamming_distance(seqs[seqid], seqs[naiveID]), + min( + hamming_distance(seqs[seqid], seqs[seqid2]) + for seqid2 in seqs + if seqid2 != naiveID and seqid2 != seqid + ), + ) + for seqid in seqs + if seqid != naiveID + ] + ) + df = pd.DataFrame( + { + "distance to naive sequence": distance_from_naive, + "nearest neighbor distance": degree, + } + ) + df["data set"] = i + 1 if i == 0: aggdat = df else: aggdat = aggdat.append(df, ignore_index=True) - ndatasets = len(set(aggdat['data set'])) + ndatasets = len(set(aggdat["data set"])) # experimental if args.experimental is not None: for i, fname in enumerate(args.experimental): print(fname) - seqs = {seq.id:str(seq.seq) for seq in fasta_parse(fname, args.naiveIDexp)[0]} + seqs = { + seq.id: str(seq.seq) for seq in fasta_parse(fname, args.naiveIDexp)[0] + } nseqs = len(seqs) - if nseqs <= 2: continue - - distance_from_naive, degree = zip(*[(hamming_distance(seqs[seqid], seqs[args.naiveIDexp]), - min(hamming_distance(seqs[seqid], seqs[seqid2]) for seqid2 in seqs if seqid2 != args.naiveIDexp and seqid2 != seqid)) - for seqid in seqs if seqid != args.naiveIDexp]) - df = pd.DataFrame({'distance to naive sequence':distance_from_naive, - 'nearest neighbor distance':degree}) - df['data set'] = i + 1 + if nseqs <= 2: + continue + + distance_from_naive, degree = zip( + *[ + ( + hamming_distance(seqs[seqid], seqs[args.naiveIDexp]), + min( + hamming_distance(seqs[seqid], seqs[seqid2]) + for seqid2 in seqs + if seqid2 != args.naiveIDexp and seqid2 != seqid + ), + ) + for seqid in seqs + if seqid != args.naiveIDexp + ] + ) + df = pd.DataFrame( + { + "distance to naive sequence": distance_from_naive, + "nearest neighbor distance": degree, + } + ) + df["data set"] = i + 1 if i == 0: aggdat_exp = df else: aggdat_exp = aggdat_exp.append(df, ignore_index=True) - ndatasets += len(set(aggdat_exp['data set'])) + ndatasets += len(set(aggdat_exp["data set"])) # bw = .3 - alpha = min([.9, 20/ndatasets]) - bins = range(max(aggdat['distance to naive sequence'].max(), aggdat_exp['distance to naive sequence'].max() if args.experimental is not None else 0) + 2) + alpha = min([0.9, 20 / ndatasets]) + bins = range( + max( + aggdat["distance to naive sequence"].max(), + aggdat_exp["distance to naive sequence"].max() + if args.experimental is not None + else 0, + ) + + 2 + ) plt.figure(figsize=(6, 3)) plt.subplot(1, 2, 1) ct = 0 - for dataset, dataset_aggdat in aggdat.groupby('data set'): + for dataset, dataset_aggdat in aggdat.groupby("data set"): ct += 1 - sns.distplot(dataset_aggdat['distance to naive sequence'], - bins=bins, - kde=False, - color='gray', - hist_kws={'histtype':'step', 'cumulative':True, 'alpha':alpha, 'lw':1}) + sns.distplot( + dataset_aggdat["distance to naive sequence"], + bins=bins, + kde=False, + color="gray", + hist_kws={"histtype": "step", "cumulative": True, "alpha": alpha, "lw": 1}, + ) if args.experimental is not None: - for dataset, dataset_aggdat in aggdat_exp.groupby('data set'): + for dataset, dataset_aggdat in aggdat_exp.groupby("data set"): ct += 1 - sns.distplot(dataset_aggdat['distance to naive sequence'], - bins=bins, - kde=False, - color='black', - hist_kws={'histtype':'step', 'cumulative':True, 'alpha':.5, 'lw':3}) - plt.xlabel('distance to naive sequence') + sns.distplot( + dataset_aggdat["distance to naive sequence"], + bins=bins, + kde=False, + color="black", + hist_kws={ + "histtype": "step", + "cumulative": True, + "alpha": 0.5, + "lw": 3, + }, + ) + plt.xlabel("distance to naive sequence") plt.xlim([0, bins[-1]]) - plt.ylabel('observed sequences') + plt.ylabel("observed sequences") plt.tight_layout() - bins = range(max(aggdat['nearest neighbor distance'].max(), aggdat_exp['nearest neighbor distance'].max() if args.experimental is not None else 0) + 2) + bins = range( + max( + aggdat["nearest neighbor distance"].max(), + aggdat_exp["nearest neighbor distance"].max() + if args.experimental is not None + else 0, + ) + + 2 + ) plt.subplot(1, 2, 2) ct = 0 - for dataset, dataset_aggdat in aggdat.groupby('data set'): + for dataset, dataset_aggdat in aggdat.groupby("data set"): ct += 1 - sns.distplot(dataset_aggdat['nearest neighbor distance'], - bins=bins, - kde=False, - color='gray', - hist_kws={'histtype':'step', 'cumulative':True, 'alpha':alpha, 'lw':1}) + sns.distplot( + dataset_aggdat["nearest neighbor distance"], + bins=bins, + kde=False, + color="gray", + hist_kws={"histtype": "step", "cumulative": True, "alpha": alpha, "lw": 1}, + ) if args.experimental is not None: - for dataset, dataset_aggdat in aggdat_exp.groupby('data set'): + for dataset, dataset_aggdat in aggdat_exp.groupby("data set"): ct += 1 - sns.distplot(dataset_aggdat['nearest neighbor distance'], - bins=bins, - kde=False, - color='black', - hist_kws={'histtype':'step', 'cumulative':True, 'alpha':.5, 'lw':3}) - plt.xlabel('nearest neighbor distance') + sns.distplot( + dataset_aggdat["nearest neighbor distance"], + bins=bins, + kde=False, + color="black", + hist_kws={ + "histtype": "step", + "cumulative": True, + "alpha": 0.5, + "lw": 3, + }, + ) + plt.xlabel("nearest neighbor distance") plt.xlim([0, bins[-1]]) - plt.ylabel('') + plt.ylabel("") plt.tight_layout() - plt.savefig(args.outbase+'.pdf') + plt.savefig(args.outbase + ".pdf") + -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/tree_functions.py b/scripts/tree_functions.py index 802bc9c3..b6d8597d 100755 --- a/scripts/tree_functions.py +++ b/scripts/tree_functions.py @@ -3,7 +3,7 @@ def lineage_length_bigger_than(first_node, node, max_linlen): - ''' + """ Search for a lineage decending from a node that is longer than a given threshold, max_linlen. Terminate is such a lineage is found, that is: @@ -18,7 +18,7 @@ def lineage_length_bigger_than(first_node, node, max_linlen): ---------* <-------------> linlen includes 2 nodes - ''' + """ if node.is_leaf() and first_node is not node: linlen = 1 while True: diff --git a/scripts/validaggreg.py b/scripts/validaggreg.py index afe6c7d6..74dba00a 100755 --- a/scripts/validaggreg.py +++ b/scripts/validaggreg.py @@ -1,135 +1,283 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" aggregation plots of validation output from several simulation/validation runs -''' +""" from matplotlib import pyplot as plt import pandas as pd import argparse import seaborn as sns + sns.set(style="white", color_codes=True) from scipy.stats import mannwhitneyu from itertools import cycle -parser = argparse.ArgumentParser(description='aggregate validation of repeated runs with same parameters') -parser.add_argument('input', type=str, nargs='+', help='gctree.validation.tsv files') -parser.add_argument('--outbase', type=str, help='output file base name') -parser.add_argument('--allmetrics', action='store_true', default=False, help='use validation.tsv files containing other metrics') +parser = argparse.ArgumentParser( + description="aggregate validation of repeated runs with same parameters" +) +parser.add_argument("input", type=str, nargs="+", help="gctree.validation.tsv files") +parser.add_argument("--outbase", type=str, help="output file base name") +parser.add_argument( + "--allmetrics", + action="store_true", + default=False, + help="use validation.tsv files containing other metrics", +) args = parser.parse_args() # aggdat = pd.DataFrame(columns=('parsimony forest size', 'mean allele frequency', 'mean branch length', 'MRCA distance to true tree', 'RF distance to true tree', 'trees with MRCA less than or equal to optimal tree')) -aggdat = pd.DataFrame(columns=('simulations ranked by parsimony degeneracy', 'parsimony forest size', 'MRCA distance to true tree', 'RF distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree', 'log-likelihood', 'ismle')) +aggdat = pd.DataFrame( + columns=( + "simulations ranked by parsimony degeneracy", + "parsimony forest size", + "MRCA distance to true tree", + "RF distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + "log-likelihood", + "ismle", + ) +) rowct = 0 frames = [] for fname in args.input: - df = pd.read_csv(fname, sep='\t', usecols=('COAR', 'COAR_fw', 'MRCA', 'RF', 'log-likelihood')) + df = pd.read_csv( + fname, sep="\t", usecols=("COAR", "COAR_fw", "MRCA", "RF", "log-likelihood") + ) frames.append(df) -sorted_indices = sorted(range(len(frames)), key=lambda i: len(frames[i].index), reverse=True) +sorted_indices = sorted( + range(len(frames)), key=lambda i: len(frames[i].index), reverse=True +) frames = [frames[i] for i in sorted_indices] for i, df in enumerate(frames): - mle = df['log-likelihood'].max() + mle = df["log-likelihood"].max() for _, row in df.iterrows(): - aggdat.loc[rowct] = (i, len(df.index), row['MRCA'], row['RF'], row['COAR'], row['COAR_fw'], row['log-likelihood'], row['log-likelihood'] == mle) + aggdat.loc[rowct] = ( + i, + len(df.index), + row["MRCA"], + row["RF"], + row["COAR"], + row["COAR_fw"], + row["log-likelihood"], + row["log-likelihood"] == mle, + ) rowct += 1 -aggdat.to_csv(args.outbase+'.tsv', sep='\t', index=False) +aggdat.to_csv(args.outbase + ".tsv", sep="\t", index=False) if args.allmetrics: - aggdat['method'] = 'parsimony' + aggdat["method"] = "parsimony" - aggdat_other = pd.DataFrame(columns=('simulations ranked by parsimony degeneracy', 'method', 'MRCA distance to true tree', 'RF distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree')) + aggdat_other = pd.DataFrame( + columns=( + "simulations ranked by parsimony degeneracy", + "method", + "MRCA distance to true tree", + "RF distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + ) + ) frames_other = [] - for fname in [f.replace('.gctree', '') for f in args.input]: - df = pd.read_csv(fname, sep='\t', usecols=('method', 'COAR', 'COAR_fw', 'MRCA', 'RF')) + for fname in [f.replace(".gctree", "") for f in args.input]: + df = pd.read_csv( + fname, sep="\t", usecols=("method", "COAR", "COAR_fw", "MRCA", "RF") + ) frames_other.append(df) frames_other = [frames_other[i] for i in sorted_indices] for i, df in enumerate(frames_other): for _, row in df.iterrows(): - aggdat_other.loc[rowct] = (i, row['method'], row['MRCA'], row['RF'], row['COAR'], row['COAR_fw']) + aggdat_other.loc[rowct] = ( + i, + row["method"], + row["MRCA"], + row["RF"], + row["COAR"], + row["COAR_fw"], + ) rowct += 1 - aggdat_other.to_csv(args.outbase+'.other_metrics.tsv', sep='\t', index=False) + aggdat_other.to_csv(args.outbase + ".other_metrics.tsv", sep="\t", index=False) if not args.allmetrics: - aggdat = aggdat[(aggdat['parsimony forest size'] >= 2)] + aggdat = aggdat[(aggdat["parsimony forest size"] >= 2)] if aggdat.shape[0] == 0: - print('no simulations with parsimony degeneracy!') + print("no simulations with parsimony degeneracy!") else: maxy = {} plt.figure(figsize=(7, 12)) - for i, metric in enumerate(('RF distance to true tree', 'MRCA distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree'), 1): - maxy[metric] = 1.1*aggdat[metric].max() + for i, metric in enumerate( + ( + "RF distance to true tree", + "MRCA distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + ), + 1, + ): + maxy[metric] = 1.1 * aggdat[metric].max() plt.subplot(4, 1, i) if not args.allmetrics: - sns.boxplot(x='simulations ranked by parsimony degeneracy', y=metric, data=aggdat[aggdat['ismle']==False], color='gray') - sns.stripplot(x='simulations ranked by parsimony degeneracy', y=metric, color='red', data=aggdat[aggdat['ismle']]) + sns.boxplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + data=aggdat[aggdat["ismle"] == False], + color="gray", + ) + sns.stripplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + color="red", + data=aggdat[aggdat["ismle"]], + ) else: palette = cycle(list(sns.color_palette())) - sns.boxplot(x='simulations ranked by parsimony degeneracy', y=metric, data=aggdat, color=next(palette)) - sns.stripplot(x='simulations ranked by parsimony degeneracy', y=metric, size=4, alpha=.7, jitter=2, color=next(palette), data=aggdat_other[aggdat_other['method'] == 'gctree']) - sns.stripplot(x='simulations ranked by parsimony degeneracy', y=metric, size=4, alpha=.7, jitter=2, color=next(palette), data=aggdat_other[aggdat_other['method'] == 'dnaml']) - sns.stripplot(x='simulations ranked by parsimony degeneracy', y=metric, size=4, alpha=.7, jitter=2, color=next(palette), data=aggdat_other[aggdat_other['method'] == 'igphyml']) - if 'COAR' in metric: + sns.boxplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + data=aggdat, + color=next(palette), + ) + sns.stripplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + size=4, + alpha=0.7, + jitter=2, + color=next(palette), + data=aggdat_other[aggdat_other["method"] == "gctree"], + ) + sns.stripplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + size=4, + alpha=0.7, + jitter=2, + color=next(palette), + data=aggdat_other[aggdat_other["method"] == "dnaml"], + ) + sns.stripplot( + x="simulations ranked by parsimony degeneracy", + y=metric, + size=4, + alpha=0.7, + jitter=2, + color=next(palette), + data=aggdat_other[aggdat_other["method"] == "igphyml"], + ) + if "COAR" in metric: plt.ylim(0, maxy[metric]) else: plt.ylim(0, maxy[metric]) plt.tick_params( - axis='x', # changes apply to the x-axis - which='both', # both major and minor ticks are affected - bottom='off', # ticks along the bottom edge are off - top='off', # ticks along the top edge are off - labelbottom='off') # labels along the bottom edge are off - plt.gca().spines['right'].set_color('none') - plt.gca().spines['top'].set_color('none') + axis="x", # changes apply to the x-axis + which="both", # both major and minor ticks are affected + bottom="off", # ticks along the bottom edge are off + top="off", # ticks along the top edge are off + labelbottom="off", + ) # labels along the bottom edge are off + plt.gca().spines["right"].set_color("none") + plt.gca().spines["top"].set_color("none") plt.tight_layout() - plt.savefig(args.outbase+'.boxplot.pdf') + plt.savefig(args.outbase + ".boxplot.pdf") plt.figure(figsize=(2, 12)) - for i, metric in enumerate(('RF distance to true tree', 'MRCA distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree'), 1): + for i, metric in enumerate( + ( + "RF distance to true tree", + "MRCA distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + ), + 1, + ): plt.subplot(4, 1, i) if not args.allmetrics: - sns.boxplot(x='ismle', y=metric, data=aggdat, palette={False:'gray', True:'red'}, order=(True, False)) + sns.boxplot( + x="ismle", + y=metric, + data=aggdat, + palette={False: "gray", True: "red"}, + order=(True, False), + ) else: - ax = sns.boxplot(x='method', y=metric, data=pd.concat([aggdat, aggdat_other]), order=('parsimony', 'gctree', 'dnaml', 'igphyml')) - if 'COAR' in metric: + ax = sns.boxplot( + x="method", + y=metric, + data=pd.concat([aggdat, aggdat_other]), + order=("parsimony", "gctree", "dnaml", "igphyml"), + ) + if "COAR" in metric: plt.ylim(0, maxy[metric]) else: plt.ylim(0, maxy[metric]) plt.tick_params( - axis='x', # changes apply to the x-axis - which='both', # both major and minor ticks are affected - bottom='off', # ticks along the bottom edge are off - top='off', # ticks along the top edge are off - labelbottom='off') # labels along the bottom edge are off - plt.gca().spines['right'].set_color('none') - plt.gca().spines['top'].set_color('none') - plt.xlabel('aggregated') + axis="x", # changes apply to the x-axis + which="both", # both major and minor ticks are affected + bottom="off", # ticks along the bottom edge are off + top="off", # ticks along the top edge are off + labelbottom="off", + ) # labels along the bottom edge are off + plt.gca().spines["right"].set_color("none") + plt.gca().spines["top"].set_color("none") + plt.xlabel("aggregated") plt.tight_layout() - plt.savefig(args.outbase+'.boxplot_all.pdf') + plt.savefig(args.outbase + ".boxplot_all.pdf") if args.allmetrics: - methods = list(set(aggdat_other['method'])) + methods = list(set(aggdat_other["method"])) nmethods = len(methods) - for metric in ('RF distance to true tree', 'MRCA distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree'): + for metric in ( + "RF distance to true tree", + "MRCA distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + ): for i in range(nmethods): - for j in range(i+1, nmethods): - p = mannwhitneyu(aggdat_other[metric][aggdat_other['method']==methods[i]], aggdat_other[metric][aggdat_other['method']==methods[j]], alternative='two-sided')[1] - print('U test significance ({}, {} vs {}): {}'.format(metric, methods[i], methods[j], p)) - p = mannwhitneyu(aggdat_other[metric][aggdat_other['method']==methods[i]], aggdat[metric], alternative='two-sided')[1] - print('U test significance ({}, {} vs parsimony): {}'.format(metric, methods[i], p)) + for j in range(i + 1, nmethods): + p = mannwhitneyu( + aggdat_other[metric][aggdat_other["method"] == methods[i]], + aggdat_other[metric][aggdat_other["method"] == methods[j]], + alternative="two-sided", + )[1] + print( + "U test significance ({}, {} vs {}): {}".format( + metric, methods[i], methods[j], p + ) + ) + p = mannwhitneyu( + aggdat_other[metric][aggdat_other["method"] == methods[i]], + aggdat[metric], + alternative="two-sided", + )[1] + print( + "U test significance ({}, {} vs parsimony): {}".format( + metric, methods[i], p + ) + ) else: - for metric in ('RF distance to true tree', 'MRCA distance to true tree', 'COAR distance to true tree', 'COAR_fw distance to true tree'): + for metric in ( + "RF distance to true tree", + "MRCA distance to true tree", + "COAR distance to true tree", + "COAR_fw distance to true tree", + ): if len(set(aggdat[metric])) > 1: - p = mannwhitneyu(aggdat[metric][aggdat['ismle']==True], aggdat[metric][aggdat['ismle']==False], alternative='less')[1] - print('U test significance ({}): {}'.format(metric, p)) + p = mannwhitneyu( + aggdat[metric][aggdat["ismle"] == True], + aggdat[metric][aggdat["ismle"] == False], + alternative="less", + )[1] + print("U test significance ({}): {}".format(metric, p)) diff --git a/scripts/validaggreg_compare.py b/scripts/validaggreg_compare.py index 6c1d9e98..86866248 100755 --- a/scripts/validaggreg_compare.py +++ b/scripts/validaggreg_compare.py @@ -1,9 +1,9 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" aggregation plots of validation output from several simulation/validation runs -''' +""" from matplotlib import pyplot as plt import pandas as pd @@ -11,50 +11,81 @@ import seaborn as sns from scipy.stats.stats import pearsonr -parser = argparse.ArgumentParser(description='aggregate validation of repeated runs with same parameters') -parser.add_argument('input', type=str, nargs='+', help='validation.tsv files') -parser.add_argument('--outbase', type=str, help='output file base name') +parser = argparse.ArgumentParser( + description="aggregate validation of repeated runs with same parameters" +) +parser.add_argument("input", type=str, nargs="+", help="validation.tsv files") +parser.add_argument("--outbase", type=str, help="output file base name") args = parser.parse_args() aggdat = pd.DataFrame() for i, fname in enumerate(args.input): - df = pd.read_csv(fname, sep='\t') + df = pd.read_csv(fname, sep="\t") aggdat = aggdat.append(df) -aggdat.to_csv(args.outbase+'.tsv', sep='\t', index=False) +aggdat.to_csv(args.outbase + ".tsv", sep="\t", index=False) plt.figure() -df1 = pd.melt(aggdat.loc[:, aggdat.columns != 'N_taxa'], id_vars=['method'], var_name='metric') -sns.catplot(x="method", y="value", col="metric", col_wrap=2, - data=df1, kind="swarm", height=3, aspect=.8, sharey=False) -plt.savefig(args.outbase+'.pdf') +df1 = pd.melt( + aggdat.loc[:, aggdat.columns != "N_taxa"], id_vars=["method"], var_name="metric" +) +sns.catplot( + x="method", + y="value", + col="metric", + col_wrap=2, + data=df1, + kind="swarm", + height=3, + aspect=0.8, + sharey=False, +) +plt.savefig(args.outbase + ".pdf") -sns.catplot(x="method", y="value", col="metric", col_wrap=2, - data=df1, kind="box", height=3, aspect=.8, sharey=False) -plt.savefig(args.outbase+'_box.pdf') +sns.catplot( + x="method", + y="value", + col="metric", + col_wrap=2, + data=df1, + kind="box", + height=3, + aspect=0.8, + sharey=False, +) +plt.savefig(args.outbase + "_box.pdf") -sns.catplot(x="method", y="value", col="metric", col_wrap=2, - data=df1, kind="violin", height=3, aspect=.8, sharey=False) -plt.savefig(args.outbase+'_violin.pdf') +sns.catplot( + x="method", + y="value", + col="metric", + col_wrap=2, + data=df1, + kind="violin", + height=3, + aspect=0.8, + sharey=False, +) +plt.savefig(args.outbase + "_violin.pdf") plt.figure() -RF_cat = list(set(aggdat['RF'])) +RF_cat = list(set(aggdat["RF"])) RFs = list() correlations = list() for i in RF_cat: - sl = aggdat[aggdat['RF'] == i] - if len(aggdat[aggdat['RF'] == i]) < 10: + sl = aggdat[aggdat["RF"] == i] + if len(aggdat[aggdat["RF"] == i]) < 10: continue - corr_tup = pearsonr(sl['MRCA'], sl['COAR']) + corr_tup = pearsonr(sl["MRCA"], sl["COAR"]) if corr_tup[0]: correlations.append(corr_tup[0]) RFs.append(str(i)) if len(correlations) > 0: - df = pd.DataFrame({'correlation':correlations, 'RF':RFs}) + df = pd.DataFrame({"correlation": correlations, "RF": RFs}) sns.barplot(x="RF", y="correlation", data=df) - plt.savefig(args.outbase+'_MRSAvsCOAR.pdf') + plt.savefig(args.outbase + "_MRSAvsCOAR.pdf") sns.pairplot(aggdat, kind="reg") -plt.savefig(args.outbase+'_pairplot.pdf') +plt.savefig(args.outbase + "_pairplot.pdf") diff --git a/scripts/validation.py b/scripts/validation.py index 2a111e1a..96c3ba02 100755 --- a/scripts/validation.py +++ b/scripts/validation.py @@ -1,12 +1,13 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -''' +""" comparison of inference and simulated trees -''' +""" from gctree.utils import hamming_distance from random import randint + try: import cPickle as pickle except: @@ -15,7 +16,8 @@ import scipy from matplotlib import pyplot as plt import seaborn as sns -sns.set(style='white', color_codes=True) + +sns.set(style="white", color_codes=True) import os import numpy as np @@ -30,13 +32,17 @@ def reconstruct_lineage(tree, node): def find_node_by_seq(tree, sequence): - nodes = [node for node in tree.traverse() if node.sequence == sequence and node.frequency > 0] + nodes = [ + node + for node in tree.traverse() + if node.sequence == sequence and node.frequency > 0 + ] if len(nodes) > 1: - nodes = [nodes[randint(0, len(nodes)-1)]] + nodes = [nodes[randint(0, len(nodes) - 1)]] try: - assert(len(nodes) == 1) + assert len(nodes) == 1 except Exception as e: - print('Nodes list:') + print("Nodes list:") print(nodes) print(sequence) print(tree) @@ -48,8 +54,10 @@ def find_node_by_seq(tree, sequence): return nodes[0] -def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allow_double_gap=False): - ''' +def align_lineages( + seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allow_double_gap=False +): + """ Standard implementation of a Needleman-Wunsch algorithm as described here: http://telliott99.blogspot.com/2009/08/alignment-needleman-wunsch.html https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm @@ -57,7 +65,7 @@ def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allo https://github.com/alevchuk/pairwise-alignment-in-python/blob/master/alignment.py gap_penalty_pct is the gap penalty relative to the sequence length of the sequences on the tree. - ''' + """ nt = find_node_by_seq(tree_t, seq) lt = reconstruct_lineage(tree_t, nt) ni = find_node_by_seq(tree_i, seq) @@ -68,9 +76,11 @@ def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allo # Gap penalty chosen not too large: gap_penalty = -1 * int((len(seq) / 100.0) * gap_penalty_pct) - assert(gap_penalty <= 0) # Penalties must be negative - if gap_penalty == 0: # If gap penalty is zero only gaps in the shortes sequence will be allowed - assert(allow_double_gap is False) + assert gap_penalty <= 0 # Penalties must be negative + if ( + gap_penalty == 0 + ): # If gap penalty is zero only gaps in the shortes sequence will be allowed + assert allow_double_gap is False # Generate a score matrix matrix: kt = len(lt) @@ -79,15 +89,15 @@ def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allo if allow_double_gap is False and kt > ki: # If true is longer than inferred allow gap only in inferred: gap_penalty_i = gap_penalty - gap_penalty_j = -1 * float('inf') + gap_penalty_j = -1 * float("inf") elif allow_double_gap is False and kt < ki: # If inferred is longer than true allow gap only in true: - gap_penalty_i = -1 * float('inf') + gap_penalty_i = -1 * float("inf") gap_penalty_j = gap_penalty elif allow_double_gap is False and kt == ki: # If lists are equally long no gaps are allowed: - gap_penalty_i = -1 * float('inf') - gap_penalty_j = -1 * float('inf') + gap_penalty_i = -1 * float("inf") + gap_penalty_j = -1 * float("inf") else: gap_penalty_i = gap_penalty gap_penalty_j = gap_penalty @@ -96,70 +106,70 @@ def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allo for i in range(kt): for j in range(ki): # Notice the score is defined by number of mismatches: - #sc_mat[i, j] = len(lt[i]) - hamming_distance(lt[i], li[j]) + # sc_mat[i, j] = len(lt[i]) - hamming_distance(lt[i], li[j]) sc_mat[i, j] = -1 * hamming_distance(lt[i], li[j]) -### print(sc_mat) + ### print(sc_mat) # Calculate the alignment scores: - aln_sc = np.zeros((kt+1, ki+1), dtype=np.float64) - for i in range(0, kt+1): + aln_sc = np.zeros((kt + 1, ki + 1), dtype=np.float64) + for i in range(0, kt + 1): if known_root is True: - aln_sc[i][0] = -1 * float('inf') + aln_sc[i][0] = -1 * float("inf") else: aln_sc[i][0] = gap_penalty_i * i - for j in range(0, ki+1): + for j in range(0, ki + 1): if known_root is True: - aln_sc[0][j] = -1 * float('inf') + aln_sc[0][j] = -1 * float("inf") else: aln_sc[0][j] = gap_penalty_j * j aln_sc[0][0] = 0 # The top left is fixed to zero -### print(aln_sc) - for i in range(1, kt+1): - for j in range(1, ki+1): - match = aln_sc[i-1][j-1] + sc_mat[i-1, j-1] - gap_in_inferred = aln_sc[i-1][j] + gap_penalty_i - gap_in_true = aln_sc[i][j-1] + gap_penalty_j + ### print(aln_sc) + for i in range(1, kt + 1): + for j in range(1, ki + 1): + match = aln_sc[i - 1][j - 1] + sc_mat[i - 1, j - 1] + gap_in_inferred = aln_sc[i - 1][j] + gap_penalty_i + gap_in_true = aln_sc[i][j - 1] + gap_penalty_j aln_sc[i][j] = max(match, gap_in_inferred, gap_in_true) -### print(aln_sc) + ### print(aln_sc) # Traceback to compute the alignment: align_t, align_i, asr_align = list(), list(), list() i, j = kt, ki alignment_score = aln_sc[i][j] while i > 0 and j > 0: sc_current = aln_sc[i][j] - sc_diagonal = aln_sc[i-1][j-1] - sc_up = aln_sc[i][j-1] - sc_left = aln_sc[i-1][j] + sc_diagonal = aln_sc[i - 1][j - 1] + sc_up = aln_sc[i][j - 1] + sc_left = aln_sc[i - 1][j] - if sc_current == (sc_diagonal + sc_mat[i-1, j-1]): - align_t.append(lt[i-1]) - align_i.append(li[j-1]) + if sc_current == (sc_diagonal + sc_mat[i - 1, j - 1]): + align_t.append(lt[i - 1]) + align_i.append(li[j - 1]) i -= 1 j -= 1 elif sc_current == (sc_left + gap_penalty_i): - align_t.append(lt[i-1]) - align_i.append('-') + align_t.append(lt[i - 1]) + align_i.append("-") i -= 1 elif sc_current == (sc_up + gap_penalty_j): - align_t.append('-') - align_i.append(li[j-1]) + align_t.append("-") + align_i.append(li[j - 1]) j -= 1 # If space left fill it with gaps: while i > 0: asr_align.append(gap_penalty_i) - align_t.append(lt[i-1]) - align_i.append('-') + align_t.append(lt[i - 1]) + align_i.append("-") i -= 1 while j > 0: asr_align.append(gap_penalty_j) - align_t.append('-') - align_i.append(li[j-1]) + align_t.append("-") + align_i.append(li[j - 1]) j -= 1 max_penalty = 0 for a, b in zip(align_t, align_i): - if a == '-' or b == '-': + if a == "-" or b == "-": max_penalty += gap_penalty else: max_penalty += -len(a) @@ -173,16 +183,28 @@ def align_lineages(seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allo return [align_t, align_i, alignment_score, max_penalty] -def lineage_dist(true_tree, inferred_tree, freq_weigthing=False, known_root=True, allow_double_gap=False): +def lineage_dist( + true_tree, + inferred_tree, + freq_weigthing=False, + known_root=True, + allow_double_gap=False, +): norm_lineage_dist = list() nlineages = 0 -# for node in true_tree.tree.traverse(): + # for node in true_tree.tree.traverse(): for node in true_tree.tree.iter_leaves(): # Iterate only through the leaves if not node.frequency > 0: continue - aln_res = align_lineages(node.sequence, true_tree.tree, inferred_tree.tree, known_root=known_root, allow_double_gap=allow_double_gap) - if aln_res is False: # Skip lineages less than three members long + aln_res = align_lineages( + node.sequence, + true_tree.tree, + inferred_tree.tree, + known_root=known_root, + allow_double_gap=allow_double_gap, + ) + if aln_res is False: # Skip lineages less than three members long continue align_t, align_i, final_score, max_penalty = aln_res if freq_weigthing is True: @@ -190,15 +212,17 @@ def lineage_dist(true_tree, inferred_tree, freq_weigthing=False, known_root=True total_lineage_dist = final_score * node.frequency # Normalize with the max penalty: if total_max_penalty < 0: - norm_lineage_dist.append(total_lineage_dist/total_max_penalty) + norm_lineage_dist.append(total_lineage_dist / total_max_penalty) else: total_max_penalty = max_penalty total_lineage_dist = final_score # Normalize with the max penalty: if total_max_penalty < 0: - norm_lineage_dist.append(total_lineage_dist/total_max_penalty) + norm_lineage_dist.append(total_lineage_dist / total_max_penalty) - if len(norm_lineage_dist) == 0: # There can be total_max_penalty == 0 when all lineages have less than three members + if ( + len(norm_lineage_dist) == 0 + ): # There can be total_max_penalty == 0 when all lineages have less than three members return 0 # Take the mean of the distances: mean_norm_lineage_dist = sum(norm_lineage_dist) / len(norm_lineage_dist) @@ -206,124 +230,194 @@ def lineage_dist(true_tree, inferred_tree, freq_weigthing=False, known_root=True def validate(true_tree, inferences, true_tree_colormap, outbase): - ''' + """ inferences is a dict mapping inference name, like "gctree" to pickle files of CollapsedForest - ''' + """ # With/without frequency weighting: - all_lineage_dist = lambda x, y: [lineage_dist(x, y, freq_weigthing=fw) for fw in [False, True]] + all_lineage_dist = lambda x, y: [ + lineage_dist(x, y, freq_weigthing=fw) for fw in [False, True] + ] # if gctre is among the inferences, let's evaluate the likelihood ranking # among the parsimony trees - if 'gctree' in inferences: - n_trees = len(inferences['gctree'].forest) + if "gctree" in inferences: + n_trees = len(inferences["gctree"].forest) # note: the unrooted_trees flag is needed because, for some reason, the RF # function sometimes thinks the collapsed trees are unrooted and barfs - distances, likelihoods = zip(*[(true_tree.compare(tree, method='RF'), - tree.ll(inferences['gctree'].params)[0]) for tree in inferences['gctree'].forest]) - MRCAs = [true_tree.compare(tree, method='MRCA') for tree in inferences['gctree'].forest] - lineage_distances = [all_lineage_dist(true_tree, tree) for tree in inferences['gctree'].forest] - lineage_distances = list(zip(*lineage_distances)) # Unzip the forest tuple to get lineage_distances[ld0-3][tree_n] - mean_frequencies = [np.mean([node.frequency for node in tree.tree.traverse()]) for tree in inferences['gctree'].forest] - mean_branch_lengths = [np.mean([node.dist for node in tree.tree.iter_descendants()]) for tree in inferences['gctree'].forest] - df = pd.DataFrame({'log-likelihood':likelihoods, - 'RF':distances, - 'MRCA':MRCAs, - 'COAR':lineage_distances[0], - 'COAR_fw':lineage_distances[1], - 'mean_frequency':mean_frequencies, - 'mean_branch_length':mean_branch_lengths}) + distances, likelihoods = zip( + *[ + ( + true_tree.compare(tree, method="RF"), + tree.ll(inferences["gctree"].params)[0], + ) + for tree in inferences["gctree"].forest + ] + ) + MRCAs = [ + true_tree.compare(tree, method="MRCA") + for tree in inferences["gctree"].forest + ] + lineage_distances = [ + all_lineage_dist(true_tree, tree) for tree in inferences["gctree"].forest + ] + lineage_distances = list( + zip(*lineage_distances) + ) # Unzip the forest tuple to get lineage_distances[ld0-3][tree_n] + mean_frequencies = [ + np.mean([node.frequency for node in tree.tree.traverse()]) + for tree in inferences["gctree"].forest + ] + mean_branch_lengths = [ + np.mean([node.dist for node in tree.tree.iter_descendants()]) + for tree in inferences["gctree"].forest + ] + df = pd.DataFrame( + { + "log-likelihood": likelihoods, + "RF": distances, + "MRCA": MRCAs, + "COAR": lineage_distances[0], + "COAR_fw": lineage_distances[1], + "mean_frequency": mean_frequencies, + "mean_branch_length": mean_branch_lengths, + } + ) if n_trees > 1: # plots - maxll = df['log-likelihood'].max() - if len(df[df['log-likelihood']!=maxll]) >= 2: + maxll = df["log-likelihood"].max() + if len(df[df["log-likelihood"] != maxll]) >= 2: fit_reg = True else: fit_reg = False plt.figure(figsize=(10, 10)) - for i, metric in enumerate(('RF', 'MRCA', 'COAR', 'COAR_fw'), 1): + for i, metric in enumerate(("RF", "MRCA", "COAR", "COAR_fw"), 1): plt.subplot(2, 2, i) - ax = sns.regplot('log-likelihood', metric, data=df[df['log-likelihood']!=maxll], fit_reg=fit_reg, color='black', scatter_kws={'alpha':.8, 'clip_on':False}) - sns.regplot('log-likelihood', metric, data=df[df['log-likelihood']==maxll], fit_reg=False, color='red', scatter_kws={'alpha':.8, 'clip_on':False}, ax=ax) - plt.ylim(0, 1.1*df[metric].max()) - plt.xlim(df['log-likelihood'].min(), df['log-likelihood'].max()) + ax = sns.regplot( + "log-likelihood", + metric, + data=df[df["log-likelihood"] != maxll], + fit_reg=fit_reg, + color="black", + scatter_kws={"alpha": 0.8, "clip_on": False}, + ) + sns.regplot( + "log-likelihood", + metric, + data=df[df["log-likelihood"] == maxll], + fit_reg=False, + color="red", + scatter_kws={"alpha": 0.8, "clip_on": False}, + ax=ax, + ) + plt.ylim(0, 1.1 * df[metric].max()) + plt.xlim(df["log-likelihood"].min(), df["log-likelihood"].max()) plt.tight_layout() - plt.savefig(outbase+'.gctree.pdf') + plt.savefig(outbase + ".gctree.pdf") - df.to_csv(outbase+'.gctree.tsv', sep='\t', index=False) + df.to_csv(outbase + ".gctree.tsv", sep="\t", index=False) plt.figure(figsize=(14, 14)) sns.pairplot(df, kind="reg") - plt.savefig(outbase+'_pairplot.pdf') + plt.savefig(outbase + "_pairplot.pdf") - for i, tree in enumerate(inferences['gctree'].forest, 1): + for i, tree in enumerate(inferences["gctree"].forest, 1): colormap = {} for node in tree.tree.traverse(): if node.sequence in true_tree_colormap: colormap[node.name] = true_tree_colormap[node.sequence] else: assert node.frequency == 0 - colormap[node.name] = 'lightgray' - tree.render(outbase+'.gctree.colored_tree.{}.svg'.format(i), colormap=colormap) - - - + colormap[node.name] = "lightgray" + tree.render( + outbase + ".gctree.colored_tree.{}.svg".format(i), colormap=colormap + ) # compare the inference methods # assume the first tree in the forest is the inferred tree methods, n_taxa, distances, MRCAs, lineage_distances = zip( - *[(method, - len(list(true_tree.tree.traverse())), # Get all taxa in the tree - true_tree.compare(inferences[method].forest[0], method='RF'), - true_tree.compare(inferences[method].forest[0], method='MRCA'), - all_lineage_dist(true_tree, inferences[method].forest[0])) for method in inferences]) - lineage_distances = list(zip(*lineage_distances)) # Unzip the methods tuple to get lineage_distances[ld0-3][method] - df = pd.DataFrame({'method':methods, 'N_taxa':n_taxa, 'RF':distances, 'MRCA':MRCAs, 'COAR':lineage_distances[0], 'COAR_fw':lineage_distances[1]}, - columns=('method', 'N_taxa', 'RF', 'MRCA', 'COAR', 'COAR_fw')) - df.to_csv(outbase+'.tsv', sep='\t', index=False) + *[ + ( + method, + len(list(true_tree.tree.traverse())), # Get all taxa in the tree + true_tree.compare(inferences[method].forest[0], method="RF"), + true_tree.compare(inferences[method].forest[0], method="MRCA"), + all_lineage_dist(true_tree, inferences[method].forest[0]), + ) + for method in inferences + ] + ) + lineage_distances = list( + zip(*lineage_distances) + ) # Unzip the methods tuple to get lineage_distances[ld0-3][method] + df = pd.DataFrame( + { + "method": methods, + "N_taxa": n_taxa, + "RF": distances, + "MRCA": MRCAs, + "COAR": lineage_distances[0], + "COAR_fw": lineage_distances[1], + }, + columns=("method", "N_taxa", "RF", "MRCA", "COAR", "COAR_fw"), + ) + df.to_csv(outbase + ".tsv", sep="\t", index=False) def main(): import argparse - parser = argparse.ArgumentParser(description='validate results of inference on simulation data', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('true_tree', type=str, help='.p file containing true tree') - parser.add_argument('true_tree_colormap', type=str, help='.tsv colormap file for true tree') - parser.add_argument('forest_files', type=str, nargs='*', help='.p files containing forests from each inference method') + parser = argparse.ArgumentParser( + description="validate results of inference on simulation data", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + + parser.add_argument("true_tree", type=str, help=".p file containing true tree") + parser.add_argument( + "true_tree_colormap", type=str, help=".tsv colormap file for true tree" + ) + parser.add_argument( + "forest_files", + type=str, + nargs="*", + help=".p files containing forests from each inference method", + ) # Uncomment and insert into function calls to allow for these settings: # parser.add_argument('--known_root', type=bool, default=True, help='This is root sequence known in the inferred phylogeny? If yes, the alignment is forced to end in the top left corner of the alignment grid.') # parser.add_argument('--allow_double_gap', type=bool, default=False, help='Allow the Needleman-Wunsch algorithm to move freely and possibly introducing gaps in both true and inferred list under the same comparison.') - parser.add_argument('--outbase', type=str, required=True, help='output file base name') + parser.add_argument( + "--outbase", type=str, required=True, help="output file base name" + ) global args args = parser.parse_args() - with open(args.true_tree, 'rb') as f: + with open(args.true_tree, "rb") as f: true_tree = pickle.load(f) inferences = {} for forest_file in args.forest_files: - with open(forest_file, 'rb') as f: - inferences[os.path.basename(forest_file).split('.')[0]] = pickle.load(f) + with open(forest_file, "rb") as f: + inferences[os.path.basename(forest_file).split(".")[0]] = pickle.load(f) # now we rerender the inferred trees, but using colormap from true tree, makes visual comaprison easier - true_tree_colormap = {} # map for tree sequences - with open(args.true_tree_colormap, 'r') as f: + true_tree_colormap = {} # map for tree sequences + with open(args.true_tree_colormap, "r") as f: for line in f: - name, color = line.rstrip().split('\t') - if ',' not in name: - true_tree_colormap[true_tree.tree.search_nodes(name=name)[0].sequence] = color + name, color = line.rstrip().split("\t") + if "," not in name: + true_tree_colormap[ + true_tree.tree.search_nodes(name=name)[0].sequence + ] = color else: - search = true_tree.tree.search_nodes(name=tuple(name.split(','))) + search = true_tree.tree.search_nodes(name=tuple(name.split(","))) if search: true_tree_colormap[search[0].sequence] = color validate(true_tree, inferences, true_tree_colormap, args.outbase) - print('Done') # Print something to the log to make the wait_func run smooth + print("Done") # Print something to the log to make the wait_func run smooth -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/setup.py b/setup.py index 1ae68b5d..6d37ee4f 100644 --- a/setup.py +++ b/setup.py @@ -2,36 +2,36 @@ import versioneer -with open('README.md', 'r') as fh: +with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( - name='gctree', + name="gctree", version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), - author='William DeWitt', - author_email='wsdewitt@gmail.com', - description='phylogenetic inference of genotype-collapsed trees', + author="William DeWitt", + author_email="wsdewitt@gmail.com", + description="phylogenetic inference of genotype-collapsed trees", long_description=long_description, - long_description_content_type='text/markdown', - url='https://github.com/matsengrp/gctree', - entry_points={'console_scripts': ['gctree=gctree.cli:main']}, + long_description_content_type="text/markdown", + url="https://github.com/matsengrp/gctree", + entry_points={"console_scripts": ["gctree=gctree.cli:main"]}, # packages=setuptools.find_packages(exclude=['tests', 'docs', 'docsrc']), # packages=['gctree'], classifiers=[ - 'Programming Language :: Python :: 3', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", ], - python_requires='>=3.7', + python_requires=">=3.7", install_requires=[ - 'PyQt5', - 'ete3', - 'biopython', - 'matplotlib', - 'pandas', - 'scipy', - 'seaborn', - 'jellyfish' - ] + "PyQt5", + "ete3", + "biopython", + "matplotlib", + "pandas", + "scipy", + "seaborn", + "jellyfish", + ], ) From 2b908b881dfa95715e4e341342289b8aeb54c1a9 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 21:08:09 -0700 Subject: [PATCH 06/32] docformatter --- environment.yml | 2 + gctree/_version.py | 7 ++-- gctree/branching_processes.py | 70 ++++++++++++++-------------------- gctree/cli.py | 29 +++++++------- gctree/mutation_model.py | 38 +++++++++--------- gctree/phylip_parse.py | 4 +- gctree/selection_utils.py | 38 +++++++++--------- gctree/utils.py | 2 +- scripts/aggregate.py | 4 +- scripts/aggregate_compare.py | 4 +- scripts/consensus.py | 2 +- scripts/heavy_light_compare.py | 4 +- scripts/mkconfig.py | 5 +-- scripts/phylip_parse.py | 4 +- scripts/plot_tree.py | 49 +++++++++++------------- scripts/simstatagg.py | 5 +-- scripts/summary_stats.py | 5 +-- scripts/tree_functions.py | 8 ++-- scripts/validaggreg.py | 5 +-- scripts/validaggreg_compare.py | 5 +-- scripts/validation.py | 27 ++++++------- 21 files changed, 139 insertions(+), 178 deletions(-) diff --git a/environment.yml b/environment.yml index ae6ab44c..928d6781 100644 --- a/environment.yml +++ b/environment.yml @@ -10,7 +10,9 @@ dependencies: - phylip - seqmagick - black + - docformatter - flake8 + - pylint - pytest - pip - pip: diff --git a/gctree/_version.py b/gctree/_version.py index a61d4083..6faae8ca 100644 --- a/gctree/_version.py +++ b/gctree/_version.py @@ -110,9 +110,10 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env= def versions_from_parentdir(parentdir_prefix, root, verbose): """Try to determine the version from the parent directory name. - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory + Source tarballs conventionally unpack into a directory that includes + both the project name and a version string. We will also support + searching up two directory levels for an appropriately named parent + directory """ rootdirs = [] diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index 8ee7a0f6..20dc51f6 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -1,10 +1,8 @@ #! /usr/bin/env python -""" -This module contains classes for simulation and inference for a binary +"""This module contains classes for simulation and inference for a binary branching process with mutation in which the tree is collapsed to nodes that -count the number of clonal leaves of each type -""" +count the number of clonal leaves of each type.""" from gctree.utils import hamming_distance @@ -41,7 +39,7 @@ class LeavesAndClades: def __init__(self, params=None, c=None, m=None): """initialize with branching probability p and mutation probability q, - both in the unit interval""" + both in the unit interval.""" if params is not None: p, q = params if not (0 <= p <= 1 and 0 <= q <= 1): @@ -61,7 +59,7 @@ def __init__(self, params=None, c=None, m=None): def simulate(self): """simulate the number of clone leaves and mutant clades off a root - node""" + node.""" if self.params[0] >= 0.5: warnings.warn( f"p = {self.p} is not subcritical, tree simulations" @@ -96,8 +94,10 @@ def simulate(self): def logf(c, m, *params): """Log-probability of getting c leaves that are clones of the root and m mutant clades off the root lineage, given branching probability p and - mutation probability q. AKA the spaceship distribution. Also returns - gradient wrt params (p, q). Computed by dynamic programming. + mutation probability q. + + AKA the spaceship distribution. Also returns gradient wrt params + (p, q). Computed by dynamic programming. """ p, q = params if c == m == 0 or (c == 0 and m == 1): @@ -162,7 +162,7 @@ def logf(c, m, *params): @staticmethod def build_logf_cache(c_max, m_max, *params): """build up the lru_cache from the bottom to avoid recursion depth - issues""" + issues.""" LeavesAndClades.logf.cache_clear() print(f"building likelihood cache for parameters {params}") for c in range(c_max + 1): @@ -327,8 +327,7 @@ def __init__( def ll(self, params, sign=1, build_cache=True): """log likelihood of params, conditioned on collapsed tree, and its gradient wrt params optional parameter sign must be 1 or -1, with the - latter useful for MLE by minimization - """ + latter useful for MLE by minimization.""" if self.tree is None: raise ValueError("tree data must be defined to compute likelihood") if sign not in (-1, 1): @@ -362,11 +361,8 @@ def ll(self, params, sign=1, build_cache=True): return sign * logf, sign * grad_logf def mle(self, **kwargs): - """ - Maximum likelihood estimate for params given tree - updates params if not None - returns optimization result - """ + """Maximum likelihood estimate for params given tree updates params if + not None returns optimization result.""" # random initalization x_0 = (random.random(), random.random()) bounds = ((1e-6, 1 - 1e-6), (1e-6, 1 - 1e-6)) @@ -398,10 +394,8 @@ def mle(self, **kwargs): return result def simulate(self): - """simulate a collapsed tree given params - replaces existing tree data member with simulation result, and returns - self - """ + """simulate a collapsed tree given params replaces existing tree data + member with simulation result, and returns self.""" if self.params is None: raise ValueError("params must be defined for simulation") @@ -421,7 +415,7 @@ def simulate(self): return self def __str__(self): - """return a string representation for printing""" + """return a string representation for printing.""" return "params = " + str(self.params) + "\ntree:\n" + str(self.tree) def render( @@ -433,8 +427,7 @@ def render( chain_split=None, ): """render to image file, filetype inferred from suffix, svg for color - images - """ + images.""" def my_layout(node): if colormap is None or node.name not in colormap: @@ -577,16 +570,16 @@ def my_layout(node): ) def write(self, file_name): - """serialize tree to file""" + """serialize tree to file.""" with open(file_name, "wb") as f: pickle.dump(self, f) def newick(self, file_name): - """write to newick file""" + """write to newick file.""" self.tree.write(format=1, outfile=file_name) def compare(self, tree2, method="identity"): - """compare this tree to the other tree""" + """compare this tree to the other tree.""" if method == "identity": # we compare lists of seq, parent, abundance # return true if these lists are identical, else false @@ -658,8 +651,7 @@ def compare(self, tree2, method="identity"): def get_split(self, node): """return the bipartition resulting from clipping this node's edge - above - """ + above.""" if node.get_tree_root() != self.tree: raise ValueError("node not found") if node == self.tree: @@ -708,11 +700,9 @@ def split_compatibility(split1, split2): return False def support(self, bootstrap_trees_list, weights=None, compatibility=False): - """ - compute support from a list of bootstrap GCtrees - weights (optional) is needed for weighting parsimony degenerate trees - compatibility mode counts trees that don't disconfirm the split - """ + """compute support from a list of bootstrap GCtrees weights (optional) + is needed for weighting parsimony degenerate trees compatibility mode + counts trees that don't disconfirm the split.""" for node in self.tree.get_descendants(): split = self.get_split(node) support = 0 @@ -749,10 +739,8 @@ class CollapsedForest(CollapsedTree): """ def __init__(self, params=None, n_trees=None, forest=None): - """in addition to p and q, we need number of trees - can also intialize with forest, a list of trees, each an instance of - CollapsedTree - """ + """in addition to p and q, we need number of trees can also intialize + with forest, a list of trees, each an instance of CollapsedTree.""" CollapsedTree.__init__(self, params=params) if forest is None and params is None: raise ValueError("either params or forest (or both) must be " "provided") @@ -772,8 +760,7 @@ def __init__(self, params=None, n_trees=None, forest=None): def simulate(self): """simulate a forest of collapsed trees given params and number of trees replaces existing forest data member with simulation result, and - returns self - """ + returns self.""" if self.params is None or self.n_trees is None: raise ValueError( "params and n_trees parameters must be defined for simulation" @@ -787,8 +774,7 @@ def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): """likelihood of params, given forest, and it's gradient wrt params optional parameter sign must be 1 or -1, with the latter useful for MLE by minimization if optional parameter empirical_bayes_sum is true, - we're estimating params for a set of parsimony trees - """ + we're estimating params for a set of parsimony trees.""" if self.forest is None: raise ValueError("forest data must be defined to compute likelihood") if sign not in (-1, 1): @@ -829,7 +815,7 @@ def ll(self, params, sign=1, empirical_bayes_sum=False, build_cache=True): # NOTE: we get mle() method for free by inheritance/polymorphism magic def __str__(self): - """return a string representation for printing""" + """return a string representation for printing.""" return f"params = {self.params}, n_trees = {self.n_trees}\n" "\n".join( [str(tree) for tree in self.forest] ) diff --git a/gctree/cli.py b/gctree/cli.py index 8d44a1b1..5ae8641b 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -19,9 +19,11 @@ def test(args): - """Test subprogram. Checks likelihood against a by-hand calculation for a - simple tree, simulates a forest, computes MLE parameters, and plots some - sanity check figures to plot_file command line arguments are p, q, number + """Test subprogram. + + Checks likelihood against a by-hand calculation for a simple tree, + simulates a forest, computes MLE parameters, and plots some sanity + check figures to plot_file command line arguments are p, q, number of trees to simulate, and plot file name """ @@ -151,7 +153,7 @@ def test(args): def infer(args): - """inference subprogram""" + """inference subprogram.""" outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.naive)] if args.bootstrap_phylipfile is not None: outfiles.extend( @@ -345,15 +347,16 @@ def infer(args): def simulate(args): - """Simulation subprogram. Can simulate in two modes. - a) Neutral mode. A Galton–Watson process, with mutation probabilities - according to a user defined motif model e.g. S5F - b) Selection mode. Using the same mutation process as in a), but in - selection mode the poisson progeny distribution's lambda is variable - according to the hamming distance to a list of target sequences. The closer - a sequence gets to one of the targets the higher fitness and the closer - lambda will approach 2, vice versa when the sequence is far away lambda - approaches 0. + """Simulation subprogram. + + Can simulate in two modes. a) Neutral mode. A Galton–Watson process, + with mutation probabilities according to a user defined motif model + e.g. S5F b) Selection mode. Using the same mutation process as in + a), but in selection mode the poisson progeny distribution's lambda + is variable according to the hamming distance to a list of target + sequences. The closer a sequence gets to one of the targets the + higher fitness and the closer lambda will approach 2, vice versa + when the sequence is far away lambda approaches 0. """ random.seed(a=args.seed) mutation_model = mm.MutationModel(args.mutability, args.substitution) diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index bd7cade4..f7fc3473 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -1,6 +1,6 @@ #! /usr/bin/env python -"""Mutation models""" +"""Mutation models.""" from gctree.utils import hamming_distance @@ -12,7 +12,7 @@ class MutationModel: - """a class for a mutation model, and functions to mutate sequences""" + """a class for a mutation model, and functions to mutate sequences.""" def __init__( self, @@ -21,8 +21,8 @@ def __init__( mutation_order=True, with_replacement=True, ): - """ - initialized with input files of the S5F format + """initialized with input files of the S5F format. + @param mutation_order: whether or not to mutate sequences using a context sensitive manner where mutation order matters @param with_replacement: allow the same position to mutate multiple times on a single branch @@ -60,7 +60,8 @@ def __init__( @staticmethod def disambiguate(sequence): - """generator of all possible nt sequences implied by a sequence containing Ns""" + """generator of all possible nt sequences implied by a sequence + containing Ns.""" # find the first N nucleotide N_index = sequence.find("N") # if there is no N nucleotide, yield the input sequence @@ -76,10 +77,8 @@ def disambiguate(sequence): yield sequence_recurse def mutability(self, kmer): - """ - returns the mutability of a central base of kmer, along with nucleotide bias - averages over N nucleotide identities - """ + """returns the mutability of a central base of kmer, along with + nucleotide bias averages over N nucleotide identities.""" if self.context_model is None: raise ValueError("kmer mutability only defined for context models") if len(kmer) != self.k: @@ -109,7 +108,8 @@ def mutability(self, kmer): return average_mutability, average_substitution def mutabilities(self, sequence): - """returns the mutability of a sequence at each site, along with nucleotide biases""" + """returns the mutability of a sequence at each site, along with + nucleotide biases.""" if self.context_model is None: return [ (1, dict((n2, 1 / 3) if n2 is not n else (n2, 0.0) for n2 in "ACGT")) @@ -125,9 +125,9 @@ def mutabilities(self, sequence): ] def mutate(self, sequence, lambda0=1, frame=None): - """ - Mutate a sequence, with lamdba0 the baseline mutability - Cannot mutate the same position multiple times + """Mutate a sequence, with lamdba0 the baseline mutability Cannot + mutate the same position multiple times. + @param sequence: the original sequence to mutate @param lambda0: a "baseline" mutation rate @param frame: the reading frame index @@ -198,9 +198,8 @@ def mutate(self, sequence, lambda0=1, frame=None): return sequence def one_mutant(self, sequence, Nmuts, frame=1, lambda0=0.1): - """ - Make a single mutant with a distance, in amino acid sequence, of Nmuts away from the starting point. - """ + """Make a single mutant with a distance, in amino acid sequence, of + Nmuts away from the starting point.""" trial = 100 # Allow 100 trials before quitting while trial > 0: mut_seq = sequence[:] @@ -254,10 +253,9 @@ def simulate( verbose=False, selection_params=None, ): - """ - simulate neutral binary branching process with mutation model - progeny must be like a scipy.stats distribution, with rvs() and mean() methods - """ + """simulate neutral binary branching process with mutation model + progeny must be like a scipy.stats distribution, with rvs() and mean() + methods.""" stop_dist = None # Default stopping criterium for affinity simulation # Checking the validity of the input parameters: if N is not None and T is not None: diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index 342779d3..b5b1b35f 100755 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -84,7 +84,7 @@ def parse_seqdict(fh, mode="dnaml"): # list biopython.SeqRecords and a dict containing adjacency # relationships and distances between nodes. def parse_outfile(outfile, countfile=None, naive="naive"): - """parse phylip outfile""" + """parse phylip outfile.""" if countfile is not None: counts = {l.split(",")[0]: int(l.split(",")[1]) for l in open(countfile)} # No count, just make an empty count dictionary: @@ -120,7 +120,7 @@ def parse_outfile(outfile, countfile=None, naive="naive"): def disambiguate(tree): - """make random choices for ambiguous bases, respecting tree inheritance""" + """make random choices for ambiguous bases, respecting tree inheritance.""" ambiguous_dna_values["?"] = "GATC-" sequence_length = len(tree.sequence) for node in tree.traverse(): diff --git a/gctree/selection_utils.py b/gctree/selection_utils.py index f9a11d98..d9e2f064 100755 --- a/gctree/selection_utils.py +++ b/gctree/selection_utils.py @@ -1,9 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -utility functions for selection simulation -""" +"""utility functions for selection simulation.""" from gctree.utils import hamming_distance @@ -13,37 +11,34 @@ def calc_Kd(seqAA, targetAAseqs, hd2affy): - """Find the closest target sequence to and apply the "hamming distance to affinity" transformation function.""" + """Find the closest target sequence to and apply the "hamming distance to + affinity" transformation function.""" hd = min([hamming_distance(seqAA, t) for t in targetAAseqs]) return hd2affy(hd) def lambda_selection(node, tree, targetAAseqs, hd2affy, A_total, B_total, Lp): - """ - Given a node and its tree and a "hamming distance to affinity" transformation function - reutrn the poisson lambda parameter for the progeny distribution. - """ + """Given a node and its tree and a "hamming distance to affinity" + transformation function reutrn the poisson lambda parameter for the progeny + distribution.""" def calc_BnA(Kd_n, A, B_total): - """ - This calculated the fraction B:A (B bound to A), at equilibrium also referred to as "binding time", - of all the different Bs in the population given the number of free As in solution. - """ + """This calculated the fraction B:A (B bound to A), at equilibrium also + referred to as "binding time", of all the different Bs in the + population given the number of free As in solution.""" BnA = B_total / (1 + Kd_n / A) return BnA def return_objective_A(Kd_n, A_total, B_total): - """ - The objective function that solves the set of differential equations setup to find the number of free As, - at equilibrium, given a number of Bs with some affinity listed in Kd_n. - """ + """The objective function that solves the set of differential equations + setup to find the number of free As, at equilibrium, given a number of + Bs with some affinity listed in Kd_n.""" return lambda A: (A_total - (A + scipy.sum(B_total / (1 + Kd_n / A)))) ** 2 def calc_binding_time(Kd_n, A_total, B_total): - """ - Solves the objective function to find the number of free As and then uses this, - to calculate the fraction B:A (B bound to A) for all the different Bs. - """ + """Solves the objective function to find the number of free As and then + uses this, to calculate the fraction B:A (B bound to A) for all the + different Bs.""" obj = return_objective_A(Kd_n, A_total, B_total) # Different minimizers have been tested and 'L-BFGS-B' was significant faster than anything else: obj_min = minimize( @@ -55,7 +50,8 @@ def calc_binding_time(Kd_n, A_total, B_total): return BnA def trans_BA(BA, Lp): - """Transform the fraction B:A (B bound to A) to a poisson lambda between 0 and 2.""" + """Transform the fraction B:A (B bound to A) to a poisson lambda + between 0 and 2.""" # We keep alpha to enable the possibility that there is a minimum lambda_: alpha, beta, Q = Lp lambda_ = alpha + (2 - alpha) / (1 + Q * scipy.exp(-beta * BA)) diff --git a/gctree/utils.py b/gctree/utils.py index 4d5babc3..8602dc61 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -14,7 +14,7 @@ def hamming_distance(s1, s2): except: def hamming_distance(seq1, seq2): - """Hamming distance between two sequences of equal length""" + """Hamming distance between two sequences of equal length.""" return sum(x != y for x, y in zip(seq1, seq2)) print( diff --git a/scripts/aggregate.py b/scripts/aggregate.py index 563df205..3eecb2e3 100755 --- a/scripts/aggregate.py +++ b/scripts/aggregate.py @@ -1,9 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -aggregation plots of across parameters -""" +"""aggregation plots of across parameters.""" from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec diff --git a/scripts/aggregate_compare.py b/scripts/aggregate_compare.py index 14ec323c..1833a321 100755 --- a/scripts/aggregate_compare.py +++ b/scripts/aggregate_compare.py @@ -1,9 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -aggregation plots of across parameters -""" +"""aggregation plots of across parameters.""" from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec diff --git a/scripts/consensus.py b/scripts/consensus.py index c61947e2..5d429fcd 100755 --- a/scripts/consensus.py +++ b/scripts/consensus.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -"""compute GCtree for a phylip consensus tree""" +"""compute GCtree for a phylip consensus tree.""" from gctree import * import argparse diff --git a/scripts/heavy_light_compare.py b/scripts/heavy_light_compare.py index 119c7eef..4e02514c 100755 --- a/scripts/heavy_light_compare.py +++ b/scripts/heavy_light_compare.py @@ -1,9 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -comparison of heavy and light trees -""" +"""comparison of heavy and light trees.""" import pandas as pd import scipy diff --git a/scripts/mkconfig.py b/scripts/mkconfig.py index f74ce730..4d15d399 100755 --- a/scripts/mkconfig.py +++ b/scripts/mkconfig.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -""" -Read a PHYLIP-format file and produce an appropriate config file for passing to `dnapars`. +"""Read a PHYLIP-format file and produce an appropriate config file for passing +to `dnapars`. `dnapars` is a rather old program that doesn't play very well in a pipeline. It prompts the user for configuration information and reads @@ -40,7 +40,6 @@ Y to accept these or type the letter for one to change ____________ - """ import re, os, random import argparse diff --git a/scripts/phylip_parse.py b/scripts/phylip_parse.py index 7b1a2e6c..773f6e7b 100644 --- a/scripts/phylip_parse.py +++ b/scripts/phylip_parse.py @@ -10,9 +10,7 @@ def main(): import pickle, argparse, os def existing_file(fname): - """ - Argparse type for an existing file - """ + """Argparse type for an existing file.""" if not os.path.isfile(fname): raise ValueError("Invalid file: " + str(fname)) return fname diff --git a/scripts/plot_tree.py b/scripts/plot_tree.py index baaba3d5..79b9bb08 100755 --- a/scripts/plot_tree.py +++ b/scripts/plot_tree.py @@ -92,13 +92,11 @@ def has_true_attrlist(node, attrlist): def keep_lineage(first_node, node, fk, cl_except): - """ - Search for a lineage decending from a node that is longer - than a given threshold, max_linlen. If node exception is meeet - in cl_except e.g. a feature that should never be collapsed - the searchis terminated, likewise it is terminated when the - threshold of a lineage is found, that is: - linlen > max_linlen True + """Search for a lineage decending from a node that is longer than a given + threshold, max_linlen. If node exception is meeet in cl_except e.g. a + feature that should never be collapsed the searchis terminated, likewise it + is terminated when the threshold of a lineage is found, that is: linlen > + max_linlen True. child -----* @@ -188,10 +186,10 @@ def read_plot_config(fnam): def read_tree_stats(fnam): - """ - Read a comma separated table into a dict of dicts. - First line will be interpretted as the header with column names, - the following lines will be interpretted as entries with the first + """Read a comma separated table into a dict of dicts. + + First line will be interpretted as the header with column names, the + following lines will be interpretted as entries with the first element being the node name to map back to. """ with open(fnam) as fh: @@ -208,7 +206,7 @@ def read_tree_stats(fnam): def hamming_distance(seq1, seq2): - """Hamming distance between two sequences of equal length""" + """Hamming distance between two sequences of equal length.""" return sum(x != y for x, y in zip(seq1, seq2)) @@ -278,8 +276,8 @@ def tree_render_default(tree, frame=None): def tree_render_user(tree, frame=None, tree_features=None, namecolor=None): - """ - Base function to add rendering attributes to an ete3 tree. + """Base function to add rendering attributes to an ete3 tree. + The function can plot tree is default mode and/or take user input. """ from Bio.Seq import Seq @@ -405,10 +403,8 @@ def my_layout(node): def prune_long_branches(tree, cutlength): - """ - Detach the whole decending clade if a branch length - is encountered above a given cutlength. - """ + """Detach the whole decending clade if a branch length is encountered above + a given cutlength.""" for node in tree.traverse(): if node.dist > cutlength: node.detach() @@ -416,10 +412,8 @@ def prune_long_branches(tree, cutlength): def update_after_collapse(node_up, node, tree_features=None): - """ - Update the feature according to its type and specifications - in the tree_features dict - """ + """Update the feature according to its type and specifications in the + tree_features dict.""" feature_set = node_up.features.union(node.features) feature_set.remove("dist") feature_set.remove("name") @@ -473,11 +467,12 @@ def update_after_collapse(node_up, node, tree_features=None): def collapse_syn(tree, frame=None, tree_features=None): - """ - Recalculate the branch lengths as hamming distance between amino acid sequences. - Then collapse all branches with zero length and update the features by either - taking the sum of the mean, if the feature is a number, if the feature is a string - then just keep the parent feature. + """Recalculate the branch lengths as hamming distance between amino acid + sequences. + + Then collapse all branches with zero length and update the features + by either taking the sum of the mean, if the feature is a number, if + the feature is a string then just keep the parent feature. """ from Bio.Seq import Seq diff --git a/scripts/simstatagg.py b/scripts/simstatagg.py index f80fea65..32f11efc 100755 --- a/scripts/simstatagg.py +++ b/scripts/simstatagg.py @@ -1,9 +1,8 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -aggregation plots of metrics from several simulation runs with same parameters -""" +"""aggregation plots of metrics from several simulation runs with same +parameters.""" from matplotlib import pyplot as plt import pandas as pd diff --git a/scripts/summary_stats.py b/scripts/summary_stats.py index 6eeaef60..aac26e95 100755 --- a/scripts/summary_stats.py +++ b/scripts/summary_stats.py @@ -1,10 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -summary stats of the seq data going into tree inference -for CFT -""" +"""summary stats of the seq data going into tree inference for CFT.""" from deduplicate import fasta_parse from matplotlib import pyplot as plt diff --git a/scripts/tree_functions.py b/scripts/tree_functions.py index b6d8597d..2d26f24c 100755 --- a/scripts/tree_functions.py +++ b/scripts/tree_functions.py @@ -3,11 +3,9 @@ def lineage_length_bigger_than(first_node, node, max_linlen): - """ - Search for a lineage decending from a node that is longer - than a given threshold, max_linlen. Terminate is such a - lineage is found, that is: - linlen > max_linlen True + """Search for a lineage decending from a node that is longer than a given + threshold, max_linlen. Terminate is such a lineage is found, that is: + linlen > max_linlen True. child -----* diff --git a/scripts/validaggreg.py b/scripts/validaggreg.py index 74dba00a..a5c6c2a5 100755 --- a/scripts/validaggreg.py +++ b/scripts/validaggreg.py @@ -1,9 +1,8 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -aggregation plots of validation output from several simulation/validation runs -""" +"""aggregation plots of validation output from several simulation/validation +runs.""" from matplotlib import pyplot as plt import pandas as pd diff --git a/scripts/validaggreg_compare.py b/scripts/validaggreg_compare.py index 86866248..76a3ad75 100755 --- a/scripts/validaggreg_compare.py +++ b/scripts/validaggreg_compare.py @@ -1,9 +1,8 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -aggregation plots of validation output from several simulation/validation runs -""" +"""aggregation plots of validation output from several simulation/validation +runs.""" from matplotlib import pyplot as plt import pandas as pd diff --git a/scripts/validation.py b/scripts/validation.py index 96c3ba02..0aea8cea 100755 --- a/scripts/validation.py +++ b/scripts/validation.py @@ -1,9 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" -comparison of inference and simulated trees -""" +"""comparison of inference and simulated trees.""" from gctree.utils import hamming_distance from random import randint @@ -57,14 +55,15 @@ def find_node_by_seq(tree, sequence): def align_lineages( seq, tree_t, tree_i, gap_penalty_pct=0, known_root=True, allow_double_gap=False ): - """ - Standard implementation of a Needleman-Wunsch algorithm as described here: - http://telliott99.blogspot.com/2009/08/alignment-needleman-wunsch.html - https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm - And implemented here: - https://github.com/alevchuk/pairwise-alignment-in-python/blob/master/alignment.py - - gap_penalty_pct is the gap penalty relative to the sequence length of the sequences on the tree. + """Standard implementation of a Needleman-Wunsch algorithm as described + here: http://telliott99.blogspot.com/2009/08/alignment-needleman- + wunsch.html + https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm And + implemented here: https://github.com/alevchuk/pairwise-alignment-in- + python/blob/master/alignment.py. + + gap_penalty_pct is the gap penalty relative to the sequence length + of the sequences on the tree. """ nt = find_node_by_seq(tree_t, seq) lt = reconstruct_lineage(tree_t, nt) @@ -230,10 +229,8 @@ def lineage_dist( def validate(true_tree, inferences, true_tree_colormap, outbase): - """ - inferences is a dict mapping inference name, like "gctree" to pickle files of - CollapsedForest - """ + """inferences is a dict mapping inference name, like "gctree" to pickle + files of CollapsedForest.""" # With/without frequency weighting: all_lineage_dist = lambda x, y: [ From 2fc76617b95aaee95117bcf19d41fa94ccd5d71b Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 22:16:15 -0700 Subject: [PATCH 07/32] rm igphyml --- README.md | 18 - SConscript.inference | 99 +- SConscript.simulation | 6 +- SConstruct | 10 +- igphyml_files/ancReconstructHLP16.pl | 1285 -------------------------- igphyml_files/igphyml_tools.py | 278 ------ scripts/aggregate_compare.py | 2 - scripts/validaggreg.py | 11 +- 8 files changed, 11 insertions(+), 1698 deletions(-) delete mode 100644 igphyml_files/ancReconstructHLP16.pl delete mode 100644 igphyml_files/igphyml_tools.py diff --git a/README.md b/README.md index cce96d47..efae1046 100644 --- a/README.md +++ b/README.md @@ -237,8 +237,6 @@ The under-the-hood functionality of the `gctree` package might be useful for som ### arguments for both inference and simulation programs -`--igphyml` include results for tree inference with the IgPhyML package - `--dnaml` include results for maximum likelihood tree inference using `dnaml` from the PHYLIP package `--nogctree` do not perform gctree inference @@ -256,19 +254,3 @@ The under-the-hood functionality of the `gctree` package might be useful for som `--carry_cap` carrying capacity of germinal center `--skip_update` skip update step - -### additional dependencies for development functionality -* IgPhyML (https://github.com/kbhoehn/IgPhyML) - * Needs to be in $PATH -* perl5, with modules: - * PDL - * PDL::LinearAlgebra::Trans - -* installing python and perl dependencies * -``` -sudo apt-get install python-pip scons -pip install --user ete3 seaborn numpy scipy matplotlib pandas biopython nestly -cpan -> install PDL -> install PDL::LinearAlgebra::Trans -``` diff --git a/SConscript.inference b/SConscript.inference index 977e2742..92b334ce 100644 --- a/SConscript.inference +++ b/SConscript.inference @@ -18,7 +18,7 @@ def which(executable): # the following must be exported by parent SConstruct/SConscript Import( - "env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile" + "env gctree dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile" ) @@ -45,7 +45,7 @@ def delete_on_failure(): return_list = [] -if gctree or igphyml or dnaml: +if gctree or dnaml: if input_file2 is not None: basename = "combined" elif isinstance(input_file, str): @@ -88,8 +88,8 @@ if gctree or igphyml or dnaml: if bootstrap: - if igphyml or dnaml: - raise NotImplementedError("bootstrap not implemented for dnaml or igphyml") + if dnaml: + raise NotImplementedError("bootstrap not implemented for dnaml") bootstrap_arg = " --bootstrap {} ".format(bootstrap) seqboot_config = env.Command( @@ -233,95 +233,4 @@ if gctree: ) return_list.append(gctree_infer) - -if igphyml: - # basename = 'igphyml' - # Need the dedup phy as fa for ASR: - dedup_fasta = env.Command( - [ - os.path.join(outdir, basename + ".dedup.fasta"), - os.path.join(outdir, basename + ".dedup.log"), - ], - phylip[0], - "seqmagick convert $SOURCE ${TARGETS[0]} > ${TARGETS[1]}", - ) - - # Run IgPhyML with the GY94 model to get the initial topology: - igphyml_gy94_topology = CommandRunner( - [ - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt_gy94"), - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt_gy94.log"), - ], - phylip[0], - "igphyml -i $SOURCE -m GY -w M0 -t e --run_id gy94 > ${TARGETS[1]}", - ) - - # Run IgPhyML with the HLP16 model using the GY94 tree topology as starting point: - igphyml_opti = "tlr -s" # <--- can be changed to 'lr' or 'r' - ### Full motif model: --motifs WRC_2:0,GYW_0:1,WA_1:2,TW_0:3,SYC_2:4,GRS_0:5 --hotness e,e,e,e,e,e - ### Less parameter rich motif model: --motifs WRC_2:0,GYW_0:0,WA_1:1,TW_0:2,SYC_2:3,GRS_0:3 --hotness e,e,e,e - igphyml_hlp16 = CommandRunner( - [ - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt"), - os.path.join(outdir, basename + ".phylip_igphyml_stats.txt"), - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.log"), - ], - [phylip[0], igphyml_gy94_topology[0]], - "igphyml --motifs WRC_2:0,GYW_0:1,WA_1:2,TW_0:3,SYC_2:4,GRS_0:5 --hotness e,e,e,e,e,e -i ${SOURCES[0]} -u ${SOURCES[1]} -m HLP17 --root " - + naiveID - + " -o " - + igphyml_opti - + " --run_id hlp16 > ${TARGETS[2]}", - ) - - # On the HLP16 output tree make the naive sequence an outgroup: - naive_outgroup = env.Command( - [ - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.outgroup"), - os.path.join(outdir, basename + ".phylip_igphyml_tree.txt.outgroup.log"), - ], - igphyml_hlp16[0], - "python igphyml_files/igphyml_tools.py reroot --tree $SOURCE --reroot_tree ${TARGETS[0]} --pattern " - + naiveID - + " --outgroup 1 > ${TARGETS[1]}", - ) - - igphyml_dir = which("igphyml") - assert igphyml_dir is not None - igphyml_dir = re.sub(r"/src/\w+$", "", igphyml_dir) - # Run IgPhyML ASR script: - run_ASR = CommandRunner( - [ - os.path.join(outdir, basename + ".MLcodons.fa"), - os.path.join(outdir, basename + ".igphyml_hlp16.MLcodons.log"), - ], - [igphyml_hlp16[1], naive_outgroup[0], dedup_fasta[0]], - buffarg - + "perl igphyml_files/ancReconstructHLP16.pl PLACEHOLDER_CONFIG_FILE -rooted 1 -length D -stats ${SOURCES[0]} -tree ${SOURCES[1]} -seqfile ${SOURCES[2]} -outdir " - + outdir - + " -stem " - + basename - + " -rootid " - + naiveID - + " -igphyml " - + igphyml_dir - + "> ${TARGETS[1]}", - ) - - # Convert the ASR output to an collapsed forest with an ete3 tree and pickle it: - igphyml_infer = env.Command( - [ - os.path.join(outdir, "igphyml.inferred_tree.p"), - os.path.join(outdir, "igphyml.inferred_tree.log"), - ], - [naive_outgroup[0], phylip[1], run_ASR], - xarg - + "python igphyml_files/igphyml_tools.py ASR_parser --tree ${SOURCES[0]} --counts ${SOURCES[1]} --asr_seq ${SOURCES[2]} --outbase " - + os.path.join(outdir, "igphyml.inferred_tree") - + " --naive " - + naiveID - + " > ${TARGETS[1]}", - ) - return_list.append(igphyml_infer) - Return("return_list") diff --git a/SConscript.simulation b/SConscript.simulation index 1830f99e..435c000e 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -7,7 +7,7 @@ from nestly.scons import SConsWrap # the following must be exported by parent SConstruct/SConscript Import( - "env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg" + "env gctree dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg" ) nest = Nest() @@ -97,7 +97,7 @@ def infer(outdir, c): colorfile = None return SConscript( "SConscript.inference", - exports="env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env gctree dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", ) @@ -137,7 +137,7 @@ if gctree: @w.add_target() def gctree_aggregate(outdir, c): """aggregate validation results""" - allmetrics_arg = " --allmetrics" if igphyml or dnaml else "" + allmetrics_arg = " --allmetrics" if dnaml else "" tgt = env.Command( [ os.path.join(outdir, "gctree.validaggreg.tsv"), diff --git a/SConstruct b/SConstruct index 51f6909c..e4df23f8 100644 --- a/SConstruct +++ b/SConstruct @@ -38,8 +38,6 @@ AddOption("--frame", type="int", default=None, help="codon frame") frame = GetOption("frame") AddOption("--nogctree", action="store_true", help="don" "t use gctree inference") gctree = GetOption("nogctree") != True -AddOption("--igphyml", action="store_true", help="use igphyml inference") -igphyml = GetOption("igphyml") AddOption("--dnaml", action="store_true", help="use dnaml inference") dnaml = GetOption("dnaml") AddOption("--outdir", type="string", help="directory in which to output results") @@ -72,10 +70,8 @@ class InputError(Exception): """Exception raised for errors in the input.""" -if not gctree and not igphyml and not GetOption("help"): +if not gctree and not GetOption("help"): raise InputError("must set at least one inference method") -if igphyml and frame != 1: - raise InputError("frame must equal 1 for igphyml") if not simulate and not inference and not GetOption("help"): raise InputError( @@ -244,12 +240,12 @@ if simulate and not GetOption("help"): raise InputError("outdir must be specified") SConscript( "SConscript.simulation", - exports="env gctree igphyml dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg", + exports="env gctree dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg", ) elif inference and not GetOption("help"): if None in [input_file, outdir]: raise InputError("input fasta or phylip and outdir must be specified") SConscript( "SConscript.inference", - exports="env gctree igphyml dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env gctree dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", ) diff --git a/igphyml_files/ancReconstructHLP16.pl b/igphyml_files/ancReconstructHLP16.pl deleted file mode 100644 index 18af4857..00000000 --- a/igphyml_files/ancReconstructHLP16.pl +++ /dev/null @@ -1,1285 +0,0 @@ -#!/usr/bin/env perl -#Kenneth B. Hoehn (kenneth.hoehn@oriel.ox.ac.uk) - -# Script written by Kenneth B. Hoehn and used in article: -# A Phylogenetic Codon Substitution Model for Antibody Lineages -# http://www.genetics.org/content/early/2017/03/15/genetics.116.196303 -=pod -@article{hoehn2017phylogenetic, - title={A phylogenetic codon substitution model for antibody lineages}, - author={Hoehn, Kenneth B and Lunter, Gerton and Pybus, Oliver G}, - journal={Genetics}, - volume={206}, - number={1}, - pages={417--427}, - year={2017}, - publisher={Genetics Soc America} -} -=cut - - -use strict; -use warnings; -use PDL; -use PDL::LinearAlgebra::Trans; -my $SMALL = 1e-200; - -sub Fill_upp{ - my $node = $_[0]; - my $seqs = $_[1]; - my $Qs = $_[2]; #array reference of q matrixes - my $partition = $_[3]; #array of partition indexes - my $nparts = $_[4]; #number of unique partitions - - my @keys = keys %$seqs; - my $length = length($seqs->{$keys[0]})/3; - my @bigempty; - for(my $i=0; $i < $length; $i++){ - my @empty = (-200)x61; - push(@bigempty,\@empty); - } - $node->{"uppmat"}=\@bigempty; - - if($node->{"level"}==0){#if at root node - #don't do anything, because this isn't a real node :) - }elsif($node->{"level"}==1){ #one below root - my $other; #other node to either the left or right - if($node->{"up"}->{"left"} eq $node){$other="right"} - elsif($node->{"up"}->{"right"} eq $node){$other="left"} - else{die("something weird happened")} - my @Pxz; - for(my $i=0;$i<$nparts;$i++){ - push(@Pxz,mexp($Qs->[$i]*$node->{"up"}->{$other}->{"dist"})); - } - for(my $i=0; $i < $length;$i++){ - for(my $j=0;$j<61;$j++){ - my $sumxz; - if ($Pxz[$partition->[$i]]->at(0,$j) > 0) { - $sumxz = log($Pxz[$partition->[$i]]->at(0,$j))+$node->{"up"}->{$other}->{"mat"}->[$i][0]; - } else { - $sumxz = log($SMALL)+$node->{"up"}->{$other}->{"mat"}->[$i][0]; - } - for(my $k=1;$k<61;$k++){ - if($Pxz[$partition->[$i]]->at($k,$j)==0){print $node->{"dist"}." $k $j\n"} - my $pxz; - if ($Pxz[$partition->[$i]]->at($k,$j) > 0) { - $pxz = log($Pxz[$partition->[$i]]->at($k,$j)) + $node->{"up"}->{$other}->{"mat"}->[$i][$k]; - } else { - $pxz = log($SMALL) + $node->{"up"}->{$other}->{"mat"}->[$i][$k]; - } - $sumxz = $sumxz + log(1+exp($pxz-$sumxz)); - } - $node->{"uppmat"}->[$i][$j] = $sumxz; - } - } - }else{#if not at the root node - my $other; #other node to either the left or right - if($node->{"up"}->{"left"} eq $node){$other="right"} - elsif($node->{"up"}->{"right"} eq $node){$other="left"} - else{die("something weird happened")} - my @Pxy; my @Pyv; - for(my $i=0;$i<$nparts;$i++){ - push(@Pxy,mexp($Qs->[$i]*$node->{"up"}->{"dist"})); - push(@Pyv,mexp($Qs->[$i]*$node->{"up"}->{$other}->{"dist"})); - } - #pxy - for(my $i=0; $i < $length;$i++){ - for(my $j=0;$j<61;$j++){ - my $sumxy; - if ($Pxy[$partition->[$i]]->at($j,0) > 0) { - $sumxy = log($Pxy[$partition->[$i]]->at($j,0))+$node->{"up"}->{"uppmat"}->[$i][0]; - } else { - $sumxy = log($SMALL)+$node->{"up"}->{"uppmat"}->[$i][0]; - } - for(my $k=1;$k<61;$k++){ - if($Pxy[$partition->[$i]]->at($k,$j)==0){print $node->{"up"}->{"dist"}." $k $j\n"} - my $pxy; - if ($Pxy[$partition->[$i]]->at($j,$k) > 0) { - $pxy = log($Pxy[$partition->[$i]]->at($j,$k)) + $node->{"up"}->{"uppmat"}->[$i][$k]; - } else { - $pxy = log($SMALL) + $node->{"up"}->{"uppmat"}->[$i][$k]; - } - $sumxy = $sumxy + log(1+exp($pxy-$sumxy)); - } - $node->{"uppmat"}->[$i][$j] = $sumxy; - } - } - #pyv - for(my $i=0; $i < $length;$i++){ - for(my $j=0;$j<61;$j++){ - my $sumyv; - if ($Pyv[$partition->[$i]]->at(0,$j) > 0) { - $sumyv = log($Pyv[$partition->[$i]]->at(0,$j))+$node->{"up"}->{$other}->{"mat"}->[$i][0]; - } else { - $sumyv = log($SMALL)+$node->{"up"}->{$other}->{"mat"}->[$i][0]; - } - for(my $k=1;$k<61;$k++){ - if($Pyv[$partition->[$i]]->at($k,$j)==0){print $node->{"up"}->{$other}->{"dist"}." $k $j ".$Pyv[$partition->[$i]]->at($k,$j)."\n"} - my $pyv; - if ($Pyv[$partition->[$i]]->at($k,$j) > 0) { - $pyv = log($Pyv[$partition->[$i]]->at($k,$j)) + $node->{"up"}->{$other}->{"mat"}->[$i][$k]; - } else { - $pyv = log($SMALL) + $node->{"up"}->{$other}->{"mat"}->[$i][$k]; - } - $sumyv = $sumyv + log(1+exp($pyv-$sumyv)); - } - $node->{"uppmat"}->[$i][$j] += $sumyv; - } - } - } - #tally up stuff - my $upphood = 0; - for(my $i=0; $i < $length;$i++){ - my $sumyv; - for(my $j=0;$j<61;$j++){ - if($j==0){$sumyv=$node->{"uppmat"}->[$i][$j];} - else{$sumyv = $sumyv + log(1+exp($node->{"uppmat"}->[$i][$j]-$sumyv));} - } - $upphood += $sumyv; - } - print "Upphood\t".$node->{"subtaxa"}."\t$upphood\n"; - - if(exists($node->{"left"})){ #recurse! - Fill_upp($node->{"right"},$seqs,$Qs,$partition,$nparts); - Fill_upp($node->{"left"},$seqs,$Qs,$partition,$nparts); - } -} - -sub Marginal_ASR{ - my $node = $_[0]; - my $seqs = $_[1]; - my $Qs = $_[2]; #array reference of q matrixes - my $partition = $_[3]; #array of partition indexes - my $nparts = $_[4]; #number of unique partitions - - my @keys = keys %$seqs; - my $length = length($seqs->{$keys[0]})/3; - - if($node->{"level"} != 0){ - my @charmat; - my @Pyv; - for(my $i=0;$i<$nparts;$i++){ - push(@Pyv,mexp($Qs->[$i]*$node->{"dist"})); - } - my $lhood = 0; - for(my $i=0; $i < $length;$i++){ - my @sitemat;#relative lhoods of each v at the site - my $sitelhood; - my $maxchar; - my $maxlhood; - for(my $v=0;$v<61;$v++){ - my $lhoodv; - for(my $y=0;$y<61;$y++){ - my $val; - if ($Pyv[$partition->[$i]]->at($v,$y) > 0) { - $val = $node->{"uppmat"}->[$i][$y]+log($Pyv[$partition->[$i]]->at($v,$y))+$node->{"mat"}->[$i][$v]; - } else { - $val = $node->{"uppmat"}->[$i][$y]+log($SMALL)+$node->{"mat"}->[$i][$v]; - } - if($y==0){$lhoodv=$val;} - else{$lhoodv = $lhoodv + log(1+exp($val-$lhoodv));} - } - push(@sitemat,$lhoodv); - if($v == 0){$sitelhood = $lhoodv;} - else{$sitelhood=$sitelhood + log(1+exp($lhoodv-$sitelhood));} - } - push(@charmat,\@sitemat); - $lhood += $sitelhood; - } - $node->{"Codon_lhoods"}=\@charmat; - print "Anc recon:\t".$node->{"subtaxa"}."\tLikelihood:\t$lhood\n"; - } - if(exists($node->{"left"})){ - Marginal_ASR($node->{"right"},$seqs,$Qs,$partition,$nparts); - Marginal_ASR($node->{"left"},$seqs,$Qs,$partition,$nparts); - } -} - -sub Pruning_Lhood{ - my $node = $_[0]; - my $seqs = $_[1]; - my $codoni = $_[2]; - my $Qs = $_[3]; #array reference of q matrixes - my $partition = $_[4]; #array of partition indexes - my $nparts = $_[5]; #number of unique partitions - my $ambig_char = $_[6]; - - my @keys = keys %$seqs; - my $length = length($seqs->{$keys[0]})/3; - my @bigempty; - for(my $i=0; $i < $length; $i++){ - my @empty = (-200)x61; - push(@bigempty,\@empty); - } - $node->{"mat"}=\@bigempty; - - if(!exists($seqs->{$node->{"id"}})){ #internal node - my $r = Pruning_Lhood($node->{"right"},$seqs,$codoni,$Qs,$partition,$nparts,$ambig_char); - my $l = Pruning_Lhood($node->{"left"},$seqs,$codoni,$Qs,$partition,$nparts,$ambig_char); - my @Prs; my @Pls; - for(my $i=0;$i<$nparts;$i++){ - push(@Prs,mexp($Qs->[$i]*$node->{"right"}->{"dist"})); - push(@Pls,mexp($Qs->[$i]*$node->{"left"}->{"dist"})); - } - for(my $i=0; $i < $length;$i++){ - for(my $j=0;$j<61;$j++){ - my $sumr; - my $suml; - if ($Prs[$partition->[$i]]->at(0,$j) > 0) { - $sumr = log($Prs[$partition->[$i]]->at(0,$j))+$node->{"right"}->{"mat"}->[$i][0]; - } else { - $sumr = log($SMALL)+$node->{"right"}->{"mat"}->[$i][0]; - } - if ($Pls[$partition->[$i]]->at(0,$j) > 0) { - $suml = log($Pls[$partition->[$i]]->at(0,$j))+$node->{"left"}->{"mat"}->[$i][0]; - } else { - $suml = log($SMALL)+$node->{"left"}->{"mat"}->[$i][0]; - } - for(my $k=1;$k<61;$k++){ - if($Prs[$partition->[$i]]->at($k,$j)==0){print $node->{"dist"}." $k $j\n"} - my $pr; - my $pl; - if ($Prs[$partition->[$i]]->at($k,$j) > 0) { - $pr = log($Prs[$partition->[$i]]->at($k,$j)) + $node->{"right"}->{"mat"}->[$i][$k]; - } else { - $pr = log($SMALL) + $node->{"right"}->{"mat"}->[$i][$k]; - } - if ($Pls[$partition->[$i]]->at($k,$j) > 0) { - $pl = log($Pls[$partition->[$i]]->at($k,$j)) + $node->{"left"}->{"mat"}->[$i][$k]; - } else { - $pl = log($SMALL) + $node->{"left"}->{"mat"}->[$i][$k]; - } - $sumr = $sumr + log(1+exp($pr-$sumr)); - $suml = $suml + log(1+exp($pl-$suml)); - } - $node->{"mat"}->[$i][$j] = $sumr+$suml; - } - } - }else{ #external node - my @s = split("",$seqs->{$node->{"id"}}); - my @t = @{transarrayCodon(\@s,$codoni)}; - for(my $i=0; $i < scalar(@{$node->{"mat"}});$i++){ - my $val=log(1); - if($t[$i] ne "NA"){ #adjust for ambiguous sites - $node->{"mat"}->[$i][$t[$i]]=$val; - }else{ - #fill in equilibrium frequencies for ambiguous state - for(my $j = 0; $j < 61; $j++){ - if(!exists($ambig_char->{$node->{"id"}}->{$i}->[$j])){ - print $node->{"id"}."\t$i\t$j\n"; - print $ambig_char->{$node->{"id"}}."\n"; - print $ambig_char->{$node->{"id"}}->{$i}."\n"; - print $ambig_char->{$node->{"id"}}->{$i}->[$j]."\n"; - die(); - } - my $val = $ambig_char->{$node->{"id"}}->{$i}->[$j]; - if($val == 0){$val=-200} - else{$val = log($val)} - $node->{"mat"}->[$i][$j] = $val; - } - } - } - } - my $lhood=0; - for(my $i=0; $i < $length;$i++){ - my $slhood = $node->{"mat"}->[$i]->[0]; - for(my $j=1;$j<61;$j++){ - $slhood = $slhood + log(1+exp($node->{"mat"}->[$i]->[$j]-$slhood)); - } - $lhood += $slhood; - } - if($node->{"level"} != 0){ - print $node->{"id"}."\t".$node->{"up"}->{"id"}."\t$lhood\n"; - }else{ - print $node->{"id"}."\t"."NONE"."\t$lhood\n"; - } - return($lhood); -} - -#Make Q matrix for HLP16 -sub getQmat_HLP16{ - my $bij = $_[0]; - my $kappa =$_[1]; - my $omega = $_[2]; - my %freqs = %{$_[3]}; - my @codons = @{$_[4]}; - my $print = $_[5]; - my %tr = %{codonTable()}; - my %q; - for(my $i=0; $i < scalar(@codons); $i++){ - my $from = $codons[$i]; - for(my $j=0; $j < scalar(@codons); $j++){ - my $to = $codons[$j]; - if($from eq $to){$q{$from.$to}=0;next;} - my @diff = @{diffPos($from,$to)}; - if(scalar(@diff) > 1){ - $q{$from.$to}=$SMALL; - }else{ - my @dc = sort {$a cmp $b} (substr($from,$diff[0],1),substr($to,$diff[0],1)); - if("@dc" eq "a g" || "@dc" eq "c t"){ - if($tr{$from} eq $tr{$to}){ - $q{$from.$to} = $kappa*$freqs{$to}*(1+$bij->[$i*61+$j]); - }else{ - $q{$from.$to} = $omega*$kappa*$freqs{$to}*(1+$bij->[$i*61+$j]); - } - } - else{ - if($tr{$from} eq $tr{$to}){ - $q{$from.$to} = $freqs{$to}*(1+$bij->[$i*61+$j]); - }else{ - $q{$from.$to} = $omega*$freqs{$to}*(1+$bij->[$i*61+$j]); - } - } - } - } - } - my $trate = 0; - foreach my $from (@codons){ - my $fsum = 0; - foreach my $to (@codons){ - $fsum += $q{$from.$to}; - } - $q{$from.$from}=-$fsum; - $trate += $freqs{$from}*$fsum; - } - if($print){ print "$trate\n";} - #check that rows sum to 0 - foreach my $from (@codons){ - my $fsum = 0; - foreach my $to (@codons){ - $fsum += $q{$from.$to}; - } - if($fsum > 0.0001){die("fsum > 0.0001f irst $from $fsum\n")} - } - #scale to a relative rate of 1 - my $rate = 0; - foreach my $from (@codons){ - foreach my $to (@codons){ - $q{$from.$to} = $q{$from.$to}/$trate; - } - $rate -= $freqs{$from}*$q{$from.$from}; - } - if($print){print "Mean rate: ".$rate."\n";} - #check that rows sum to 0 - foreach my $from (@codons){ - my $fsum = 0; - foreach my $to (@codons){ - $fsum += $q{$from.$to}; - } - if($fsum > 0.0001){die("$from $fsum\n")} - } - - my @pdls; - foreach my $from (@codons){ - my @row; - foreach my $to (@codons){ - push(@row,$q{$from.$to}) - } - push(@pdls,pdl([@row])); - } - my $Q = $pdls[0]; - for(my $i = 1; $i < 61; $i++){ - $Q = $Q->glue(1,$pdls[$i]); - } - return($Q); -} - - -#Read in a fasta file -sub getfasta{ - my($filename) = @_; - chomp($filename); - my $trying = "Unable to open $filename.\n"; - open(INPUTFILE, $filename) or die($trying); # Create a new file - my @filedata = ; - close INPUTFILE; - my %seqs; - my $seqname; - my $seq = ''; - if(scalar(@filedata)==0){return \%seqs} - foreach my $line (@filedata) { - if($line =~/^\s*$/) { next; } # Ignore blank lines - elsif($line =~/^\s*#/) { next; } # Ignore comments - elsif($line =~ /^\>\s*(.*)\s*$/) { - my $temp = $1; - $temp =~ s/\s//sg; - if(length($seq) > 0) { - $seq =~ s/\s//sg; - $seqs{$seqname} = $seq; - $seq = ''; - } - $seqname = $temp; - next; - } else { $seq .= $line; } - } - $seq =~ s/\s//sg; - $seqs{$seqname} = $seq; - return \%seqs; -} - -#Read in a rooted Newick tree -sub rootedNewick { - my $in = $_[0]; - my $node = $_[1]; - my $level = $_[2]; - my $first; my $id; - if($in =~ /(,|\(|\)|;)/){ - $first = $&; - $node->{"id"} = $`; - $node->{"level"} = $level; - $in = $'; - if($first eq ","){$in = $first.$in} - }else{ - die($in); - } - if($first eq "("){#left - my %n; - $node->{"left"} = \%n; - $in = rootedNewick($in,\%n,$level+1); - } - elsif($first eq ","){#up - return($in); - } - elsif($first eq ")"){#up - return($in); - } - elsif($first eq ";"){#up - return($in); - } - my $second; - my $pre; - if($in =~ /(,|\(|\)|;)/){ - $second = $&; - $in = $'; - $pre = $`; - }else{ - die($in); - } - if($second eq ","){#right - my %n; - $node->{"right"} = \%n; - $in = rootedNewick($in,\%n,$level+1); - }elsif($second eq ")"){#up - } - if($in =~ /(,|\(|\)|;)/){ - $node->{"id"} = $`; - $in = $'; - if($& eq ","){$in = $&.$'} - }else{ - die($in); - } - return($in); -} - -#read in a rooted newick tree -sub readInRootedNewick{ - my $in = $_[0]; - my $printtree = $_[1]; - - my %root; #set up root node - my $oin = $in; - $root{"dist"}=0; - rootedNewick($in,\%root,0); - getdists(\%root); #parse distance - getdivergence(\%root,0); #get divergences - - my $t = printtreestring(\%root,"").";"; - if($t ne $oin){print "Tree read in incorrectly!Probably not an issue if you had zero branch lengths\n$oin\n$t\n";} - else{print "Tree read in correctly\n";} - - if($printtree){ - $t = printtreestring(\%root,"").";"; - print("$oin\n$t\n"); - } - return(\%root); -} - -sub relevel{ - my $node = $_[0]; - my $increase = $_[1]; - if(exists($node->{"right"})){ - relevel($node->{"right"},$increase); - relevel($node->{"left"},$increase); - } - $node->{"level"}=$node->{"level"}+$increase; -} - - -#Once tree is read in, need to get the branch lengths -#Once tree is read in, need to get the branch lengths -sub getdists{ - my $node = $_[0]; - if(exists($node->{"left"})){ - getdists($node->{"left"}); - getdists($node->{"right"}); - } - if(!exists($node->{"id"})){ - die("Node ID doens't exist!"); - }else{ - if($node->{"id"}=~/\:/){ - $node->{"dist"} = $'; - $node->{"id"} = $`; - if($node->{"dist"} == 0){ - $node->{"dist"} = 0.0000000000000000000001; - print "zero length branch length caught\n"; - } - }else{ - if($node->{"level"} != 0){ - die($node->{"id"}." level ".$node->{"level"}." is formatted incorrectly!"); - } - } - } -} - -#Get the divergences for each node in the tree -sub getdivergence{ - my $node = $_[0]; - my $div = $_[1]; - $node->{"divergence"} = $div + $node->{"dist"}; - if(exists($node->{"left"})){ - getdivergence($node->{"left"},$node->{"divergence"}); - getdivergence($node->{"right"},$node->{"divergence"}); - } -} - -#Print out the tree in Newick format to a string -sub printtreestring{ - my $node = $_[0]; - my $string = $_[1]; - if(exists($node->{"left"})){ - $string = $string."("; - $string=printtreestring($node->{"left"},$string); - $string = $string.","; - $string=printtreestring($node->{"right"},$string); - $string=$string.")"; - } - if($node->{"level"} != 0){ - $string = $string.$node->{"id"}.":".$node->{"dist"}; - } - return($string); -} - - -#translate codons to indexes in Q matrix -sub transarrayCodon{ - my @in = @{$_[0]}; - my %codoni = %{$_[1]}; - my @trans; - for(my $i = 0; $i < scalar(@in); $i+=3){ - if(!exists($codoni{lc $in[$i].$in[$i+1].$in[$i+2]})){ - push(@trans,"NA"); - }else{ - push(@trans,$codoni{lc $in[$i].$in[$i+1].$in[$i+2]}); - } - } - return(\@trans); -} - -#re-translate indexes to codons -sub untransarrayCodon{ - my @in = @{$_[0]}; - my @codons = @{$_[1]}; - my @trans; - for(my $i = 0; $i < scalar(@in); $i++){ - if($in[$i] ne "NA"){ - push(@trans,$codons[$in[$i]]); - }else{ - print "NA found $i\n"; - push(@trans,"NNN"); - } - } - return(\@trans); -} - -#Print ML codon sequence at all nodes -sub printML_codon{ - my $node = $_[0]; - my $string = $_[1]; - my $codons = $_[2]; - if(exists($node->{"left"})){ - $string = printML_codon($node->{"left"},$string,$codons); - $string = printML_codon($node->{"right"},$string,$codons); - } - - if($node->{"level"}!=0){ - my @sequence; - for(my $i=0; $i < scalar(@{$node->{"Codon_lhoods"}});$i++){ - my $max = -inf; - my $maxchar = -1; - for(my $j=0; $j < 61; $j++){ - my $n = $node->{"Codon_lhoods"}->[$i][$j]; - if($n > $max){ - $max = $n; - $maxchar=$j; - } - } - push(@sequence,$maxchar); - } - $node->{"sequence"} = \@sequence; - - my @seq = @{untransarrayCodon($node->{"sequence"},$codons)}; - my $sequence = ""; - foreach my $s (@seq){$sequence = $sequence.$s;} - $string = $string.">".$node->{"level"}.";".$node->{"subtaxa"}.";".$node->{"divergence"}."\n$sequence\n"; - } - - return($string); -} - -#Print ML amino acid sequence at all nodes -sub printML_aa{ - my $node = $_[0]; - my $string = $_[1]; - my $codons = $_[2]; - my $aatable1 = $_[3]; - my $aatable3 = $_[4]; - if(exists($node->{"left"})){ - $string = printML_aa($node->{"left"}, $string,$codons,$aatable1,$aatable3); - $string = printML_aa($node->{"right"},$string,$codons,$aatable1,$aatable3); - } - - if($node->{"level"}!=0){ - my @sequence; - for(my $i=0; $i < scalar(@{$node->{"Codon_lhoods"}});$i++){ - my %aas; - for(my $j=0; $j < 61; $j++){ #tally up relative likelihoods of amino acids - my $n = $node->{"Codon_lhoods"}->[$i][$j]; - my $aa = $aatable1->{uc $aatable3->{$codons->[$j]}}; #single letter amino acid - if(exists($aas{$aa})){ - $aas{$aa} = $aas{$aa} + log(1+exp($n - $aas{$aa})) - }else{ - $aas{$aa} = $n - } - } - - my $max = -inf; - my $maxchar = -1; - foreach my $key (keys %aas){ - my $n = $aas{$key}; - if($n > $max){ - $max = $n; - $maxchar=$key; - } - } - push(@sequence,$maxchar); - } - #$node->{"sequence"} = \@sequence; - my $sequence = ""; - foreach my $s (@sequence){$sequence = $sequence.$s;} - $string = $string.">".$node->{"level"}.";".$node->{"subtaxa"}.";".$node->{"divergence"}."\n$sequence\n"; - } - return($string); -} - -#make subtaxa labels -sub getSubTaxa{ - my $node = $_[0]; - #if a tip - if(!exists($node->{"right"})){ - $node->{"subtaxa"}=$node->{"id"}; - }else{ - #if internal node - getSubTaxa($node->{"right"}); - getSubTaxa($node->{"left"}); - my @l = split(",",$node->{"left"}->{"subtaxa"}); - my @r = split(",",$node->{"right"}->{"subtaxa"}); - my @total = (@l,@r); - @total = sort @total; - $node->{"subtaxa"}=join(",",@total); - } -} - -#assign parents to each node -sub assignparents{ - my $node = $_[0]; - my $parent = $_[1]; - if($node->{"level"} != 0){ - $node->{"up"}=$parent; - } - if(exists($node->{"left"})){ - assignparents($node->{"left"},$node); - assignparents($node->{"right"},$node); - } -} - - -#Position of differences between two strings -sub diffPos{ - my $s1 = $_[0]; - my $s2 = $_[1]; - if(length($s1) != length($s2)){die("$s1 $s2 no same length")} - my @diffpos; - for(my $i = 0; $i < length($s1); $i++){ - if(substr($s1,$i,1) ne substr($s2,$i,1)){ - push(@diffpos,$i); - } - } - return(\@diffpos); -} - -#return codon translation table -sub codonTable{ - my %codons = ( -"ttt" => "Phe", -"ttc" => "Phe", -"tta" => "Leu", -"ttg" => "Leu", -"ctt" => "Leu", -"ctc" => "Leu", -"cta" => "Leu", -"ctg" => "Leu", -"att" => "Ile", -"atc" => "Ile", -"ata" => "Ile", -"atg" => "Met", -"gtt" => "Val", -"gtc" => "Val", -"gta" => "Val", -"gtg" => "Val", -"tct" => "Ser", -"tcc" => "Ser", -"tca" => "Ser", -"tcg" => "Ser", -"cct" => "Pro", -"ccc" => "Pro", -"cca" => "Pro", -"ccg" => "Pro", -"act" => "Thr", -"acc" => "Thr", -"aca" => "Thr", -"acg" => "Thr", -"gct" => "Ala", -"gcc" => "Ala", -"gca" => "Ala", -"gcg" => "Ala", -"tat" => "Tyr", -"tac" => "Tyr", -"taa" => "STOP", -"tag" => "STOP", -"cat" => "His", -"cac" => "His", -"caa" => "Gln", -"cag" => "Gln", -"aat" => "Asn", -"aac" => "Asn", -"aaa" => "Lys", -"aag" => "Lys", -"gat" => "Asp", -"gac" => "Asp", -"gaa" => "Glu", -"gag" => "Glu", -"tgt" => "Cys", -"tgc" => "Cys", -"tga" => "STOP", -"tgg" => "Trp", -"cgt" => "Arg", -"cgc" => "Arg", -"cga" => "Arg", -"cgg" => "Arg", -"agt" => "Ser", -"agc" => "Ser", -"aga" => "Arg", -"agg" => "Arg", -"ggt" => "Gly", -"ggc" => "Gly", -"gga" => "Gly", -"ggg" => "Gly" -); - return \%codons; -} - -#return codon translation table -sub codonTableSingle{ - my %codons = ( -"ALA" => "A", -"CYS" => "C", -"ASP" => "D", -"GLU" => "E", -"PHE" => "F", -"GLY" => "G", -"HIS" => "H", -"ILE" => "I", -"LYS" => "K", -"LEU" => "L", -"MET" => "M", -"ASN" => "N", -"PRO" => "P", -"GLN" => "Q", -"ARG" => "R", -"SER" => "S", -"THR" => "T", -"VAL" => "V", -"TRP" => "W", -"TYR" => "Y"); - return \%codons; -} - - -my $nsim; -my $kappa; -my @omegas; -my @motifs; -my $partfile; -my $treefile; -my @hs; -my $freqs; -my $length; -my $outdir; -my $igphyml; -my $seqfile; -my $context=0; -my $rooted=0; -my $rootid; -my $ancstate=0; -my $statsfile; -my $stem; -my $statslhood; -my $ambigfile; - -my $bstats; - - -#Read in parameters from congif file -# my $config = $ARGV[0]; -# open(C,$config) or die("Couldn't open config file ($config)"); -if (open(my $C, $ARGV[0])) { - print "Found readable config file at first command line argument. Now reading it...\n"; - while(defined(my $line = <$C>)){ - chomp($line); - if($line =~ /nsim\s+(\S+)/){ - $nsim = $1; - } - if($line =~ /omegas\s+(\S+)/){ - @omegas = split(",",$1); - } - if($line =~ /kappa\s+(\S+)/){ - $kappa = $1; - } - if($line =~ /motifs\s+(\S+)/){ - @motifs = split(",",$1); - } - if($line =~ /hs\s+(\S+)/){ - @hs = split(",",$1); - } - if($line =~ /freqs\s+(\S+)/){ - $freqs = $1; - } - if($line =~ /tree\s+(\S+)/){ - $treefile = $1; - } - if($line =~ /fullcontext\s+(\S+)/){ - $context=$1; - } - if($line =~ /outdir\s+(\S+)/){ - $outdir=$1; - } - if($line =~ /rooted\s+(\S+)/){ - $rooted=$1; - } - if($line =~ /length\s+(\S+)/){ - $length=$1; - } - if($line =~ /rootid\s+(\S+)/){ - $rootid=$1; - } - if($line =~ /part\s+(\S+)/){ - $partfile=$1; - } - if($line =~ /igphyml\s+(\S+)/){ - $igphyml=$1; - } - if($line =~ /seqfile\s+(\S+)/){ - $seqfile=$1; - } - if($line =~ /stats\s+(\S+)/){ - $statsfile=$1; - } - if($line =~ /stem\s+(\S+)/){ - $stem=$1; - } - if($line =~ /ambigfile\s+(\S+)/){ - $ambigfile=$1; - } - } -close $C; -} else { - print "Did not find a readable config file at first command line argument.\n"; -} - - - -#check to see if stats file was specified in command line -for(my $i = 1; $i < scalar(@ARGV); $i++){ - my $line = $ARGV[$i]; - if($line =~ /-stats/){ - $statsfile=$ARGV[$i+1]; - } -} - -#Read in igphyml stats file, if specified -if(defined $statsfile && $statsfile ne "N"){ - open(STATS,$statsfile)or die("Couldn't open $statsfile\n"); - my @stats = ; - @motifs = (0)x0; - @omegas = (0)x0; - @hs = (0)x0; - $freqs = "stats"; - foreach my $l (@stats){ - chomp($l); - if($l =~ /Motif:\s+(\S+)\s+\d\s+\d\s+(\S+)/){ - push(@motifs,$1); - push(@hs,$2); - print "Read motif h $1 = $2 from $statsfile\n"; - } - if($l =~ /\. Omega\s+(\d+)\s+\S+:\s+(\S+)/){ - $omegas[$1]=$2; - print "Read omega $1 = $2 from $statsfile\n"; - } - if($l =~ /. Nonsynonymous\/synonymous ratio:\s+(\S+)/){ - $omegas[0]=$1; - print "Read old school omega 0 = $1 from $statsfile\n"; - } - if($l =~ /\. Transition\/transversion ratio:\s+(\S+)/){ - $kappa=$1; - print "Read kappa $kappa from $statsfile\n"; - } - if($l =~ /\. Log-likelihood:\s+(\S+)/){ - $statslhood=$1; - print "Read stats lhood $statslhood from $statsfile\n"; - } - $bstats .= " $l"; - } - print "Reading in frequency parameters from IgPhyML stats file\n"; -} - -#check command line args to see if any should be over-ridden -for(my $i = 1; $i < scalar(@ARGV); $i++){ - my $line = $ARGV[$i]; - if($line =~ /-nsim/){ - $nsim = $ARGV[$i+1]; - } - if($line =~ /-omegas/){ - @omegas = split(",",$ARGV[$i+1]); - } - if($line =~ /-kappa/){ - $kappa = $ARGV[$i+1]; - } - if($line =~ /-part/){ - $partfile = $ARGV[$i+1]; - } - if($line =~ /-motifs/){ - @motifs = split(",",$ARGV[$i+1]); - } - if($line =~ /-hs/){ - @hs = split(",",$ARGV[$i+1]); - } - if($line =~ /-freqs/){ - $freqs = $ARGV[$i+1]; - } - if($line =~ /-tree/){ - $treefile = $ARGV[$i+1]; - } - if($line =~ /-fullcontext/){ - $context=$ARGV[$i+1]; - } - if($line =~ /-outdir/){ - $outdir=$ARGV[$i+1]; - } - if($line =~ /-rooted/){ - $rooted=$ARGV[$i+1]; - } - if($line =~ /-length/){ - $length=$ARGV[$i+1]; - } - if($line =~ /-rootid/){ - $rootid=$ARGV[$i+1]; - } - if($line =~ /-igphyml/){ - $igphyml=$ARGV[$i+1]; - } - if($line =~ /-seqfile/){ - $seqfile=$ARGV[$i+1]; - } - if($line =~ /-stats/){ - $statsfile=$ARGV[$i+1]; - } - if($line =~ /-stem/){ - $stem=$ARGV[$i+1]; - } - if($line =~ /ambigfile/){ - $ambigfile=$1; - } -} - -#check that all necessary parameters are specified -if(!defined $kappa){die("kappa needs to be specified")} -if(scalar(@omegas)==0){die("omegas needs to be specified")} -if(scalar(@motifs)==0){die("motifs needs to be specified")} -if(scalar(@hs)==0){die("hs needs to be specified")} -if(!defined $freqs){die("freqs needs to be specified")} -if(!defined $outdir){die("outdir needs to be specified")} -if(!defined $rootid){die("rootid needs to be specified")} -if(!defined $igphyml){die("igphyml needs to be specified")} -if(!defined $stem){die("stem needs to be specified")} -if(!defined $seqfile){die("seqfile needs to be specified");} -my $seqs = getfasta($seqfile); -if(!defined $length){die("Length needs to be specified or set explicitly to default by \"-length D\”")} -if ($length eq 'D') { - my @keys = keys %$seqs; - $length = length($seqs->{$keys[0]})/3; -} -if(!defined $statsfile){$statsfile="N";} -if(!defined $partfile){$partfile="N";} -if(!defined $ambigfile){$ambigfile="N";} - -print "\nReconstruction Settings\n"; -print "kappa\t$kappa\n"; -print "omegas\t@omegas\n"; -print "motifs\t@motifs\n"; -print "hs\t@hs\n"; -print "freqs\t$freqs\n"; -print "outdir\t$outdir\n"; -print "length\t$length\n"; -print "rootid\t$rootid\n"; -print "seqfile\t$seqfile\n"; -print "stats\t$statsfile\n"; -print "ambigfile\t$ambigfile\n"; -print "outfile format: $outdir/$stem\_\n"; -print "\n"; - -if(scalar(@hs) ne scalar(@motifs)){die(scalar(@hs)." h values but ".scalar(@motifs)." motifs!\n")} - -#Read in tree -open(TREE,$treefile)or die("Couldn't open $treefile"); -my $tree = ; -chomp($tree); -my %root; -if($rooted==1){ - %root = %{readInRootedNewick($tree,0)}; -}else{ - %root = %{readInUnrootedNewick($tree,$rootid,0)}; -} - -#read in ambiguous character file -my %ambig; - if($ambigfile ne "N"){ - open(AM,$ambigfile) or die(); - while(){ - my $line = $_; - chomp($line); - my @in = split(" ",$line); - if(!exists($ambig{$in[0]})){ - my %new; - $ambig{$in[0]} = \%new; - } - if(!exists($ambig{$in[0]}->{$in[1]})){ - my @new = (0)x61; - $ambig{$in[0]}->{$in[1]} = \@new; - } - $ambig{$in[0]}->{$in[1]}->[$in[2]]=$in[3]; - } -} - -#Set up partition model from file -my @part = ((-1)x$length); -my $nparts=0; -if($partfile ne "N"){ - open(P,$partfile) or die("Couldn't open $partfile"); - my $h =

; - while(

){ - my $line = $_; - chomp($line); - my @in1 = split(":",$line); - my @in2 = split(",",$in1[1]); - for(my $i=0;$i= $length){die("Partition $nparts extends beyond specified sequnece length!")} - $part[$j]=$nparts; - } - } - $nparts++; - } -}else{ #default of a single partition - @part = ((0)x$length); - $nparts=1; -} -if($nparts != scalar(@omegas)){die("$nparts partitions, but ".(scalar(@omegas)." omegas!"))} -print "Partition index: "; -for(my$i=0;$i<$length;$i++){ - if($part[$i] == -1){ - die("Position $i unspecified in partition file."); - }else{ - print "$part[$i] "; - } -} -print "\n"; - -#Make codon indexes and get frequencies -my @transfreq; -my @codons; -my %codoni; -my $index = 0; -my @chars = ("t","c","a","g"); -my %freqs; -my $fsum=0; -foreach my $a (@chars){ - foreach my $b (@chars){ - foreach my $c (@chars){ - if($a.$b.$c ne "tga" && $a.$b.$c ne "taa" && $a.$b.$c ne "tag"){ - push(@codons,$a.$b.$c); - $codoni{$a.$b.$c}=$index; - my $match = uc $a.$b.$c; - if(defined $statsfile && $statsfile ne "N"){ - if($bstats =~ /f\($match\)=(\d+\.*\d*)/){ - $freqs{lc $match} = $1; - if($freqs{lc $match} == 0){ - print "Zero frequency caught\n"; - $freqs{lc $match}=1e-10; - } - }else{die($match)} - }elsif($freqs eq "uniform"){ - $freqs{lc $match} = 1/61; - }else{ - die("freqs not set properly\n"); - } - $fsum += $freqs{$a.$b.$c}; - $index++; - } - } - } -} -foreach my $k (keys %freqs){ - $freqs{$k} = $freqs{$k}/$fsum; - $transfreq[$codoni{$k}]=$freqs{$k}; -} -print "Codon frequencies: @transfreq\n"; - -#Make B matrix -print "Setting up B matrix\n"; -my @Bmat = (0)x(61*61); -my $fi;my $ti;my $li;my $ri; - -for(my $mi = 0; $mi < scalar(@motifs); $mi++){ - my $motif = $motifs[$mi]; - print "Reading in $motif table\n"; - my @htable; - open(HTABLE,"$igphyml/src/motifs/HTABLE_$motif") or die("Couldn't open $igphyml/src/motifs/HTABLE_$motif\n"); - while(){ - my $l = $_; - chomp($l); - push(@htable,$l); - } - close(HTABLE); - - for($fi=0;$fi<61;$fi++){ - for($ti=0;$ti<61;$ti++){ - my @htotals = (0)x(1); - for($li=0;$li<61;$li++){ - for($ri=0;$ri<61;$ri++){ - $htotals[0] += $transfreq[$li]*$transfreq[$ri]*$htable[$fi*61*61*61+$ti*61*61+$li*61+$ri]; - } - } - my $hsum = $hs[$mi]*$htotals[0]; - $Bmat[61*$fi+$ti]+=$hsum; - } - } - if(scalar(@Bmat) != (61*61)){die("@Bmat")} -} - -#Make Q matrices -my @Qs; -for(my $i=0;$i{$rootid})){ - die("$rootid not found in sequence file: $seqfile\n"); - } - if(length($seqs->{$rootid}) ne $length*3){ - die("Specified root sequence is not specified length: $length ".(length($seqs->{$rootid})/3)."\n"); - } -}else{ - die("Need sequences and root!"); -} - -#make site/tip matrix for ambiguous characters -my @tipr; -my @keyst = keys %$seqs; -for(my $i = 0; $i < length($seqs->{$keyst[0]})/3; $i++){ - my @temp = (1e-10)x61; - my $count=61e-10; - foreach my $k (keys %$seqs){ - my @s = split("",$seqs->{$k}); - my @t = @{transarrayCodon(\@s,\%codoni)}; - if($t[$i] ne "NA"){ - $temp[$t[$i]]++; - $count++; - } - } - for(my $j=0;$j<61;$j++){ - $tipr[61*$i+$j] = $temp[$j]/$count - } -} - -#collect subtaxa of each node -getSubTaxa(\%root); - -#assign node parents -assignparents(\%root,"NA"); - -print "About to do reconstructions\n"; - -#Do felsenstein's pruning algorithm -print "\nDoing lower partial likelihoods\n"; -my $lhood = Pruning_Lhood(\%root,$seqs,\%codoni,\@Qs,\@part,$nparts,\%ambig); - -print "\nDoing upper partial likelihoods\n"; -Fill_upp(\%root,$seqs,\@Qs,\@part,$nparts); - -print "\nCalculating marginal ASRs at each node\n"; -#Do marginal ancestral state reconstructions -Marginal_ASR(\%root,$seqs,\@Qs,\@part,$nparts); - -my $mcodons = printML_codon(\%root,"",\@codons); -#print "$mcodons\n"; - -my $codonTableSingle = codonTableSingle(); -my $codonTableTriple = codonTable(); - -my $maa = printML_aa(\%root,"",\@codons,$codonTableSingle,$codonTableTriple); -#print "$maa\n"; - -print "Likelihood comparison - StatsFile: $statslhood, Reconstruction: $lhood\n"; - -# Die if the likelihoods don't match: -sub isnan { ! defined( $_[0] <=> 9**9**9 ) } -if (isnan($statslhood) or isnan($lhood)) { - print "*** Failed to reconstruct the likelihood. See the line above. ***\n"; - #system("rm $outdir/gctree.simulation.fasta") - die("*** Failed to reconstruct the likelihood. ***\n"); -} -my @sort_array = ($lhood, $statslhood); -my $min_lhood = (sort {$a <=> $b} @sort_array)[0]; -if (abs($lhood - $statslhood) / $min_lhood > 0.01) { - print "*** Failed to reconstruct the likelihood with sufficient precision (>1%). See the line above. ***\n"; - #system("rm $outdir/gctree.simulation.fasta") - die("*** Failed to reconstruct the likelihood with sufficient precision (>1%). ***\n"); -} - -open(OUT,">$outdir/$stem.MLcodons.fa") or die(); -print OUT uc "$mcodons\n"; -close(OUT); - -open(OUT,">$outdir/$stem.MLaas.fa") or die(); -print OUT uc "$maa\n"; -close(OUT); - - -print "\n\n".'############################################################################### -# It worked - congrats! # -###############################################################################'."\n\n"; diff --git a/igphyml_files/igphyml_tools.py b/igphyml_files/igphyml_tools.py deleted file mode 100644 index 37f7a0b1..00000000 --- a/igphyml_files/igphyml_tools.py +++ /dev/null @@ -1,278 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -''' -Parse the output ancestral state reconstruction from IgPhyML together with the topology -to create an ete3 tree with the ancestral sequences. -''' - -from __future__ import division, print_function -import sys -import os -import re -import warnings -from Bio import SeqIO -from ete3 import Tree, TreeNode, NodeStyle, TreeStyle, TextFace, add_face_to_node, CircleFace, faces, AttrFace -sys.path.append(os.path.abspath('/'.join(os.path.realpath(__file__).split('/')[:-2]) + "/bin")) -from Bio import AlignIO - -class FastaInputError(Exception): - '''When the fasta file in not reflecting amino acid DNA coding for protein.''' - - -class TreeFileParsingError(Exception): - '''When ete3 fails to read the input tree.''' - - -class TreeFileParsingError(Exception): - '''When ete3 fails to read the input tree.''' - - -def ASR_parser(args): - try: - import cPickle as pickle - except: - import pickle - from gctree import CollapsedForest, CollapsedTree, hamming_distance - - try: - tree = Tree(args.tree) - except: - raise TreeFileParsingError('Could not read the input tree. Is this really newick format?') - - counts = {l.split(',')[0]:int(l.split(',')[1]) for l in open(args.counts)} - tree.add_feature('frequency', 0) # Placeholder will be deleted when rerooting - tree.add_feature('sequence', 'DUMMY') # Placeholder will be deleted when rerooting - tree = map_asr_to_tree(args.asr_seq, tree, args.naive, counts) - - # Reroot to make the naive sequence the real root instead of just an outgroup: - tree = reroot_tree(tree) - - # Recompute branch lengths as hamming distances: - tree.dist = 0 # No branch above root - for node in tree.iter_descendants(): - node.dist = hamming_distance(node.sequence, node.up.sequence) - - igphyml_tree = CollapsedTree(tree=tree) - igphyml_tree.render(args.outbase + '.svg') - igphyml_forest = CollapsedForest(forest=[igphyml_tree]) - print('number of trees with integer branch lengths:', igphyml_forest.n_trees) - - # check for unifurcations at root - unifurcations = sum(tree.tree.frequency == 0 and len(tree.tree.children) == 1 for tree in igphyml_forest.forest) - if unifurcations: - print('WARNING: {} trees exhibit unifurcation from root, which is not possible under current model. Such nodes will be ommitted from likelihood calculation'.format(unifurcations)) - - with open(args.outbase + '.p', 'wb') as f: - pickle.dump(igphyml_forest, f) - - print('Done parsing IgPhyML tree') - - -def map_asr_to_tree(asr_seq, tree, naiveID, counts): - '''Takes a IgPhyML fasta header and returns the matching ete3 tree node.''' - for record in SeqIO.parse(asr_seq, "fasta"): - descendants = record.id.split(';')[1].split(',') - # Fix IgPhyML ASR turning fasta headers to upper case: - descendants = [d.lower() for d in descendants] - assert(descendants) - if len(descendants) > 1: # ASR infer node - ancestor = tree.get_common_ancestor(descendants) - frequency = 0 - else: # Observed leaf or naive - ancestor = tree.get_leaves_by_name(descendants[0]) - ancestor = ancestor[0] - if descendants[0] in counts: - frequency = counts[descendants[0]] - else: - frequency = 0 - - # Add the features: - assert(ancestor) - ancestor.add_feature('frequency', frequency) - ancestor.add_feature('sequence', str(record.seq)) - - return tree - - - - -def make_igphyml_config(args): - - igphyml_path = which(args.igphyml_exe.rstrip('/')) - assert(igphyml_path is not None) - IGPHYML_DIR = re.sub(r'/src/\w+$', '', igphyml_path) - MODEL = args.model - assert(MODEL in ['gy94', 'hlp16']) - # Find the length of the translated DNA sequence: - len_nt = AlignIO.read(args.fasta_file, 'fasta').get_alignment_length() - if len_nt % 3 != 0: - raise FastaInputError('Problem with the input fasta file. Either is the not a multiple of three or it has indels.') - LEN_AA = len_nt/3 - - # Replace the keyword in the template file: - with open(args.template) as fh: - template = fh.read() - - cur_dir = os.getcwd() - AMBIG = cur_dir + '/igphyml_files/dummy.ambig' - - template = template.replace('LEN_AA', str(LEN_AA)) - template = template.replace('IGPHYML_DIR', IGPHYML_DIR) - template = template.replace('MODEL', MODEL) - template = template.replace('AMBIG', AMBIG) - - - # Write the new config file: - with open(args.outfile, 'w') as fh_out: - fh_out.write(template) - - print('Done making IgPhyML config file.') - - -def which(executable): - for path in os.environ["PATH"].split(os.pathsep): - if os.path.exists(os.path.join(path, executable)): - return os.path.realpath(os.path.join(path, executable)) - return None - - - - -def dedup_fasta(args): - from Bio.Seq import Seq - from Bio.SeqRecord import SeqRecord - from Bio import AlignIO - from Bio.Phylo.TreeConstruction import MultipleSeqAlignment - - aln = AlignIO.read(args.infile, 'fasta') - - seqs_unique_counts = {} - for seq in aln: - seq.id = seq.id.strip() - # if id is just an integer, assume it represents count of that sequence - if seq.id == args.naive: - naive_seq = str(seq.seq) # We want to keep the identity of the naive sequence - elif seq.id.isdigit(): - seqs_unique_counts[str(seq.seq)] = int(seq.id) - elif str(seq.seq) not in seqs_unique_counts: - seqs_unique_counts[str(seq.seq)] = 1 - else: - seqs_unique_counts[str(seq.seq)] += 1 - - with open(args.outfile, 'w') as fh_out: - print('>' + args.naive, file=fh_out) - print(naive_seq, file=fh_out) - for i, seq in enumerate(seqs_unique_counts): - record = SeqRecord(Seq(seq), id=str(i+1)+'_'+str(seqs_unique_counts[seq])) - print('>' + str(record.id), file=fh_out) - print(str(record.seq), file=fh_out) - - print('Done deduplicating input fasta file.') - - -def reroot(args): - from ete3 import Tree, NodeStyle, TreeStyle, TextFace, add_face_to_node - - try: - tree = Tree(args.tree) - except: - raise TreeFileParsingError('Could not read the input tree. Is this really newick format?') - - rerotted_tree = reroot_tree(tree, pattern=args.pattern, outgroup=args.outgroup) - rerotted_tree.write(outfile=args.reroot_tree) - - print('Done rerooting input tree.') - - -def find_node(tree, pattern): - regex = re.compile(pattern).search - nodes = [node for node in tree.traverse() for m in [regex(node.name)] if m] - if not nodes: - warn("Cannot find matching node; looking for name matching '{}'".format(pattern)) - return - else: - if len(nodes) > 1: - warn("multiple nodes found; using first one.\nfound: {}".format([n.name for n in nodes])) - return nodes[0] - - -# reroot the tree on node matching regex pattern. -# Usually this is used to root on the naive germline sequence with a name matching '.*naive.*' -def reroot_tree(tree, pattern='.*naive.*', outgroup=0): - # find all nodes matching pattern - node = find_node(tree, pattern) - tree.set_outgroup(node) - if tree != node and outgroup == 1: - s = node.get_sisters() # KBH - want the outgroup with a branch length of (near) zero - s[0].dist = node.dist * 2 - node.dist = 0.0000001 # KBH - actual zero length branches cause problems - tree.swap_children() # KBH - want root to be at the last taxon in the newick file. - elif tree != node: - tree.remove_child(node) - # Notice that an internal node between the outgroup (naive seq.) - # and the the root is removed because ASR for IgPhyML is done using - # the naive as an actual root. - node.add_child(tree.get_children()[0].get_children()[0]) - node.add_child(tree.get_children()[0].get_children()[1]) - tree.dist = node.dist - node.dist = 0 - tree = node - return tree - - - -def main(): - import argparse - - parser = argparse.ArgumentParser(description='Tools for running ASR with IgPhyML.') - subparsers = parser.add_subparsers(help='Which program to run') - - # Parser for ASR_parser subprogram: - parser_asr = subparsers.add_parser('ASR_parser', - help='Reroot a tree based on node containing a keyword.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser_asr.add_argument('--tree', required=True, metavar='NEWICK TREE', help='Input tree used for topology.') - parser_asr.add_argument('--counts', required=True, metavar='ALLELE_FREQUENCY', help='File containing allele frequencies (sequence counts) in the format: "SeqID,Nobs"') - parser_asr.add_argument('--asr_seq', required=True, help='Input ancestral sequences.') - parser_asr.add_argument('--outbase', required=True, metavar='FILENAME', help='Filename for the output ASR tree.') - parser_asr.add_argument('--naive', type=str, default='naive', help='naive sequence id') - parser_asr.set_defaults(func=ASR_parser) - - # Parser for make_igphyml_config subprogram: - parser_conf = subparsers.add_parser('make_igphyml_config', - help='Prepare config file for ASR under the HLP16 model.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser_conf.add_argument('--template', help='Config file template', type=str, metavar='FILE', required=True) - parser_conf.add_argument('--outfile', help='Name of the config file to write.', type=str, metavar='FILENAME', required=True) - parser_conf.add_argument('--igphyml_exe', help='IgPhyML executable. Will search for the default localt like UNIX `which`.', type=str, required=True) - parser_conf.add_argument('--model', help='Which model to run? [gy94, hlp16]', type=str, required=True) - parser_conf.add_argument('--fasta_file', help='To find the length of the amino acid sequence.', type=str, required=True) - parser_conf.set_defaults(func=make_igphyml_config) - - # Parser for dedup_fasta subprogram: - parser_dedup = subparsers.add_parser('dedup_fasta', - help='Deduplicate a fasta file.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser_dedup.add_argument('--infile', type=str, help='fasta file with any integer ids indicating frequency', required=True) - parser_dedup.add_argument('--outfile', type=str, help='Output filename.', required=True) - parser_dedup.add_argument('--naive', type=str, default='naive', help='naive sequence id') - parser_dedup.set_defaults(func=dedup_fasta) - - # Parser for reroot subprogram: - parser_reroot = subparsers.add_parser('reroot', - description='Reroot a tree based on node containing a keyword.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser_reroot.add_argument('--tree', required=True, metavar='NEWICK TREE', help='Input tree to root, in newick format.') - parser_reroot.add_argument('--reroot_tree', required=True, metavar='FILENAME', help='Filename for the output rerooted tree.') - parser_reroot.add_argument('--pattern', metavar='REGEX PATTERN', required=True, help="Pattern to search for the node to root on.") - parser_reroot.add_argument('--outgroup', required=False, type=int, default=0, metavar="0/1", help="Set as outgroup instead of tree root.") - parser_reroot.set_defaults(func=reroot) - - - args = parser.parse_args() - args.func(args) - - -if __name__ == '__main__': - main() diff --git a/scripts/aggregate_compare.py b/scripts/aggregate_compare.py index 1833a321..47824e98 100755 --- a/scripts/aggregate_compare.py +++ b/scripts/aggregate_compare.py @@ -91,8 +91,6 @@ plot_data = df.loc[df.loc[:, "metric"] == "RF", :] plf(x=var, y="value", hue="method", data=plot_data, legend_out=True, **kwargs) -# colors = {'gctree':'red', 'igphyml':'blue'} -# plot_data.plot(kind='scatter', x=var, y='value', c=plot_data['method'].apply(lambda x: colors[x])) ax.set(ylabel="RF distance") plt.title("Plot for tree size: {}. For RF.".format(var)) plt.tight_layout() diff --git a/scripts/validaggreg.py b/scripts/validaggreg.py index a5c6c2a5..36005235 100755 --- a/scripts/validaggreg.py +++ b/scripts/validaggreg.py @@ -166,15 +166,6 @@ color=next(palette), data=aggdat_other[aggdat_other["method"] == "dnaml"], ) - sns.stripplot( - x="simulations ranked by parsimony degeneracy", - y=metric, - size=4, - alpha=0.7, - jitter=2, - color=next(palette), - data=aggdat_other[aggdat_other["method"] == "igphyml"], - ) if "COAR" in metric: plt.ylim(0, maxy[metric]) else: @@ -215,7 +206,7 @@ x="method", y=metric, data=pd.concat([aggdat, aggdat_other]), - order=("parsimony", "gctree", "dnaml", "igphyml"), + order=("parsimony", "gctree", "dnaml"), ) if "COAR" in metric: plt.ylim(0, maxy[metric]) From a8ab9278361f1c04aa36bab5b9d387539d6faef2 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Mon, 28 Jun 2021 22:35:49 -0700 Subject: [PATCH 08/32] rm nogctree option --- README.md | 11 +- SConscript.inference | 264 +++++++++++++++++++++--------------------- SConscript.simulation | 69 +++++------ SConstruct | 10 +- 4 files changed, 167 insertions(+), 187 deletions(-) diff --git a/README.md b/README.md index efae1046..69b2d0a2 100644 --- a/README.md +++ b/README.md @@ -221,9 +221,10 @@ scons --simulate --outdir= --N= ${TARGETS[0]}", - ) +if input_file2 is not None: + basename = "combined" +elif isinstance(input_file, str): + basename = ".".join(os.path.basename(input_file).split(".")[:-1]) +else: + basename = "gctree.simulation" +frame_arg = " --frame {} ".format(frame) if frame is not None else "" +converter_arg = ( + " --converter {} ".format(converter) if converter is not None else "" +) +phylip = env.Command( + [ + os.path.join( + outdir, os.path.splitext(os.path.basename(input_file))[0] + ".phylip" + ) + if input_file2 is None and isinstance(input_file, str) + else os.path.join(outdir, "gctree.combined.phylip") + if input_file2 is not None + else os.path.join(outdir, "gctree.simulation.phylip"), + os.path.join(outdir, basename) + ".counts", + os.path.join(outdir, basename) + ".idmap", + ] + + ( + [os.path.join(outdir, basename) + ".colormap"] + if colorfile is not None + else [] + ), + input_file if colorfile is None else [input_file, colorfile], + buffarg + + "python scripts/deduplicate.py ${SOURCES[0]} " + + (" --colorfile ${SOURCES[1]} " if colorfile is not None else "") + + (" --colormap ${TARGETS[3]} " if colorfile is not None else "") + + " --countfile ${TARGETS[1]} --idmapfile ${TARGETS[2]} " + + frame_arg + + converter_arg + + "--naive " + + naiveID + + " > ${TARGETS[0]}", +) - if bootstrap: +if bootstrap: - if dnaml: - raise NotImplementedError("bootstrap not implemented for dnaml") + if dnaml: + raise NotImplementedError("bootstrap not implemented for dnaml") - bootstrap_arg = " --bootstrap {} ".format(bootstrap) - seqboot_config = env.Command( - os.path.join(outdir, "seqboot/config.cfg"), - phylip[0], - buffarg - + "python scripts/mkconfig.py ${SOURCE} seqboot " - + bootstrap_arg - + " > $TARGET".format(bootstrap), - ) + bootstrap_arg = " --bootstrap {} ".format(bootstrap) + seqboot_config = env.Command( + os.path.join(outdir, "seqboot/config.cfg"), + phylip[0], + buffarg + + "python scripts/mkconfig.py ${SOURCE} seqboot " + + bootstrap_arg + + " > $TARGET".format(bootstrap), + ) - seqboot = CommandRunner( - [os.path.join(outdir, x) for x in ["seqboot/outfile", "seqboot/log.log"]], - seqboot_config, - "cd " - + outdir - + "/seqboot && rm -f outfile && seqboot < ${SOURCE.file} > ${TARGETS[1].file}", - ) - # Manually depend on phylip so that we rerun seqboot if the input sequences change (without this, dnaml will - # only get rerun if one of the targets are removed or if the input dnaml_config file is changed). - env.Depends(seqboot, phylip) + seqboot = CommandRunner( + [os.path.join(outdir, x) for x in ["seqboot/outfile", "seqboot/log.log"]], + seqboot_config, + "cd " + + outdir + + "/seqboot && rm -f outfile && seqboot < ${SOURCE.file} > ${TARGETS[1].file}", + ) + # Manually depend on phylip so that we rerun seqboot if the input sequences change (without this, dnaml will + # only get rerun if one of the targets are removed or if the input dnaml_config file is changed). + env.Depends(seqboot, phylip) # Update the naive ID: naiveID = naiveID.lower() @@ -151,86 +150,85 @@ if dnaml: return_list.append(dnaml_tree) -if gctree: - # make config file for dnapars - quick_arg = " --quick " if quick else "" - dnapars_config = env.Command( - os.path.join(outdir, "dnapars/config.cfg"), - phylip[0], +# make config file for dnapars +quick_arg = " --quick " if quick else "" +dnapars_config = env.Command( + os.path.join(outdir, "dnapars/config.cfg"), + phylip[0], + buffarg + + "python scripts/mkconfig.py ${SOURCE} dnapars " + + quick_arg + + " > $TARGET", +) + +# run dnapars (from phylip package) to generate parsimony trees +dnapars = CommandRunner( + [ + os.path.join(outdir, x) + for x in ["dnapars/outtree", "dnapars/outfile", "dnapars/log.log"] + ], + dnapars_config, + "cd " + + outdir + + "/dnapars && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", +) +# Manually depend on phylip so that we rerun dnapars if the input sequences change (without this, dnapars will +# only get rerun if one of the targets are removed or if the input dnapars_config file is changed). +env.Depends(dnapars, phylip) + +# ML tree from parsimony trees +# NOTE: xvfb-run is needed because of issue https://github.com/etetoolkit/ete/issues/101 +# NOTE: TMPDIR is needed due for xvfb + +if bootstrap: + dnapars_config_bootstrap = env.Command( + os.path.join(outdir, "dnapars_bootstrap/config.cfg"), + seqboot[0], buffarg + "python scripts/mkconfig.py ${SOURCE} dnapars " + quick_arg + + bootstrap_arg + " > $TARGET", ) - - # run dnapars (from phylip package) to generate parsimony trees - dnapars = CommandRunner( + dnapars_bootstrap = CommandRunner( [ os.path.join(outdir, x) - for x in ["dnapars/outtree", "dnapars/outfile", "dnapars/log.log"] + for x in [ + "dnapars_bootstrap/outtree", + "dnapars_bootstrap/outfile", + "dnapars_bootstrap/log.log", + ] ], - dnapars_config, + dnapars_config_bootstrap, "cd " + outdir - + "/dnapars && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", + + "/dnapars_bootstrap && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", ) - # Manually depend on phylip so that we rerun dnapars if the input sequences change (without this, dnapars will - # only get rerun if one of the targets are removed or if the input dnapars_config file is changed). - env.Depends(dnapars, phylip) - - # ML tree from parsimony trees - # NOTE: xvfb-run is needed because of issue https://github.com/etetoolkit/ete/issues/101 - # NOTE: TMPDIR is needed due for xvfb - - if bootstrap: - dnapars_config_bootstrap = env.Command( - os.path.join(outdir, "dnapars_bootstrap/config.cfg"), - seqboot[0], - buffarg - + "python scripts/mkconfig.py ${SOURCE} dnapars " - + quick_arg - + bootstrap_arg - + " > $TARGET", - ) - dnapars_bootstrap = CommandRunner( - [ - os.path.join(outdir, x) - for x in [ - "dnapars_bootstrap/outtree", - "dnapars_bootstrap/outfile", - "dnapars_bootstrap/log.log", - ] - ], - dnapars_config_bootstrap, - "cd " - + outdir - + "/dnapars_bootstrap && rm -f outfile outtree && dnapars < ${SOURCE.file} > ${TARGETS[2].file}", - ) - env.Depends(dnapars_bootstrap, seqboot) - - gctree_outbase = os.path.join(outdir, "gctree") - frame_arg = " --frame {} ".format(frame) if frame is not None else "" - idlabel_arg = " --idlabel" if idlabel else "" - gctree_infer = CommandRunner( - [ - gctree_outbase + ".inference.parsimony_forest.p", - gctree_outbase + ".inference.log", - ], - [dnapars[1], phylip[1]] - + ([dnapars_bootstrap[1]] if bootstrap else []) - + ([phylip[3]] if colorfile is not None else []), - xarg - + buffarg - + "gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive " - + naiveID - + " --outbase " - + gctree_outbase - + frame_arg - + idlabel_arg - + (" --colormap ${SOURCES[-1]} " if colorfile is not None else "") - + (" --bootstrap_phylipfile ${SOURCES[2]}" if bootstrap else "") - + " | tee ${TARGETS[1]}", - ) - return_list.append(gctree_infer) + env.Depends(dnapars_bootstrap, seqboot) + +gctree_outbase = os.path.join(outdir, "gctree") +frame_arg = " --frame {} ".format(frame) if frame is not None else "" +idlabel_arg = " --idlabel" if idlabel else "" +gctree_infer = CommandRunner( + [ + gctree_outbase + ".inference.parsimony_forest.p", + gctree_outbase + ".inference.log", + ], + [dnapars[1], phylip[1]] + + ([dnapars_bootstrap[1]] if bootstrap else []) + + ([phylip[3]] if colorfile is not None else []), + xarg + + buffarg + + "gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive " + + naiveID + + " --outbase " + + gctree_outbase + + frame_arg + + idlabel_arg + + (" --colormap ${SOURCES[-1]} " if colorfile is not None else "") + + (" --bootstrap_phylipfile ${SOURCES[2]}" if bootstrap else "") + + " | tee ${TARGETS[1]}", +) +return_list.append(gctree_infer) Return("return_list") diff --git a/SConscript.simulation b/SConscript.simulation index 435c000e..8d57fcbd 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -7,25 +7,23 @@ from nestly.scons import SConsWrap # the following must be exported by parent SConstruct/SConscript Import( - "env gctree dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg" + "env dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg" ) nest = Nest() w = SConsWrap(nest, outdir, alias_environment=env) -if gctree: - w.add_aggregate( - "gctree_outeragg", list - ) # <-- aggregating results across parameters +w.add_aggregate( + "gctree_outeragg", list +) # <-- aggregating results across parameters w.add_aggregate("outeragg", list) # <-- aggregating results across parameters # Initialize our first nest level, w.add("lambda", lambda_list) w.add("lambda0", lambda0_list) -if gctree: - w.add_aggregate( - "gctree_agg", list - ) # <-- for aggregating repeated simulations with the same parameters +w.add_aggregate( + "gctree_agg", list +) # <-- for aggregating repeated simulations with the same parameters w.add_aggregate( "agg", list ) # <-- for aggregating inference result from repeated simulations with the same parameters @@ -97,7 +95,7 @@ def infer(outdir, c): colorfile = None return SConscript( "SConscript.inference", - exports="env gctree dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", ) @@ -110,10 +108,9 @@ def validate(outdir, c): ), # <-- this one compares different methods os.path.join(outdir, "validation.log"), ] - if gctree: - outputs.append( - os.path.join(outdir, "validation.gctree.tsv") - ) # <-- special gctree output evaluating parsimony tree ranking + outputs.append( + os.path.join(outdir, "validation.gctree.tsv") + ) # <-- special gctree output evaluating parsimony tree ranking tgt = CommandRunner( outputs, [c["gctree_sim"][2:4]] + [x[0] for x in c["infer"]], @@ -123,36 +120,32 @@ def validate(outdir, c): + os.path.join(outdir, "validation") + " > ${TARGETS[1]}", ) - if gctree: - c["gctree_agg"].append(tgt[2]) + c["gctree_agg"].append(tgt[2]) c["agg"].append(tgt[0]) return tgt w.pop("runs") - -if gctree: - - @w.add_target() - def gctree_aggregate(outdir, c): - """aggregate validation results""" - allmetrics_arg = " --allmetrics" if dnaml else "" - tgt = env.Command( - [ - os.path.join(outdir, "gctree.validaggreg.tsv"), - os.path.join(outdir, "gctree.validaggreg.log"), - ], - c["gctree_agg"], - buffarg - + "python scripts/validaggreg.py $SOURCES --outbase " - + os.path.join(outdir, "gctree.validaggreg") - + allmetrics_arg - + " > ${TARGETS[1]}", - ) - env.AlwaysBuild(tgt) - c["gctree_outeragg"].append(tgt[0]) - return tgt +@w.add_target() +def gctree_aggregate(outdir, c): + """aggregate validation results""" + allmetrics_arg = " --allmetrics" if dnaml else "" + tgt = env.Command( + [ + os.path.join(outdir, "gctree.validaggreg.tsv"), + os.path.join(outdir, "gctree.validaggreg.log"), + ], + c["gctree_agg"], + buffarg + + "python scripts/validaggreg.py $SOURCES --outbase " + + os.path.join(outdir, "gctree.validaggreg") + + allmetrics_arg + + " > ${TARGETS[1]}", + ) + env.AlwaysBuild(tgt) + c["gctree_outeragg"].append(tgt[0]) + return tgt @w.add_target() diff --git a/SConstruct b/SConstruct index e4df23f8..821b32a5 100644 --- a/SConstruct +++ b/SConstruct @@ -36,8 +36,6 @@ else: CommandRunner = env.Command AddOption("--frame", type="int", default=None, help="codon frame") frame = GetOption("frame") -AddOption("--nogctree", action="store_true", help="don" "t use gctree inference") -gctree = GetOption("nogctree") != True AddOption("--dnaml", action="store_true", help="use dnaml inference") dnaml = GetOption("dnaml") AddOption("--outdir", type="string", help="directory in which to output results") @@ -69,10 +67,6 @@ buffarg = "stdbuf -oL " if GetOption("nobuff") else "" class InputError(Exception): """Exception raised for errors in the input.""" - -if not gctree and not GetOption("help"): - raise InputError("must set at least one inference method") - if not simulate and not inference and not GetOption("help"): raise InputError( 'Please provide one of the required arguments. Either "--inference" or "--simulate".' @@ -240,12 +234,12 @@ if simulate and not GetOption("help"): raise InputError("outdir must be specified") SConscript( "SConscript.simulation", - exports="env gctree dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg", + exports="env dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp selection_param xarg buffarg", ) elif inference and not GetOption("help"): if None in [input_file, outdir]: raise InputError("input fasta or phylip and outdir must be specified") SConscript( "SConscript.inference", - exports="env gctree dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", ) From a0e88b5b4281e10046bfd2cb202c2ba7caff67f2 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 01:57:52 -0700 Subject: [PATCH 09/32] replace "converter" argument with "id_abundances" flag, and some tidying --- README.md | 36 ++++++++++++++++----- SConscript.inference | 20 ++++++------ SConscript.simulation | 4 +-- SConstruct | 11 +++---- bin/__init__.py | 0 scripts/deduplicate.py => bin/deduplicate | 34 +++++++------------ scripts/mkconfig.py => bin/mkconfig | 4 +-- scripts/phylip_parse.py => bin/phylip_parse | 0 scripts/simstatagg.py | 2 +- setup.py | 5 +-- 10 files changed, 63 insertions(+), 53 deletions(-) create mode 100644 bin/__init__.py rename scripts/deduplicate.py => bin/deduplicate (83%) rename scripts/mkconfig.py => bin/mkconfig (97%) rename scripts/phylip_parse.py => bin/phylip_parse (100%) diff --git a/README.md b/README.md index 69b2d0a2..672489a2 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,31 @@ All commands should be issued from within the gctree repo directory. ### Linux/MacOS +### Base package install + +If you only want the base gctree package (without the pipeline infrastructure, see below), you can simply +```bash +pip intall . +``` +to install the gctree package and its command line interface. +Subcommands are described in help +```bash +gctree -h +``` +and each subcommand has its own help, accessed with `-h`. + +Additionally, the following command line utilities will be installed (each with help `-h`): +- `deduplicate`: +- `makeconfig`: +- `phylip_parse`: + +which are useful for prepping data and processing output from phylip: + + +#### Pipeline install + + + 0. For installing dependencies, [conda](https://conda.io/docs/) environment management is recommended. First install conda or miniconda. 1. Create a python 3 conda environment called gctree from the included environment file: ```bash @@ -24,11 +49,6 @@ All commands should be issued from within the gctree repo directory. conda activate gctree ``` -Alternatively, if you only want the base gctree python package (without the pipelines and scripts), you can -```bash -pip intall . -``` - ## QUICK START ### inference @@ -81,7 +101,7 @@ scons --simulate --outdir= --N= --N= --N= ${TARGETS[0]}", @@ -95,7 +95,7 @@ if bootstrap: os.path.join(outdir, "seqboot/config.cfg"), phylip[0], buffarg - + "python scripts/mkconfig.py ${SOURCE} seqboot " + + "mkconfig ${SOURCE} seqboot " + bootstrap_arg + " > $TARGET".format(bootstrap), ) @@ -118,7 +118,7 @@ if dnaml: dnaml_config = env.Command( os.path.join(outdir, "dnaml/config.cfg"), phylip[0], - buffarg + "python scripts/mkconfig.py ${SOURCE} dnaml > $TARGET", + buffarg + "mkconfig ${SOURCE} dnaml > $TARGET", ) # run dnaml (from phylip package) to generate maximum likelihood tree @@ -143,7 +143,7 @@ if dnaml: ], [dnaml[1], phylip[1]], xarg - + "python scripts/phylip_parse.py ${SOURCES} --outputfile ${TARGETS[0]} --naive " + + "phylip_parse ${SOURCES} --outputfile ${TARGETS[0]} --naive " + naiveID + " > ${TARGETS[1]}", ) @@ -156,7 +156,7 @@ dnapars_config = env.Command( os.path.join(outdir, "dnapars/config.cfg"), phylip[0], buffarg - + "python scripts/mkconfig.py ${SOURCE} dnapars " + + "mkconfig ${SOURCE} dnapars " + quick_arg + " > $TARGET", ) @@ -185,7 +185,7 @@ if bootstrap: os.path.join(outdir, "dnapars_bootstrap/config.cfg"), seqboot[0], buffarg - + "python scripts/mkconfig.py ${SOURCE} dnapars " + + "mkconfig ${SOURCE} dnapars " + quick_arg + bootstrap_arg + " > $TARGET", diff --git a/SConscript.simulation b/SConscript.simulation index 8d57fcbd..60933cca 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -90,12 +90,12 @@ def infer(outdir, c): input_file = c["gctree_sim"][0] input_file2 = None naiveID = "naive" # this is what the simulation routine names the naive - converter = None # No problem with weird fasta formating from the simulated data + id_abundances = False bootstrap = 0 colorfile = None return SConscript( "SConscript.inference", - exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID id_abundances CommandRunner bootstrap xarg buffarg colorfile", ) diff --git a/SConstruct b/SConstruct index 821b32a5..0c5cce49 100644 --- a/SConstruct +++ b/SConstruct @@ -213,12 +213,11 @@ elif inference: ) naiveID = GetOption("naiveID") AddOption( - "--converter", - type="string", - default=None, - help="Converter to convert input format e.g. the Victora lab GC fasta format", + "--id_abundances", + action='store_true', + help="interpret integer input ids as abundances", ) - converter = GetOption("converter") + id_abundances = GetOption("id_abundances") AddOption( "--bootstrap", type="int", @@ -241,5 +240,5 @@ elif inference and not GetOption("help"): raise InputError("input fasta or phylip and outdir must be specified") SConscript( "SConscript.inference", - exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID converter CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID id_abundances CommandRunner bootstrap xarg buffarg colorfile", ) diff --git a/bin/__init__.py b/bin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/deduplicate.py b/bin/deduplicate similarity index 83% rename from scripts/deduplicate.py rename to bin/deduplicate index cb54baee..7ad3cb1c 100755 --- a/scripts/deduplicate.py +++ b/bin/deduplicate @@ -9,7 +9,7 @@ from collections import defaultdict, Counter -def fasta_parse(aln_file, naive, frame=None, aln_file2=None, converter=None): +def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False): # naive = naive.lower() if aln_file.endswith("fasta") or aln_file.endswith("fa"): aln_format = "fasta" @@ -63,11 +63,8 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, converter=None): seqs_unique_counts[ seqstr ] = [] # no observed naive unless we see it elsewhere - elif seq.id.isdigit() and converter is not None: - if converter.lower() == "tas": - seqs_unique_counts[seqstr] = [seq.id for _ in range(int(seq.id))] - else: - raise ValueError("invalid converter: " + converter) + elif seq.id.isdigit() and id_abundances: + seqs_unique_counts[seqstr] = [seq.id for _ in range(int(seq.id))] else: seqs_unique_counts[seqstr].append(seq.id) @@ -111,18 +108,17 @@ def check_header(header): def main(): parser = argparse.ArgumentParser( - description="Convert a fasta file to philyp format. Headers must be a unique ID of less than " - "or equal to 10 ASCII characters. A special option for converting a Victora lab " - "GC fasta file to phylip is also included. All headers are converted to lower case." + description="Convert a fasta file to phylip format. Headers must be a unique ID of less than " + "or equal to 10 ASCII characters." + "All headers are converted to lower case." ) parser.add_argument( "infile", type=str, nargs="+", help="Fasta file with less than or equal to 10 characters unique header ID. " - "For Victora data any integer ids indicates frequency." - "Because dnapars will name internal nodes by intergers a node name must include" - "at least one non number character.", + "Because dnapars will name internal nodes by integers a node name must include" + "at least one non number character (unless using the id_abundances option).", ) parser.add_argument( "--countfile", @@ -137,12 +133,10 @@ def main(): help="filename for the output file containing the map of new unique ids to original seq ids.", ) parser.add_argument( - "--converter", - type=str, - default=None, - help="use a special format convertion scheme e.g. for a Vitora lab GC fasta file. Options: [tas]", + "--id_abundances", + action="store_true", + help="interpret integer ids in input as abundances" ) - specified_coverters = ["tas"] parser.add_argument("--naive", type=str, default="naive", help="naive sequence id") parser.add_argument( "--frame", type=int, default=None, help="codon frame", choices=(1, 2, 3) @@ -161,16 +155,12 @@ def main(): ) args = parser.parse_args() - if args.converter is not None and args.converter.lower() not in specified_coverters: - print("Cannot find the specified converter:", args.converter) - print("Allowed converters:", specified_coverters.join(",")) - raise Exception new_aln, counts, id_map = fasta_parse( args.infile[0], args.naive, frame=args.frame, aln_file2=args.infile[1] if len(args.infile) == 2 else None, - converter=args.converter, + id_abundances=args.id_abundances, ) print(format(new_aln, "phylip")) if args.countfile is not None: diff --git a/scripts/mkconfig.py b/bin/mkconfig similarity index 97% rename from scripts/mkconfig.py rename to bin/mkconfig index 4d15d399..edc56c89 100755 --- a/scripts/mkconfig.py +++ b/bin/mkconfig @@ -10,8 +10,8 @@ Typical usage is, - $ mkconfig.py sequence.phy >dnapars.cfg - $ dnapars dnapars.cfg + $ dnapars < dnapars.cfg For reference, the dnapars configuration prompt looks like this: ____________ diff --git a/scripts/phylip_parse.py b/bin/phylip_parse similarity index 100% rename from scripts/phylip_parse.py rename to bin/phylip_parse diff --git a/scripts/simstatagg.py b/scripts/simstatagg.py index 32f11efc..fe92c1fc 100755 --- a/scripts/simstatagg.py +++ b/scripts/simstatagg.py @@ -41,7 +41,7 @@ nsims = len(sims) if args.experimental is not None: - new_aln, counts = fasta_parse(args.experimental, naive="GL", converter="tas")[:2] + new_aln, counts = fasta_parse(args.experimental, naive="GL", id_abundances=True)[:2] exp_dict = {seq.id: str(seq.seq) for seq in new_aln} naive_id = [seq for seq in exp_dict if "gl" in seq][0] frequency, distance_from_naive, degree = zip( diff --git a/setup.py b/setup.py index 6d37ee4f..489f946c 100644 --- a/setup.py +++ b/setup.py @@ -16,8 +16,9 @@ long_description_content_type="text/markdown", url="https://github.com/matsengrp/gctree", entry_points={"console_scripts": ["gctree=gctree.cli:main"]}, - # packages=setuptools.find_packages(exclude=['tests', 'docs', 'docsrc']), - # packages=['gctree'], + packages=['gctree'], + scripts=['bin/deduplicate', 'bin/mkconfig', 'bin/phylip_parse' + ], classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", From 8fae9e6039436ceec6b90f4e3d174fb91e4f1790 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 02:34:30 -0700 Subject: [PATCH 10/32] tidying up CLI --- bin/__init__.py | 0 bin/phylip_parse | 49 ------------------------ bin/deduplicate => gctree/deduplicate.py | 6 +-- bin/mkconfig => gctree/mkconfig.py | 0 gctree/phylip_parse.py | 48 +++++++++++++++++++++++ scripts/simstatagg.py | 2 +- scripts/summary_stats.py | 2 +- setup.py | 7 ++-- 8 files changed, 57 insertions(+), 57 deletions(-) delete mode 100644 bin/__init__.py delete mode 100644 bin/phylip_parse rename bin/deduplicate => gctree/deduplicate.py (95%) rename bin/mkconfig => gctree/mkconfig.py (100%) mode change 100755 => 100644 gctree/phylip_parse.py diff --git a/bin/__init__.py b/bin/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/bin/phylip_parse b/bin/phylip_parse deleted file mode 100644 index 773f6e7b..00000000 --- a/bin/phylip_parse +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import gctree.phylip_parse as pp -import gctree.branching_processes as bp - - -def main(): - - import pickle, argparse, os - - def existing_file(fname): - """Argparse type for an existing file.""" - if not os.path.isfile(fname): - raise ValueError("Invalid file: " + str(fname)) - return fname - - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - "phylip_outfile", - type=existing_file, - help="dnaml outfile (verbose output with inferred ancestral sequences, option 5).", - ) - parser.add_argument("countfile", type=existing_file, help="count file") - parser.add_argument("--outputfile", default=None, help="output file.") - parser.add_argument("--naive", default="naive", help="naive sequence id") - - args = parser.parse_args() - - if args.outputfile is None: - args.outputfile = args.phylip_outfile + ".collapsed_forest.p" - trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.naive) - if isinstance(trees[0], list): - print(trees[0][0]) - print(bp.CollapsedTree(tree=trees[0][0])) - bootstraps = [ - [bp.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees - ] - pickle.dump( - [bp.CollapsedForest(forest=trees) for trees in bootstraps], - open(args.outputfile, "w"), - ) - else: - trees = [bp.CollapsedTree(tree=tree) for tree in trees] - pickle.dump(bp.CollapsedForest(forest=trees), open(args.outputfile, "w")) - - -if __name__ == "__main__": - main() diff --git a/bin/deduplicate b/gctree/deduplicate.py similarity index 95% rename from bin/deduplicate rename to gctree/deduplicate.py index 7ad3cb1c..0792330b 100755 --- a/bin/deduplicate +++ b/gctree/deduplicate.py @@ -108,9 +108,9 @@ def check_header(header): def main(): parser = argparse.ArgumentParser( - description="Convert a fasta file to phylip format. Headers must be a unique ID of less than " + description="Deduplicate sequences in a fasta file, write to stdout in phylip format, and creates a few other files (see arguments). Headers must be a unique ID of less than " "or equal to 10 ASCII characters." - "All headers are converted to lower case." + " All headers are converted to lower case." ) parser.add_argument( "infile", @@ -135,7 +135,7 @@ def main(): parser.add_argument( "--id_abundances", action="store_true", - help="interpret integer ids in input as abundances" + help="flag to interpret integer ids in input as abundances" ) parser.add_argument("--naive", type=str, default="naive", help="naive sequence id") parser.add_argument( diff --git a/bin/mkconfig b/gctree/mkconfig.py similarity index 100% rename from bin/mkconfig rename to gctree/mkconfig.py diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py old mode 100755 new mode 100644 index b5b1b35f..b7fb52f4 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -5,6 +5,9 @@ ancestral sequences), a newick tree (with matching internal node lables), and an svg rendering of said tree. """ +import gctree.phylip_parse as pp +import gctree.branching_processes as bp + from gctree.utils import hamming_distance from ete3 import Tree @@ -186,3 +189,48 @@ def build_tree(sequences, parents, counts=None, naive="naive"): node.dist = hamming_distance(node.sequence, node.up.sequence) return tree + + + +def main(): + + import pickle, argparse, os + + def existing_file(fname): + """Argparse type for an existing file.""" + if not os.path.isfile(fname): + raise ValueError("Invalid file: " + str(fname)) + return fname + + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "phylip_outfile", + type=existing_file, + help="dnaml outfile (verbose output with inferred ancestral sequences, option 5).", + ) + parser.add_argument("countfile", type=existing_file, help="count file") + parser.add_argument("--outputfile", default=None, help="output file.") + parser.add_argument("--naive", default="naive", help="naive sequence id") + + args = parser.parse_args() + + if args.outputfile is None: + args.outputfile = args.phylip_outfile + ".collapsed_forest.p" + trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.naive) + if isinstance(trees[0], list): + print(trees[0][0]) + print(bp.CollapsedTree(tree=trees[0][0])) + bootstraps = [ + [bp.CollapsedTree(tree=tree) for tree in bootstrap] for bootstrap in trees + ] + pickle.dump( + [bp.CollapsedForest(forest=trees) for trees in bootstraps], + open(args.outputfile, "w"), + ) + else: + trees = [bp.CollapsedTree(tree=tree) for tree in trees] + pickle.dump(bp.CollapsedForest(forest=trees), open(args.outputfile, "w")) + + +if __name__ == "__main__": + main() diff --git a/scripts/simstatagg.py b/scripts/simstatagg.py index fe92c1fc..e2ff0aba 100755 --- a/scripts/simstatagg.py +++ b/scripts/simstatagg.py @@ -7,7 +7,7 @@ from matplotlib import pyplot as plt import pandas as pd import argparse -from deduplicate import fasta_parse +from gctree.deduplicate import fasta_parse from gctree.utils import hamming_distance import seaborn as sns diff --git a/scripts/summary_stats.py b/scripts/summary_stats.py index aac26e95..ed44cf70 100755 --- a/scripts/summary_stats.py +++ b/scripts/summary_stats.py @@ -3,7 +3,7 @@ """summary stats of the seq data going into tree inference for CFT.""" -from deduplicate import fasta_parse +from gctree.deduplicate import fasta_parse from matplotlib import pyplot as plt import pandas as pd import argparse diff --git a/setup.py b/setup.py index 489f946c..91a68a2d 100644 --- a/setup.py +++ b/setup.py @@ -15,10 +15,11 @@ long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/matsengrp/gctree", - entry_points={"console_scripts": ["gctree=gctree.cli:main"]}, + entry_points={"console_scripts": ["gctree=gctree.cli:main", + "deduplicate=gctree.deduplicate:main", + "mkconfig=gctree.mkconfig:main", + "phylip_parse=gctree.phylip_parse:main"]}, packages=['gctree'], - scripts=['bin/deduplicate', 'bin/mkconfig', 'bin/phylip_parse' - ], classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", From ac25d67d3893115b088a05073aa7dfcd356552df Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 02:35:32 -0700 Subject: [PATCH 11/32] black --- gctree/deduplicate.py | 2 +- gctree/phylip_parse.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index 0792330b..4e76fd6a 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -135,7 +135,7 @@ def main(): parser.add_argument( "--id_abundances", action="store_true", - help="flag to interpret integer ids in input as abundances" + help="flag to interpret integer ids in input as abundances", ) parser.add_argument("--naive", type=str, default="naive", help="naive sequence id") parser.add_argument( diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index b7fb52f4..1d3f9cba 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -191,7 +191,6 @@ def build_tree(sequences, parents, counts=None, naive="naive"): return tree - def main(): import pickle, argparse, os From d65e0a2ca4dbff764b68d51028b96cc31067468d Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 02:48:19 -0700 Subject: [PATCH 12/32] readme --- README.md | 33 ++++++++++++--------------------- gctree/mkconfig.py | 2 +- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 672489a2..8a88097c 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ Two programs are implemented: All commands should be issued from within the gctree repo directory. -## INSTALLATION STEPS +## Installation ### Linux/MacOS -### Base package install +#### Base package install If you only want the base gctree package (without the pipeline infrastructure, see below), you can simply ```bash @@ -26,18 +26,17 @@ Subcommands are described in help gctree -h ``` and each subcommand has its own help, accessed with `-h`. +The most important subcommand is `gctree infer`. Additionally, the following command line utilities will be installed (each with help `-h`): -- `deduplicate`: -- `makeconfig`: -- `phylip_parse`: - -which are useful for prepping data and processing output from phylip: +- `deduplicate`: deduplicate fasta data with repeated genotypes +- `makeconfig`: generate a config file for the phylip program +- `phylip_parse`: parse output from #### Pipeline install - +`SCons` pipelines can be used to for end-to-end phylogenetic inference from sequence data. 0. For installing dependencies, [conda](https://conda.io/docs/) environment management is recommended. First install conda or miniconda. 1. Create a python 3 conda environment called gctree from the included environment file: @@ -49,7 +48,7 @@ which are useful for prepping data and processing output from phylip: conda activate gctree ``` -## QUICK START +## Pipeline quick start ### inference - *input file*: `FASTA` or `PHYLIP` file containing a sequence for each observed individual/cell, and an additional sequence containing the ancestral genotype of all observed sequences (used for outgroup rooting). @@ -74,7 +73,7 @@ which are useful for prepping data and processing output from phylip: scons --simulate --outdir= --N= ``` -## EXAMPLE +## Example ### run GCtree inference on the included `FASTA` file @@ -181,7 +180,7 @@ scons --simulate --outdir= --N= --N= --N= --N= Date: Tue, 29 Jun 2021 02:51:47 -0700 Subject: [PATCH 13/32] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a88097c..a5ad3150 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The most important subcommand is `gctree infer`. Additionally, the following command line utilities will be installed (each with help `-h`): - `deduplicate`: deduplicate fasta data with repeated genotypes -- `makeconfig`: generate a config file for the phylip program +- `mkconfig`: generate a config file for the phylip program - `phylip_parse`: parse output from From 12a95f79893e170c0c1578f2cba05f4ec039919b Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 11:22:28 -0700 Subject: [PATCH 14/32] tidying dependencies and a few fixes --- environment.yml | 8 +------- gctree/mutation_model.py | 7 ++++--- gctree/phylip_parse.py | 2 +- requirements.txt | 5 +++++ 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 requirements.txt diff --git a/environment.yml b/environment.yml index 928d6781..1e11bf1f 100644 --- a/environment.yml +++ b/environment.yml @@ -3,17 +3,11 @@ channels: - conda-forge - defaults - bioconda - - etetoolkit dependencies: - scons - nestly - phylip - seqmagick - - black - - docformatter - - flake8 - - pylint - - pytest - pip - pip: - - -e . # installs gctree package from current directory "." in editable mode + - . # installs gctree package from current directory "." diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index f7fc3473..0402825a 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -3,6 +3,7 @@ """Mutation models.""" from gctree.utils import hamming_distance +import gctree.selection_utils as su from ete3 import TreeNode from scipy.stats import poisson @@ -329,7 +330,7 @@ def hd2affy(hd): # We store both the amino acid sequence and the affinity as tree features: tree.add_feature("AAseq", str(aa)) tree.add_feature( - "Kd", selection_utils.calc_Kd(tree.AAseq, targetAAseqs, hd2affy) + "Kd", su.calc_Kd(tree.AAseq, targetAAseqs, hd2affy) ) tree.add_feature( "target_dist", @@ -363,7 +364,7 @@ def hd2affy(hd): skip_lambda_n = ( skip_update + 1 ) # Add one so skip_update=0 is no skip - tree = selection_utils.lambda_selection( + tree = su.lambda_selection( leaf, tree, targetAAseqs, hd2affy, A_total, B_total, Lp ) # Small lambdas are causing problems so make a minimum: @@ -423,7 +424,7 @@ def hd2affy(hd): child.add_feature("AAseq", str(aa)) child.add_feature( "Kd", - selection_utils.calc_Kd( + su.calc_Kd( child.AAseq, targetAAseqs, hd2affy ), ) diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index 1d3f9cba..a886887a 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -69,7 +69,7 @@ def parse_seqdict(fh, mode="dnaml"): fh.readline() for line in fh: m = patterns.match(line) - if m and m.group("id") is not "": + if m and m.group("id") != "": last_blank = False seqs[m.group("id")] += m.group("seq").replace(" ", "").upper() elif line.rstrip() == "": diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..042cb45c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +black +docformatter +flake8 +pylint +pytest From 3b6b5054c07be5489d8b1bfabb518baccdb73bd4 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 12:14:06 -0700 Subject: [PATCH 15/32] rm affinity selection (superceded by Kristian's and Duncan's later work) --- README.md | 25 +- SConscript.simulation | 10 +- SConstruct | 25 +- gctree/cli.py | 197 +---- gctree/mutation_model.py | 148 ---- gctree/selection_utils.py | 194 ----- notebooks/affinity_solver.ipynb | 1331 ------------------------------- 7 files changed, 13 insertions(+), 1917 deletions(-) delete mode 100755 gctree/selection_utils.py delete mode 100644 notebooks/affinity_solver.ipynb diff --git a/README.md b/README.md index a5ad3150..90cdbc98 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,6 @@ Implements phylogenetic inference for data with repeated sequences, as described DeWitt, Mesin, Victora, Minin and Matsen, *Using genotype abundance to improve phylogenetic inference*, [arXiv:1708.08944](https://arxiv.org/abs/1708.08944). -Two programs are implemented: -- an inference program for experimental input data in `FASTA` or `PHYLIP` format (including an additional sequence for the ancestral state) -- a simulation/inference/validation program - -All commands should be issued from within the gctree repo directory. - ## Installation ### Linux/MacOS @@ -50,6 +44,8 @@ Additionally, the following command line utilities will be installed (each with ## Pipeline quick start +All commands should be issued from within the gctree repo directory. + ### inference - *input file*: `FASTA` or `PHYLIP` file containing a sequence for each observed individual/cell, and an additional sequence containing the ancestral genotype of all observed sequences (used for outgroup rooting). - *run inference*: @@ -243,20 +239,3 @@ scons --simulate --outdir= --N== args.f_full - # Make a list of target sequences: - targetAAseqs = [ - mutation_model.one_mutant(args.sequence, args.target_dist, frame=args.frame) - for i in range(args.target_count) - ] - # Find the total amount of A necessary for sustaining the inputted - # carrying capacity: - print((args.carry_cap, args.B_total, args.f_full, args.mature_affy)) - A_total = su.find_A_total( - args.carry_cap, args.B_total, args.f_full, args.mature_affy, args.U - ) - # Calculate the parameters for the logistic function: - Lp = su.find_Lp(args.f_full, args.U) - selection_params = [ - args.stop_dist, - args.mature_affy, - args.naive_affy, - args.target_dist, - args.skip_update, - targetAAseqs, - A_total, - args.B_total, - Lp, - args.k, - args.outbase, - ] - else: - selection_params = None trials = 1000 # this loop makes us resimulate if size too small, or backmutation @@ -450,15 +410,9 @@ def simulate(args): T=args.T, frame=args.frame, verbose=args.verbose, - selection_params=selection_params, ) - if args.selection: - collapsed_tree = bp.CollapsedTree( - tree=tree, frame=args.frame, collapse_syn=False, allow_repeats=True - ) - else: - # this will fail if backmutations - collapsed_tree = bp.CollapsedTree(tree=tree, frame=args.frame) + # this will fail if backmutations + collapsed_tree = bp.CollapsedTree(tree=tree, frame=args.frame) tree.ladderize() uniques = sum(node.frequency > 0 for node in collapsed_tree.tree.traverse()) if uniques < 2: @@ -537,11 +491,7 @@ def simulate(args): palette -= set(["black", "white", "gray"]) palette = itertools.cycle(list(palette)) # <-- circular iterator - # Either plot by DNA sequence or amino acid sequence: - if args.plotAA and args.selection: - colors[tree.AAseq] = "gray" - else: - colors[tree.sequence] = "gray" + colors[tree.sequence] = "gray" for n in tree.traverse(): nstyle = ete3.NodeStyle() @@ -564,14 +514,9 @@ def simulate(args): # render collapsed tree # create an id-wise colormap # NOTE: node.name can be a set - if args.plotAA and args.selection: - colormap = { - node.name: colors[node.AAseq] for node in collapsed_tree.tree.traverse() - } - else: - colormap = { - node.name: colors[node.sequence] for node in collapsed_tree.tree.traverse() - } + colormap = { + node.name: colors[node.sequence] for node in collapsed_tree.tree.traverse() + } collapsed_tree.write(args.outbase + ".simulation.collapsed_tree.p") collapsed_tree.render( args.outbase + ".simulation.collapsed_tree.svg", @@ -588,49 +533,6 @@ def simulate(args): + "\n" ) - if args.selection: - # Define a list a suitable colors that are easy to distinguish: - palette = [ - "crimson", - "purple", - "hotpink", - "limegreen", - "darkorange", - "darkkhaki", - "brown", - "lightsalmon", - "darkgreen", - "darkseagreen", - "darkslateblue", - "teal", - "olive", - "wheat", - "magenta", - "lightsteelblue", - "plum", - "gold", - ] - # circular iterator - palette = itertools.cycle(list(palette)) - colors = {i: next(palette) for i in range(int(len(args.sequence) // 3))} - # The minimum distance to the target is colored: - colormap = { - node.name: colors[node.target_dist] - for node in collapsed_tree.tree.traverse() - } - collapsed_tree.write( - args.outbase + ".simulation.collapsed_runstat_color_tree.p" - ) - collapsed_tree.render( - args.outbase + ".simulation.collapsed_runstat_color_tree.svg", - idlabel=args.idlabel, - colormap=colormap, - ) - # Write a file with the selection run stats. These are also plotted: - with open(args.outbase + "selection_sim.runstats.p", "rb") as fh: - runstats = pickle.load(fh) - su.plot_runstats(runstats, args.outbase, colors) - def get_parser(): parser = argparse.ArgumentParser( @@ -743,33 +645,6 @@ def get_parser(): parser_sim.add_argument( "--seed", type=int, default=None, help="integer random seed" ) - parser_sim.add_argument( - "--selection", - type=bool, - default=False, - help="Simulation with selection? true/false. When doing simulation " - "with selection an observation time cut must be set.", - ) - parser_sim.add_argument( - "--stop_dist", - type=int, - default=None, - help="Stop when this distance has been reached in the selection " "model.", - ) - parser_sim.add_argument( - "--carry_cap", - type=int, - default=1000, - help="The carrying capacity of the simulation with selection. This " - "number affects the fixation time of a new mutation. Fixation " - "time is approx. log2(carry_cap), e.g. log2(1000) ~= 10.", - ) - parser_sim.add_argument( - "--target_count", - type=int, - default=10, - help="The number of targets to generate.", - ) parser_sim.add_argument( "--target_dist", type=int, @@ -777,59 +652,6 @@ def get_parser(): help="The number of non-synonymous mutations the target should be " "away from the naive.", ) - parser_sim.add_argument( - "--naive_affy", - type=float, - default=100, - help="Affinity of the naive sequence in nano molar.", - ) - parser_sim.add_argument( - "--mature_affy", - type=float, - default=1, - help="Affinity of the mature sequences in nano molar.", - ) - parser_sim.add_argument( - "--skip_update", - type=int, - default=100, - help="When iterating through the leafs the B:A fraction is " - "recalculated every time. It is possible though to update less " - "often and get the same approximate results. This parameter sets " - "the number of iterations to skip, before updating the B:A " - "results. skip_update < carry_cap/10 recommended.", - ) - parser_sim.add_argument( - "--B_total", - type=float, - default=1, - help="Total number of BCRs per B cell normalized to 10e4. So 1 equals " - "10e4, 100 equals 10e6 etc. It is recommended to keep this as " - "the default.", - ) - parser_sim.add_argument( - "--U", - type=float, - default=5, - help="Controls the fraction of BCRs binding antigen necessary to " - "only sustain the life of the B cell It is recommended to keep " - "this as the default.", - ) - parser_sim.add_argument( - "--f_full", - type=float, - default=1, - help="The fraction of antigen bound BCRs on a B cell that is needed " - "to elicit close to maximum reponse. Cannot be smaller than " - "B_total. It is recommended to keep this as the default.", - ) - parser_sim.add_argument( - "--k", - type=float, - default=2, - help="The exponent in the function to map hamming distance to " - "affinity. It is recommended to keep this as the default.", - ) parser_sim.add_argument( "--plotAA", type=bool, @@ -840,8 +662,7 @@ def get_parser(): "--verbose", type=bool, default=False, - help="Print progress during simulation. Mostly useful for simulation " - "with selection since this can take a while.", + help="Print progress during simulation.", ) parser_sim.set_defaults(func=simulate) diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index 0402825a..7b68a999 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -3,7 +3,6 @@ """Mutation models.""" from gctree.utils import hamming_distance -import gctree.selection_utils as su from ete3 import TreeNode from scipy.stats import poisson @@ -252,27 +251,17 @@ def simulate( T=None, n=None, verbose=False, - selection_params=None, ): """simulate neutral binary branching process with mutation model progeny must be like a scipy.stats distribution, with rvs() and mean() methods.""" - stop_dist = None # Default stopping criterium for affinity simulation # Checking the validity of the input parameters: if N is not None and T is not None: raise ValueError("Only one of N and T can be used. One must be None.") - if selection_params is not None and T is None: - raise ValueError( - "Simulation with selection was chosen. A time, T, must be specified." - ) elif N is None and T is None: raise ValueError("Either N or T must be specified.") if N is not None and n is not None and n > N: raise ValueError("n ({}) must not larger than N ({})".format(n, N)) - if selection_params is not None and frame is None: - raise ValueError( - "Simulation with selection was chosen. A frame must must be specified." - ) # Planting the tree: tree = TreeNode() @@ -282,61 +271,6 @@ def simulate( tree.add_feature("frequency", 0) tree.add_feature("time", 0) - if selection_params is not None: - hd_generation = ( - list() - ) # Collect an array of the counts of each hamming distance at each time step - ( - stop_dist, - mature_affy, - naive_affy, - target_dist, - skip_update, - targetAAseqs, - A_total, - B_total, - Lp, - k, - outbase, - ) = selection_params - # Assert that the target sequences are comparable to the naive sequence: - aa = Seq( - tree.sequence[ - (frame - 1) : ( - frame - 1 + (3 * (((len(tree.sequence) - (frame - 1)) // 3))) - ) - ] - ).translate() - assert ( - sum([1 for t in targetAAseqs if len(t) != len(aa)]) == 0 - ) # All targets are same length - assert sum( - [1 for t in targetAAseqs if hamming_distance(aa, t) == target_dist] - ) # All target are "target_dist" away from the naive sequence - # Affinity is an exponential function of hamming distance: - if target_dist > 0: - - def hd2affy(hd): - return ( - mature_affy - + hd ** k * (naive_affy - mature_affy) / target_dist ** k - ) - - else: - - def hd2affy(hd): - return mature_affy - - # We store both the amino acid sequence and the affinity as tree features: - tree.add_feature("AAseq", str(aa)) - tree.add_feature( - "Kd", su.calc_Kd(tree.AAseq, targetAAseqs, hd2affy) - ) - tree.add_feature( - "target_dist", - min([hamming_distance(tree.AAseq, taa) for taa in targetAAseqs]), - ) - t = 0 # <-- time leaves_unterminated = 1 # Small lambdas are causing problems so make a minimum: @@ -345,11 +279,6 @@ def hd2affy(hd): leaves_unterminated > 0 and (leaves_unterminated < N if N is not None else True) and (t < max(T) if T is not None else True) - and ( - stop_dist >= min(hd_distrib) - if stop_dist is not None and t > 0 - else True - ) ): if verbose: print("At time:", t) @@ -359,21 +288,6 @@ def hd2affy(hd): random.shuffle(list_of_leaves) for leaf in list_of_leaves: if not leaf.terminated: - if selection_params is not None: - if skip_lambda_n == 0: - skip_lambda_n = ( - skip_update + 1 - ) # Add one so skip_update=0 is no skip - tree = su.lambda_selection( - leaf, tree, targetAAseqs, hd2affy, A_total, B_total, Lp - ) - # Small lambdas are causing problems so make a minimum: - lambda_min = 10e-10 - if leaf.lambda_ > lambda_min: - progeny = poisson(leaf.lambda_) - else: - progeny = poisson(lambda_min) - skip_lambda_n -= 1 n_children = progeny.rvs() leaves_unterminated += ( n_children - 1 @@ -403,70 +317,10 @@ def hd2affy(hd): x != y for x, y in zip(mutated_sequence, leaf.sequence) ) child.add_feature("sequence", mutated_sequence) - if selection_params is not None: - aa = Seq( - child.sequence[ - (frame - 1) : ( - frame - - 1 - + ( - 3 - * ( - ( - (len(child.sequence) - (frame - 1)) - // 3 - ) - ) - ) - ) - ] - ).translate() - child.add_feature("AAseq", str(aa)) - child.add_feature( - "Kd", - su.calc_Kd( - child.AAseq, targetAAseqs, hd2affy - ), - ) - child.add_feature( - "target_dist", - min( - [ - hamming_distance(child.AAseq, taa) - for taa in targetAAseqs - ] - ), - ) child.add_feature("frequency", 0) child.add_feature("terminated", False) child.add_feature("time", t) leaf.add_child(child) - if selection_params is not None: - hd_distrib = [ - min([hamming_distance(tn.AAseq, ta) for ta in targetAAseqs]) - for tn in tree.iter_leaves() - if not tn.terminated - ] - if target_dist > 0: - hist = scipy.histogram( - hd_distrib, bins=list(range(target_dist * 10)) - ) - else: # Just make a minimum of 10 bins - hist = scipy.histogram(hd_distrib, bins=list(range(10))) - hd_generation.append(hist) - if verbose and hd_distrib: - print("Total cell population:", sum(hist[0])) - print("Majority hamming distance:", scipy.argmax(hist[0])) - print("Affinity of latest sampled leaf:", leaf.Kd) - print( - "Progeny distribution lambda for the latest sampled leaf:", - leaf.lambda_, - ) - - if selection_params is not None: - # Keep a histogram of the hamming distances at each generation: - with open(outbase + "selection_sim.runstats.p", "wb") as f: - pickle.dump(hd_generation, f) if leaves_unterminated < N: raise RuntimeError( @@ -497,8 +351,6 @@ def hd2affy(hd): final_leaves ): # No need to down-sample, this was already done in the simulation loop leaf.frequency = 1 - if selection_params and max(T) != t: - raise RuntimeError("tree terminated with before the requested sample time.") # Do the normal sampling of the last time step: final_leaves = [leaf for leaf in tree.iter_leaves() if leaf.time == t] # by default, downsample to the target simulation size diff --git a/gctree/selection_utils.py b/gctree/selection_utils.py deleted file mode 100755 index d9e2f064..00000000 --- a/gctree/selection_utils.py +++ /dev/null @@ -1,194 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -"""utility functions for selection simulation.""" - -from gctree.utils import hamming_distance - -import scipy -from scipy.optimize import minimize, fsolve -from matplotlib import pyplot as plt - - -def calc_Kd(seqAA, targetAAseqs, hd2affy): - """Find the closest target sequence to and apply the "hamming distance to - affinity" transformation function.""" - hd = min([hamming_distance(seqAA, t) for t in targetAAseqs]) - return hd2affy(hd) - - -def lambda_selection(node, tree, targetAAseqs, hd2affy, A_total, B_total, Lp): - """Given a node and its tree and a "hamming distance to affinity" - transformation function reutrn the poisson lambda parameter for the progeny - distribution.""" - - def calc_BnA(Kd_n, A, B_total): - """This calculated the fraction B:A (B bound to A), at equilibrium also - referred to as "binding time", of all the different Bs in the - population given the number of free As in solution.""" - BnA = B_total / (1 + Kd_n / A) - return BnA - - def return_objective_A(Kd_n, A_total, B_total): - """The objective function that solves the set of differential equations - setup to find the number of free As, at equilibrium, given a number of - Bs with some affinity listed in Kd_n.""" - return lambda A: (A_total - (A + scipy.sum(B_total / (1 + Kd_n / A)))) ** 2 - - def calc_binding_time(Kd_n, A_total, B_total): - """Solves the objective function to find the number of free As and then - uses this, to calculate the fraction B:A (B bound to A) for all the - different Bs.""" - obj = return_objective_A(Kd_n, A_total, B_total) - # Different minimizers have been tested and 'L-BFGS-B' was significant faster than anything else: - obj_min = minimize( - obj, A_total, bounds=[[1e-10, A_total]], method="L-BFGS-B", tol=1e-20 - ) - BnA = calc_BnA(Kd_n, obj_min.x[0], B_total) - # Terminate if the precision is not good enough: - assert BnA.sum() + obj_min.x[0] - A_total < A_total / 100 - return BnA - - def trans_BA(BA, Lp): - """Transform the fraction B:A (B bound to A) to a poisson lambda - between 0 and 2.""" - # We keep alpha to enable the possibility that there is a minimum lambda_: - alpha, beta, Q = Lp - lambda_ = alpha + (2 - alpha) / (1 + Q * scipy.exp(-beta * BA)) - return lambda_ - - # Update the list of affinities for all the live nodes: - Kd_n = scipy.array([n.Kd for n in tree.iter_leaves() if not n.terminated]) - BnA = calc_binding_time(Kd_n, A_total, B_total) - lambdas = trans_BA(BnA, Lp) - i = 0 - for n in tree.iter_leaves(): - if n.terminated: - continue - n.add_feature("lambda_", lambdas[i]) - i += 1 - return tree - - -def find_A_total(carry_cap, B_total, f_full, mature_affy, U): - def A_total_fun(A, B_total, Kd_n): - return A + scipy.sum(B_total / (1 + Kd_n / A)) - - def C_A(A, A_total, f_full, U): - return U * (A_total - A) / f_full - - def A_obj(carry_cap, B_total, f_full, Kd_n, U): - def obj(A): - return (carry_cap - C_A(A, A_total_fun(A, B_total, Kd_n), f_full, U)) ** 2 - - return obj - - Kd_n = scipy.array([mature_affy] * carry_cap) - obj = A_obj(carry_cap, B_total, f_full, Kd_n, U) - # Some funny "zero encountered in true_divide" errors are not affecting results so ignore them: - old_settings = scipy.seterr(all="ignore") # Keep old settings - scipy.seterr(divide="ignore") - obj_min = minimize( - obj, 1e-20, bounds=[[1e-20, carry_cap]], method="L-BFGS-B", tol=1e-20 - ) - scipy.seterr(**old_settings) # Reset to default - A = obj_min.x[0] - A_total = A_total_fun(A, B_total, Kd_n) - assert C_A(A, A_total, f_full, U) > carry_cap * 99 / 100 - return A_total - - -def find_Lp(f_full, U): - assert U > 1 - - def T_BA(BA, p): - # We keep alpha to enable the possibility - # that there is a minimum lambda_ - alpha, beta, Q = p - lambda_ = alpha + (2 - alpha) / (1 + Q * scipy.exp(-beta * BA)) - return lambda_ - - def solve_T_BA(p, f_full, U): - epsilon = 1 / 1000 - C1 = (T_BA(0, p) - 0) ** 2 - C2 = (T_BA(f_full / U, p) - 1) ** 2 - C3 = (T_BA(1 * f_full, p) - (2 - 2 * epsilon)) ** 2 - return (C1, C2, C3) - - def solve_T_BA_low_epsilon(p, f_full, U): - epsilon = 1 / 1000 - C1 = (T_BA(0, p) - 0) ** 2 - C2 = (T_BA(f_full / U, p) - 1) ** 2 - C3 = (T_BA(1 * f_full, p) - (2 - 2 * epsilon)) ** 2 * ( - (2 - T_BA(1 * f_full, p)) < 2 * epsilon - ) - return (C1, C2, C3) - - # FloatingPointError errors are not affecting results so ignore them: - old_settings = scipy.seterr(all="ignore") # Keep old settings - scipy.seterr(over="ignore") - try: - - def obj_T_A(p): - return solve_T_BA(p, f_full, U) - - p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000) - assert sum(solve_T_BA(p, f_full, U)) < f_full * 1 / 1000 - except: - print( - "The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution." - ) - - def obj_T_A(p): - return solve_T_BA_low_epsilon(p, f_full, U) - - p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000) - assert sum(solve_T_BA(p, f_full, U)) < f_full * 1 / 1000 - scipy.seterr(**old_settings) # Reset to default - return p - - -def plot_runstats(runstats, outbase, colors): - def make_bounds(runstats): - all_counts = runstats[0][0].copy() - for l in runstats: - all_counts += l[0] - i = None - ii = None - for j, c in enumerate(all_counts): - if i is None and c > 0: - i = j - elif c > 0: - ii = j - return (i, ii) - - # Total population size: - pop_size = scipy.array([sum(r[0]) for r in runstats]) - # min:max of the hamming distances to plot: - bounds = make_bounds(runstats) - - fig = plt.figure() - ax = plt.subplot(111) - t = scipy.array(list(range(len(pop_size)))) # The x-axis are generations - ax.plot(t, pop_size, lw=2, label="All cells") # Total population size is plotted - # Then plot the counts for each hamming distance as a function on generation: - for k in list(range(*bounds)): - color = colors[k] - ax.plot( - t, - scipy.array([r[0][k] for r in runstats]), - lw=2, - color=color, - label="Dist {}".format(k), - ) - - plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0) - - # Shrink current axis by 20% to make the legend fit: - box = ax.get_position() - ax.set_position([box.x0, box.y0, box.width * 0.8, box.height]) - - plt.ylabel("Count") - plt.xlabel("GC generation") - plt.title("Cell count as function of GC generation") - fig.savefig(outbase + ".selection_sim.runstats.pdf") diff --git a/notebooks/affinity_solver.ipynb b/notebooks/affinity_solver.ipynb deleted file mode 100644 index 95ceaf79..00000000 --- a/notebooks/affinity_solver.ipynb +++ /dev/null @@ -1,1331 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import sys\n", - "import os\n", - "from scipy.optimize import newton, minimize, fsolve\n", - "import numpy as np\n", - "import pickle" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "try:\n", - " import jellyfish # Last time I checked this module was the fastest kid on the block, however 2x slower than a simple Cython function\n", - " def fast_hamming_dist(s1, s2):\n", - " if s1 == s2:\n", - " return 0\n", - " else:\n", - " return jellyfish.hamming_distance(s1, s2)\n", - "except:\n", - " print('Couldn\\'t find the python module \"jellyfish\" which is used for fast string comparison. Falling back to pure python function.')\n", - " fast_hamming_dist = hamming_distance" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "### Instead of T cell help just using affinity to antigen as a proxy:\n", - "\n", - "# [B1:A] = 1/(1+Kd_1/[A])\n", - "# [B2:A] = 1/(1+Kd_2/[A])\n", - "# .\n", - "# . = Bi:A(A) <-- B1:A, B2:A, ..., Bn:A as a function of A\n", - "# .\n", - "# [Bn:A] = 1/(1+Kd_n/A)\n", - "\n", - "# array(Bn:A)(A) = array(1)/(array(1)+array(Kd_n)/A*)\n", - "\n", - "\n", - "# Fullfilling:\n", - "# [A_total] = [A] + sum(Bi:A(A)) <--- law of mass conservation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def return_BnA(Kd_n, A):\n", - " BnA = 1/(1+Kd_n/A)\n", - " return(BnA)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def return_objective_A(Kd_n, A_total):\n", - "# A_total = 1 # A_total is just a relative number, and a multiplicative factor will change its magnitude\n", - " obj = lambda A: (A_total - (A + np.sum(1/(1+Kd_n/A))))**2\n", - " return(obj)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def calc_binding_time(Kd_n, A_total):\n", - " obj = return_objective_A(Kd_n, A_total)\n", - " # Different minimizers have been tested and 'L-BFGS-B' was significant faster than anything else:\n", - " obj_min = minimize(obj, A_total, bounds=[[0, A_total]], method='L-BFGS-B', tol=1e-20)\n", - " BnA = return_BnA(Kd_n, obj_min.x[0])\n", - " assert(BnA.sum()+obj_min.x[0]-A_total < A_total/100)\n", - " #print(obj_min.x[0])\n", - " return(BnA)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_Kd(seqAA, targets, max_affs, hds):\n", - " Kd = min([a + fast_hamming_dist(seqAA, t) * hds for t, a in zip(targets, max_affs)])\n", - " return(Kd)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def T_BA(BA, p):\n", - " # We keep alpha to enable the possibility\n", - " # that there is a minimum lambda_\n", - " alpha, beta, Q = p\n", - " lambda_ = alpha + (2 - alpha) / (1 + Q*np.exp(-beta*BA))\n", - " return(lambda_)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# GPSLVKPSQTLSLTCSVTGDSITSGYWNWIRKFPGNRLEYMGYISFSGGTYYNPSLKSRISITRDTSKNQYHLQLNSVTTEDTATYYC\n", - "# Just adding something random:\n", - "targets = ['GPSLVKPSQTLSLTC',\n", - " 'ISFSGGTYYNPSLKS',\n", - " 'SRISITRDTSKNTED']\n", - "AAseqs = ['GHSLVLPSTTLHLTN',\n", - " 'IGFSGGTYFNPSLNN',\n", - " 'SNITITRDSSKRTEE',\n", - " 'GHKLVLPSFTLHLTN',\n", - " 'IGFTGGTYFNPFLNN',\n", - " 'SNITNTRRSSKRTEE',\n", - " 'GHSLVLPETTLHLTN',\n", - " 'AGFSGGTYFNPSLNN',\n", - " 'SNITITRDSAKRTEE',\n", - " 'GHCLVLPSTTLHATN',\n", - " 'IGFSCGTYFNPSLNN',\n", - " 'SNITITRGSSKRTEE']\n", - "max_affs = [10**(-6), 5*10**(-7), 10**(-8)]\n", - "hds = 10**(-6)\n", - "carry_cap = 9" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1e-06, 5e-07, 1e-08]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_affs" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:3: RuntimeWarning: divide by zero encountered in true_divide\n", - " app.launch_new_instance()\n" - ] - }, - { - "data": { - "text/plain": [ - "array([ 0.30995913, 0.64937172, 0.50055941, 0.20141412, 0.24808862,\n", - " 0.20060519, 0.20141412, 0.39259503, 0.30853939, 0.13832847,\n", - " 0.39259503, 0.30853939])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Parameters for the generalized logistic function to transform :\n", - "Tparams = [-0.002, 13.8, 996]\n", - "carrying_population = 9\n", - "A_total = carrying_population/2\n", - "Kd_n = np.array([calc_Kd(seqAA, targets, max_affs, hds) for seqAA in AAseqs])\n", - "BnA = calc_binding_time(Kd_n, A_total)\n", - "T_BA(BnA, Tparams)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def lambda_selection(AAseq, targets, max_affs, hds, carry_cap):\n", - " # Parameters for the generalized logistic function to transform B:A\n", - " # into a lambda parameter to the progeny distribution:\n", - " Tparams = [-0.002, 13.8, 996]\n", - " A_total = carry_cap/2\n", - " Kd_n = np.array([calc_Kd(AAseq, targets, max_affs, hds) for seqAA in AAseqs])\n", - " BnA = calc_binding_time(Kd_n, A_total)\n", - " lambda_ = T_BA(BnA, Tparams)\n", - " \n", - " return(lambda_)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:3: RuntimeWarning: divide by zero encountered in true_divide\n", - " app.launch_new_instance()\n" - ] - }, - { - "data": { - "text/plain": [ - "array([ 0.29888127, 0.29888127, 0.29888127, 0.29888127, 0.29888127,\n", - " 0.29888127, 0.29888127, 0.29888127, 0.29888127, 0.29888127,\n", - " 0.29888127, 0.29888127])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lambda_selection(AAseqs[0], targets, max_affs, hds, carry_cap)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def find_Lp(f_full, U):\n", - " assert(U > 1)\n", - " def T_BA(BA, p):\n", - " # We keep alpha to enable the possibility\n", - " # that there is a minimum lambda_\n", - " alpha, beta, Q = p\n", - " lambda_ = alpha + (2 - alpha) / (1 + Q*np.exp(-beta*BA))\n", - " return(lambda_)\n", - "\n", - " def solve_T_BA(p, f_full, U):\n", - " epsilon = 1/1000\n", - " C1 = (T_BA(0, p) - 0)**2\n", - " C2 = (T_BA(f_full/U, p) - 1)**2\n", - " C3 = (T_BA(1*f_full, p) - (2 - 2*epsilon))**2\n", - " return(C1, C2, C3)\n", - "\n", - " def solve_T_BA_low_epsilon(p, f_full, U):\n", - " epsilon = 1/1000\n", - " C1 = (T_BA(0, p) - 0)**2\n", - " C2 = (T_BA(f_full/U, p) - 1)**2\n", - " C3 = (T_BA(1*f_full, p) - (2 - 2*epsilon))**2 * ((2 - T_BA(1*f_full, p)) < 2*epsilon)\n", - " return(C1, C2, C3)\n", - "\n", - " # Some funny \"FloatingPointError\" errors are not affecting results so ignore them:\n", - " old_settings = np.seterr(all='ignore') # Keep old settings\n", - " np.seterr(over='ignore')\n", - " try:\n", - " def obj_T_A(p): return(solve_T_BA(p, f_full, U))\n", - " p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000)\n", - " assert(sum(solve_T_BA(p, f_full, U)) < f_full * 1/1000)\n", - " except:\n", - " print('The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution.')\n", - " def obj_T_A(p): return(solve_T_BA_low_epsilon(p, f_full, U))\n", - " p = fsolve(obj_T_A, (0, 10e-5, 1), xtol=1e-20, maxfev=1000)\n", - " assert(sum(solve_T_BA(p, f_full, U)) < f_full * 1/1000)\n", - " np.seterr(**old_settings) # Reset to default\n", - " return(p)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution.\n", - "[-3.00933283 9.79965855 0.66471476]\n", - "[-0.59912445 8.374447 3.33820462]\n", - "[ -0.0687401 10.31115043 29.09509673]\n", - "[ -2.00797632e-03 1.38115153e+01 9.96004200e+02]\n", - "[ -3.56308142e-04 1.55397980e+01 5.61313610e+03]\n", - "[ 8.29023539e-04 1.62497766e+01 5.06869691e+04]\n", - "[ -2.62876632e-03 3.21160977e+01 4.16632517e+11]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last five Jacobian evaluations.\n", - " warnings.warn(msg, RuntimeWarning)\n", - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last ten iterations.\n", - " warnings.warn(msg, RuntimeWarning)\n" - ] - } - ], - "source": [ - "Ul = [1.2, 1.5, 1.8, 2, 3, 5, 10]\n", - "f_full = 1\n", - "for U in Ul[::-1]:\n", - " p = find_Lp(f_full, U)\n", - " print(p)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last five Jacobian evaluations.\n", - " warnings.warn(msg, RuntimeWarning)\n", - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last ten iterations.\n", - " warnings.warn(msg, RuntimeWarning)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The U parameter is large and therefore the epsilon parameter has to be adjusted to find a valid solution.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "from matplotlib import rc\n", - "rc('text', usetex=True)\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "\n", - "Ul = [1.2, 1.5, 2, 3, 5, 10]\n", - "# Ul = [5]\n", - "f_full = 1\n", - "for U in Ul[::-1]:\n", - " p = find_Lp(f_full, U)\n", - " t = np.arange(0, f_full, 0.0001)\n", - " s = T_BA(t, p)\n", - " ax.plot(t, s, lw=3, label=r'$U = {}$'.format(U))\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", - "\n", - "plt.ylabel(r'$\\lambda$', fontsize=14)\n", - "plt.xlabel(r'$B_{bound}$', fontsize=14)\n", - "plt.title(r'Effect of $U$ on the $T(B_{bound})$', fontsize=14)\n", - "#fig.savefig('T_Bbound_U.eps')\n", - "fig.savefig('T_Bbound_U.pdf')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last ten iterations.\n", - " warnings.warn(msg, RuntimeWarning)\n", - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last five Jacobian evaluations.\n", - " warnings.warn(msg, RuntimeWarning)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "from matplotlib import rc\n", - "rc('text', usetex=True)\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "\n", - "U = 5\n", - "f_full_l = [0.1, 0.2, 0.5, 0.8, 1]\n", - "# f_full_l = [1]\n", - "for f_full in f_full_l:\n", - " p = find_Lp(f_full, U)\n", - " t = np.arange(0, f_full, 0.0001)\n", - " s = T_BA(t, p)\n", - " ax.plot(t, s, lw=3, label=r'$f_{{full}} = {}$'.format(f_full))\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", - "\n", - "plt.tick_params(axis='both', which='both', labelsize=16)\n", - "\n", - "tick_locs = [0, 0.2, 0.4, 0.6, 0.8, 1]\n", - "plt.xticks(tick_locs, [r\"$%s$\" % x for x in tick_locs])\n", - "\n", - "tick_locs = [0, 0.5, 1, 1.5, 2]\n", - "plt.yticks(tick_locs, [r\"$%s$\" % x for x in tick_locs]) \n", - "\n", - "\n", - "\n", - "plt.ylabel(r'$\\lambda$', fontsize=14)\n", - "plt.xlabel(r'$B_{bound}$', fontsize=14)\n", - "plt.title(r'Effect of $f_{full}$ on the $T(B_{bound})$', fontsize=14)\n", - "fig.savefig('T_Bbound_f_full.pdf')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last ten iterations.\n", - " warnings.warn(msg, RuntimeWarning)\n", - "/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", - " improvement from the last five Jacobian evaluations.\n", - " warnings.warn(msg, RuntimeWarning)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "####\n", - "#### For the cartoon figure of the flow of the model\n", - "####\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib import rc\n", - "rc('text', usetex=True)\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "\n", - "U = 5\n", - "f_full_l = [0.1, 0.2, 0.4, 0.5, 0.7, 0.8, 1]\n", - "#f_full_l = [1]\n", - "for f_full in f_full_l:\n", - " p = find_Lp(f_full, U)\n", - " t = np.arange(0, f_full, 0.0001)\n", - " s = T_BA(t, p)\n", - " ax.plot(t, s, lw=5, label=r'$f_{{full}} = {}$'.format(f_full))\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "box.y0 = 0.17\n", - "box.x0 = 0.17\n", - "ax.set_position([box.x0, box.y0, box.width * 0.8, box.height*0.9])\n", - "ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", - "\n", - "plt.tick_params(axis='both', which='both', labelsize=16)\n", - "\n", - "tick_locs = [0, 0.2, 0.4, 0.6, 0.8, 1]\n", - "plt.xticks(tick_locs, [r\"$\\mathbf{%s}$\" % x for x in tick_locs])\n", - "\n", - "tick_locs = [0, 0.5, 1, 1.5, 2]\n", - "plt.yticks(tick_locs, [r\"$\\mathbf{%s}$\" % x for x in tick_locs]) \n", - "\n", - "\n", - "\n", - "plt.ylabel(r'$\\lambda$', fontsize=20)\n", - "plt.xlabel(r'Fraction BCR bound', fontsize=20)\n", - "#plt.xlabel(r'$fB_{bound}$', fontsize=20)\n", - "#plt.title(r'Effect of $f_{full}$ on the $T(fB_{bound})$', fontsize=20)\n", - "plt.title(r'Effect of $f_{full}$ on the $T(fB_{bound})$ $\\sum_{i=1}^{colors} AB_i$', fontsize=20)\n", - "#fig.savefig('T_fBbound_f_full.eps')\n", - "fig.savefig('T_fBbound_f_full.pdf')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEFCAYAAAARwQdOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8FGX6wL+zu+k9pAEBQkINTUgoIuipcFJEsYB6NjwV\n2w/1UAE7ejYQ23mngqdYTj0ENSpSpBwiIh3pJYUe0nvf8v7+mF3Y7Mwm27IJsN/PZz/Jzrzzzruz\nu88+81RJCIEPHz58+Di30bT2Anz48OHDh/v4hLkPHz58nAf4hLkPHz58nAf4hLkPHz58nAf4hLkP\nHz58nAf4hLkPHz58nAdcsMJckqRRkiQJSZKmurK/rSFJ0gxJkla19joAJEmaar52kVbb2sz6znck\nSYqUJGmx+T0QVtst2xabn5e68p743su2ia61F+DDYwwGRrX2Ipqgra/vfOJDIBJIA6IBJEmaAwwy\nb7PwNZDtwvy+97INcsFq5ucbQohJQgiptddhD2fXJ0nSHEmSkltyTS1JK6//RmC+EGKHEGK11bYl\n5m07AIQQ9wkh5jo7udp7ea6/X+cDPmHuo81hNs/MQNYkzzlac/1WArXMZlcyUNxC5zyn36/zBZ8w\n9+HDh4/zAJ8wdwJJkpLNTqRSsyNple2tpfl2s1SSpEGSJG03j9tudqgmm48RkiRlS5J0o4ePFXbm\nWmU1l0J7Mjsss81j5psf2ZIklTp4XWaYz1UqSdJ8ZHut7Rjb9d1odc4z19LsnLOc1+KwK7U6ztn3\noLnXbhljWf8q63HmdTZ6L5q5Fk2u3+acljkdcrI399rNdnGLDdwy/xyrKebYOECzLf87c92s38um\nXq9lnGTlCDdvn6G23YebCCEuyAeyA0c48JhqdcwcYDGy/XEUsB0otZl3jvm4bPO4qcgf9lLz+Knm\n7dny5ffssQ7MlW1z3I2W12k1dzbyLfMgB67jDPPxq6zOY7l2kWrrQ77lF+Ztg8zHzTf/H2n13kw1\nj0320Htg+9ot57Fe+2Jgjs21mWP+f7H5eXIT16O59VvmnG8eZ7l+8x241k2+dptzzzCfO9K8z3JO\n623ZwGIXrpv1e2n39Vq9zzNsjt8OrGptGXC+PVp9Aa32ws9+AC0CxfZhEUpTm5hjkHnMjVbbLF+I\nUSrbZlhts3ypB3nyWJXj1NZmLWS323yhb7Sex4HrWGr7xbQSUPaE+Y22+22OT7Zdu4vvQXOvPbsp\noWJ+bXNstm233ebM+s1zzrfZZvksjmpqXgdfu+q57QhVe8K8uetm+1lr6vVux+rHAFn4N/m98j1c\ne/jMLPIHbYftA8hp7kDzOJA/zLZssz6H+e9qq22W+aM9fKwt1sephaFFAiW2Gx25BTbffkcia3zW\n2Drf7K1pjfmW22XHWTPvgd3XbjZPJCMLJgVWr81iErDEbFt+7J3GbKJRXC8hR5yUAZOcma+Z1+4O\nzX1mnOFVINnqPZ4KIIRY4Oa8PmzwCXMnMdtQF5ttiXZtykIINYHWnJBz+1gH57JmNTDZbCeNBO4D\ndjhwHJwVIs3+8KmsabT56Rxgu+REEoqb74EFy9oVP2Q2+9OAFJuHU0JXZU6165WDA0LZ0dfuDg6+\n947OtQT5s3uTedNNwBJPze/jLL6kIScwCxyLNmfRnre33oo8QjayQLO8jh3AlQ4e68wdQiPM2mia\n+QdkKrJzboZoJu7Zg+9Bc2s/I3CFEE79WDlwzmTk62xNMo3vyBScw5+/r4GpkiS9inxXM7OV13Ne\n4tPMHcR8Wz4KmCmEWOCoKeYc4CbgPiEngUQJIdIc1czM16AMWZu3JsXRkwshyswCfAdyZiHY0ZY9\n+R6YBXQOKoJFkqRIq9emMMM4YIKyp+1bBHCj6yXJkUmRyM5NVdr458/e67UwB/n1TQXKxNlEJh8e\nxKeZO4gQIkeSpDJkDRLkL/r5oGHkIL+mRQDm17bDiS/cq+bj5yMLo0HIDlC7mEPxZiLbji3mhUHm\n5wghyszruM/yVwgxugXeg/uQQ/gWA4uQtXSLCWU0cC9yuN1i89osZqgclD9gZ2hi/WWSJN0HzJck\nKdp8ToumvaSpa96WP3/2Xq/V/hxJknYATyJr6T5aAJ9m7hz3In/hF3M2TOxcpwRZkM6xeqwyxyA3\na8M1a9VzgcnIAq8dzQuZr5HtpvchX8P7gLk2TrG5yJroHBqbJDz2HlhMPZzVimdidadhtvda9q9C\nrnmiqs2roLp+82scjSzELa99phDCETt8W/782Xu/LFh+DG2d5T48hCSEr6HzhYo5umIVMMksuCwm\nhHTz9iUOChkfPppEkqQZyBq7wyY4H87h08wvbJLhjAaK+X+LTXM1KpmcPny4yH34tPIWxaeZX8CY\ntfAjyKaD+cgOumRkM8BUYLTPWeXDVcxmukHIju0ZyA52j4U9+miMzwF6AWN2XHVFtnPORBbkZcha\neZpVUooPH64QiexnANmU5xPkLYhPM/fhw4eP8wCfzdyHDx8+zgN8ZhYgJiZGJCUltfYyfPi4YNi+\nfXuRECLWwbFxOp3u30BfLlwF1ATsNRgM96SlpRWoDfAJcyApKYlt25rMpPbhw4cHkSTpmKNjdTrd\nvxMSEnrHxsaWajSaC9IubDKZpMLCwtS8vLx/A9eojblQf+V8+PBx7tA3Nja2ojUF+YYNG4KHDx/e\n3RNzLVy4MCojIyPsmWeeiW/qfNbPNRqNiI2NLUe+O1HlnBDm5op+882dS+Y30TGmyTE+fPg4J9G0\ntkbeq1ev+qSkpAZ357EI6YkTJ1ZGRkYabYU2QEZGRtgtt9yiyL42XwO7MrtNCHOrdliKmh7mLEVL\nQwBLPY9GrawcGePDh4+WRQiByWhq7WW0CD/++GP46NGjK9yd54svvoiKiooyAHTr1q1+xYoVYbZj\nJk6cWNmpU6d6Z+duVZu5ueDSaM62nlKrAjcfufBTDsiV+iRJykGOX01zYowPHz48jBCCiloDu9au\n4MD3m4ksNVA8Po8Hpiy0FG3zGEmzfmrx7/LR18arlhTesmVL8LRp0wozMjLC5s+fH7t8+XKXKlaW\nl5frYmJijJbnxcXFHpPBrSrMzUWHFpg1a0WjXHOGYjKNO5+AnNgyyNExPnz4cJw6vZHi6gaKq+op\nrmqgqKr+zPOKinICSw8TVZVFbF029bocTKUxdK8eR7SxnqKgOlhXR8VkPREh/q39UjzGrl27gjdv\n3hxy1113lVoLY4D9+/f7f/nll1Fqx7300kv53llh249mSTf/tc0cK4Ezrb2imxvjy2T0caFjMJoo\nrm6gsLKewsp6CirrzvxfWFVPQUW9LLSrGqisN6DFSJKUR0/pBD01J+glnWCMdIJEqYBdgf6sDAlm\ncUAQYzd2Iip2DKbIGLqKRPqJIEz6Wna89DGX/v1utDq/1n7pHqG8vFxXXFys3b9/v/+IESNqrPel\npqY2OCq0IyIiDEVFRVqA0tJSXbt27QyeWmNbF+YWmit+7+iYM5hNPFMBOnfu7MqafPhoVYQQVNUb\nKLAI5cp6m/9lgW3RrNWTvQVxlNFLc5zR0gl6aU7Q0/8E3aVTBEh68wjYE+DPopBgfg5pT7GkZfxW\nwUMH+nE4eQKVobns999/ZkZNgESX8iAMDaA9VyRME2zYsCH4uuuuKxk3blzFu+++Gztt2rTC1NTU\nM85QZzTzW2+9tXTTpk3BQGV2drb/mDFjKgGKioq0thq/s5wrl9qRtmROtS6zmHgA0tPTL8jYVR9t\nl3qDkYKKevIq6sgrNz8q5Ed+eR35ZkFdp3fc4RhAAz2lE6RqjtFTkrXtnprjREtVquOz/PxYFhrM\n8pBgTvrJGvaAbBNPrjbSEDaGQz2vRl+1BD9dz0bHmSSBsaEUf9358bXKzMwMGDNmTKVFgJeUlOiA\nM8LcGc18xIgRNZs2bQrOyMgIi4yMNFq0/Msuu6zHvn37DoAcurh3796QhQsXRt11110O93lt68Lc\n4mSwLcUabbW/zIExPny0CYQQlNXoGwnmvIo68i1Cu6Ke/Io6Sqrdi4KLoIpUzTH6SEfP/E2RctFJ\nTQv/Uzoty0NCWBYaTKb/WZt3XKngzjUmBmXrONjzDvLjB2OqP0CoVEOVRrnWrtcMQvL3rM3cnnOy\npbEWqO+///4pd+d7/PHHi8z/Vlq2WQS55XzOCHELbVqYW7XKstW6I4EccxW2MgfG+PDhFer0RnLL\nasktq+NUWQ2nyurMz+XH6fI66g2eDN8TdKRIFtiao6RKx0jVHCNRKmr+UDNFGg0/hwSzPDSEPwID\nGu3z1wuu22hiwmaB0Iaz86L7qAhPQpjq0Nf+QufQnuRJdYo5h1463u1X5sM52rQwN2PpMRlpLtma\njBy9cp+TY3z4cAshBMXVDeSW1XKqtJZTZqGdW1ZLbrm8rdhNjbopJEwkS6fpJx2hj+boGa07Uqp2\neq5KSWJNiGxC2RQUiMk2jFAIhh0U3LHWREwFVIZ2Yne/+6gPkE3DhrrfQNQQGdwRo5TX6FA/rY6g\noCCXX6cP12jtOPMbkbvDW7KdbjQL4q3m3pIIIeaa41UXm2PH05HbT53pF+nIGB8+HKGyTs+JklqO\nl9RwoqSGE6U1HC+RH6dKaz2sVTeFoJNUwAAph36aHPpLR+irOUKYVOvyjA3Ar8FBLA0NYX1QEA0a\n9TjwxELBX1eZ6HtMtnkXxFzE/t53YtLKZhOTIR9j/S4AAoJigMbCPDIswuMx5j6ap7XjzJcgN/Zt\nbpylabBbY3z40BtNnC6rOyOgLcL6pPl5aY2+FVYlaE8J/TUWwZ1Df02OSxq3cmbYFeDP0tAQlocE\nU6HV2h0bXCeY9KuJMdsFWiEfe7TLGI50nXB2PmFCXyOndET4xdCgVTo5o2Lbub1uH85zLphZfPhw\nCqNJkFtWy9Hiao4UVZNTWH3m/5OltRhNrRtlEe9Xw+Uhx0jX5dBbZNOl4TCheqcia5vlhJ8fS2M7\nszRQw3HRTGa4EFy6V3DbWhOR5ghqo8aPAz1voyA+vdFQY8MehFEO3IgN7EyVir08MsrXOrY18Alz\nH+ckQggKq+o5YhbUOUXVZ/4/WlxDg9fMIY3RSBAfHkiHyCA6RgbRMcKPPtqTdGs4SELlHsIKd6It\nzQalDHQdXRDE96Eirhc/B/nzY81xdpQfBvSyet0EnQoEd/9sJPXE2W31/hHs7juVyvCkRmOFqRpD\n7YYzz+OCOnNMxewTGekT5q2BT5j7aNMIIcgtryMzv5Ksgioy86vILKgks6CKyjqPJc85TLC/VhbS\nUUFnBHaHyEA6RgbTITKQeG0lfrnb4eQGOLkVdu4AvfvmkjP4h0GHi+RHwgD08alsrMvnhyM/se7E\nOhrKHHPABtYLbv/dnys316Gx+t2zdXRao69dD1ZaflxgJ/ZKhxTjzkdhvmHDhuAZM2Z03LhxY6a7\ncy1cuDAqKirKsG3btmC1+PR58+bFAGRnZwc4EwrpE+Y+2gQmk+BUWa0sqPOryCyQH1n5lVQ3uJUY\n5xQ6jUTHqCA6RwfTKTqYTlHBdI4ONj8PIiLI76xzz2SEgv1w/H+wY7MsvEuPenAxQdB+AHQYKD86\nDoLoFNBoOFRyiIysDJat+ycldY6baAI1Adxd0IuR32ajKW4ctVsQO5D9ve444+i0xqg/hqnhTCg0\nEX6xBGiDVc0sUVGqyZDnNC1RAjcrKytgw4YNwdblATIyMsLGjRtXkZqa2jB27NjkjIyMsIkTJ1ba\nn/EsPmHuw+vUNBg4lFfJ/tMVHDhdwYHTlRw8XeE1oR0T6k+ijZDuZP4/ITwQndZOZWhDPRzfBMc3\nwrHf4cQWqC/3zKK0/hDfVxbYFuEd07NRPnx5fTnLDi/iu8zvOFByoInJGiMhMSRhCNf7D6HXJxuo\n37y10X7Z0TmWI12vVj9ea8DPtB5r13BcUGcEgkpvmllmR7R8BdTZ5aqJSZ4sgXvVVVdVwNkSuNbC\nPCsrKyArKysgNTW1KCkpqT4rKysAq+SipvAJcx8thhCCvIo69ueeFdoHTldwpLjaTp0QzxEeqKNr\nbCjJMSEktQuha2wIyTEhdGkXTFigg8Wf6splgX1sIxz/HU7tAKPTZabVie0FHdMhMQ06DIK4VNAp\nNWKTMLH59Ga+y/qONcfW0GByXDlMjkhmQsoExre/Eu2n31H8yT+p1zeO1rHn6LQQFOZHh+Qs9q0r\nbLQ9LrAzNTRgkhq/kQEBAQQGBjq8xnMFb5XAtcoOZdeuXcG33nrreZPO7+McoqS6gV0ny9h9opzd\nJ8vYdbKcoioPCT8VAv00JLULITk2hK5moS3/H0pUsJ/zsc41JXB0g/w4vhHy94HwgCM1MAISB0Pi\nEEhMh45pENS09ppblcv3Wd+TkZVBbnWuw6eKCohiXPI4JiRPoHd0b6rWrCH/kbsx5J5WjLXn6LTQ\nLjGUYdeE891r8xT74kOSKJFqFNsjIyPPyxhzb5fA3bBhQ/CAAQNqbCs0NoVPmPtwiep6A7tPykJ7\n98lydp0s42Sp6wktTRHsr6V7XCjd48PMf0PpHhdGx8ggNHYSXxyirkLWuI+slx95e2g2/KM5JA3E\n9ZGFduJg6DTkjJ27OeqN9aw5tobvsr5j8+nNCAfX4q/x50+d/sQ1KdcwvONw/DR+NBw7xsmn7qd6\n/a+qx1SEdmJ3v/tpCFD/Uek6IIYr7uzJty8/hcnY2PwVHdQeP/yplJS2+vPR+QneL4G7YsWKMGfr\nwPiEuQ+HyK+oY+vRErYdLWX7sVL2n67weLx2aIDOLKhD6REfRjezAO8QEegZba+hBk5sgiO/ysI7\ndycIN+30/mHQeSh0Hgadhsq27gBFJ7AmOVx6mCWHl7A0ZymVDQ6ZRwHo264v13W/jjFdxxDuHw6A\nqa6OwgUfUPzvfyMa1E0yBbED5YxOjbq5KW1MF4Zek8wfPy/ldJYyWiU9fQKcxLv28lbE2yVw582b\nF2M5zucA9eEWQggyC6rYcqSE7cdK2Xq0xONad2JUEL3bh5PaPvzM38QoNzVtW0xGWWBnrYEjv8j2\nb5ObGZ4hcdDlYug8XP4b3xc09rMq7VFnqGPl0ZUsPryYXYW7HD4uMiCSq5Ov5rru19EjqkejfVW/\n/ELe319Cf/Kk6rECOJo8gSOdx6ju1+o0XH57L3oOTaCyuIhfv/pMMSa6QyIJwV2pp8z7wtyOc7Kl\n8WYJ3IyMjLAXX3wx8Z133kkoLy/XffbZZ9mOrtMnzH0AcKKkho3ZRfyWVczG7GKP2br9tRp6tQ87\nI7R7tw+nV/swwh11QjpL+SnIXgvZayBnHdQ6XUm0MdHJZwV354vl527cJWSXZbP48GJ+yP7BYS1c\nI2m4pMMlXNf9Ov6U+Cf8tI2vnT6/gPxXXqFy5Uq7cxg1fmSOmE6uRr0RS1C4P+Pu70dCcgQAaxd+\ngL5OKaxH3/0QDV/LQR0VGuX+6Gin2gqcE3izBO7EiRMrKyoq/nBlXp8wv0Apq2ng18yiMwL8eInD\nfha7aCToHhdG/8QI+neKZEBiBD0TwgjQOa+5Ooy+Vo42yV4ra+CFjofsqRLTA5JGQtII6DIcwhLc\nXmK9sZ5Vx1ax+NBidhQ43sGwU1gnrut2HdekXEN8SLxivzAaKf3yKwrffhtTtf3EJEOnHuxLf5ji\nUvUfoXaJoYx/sD9h0XIUSuaWjWRt3aQY1//KMcQGd6KwYQ8AFSqa+fkozM8VfML8AkEIwaH8StYe\nLOB/BwvYfqwUd03eHSODGNQligGJEfRPjKRPh3BCArzwkSo7DodXwuEVcuSJwY3c+Mgu0HUkdL1M\nFuLh7T22zCPlR1hyeAk/ZP9AWb1jZfWDdEGM7jKa67pdR1p8ml1fQe2+feQ9P5u6vXvtT+bnh3Tz\nA2wv70t1qbp5KfmiWK6c0hv/QPl9q6+pZu3HHyjGhURGMfLWKdT9JiuVBozUSMq7t/PRZn6u4BPm\n5zENBhO/ZRWx6kA+6w4WkFvuutDTSJDaIZz0LtGkdYkiPSmK9hFeqlltMsGp7XB4ORxaAQX7XJ8r\nrD10vVQW3F1HQlSSx5YJYDAZWHdiHV8d/IoteVscPq5HVA8m9ZjE+OTxhPnbd6Aaq6op/Mc7lP7n\nC/m62CF42DBqJk/nl+XFGPTqgjxtbBeGTkhGsvJT/PrVZ1SVKqNULp8ylcCQUCoyswB152d4eDh+\nfudHA+dzEZ8wP8+oNxj59XARy/aeZtX+fJfrl/jrNKR1jmJocjTpXaK5qHMkod7Qui3UV8mmk8Mr\nIXMlVBc2f4wafsGy4O52JSRfDjHd3bJ526OkroRvDn/DokOLyK9xLLQ4UBvIVUlXMannJPrH9G8y\nYkcIQeWqVeS//AqGfPvza9u1I27mTA5Jfdj2w1H1MVaOTmtOHtjLrp9/UoxPHjSYHsNGYKrR03BS\nNvP6TCxtD58wPw8wGE2szyzkhz9yWXOggMp65wW4RoJ+iZFcktKOS7rFkNYlikC/FrR1q1FTAgd/\nggM/yM5Lo4ulMBL6QcqVsgDvNBR0Ac0f4yL7ivbx5cEvWX5kOXoHI2W6RXbjxh43MiFlwpmQwqbQ\nnzpF3t9fomrduibHRU6eTNS0R/kl4xRZ24+qjgkK92fcA/1I6BrR+Bz1daz84B3FeL+AQK786wNI\nkkRdTvmZMPwLTZh7s9CWhWeeeSbemaQjnzA/hzlwuoJvtp8k449cl6JPOkUHcXnPOEZ0i2Focjsi\nglrhFrkyHw7+CPt/kO3frsR9B8dAyhVnte8wpbPQkzQYG/j52M98deArdhftdugYf43/GS38otiL\nHIqbF3o9JZ99RuE//4WotR8aGtC9OwkvzMbUtQ8/vL+bwuPqUTIxnUIZ98BZR6c1Gxd/SVmeMkv0\nkptuJzw2DoC6zLORQRUq2Z/nY4EtC94qtGUhIyMjbO3ateGAT5ifr1TW6flu5ykWbT3Bvlzn6v7o\nNBLpSVFc0SuOK3rFkRIb2jqp12Un4MCPsgZ+fBMuZV0m9IeeY6HHVdB+oEMZlu6SX53P14e/Zsnh\nJQ5XKkwKT2JSj0lck3INkYGOOwdrdu4k7/nZ1B8+bHeMFBhIzEMP0m7KFApO1bLsta3UlKvLm+SL\nYhl1Vyp+Acq7rdOZh9i+NEOxvX2PXgwce7b4Vl3WWSeums38fNbMvVVoyx18wvwcITO/ks9+P8a3\nO046VV0wxF/LFb3juapPPJf2iG25+O7mqC6Cfd/BnsVwYrPzx+sC5YiTHldBjzEQ0dHza7TDvqJ9\nfLr/U34++jNGB+4cNJKGyxIv4y+9/8LQhKFO/WAay8spePMtyr7+mqaqkYVcdikJzz6Lf2Iimdvy\nWfPpAYx6dYeomqPTgkGvZ+UH7yBsatBo/fy46v5H0JgTogwldRiLzzrQW8PM0u/Tfi1eNXHPnXtU\nE5O8VWgLZO194sSJlXPnznUqLtYnzNswQgjWHSpkwfocfs8pdvi40AAdo3rHMbZfey7rEet927eF\n+ko4uEwW4NlrnTehhMabhfdYSL4M/ENaZp0qGE1G1p1cx2f7PnM4NjwiIIIbut/A5J6T6Rjq3I+N\nEILKlT+T99JLGIuK7I7TxcUR/9RThF31ZxCw5ccctv50VHWsVqfhijt60WOIfZmw+dv/UnzyuGL7\nxTf+hXYdO515bm1iMWGi8gKpY27Bm4W2LLVbnMUnzNsgRpNg2Z7TvLcumwOnHbuz89NKXNkrnusH\ndeTS1hTghgbIWi0L8EPLweBkGYCIzpB6DfS+Ri5U5QXziTU1+hoysjL4z4H/cKLyRPMHAL2je3NL\nr1sY23UsgTrny7/q8/LIe/HvVK1da3+QJBF1663EPvoI2tBQ9A1G1nxygOwdBarDg8P9Gavi6LQm\n/0g2mzMWK7bHJ3dj8ITrG22rtzKxVEl1CJvSt8HBwedl6VsL3iq0ZdHKXVmjT5i3IUwmwfe7TvHO\n6kyOFjtmRhuQGMENaYlM6N+BqBBlPWyvkb8fdv4Hdv8Xahy/iwDkqoIWAd5hYIuEDjZHXnUeXx38\nisWHFzuUZq+TdIzuMpq/9P4LA2IHuOR7ECYTZYsWUTDvjSYzOANTU0l44QWC+vUFoKq0nmUuOjot\nGA0G2bxiE6uu0Wpl84r2rDIgjIK6zLPC/EKMZPFWoa3MzMyAzMzMgOLiYm15ebnOnoNUDZ8wbwMI\nIVh3uJA5yw9yMK95QRLir+W6QR25fVgSPROcq9DnUWrLYO83shDPdTxNHZC76PS5ThbicamtIsAB\nDhQf4NP9n7LyyEoMovmQzujAaG7qeROTekwiNjjW5fPWZ2Vx+rnnqd1h/7ppgoOJffQRov7yFySd\n/FXNP1rBsvd323V0pgyM5cop6o5Oa7b+8A2FR5Vm36HXTSa2S9dG2xpOVCCs8hUuNGHuzUJbljow\n8+bNi6moqHDq9loSLd3y5RwgPT1dbNu2rVXOfTi/kue/3+eQTTwlNoQ7Lk7i+kEdHe+W42mEgKO/\nwo7P5WgUZ1LpwxOh3w3QbzLE92k1AS6EYGveVj7a+xEbczc6dEy3yG7ckXoH45LHEaB1PW7d1NBA\n8YIPKZ4/H2EnMxMg9PLLSXj+OfwSztq7M7fms+Yz+47O9HFJDLm6q6qj05qiE8f4z6xHMBoa/3jF\ndOrCba+9jVbX+LNVvuIolevOmpw26TLZq2tsZ7/sssu4/PLLmzyvNZIkbRdCqLc3smHXrl1HBwwY\nYN+RcAGxa9eumAEDBiSp7fNp5q1ETYOBd9Zk8tGvRzA0UyRlUOdIHrq8G1f0imu9Li515bDrv7D1\n31BkP1xOQVCUrIH3mwSdhnndBm6NSZj43/H/8dHej9hTtMehYy7peAl3pN7Bxe0vdvva1+zYyenn\nnqUhy35VU21MDAnPPE3YVVedOZ8wCbYsPcK2ZUfVj9FpuOLOXvQY3Hzwg8loZOUH7ygEuSRpuOqB\nRxWCHKDuUOMwTLUY8/NZMz9X8AnzVmD94UKe/HYPp8qadg6O7B7DQ5d3Y2jX6NYT4nl7YOtHsPtr\n0Nu36zZCGwC9xkP/m+RkHpXelt5Eb9SzNGcpH+/9mKMVR5sd76/xZ0LKBG7rfRvdorq5fX5jVRWF\nb75F6Vfd2dKTAAAgAElEQVRfNRluGHHjDcQ/8QTaiLNOS329kTWf7Cd7p3o5g+Bwf8Y90J/4rs1n\nkgJs+X4JeVnKH+P0a64nIaW7cu3l9ehPN37f1cws53Mky7mCT5h7kdoGI68tP8Cnvx9rctxFnSKZ\nNbYXw5LbeWllNhgNcOB72LxA7szjKO0HwMDboe8NENz6mlqNvoYlh5fw2f7PHKqXEh0Yzc09b2Zy\nz8m0C/LMta9c+z/yXnwRQ16e3TH+XbqQ8OKLhAwd0mh7VWkdy97fY9fRGds5jHEP9CM0yrEokoKj\nOfy+5CvF9qgOiVx84y2qx9QdblwP3oRJtY55u3at9Fn1cQanhbkkSdcDyUA7819LWlsOUAZkA6uF\nEEc9tMbzgsz8Sh74YgdZBVV2xyS1C2bW2N5c1Se+dTTx+krZmfn7e1CujD1WJSha1sAH3irXRGkD\nVDRU8MX+L/ji4BeU15c3O75LeBem9JnChJQJbtnDrTEUFZH38stULl9hf5BWS7u77ybmwQfQ2IT1\n5R+pYNkHTTg6B8Vy5Z3NOzrPrEevZ/m/3sRkVDGv3P8Ifv7qr7vuYGMTS6VUh4nGNvugoCBCQryX\nA+BDHYeEuSRJVwD3ATcCFiljEd4WUoBoZOEuJEnKARYDrwkh3E6DPZdZsfc0j329y27mpr9Ow4N/\nSuH+y1JaJz684jRsmQ/bPpZt446QNBLS/yqbU1qwkJUzlNeX8/n+z/niwBdU6e3/aFroHd2be/rd\nw5Wdr0TrQus3NYQQVPzwA3mvvIqp3P61DOzbl/Yv/Z3AXr0U+zzl6LTm98VfUHT8qHKua66nY8/e\nqscIo6lRCj9AuYq9PCYmxuF1+Gg5mhTmkiQlAQuAUcBqYDKwQwhxpIljIoB0IA2YBcyUJGmqEOIj\nD635nEEIwVurM/nHGvuF1oantOOV6/qRFNMKmk1xNvz6hmwPd6Tin38YXHQLpN8NcUoh1FqU1pXy\n+f7P+fLgl1Q7YNcf2n4od/e9m2Hth3n0Dkifl0fe87Op+uUXu2OkoCBiH3mY6NtvR9I2/gFp1tHp\np+HKO3rTfbBzhcRyDx9g6w/fKrbHdE5i+KRb7R5Xf7QCUd9YASn395lY2ip2hbkkSQOBNcAiYJIQ\nwiGVzTxujfkxV5KkUcAHkiSNFkLc7MoiJUmaA2QLIRY0My5SCFFm9XwQUCaEcKmOgjsYTYJnMvby\n1RZ1c4W/TsOsMb2YMjzJs02MHaHwMPw6T87SFPYbHJwhrg8Mvhv6T3a683xLUlJXwqf7PuWrg19R\n20ymqYTElZ2v5O5+d9M3pq9H1yGEoPybb8h/bQ6mKvt3BCEjRpAwezb+icpU/2YdnRH+jLvfcUfn\nmXnr6ljx3luK2isarZaxD01H10QzibpDyv6pVeEGsLnPvhA0c2+VwN2wYUPwyJEjeycmJtYDjBw5\nsvLLL79s2slmpinNPB1ZiK9xfdkghFgNdJMkSdmLynEGATMkSZqvsm+uEGKm+UdjlVnT2oFszy8R\nQqS4cV6XaDCYeHTRTpbtUXd6pcSG8P5tafSI97JgLDgI6+fC3m9xqFJhjzFw8f/J/TBbK5pGhaLa\nIj7d9ymLDi1qVojrNDomJE9gSt8pJEcke3wtDSdPkffcs1Rv/N3uGG1kJPFPP0X41Ver3glUldbx\n03u7KTqh/kPgrKPTml+/+pTS07mK7RffcAtxSU1fD9uQRIBynfJ6XwjC3FslcIuKirRCiO2WsdHR\n0Q43J7ArzIUQH7qzaJX57nfj8GTO2uctn7BoIEcIMdPO+AV29rUoRpNg+td/2BXko1PjeXPyAO8m\n/ZQcgbUvydmazQlxrT8MuFkW4rE9vbI8RymvL+fjvR87pIn7afy4vvv13N33btqHeq6vpwVhMlH6\n3/9SOO8NTDX2s63Dx48n/umn0NmJw847Us7y9/dQU9GEo3NKKn7+ztv0j+35g50rflRsT0jpzpCJ\nk5o81lBShyFf+bpK65TuL2+ZWQ706t3iVRN7HzygWjXRWyVwreuybNq0Kfjxxx93OFnqXAlN3CGE\naPTpkyRpMXCvzbiZQoi53ltWY4SQTStLdyuL/AM8+KcUHv9zT++ZVaoKYf3rsmOzOZt4UBQMvgcG\n39vizR2cpVpfzef7P+fTfZ8269j01/hzQ48b+Gvfv5IQ4lQFUYdpOHaM0888S83WrXbHaGNjaD97\nNmFXXml3zOGteaz99CBGgx1H5/gkhox3ztFpob6mWrVzkM7PnzEPTW9Ue0WN2v3KjGRT+wCqSxv7\nJDQazQWRMOTNErggN6eYMmWK0s7VBM0Kc0mSHndmQjNCCPGGC8fZm8xWkM9HFty2Lc9TzPZ1kKNq\n5gshnCwa4jrz1+fYtZE/e3Uqd4/oqrrP49RXwe//go3/gIZmojqCY2D4NNkm3obs4QD1xnoWHVzE\nv/f8m9L6pj/XAdoAJvWYxF197yIuOK5F1iOMRko+/5zCt99B1NkvYxAxcSLxT85qlPzTaB5HHJ13\n9qZ7uus/qv/7ZAGVRUr7+4hb7mxU2tYedSrCvLazBmzehqioKLTN/DCcD3izBC7AypUrw52tnuiI\nZj6Xs/fmjqoIAvCYMLdGkqSpqDs1S5CdpHOtxm03O15X25lnKkDnzp3dXtf6w4XMXXFQdd9r1/fj\n5iHun6NZhIDdi2DVc1DVzGcoJA4ueVgOL/RinXBH0Jv0ZGRl8MGuDyioUS/xaiFQG8jknpOZ0meK\nW4WvmqM+J4fTTz1N7R9/2B2jS0ig/YsvEHrppXbH6OuNrP5kPzlNOTof6E98knOOTmsO/b6Bfb8o\nXV2JqX0ZNHZCs8ebavTUH1XGO1RFKUNrL5RIFm+VwLWwa9euYGfX6KiZRQJWIceNr0bx++wdJEmK\nBOYjhz02wqyBW2vhFgE+HzkG3nb8AuSwS9LT092qNna6vJZpX+1ErcTKM+N7e0eQn94Fy55ovotP\nSCyMmA5pU8Df6c9Li2ISJlYcWcE///hns7XEA7QB3NzzZqb0nUJMUMs54ITBQPHChRS9+09Eg33/\nV+SkScTNeAJtmP27m8qSOpa935yjsz+hUa7H7VcUFbLqw3cV2/0CgxjzwKNIDtTGqT1Uik1eENrI\nAEoNSpPxheD89GYJXMt8rqyzWWEuhNBIknQjsha7AFnrtgj2r4UQLhVSd5HJ5r8Ke5UkSauQHaL3\nmTdZHKWeD2GwQgjBjCW7Ka9V2qTvHdmVe0a26OnljvZr/w7bFtKkc9M/VDanXPxQmzOnAGzN28ob\n295gX/G+JsfpJB039LiBe/vdS3xIy9r263OOkPvkLOp22W/a7NexI+3//iIhw4c3OVfekXKWvb+H\nWruOzjiunNLbJUenBWEyseK9t6hXqY1++ZR7iYhzzIegZmIJSm1HcbEyvcSbwtyec7Kl8WYJXMs4\nVyJnHNLMhRBLgCXmhKCbkDNBPwQWSJK0GvhACPGdsyd3gfvM67G1lYOc2LTE6rlFirZojPmXW47z\na6bS4Tyyewyzxqpn1nkEIWDft7BsBtQ04fDW6GRTyqVPQGjL2JLdIbssm7e2v8UvJ+0n2oAcJz4h\nZQL3D7ifTmHN23zdQZhMlH7+OQVvvoWor7c7LurWW4mb/jc0zaSyH96Sx9rP7Ds6B49PYrCLjk5r\nti39jhP7lD883YcOp++fRjs0hzCYVOPLA1OjKVqp/JxdCGYWS41xgPfff/+Uu/NZRaicUYStBXlq\namqDo7Hl1jgVzWJOCFqALMStBfs3kiQJZGG6SAihTDfzDNYhirYsQTapWBhl/tti4Yml1Q3MXXFI\nsT0+PIB/3DwQbUtFrVTkwk+PwaFlTY/rPQFGvwjRLXx34AKFNYW8t+s9vs38FlMziUujOo/ioYse\n8kgFw+ZoOHmS008+1WSkil+XznR46SWCBw9uci5hEmz+MYfty9W/l55wdFrIz8liw38/V2wPjYpm\n9L3/53Cma112GcKm7IQUqMOvSxglJcq48wvBzHKu4HJooopgHwWMBhZLkiSEEC0R9piDHU1bCDFJ\nkqT5kiRZzCzJgKrz01O8syZT1bzy2g39W6aFmxCw41P4+VmobyLkNaYHjJ0LKY43C/AWNfoaPt33\nKQv3LWw2Vnx4h+E8PPBh+sT0afF1CSEoW/Q1+XPnIuzFjUsS0XfeSewjD6MJCmpyPn29kdUL95Pz\nh7qjMyTCn3EP9ieui+uOzrPnqmPZu/MURbQAxjw0naAwx8+hZmIJ7BVFWUU5RmNjIe8rsNW28JTA\nTUMW5qOQnaV2a7e4gxCiyaQBK3t5i3OkqJrPNyk1rhsGJXJ5zxYwZ1QXwff/B4eX2x/jHwZ/mglD\n7mv1GuK2CCH46chPvLXtLQpqm45Q6R3dm+np0xnWfphX1qbPy+P0089Q/dtvdsf4delMh1dfJXjQ\noGbna87RGdcljLH3u+fotOaXzz+mJPekYnva1dfRpd9FDs8jTILa/UrtOyi1HccKlO9ZbGzLRQ/5\ncB6XhblKJcUcZDPHkqYKcZ0vLFifjdEmfCXYX8vMMS2QNZm1Gr57AKqbEIK9r4Fxr0NYyyTKuMO+\n4n28tvk1/ii0H9YH0D6kPdMGTmN88ng0Ust3JBJCUP799+S//AqmSvt+/KhbbyXuselogpuP/snL\nKWfZB/Ydnd3S4rjiTvccndZkb9/CrlVKc1tsl66MuPkOp+bSn6rCVGmzbq1EYI8oCjbvV4yPi2t7\nPpgLGaeEuR0B/jpycs55L8AtFFTW8c12pR/kgctSiAt3vn6GXQwNsPp52PSe/TGh8TBuntwYuY1R\nXFvMuzvf5dvMbxFNRNqE+YVxT/97uLX3rR6rJ94chqIiTj8/m6o19ksP6Tq0p8MrrxAyzLE7hEOb\n8/jf5004Oq/uyuDxSR6r1FhdVmo3y3P8w080WURLjZo9SgdnQEokmkAdhYVKc9GFJMw9WWjLMp9t\nvLq7OJIBegUwCTksMBLYiVza9oLQwNX4bOMxGoyNv7DhgTru8mSGZ0UufH0HnLTviOOi2+Cql+RU\n/DaE3qTnqwNf8cGuD6jU29d4dRodN/e8man9pxIV6L3XULFiBXmzX8BYZs+Xbm7hNmsW2tDQZucT\nJsHmH3LYvkLd0anz03DllFS6pXlO+AmTieX/epPaCmVyz6W3/5V2ic7lNgghqN2rFOZBfeRolYIL\n3MziqUJbIKfqT5s2rcuJEyf2emI+C45o5quRA5hXI8eWW4xqA81lclVpwYiWVsVoEizZrrRP3n5x\nF0IDPOSCOPobLL4TqtWdZwRFw7X/gl7jPHM+D7Ll9BZe3vwyOeVNR4Re0ekKHkt/jM7hXkioMmMs\nLyfvxb9T8dNPdsfoYmNp/9LfCb3sMofmbKgzsOaTA15xdFqz5YdvOLZ7p2J714HpXPTn8U7Ppz9V\nhbHEpkSBJAtzo9FIUZFS0F9ImrmnCm2BXExr7ty59mNeXcSZDNDRnA33a+4+UQDnZcGGjdlF5FU0\n/tBrNRJ3XpzkmRNsXgArZoFQ70pE8uVw3QdtzjZeXFvMvG3zWJqztMlxKREpzBwyk4s7XOyllclU\nb9pE7qwnm+zFGT5hAglPP4U2MtLuGGsqS+TStcUn7Ts6xz3Qn5BIz5qOTh06wG+LlGGIQeERXHX/\nIy6ZcWrVTCxdI9CG+lNQUIDJ1PhONCQkxOuRLP+6f22LV0186IMrVBOTPFVoqyVxRJi3+AU8l/hu\np9JWfnnPOPdt5SYjrHwKNtsp+67RwajZMOwhcCAl21uYhIlvMr/hre1vUdlg36QS5hfGgxc9yE29\nbsJP473yv6b6egrfepuSTz6xO0YbHU3C7OcJ//OfHZ63WUdnehxX3OE5R6eF2qpKfvrHXIRJaZcf\n99B0QiKdN1cJIahRM7H0l2PI1UwsF5JWDt4vtOUKjqTzK+/lLlCMJsG6Q8rb6RvTlJ1jnKKhBr69\nFw7a0WpDE2Dyp9DZO6F6jnKo5BAvbnqR3YX2090lJG7ocQPTBk4jOtC7pVLrDh0i94kZ1B8+bHdM\n2OjRJMx+Hp0TmYzNOTqHTOhK+jjPOTotCCH4+YN3VKshDr72RpIuck3v0udWYyxWM7HIwvxCd36C\n5wpttSTnSj3zNsGuk2WUVDfWxAL9NPzJnbjymhL4YhKc2qa+v/PFMOmTNmVWqdHX8N4f7/GfA//B\naM8cBFwUexFPDn2S1HapXlyd7Bws+eRTCt96C6FXr+OuCQsj4dlnCJ8wwWGhK0yCTT/ksMOLjk5r\n/li5lKytmxTb2/foxSWTb3N5XjXHp39SBNowOVfhQnd+erLQVkviljCXJMmuV0cI4RFnQVvifweV\nH+rhKTEE+rl4K11VCJ9PhHw7Tu30v8qZnFovdiVqhk2nNzF742xOVdkvUREREMH0tOlM7DbRK/Hi\n1uhPnyZ31pPUbLZfPTJ4yBA6vPYqfh06ODxvQ52B1Qv3c2SXeh2clnJ0Wsg/ks0vnyt7ogeEhHD1\nwzPQ6lz7KgshVO3lwf3Ppulf6GYWTxbaArkH6N69e0MWLlwYZV33xV1c+gSYo1i+pumKhOedA3RT\njjLV+fJeLn6oK07DZ9dCkbK2CyDXVBn+cJvpvVnZUMkb297gm8xvmhx3bcq1TE+f7nWTCkD50p/I\ne+EF+wlAfn7EPfoo0XdNcagUrIXWcnRaaKit4ad35mA0KNP1r7rvEcJjXRes+rwaDEU2ZRWsTCx6\nvV61JktraOb2nJMtjacLbd11112lnhTiFlzVzD8E2iEnDGV7bjltlwaDid0nlTG9I7q5UGio4jR8\nMg5KVBzi2gA5WqXv9S6ssmVYf3I9L/z+QpONIpIjknlm2DMMTmi6+FRL4EjIYUD3bnR4/XUCe/Vy\nau68nHKWvb+b2kp1c013s6NT52FHpwUhBKs/el+1KfNFV42n+9CmS+82R+1upT3cv0s42nDZxFJU\nVIQQjRO+wsPDCWqmNo0P7+OqMB8ETBVC/NuTi2nLHMyroN7G4RUd4k9SOycbPNSUwH+uVxfk/qHw\nl0WQNMKNlXqOsroy5myd02S4YYA2gPv638eUPlPwawVzUPXmLeTOnNlkyGH0nXcSO/1vaAKc05wP\nbTrN2v8cxGRQz15tKUenNXvW/syBX/+n2B6blMxlt93t1txCCGp2KYV5cL+mTSwXkr38XMJVYb6a\ns8lDFwR/nFBmCw7sFOncF7mhGr6cDAXKOhcERMBt30An72u2aqw/uZ7nfnuO4jqlaclCWnwaLwx/\ngS7hXby4Mhmh11P4z39RvGCBXE1SBV18PB1efaXZxhGKuU2CTd/nsGNl6zg6LeTnZLF2oTJU1S8g\nkKsfmYnO371iag3HK9UThfqdFdanTyubk8fHt62G3z5kXBXmM4GvzTXM15yPzk5bMvOV9tIBnRxL\nLgHAqIdFt6un5wdFwe0Z0MHxCnctRY2+hje2vcHXh7+2OyZYF8zf0v7G5J6Tve7gBLnmeO5jj1O7\na5fdMWFjx9D++ecdTgA6M3dzjs7IAMY/2J/Yzi3bramuqoof3nwVo0o0zqh7HiS6g5vhsEDNH0qt\nOyAl8oyJBSBP5Y6nffv2bp/bh+dxVZivQa7TsgRQ005bqp55q5FTpBTm3eKar9txhpVPQbZKUSf/\nULj9uzYhyHcX7uapDU9xrMJ+k5PhHYbz/MXP0yHU8UgQT1K+9CfyZs/GVKXujNSEhpLw3LNOhRxa\nqCiuZdl7eyg+1YSj88H+hES0bDEwue7KG1QUKgMk+l7+Z1IvvcL9cxhNqvby4IvO3m0IIVSFeUJC\n2wmT9XEWdxygbjVBPtfILlD2VUyJdVCYb1sIWxYot2sD4JavoIPdEjdeQW/S8+HuD1mwe4HduPEw\nvzCeGPwEE7tNbFEbsT1M1dXkvfQy5d/Z704YnJ5Ohzmv4dfRea21tR2d1mz5fgk5O5R3cLFJyVzx\nV8+U7K/LLMNUbRMdo9MQ1Pds8lR5eTl1dY3NMDqd7oJoFXcu4pIwF0K0WCu2tkhVvUFRj0UjQRdH\nnJ/HNsKyx5XbJQ3c+DF0vdRDq3SNE5UnmLV+FruL7GdxXtLhEl4Y/kKLN1C2R+3efeQ+9hgNx+zc\nMWi1xP7fQ7SbOhVJ67ywbc7ROfSarqSNbVlHp4Xje3fz26L/KLYHBIdwzfSn8PP3zF2BmoklqHc0\nmsCzIkFNK4+Pj0fThspJeAtPlsCdN29eDEB2dnaAJ0IdLZxXppCW4miRUivvFB3cfLJQdTEs+SuY\nlPHB/Pll6H21h1boGj8f/ZnnNz5PlV7drBCoDWR6+nRu7nlzq2jjlkzOgrfeAjuZnH4dOtBh3jyC\nBzl/dyM7OrPZsfK46n6dv4ZRU1JJGeSdBJnKkiK57opKT9QxD00nMt4z5g1TvZG6fUrHdvBFjaNU\n1JyfF6q93FMlcDMyMsLGjRtXkZqa2jB27NjkjIyMsIkTJ9ovauQEdoW5JElPACYhxBvunkSSpCRg\nlRCiu7tztQZ55XWKbZ2jm9HKhYDvH4JK5ReCgbfBsAc8tDrnqTfW8/rW11l0aJHdMX3a9eGVka+Q\nHNE6zaANhYXkznqyyVZu4ePGkjB7Ntpw57MuG+oMrPp4P0d3t66j04LRYGDp23OpKVdGTQ2+9ka6\npQ/12Lnq9hcj9I1/MKRAHYE9Gyd6tTV7+Rs3Xd3iRf8eW7RUNTHJUyVws7KyArKysgJSU1OLkpKS\n6rOysgKAlhXmyM2at0uSdDPwihDCvrHSDmYhfj/whPnvOUl+pVKYx4U1UyVx83z1fp2dhsL4N1st\ns/No+VEe/+VxDpWqZ55qJS339r+Xqf2nerW6oTVVv24gd9YsjMXqYZFSUBAJzzxNxPXXu3THIDs6\nd1N8SnnHBRCXFM64B/q1uKPTmvVfLCT3kDJktVNqP0bcdLtHz6VmYgnuH4Oka2w+aWvCvDXxVAnc\nxx9//Iz2sGvXruBbb7215dP5hRDlQDdJkuYA30iSVIqcwr8d2AbkWIckmuu0RCOn+A/ibP3zHUD6\nuVx9saBCWUc+PryJL3pxttzuzZagKLhxIei8JySs+SnnJ174/QVqDbWq+zuGdmTOpXMYEDvAyyuT\nEQYDhf94V44dt0NAam86znuDgGTXujqdzipj+fw99h2dg+O54vZeXnF0Wti/fi07ln2v2B4SFc34\nR2agccEPYA9jeT11h5Xyw9bEUlNTQ3l544xnSZIuqJos1ni6BO6GDRuCBwwYUOPJ1nGOlMCdKUnS\nK8i9Pyeb/wpQDUkEuXFFGbLg/7MQwn6TxXOEAhXNPN5e/XIh4MdHwKA8hmv/BRHuxwc7i96k581t\nb/KfA0rHmoVRnUfxwiUvEO7fMoWimkOfl8epxx6ndrv98hvRU6bImZwuJssc/P00//uiKUdnMmlj\nu3jVP5Cfk8WqBf9UbJc0Gq5+ZIZL9cmbonpngSIOTRsZgH9SRKNtalp5TEwM/m4mKp2reLoE7ooV\nK8I86fwEBx2gZi19LjBXkqQIZO07GVkTTwGKkZs7lyFr7OdVb1CnNPMdn8HRX5XbB98LvZxv5+Uu\nRbVFPP7L42zPVxeSfho/nhj8RKs5OQGq1q8nd8ZMuz05te3a0eG1VwkdOdKl+U0mwaaMbHb+3DYc\nnRZqysv4ft7LGPRKv9qlt95FYu++Hj2fEIKabUqZE5wWj6Rp/N77TCxn8XQJ3Hnz5sVYtnvFAWoP\ns2DfaX5cEFTUKW/JI4NVNJSaElj1rHJ7ZBcY/UILrKxpdhfu5m/r/ma3QFbnsM7Mu2wevdv19vLK\nZITBQOE7/6D4ww/tjgm55BI6zHkNXYwLBc1o3tEZGhXAuAe85+i0YDQY+PHt16gsVibu9LrkMtLG\nT/T4ORuOVSgrJAIhacqQU7VIltYW5vacky2NJ0vgZmRkhL344ouJ77zzTkJ5ebnus88+81ihQl9o\nogNU1SsTaVSbN/8yB+qUlRWZ8Db4e7df4jeHv+HlzS+jN6nbhsckjWH28NmE+Hl3XRaaNatoNMQ+\n8gjt7r3HqXK11lQU1bLsffuOzviu4Yy937uOTgu/fP4RJ/cr69jHJiXz5/umtchdUvVWpbwJSIlA\nF600GZ46pbQAXKhhiZ4sgTtx4sTKioqKP9xflRKfMHeA6nplnHiIrTAvyoStKkUkB9wCKe6nXzuK\n0WRk3rZ5du3jWknL9LTp3J56e5s1q+ji4uj4xjyCB7tedMwhR+cdvdC52ljEDfauW83OFT8qtgeF\nhTPx8WfwC3Czn6wKpnojtXuUdwEh6Uptu6amRrWGeQcnmnn48D4+Ye4A6sLcRgisnq1MDvIPhVHe\nM69U66uZsX4G60+uV90fHRjN65e+zpD2Q7y2JmscMquMGEGHuXPQRbve3KJZR+e1yaSN8a6j08Lp\nrEOs/ve/FNsljYarH53lVqOJpqjdU4hosI0t1zZK37eQm6usnR4bG0tgoOd/ZHx4Dp8wd4AqFWHe\nyMySt1e9GfOIRyHMOynwedV5PLTmIQ6Xqjcv7tOuD29f/jYJIa1j99TnF3Bq+vQWNauYTIJN32Wz\nc1UTjs67UkkZ2DrhdVWlJfzwxiuqlRD/dPvddO7bv8XOXa3m+BwQi6RyZ6JmYunoQr0bH97FJ8yb\nwWA0KZpSaCQIsv4S/KqSJBvWAYY91MKrk9lbtJdpa6dRVKvu5JvYbSLPDHuGAG3rxLdXb9nCqemP\nYSxSX58nzCoNdQZWfbSPo3vUE41ay9FpQd9Qz/fzXqKqRLm+1EuvYODYa1ru3AU1NBxVJi+qmVjA\nJ8zPVXzCvBmqVZyfIf66s7foRZmwTyU5duR08HeyC5ELrD+5nsfWPUadURnXLiExPW06d/a5s3Vq\nqwhByccLKXjzTTCqV2P0hFmloqiWn97bTUlu23N0gnwdVr73NnlZyrum+ORujLr3oRZ9f6o3KSNT\ndPHB+CUqq34KIXzC/BzFpftZc7anV5EkKdLm+SBJkpJVts2XJGmO+e8gd89b1aA0sQRb28t//yeK\nLLBLF5gAACAASURBVIzQeLn+SgvzY/aPPLz2YVVBHqQL4q3L32JK3ymtIsiNVVWceuRRCl5/XV2Q\nazTE/u1vdFow3y1BnptVxpI52+wK8h5D4pk4fWCrCXKA35d8yaHflbkHwRGRXPPY0x6rhKiGqcFI\n9Q6liSVkSILq56K8vJzq6sbXUqvVXrCZnxY2bNgQPHz4cI/UlnrggQc6wtnqiZ7CVc28TJKkn4HF\nQoiPPLkgNSRJGgWsMn/4diAnLJUIIVJsxwApQogcsyDfLklSmhBih6vnbjKSpa4cdqt05Bk+Dfxa\ntuHtp/s+Zd62ear74oLiePfKd0ltl9qia7BHfWYmJx9+hIYj6rlj2tgYOr7xBiFD3HPEHth4mnVf\nHMRkVHd0DpuYzKCrWsfRaeHgb7/w+5KvFNu1fn5c+/jThMe0bD/N2l2FiLrGP6aSn4aQQeq+HHsh\niTrdhX0T76mqiQBffPFF7NKlS6Peffdd+11gXMDVd2gWcmr/h5IkLQAWA/OFEMrOs54nGVigUlN9\nPrBDCJEDIITYIUlSDnIjDZerrakJ8zPOz12LQG9TWiEgHNLucvV0zSKE4K3tb7Fw30LV/b2ie/HP\nK/7ZarXHy3/6idPPPIuoVa//EpSWRse33sTPDU3PZBL8/l02fzTh6Bx9Vx+SB7Zu4+HcwwdZ8f7b\nqvuuuu9hOvRo2WQtIQRVKiaWoAGxaILUv/pt2cRyctavLV41MfG1kS1aNRHgnXfeOWYdu+4pXDKz\nCCHmCiHSgSjgSaAbsEaSpGJJkt6TJKklKjXNFEJIQogoW0FuNsEko2wyXYZc9MtljCal1uen1cg1\nWLap3JQMuBkCnGgn5wQmYeKF31+wK8iHJgxl4VULW0WQi4YG8l5+hdzHHrcryKPvvJMunyx0S5A3\n1BpY/v5uu4I8NCqA659Ia3VBXlFUwPfzXlKNXBl2/U30Hnl5i69Bf7IKvUoLvNCL7ceLt2Vh3pps\n2bIleOjQodUZGRlhY8eOdasudHZ2tn9GRkbYM88849Evqlv3Tio1W6YiC/f7zFrxB8CHHmr4nGKu\n4Ahy/9H5VuaTdPNf2yyUEpBt6a6aWuz2xsvdAYUHldvT/+rKaZrFaDLy3Mbn+CH7B9X9o7uM5rWR\nr+Gv9X4hJH1+AacefZTaneoVHjTBwbR/5WXCx4xx6zxt3dFpoaG2how5L6rWJu8x9BKGT7rVK+tQ\n08r9OoXh31Fd2TAYDKrC3Jcs5NmqiZZtK1euDG/V2iy2SJJ0EXATsiCPRK7ZMt/8/wPIgv5GV+qh\nW1ECZAsh5prPORXZHj5aCLHaZpxHESrSXALY+61yR+eLIc7zt84Gk4GnNzzNsiPLVPff1PMmnhzy\nJFqN97MZa3bu5OTDD2MsVA879E9JIfEf7xCQkqK631FyM+WMzroq9YzOHkPjufy21snotMZkNPLT\nP16n8PhRxb745O6MeehvLsfRO7WOGj01u5QZn6FD7afknz59GoOhsVkxODjY1/MTz1VNnDdvXky7\ndu2Md911V2m7du0M3mpOYRdzNMtU5HK4yUA5csnbOTYVE183a9P/BlwW5mat2lqztgjw+chVGy04\nHBZh/kGYCtC5c+emzq3YpsGkLswH3Ozo6R1Gb9Lz5K9PsvLoStX9Dw54kPsH3N8qTr6yJUvIe+FF\nhJ2WbmFjx9D+7y+hDXWv/suBjbms++KQuqNTgmHXtr6jE+TPypqP31dtxhwa3Y6JT7RMqr4a1Vvz\nwSY/QgrSETzAfgDF8eNK01Xnzp1b/bq2Np6smjhs2LCaXr161QPk5OQEPvjgg8pfXBdxOZrF/HcH\nMFkI8U0TY7cA97p4HgAkSVqFXFrX0prcooFbbFeWrh+Nwhc5K9wVXUGEEAuQuymRnp5u15qiRi/9\nAai0SXnW6KC3ZxM/DCYDM9fPZNWxVar7H0t7jCl9p3j0nI4g9HryX32V0i+VURoA6HTEP/E4UXfc\n4ZYgMJkEv3+bxR+rT6ifJkDL6LtSSb6ode3jFrZkLGb36hWK7bqAACY+8Syh0d7RcIXRRNVGpbkk\nJC1eNePTgj1h3law55xsaTxZNXHEiBE1Fu08OTm5zqvNKewwF9lm7Ujd8h3AlS6ex8IoYInV80ZC\n3ByKWIZSM49E/hFQr+jkAGpSPq1+k3JjypUQ7Hq8tC0mYeL5jc/bFeQzB8/kttSWj2W3xVBczKlH\nHqVm2zbV/drYGBLffpvgNPcCDxpqDfz88T6ONZHROf6h/sQktk5Gpy0Hfv0fG/77mXKHJDHu/x4j\nPrmb19ZSu7cIY7lNFJ0EoRfbN7EIIdq8MG8tPFk1ERq3jvMkLglzIcQsJ8Z6olHFEmSTioVR5r/W\nUS2vAnMkSYoUQpSZE4qSkU1BLqNmM7+oXkWQpXpOKxdC8OrmV+06O58e+jQ39/K8Sac5avfu4+S0\naRhUal0DBPbvT+K7/8Av3j0nfXmhXLrWnqMzITmcsff3Jzi8bXS9Ob53Fyvef0d13+V33EP3IcO9\nthYhBJW/KuVNYO926NrZz30oKiqi1iYKSafTXbBlb89FXLWZFwNpQoijKvt+BrYJIZ5yc21nEEJM\nMmd0WgRzMtDI+SmEmGu+pV9sjqRJB+4zm1NcP7eNbh5PCV0MR5UDu41SbnORd3e+y38P/Vd133MX\nP8ekHpM8di5HKf/xRzl+vF7ZdQkg4vrrSXj+OTQB7kWSNOfo7Dk0gT/d1rPVHZ0Wio4f5ft5L2My\nKvMR0sZfy6Bx13p1PQ3HKtCfVIYjho1sOrxQTStPTExE68H+oz5aFlfNLE01JpwPvAZ4TJgDWNnL\nmxozF9kE1GJcqt2t3BjfD8I8U43wk72f8OEe9RKxTw19yuuCXBiNFMx7g5KF6rHtaLXEz5pF1G23\nuu0o2/9bLr982fYdnRYqS4r45rXZNNQqzZ49hl7CZbfd7fU1Valo5X4dQ/FParoCh8/Ecu7jsDCX\nJCmJxgk4V0qSpJbFNJWzNu1zHxu5MlKzRzmmm7suAZnlR5bzxnaVCozAI4Me4ZZet3jkPI5irKri\n1PTpVK9X6WkKaCMj6fj224QMG+rWeUwmwcZvs9h1jjg6Aeqqq/ju1dlUFSvNnx16pjL2/x7zSgii\nNYaSOmr3K30MYSM7NvsD6BPm5z7OaOb3AzPM/wvkNHl7tKh27E1sdcRBmkzlIA90Etqev52nNzyt\nuu+efvdwT7973D6HMzScPMnJBx6gPjNLdX9A794kvvsu/onuZQc21Br4+aN9HNtrx9EZHcD4B9uO\noxNAX19HxtwXVWPJo9p3ZOITz6BrhS72VRtOKT6w2nB/gvo1Xc+poqKC0tLGepkkSSQmJnp6iecs\nGzZsCJ4xY0bHjRs3qggA1+azjmRZuHBhVFRUlGHbtm3BjkbG2OKw6mB2ekYhR4xIwGjkGG/rR5QQ\nQuOMg7StY+0AjaOURMlGE5O0kJiOO+SU5/Dw2odV+3Xe1PMmHh74sFvzO0vNjh0cnTTZriAPHzeW\npC+/cFuQlxfW8s3r2+0K8oTkCCbNGtymBLnRYGDp23M4dXC/Yl9wRCTXP/kCQWFeLyqKsaqB6q15\niu0hwzsgaZv+mufkKCJ3iY+P93UWssKThbYyMjLCbrnlljPWiw0bNgSD3B80MjLSaHnuLE7dBwoh\nys1hfkuArUKIIzYPlW7G5w8D1bTy+D5uNWsuqSvhwdUPUtGgrHgwqvMonhzypFdtxOXff8/xO6dg\nLFWxoEkSsY9Np8Mbb6AJcq8qZG5mKUtes1+6tuewBCb+bWCbiVgBECYTP3/wjmpSkC4ggOtmPEdk\nfOt0cqrakIvQ2yQJ+WsIHdL8eo6oVLdMTj5/LKWewJOFtiZOnFjZqVOnM5EEX3zxRVRUVJQBoFu3\nbvUrVqxwSXtxNTRxsivHnYtYR7Oomlg6uV7GVW/S8/gvj3OqSum06h/bn1dHvuq1FH1hMsn9OefP\nV90vBQfTcd7rhF3hvkmpOUfnxRNTGPjntpV5KIRg3ecfsf9XZWFQjVbHtY89TUK3Hq2wMjDVGqj6\nXdm3M2RYezTBfk0eK4RQ1cy7du3qsfV5itmzZ7d41cTZs2erJiZt2bIleNq0aYUZGRlh8+fPj12+\nfLnyorlIeXm5zrreS3FxsUtyudmDzKGGVwghdFbbTDRRgwr+v73zjpOquhf498z2XbawDVh2WVia\n4tIxIIoiRTGWJFI05fmejTUmJpoYjOUlmqJioqkaUfLMS3mKYIux0KJSrIBIlbKAwMLCdrbvzNzz\n/rh3YHbunZ26uzPD+X4+wzLn3HJu+83v/n6/8/sh3ZePZtzNLKOFRch8YfClzp7Y9ASfVJq1vKL0\nIv4w4w8kx/fMa67W0sKxH99L46pVlv3xAwZQ9KenSD7nnND2o0nef2k/n6317ui87KZRDBkbOY5O\nFx+/upwtb75m7hCCL9/xQwaPDbkOStA0fXAM6VkRK16QfpFvm3dNTQ2NjZ1Tg9hsNoqLi8M5xKgn\nnIm2ugt/BO4azNkIf0XXwjxmcD/IEbaj5gUGjAtqu6+Xv87fd//d1J6ZlMlTM58iOzl8s0m7wn7i\nJEdvv522nTst+5PHjqHoj38kPi80Aeufo3MsuRalzHqbz1a/ZT27E5h187cZecG0Hh7RGbQOJ00b\nLabuT+pPnB8mKiutvLCwkMRecOBGMuFKtGVFZmamo7q6Og6grq4uPicnxzxpwQ98CnNXpkKPNs/C\nEDFPDg3kCg+TWVwi5ASeDXBXzS4e+uAhU7tN2Pj1Jb9mcObgIEcZGG179nKkrAxHpdlxBpBx5ZUM\n+OUvsIXoCGuo0lPX1h33NqMzkytuGx1R9nEXuze8y5o/P2XZd+F1/8HY2V/u4RF1pvnjSrRmj2ff\nBukX+xeJouzlvglnoi0rvvnNb9Z9+OGHqUBjeXl54pw5c4LKohgTppDuxJU10VIrzx0BcV3bJD1p\n6mji7vfupt1pnkn5g4k/YMqAKUGNM1CaP/iAo3d8D63JPFsQIPeO75J7++0h260r9tbx9pIdtDV7\nmdE5pT+XfvMc4hJ6NibbH/Z+tJG3nnzCMqfDhCuuYfLXetd1JO1OGt8z35ep4/KJz/b9A6xpmhLm\nfhDORFughyHu2LEj7bnnnut744031l100UUtH374Yeqrr76anpWV5Qw2+VZIwryrws5hKkjR67ge\n4xHCQpgHmLtcSskvPvoFRxrNNuMvD/kyN4y6IYgRBk7Da69x7IH/BovUtSIpiYJHHibjy6FrnLs2\nGI5Oi2pNCLjga0MZPzuyHJ0uyjd/zBu/ewypaaa+c6ddyvQbbun1cTd9cByt0ZxQK316kV/rHz9+\nnLa2zsXAExMTI7aykDfnZHcT7kRbN954Y51n2Ti35FtB5zYPNjfLePT85V39hMdGUgdDDg0SJ819\nuYFFL/yz/J+8ceANU/vIviN5cOqD3S4cpJTULFlC1W+tk0LF5eZS9NSTpIwZE9J+NE3y/or9fPZv\na0dnQlIcsyPU0Qlw6LMtvP7Ew2hOp6mvZML5XH7b93t8dqcnWruDxvfM5zelNJeEfP/ClPfvN88j\nKC4uVvlYopRgNfNngRx0R2h5+IYTuRRZCfO+g/1e/1DDIX750S9N7anxqTw+/XFS4kOL2/aFtNup\n/NnPqF++wrI/saSEomeWkBjirL/2Vgerlu7g8E7rok/p2cl8+fYxEenoBDiyazuv/fqXOB1mH1Tx\nmPFcfde9xEVApfqmjcfMtnIBGbP9j0LZt88caqtMLNFLsHflBGChlHJpOAcTibjizE0zPwGy/Mtd\n4dAc3LfhPlod5kLHD0x5gOKM7g0DczY1U3HXXTSvt86xkjJpIkV//CNxWZ61PQKjoaqFN57cRl2l\ntclvwNBM5pRFpqMToGLPbl559CEcHWZ/RuGoUr5y9/29Mk3fE63FTuM6C1v5+Hy/tfLm5maOHjVv\nY8SI3omVV4ROsMJ8Dd1QbzMScfm+CoVFdacs/4Tw33b9je3V5gRdV5dczdVDrw5leD5xVFdzeOFC\n2nfttuzP+PIVDHjkkZBT11bsreOtJdtp99QWDc6Z0p/pEeroBKjcv5eXH/kp9vY2U1/BiHP52j0/\n7bGSb75oXF+BbPMwAdkEGTP9T4xVXm5+oc7Ozo7Uep+apmnCZrOdFeHQ3tA0TQBmJ45BsML8HuBF\nIYQE1saKs9MKKSGDZjKEh7YZlwh9fBdhONBwgD9++kdT+6D0Qdw/xTqxVrjoOHKEwzffgt0iIx5A\nzi03k/eDH4Rs/925voJ1z++NSkcnwLG9n/PSwz+xTGXbr2Q41977IInJ3WsG8xdnY4eXuPJ+XRaf\n8GTv3r2mtuHDh4c0tm5kR1VV1ai8vLyGs1Wga5omqqqqMoEd3pYJVpivRS/JtgKwekhjZgYoeNHK\nM4vAhxB0ak5+svEndGidIw4Egl9e9EvSEkIrdNwVbXv2cPiWW3BWWZiHbDb63X8f2d/8Zkj70Jwa\n779U3rWj8+bzGDKm66x9vUnF57t4+dGf0tFqNoHlFQ9h7v0/Iym1+65ToJxa9QWyw0M5ixekB6CV\na5pm6fyMVGHucDhuqaysXFpZWVlKgPmkYggN2OFwOLymTw3FAXpW/EJKIE9Y5A/LKPC57rI9y/is\n6jNT+7dGfYtx+cHNHPWHls2bOXLbt9EazVFOIjmZgU88HnKOFZ+Ozpxkrrx9DDkDI9PRCXB01w5e\nfvRBS9NKTuEg5j3wC1L6RE7GRntlM82bzBO8+kweQHym/2ayo0ePmkISExISGDx4cKhD7BYmTpx4\nEghvtfQYJNhEW2fNDFApJTlYCPM++V2uV9Na49W8csf4O8I1PBON77xDxZ13WZZ3i8vMpOiZJaSM\nHRvSPqLd0Ql63c5XHvsZDovzlFM4iPn//UtSMzJ7YWTeqX/jgEmFEsnxpM8IrIjE7t1m/0lJSQnx\nERClowgedfV8IIEcz2n8AGldx0j/bsvvaLSbNeOHpj7UbWGI9a++yvH7HwCL+Oj4/v0Z9OelJA0N\nPP2AOxV76njrmS4cnRf0Z/o3ItfRCXBo26e89tjPcdjN6alzi4p1QZ4ZWmRPuGnbU0v7Ps8USZAx\no4i4NP9nIUspLYW5imKJfvzJmrgSWCWlfNytbZmP1aSUsufLx3cT1sLcux14W9U2Xtn/iqn92uHX\nMql/aIUsvFHzl79w8tHFln2JQ4Yw6M9LSSjwbRrqCl+OzqlfG8a42UUR6+gEOPDpJ/zz8YdxWsx+\nzSsewrwHfhFxGrl0SurfNE+7j8tOps/UwK5pZWUl9fWdfxSEEJwTYkZMRe/jj2b+JcAztdokfKTA\nDXpEEYaUmBNsAaRaC3NNajz80cOm9vTEdL4/4fvhHh5SSqqfeorqP5hNOgDJo0dT9MwS4vt2VYO7\nazSnxsaX9rPt3xYpDdAdnZfdfB6DI9jRCbB743u8/eQTljM784cMjTgbuYvmj47jOGE2aWXOGYyI\nD+wNyEorLy4uJi0tcpy8iuDwJ2uiSQpIKUN7V48qJNn4r5mvOrSKnTXmdLJ3jL8j7GltpZRUPfEb\nap61LseaNvUCBv7+D8T1Cf5BbW91sOrZHRzeFb2OToDPVr/Jmj//yTJpVv+hw5l7389J7hN5x+Bs\n7KBh1SFTe2Jxhs/anlZYCfNzzw0sx5AiMvH5sy6EWCaEGGfR1vOFDnsBKaGPMIetkWLWdO2anT9u\nNWvII/uOZP6I+WEel+TEw494FeTpc+ZQ+PTTIQny+pMtvLR4k1dBPmBYJvN/PCniBflHry5nzdKn\nLAX5gOEjmffALyJSkAM0vHnQPEEIyLxySMDmrKqqKqqqzGG2SpjHBv68o83HbDaZj17Y+awgDXPo\nmlXdz1f3v8oXp74wtd99/t3E28Lna5aaRuVPfkrd3/5m2Z+1YAEDH/81thCmnh/dU8eKxZu8Rqyc\nM3UAX7lzPCnpkRuxIqVk3T+eY8Pz/2vZX3TeGObd//OIiiN3p/1APS2fmnMCpU7qR9KgwHWpHTvM\n800KCwvJyDgr9LKYxx8J8xKwQgixAnAvE7NICOGtDp50d5hGMxJIwRy+RmJnTa7N0cbTW582LTZl\nwJSw5iiXDgfH77+fhtf+adnf94b/oN+9oRWB3rGugvUvdOHovHYY42ZFtqNT05ysWfoU29eutOwf\nOmkyV33/nojItWKFdGrUvWqecm9LjSfzisDrc0op2b7dnFJCaeWxgz828/lCiMXo2rh7SrXbuloN\niA1hLiFN+NbMX9r3EidbzVpUOJ2e0m6n4keLaHz7bcv+nIULybvrzqCFrObU2LhiP9ve8eLoTDYc\nnUHYansSe0c7b/7+1+z/5APL/nOnXcrlt30/IrIfeqNxfQWOk+a3oow5gwMKRXRRUVFBba3ZXFZa\nWhrU+BSRh193szFJ6KyZKOSORJJqqZmfEeZ2zc5fd5prRM4unk1pbngeFmm3U/HDu70WXc77/vfI\n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\nHguPtiMAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "from matplotlib import rc\n", - "\n", - "font = {'weight' : 'bold'}\n", - "rc('font', **font) # pass in the font dict as kwargs\n", - "# hfont = {'fontname':'Helvetica'}\n", - "hfont = {}\n", - "\n", - "rc('text', usetex=True)\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "\n", - "m = 1\n", - "n = 100\n", - "dm = 8\n", - "def Af(d, dm, m, n, k): return(m + d**k * (n - m)/dm**k)\n", - "ks = [0.1, 0.2, 0.4, 0.7, 1, 2, 5, 10]\n", - "#ks = [2]\n", - "for i in ks:\n", - " t = np.arange(0, dm, 0.01)\n", - " s = Af(t, dm, m, n, i)\n", - " ax.plot(t, s, lw=5, label=r'$k = {}$'.format(i))\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "box.y0 = 0.17\n", - "box.x0 = 0.17\n", - "ax.set_position([box.x0, box.y0, box.width * 0.7, box.height*0.9])\n", - "\n", - "plt.tick_params(axis='both', which='both', labelsize=16)\n", - "\n", - "tick_locs = [0, 2, 4, 6, 8]\n", - "plt.xticks(tick_locs, [r\"$\\mathbf{%s}$\" % x for x in tick_locs])\n", - "\n", - "tick_locs = [0, 25, 50, 75, 100]\n", - "plt.yticks(tick_locs, [r\"$\\mathbf{%s}$\" % x for x in tick_locs]) \n", - "\n", - "plt.ylabel(r'Affinity (nM)', fontsize=20,**hfont)\n", - "plt.xlabel(r'Hamming distance from mature', fontsize=20,**hfont)\n", - "plt.title(r'Hamming distance to affinity', fontsize=20,**hfont)\n", - "\n", - "fig.savefig('hd2affy.pdf')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n/wcxKgzIHrVzLAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "from matplotlib import rc\n", - "\n", - "font = {'weight' : 'bold'}\n", - "rc('font', **font) # pass in the font dict as kwargs\n", - "# hfont = {'fontname':'Helvetica'}\n", - "hfont = {}\n", - "\n", - "rc('text', usetex=True)\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "\n", - "m = 1\n", - "n = 100\n", - "dm = 8\n", - "def Af(d, dm, m, n, k): return(m + d**k * (n - m)/dm**k)\n", - "ks = [0.1, 0.2, 0.4, 1, 2, 5, 10]\n", - "#ks = [2]\n", - "for i in ks:\n", - " t = np.arange(0, dm, 0.01)\n", - " s = Af(t, dm, m, n, i)\n", - " ax.plot(t, s, lw=3, label=r'$k = {}$'.format(i))\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "box.y0 = 0.17\n", - "box.x0 = 0.17\n", - "ax.set_position([box.x0, box.y0, box.width * 0.7, box.height*0.9])\n", - "\n", - "plt.tick_params(axis='both', which='both', labelsize=16)\n", - "\n", - "tick_locs = [0, 2, 4, 6, 8]\n", - "plt.xticks(tick_locs, [r\"$%s$\" % x for x in tick_locs])\n", - "\n", - "tick_locs = [0, 25, 50, 75, 100]\n", - "plt.yticks(tick_locs, [r\"$%s$\" % x for x in tick_locs]) \n", - "\n", - "plt.ylabel(r'Affinity (nM)', fontsize=14)\n", - "plt.xlabel(r'Hamming distance from mature', fontsize=14)\n", - "plt.title(r'Hamming distance to affinity', fontsize=14)\n", - "fig.savefig('hd2affy.pdf')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def A_total_fun(A, B_total, Kd_n): return(A + np.sum(B_total/(1+Kd_n/A)))\n", - "\n", - "def C_A(A, A_total, f_full): return(2 * (A_total - A) / f_full)\n", - "\n", - "def A_obj(carry_cap, B_total, f_full, Kd_n):\n", - " def objA(A): return((carry_cap - C_A(A, A_total_fun(A, B_total, Kd_n), f_full))**2)\n", - " return(objA)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "mature_affy = 0.1\n", - "carry_cap = 1000\n", - "B_total = 1\n", - "f_full = B_total\n", - "Kd_n = np.array([mature_affy] * carry_cap)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def find_A_total(carry_cap, B_total, f_full, Kd_n):\n", - " obj = A_obj(carry_cap, B_total, f_full, Kd_n)\n", - " obj_min = minimize(obj, 1e-20, bounds=[[1e-20, carry_cap]], method='L-BFGS-B', tol=1e-20)\n", - " A = obj_min.x[0]\n", - " A_total = A_total_fun(A, B_total, Kd_n)\n", - " assert(C_A(A, A_total, f_full) > carry_cap * 99/100)\n", - " return(A_total)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide\n", - " if __name__ == '__main__':\n" - ] - }, - { - "data": { - "text/plain": [ - "500.09998749500193" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "find_A_total(carry_cap, B_total, f_full, Kd_n)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '../selection.runstats.p'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'../selection.runstats.p'\u001b[0m \u001b[0;31m# The runstats file from a simulation with selection\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rb'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfh\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mrunstats\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'bytes'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../selection.runstats.p'" - ] - } - ], - "source": [ - "f = '../selection.runstats.p' # The runstats file from a simulation with selection\n", - "with open(f, 'rb') as fh:\n", - " runstats = pickle.load(fh, encoding='bytes')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 784, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "pop_size = np.array([sum(r[0]) for r in runstats])" - ] - }, - { - "cell_type": "code", - "execution_count": 758, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def make_bounds(runstats):\n", - " all_counts = runstats[0][0].copy()\n", - " for l in runstats:\n", - " all_counts += l[0]\n", - " i = None\n", - " ii = None\n", - " for j, c in enumerate(all_counts):\n", - " if i is None and c > 0:\n", - " i = j\n", - " elif c > 0:\n", - " ii = j\n", - " return(i, ii)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 789, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "fig = plt.figure()\n", - "ax = plt.subplot(111)\n", - "#fig_size = [0,0]\n", - "#fig_size[0] = 12*1.6\n", - "#fig_size[1] = 9*1.3\n", - "#plt.rcParams[\"figure.figsize\"] = fig_size\n", - "t = np.array(list(range(len(pz))))\n", - "ax.plot(t, pop_size, lw=2, label='All cells')\n", - "\n", - "bounds = make_bounds(runstats)\n", - "for k in list(range(*bounds)):\n", - " ax.plot(t, np.array([r[0][k] for r in runstats]), lw=2, label='Dist {}'.format(k))\n", - "\n", - "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)\n", - "\n", - "# Shrink current axis by 20%\n", - "box = ax.get_position()\n", - "ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", - "\n", - "plt.ylabel('Count')\n", - "plt.xlabel('GC generation')\n", - "plt.title('Cell count as function of GC generation')\n", - "fig.savefig('test.svg')" - ] - }, - { - "cell_type": "code", - "execution_count": 768, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 768, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "plt" - ] - }, - { - "cell_type": "code", - "execution_count": 767, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure()\n", - "fig.savefig('test.png')" - ] - }, - { - "cell_type": "code", - "execution_count": 765, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 1224\n", - "-rw-r--r--@ 1 krdav staff 203940 Feb 16 14:46 gctree_notebook.ipynb\n", - "-rw-r--r--@ 1 krdav staff 32352 Mar 16 17:28 Tcell_help_solver.ipynb\n", - "-rw-r--r--@ 1 krdav staff 381000 Mar 21 12:05 affinity_solver.ipynb\n", - "-rw-r--r--@ 1 krdav staff 609 Mar 21 12:06 test.svg\n" - ] - } - ], - "source": [ - "%%bash\n", - "ls -rtl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 694, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib.collections import LineCollection" - ] - }, - { - "cell_type": "code", - "execution_count": 695, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def plot_LineSegements(x,\n", - " ys,\n", - " ylim=[0.0,1.0], \n", - " label_str='',\n", - " linewidth=2.0,\n", - " linestyle='solid',\n", - " cm='copper',\n", - " outOS=None):\n", - "\n", - " fig_size = [0,0]\n", - " fig_size[0] = 12*1.3\n", - " fig_size[1] = 9*1.3\n", - " plt.rcParams[\"figure.figsize\"] = fig_size\n", - " # set the plot limits, they will not autoscale\n", - " ax = plt.axes()\n", - " ax.set_xlim((x.min(),x.max()))\n", - " ax.set_ylim(ylim)\n", - "\n", - " # colors is sequence of rgba tuples\n", - " # linestyle is a string or dash tuple. Legal string values are\n", - " # solid|dashed|dashdot|dotted. The dash tuple is (offset, onoffseq)\n", - " # where onoffseq is an even length tuple of on and off ink in points.\n", - " # If linestyle is omitted, 'solid' is used\n", - " # See matplotlib.collections.LineCollection for more information\n", - " line_segments = LineCollection([list(zip(x, y)) for y in ys], # Make a sequence of x,y pairs\n", - " linewidths = linewidth,\n", - " linestyles = linestyle,\n", - " cmap=plt.get_cmap(cm))\n", - " line_segments.set_array(np.arange(np.array(ys).shape[0]))\n", - " ax.add_collection(line_segments)\n", - " fig = plt.gcf()\n", - " axcb = fig.colorbar(line_segments)\n", - " axcb.set_label(label_str)\n", - " ax.yaxis.grid(color='gray', linestyle='dashed')\n", - " ax.xaxis.grid(color='gray', linestyle='dashed')\n", - " ax.set_title('Distribution of smallest hamming distances at different generations')\n", - " plt.ylabel('Count')\n", - " plt.xlabel('Hamming distance')\n", - " ax.set_axisbelow(True)\n", - " plt.sci(line_segments) # This allows interactive changing of the colormap.\n", - " if outOS == None:\n", - " plt.show()\n", - " else:\n", - " plt.savefig(outOS)\n", - " plt.clf()" - ] - }, - { - "cell_type": "code", - "execution_count": 761, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n28MAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_LineSegements(runstats[0][1][:-1], [r[0] for r in runstats], ylim=[0, 1100],\n", - " label_str='GC generation', linewidth=2.0, linestyle='solid', cm='copper_r', outOS=None)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.0" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From 7a9f5fb839060b7725b671580bc72a1288b20e70 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 12:14:13 -0700 Subject: [PATCH 16/32] rm jellyfish dependency --- gctree/utils.py | 22 +++++----------------- setup.py | 3 +-- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/gctree/utils.py b/gctree/utils.py index 8602dc61..a2e7182f 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -1,22 +1,10 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -try: - import jellyfish +def hamming_distance(seq1, seq2): + """Hamming distance between two sequences of equal length.""" - def hamming_distance(s1, s2): - if s1 == s2: - return 0 - else: - return jellyfish.hamming_distance(s1, s2) + if len(seq1) != len(seq2): + raise ValueError(f'sequences must have equal length, got {len(seq1)} and {len(seq2)}') - -except: - - def hamming_distance(seq1, seq2): - """Hamming distance between two sequences of equal length.""" - return sum(x != y for x, y in zip(seq1, seq2)) - - print( - 'Couldn\'t find the python module "jellyfish" which is used for fast string comparison. Falling back to pure python function.' - ) + return sum(x != y for x, y in zip(seq1, seq2)) diff --git a/setup.py b/setup.py index 91a68a2d..ad97962b 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ packages=['gctree'], classifiers=[ "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", + "License :: OSI Approved :: GPL", "Operating System :: OS Independent", ], python_requires=">=3.7", @@ -34,6 +34,5 @@ "pandas", "scipy", "seaborn", - "jellyfish", ], ) From 59d65ccabd6af14c36007b40c2df5e865bfcad38 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 13:40:13 -0700 Subject: [PATCH 17/32] a makefile and some tidying --- .github/workflows/build-and-test.yml | 42 ++++++++++++++++++++++++++++ .gitignore | 1 + Makefile | 29 +++++++++++++++++++ gctree/branching_processes.py | 1 - 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build-and-test.yml create mode 100644 Makefile diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 00000000..a035d26a --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,42 @@ +name: build and test + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + if: "!contains(github.event.commits[0].message, '[skip ci]')" + runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + python-version: [3.7] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install + run: | + python -m pip install --upgrade pip + make install + - name: Test + run: | + make test + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Lint with pylint + run: | + pylint -d E1101 **/[^_]*.py + - name: Check format with black + run: | + black --check torchdms diff --git a/.gitignore b/.gitignore index 4b12d645..0186cbbb 100755 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # example output dir test +gctree.out* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..c34ae7e1 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +default: + +install: + pip install -r requirements.txt + pip install -e . + +test: + # pytest + gctree test + +format: + black gctree + docformatter --in-place gctree/*.py + +lint: + pylint **/[^_]*.py && echo "LINTING PASS" + +docs: + make -C docs html + +deploy: + make docs + git checkout gh-pages + cp -a docs/_build/html/* . + git add . + git commit --amend -av -m "update docs" + git push -f + +.PHONY: install test format lint deploy docs diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index 20dc51f6..c7a5a56a 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -164,7 +164,6 @@ def build_logf_cache(c_max, m_max, *params): """build up the lru_cache from the bottom to avoid recursion depth issues.""" LeavesAndClades.logf.cache_clear() - print(f"building likelihood cache for parameters {params}") for c in range(c_max + 1): for m in range(m_max + 1): LeavesAndClades.logf(c, m, *params) From 199402fa9c8d81d490053c22df29fffb771fc15a Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 13:40:55 -0700 Subject: [PATCH 18/32] make format --- gctree/cli.py | 5 ++--- gctree/utils.py | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gctree/cli.py b/gctree/cli.py index d6b953ad..2e28b729 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -348,9 +348,8 @@ def infer(args): def simulate(args): """Simulation subprogram. - Simulates a Galton–Watson process, - with mutation probabilities according to a user defined motif model - e.g. S5F + Simulates a Galton–Watson process, with mutation probabilities + according to a user defined motif model e.g. S5F """ random.seed(a=args.seed) mutation_model = mm.MutationModel(args.mutability, args.substitution) diff --git a/gctree/utils.py b/gctree/utils.py index a2e7182f..0aa49974 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -1,10 +1,13 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- + def hamming_distance(seq1, seq2): """Hamming distance between two sequences of equal length.""" if len(seq1) != len(seq2): - raise ValueError(f'sequences must have equal length, got {len(seq1)} and {len(seq2)}') + raise ValueError( + f"sequences must have equal length, got {len(seq1)} and {len(seq2)}" + ) return sum(x != y for x, y in zip(seq1, seq2)) From fd322696941978c547e5f03c10b4ff43e4d6894b Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 15:46:14 -0700 Subject: [PATCH 19/32] linting fixes --- .github/workflows/build-and-test.yml | 16 +++++++--------- Makefile | 5 ++++- gctree/branching_processes.py | 21 ++++++--------------- gctree/deduplicate.py | 5 ++--- gctree/mkconfig.py | 4 ++-- gctree/mutation_model.py | 3 --- gctree/phylip_parse.py | 27 +++++++++++++++------------ requirements.txt | 1 - setup.cfg | 5 +++-- 9 files changed, 39 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a035d26a..ca5904d4 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -21,22 +21,20 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} + - name: Install run: | python -m pip install --upgrade pip make install + - name: Test run: | make test - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Lint with pylint + + - name: Lint run: | - pylint -d E1101 **/[^_]*.py + make lint + - name: Check format with black run: | - black --check torchdms + black --check gctree diff --git a/Makefile b/Makefile index c34ae7e1..cb2ac84d 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,10 @@ format: docformatter --in-place gctree/*.py lint: - pylint **/[^_]*.py && echo "LINTING PASS" + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --max-complexity=30 --max-line-length=127 --statistics docs: make -C docs html diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index c7a5a56a..26cf773d 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -630,21 +630,12 @@ def compare(self, tree2, method="identity"): child = ete3.TreeNode() child.add_feature("sequence", node.sequence) node.add_child(child) - try: - return tree1_copy.robinson_foulds( - tree2_copy, - attr_t1="sequence", - attr_t2="sequence", - unrooted_trees=True, - )[0] - except: - return tree1_copy.robinson_foulds( - tree2_copy, - attr_t1="sequence", - attr_t2="sequence", - unrooted_trees=True, - allow_dup=True, - )[0] + return tree1_copy.robinson_foulds( + tree2_copy, + attr_t1="sequence", + attr_t2="sequence", + unrooted_trees=True, + )[0] else: raise ValueError("invalid distance method: " + method) diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index 4e76fd6a..e61b15df 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -10,7 +10,6 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False): - # naive = naive.lower() if aln_file.endswith("fasta") or aln_file.endswith("fa"): aln_format = "fasta" elif aln_file.endswith("phylip") or aln_file.endswith("phy"): @@ -102,7 +101,7 @@ def check_header(header): raise Exception( "Sequence headers must be distinguishable from an integer. Please add a non number character." ) - except: + except ValueError: pass @@ -184,7 +183,7 @@ def main(): ) if ( len(colors_counts) == 1 - and colors_counts[0][0] != None + and colors_counts[0][0] is not None and colors_counts != [] ): colors_str = colors_counts[0][0] diff --git a/gctree/mkconfig.py b/gctree/mkconfig.py index 6044f439..de0f63ad 100755 --- a/gctree/mkconfig.py +++ b/gctree/mkconfig.py @@ -41,9 +41,9 @@ Y to accept these or type the letter for one to change ____________ """ -import re, os, random +import os +import random import argparse -from warnings import warn def main(): diff --git a/gctree/mutation_model.py b/gctree/mutation_model.py index 7b68a999..c42d3377 100644 --- a/gctree/mutation_model.py +++ b/gctree/mutation_model.py @@ -273,8 +273,6 @@ def simulate( t = 0 # <-- time leaves_unterminated = 1 - # Small lambdas are causing problems so make a minimum: - lambda_min = 10e-10 while ( leaves_unterminated > 0 and (leaves_unterminated < N if N is not None else True) @@ -282,7 +280,6 @@ def simulate( ): if verbose: print("At time:", t) - skip_lambda_n = 0 # At every new round reset the all the lambdas t += 1 list_of_leaves = list(tree.iter_leaves()) random.shuffle(list_of_leaves) diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index a886887a..470f36f0 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -7,7 +7,6 @@ import gctree.phylip_parse as pp import gctree.branching_processes as bp - from gctree.utils import hamming_distance from ete3 import Tree @@ -16,13 +15,18 @@ from collections import defaultdict from Bio.Data.IUPACData import ambiguous_dna_values +import pickle +import argparse +import os + + # iterate over recognized sections in the phylip output file. def sections(fh): patterns = { - "parents": "\s+between\s+and\s+length", - ("sequences", "dnaml"): "\s*node\s+reconstructed\s+sequence", - ("sequences", "dnapars"): "from\s+to\s+any steps", - "seqboot_dataset": "Data\s*set", + "parents": r"\s+between\s+and\s+length", + ("sequences", "dnaml"): r"\s*node\s+reconstructed\s+sequence", + ("sequences", "dnapars"): r"from\s+to\s+any steps", + "seqboot_dataset": r"Data\s*set", } patterns = {k: re.compile(v, re.IGNORECASE) for (k, v) in patterns.items()} for line in fh: @@ -36,7 +40,7 @@ def sections(fh): def iter_edges(fh): # 152 >naive2 0.01208 ( zero, 0.02525) ** pat = re.compile( - "\s*(?P\w+)\s+(?P[\w>_.-]+)\s+(?P\d+\.\d+)" + r"\s*(?P\w+)\s+(?P[\w>_.-]+)\s+(?P\d+\.\d+)" ) # drop the header underline fh.readline() @@ -59,10 +63,10 @@ def parse_seqdict(fh, mode="dnaml"): # 152 sssssssssG AGGTGCAGCT GTTGGAGTCT GGGGGAGGCT TGGTACAGCC TGGGGGGTCC seqs = defaultdict(str) if mode == "dnaml": - patterns = re.compile("^\s*(?P[a-zA-Z0-9>_.-]*)\s+(?P[a-zA-Z \-]+)") + patterns = re.compile(r"^\s*(?P[a-zA-Z0-9>_.-]*)\s+(?P[a-zA-Z \-]+)") elif mode == "dnapars": patterns = re.compile( - "^\s*\S+\s+(?P[a-zA-Z0-9>_.-]*)\s+(yes\s+|no\s+|maybe\s+)?(?P[a-zA-Z \-\?]+)" + r"^\s*\S+\s+(?P[a-zA-Z0-9>_.-]*)\s+(yes\s+|no\s+|maybe\s+)?(?P[a-zA-Z \-\?]+)" ) else: raise ValueError("invalid mode " + mode) @@ -89,7 +93,9 @@ def parse_seqdict(fh, mode="dnaml"): def parse_outfile(outfile, countfile=None, naive="naive"): """parse phylip outfile.""" if countfile is not None: - counts = {l.split(",")[0]: int(l.split(",")[1]) for l in open(countfile)} + counts = { + line.split(",")[0]: int(line.split(",")[1]) for line in open(countfile) + } # No count, just make an empty count dictionary: else: counts = None @@ -192,9 +198,6 @@ def build_tree(sequences, parents, counts=None, naive="naive"): def main(): - - import pickle, argparse, os - def existing_file(fname): """Argparse type for an existing file.""" if not os.path.isfile(fname): diff --git a/requirements.txt b/requirements.txt index 042cb45c..37ded86c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ black docformatter flake8 -pylint pytest diff --git a/setup.cfg b/setup.cfg index 94243911..3e3853be 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,5 +5,6 @@ versionfile_build = gctree/_version.py tag_prefix = [flake8] -exclude = gctree/_version.py, - versioneer.py, +exclude = gctree/_version.py, versioneer.py, scripts/*, site_scons/sconsutils.py +# These aren't relevant because we are formatting with Black +ignore = E203, E231, E266, E501, W503 From 2bbc097ac08601ab0e7865d26cdf7258ffa4b55c Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 20:08:57 -0700 Subject: [PATCH 20/32] docs! --- .gitignore | 3 + README.md | 10 +- SConscript.simulation | 2 +- docs/Makefile | 27 ++++++ docs/make.bat | 39 ++++++++ docs/source/_static/logo.png | Bin 0 -> 355647 bytes docs/source/_static/style.css | 5 + .../_templates/custom-class-template.rst | 34 +++++++ .../_templates/custom-module-template.rst | 66 +++++++++++++ docs/source/api.rst | 14 +++ docs/source/cite.rst | 24 +++++ docs/source/cli.rst | 47 +++++++++ docs/source/conf.py | 89 ++++++++++++++++++ docs/source/developer.rst | 37 ++++++++ docs/source/index.rst | 44 +++++++++ docs/source/install.rst | 16 ++++ gctree/branching_processes.py | 2 +- gctree/cli.py | 8 +- gctree/deduplicate.py | 12 +-- gctree/mkconfig.py | 41 ++------ gctree/phylip_parse.py | 17 ++-- gctree/utils.py | 2 + notebooks/runtime_experiment.ipynb | 16 ++-- requirements.txt | 5 + scripts/consensus.py | 2 +- scripts/heavy_light_compare.py | 4 +- scripts/plot_tree.py | 10 +- 27 files changed, 498 insertions(+), 78 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/_static/logo.png create mode 100644 docs/source/_static/style.css create mode 100644 docs/source/_templates/custom-class-template.rst create mode 100644 docs/source/_templates/custom-module-template.rst create mode 100644 docs/source/api.rst create mode 100644 docs/source/cite.rst create mode 100644 docs/source/cli.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/developer.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/install.rst diff --git a/.gitignore b/.gitignore index 0186cbbb..c23aa93b 100755 --- a/.gitignore +++ b/.gitignore @@ -117,3 +117,6 @@ venv.bak/ # scons .sconsign.dblite + +# sphinx autodoc +docs/source/stubs diff --git a/README.md b/README.md index 90cdbc98..b6b88cb5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GCtree +# gctree Implements phylogenetic inference for data with repeated sequences, as described in: @@ -59,7 +59,7 @@ All commands should be issued from within the gctree repo directory. - `dnapars/`: directory of parsimony tree output from PHYLIP's dnapars - `gctree.inference.*.svg`: rendered tree images for each of the parsimony trees - `gctree.inference.abundance_rank.pdf`: histogram of genotype abundances - - `gctree.inference.likelihood_rank.pdf`: rank plot of GCtree likelihoods for the parsimony trees + - `gctree.inference.likelihood_rank.pdf`: rank plot of gctree likelihoods for the parsimony trees - `gctree.inference.log`: log file containing parameter fits, numerical likelihood results, and any other program messages - `gctree.inference.parsimony_forest.p`: a python pickle file containing the parsimony trees as `CollapsedTree` objects @@ -71,7 +71,7 @@ scons --simulate --outdir= --N= --N= --N=.ipynb + +# Convert .py to .ipynb (don't seem to need to --execute? perhaps sphinx-build does it...), then build html: +%: Makefile + rm -rf build + rm -rf source/_autosummary + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..ac4b95dd --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,39 @@ +REM Copyright (C) PROWLER.io 2020 - All Rights Reserved +REM Unauthorised copying of this file, via any medium is strictly prohibited +REM Proprietary and confidential + +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/logo.png b/docs/source/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aa47fc92c7acfd290522a77a1ebc0b4ebe07fc74 GIT binary patch literal 355647 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�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

Y7{ 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

E5LTT8N{mm=ySiacl@I%J(yzjoCKuj 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

oB|XKN_Mv>vu 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

Z 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/style.css b/docs/source/_static/style.css new file mode 100644 index 00000000..6ebfb42f --- /dev/null +++ b/docs/source/_static/style.css @@ -0,0 +1,5 @@ +@import url("theme.css"); + +.wy-side-nav-search { + background-color: #fff; +} diff --git a/docs/source/_templates/custom-class-template.rst b/docs/source/_templates/custom-class-template.rst new file mode 100644 index 00000000..f73eda50 --- /dev/null +++ b/docs/source/_templates/custom-class-template.rst @@ -0,0 +1,34 @@ +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :show-inheritance: + :inherited-members: + :special-members: __call__, __add__, __mul__ + + {% block methods %} + {% if methods %} + .. rubric:: {{ _('Methods') }} + + .. autosummary:: + :nosignatures: + {% for item in methods %} + {%- if not item.startswith('_') %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} diff --git a/docs/source/_templates/custom-module-template.rst b/docs/source/_templates/custom-module-template.rst new file mode 100644 index 00000000..d066d0e4 --- /dev/null +++ b/docs/source/_templates/custom-module-template.rst @@ -0,0 +1,66 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block attributes %} + {% if attributes %} + .. rubric:: Module attributes + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block functions %} + {% if functions %} + .. rubric:: {{ _('Functions') }} + + .. autosummary:: + :toctree: + :nosignatures: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block classes %} + {% if classes %} + .. rubric:: {{ _('Classes') }} + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + :nosignatures: + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block exceptions %} + {% if exceptions %} + .. rubric:: {{ _('Exceptions') }} + + .. autosummary:: + :toctree: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + +{% block modules %} +{% if modules %} +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 00000000..5714c79d --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,14 @@ +.. currentmodule:: gctree + +Python API for the ``gctree`` package + +Modules +---------- + +.. autosummary:: + :toctree: stubs + :template: custom-module-template.rst + + branching_processes + mutation_model + utils diff --git a/docs/source/cite.rst b/docs/source/cite.rst new file mode 100644 index 00000000..576be117 --- /dev/null +++ b/docs/source/cite.rst @@ -0,0 +1,24 @@ +Citing gctree +############# + +**Using Genotype Abundance to Improve Phylogenetic Inference** +William S DeWitt, III, Luka Mesin, Gabriel D Victora, Vladimir N Minin, Frederick A Matsen, IV +*Molecular Biology and Evolution*, Volume 35, Issue 5, May 2018, Pages 1253–1265, https://doi.org/10.1093/molbev/msy020 + +.. code-block:: bibtex + + @article{10.1093/molbev/msy020, + author = {DeWitt, William S, III and Mesin, Luka and Victora, Gabriel D and Minin, Vladimir N and Matsen, Frederick A, IV}, + title = "{Using Genotype Abundance to Improve Phylogenetic Inference}", + journal = {Molecular Biology and Evolution}, + volume = {35}, + number = {5}, + pages = {1253-1265}, + year = {2018}, + month = {02}, + abstract = "{Modern biological techniques enable very dense genetic sampling of unfolding evolutionary histories, and thus frequently sample some genotypes multiple times. This motivates strategies to incorporate genotype abundance information in phylogenetic inference. In this article, we synthesize a stochastic process model with standard sequence-based phylogenetic optimality, and show that tree estimation is substantially improved by doing so. Our method is validated with extensive simulations and an experimental single-cell lineage tracing study of germinal center B cell receptor affinity maturation.}", + issn = {0737-4038}, + doi = {10.1093/molbev/msy020}, + url = {https://doi.org/10.1093/molbev/msy020}, + eprint = {https://academic.oup.com/mbe/article-pdf/35/5/1253/25091561/msy020.pdf}, + } diff --git a/docs/source/cli.rst b/docs/source/cli.rst new file mode 100644 index 00000000..4b85059a --- /dev/null +++ b/docs/source/cli.rst @@ -0,0 +1,47 @@ +Command line interface + +gctree +====== + +The primary gctree command. + +.. argparse:: + :module: gctree.cli + :func: get_parser + :prog: gctree + :nodefault: + + +Parsimony utilities +=================== + +Additional command line uilities for processing data for genotype collapse, +inferring parsimony trees with phylip, and prepping parsimony trees for analysis +with gctree. + +deduplicate +----------- + +.. argparse:: + :module: gctree.deduplicate + :func: get_parser + :prog: deduplicate + :nodefault: + +mkconfig +-------- + +.. argparse:: + :module: gctree.mkconfig + :func: get_parser + :prog: mkconfig + :nodefault: + +phylip_parse +------------ + +.. argparse:: + :module: gctree.phylip_parse + :func: get_parser + :prog: phylip_parse + :nodefault: diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 00000000..9ecfb7d7 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,89 @@ +# Configuration file for the Sphinx documentation builder. +# +# Taken from https://github.com/JamesALeedham/Sphinx-Autosummary-Recursion + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +import os +import sys + +sys.path.insert(0, os.path.abspath("../..")) # Source code dir relative to this file + +# -- Project information ----------------------------------------------------- + +project = "gctree" +author = "William DeWitt" +copyright = '2020, William DeWitt' + +# No version in docs, doesn't play nice with versioneer +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", # Core Sphinx library for auto html doc generation from docstrings + "sphinx.ext.autosummary", # Create neat summary tables for modules/classes/methods etc + "sphinx.ext.githubpages", + "sphinx.ext.intersphinx", # Link to other project's documentation (see mapping below) + "sphinx.ext.mathjax", + "sphinx.ext.viewcode", # Add a link to the Python source code for classes, functions etc. + "sphinx.ext.napoleon", # support NumPy and Google style docstrings + "sphinx_autodoc_typehints", # Automatically document param types (less noise in class signature) + "sphinx.ext.todo", # track to do list items + "sphinxarg.ext", +] + +# show todos in output +todo_include_todos = True + +# Mappings for sphinx.ext.intersphinx. Projects have to have Sphinx-generated doc! (.inv file) +intersphinx_mapping = {"python": ("https://docs.python.org/3/", None), + "PyTorch": ('http://pytorch.org/docs/master/', None)} + +autosummary_generate = True # Turn on sphinx.ext.autosummary +autoclass_content = "both" # Add __init__ doc (ie. params) to class summaries +html_show_sourcelink = ( + False +) # Remove 'view source code' from top of page (for html, not python) +autodoc_inherit_docstrings = True # If no class summary, inherit base class summary + +autodoc_default_options = { + 'members': True, + 'member-order': 'bysource', + 'special-members': '__init__', +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + 'logo_only': True, +} + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = '_static/logo.png' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/docs/source/developer.rst b/docs/source/developer.rst new file mode 100644 index 00000000..133d1be2 --- /dev/null +++ b/docs/source/developer.rst @@ -0,0 +1,37 @@ +Open source code repository +=========================== + +All code is freely available at ``_ + +Developer tools +--------------- + +Developer install:: + + make install + +Run tests:: + + make test + +Format code:: + + make format + +Lint:: + + make lint + +Build docs locally (You can then see the generated documentation in ``docs/_build/index.html``.):: + + make docs + +Deploy docs:: + + make deploy + + +Todo list +--------- + +.. todolist:: diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 00000000..fd2eb0a2 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,44 @@ +gctree documentation +#################### + +``gctree`` is a command line utility and Python package for using sequence abundance information in phylogenetic inference. + +.. toctree:: + :maxdepth: 1 + :caption: User Guide + + install + cite + +.. toctree:: + :maxdepth: 3 + :caption: CLI Documentation + + cli + +.. toctree:: + :maxdepth: 3 + :caption: API Documentation + + api + +.. toctree:: + :maxdepth: 1 + :caption: Developer Documentation + + developer + +.. toctree:: + :maxdepth: 1 + :caption: Notes + + CHANGELOG + faq + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/install.rst b/docs/source/install.rst new file mode 100644 index 00000000..b38e2a6e --- /dev/null +++ b/docs/source/install.rst @@ -0,0 +1,16 @@ +Installation +############ + +Pip +=== + +.. code-block:: bash + + pip install gctree + + +Conda +===== + +.. todo:: + setup Conda install diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index 26cf773d..2a8aa514 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -690,7 +690,7 @@ def split_compatibility(split1, split2): return False def support(self, bootstrap_trees_list, weights=None, compatibility=False): - """compute support from a list of bootstrap GCtrees weights (optional) + """compute support from a list of bootstrap gctrees weights (optional) is needed for weighting parsimony degenerate trees compatibility mode counts trees that don't disconfirm the split.""" for node in self.tree.get_descendants(): diff --git a/gctree/cli.py b/gctree/cli.py index 2e28b729..d554b0e3 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -101,7 +101,7 @@ def test(args): ha="left", ) g.set_axis_labels("", "") - g.fig.text(0.45, 0.02, s="GCtree likelihood", multialignment="center") + g.fig.text(0.45, 0.02, s="gctree likelihood", multialignment="center") g.fig.text( 0.02, 0.7, @@ -277,12 +277,12 @@ def infer(args): plt.figure(figsize=(6.5, 2)) try: plt.plot(np.exp(ls), "ko", clip_on=False, markersize=4) - plt.ylabel("GCtree likelihood") + plt.ylabel("gctree likelihood") plt.yscale("log") plt.ylim([None, 1.1 * max(np.exp(ls))]) except FloatingPointError: plt.plot(ls, "ko", clip_on=False, markersize=4) - plt.ylabel("GCtree log-likelihood") + plt.ylabel("gctree log-likelihood") plt.ylim([None, 1.1 * max(ls)]) plt.xlabel("parsimony tree") plt.xlim([-1, len(ls)]) @@ -535,7 +535,7 @@ def simulate(args): def get_parser(): parser = argparse.ArgumentParser( - description="germinal center tree inference and simulation" + description="genotype collapsed tree inference and simulation" ) subparsers = parser.add_subparsers( title="subcommands", diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index e61b15df..50379cd2 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -105,7 +105,7 @@ def check_header(header): pass -def main(): +def get_parser(): parser = argparse.ArgumentParser( description="Deduplicate sequences in a fasta file, write to stdout in phylip format, and creates a few other files (see arguments). Headers must be a unique ID of less than " "or equal to 10 ASCII characters." @@ -152,7 +152,11 @@ def main(): default=None, help="optional output filename for colors map.", ) - args = parser.parse_args() + return parser + + +def main(arg_list=None): + args = get_parser().parse_args(arg_list) new_aln, counts, id_map = fasta_parse( args.infile[0], @@ -193,7 +197,3 @@ def main(): "{}:{}".format(color, count) for color, count in colors_counts ] print("{}\t{}".format(seq_id, ",".join(colors_strs)), file=f) - - -if __name__ == "__main__": - main() diff --git a/gctree/mkconfig.py b/gctree/mkconfig.py index de0f63ad..657dd666 100755 --- a/gctree/mkconfig.py +++ b/gctree/mkconfig.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -"""Read a PHYLIP-format file and produce an appropriate config file for passing +r"""Read a PHYLIP-format file and produce an appropriate config file for passing to `dnapars`. `dnapars` doesn't play very well in a @@ -13,41 +13,13 @@ $ mkconfig sequence.phy > dnapars.cfg $ dnapars < dnapars.cfg -For reference, the dnapars configuration prompt looks like this: -____________ -Please enter a new file name> dummy.phylip - -DNA parsimony algorithm, version 3.696 - -Setting for this run: - U Search for best tree? Yes - S Search option? More thorough search - V Number of trees to save? 10000 - J Randomize input order of sequences? No. Use input order - O Outgroup root? No, use as outgroup species 1 - T Use Threshold parsimony? No, use ordinary parsimony - N Use Transversion parsimony? No, count all steps - W Sites weighted? No - M Analyze multiple data sets? No - I Input sequences interleaved? Yes - 0 Terminal type (IBM PC, ANSI, none)? ANSI - 1 Print out the data at start of run No - 2 Print indications of progress of run Yes - 3 Print out tree Yes - 4 Print out steps in each site No - 5 Print sequences at all nodes of tree No - 6 Write out trees onto tree file? Yes - - Y to accept these or type the letter for one to change -____________ """ import os import random import argparse -def main(): - +def get_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("phylip", help="PHYLIP input", type=str) @@ -61,8 +33,11 @@ def main(): default=0, help="input is seqboot output with this many samples", ) - args = parser.parse_args() + return parser + +def main(arg_list=None): + args = get_parser().parse_args(arg_list) print(os.path.realpath(args.phylip)) # phylip input file if args.treeprog == "seqboot": print("R") @@ -101,7 +76,3 @@ def main(): raise RuntimeError( "treeprog=" + args.treeprog + ' is not "dnaml", "dnapars", or "seqboot"' ) - - -if __name__ == "__main__": - main() diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index 470f36f0..2ef85471 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -197,24 +197,21 @@ def build_tree(sequences, parents, counts=None, naive="naive"): return tree -def main(): - def existing_file(fname): - """Argparse type for an existing file.""" - if not os.path.isfile(fname): - raise ValueError("Invalid file: " + str(fname)) - return fname - +def get_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "phylip_outfile", - type=existing_file, + type=str, help="dnaml outfile (verbose output with inferred ancestral sequences, option 5).", ) - parser.add_argument("countfile", type=existing_file, help="count file") + parser.add_argument("countfile", type=str, help="count file") parser.add_argument("--outputfile", default=None, help="output file.") parser.add_argument("--naive", default="naive", help="naive sequence id") + return parser + - args = parser.parse_args() +def main(arg_list=None): + args = get_parser().parse_args(arg_list) if args.outputfile is None: args.outputfile = args.phylip_outfile + ".collapsed_forest.p" diff --git a/gctree/utils.py b/gctree/utils.py index 0aa49974..798bf7f3 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -1,6 +1,8 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- +"""Utility functions""" + def hamming_distance(seq1, seq2): """Hamming distance between two sequences of equal length.""" diff --git a/notebooks/runtime_experiment.ipynb b/notebooks/runtime_experiment.ipynb index ccf39368..fc283a11 100644 --- a/notebooks/runtime_experiment.ipynb +++ b/notebooks/runtime_experiment.ipynb @@ -4,14 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `GCtree` and `dnapars` timing experiments" + "# `gctree` and `dnapars` timing experiments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Runtime data for this experiment was generated by capturing scons timing log data for simulated runs with various numbers of cells (_N_). From the `GCtree` directory, run:\n", + "Runtime data for this experiment was generated by capturing scons timing log data for simulated runs with various numbers of cells (_N_). From the `gctree` directory, run:\n", "```bash\n", "$ for N in 50 100 150\n", " do\n", @@ -53,7 +53,7 @@ "df['number of cells'] = df['computation step'].str.extract('working/timetest.(?P[0-9]+).', expand=False)\n", "df['number of cells'] = pd.to_numeric(df['number of cells'])\n", "df.loc[df['computation step'].str.endswith('dnapars/log.log:'), 'computation step'] = 'dnapars'\n", - "df.loc[df['computation step'].str.endswith('gctree.inference.log:'), 'computation step'] = 'GCtree'" + "df.loc[df['computation step'].str.endswith('gctree.inference.log:'), 'computation step'] = 'gctree'" ] }, { @@ -63,7 +63,7 @@ "outputs": [], "source": [ "\"\"\"\n", - "GCtree runtime for different number of cells\n", + "gctree runtime for different number of cells\n", "\"\"\"\n", "plt.figure(figsize=(4, 3))\n", "sns.boxplot(x='number of cells', y='runtime (min)', hue='computation step',\n", @@ -98,9 +98,9 @@ "outputs": [], "source": [ "\"\"\"\n", - "plot GCtree runtime vs dnapars runtime for different number of cells\n", + "plot gctree runtime vs dnapars runtime for different number of cells\n", "\"\"\"\n", - "g = sns.lmplot(x='dnapars runtime (min)', y='GCtree runtime (min)', hue='number of cells',\n", + "g = sns.lmplot(x='dnapars runtime (min)', y='gctree runtime (min)', hue='number of cells',\n", " data=df2.reset_index(), size=3, legend_out=False,\n", " fit_reg=False, scatter_kws=dict(alpha=.5, clip_on=False))\n", "bounds = (10**floor(log10(min(df2['dnapars runtime (min)']))),\n", @@ -122,8 +122,8 @@ "\"\"\"\n", "plot total runtime vs dnapars runtime for different number of cells\n", "\"\"\"\n", - "df2['dnapars + GCtree runtime (min)'] = df2['dnapars runtime (min)'] + df2['GCtree runtime (min)']\n", - "g = sns.lmplot(x='dnapars runtime (min)', y='dnapars + GCtree runtime (min)', hue='number of cells',\n", + "df2['dnapars + gctree runtime (min)'] = df2['dnapars runtime (min)'] + df2['gctree runtime (min)']\n", + "g = sns.lmplot(x='dnapars runtime (min)', y='dnapars + gctree runtime (min)', hue='number of cells',\n", " data=df2.reset_index(), size=3.2, legend_out=False,\n", " fit_reg=False, scatter_kws=dict(alpha=.5, clip_on=False))\n", "bounds = (10**floor(log10(min(df2['dnapars runtime (min)']))),\n", diff --git a/requirements.txt b/requirements.txt index 37ded86c..d2ec39fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,8 @@ black docformatter flake8 pytest +sphinx +sphinx-argparse +sphinx_rtd_theme +sphinx-click +sphinx-autodoc-typehints diff --git a/scripts/consensus.py b/scripts/consensus.py index 5d429fcd..7e7c58cb 100755 --- a/scripts/consensus.py +++ b/scripts/consensus.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -"""compute GCtree for a phylip consensus tree.""" +"""compute gctree for a phylip consensus tree.""" from gctree import * import argparse diff --git a/scripts/heavy_light_compare.py b/scripts/heavy_light_compare.py index 4e02514c..53571883 100755 --- a/scripts/heavy_light_compare.py +++ b/scripts/heavy_light_compare.py @@ -165,10 +165,10 @@ def main(): ax.invert_yaxis() # plt.subplot(2,2,4) # plt.plot(list(reversed(heavy_log)), list(reversed(range(len(heavy_log)))), ls='none', marker='o', clip_on=False, c='k') - # plt.xlabel('GCtree log likelihood') + # plt.xlabel('gctree log likelihood') # plt.subplot(2,2,1) # plt.plot(range(len(light_log)), light_log, ls='none', marker='o', clip_on=False, c='k') - # plt.ylabel('GCtree log likelihood') + # plt.ylabel('gctree log likelihood') plt.tight_layout() sns.despine() plt.savefig(args.outbase + ".3.pdf") diff --git a/scripts/plot_tree.py b/scripts/plot_tree.py index 79b9bb08..c7724a3d 100755 --- a/scripts/plot_tree.py +++ b/scripts/plot_tree.py @@ -211,7 +211,7 @@ def hamming_distance(seq1, seq2): def tree_render_minimum(tree): - """Set the minimum settings on a ete3 tree for rendering a GCtree.""" + """Set the minimum settings on a ete3 tree for rendering a gctree.""" ts = TreeStyle() ts.show_leaf_name = False ts.rotation = 90 @@ -221,7 +221,7 @@ def tree_render_minimum(tree): def tree_render_default(tree, frame=None): - """Set the default settings on a ete3 tree for rendering a GCtree.""" + """Set the default settings on a ete3 tree for rendering a gctree.""" import sys from Bio.Seq import Seq import scipy @@ -515,7 +515,7 @@ def make_tree( """ This function wraps the rendering of an ete3 tree with custom user options - and the adding to the default GCtree rendering. + and the adding to the default gctree rendering. """ if tree_features_file is not None and statsfile is not None: default_plot = False @@ -592,7 +592,7 @@ def main(): from gctree import CollapsedTree parser = argparse.ArgumentParser( - description="Custom plotting of a GCtree output tree.", + description="Custom plotting of a gctree output tree.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument( @@ -600,7 +600,7 @@ def main(): required=True, type=str, dest="forrest_file", - help="Output pickled forrest file from GCtree.", + help="Output pickled forrest file from gctree.", ) parser.add_argument( "--tree_numb", From 9a62e0a3a2cb4127bc1518f28b34fcd71c091cd8 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Tue, 29 Jun 2021 20:09:45 -0700 Subject: [PATCH 21/32] publish to pypi when a release is published --- .github/workflows/python-publish.yml | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 00000000..3bfabfc1 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,36 @@ +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Upload Python Package + +on: + release: + types: [published] + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + run: python -m build + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} From 187621e66117c2d7f74d5d17ed0c4f6542f95911 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 12:20:03 -0700 Subject: [PATCH 22/32] change "naive" to the more general "root" --- README.md | 10 ++++----- SConscript.inference | 18 ++++++++-------- SConscript.simulation | 12 +++++------ SConstruct | 26 +++++++++++------------ gctree/branching_processes.py | 2 +- gctree/cli.py | 22 ++++++++++---------- gctree/deduplicate.py | 34 +++++++++++++++--------------- gctree/phylip_parse.py | 38 +++++++++++++++++----------------- scripts/consensus.py | 6 +++--- scripts/heavy_light_compare.py | 6 +++--- scripts/simstatagg.py | 10 ++++----- scripts/summary_stats.py | 38 +++++++++++++++++----------------- 12 files changed, 111 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index b6b88cb5..ff0a8ed6 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ All commands should be issued from within the gctree repo directory. - *input file*: `FASTA` or `PHYLIP` file containing a sequence for each observed individual/cell, and an additional sequence containing the ancestral genotype of all observed sequences (used for outgroup rooting). - *run inference*: ``` - scons --inference --outdir= --input= --naiveID= + scons --inference --outdir= --input= --rootID= ``` - *description of inference output files*: After the inference pipeline has completed, the output directory will contain the following output files: - `.idmap`: text file mapping collapsed sequenced ids to cell ids from the original input file @@ -96,7 +96,7 @@ scons --simulate --outdir= --N= --N= --N= --N= ${TARGETS[0]}", ) @@ -111,8 +111,8 @@ if bootstrap: # only get rerun if one of the targets are removed or if the input dnaml_config file is changed). env.Depends(seqboot, phylip) -# Update the naive ID: -naiveID = naiveID.lower() +# Update the root ID: +root_id = root_id.lower() if dnaml: dnaml_config = env.Command( @@ -143,8 +143,8 @@ if dnaml: ], [dnaml[1], phylip[1]], xarg - + "phylip_parse ${SOURCES} --outputfile ${TARGETS[0]} --naive " - + naiveID + + "phylip_parse ${SOURCES} --outputfile ${TARGETS[0]} --root " + + root_id + " > ${TARGETS[1]}", ) return_list.append(dnaml_tree) @@ -219,8 +219,8 @@ gctree_infer = CommandRunner( + ([phylip[3]] if colorfile is not None else []), xarg + buffarg - + "gctree infer ${SOURCES[0]} ${SOURCES[1]} --naive " - + naiveID + + "gctree infer ${SOURCES[0]} ${SOURCES[1]} --root " + + root_id + " --outbase " + gctree_outbase + frame_arg diff --git a/SConscript.simulation b/SConscript.simulation index 28382ed3..20d256f9 100644 --- a/SConscript.simulation +++ b/SConscript.simulation @@ -7,7 +7,7 @@ from nestly.scons import SConsWrap # the following must be exported by parent SConstruct/SConscript Import( - "env dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp xarg buffarg" + "env dnaml quick idlabel outdir root mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list root_idexp xarg buffarg" ) nest = Nest() @@ -59,7 +59,7 @@ def gctree_sim(outdir, c): xarg + buffarg + "gctree simulate " - + naive + + root + " ${SOURCES[0]} ${SOURCES[1]}" + " --outbase " + os.path.join(outdir, "gctree") @@ -81,13 +81,13 @@ def infer(outdir, c): """now do inference on the simulation results""" input_file = c["gctree_sim"][0] input_file2 = None - naiveID = "naive" # this is what the simulation routine names the naive + root_id = "root" # this is what the simulation routine names the root id_abundances = False bootstrap = 0 colorfile = None return SConscript( "SConscript.inference", - exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID id_abundances CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir root_id id_abundances CommandRunner bootstrap xarg buffarg colorfile", ) @@ -170,8 +170,8 @@ def summary_stats(outdir, c): + "python scripts/summary_stats.py $SOURCES --outbase " + os.path.join(outdir, "gctree.simulation.summary_stats") + exp_arg - + " --naiveIDexp " - + naiveIDexp + + " --root_idexp " + + root_idexp + " > ${TARGETS[0]}", ) env.AlwaysBuild(tgt) diff --git a/SConstruct b/SConstruct index ac33498b..0532aef6 100644 --- a/SConstruct +++ b/SConstruct @@ -76,16 +76,16 @@ if not simulate and not inference and not GetOption("help"): if simulate: AddOption( - "--naive", + "--root", type="string", default="ggacctagcctcgtgaaaccttctcagactctgtccctcacctgttctgtcactg" "gcgactccatcaccagtggttactggaactggatccggaaattcccagggaataa" "acttgagtacatggggtacataagctacagtggtagcacttactacaatccatct" "ctcaaaagtcgaatctccatcactcgagacacatccaagaaccagtactacctgc" "agttgaattctgtgactactgaggacacagccacatattactgt", - help="sequence of naive from which to simulate", + help="sequence of root from which to simulate", ) - naive = GetOption("naive") + root = GetOption("root") AddOption( "--mutability", type="string", @@ -149,12 +149,12 @@ if simulate: ) experimental_list = GetOption("experimental") AddOption( - "--naiveIDexp", + "--root_idexp", type="string", - default="naive0", - help="id of naive seq in the experimental data", + default="root0", + help="id of root seq in the experimental data", ) - naiveIDexp = GetOption("naiveIDexp") + root_idexp = GetOption("root_idexp") elif inference: AddOption( @@ -182,13 +182,13 @@ elif inference: ) colorfile = GetOption("colorfile") AddOption( - "--naiveID", + "--root_id", type="string", metavar="seqID", - default="naive", - help="id of naive sequence", + default="root", + help="id of root sequence", ) - naiveID = GetOption("naiveID") + root_id = GetOption("root_id") AddOption( "--id_abundances", action='store_true', @@ -210,12 +210,12 @@ if simulate and not GetOption("help"): raise InputError("outdir must be specified") SConscript( "SConscript.simulation", - exports="env dnaml quick idlabel outdir naive mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list naiveIDexp xarg buffarg", + exports="env dnaml quick idlabel outdir root mutability substitution lambda_list lambda0_list n frame N T nsim CommandRunner experimental_list root_idexp xarg buffarg", ) elif inference and not GetOption("help"): if None in [input_file, outdir]: raise InputError("input fasta or phylip and outdir must be specified") SConscript( "SConscript.inference", - exports="env dnaml quick idlabel frame input_file input_file2 outdir naiveID id_abundances CommandRunner bootstrap xarg buffarg colorfile", + exports="env dnaml quick idlabel frame input_file input_file2 outdir root_id id_abundances CommandRunner bootstrap xarg buffarg colorfile", ) diff --git a/gctree/branching_processes.py b/gctree/branching_processes.py index 2a8aa514..72b122cc 100755 --- a/gctree/branching_processes.py +++ b/gctree/branching_processes.py @@ -348,7 +348,7 @@ def ll(self, params, sign=1, build_cache=True): == -np.inf ): # if unifurcation not possible under current model, add a - # psuedocount for the naive + # psuedocount for the root leaves_and_clades_list[0].c = 1 # extract vector of function values and gradient components logf_data = [ diff --git a/gctree/cli.py b/gctree/cli.py index d554b0e3..6f1ff760 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -153,10 +153,10 @@ def test(args): def infer(args): """inference subprogram.""" - outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.naive)] + outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.root)] if args.bootstrap_phylipfile is not None: outfiles.extend( - pp.parse_outfile(args.bootstrap_phylipfile, args.countfile, args.naive) + pp.parse_outfile(args.bootstrap_phylipfile, args.countfile, args.root) ) bootstrap = len(outfiles) > 1 if bootstrap: @@ -430,9 +430,9 @@ def simulate(args): if args.sequence2 is not None: fh1 = open(args.outbase + ".simulation_seq1.fasta", "w") fh2 = open(args.outbase + ".simulation_seq2.fasta", "w") - fh1.write(">naive\n") + fh1.write(">root\n") fh1.write(args.sequence[seq_bounds[0][0] : seq_bounds[0][1]] + "\n") - fh2.write(">naive\n") + fh2.write(">root\n") fh2.write(args.sequence[seq_bounds[1][0] : seq_bounds[1][1]] + "\n") for leaf in tree.iter_leaves(): if leaf.frequency != 0: @@ -442,7 +442,7 @@ def simulate(args): fh2.write(leaf.sequence[seq_bounds[1][0] : seq_bounds[1][1]] + "\n") else: with open(args.outbase + ".simulation.fasta", "w") as f: - f.write(">naive\n") + f.write(">root\n") f.write(args.sequence + "\n") for leaf in tree.iter_leaves(): if leaf.frequency != 0: @@ -450,7 +450,7 @@ def simulate(args): f.write(leaf.sequence + "\n") # some observable simulation stats to write - frequency, distance_from_naive, degree = zip( + frequency, distance_from_root, degree = zip( *[ ( node.frequency, @@ -468,7 +468,7 @@ def simulate(args): stats = pd.DataFrame( { "genotype abundance": frequency, - "Hamming distance to root genotype": distance_from_naive, + "Hamming distance to root genotype": distance_from_root, "Hamming neighbor genotypes": degree, } ) @@ -559,7 +559,7 @@ def get_parser(): help="likelihood ranking of parsimony trees", ) parser_infer.add_argument( - "--naive", type=str, default=None, help="name of naive sequence (outgroup root)" + "--root", type=str, default=None, help="name of root sequence (outgroup root)" ) parser_infer.add_argument( "phylipfile", @@ -597,7 +597,7 @@ def get_parser(): formatter_class=argparse.ArgumentDefaultsHelpFormatter, help="Neutral, and target selective, model gctree simulation", ) - parser_sim.add_argument("sequence", type=str, help="seed naive nucleotide sequence") + parser_sim.add_argument("sequence", type=str, help="seed root nucleotide sequence") parser_sim.add_argument( "mutability", type=str, help="path to mutability model file" ) @@ -608,7 +608,7 @@ def get_parser(): "--sequence2", type=str, default=None, - help="Second seed naive nucleotide sequence. " + help="Second seed root nucleotide sequence. " "For simulating heavy/light chain co-evolution.", ) parser_sim.add_argument( @@ -649,7 +649,7 @@ def get_parser(): type=int, default=10, help="The number of non-synonymous mutations the target should be " - "away from the naive.", + "away from the root.", ) parser_sim.add_argument( "--plotAA", diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index 50379cd2..2ec80985 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -9,7 +9,7 @@ from collections import defaultdict, Counter -def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False): +def fasta_parse(aln_file, root, frame=None, aln_file2=None, id_abundances=False): if aln_file.endswith("fasta") or aln_file.endswith("fa"): aln_format = "fasta" elif aln_file.endswith("phylip") or aln_file.endswith("phy"): @@ -28,9 +28,9 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False raise ValueError("unrecognized alignment file type: " + aln_file2) aln2 = AlignIO.read(aln_file2, aln_format2) for seq in aln: - cell = seq.id[:-1] if seq.id != naive else naive + cell = seq.id[:-1] if seq.id != root else root for seq2 in aln2: - cell2 = seq2.id[:-1] if seq2.id != naive else naive + cell2 = seq2.id[:-1] if seq2.id != root else root if cell2 == cell: aln_combined.append( SeqRecord(Seq(str(seq.seq) + str(seq2.seq)), id=cell) @@ -47,7 +47,7 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False seqs_unique_counts = defaultdict(list) id_set = set() - naive_seq = None + root_seq = None for seq in aln: # seq.id = seq.id.lower() # if id is just an integer, assume it represents count of that sequence @@ -56,28 +56,28 @@ def fasta_parse(aln_file, naive, frame=None, aln_file2=None, id_abundances=False else: id_set.add(seq.id) seqstr = str(seq.seq)[start:end] - if seq.id == naive: - naive_seq = seqstr + if seq.id == root: + root_seq = seqstr if seqstr not in seqs_unique_counts: seqs_unique_counts[ seqstr - ] = [] # no observed naive unless we see it elsewhere + ] = [] # no observed root unless we see it elsewhere elif seq.id.isdigit() and id_abundances: seqs_unique_counts[seqstr] = [seq.id for _ in range(int(seq.id))] else: seqs_unique_counts[seqstr].append(seq.id) - if naive_seq is None: - raise ValueError("naive seq id {} not found".format(naive)) + if root_seq is None: + raise ValueError("root seq id {} not found".format(root)) - new_aln = MultipleSeqAlignment([SeqRecord(Seq(naive_seq), id=naive.lower())]) + new_aln = MultipleSeqAlignment([SeqRecord(Seq(root_seq), id=root.lower())]) counts = { - naive.lower(): len(seqs_unique_counts[naive_seq]) - } # Add the count for the naive sequence - id_map = {naive.lower(): [x for x in seqs_unique_counts[naive_seq] if x != naive]} + root.lower(): len(seqs_unique_counts[root_seq]) + } # Add the count for the root sequence + id_map = {root.lower(): [x for x in seqs_unique_counts[root_seq] if x != root]} del seqs_unique_counts[ - naive_seq - ] # Now delete the naive so it does not appear twice + root_seq + ] # Now delete the root so it does not appear twice for i, seq in enumerate(seqs_unique_counts, 1): new_id = "seq" + str(i) new_aln.append(SeqRecord(Seq(seq), id=new_id)) @@ -136,7 +136,7 @@ def get_parser(): action="store_true", help="flag to interpret integer ids in input as abundances", ) - parser.add_argument("--naive", type=str, default="naive", help="naive sequence id") + parser.add_argument("--root", type=str, default="root", help="root sequence id") parser.add_argument( "--frame", type=int, default=None, help="codon frame", choices=(1, 2, 3) ) @@ -160,7 +160,7 @@ def main(arg_list=None): new_aln, counts, id_map = fasta_parse( args.infile[0], - args.naive, + args.root, frame=args.frame, aln_file2=args.infile[1] if len(args.infile) == 2 else None, id_abundances=args.id_abundances, diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index 2ef85471..ee779f46 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -38,7 +38,7 @@ def sections(fh): # iterate over entries in the distance section def iter_edges(fh): - # 152 >naive2 0.01208 ( zero, 0.02525) ** + # 152 >root2 0.01208 ( zero, 0.02525) ** pat = re.compile( r"\s*(?P\w+)\s+(?P[\w>_.-]+)\s+(?P\d+\.\d+)" ) @@ -90,7 +90,7 @@ def parse_seqdict(fh, mode="dnaml"): # parse the dnaml output file and return data structures containing a # list biopython.SeqRecords and a dict containing adjacency # relationships and distances between nodes. -def parse_outfile(outfile, countfile=None, naive="naive"): +def parse_outfile(outfile, countfile=None, root="root"): """parse phylip outfile.""" if countfile is not None: counts = { @@ -117,9 +117,9 @@ def parse_outfile(outfile, countfile=None, naive="naive"): ) ) if bootstrap: - trees[-1].append(build_tree(sequences, parents, counts, naive)) + trees[-1].append(build_tree(sequences, parents, counts, root)) else: - trees.append(build_tree(sequences, parents, counts, naive)) + trees.append(build_tree(sequences, parents, counts, root)) elif sect == "seqboot_dataset": bootstrap = True trees.append([]) @@ -152,7 +152,7 @@ def disambiguate(tree): # build a tree from a set of sequences and an adjacency dict. -def build_tree(sequences, parents, counts=None, naive="naive"): +def build_tree(sequences, parents, counts=None, root="root"): # build an ete tree # first a dictionary of disconnected nodes nodes = {} @@ -171,20 +171,20 @@ def build_tree(sequences, parents, counts=None, naive="naive"): nodes[parents[name]].add_child(nodes[name]) else: tree = nodes[name] - # reroot on naive - if naive is not None: - naive_id = [node for node in nodes if naive in node][0] - assert len(nodes[naive_id].children) == 0 - naive_parent = nodes[naive_id].up - naive_parent.remove_child(nodes[naive_id]) - nodes[naive_id].add_child(naive_parent) + # reroot on root + if root is not None: + root_id = [node for node in nodes if root in node][0] + assert len(nodes[root_id].children) == 0 + root_parent = nodes[root_id].up + root_parent.remove_child(nodes[root_id]) + nodes[root_id].add_child(root_parent) # remove possible unecessary unifurcation after rerooting - if len(naive_parent.children) == 1: - naive_parent.delete(prevent_nondicotomic=False) - naive_parent.children[0].dist = hamming_distance( - naive_parent.children[0].sequence, nodes[naive_id].sequence + if len(root_parent.children) == 1: + root_parent.delete(prevent_nondicotomic=False) + root_parent.children[0].dist = hamming_distance( + root_parent.children[0].sequence, nodes[root_id].sequence ) - tree = nodes[naive_id] + tree = nodes[root_id] # make random choices for ambiguous bases tree = disambiguate(tree) @@ -206,7 +206,7 @@ def get_parser(): ) parser.add_argument("countfile", type=str, help="count file") parser.add_argument("--outputfile", default=None, help="output file.") - parser.add_argument("--naive", default="naive", help="naive sequence id") + parser.add_argument("--root", default="root", help="root sequence id") return parser @@ -215,7 +215,7 @@ def main(arg_list=None): if args.outputfile is None: args.outputfile = args.phylip_outfile + ".collapsed_forest.p" - trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.naive) + trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.root) if isinstance(trees[0], list): print(trees[0][0]) print(bp.CollapsedTree(tree=trees[0][0])) diff --git a/scripts/consensus.py b/scripts/consensus.py index 7e7c58cb..b1894fd1 100755 --- a/scripts/consensus.py +++ b/scripts/consensus.py @@ -21,7 +21,7 @@ def main(): "bootstrap", type=str, help="dnapars outfile from seqboot (multiple data sets)" ) parser.add_argument( - "--naive", type=str, default=None, help="name of naive sequence (outgroup root)" + "--root", type=str, default=None, help="name of root sequence (outgroup root)" ) parser.add_argument( "--frame", type=int, default=None, choices=(1, 2, 3), help="codon frame" @@ -31,7 +31,7 @@ def main(): ) args = parser.parse_args() - consense = phylip_parse.parse_outfile(args.consense, args.countfile, args.naive) + consense = phylip_parse.parse_outfile(args.consense, args.countfile, args.root) assert len(consense) == 1 consensus_gctree = CollapsedTree(tree=consense[0], frame=args.frame) @@ -40,7 +40,7 @@ def main(): weights = [] for bootstrap in phylip_parse.parse_outfile( - args.bootstrap, args.countfile, args.naive + args.bootstrap, args.countfile, args.root ): new_gctrees = [] for tree in bootstrap: diff --git a/scripts/heavy_light_compare.py b/scripts/heavy_light_compare.py index 53571883..c8b97e4b 100755 --- a/scripts/heavy_light_compare.py +++ b/scripts/heavy_light_compare.py @@ -29,7 +29,7 @@ def main(): parser.add_argument("heavy_log", type=str, help="log") parser.add_argument("light_log", type=str, help="log") parser.add_argument("outbase", type=str, help="output file base name") - parser.add_argument("--naiveid", type=str, default="GL", help="fasta") + parser.add_argument("--rootid", type=str, default="GL", help="fasta") # parser.add_argument('--outbase', type=str, required=True, help='output file base name') args = parser.parse_args() @@ -41,11 +41,11 @@ def main(): heavy_map = defaultdict(list) for seq in AlignIO.read(args.heavy_fasta, "fasta"): - if seq.id != args.naiveid: + if seq.id != args.rootid: heavy_map[str(seq.seq).lower()].append(seq.id) light_map = defaultdict(list) for seq in AlignIO.read(args.light_fasta, "fasta"): - if seq.id != args.naiveid: + if seq.id != args.rootid: light_map[str(seq.seq).lower()].append(seq.id) for heavy_tree in heavy_forest.forest: diff --git a/scripts/simstatagg.py b/scripts/simstatagg.py index e2ff0aba..c508eace 100755 --- a/scripts/simstatagg.py +++ b/scripts/simstatagg.py @@ -41,14 +41,14 @@ nsims = len(sims) if args.experimental is not None: - new_aln, counts = fasta_parse(args.experimental, naive="GL", id_abundances=True)[:2] + new_aln, counts = fasta_parse(args.experimental, root="GL", id_abundances=True)[:2] exp_dict = {seq.id: str(seq.seq) for seq in new_aln} - naive_id = [seq for seq in exp_dict if "gl" in seq][0] - frequency, distance_from_naive, degree = zip( + root_id = [seq for seq in exp_dict if "gl" in seq][0] + frequency, distance_from_root, degree = zip( *[ ( counts[seq], - hamming_distance(exp_dict[seq], exp_dict[naive_id]), + hamming_distance(exp_dict[seq], exp_dict[root_id]), sum( hamming_distance(exp_dict[seq], exp_dict[seq2]) == 1 for seq2 in exp_dict @@ -62,7 +62,7 @@ exp_stats = pd.DataFrame( { "genotype abundance": frequency, - "Hamming distance to root genotype": distance_from_naive, + "Hamming distance to root genotype": distance_from_root, "Hamming neighbor genotypes": degree, } ) diff --git a/scripts/summary_stats.py b/scripts/summary_stats.py index ed44cf70..d515dfc3 100755 --- a/scripts/summary_stats.py +++ b/scripts/summary_stats.py @@ -21,36 +21,36 @@ def main(): ) parser.add_argument("--outbase", type=str, help="output file base name") parser.add_argument( - "--naiveIDexp", type=str, default="naive0", help="naive sequence ID" + "--root_idexp", type=str, default="root0", help="root sequence ID" ) args = parser.parse_args() # simulations - naiveID = "naive" + root_id = "root" for i, fname in enumerate(args.input): print(fname) - seqs = {seq.id: str(seq.seq) for seq in fasta_parse(fname, "naive")[0]} + seqs = {seq.id: str(seq.seq) for seq in fasta_parse(fname, "root")[0]} nseqs = len(seqs) if nseqs <= 2: continue - distance_from_naive, degree = zip( + distance_from_root, degree = zip( *[ ( - hamming_distance(seqs[seqid], seqs[naiveID]), + hamming_distance(seqs[seqid], seqs[root_id]), min( hamming_distance(seqs[seqid], seqs[seqid2]) for seqid2 in seqs - if seqid2 != naiveID and seqid2 != seqid + if seqid2 != root_id and seqid2 != seqid ), ) for seqid in seqs - if seqid != naiveID + if seqid != root_id ] ) df = pd.DataFrame( { - "distance to naive sequence": distance_from_naive, + "distance to root sequence": distance_from_root, "nearest neighbor distance": degree, } ) @@ -67,29 +67,29 @@ def main(): for i, fname in enumerate(args.experimental): print(fname) seqs = { - seq.id: str(seq.seq) for seq in fasta_parse(fname, args.naiveIDexp)[0] + seq.id: str(seq.seq) for seq in fasta_parse(fname, args.root_idexp)[0] } nseqs = len(seqs) if nseqs <= 2: continue - distance_from_naive, degree = zip( + distance_from_root, degree = zip( *[ ( - hamming_distance(seqs[seqid], seqs[args.naiveIDexp]), + hamming_distance(seqs[seqid], seqs[args.root_idexp]), min( hamming_distance(seqs[seqid], seqs[seqid2]) for seqid2 in seqs - if seqid2 != args.naiveIDexp and seqid2 != seqid + if seqid2 != args.root_idexp and seqid2 != seqid ), ) for seqid in seqs - if seqid != args.naiveIDexp + if seqid != args.root_idexp ] ) df = pd.DataFrame( { - "distance to naive sequence": distance_from_naive, + "distance to root sequence": distance_from_root, "nearest neighbor distance": degree, } ) @@ -105,8 +105,8 @@ def main(): alpha = min([0.9, 20 / ndatasets]) bins = range( max( - aggdat["distance to naive sequence"].max(), - aggdat_exp["distance to naive sequence"].max() + aggdat["distance to root sequence"].max(), + aggdat_exp["distance to root sequence"].max() if args.experimental is not None else 0, ) @@ -119,7 +119,7 @@ def main(): for dataset, dataset_aggdat in aggdat.groupby("data set"): ct += 1 sns.distplot( - dataset_aggdat["distance to naive sequence"], + dataset_aggdat["distance to root sequence"], bins=bins, kde=False, color="gray", @@ -130,7 +130,7 @@ def main(): for dataset, dataset_aggdat in aggdat_exp.groupby("data set"): ct += 1 sns.distplot( - dataset_aggdat["distance to naive sequence"], + dataset_aggdat["distance to root sequence"], bins=bins, kde=False, color="black", @@ -141,7 +141,7 @@ def main(): "lw": 3, }, ) - plt.xlabel("distance to naive sequence") + plt.xlabel("distance to root sequence") plt.xlim([0, bins[-1]]) plt.ylabel("observed sequences") plt.tight_layout() From 76603ffa847f1711e9225f31db2122b78c983b1a Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:45:35 -0700 Subject: [PATCH 23/32] image file type option --- gctree/cli.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/gctree/cli.py b/gctree/cli.py index 6f1ff760..1a0d9d13 100644 --- a/gctree/cli.py +++ b/gctree/cli.py @@ -109,7 +109,7 @@ def test(args): rotation=90, multialignment="center", ) - plt.savefig(args.outbase + ".pdf") + plt.savefig(args.outbase + "." + args.img_type) # MLE check n = 20 @@ -146,17 +146,17 @@ def test(args): for i in range(len(ps)): for j in range(len(qs)): plt.scatter([ps[i]], [qs[j]], c="black", marker="+") - plt.savefig(args.outbase + ".2.pdf") + plt.savefig(args.outbase + ".2." + args.img_type) return def infer(args): """inference subprogram.""" - outfiles = [pp.parse_outfile(args.phylipfile, args.countfile, args.root)] + outfiles = [pp.parse_outfile(args.phylipfile, args.abundance_file, args.root)] if args.bootstrap_phylipfile is not None: outfiles.extend( - pp.parse_outfile(args.bootstrap_phylipfile, args.countfile, args.root) + pp.parse_outfile(args.bootstrap_phylipfile, args.abundance_file, args.root) ) bootstrap = len(outfiles) > 1 if bootstrap: @@ -290,7 +290,7 @@ def infer(args): plt.tick_params( axis="x", which="both", bottom="off", top="off", labelbottom="off" ) - plt.savefig(outbase + ".inference.likelihood_rank.pdf") + plt.savefig(outbase + ".inference.likelihood_rank." + args.img_type) # rank plot of observed allele frequencies y = sorted( @@ -305,7 +305,7 @@ def infer(args): plt.bar(range(1, len(y) + 1), y, color="black") plt.xlabel("genotype") plt.ylabel("abundance") - plt.savefig(outbase + ".inference.abundance_rank.pdf") + plt.savefig(outbase + ".inference.abundance_rank." + args.img_type) if bootstrap: import seaborn as sns @@ -326,7 +326,7 @@ def infer(args): ylim=(0, 1), height=3, ) - plt.savefig(args.outbase + ".inference.bootstrap_theta.pdf") + plt.savefig(args.outbase + ".inference.bootstrap_theta." + args.img_type) gctrees[0].support(gctrees[1:]) gctrees[0].render( args.outbase + ".inference.bootstrap_support.svg", @@ -567,7 +567,7 @@ def get_parser(): help="dnapars outfile (verbose output with sequences at each site)", ) parser_infer.add_argument( - "countfile", + "abundance_file", type=str, help="File containing allele frequencies (sequence counts) in the " 'format: "SeqID,Nobs"', @@ -665,11 +665,14 @@ def get_parser(): ) parser_sim.set_defaults(func=simulate) - # a common outbase parameter + # shared parameters for subparser in [parser_test, parser_infer, parser_sim]: subparser.add_argument( "--outbase", type=str, default="gctree.out", help="output file base name" ) + subparser.add_argument( + "--img_type", type=str, default="svg", help="output image file type" + ) # common parameters for the inference and simulation subprograms for subparser in [parser_infer, parser_sim]: From 7b1c432faa6174bc1a18ab75195845ab61a9c187 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:48:18 -0700 Subject: [PATCH 24/32] rename countfile arg to abundance_file --- SConscript.inference | 2 +- gctree/deduplicate.py | 6 +++--- gctree/phylip_parse.py | 10 +++++----- scripts/consensus.py | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SConscript.inference b/SConscript.inference index 53bd379d..92c359b1 100644 --- a/SConscript.inference +++ b/SConscript.inference @@ -77,7 +77,7 @@ phylip = env.Command( + "deduplicate ${SOURCES[0]} " + (" --colorfile ${SOURCES[1]} " if colorfile is not None else "") + (" --colormap ${TARGETS[3]} " if colorfile is not None else "") - + " --countfile ${TARGETS[1]} --idmapfile ${TARGETS[2]} " + + " --abundance_file ${TARGETS[1]} --idmapfile ${TARGETS[2]} " + frame_arg + id_abundances_arg + "--root " diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index 2ec80985..6ba8f2c8 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -120,7 +120,7 @@ def get_parser(): "at least one non number character (unless using the id_abundances option).", ) parser.add_argument( - "--countfile", + "--abundance_file", type=str, default=None, help="filename for the output file containing the counts.", @@ -166,8 +166,8 @@ def main(arg_list=None): id_abundances=args.id_abundances, ) print(format(new_aln, "phylip")) - if args.countfile is not None: - with open(args.countfile, "w") as f: + if args.abundance_file is not None: + with open(args.abundance_file, "w") as f: for seqID, count in counts.items(): print("{},{}".format(seqID, count), file=f) if args.idmapfile is not None: diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index ee779f46..b194663e 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -90,11 +90,11 @@ def parse_seqdict(fh, mode="dnaml"): # parse the dnaml output file and return data structures containing a # list biopython.SeqRecords and a dict containing adjacency # relationships and distances between nodes. -def parse_outfile(outfile, countfile=None, root="root"): +def parse_outfile(outfile, abundance_file=None, root="root"): """parse phylip outfile.""" - if countfile is not None: + if abundance_file is not None: counts = { - line.split(",")[0]: int(line.split(",")[1]) for line in open(countfile) + line.split(",")[0]: int(line.split(",")[1]) for line in open(abundance_file) } # No count, just make an empty count dictionary: else: @@ -204,7 +204,7 @@ def get_parser(): type=str, help="dnaml outfile (verbose output with inferred ancestral sequences, option 5).", ) - parser.add_argument("countfile", type=str, help="count file") + parser.add_argument("abundance_file", type=str, help="count file") parser.add_argument("--outputfile", default=None, help="output file.") parser.add_argument("--root", default="root", help="root sequence id") return parser @@ -215,7 +215,7 @@ def main(arg_list=None): if args.outputfile is None: args.outputfile = args.phylip_outfile + ".collapsed_forest.p" - trees = pp.parse_outfile(args.phylip_outfile, args.countfile, args.root) + trees = pp.parse_outfile(args.phylip_outfile, args.abundance_file, args.root) if isinstance(trees[0], list): print(trees[0][0]) print(bp.CollapsedTree(tree=trees[0][0])) diff --git a/scripts/consensus.py b/scripts/consensus.py index b1894fd1..666db0fe 100755 --- a/scripts/consensus.py +++ b/scripts/consensus.py @@ -13,7 +13,7 @@ def main(): "consense", type=str, help="dnapars outfile for fixed consense tree" ) parser.add_argument( - "countfile", + "abundance_file", type=str, help='File containing allele frequencies (sequence counts) in the format: "SeqID,Nobs"', ) @@ -31,7 +31,7 @@ def main(): ) args = parser.parse_args() - consense = phylip_parse.parse_outfile(args.consense, args.countfile, args.root) + consense = phylip_parse.parse_outfile(args.consense, args.abundance_file, args.root) assert len(consense) == 1 consensus_gctree = CollapsedTree(tree=consense[0], frame=args.frame) @@ -40,7 +40,7 @@ def main(): weights = [] for bootstrap in phylip_parse.parse_outfile( - args.bootstrap, args.countfile, args.root + args.bootstrap, args.abundance_file, args.root ): new_gctrees = [] for tree in bootstrap: From 1d72b270374e3f403d6232645059ab461130769c Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:49:46 -0700 Subject: [PATCH 25/32] retain case of seq ids --- SConscript.inference | 2 +- gctree/deduplicate.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/SConscript.inference b/SConscript.inference index 92c359b1..39073ca3 100644 --- a/SConscript.inference +++ b/SConscript.inference @@ -112,7 +112,7 @@ if bootstrap: env.Depends(seqboot, phylip) # Update the root ID: -root_id = root_id.lower() +root_id = root_id if dnaml: dnaml_config = env.Command( diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index 6ba8f2c8..a53bfbd8 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -49,7 +49,6 @@ def fasta_parse(aln_file, root, frame=None, aln_file2=None, id_abundances=False) id_set = set() root_seq = None for seq in aln: - # seq.id = seq.id.lower() # if id is just an integer, assume it represents count of that sequence if seq.id in id_set: raise ValueError("Sequence ID found multiple times:", seq.id) @@ -70,11 +69,11 @@ def fasta_parse(aln_file, root, frame=None, aln_file2=None, id_abundances=False) if root_seq is None: raise ValueError("root seq id {} not found".format(root)) - new_aln = MultipleSeqAlignment([SeqRecord(Seq(root_seq), id=root.lower())]) + new_aln = MultipleSeqAlignment([SeqRecord(Seq(root_seq), id=root)]) counts = { - root.lower(): len(seqs_unique_counts[root_seq]) + root: len(seqs_unique_counts[root_seq]) } # Add the count for the root sequence - id_map = {root.lower(): [x for x in seqs_unique_counts[root_seq] if x != root]} + id_map = {root: [x for x in seqs_unique_counts[root_seq] if x != root]} del seqs_unique_counts[ root_seq ] # Now delete the root so it does not appear twice @@ -109,7 +108,7 @@ def get_parser(): parser = argparse.ArgumentParser( description="Deduplicate sequences in a fasta file, write to stdout in phylip format, and creates a few other files (see arguments). Headers must be a unique ID of less than " "or equal to 10 ASCII characters." - " All headers are converted to lower case." + "An additional sequence representing the outgroup/root must be included (even if one or more observed sequences are identical to it)." ) parser.add_argument( "infile", From 0bbecbc0cde6c49d95006a377bcc449a029fd155 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:51:44 -0700 Subject: [PATCH 26/32] more docs writing --- docs/Makefile | 2 +- docs/source/_static/gc1.png | Bin 0 -> 85316 bytes .../source/_static/molbiolevol_35_5cover.jpeg | Bin 0 -> 242282 bytes docs/source/cite.rst | 3 + docs/source/cli.rst | 2 - docs/source/conf.py | 1 + docs/source/index.rst | 5 +- docs/source/install.rst | 21 +++- docs/source/quickstart.rst | 101 ++++++++++++++++++ requirements.txt | 1 + 10 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 docs/source/_static/gc1.png create mode 100644 docs/source/_static/molbiolevol_35_5cover.jpeg create mode 100644 docs/source/quickstart.rst diff --git a/docs/Makefile b/docs/Makefile index 70e4dfe6..0c754af5 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -22,6 +22,6 @@ help: # Convert .py to .ipynb (don't seem to need to --execute? perhaps sphinx-build does it...), then build html: %: Makefile - rm -rf build + rm -rf _build rm -rf source/_autosummary @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/source/_static/gc1.png b/docs/source/_static/gc1.png new file mode 100644 index 0000000000000000000000000000000000000000..111a76082c64ef2f206f9f9438dc704ebb0dbad2 GIT binary patch literal 85316 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�I=*E3~7w*GL-s*Viu#J^^Jnf>i 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%0D|T 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� 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 w;x1Y+M3gFONc(p)pj%Y@F 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 deduplicated.phylip + :cwd: ../../example + :shell: + +We now have files ``deduplicated.phylip`` and ``abundances.csv``: + +.. command-output:: head deduplicated.phylip + :cwd: ../../example + :shell: + +.. command-output:: head abundances.csv + :cwd: ../../example + :shell: + + +Parsimony trees +=============== + +We use PHYLIP's ``dnapars`` program (see install docs page) to generate a set of maximum parsimony trees for the deduplicated sequences. +PHYLIP is an interactive command line tool, so we will automatically generate a config file to feed it input, instead of using it interactively. + +We generate a config file for ``dnapars`` based on our deduplicated alignment using the ``mkconfig`` command. + +.. command-output:: mkconfig deduplicated.phylip dnapars > dnapars.cfg + :cwd: ../../example + :shell: + +Run ``dnapars`` using this config file, redirecting stdout to a log file. + +.. command-output:: dnapars < dnapars.cfg > dnapars.log + :cwd: ../../example + :shell: + +You now have two new files, ``outfile`` and ``outtree``. +Note: if you want to rerun the above ``dnapars`` command, you must delete these two files first! + + +gctree +====== + +We're now ready to run ``gctree infer`` to use abundance data (in ``abundances.csv``) to rank the eqaully parsimonious trees (in ``outfile``). + +.. command-output:: gctree infer outfile abundances.csv --root GL + :cwd: ../../example + :shell: + :ellipsis: 10 + +The information printed to stdout (truncated above) shows a list of parsimony trees ranked by decreasing gctree log-likelihood. +A large number of output files with the basename ``gctree.out.`` are also created. +The SVG image file ``gctree.out.inference.abundance_rank.svg`` shows a distribution of genotype abundances in the original data: + +.. image:: ../../example/gctree.out.inference.abundance_rank.svg + :width: 600 + +The SVG image file ``gctree.out.inference.likelihood_rank.svg`` is a rank plot of these likelihoods over the set of maximum parsimony trees: + +.. image:: ../../example/gctree.out.inference.likelihood_rank.svg + :width: 600 + +Then there are files ``gctree.out.inference.[1,2,...].svg`` and ``gctree.out.inference.[1,2,...].nk`` containing an SVG tree image and newick tree file for each of the parsimony trees (numbered according to likelihood rank). +For example here is the top ranked tree ``gctree.out.inference.1.svg``: + +.. image:: ../../example/gctree.out.inference.1.svg + :width: 600 diff --git a/requirements.txt b/requirements.txt index d2ec39fe..b78496e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ sphinx-argparse sphinx_rtd_theme sphinx-click sphinx-autodoc-typehints +sphinxcontrib-programoutput From 5c5a64428b977a7b28db7028041ce5bfbe199387 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:53:17 -0700 Subject: [PATCH 27/32] quickstart example output --- example/abundances.csv | 43 + example/deduplicated.phylip | 265 + example/dnapars.cfg | 10 + example/gc1.png | Bin 85316 -> 0 bytes example/gctree.inference.1.svg | 1 - example/gctree.inference.abundance_rank.png | Bin 127924 -> 0 bytes example/gctree.inference.likelihood_rank.png | Bin 91369 -> 0 bytes example/gctree.out.inference.1.nk | 1 + example/gctree.out.inference.1.svg | 1 + example/gctree.out.inference.10.nk | 1 + example/gctree.out.inference.10.svg | 1 + example/gctree.out.inference.100.nk | 1 + example/gctree.out.inference.100.svg | 1 + example/gctree.out.inference.101.nk | 1 + example/gctree.out.inference.101.svg | 1 + example/gctree.out.inference.102.nk | 1 + example/gctree.out.inference.102.svg | 1 + example/gctree.out.inference.103.nk | 1 + example/gctree.out.inference.103.svg | 1 + example/gctree.out.inference.104.nk | 1 + example/gctree.out.inference.104.svg | 1 + example/gctree.out.inference.105.nk | 1 + example/gctree.out.inference.105.svg | 1 + example/gctree.out.inference.106.nk | 1 + example/gctree.out.inference.106.svg | 1 + example/gctree.out.inference.107.nk | 1 + example/gctree.out.inference.107.svg | 1 + example/gctree.out.inference.108.nk | 1 + example/gctree.out.inference.108.svg | 1 + example/gctree.out.inference.109.nk | 1 + example/gctree.out.inference.109.svg | 1 + example/gctree.out.inference.11.nk | 1 + example/gctree.out.inference.11.svg | 1 + example/gctree.out.inference.110.nk | 1 + example/gctree.out.inference.110.svg | 1 + example/gctree.out.inference.111.nk | 1 + example/gctree.out.inference.111.svg | 1 + example/gctree.out.inference.112.nk | 1 + example/gctree.out.inference.112.svg | 1 + example/gctree.out.inference.113.nk | 1 + example/gctree.out.inference.113.svg | 1 + example/gctree.out.inference.114.nk | 1 + example/gctree.out.inference.114.svg | 1 + example/gctree.out.inference.115.nk | 1 + example/gctree.out.inference.115.svg | 1 + example/gctree.out.inference.116.nk | 1 + example/gctree.out.inference.116.svg | 1 + example/gctree.out.inference.117.nk | 1 + example/gctree.out.inference.117.svg | 1 + example/gctree.out.inference.118.nk | 1 + example/gctree.out.inference.118.svg | 1 + example/gctree.out.inference.119.nk | 1 + example/gctree.out.inference.119.svg | 1 + example/gctree.out.inference.12.nk | 1 + example/gctree.out.inference.12.svg | 1 + example/gctree.out.inference.120.nk | 1 + example/gctree.out.inference.120.svg | 1 + example/gctree.out.inference.121.nk | 1 + example/gctree.out.inference.121.svg | 1 + example/gctree.out.inference.122.nk | 1 + example/gctree.out.inference.122.svg | 1 + example/gctree.out.inference.123.nk | 1 + example/gctree.out.inference.123.svg | 1 + example/gctree.out.inference.124.nk | 1 + example/gctree.out.inference.124.svg | 1 + example/gctree.out.inference.125.nk | 1 + example/gctree.out.inference.125.svg | 1 + example/gctree.out.inference.126.nk | 1 + example/gctree.out.inference.126.svg | 1 + example/gctree.out.inference.127.nk | 1 + example/gctree.out.inference.127.svg | 1 + example/gctree.out.inference.128.nk | 1 + example/gctree.out.inference.128.svg | 1 + example/gctree.out.inference.129.nk | 1 + example/gctree.out.inference.129.svg | 1 + example/gctree.out.inference.13.nk | 1 + example/gctree.out.inference.13.svg | 1 + example/gctree.out.inference.130.nk | 1 + example/gctree.out.inference.130.svg | 1 + example/gctree.out.inference.131.nk | 1 + example/gctree.out.inference.131.svg | 1 + example/gctree.out.inference.132.nk | 1 + example/gctree.out.inference.132.svg | 1 + example/gctree.out.inference.133.nk | 1 + example/gctree.out.inference.133.svg | 1 + example/gctree.out.inference.134.nk | 1 + example/gctree.out.inference.134.svg | 1 + example/gctree.out.inference.135.nk | 1 + example/gctree.out.inference.135.svg | 1 + example/gctree.out.inference.136.nk | 1 + example/gctree.out.inference.136.svg | 1 + example/gctree.out.inference.137.nk | 1 + example/gctree.out.inference.137.svg | 1 + example/gctree.out.inference.138.nk | 1 + example/gctree.out.inference.138.svg | 1 + example/gctree.out.inference.139.nk | 1 + example/gctree.out.inference.139.svg | 1 + example/gctree.out.inference.14.nk | 1 + example/gctree.out.inference.14.svg | 1 + example/gctree.out.inference.140.nk | 1 + example/gctree.out.inference.140.svg | 1 + example/gctree.out.inference.141.nk | 1 + example/gctree.out.inference.141.svg | 1 + example/gctree.out.inference.142.nk | 1 + example/gctree.out.inference.142.svg | 1 + example/gctree.out.inference.143.nk | 1 + example/gctree.out.inference.143.svg | 1 + example/gctree.out.inference.144.nk | 1 + example/gctree.out.inference.144.svg | 1 + example/gctree.out.inference.145.nk | 1 + example/gctree.out.inference.145.svg | 1 + example/gctree.out.inference.146.nk | 1 + example/gctree.out.inference.146.svg | 1 + example/gctree.out.inference.147.nk | 1 + example/gctree.out.inference.147.svg | 1 + example/gctree.out.inference.148.nk | 1 + example/gctree.out.inference.148.svg | 1 + example/gctree.out.inference.149.nk | 1 + example/gctree.out.inference.149.svg | 1 + example/gctree.out.inference.15.nk | 1 + example/gctree.out.inference.15.svg | 1 + example/gctree.out.inference.150.nk | 1 + example/gctree.out.inference.150.svg | 1 + example/gctree.out.inference.151.nk | 1 + example/gctree.out.inference.151.svg | 1 + example/gctree.out.inference.152.nk | 1 + example/gctree.out.inference.152.svg | 1 + example/gctree.out.inference.153.nk | 1 + example/gctree.out.inference.153.svg | 1 + example/gctree.out.inference.154.nk | 1 + example/gctree.out.inference.154.svg | 1 + example/gctree.out.inference.155.nk | 1 + example/gctree.out.inference.155.svg | 1 + example/gctree.out.inference.156.nk | 1 + example/gctree.out.inference.156.svg | 1 + example/gctree.out.inference.157.nk | 1 + example/gctree.out.inference.157.svg | 1 + example/gctree.out.inference.158.nk | 1 + example/gctree.out.inference.158.svg | 1 + example/gctree.out.inference.159.nk | 1 + example/gctree.out.inference.159.svg | 1 + example/gctree.out.inference.16.nk | 1 + example/gctree.out.inference.16.svg | 1 + example/gctree.out.inference.160.nk | 1 + example/gctree.out.inference.160.svg | 1 + example/gctree.out.inference.161.nk | 1 + example/gctree.out.inference.161.svg | 1 + example/gctree.out.inference.162.nk | 1 + example/gctree.out.inference.162.svg | 1 + example/gctree.out.inference.163.nk | 1 + example/gctree.out.inference.163.svg | 1 + example/gctree.out.inference.164.nk | 1 + example/gctree.out.inference.164.svg | 1 + example/gctree.out.inference.165.nk | 1 + example/gctree.out.inference.165.svg | 1 + example/gctree.out.inference.166.nk | 1 + example/gctree.out.inference.166.svg | 1 + example/gctree.out.inference.167.nk | 1 + example/gctree.out.inference.167.svg | 1 + example/gctree.out.inference.168.nk | 1 + example/gctree.out.inference.168.svg | 1 + example/gctree.out.inference.169.nk | 1 + example/gctree.out.inference.169.svg | 1 + example/gctree.out.inference.17.nk | 1 + example/gctree.out.inference.17.svg | 1 + example/gctree.out.inference.170.nk | 1 + example/gctree.out.inference.170.svg | 1 + example/gctree.out.inference.171.nk | 1 + example/gctree.out.inference.171.svg | 1 + example/gctree.out.inference.172.nk | 1 + example/gctree.out.inference.172.svg | 1 + example/gctree.out.inference.173.nk | 1 + example/gctree.out.inference.173.svg | 1 + example/gctree.out.inference.174.nk | 1 + example/gctree.out.inference.174.svg | 1 + example/gctree.out.inference.175.nk | 1 + example/gctree.out.inference.175.svg | 1 + example/gctree.out.inference.176.nk | 1 + example/gctree.out.inference.176.svg | 1 + example/gctree.out.inference.177.nk | 1 + example/gctree.out.inference.177.svg | 1 + example/gctree.out.inference.178.nk | 1 + example/gctree.out.inference.178.svg | 1 + example/gctree.out.inference.179.nk | 1 + example/gctree.out.inference.179.svg | 1 + example/gctree.out.inference.18.nk | 1 + example/gctree.out.inference.18.svg | 1 + example/gctree.out.inference.180.nk | 1 + example/gctree.out.inference.180.svg | 1 + example/gctree.out.inference.181.nk | 1 + example/gctree.out.inference.181.svg | 1 + example/gctree.out.inference.182.nk | 1 + example/gctree.out.inference.182.svg | 1 + example/gctree.out.inference.183.nk | 1 + example/gctree.out.inference.183.svg | 1 + example/gctree.out.inference.184.nk | 1 + example/gctree.out.inference.184.svg | 1 + example/gctree.out.inference.185.nk | 1 + example/gctree.out.inference.185.svg | 1 + example/gctree.out.inference.186.nk | 1 + example/gctree.out.inference.186.svg | 1 + example/gctree.out.inference.187.nk | 1 + example/gctree.out.inference.187.svg | 1 + example/gctree.out.inference.188.nk | 1 + example/gctree.out.inference.188.svg | 1 + example/gctree.out.inference.189.nk | 1 + example/gctree.out.inference.189.svg | 1 + example/gctree.out.inference.19.nk | 1 + example/gctree.out.inference.19.svg | 1 + example/gctree.out.inference.190.nk | 1 + example/gctree.out.inference.190.svg | 1 + example/gctree.out.inference.191.nk | 1 + example/gctree.out.inference.191.svg | 1 + example/gctree.out.inference.192.nk | 1 + example/gctree.out.inference.192.svg | 1 + example/gctree.out.inference.193.nk | 1 + example/gctree.out.inference.193.svg | 1 + example/gctree.out.inference.194.nk | 1 + example/gctree.out.inference.194.svg | 1 + example/gctree.out.inference.195.nk | 1 + example/gctree.out.inference.195.svg | 1 + example/gctree.out.inference.196.nk | 1 + example/gctree.out.inference.196.svg | 1 + example/gctree.out.inference.197.nk | 1 + example/gctree.out.inference.197.svg | 1 + example/gctree.out.inference.198.nk | 1 + example/gctree.out.inference.198.svg | 1 + example/gctree.out.inference.199.nk | 1 + example/gctree.out.inference.199.svg | 1 + example/gctree.out.inference.2.nk | 1 + example/gctree.out.inference.2.svg | 1 + example/gctree.out.inference.20.nk | 1 + example/gctree.out.inference.20.svg | 1 + example/gctree.out.inference.200.nk | 1 + example/gctree.out.inference.200.svg | 1 + example/gctree.out.inference.201.nk | 1 + example/gctree.out.inference.201.svg | 1 + example/gctree.out.inference.202.nk | 1 + example/gctree.out.inference.202.svg | 1 + example/gctree.out.inference.203.nk | 1 + example/gctree.out.inference.203.svg | 1 + example/gctree.out.inference.204.nk | 1 + example/gctree.out.inference.204.svg | 1 + example/gctree.out.inference.205.nk | 1 + example/gctree.out.inference.205.svg | 1 + example/gctree.out.inference.206.nk | 1 + example/gctree.out.inference.206.svg | 1 + example/gctree.out.inference.207.nk | 1 + example/gctree.out.inference.207.svg | 1 + example/gctree.out.inference.208.nk | 1 + example/gctree.out.inference.208.svg | 1 + example/gctree.out.inference.209.nk | 1 + example/gctree.out.inference.209.svg | 1 + example/gctree.out.inference.21.nk | 1 + example/gctree.out.inference.21.svg | 1 + example/gctree.out.inference.210.nk | 1 + example/gctree.out.inference.210.svg | 1 + example/gctree.out.inference.211.nk | 1 + example/gctree.out.inference.211.svg | 1 + example/gctree.out.inference.212.nk | 1 + example/gctree.out.inference.212.svg | 1 + example/gctree.out.inference.213.nk | 1 + example/gctree.out.inference.213.svg | 1 + example/gctree.out.inference.214.nk | 1 + example/gctree.out.inference.214.svg | 1 + example/gctree.out.inference.215.nk | 1 + example/gctree.out.inference.215.svg | 1 + example/gctree.out.inference.216.nk | 1 + example/gctree.out.inference.216.svg | 1 + example/gctree.out.inference.217.nk | 1 + example/gctree.out.inference.217.svg | 1 + example/gctree.out.inference.218.nk | 1 + example/gctree.out.inference.218.svg | 1 + example/gctree.out.inference.219.nk | 1 + example/gctree.out.inference.219.svg | 1 + example/gctree.out.inference.22.nk | 1 + example/gctree.out.inference.22.svg | 1 + example/gctree.out.inference.220.nk | 1 + example/gctree.out.inference.220.svg | 1 + example/gctree.out.inference.221.nk | 1 + example/gctree.out.inference.221.svg | 1 + example/gctree.out.inference.222.nk | 1 + example/gctree.out.inference.222.svg | 1 + example/gctree.out.inference.223.nk | 1 + example/gctree.out.inference.223.svg | 1 + example/gctree.out.inference.224.nk | 1 + example/gctree.out.inference.224.svg | 1 + example/gctree.out.inference.225.nk | 1 + example/gctree.out.inference.225.svg | 1 + example/gctree.out.inference.226.nk | 1 + example/gctree.out.inference.226.svg | 1 + example/gctree.out.inference.227.nk | 1 + example/gctree.out.inference.227.svg | 1 + example/gctree.out.inference.228.nk | 1 + example/gctree.out.inference.228.svg | 1 + example/gctree.out.inference.229.nk | 1 + example/gctree.out.inference.229.svg | 1 + example/gctree.out.inference.23.nk | 1 + example/gctree.out.inference.23.svg | 1 + example/gctree.out.inference.230.nk | 1 + example/gctree.out.inference.230.svg | 1 + example/gctree.out.inference.231.nk | 1 + example/gctree.out.inference.231.svg | 1 + example/gctree.out.inference.232.nk | 1 + example/gctree.out.inference.232.svg | 1 + example/gctree.out.inference.233.nk | 1 + example/gctree.out.inference.233.svg | 1 + example/gctree.out.inference.234.nk | 1 + example/gctree.out.inference.234.svg | 1 + example/gctree.out.inference.235.nk | 1 + example/gctree.out.inference.235.svg | 1 + example/gctree.out.inference.236.nk | 1 + example/gctree.out.inference.236.svg | 1 + example/gctree.out.inference.237.nk | 1 + example/gctree.out.inference.237.svg | 1 + example/gctree.out.inference.238.nk | 1 + example/gctree.out.inference.238.svg | 1 + example/gctree.out.inference.239.nk | 1 + example/gctree.out.inference.239.svg | 1 + example/gctree.out.inference.24.nk | 1 + example/gctree.out.inference.24.svg | 1 + example/gctree.out.inference.240.nk | 1 + example/gctree.out.inference.240.svg | 1 + example/gctree.out.inference.241.nk | 1 + example/gctree.out.inference.241.svg | 1 + example/gctree.out.inference.242.nk | 1 + example/gctree.out.inference.242.svg | 1 + example/gctree.out.inference.243.nk | 1 + example/gctree.out.inference.243.svg | 1 + example/gctree.out.inference.244.nk | 1 + example/gctree.out.inference.244.svg | 1 + example/gctree.out.inference.245.nk | 1 + example/gctree.out.inference.245.svg | 1 + example/gctree.out.inference.246.nk | 1 + example/gctree.out.inference.246.svg | 1 + example/gctree.out.inference.247.nk | 1 + example/gctree.out.inference.247.svg | 1 + example/gctree.out.inference.248.nk | 1 + example/gctree.out.inference.248.svg | 1 + example/gctree.out.inference.249.nk | 1 + example/gctree.out.inference.249.svg | 1 + example/gctree.out.inference.25.nk | 1 + example/gctree.out.inference.25.svg | 1 + example/gctree.out.inference.250.nk | 1 + example/gctree.out.inference.250.svg | 1 + example/gctree.out.inference.251.nk | 1 + example/gctree.out.inference.251.svg | 1 + example/gctree.out.inference.252.nk | 1 + example/gctree.out.inference.252.svg | 1 + example/gctree.out.inference.253.nk | 1 + example/gctree.out.inference.253.svg | 1 + example/gctree.out.inference.254.nk | 1 + example/gctree.out.inference.254.svg | 1 + example/gctree.out.inference.255.nk | 1 + example/gctree.out.inference.255.svg | 1 + example/gctree.out.inference.256.nk | 1 + example/gctree.out.inference.256.svg | 1 + example/gctree.out.inference.257.nk | 1 + example/gctree.out.inference.257.svg | 1 + example/gctree.out.inference.258.nk | 1 + example/gctree.out.inference.258.svg | 1 + example/gctree.out.inference.259.nk | 1 + example/gctree.out.inference.259.svg | 1 + example/gctree.out.inference.26.nk | 1 + example/gctree.out.inference.26.svg | 1 + example/gctree.out.inference.260.nk | 1 + example/gctree.out.inference.260.svg | 1 + example/gctree.out.inference.261.nk | 1 + example/gctree.out.inference.261.svg | 1 + example/gctree.out.inference.262.nk | 1 + example/gctree.out.inference.262.svg | 1 + example/gctree.out.inference.263.nk | 1 + example/gctree.out.inference.263.svg | 1 + example/gctree.out.inference.264.nk | 1 + example/gctree.out.inference.264.svg | 1 + example/gctree.out.inference.265.nk | 1 + example/gctree.out.inference.265.svg | 1 + example/gctree.out.inference.266.nk | 1 + example/gctree.out.inference.266.svg | 1 + example/gctree.out.inference.267.nk | 1 + example/gctree.out.inference.267.svg | 1 + example/gctree.out.inference.268.nk | 1 + example/gctree.out.inference.268.svg | 1 + example/gctree.out.inference.269.nk | 1 + example/gctree.out.inference.269.svg | 1 + example/gctree.out.inference.27.nk | 1 + example/gctree.out.inference.27.svg | 1 + example/gctree.out.inference.270.nk | 1 + example/gctree.out.inference.270.svg | 1 + example/gctree.out.inference.271.nk | 1 + example/gctree.out.inference.271.svg | 1 + example/gctree.out.inference.272.nk | 1 + example/gctree.out.inference.272.svg | 1 + example/gctree.out.inference.273.nk | 1 + example/gctree.out.inference.273.svg | 1 + example/gctree.out.inference.274.nk | 1 + example/gctree.out.inference.274.svg | 1 + example/gctree.out.inference.275.nk | 1 + example/gctree.out.inference.275.svg | 1 + example/gctree.out.inference.276.nk | 1 + example/gctree.out.inference.276.svg | 1 + example/gctree.out.inference.277.nk | 1 + example/gctree.out.inference.277.svg | 1 + example/gctree.out.inference.278.nk | 1 + example/gctree.out.inference.278.svg | 1 + example/gctree.out.inference.279.nk | 1 + example/gctree.out.inference.279.svg | 1 + example/gctree.out.inference.28.nk | 1 + example/gctree.out.inference.28.svg | 1 + example/gctree.out.inference.280.nk | 1 + example/gctree.out.inference.280.svg | 1 + example/gctree.out.inference.281.nk | 1 + example/gctree.out.inference.281.svg | 1 + example/gctree.out.inference.282.nk | 1 + example/gctree.out.inference.282.svg | 1 + example/gctree.out.inference.283.nk | 1 + example/gctree.out.inference.283.svg | 1 + example/gctree.out.inference.284.nk | 1 + example/gctree.out.inference.284.svg | 1 + example/gctree.out.inference.285.nk | 1 + example/gctree.out.inference.285.svg | 1 + example/gctree.out.inference.286.nk | 1 + example/gctree.out.inference.286.svg | 1 + example/gctree.out.inference.287.nk | 1 + example/gctree.out.inference.287.svg | 1 + example/gctree.out.inference.288.nk | 1 + example/gctree.out.inference.288.svg | 1 + example/gctree.out.inference.289.nk | 1 + example/gctree.out.inference.289.svg | 1 + example/gctree.out.inference.29.nk | 1 + example/gctree.out.inference.29.svg | 1 + example/gctree.out.inference.290.nk | 1 + example/gctree.out.inference.290.svg | 1 + example/gctree.out.inference.291.nk | 1 + example/gctree.out.inference.291.svg | 1 + example/gctree.out.inference.292.nk | 1 + example/gctree.out.inference.292.svg | 1 + example/gctree.out.inference.293.nk | 1 + example/gctree.out.inference.293.svg | 1 + example/gctree.out.inference.294.nk | 1 + example/gctree.out.inference.294.svg | 1 + example/gctree.out.inference.295.nk | 1 + example/gctree.out.inference.295.svg | 1 + example/gctree.out.inference.296.nk | 1 + example/gctree.out.inference.296.svg | 1 + example/gctree.out.inference.3.nk | 1 + example/gctree.out.inference.3.svg | 1 + example/gctree.out.inference.30.nk | 1 + example/gctree.out.inference.30.svg | 1 + example/gctree.out.inference.31.nk | 1 + example/gctree.out.inference.31.svg | 1 + example/gctree.out.inference.32.nk | 1 + example/gctree.out.inference.32.svg | 1 + example/gctree.out.inference.33.nk | 1 + example/gctree.out.inference.33.svg | 1 + example/gctree.out.inference.34.nk | 1 + example/gctree.out.inference.34.svg | 1 + example/gctree.out.inference.35.nk | 1 + example/gctree.out.inference.35.svg | 1 + example/gctree.out.inference.36.nk | 1 + example/gctree.out.inference.36.svg | 1 + example/gctree.out.inference.37.nk | 1 + example/gctree.out.inference.37.svg | 1 + example/gctree.out.inference.38.nk | 1 + example/gctree.out.inference.38.svg | 1 + example/gctree.out.inference.39.nk | 1 + example/gctree.out.inference.39.svg | 1 + example/gctree.out.inference.4.nk | 1 + example/gctree.out.inference.4.svg | 1 + example/gctree.out.inference.40.nk | 1 + example/gctree.out.inference.40.svg | 1 + example/gctree.out.inference.41.nk | 1 + example/gctree.out.inference.41.svg | 1 + example/gctree.out.inference.42.nk | 1 + example/gctree.out.inference.42.svg | 1 + example/gctree.out.inference.43.nk | 1 + example/gctree.out.inference.43.svg | 1 + example/gctree.out.inference.44.nk | 1 + example/gctree.out.inference.44.svg | 1 + example/gctree.out.inference.45.nk | 1 + example/gctree.out.inference.45.svg | 1 + example/gctree.out.inference.46.nk | 1 + example/gctree.out.inference.46.svg | 1 + example/gctree.out.inference.47.nk | 1 + example/gctree.out.inference.47.svg | 1 + example/gctree.out.inference.48.nk | 1 + example/gctree.out.inference.48.svg | 1 + example/gctree.out.inference.49.nk | 1 + example/gctree.out.inference.49.svg | 1 + example/gctree.out.inference.5.nk | 1 + example/gctree.out.inference.5.svg | 1 + example/gctree.out.inference.50.nk | 1 + example/gctree.out.inference.50.svg | 1 + example/gctree.out.inference.51.nk | 1 + example/gctree.out.inference.51.svg | 1 + example/gctree.out.inference.52.nk | 1 + example/gctree.out.inference.52.svg | 1 + example/gctree.out.inference.53.nk | 1 + example/gctree.out.inference.53.svg | 1 + example/gctree.out.inference.54.nk | 1 + example/gctree.out.inference.54.svg | 1 + example/gctree.out.inference.55.nk | 1 + example/gctree.out.inference.55.svg | 1 + example/gctree.out.inference.56.nk | 1 + example/gctree.out.inference.56.svg | 1 + example/gctree.out.inference.57.nk | 1 + example/gctree.out.inference.57.svg | 1 + example/gctree.out.inference.58.nk | 1 + example/gctree.out.inference.58.svg | 1 + example/gctree.out.inference.59.nk | 1 + example/gctree.out.inference.59.svg | 1 + example/gctree.out.inference.6.nk | 1 + example/gctree.out.inference.6.svg | 1 + example/gctree.out.inference.60.nk | 1 + example/gctree.out.inference.60.svg | 1 + example/gctree.out.inference.61.nk | 1 + example/gctree.out.inference.61.svg | 1 + example/gctree.out.inference.62.nk | 1 + example/gctree.out.inference.62.svg | 1 + example/gctree.out.inference.63.nk | 1 + example/gctree.out.inference.63.svg | 1 + example/gctree.out.inference.64.nk | 1 + example/gctree.out.inference.64.svg | 1 + example/gctree.out.inference.65.nk | 1 + example/gctree.out.inference.65.svg | 1 + example/gctree.out.inference.66.nk | 1 + example/gctree.out.inference.66.svg | 1 + example/gctree.out.inference.67.nk | 1 + example/gctree.out.inference.67.svg | 1 + example/gctree.out.inference.68.nk | 1 + example/gctree.out.inference.68.svg | 1 + example/gctree.out.inference.69.nk | 1 + example/gctree.out.inference.69.svg | 1 + example/gctree.out.inference.7.nk | 1 + example/gctree.out.inference.7.svg | 1 + example/gctree.out.inference.70.nk | 1 + example/gctree.out.inference.70.svg | 1 + example/gctree.out.inference.71.nk | 1 + example/gctree.out.inference.71.svg | 1 + example/gctree.out.inference.72.nk | 1 + example/gctree.out.inference.72.svg | 1 + example/gctree.out.inference.73.nk | 1 + example/gctree.out.inference.73.svg | 1 + example/gctree.out.inference.74.nk | 1 + example/gctree.out.inference.74.svg | 1 + example/gctree.out.inference.75.nk | 1 + example/gctree.out.inference.75.svg | 1 + example/gctree.out.inference.76.nk | 1 + example/gctree.out.inference.76.svg | 1 + example/gctree.out.inference.77.nk | 1 + example/gctree.out.inference.77.svg | 1 + example/gctree.out.inference.78.nk | 1 + example/gctree.out.inference.78.svg | 1 + example/gctree.out.inference.79.nk | 1 + example/gctree.out.inference.79.svg | 1 + example/gctree.out.inference.8.nk | 1 + example/gctree.out.inference.8.svg | 1 + example/gctree.out.inference.80.nk | 1 + example/gctree.out.inference.80.svg | 1 + example/gctree.out.inference.81.nk | 1 + example/gctree.out.inference.81.svg | 1 + example/gctree.out.inference.82.nk | 1 + example/gctree.out.inference.82.svg | 1 + example/gctree.out.inference.83.nk | 1 + example/gctree.out.inference.83.svg | 1 + example/gctree.out.inference.84.nk | 1 + example/gctree.out.inference.84.svg | 1 + example/gctree.out.inference.85.nk | 1 + example/gctree.out.inference.85.svg | 1 + example/gctree.out.inference.86.nk | 1 + example/gctree.out.inference.86.svg | 1 + example/gctree.out.inference.87.nk | 1 + example/gctree.out.inference.87.svg | 1 + example/gctree.out.inference.88.nk | 1 + example/gctree.out.inference.88.svg | 1 + example/gctree.out.inference.89.nk | 1 + example/gctree.out.inference.89.svg | 1 + example/gctree.out.inference.9.nk | 1 + example/gctree.out.inference.9.svg | 1 + example/gctree.out.inference.90.nk | 1 + example/gctree.out.inference.90.svg | 1 + example/gctree.out.inference.91.nk | 1 + example/gctree.out.inference.91.svg | 1 + example/gctree.out.inference.92.nk | 1 + example/gctree.out.inference.92.svg | 1 + example/gctree.out.inference.93.nk | 1 + example/gctree.out.inference.93.svg | 1 + example/gctree.out.inference.94.nk | 1 + example/gctree.out.inference.94.svg | 1 + example/gctree.out.inference.95.nk | 1 + example/gctree.out.inference.95.svg | 1 + example/gctree.out.inference.96.nk | 1 + example/gctree.out.inference.96.svg | 1 + example/gctree.out.inference.97.nk | 1 + example/gctree.out.inference.97.svg | 1 + example/gctree.out.inference.98.nk | 1 + example/gctree.out.inference.98.svg | 1 + example/gctree.out.inference.99.nk | 1 + example/gctree.out.inference.99.svg | 1 + .../gctree.out.inference.abundance_rank.svg | 1122 + .../gctree.out.inference.likelihood_rank.svg | 1205 + .../gctree.out.inference.parsimony_forest.p | Bin 0 -> 5386767 bytes example/outfile | 214761 +++++++++++++++ example/outtree | 3901 + 604 files changed, 221899 insertions(+), 1 deletion(-) create mode 100644 example/abundances.csv create mode 100644 example/deduplicated.phylip create mode 100644 example/dnapars.cfg delete mode 100644 example/gc1.png delete mode 100644 example/gctree.inference.1.svg delete mode 100644 example/gctree.inference.abundance_rank.png delete mode 100644 example/gctree.inference.likelihood_rank.png create mode 100644 example/gctree.out.inference.1.nk create mode 100644 example/gctree.out.inference.1.svg create mode 100644 example/gctree.out.inference.10.nk create mode 100644 example/gctree.out.inference.10.svg create mode 100644 example/gctree.out.inference.100.nk create mode 100644 example/gctree.out.inference.100.svg create mode 100644 example/gctree.out.inference.101.nk create mode 100644 example/gctree.out.inference.101.svg create mode 100644 example/gctree.out.inference.102.nk create mode 100644 example/gctree.out.inference.102.svg create mode 100644 example/gctree.out.inference.103.nk create mode 100644 example/gctree.out.inference.103.svg create mode 100644 example/gctree.out.inference.104.nk create mode 100644 example/gctree.out.inference.104.svg create mode 100644 example/gctree.out.inference.105.nk create mode 100644 example/gctree.out.inference.105.svg create mode 100644 example/gctree.out.inference.106.nk create mode 100644 example/gctree.out.inference.106.svg create mode 100644 example/gctree.out.inference.107.nk create mode 100644 example/gctree.out.inference.107.svg create mode 100644 example/gctree.out.inference.108.nk create mode 100644 example/gctree.out.inference.108.svg create mode 100644 example/gctree.out.inference.109.nk create mode 100644 example/gctree.out.inference.109.svg create mode 100644 example/gctree.out.inference.11.nk create mode 100644 example/gctree.out.inference.11.svg create mode 100644 example/gctree.out.inference.110.nk create mode 100644 example/gctree.out.inference.110.svg create mode 100644 example/gctree.out.inference.111.nk create mode 100644 example/gctree.out.inference.111.svg create mode 100644 example/gctree.out.inference.112.nk create mode 100644 example/gctree.out.inference.112.svg create mode 100644 example/gctree.out.inference.113.nk create mode 100644 example/gctree.out.inference.113.svg create mode 100644 example/gctree.out.inference.114.nk create mode 100644 example/gctree.out.inference.114.svg create mode 100644 example/gctree.out.inference.115.nk create mode 100644 example/gctree.out.inference.115.svg create mode 100644 example/gctree.out.inference.116.nk create mode 100644 example/gctree.out.inference.116.svg create mode 100644 example/gctree.out.inference.117.nk create mode 100644 example/gctree.out.inference.117.svg create mode 100644 example/gctree.out.inference.118.nk create mode 100644 example/gctree.out.inference.118.svg create mode 100644 example/gctree.out.inference.119.nk create mode 100644 example/gctree.out.inference.119.svg create mode 100644 example/gctree.out.inference.12.nk create mode 100644 example/gctree.out.inference.12.svg create mode 100644 example/gctree.out.inference.120.nk create mode 100644 example/gctree.out.inference.120.svg create mode 100644 example/gctree.out.inference.121.nk create mode 100644 example/gctree.out.inference.121.svg create mode 100644 example/gctree.out.inference.122.nk create mode 100644 example/gctree.out.inference.122.svg create mode 100644 example/gctree.out.inference.123.nk create mode 100644 example/gctree.out.inference.123.svg create mode 100644 example/gctree.out.inference.124.nk create mode 100644 example/gctree.out.inference.124.svg create mode 100644 example/gctree.out.inference.125.nk create mode 100644 example/gctree.out.inference.125.svg create mode 100644 example/gctree.out.inference.126.nk create mode 100644 example/gctree.out.inference.126.svg create mode 100644 example/gctree.out.inference.127.nk create mode 100644 example/gctree.out.inference.127.svg create mode 100644 example/gctree.out.inference.128.nk create mode 100644 example/gctree.out.inference.128.svg create mode 100644 example/gctree.out.inference.129.nk create mode 100644 example/gctree.out.inference.129.svg create mode 100644 example/gctree.out.inference.13.nk create mode 100644 example/gctree.out.inference.13.svg create mode 100644 example/gctree.out.inference.130.nk create mode 100644 example/gctree.out.inference.130.svg create mode 100644 example/gctree.out.inference.131.nk create mode 100644 example/gctree.out.inference.131.svg create mode 100644 example/gctree.out.inference.132.nk create mode 100644 example/gctree.out.inference.132.svg create mode 100644 example/gctree.out.inference.133.nk create mode 100644 example/gctree.out.inference.133.svg create mode 100644 example/gctree.out.inference.134.nk create mode 100644 example/gctree.out.inference.134.svg create mode 100644 example/gctree.out.inference.135.nk create mode 100644 example/gctree.out.inference.135.svg create mode 100644 example/gctree.out.inference.136.nk create mode 100644 example/gctree.out.inference.136.svg create mode 100644 example/gctree.out.inference.137.nk create mode 100644 example/gctree.out.inference.137.svg create mode 100644 example/gctree.out.inference.138.nk create mode 100644 example/gctree.out.inference.138.svg create mode 100644 example/gctree.out.inference.139.nk create mode 100644 example/gctree.out.inference.139.svg create mode 100644 example/gctree.out.inference.14.nk create mode 100644 example/gctree.out.inference.14.svg create mode 100644 example/gctree.out.inference.140.nk create mode 100644 example/gctree.out.inference.140.svg create mode 100644 example/gctree.out.inference.141.nk create mode 100644 example/gctree.out.inference.141.svg create mode 100644 example/gctree.out.inference.142.nk create mode 100644 example/gctree.out.inference.142.svg create mode 100644 example/gctree.out.inference.143.nk create mode 100644 example/gctree.out.inference.143.svg create mode 100644 example/gctree.out.inference.144.nk create mode 100644 example/gctree.out.inference.144.svg create mode 100644 example/gctree.out.inference.145.nk create mode 100644 example/gctree.out.inference.145.svg create mode 100644 example/gctree.out.inference.146.nk create mode 100644 example/gctree.out.inference.146.svg create mode 100644 example/gctree.out.inference.147.nk create mode 100644 example/gctree.out.inference.147.svg create mode 100644 example/gctree.out.inference.148.nk create mode 100644 example/gctree.out.inference.148.svg create mode 100644 example/gctree.out.inference.149.nk create mode 100644 example/gctree.out.inference.149.svg create mode 100644 example/gctree.out.inference.15.nk create mode 100644 example/gctree.out.inference.15.svg create mode 100644 example/gctree.out.inference.150.nk create mode 100644 example/gctree.out.inference.150.svg create mode 100644 example/gctree.out.inference.151.nk create mode 100644 example/gctree.out.inference.151.svg create mode 100644 example/gctree.out.inference.152.nk create mode 100644 example/gctree.out.inference.152.svg create mode 100644 example/gctree.out.inference.153.nk create mode 100644 example/gctree.out.inference.153.svg create mode 100644 example/gctree.out.inference.154.nk create mode 100644 example/gctree.out.inference.154.svg create mode 100644 example/gctree.out.inference.155.nk create mode 100644 example/gctree.out.inference.155.svg create mode 100644 example/gctree.out.inference.156.nk create mode 100644 example/gctree.out.inference.156.svg create mode 100644 example/gctree.out.inference.157.nk create mode 100644 example/gctree.out.inference.157.svg create mode 100644 example/gctree.out.inference.158.nk create mode 100644 example/gctree.out.inference.158.svg create mode 100644 example/gctree.out.inference.159.nk create mode 100644 example/gctree.out.inference.159.svg create mode 100644 example/gctree.out.inference.16.nk create mode 100644 example/gctree.out.inference.16.svg create mode 100644 example/gctree.out.inference.160.nk create mode 100644 example/gctree.out.inference.160.svg create mode 100644 example/gctree.out.inference.161.nk create mode 100644 example/gctree.out.inference.161.svg create mode 100644 example/gctree.out.inference.162.nk create mode 100644 example/gctree.out.inference.162.svg create mode 100644 example/gctree.out.inference.163.nk create mode 100644 example/gctree.out.inference.163.svg create mode 100644 example/gctree.out.inference.164.nk create mode 100644 example/gctree.out.inference.164.svg create mode 100644 example/gctree.out.inference.165.nk create mode 100644 example/gctree.out.inference.165.svg create mode 100644 example/gctree.out.inference.166.nk create mode 100644 example/gctree.out.inference.166.svg create mode 100644 example/gctree.out.inference.167.nk create mode 100644 example/gctree.out.inference.167.svg create mode 100644 example/gctree.out.inference.168.nk create mode 100644 example/gctree.out.inference.168.svg create mode 100644 example/gctree.out.inference.169.nk create mode 100644 example/gctree.out.inference.169.svg create mode 100644 example/gctree.out.inference.17.nk create mode 100644 example/gctree.out.inference.17.svg create mode 100644 example/gctree.out.inference.170.nk create mode 100644 example/gctree.out.inference.170.svg create mode 100644 example/gctree.out.inference.171.nk create mode 100644 example/gctree.out.inference.171.svg create mode 100644 example/gctree.out.inference.172.nk create mode 100644 example/gctree.out.inference.172.svg create mode 100644 example/gctree.out.inference.173.nk create mode 100644 example/gctree.out.inference.173.svg create mode 100644 example/gctree.out.inference.174.nk create mode 100644 example/gctree.out.inference.174.svg create mode 100644 example/gctree.out.inference.175.nk create mode 100644 example/gctree.out.inference.175.svg create mode 100644 example/gctree.out.inference.176.nk create mode 100644 example/gctree.out.inference.176.svg create mode 100644 example/gctree.out.inference.177.nk create mode 100644 example/gctree.out.inference.177.svg create mode 100644 example/gctree.out.inference.178.nk create mode 100644 example/gctree.out.inference.178.svg create mode 100644 example/gctree.out.inference.179.nk create mode 100644 example/gctree.out.inference.179.svg create mode 100644 example/gctree.out.inference.18.nk create mode 100644 example/gctree.out.inference.18.svg create mode 100644 example/gctree.out.inference.180.nk create mode 100644 example/gctree.out.inference.180.svg create mode 100644 example/gctree.out.inference.181.nk create mode 100644 example/gctree.out.inference.181.svg create mode 100644 example/gctree.out.inference.182.nk create mode 100644 example/gctree.out.inference.182.svg create mode 100644 example/gctree.out.inference.183.nk create mode 100644 example/gctree.out.inference.183.svg create mode 100644 example/gctree.out.inference.184.nk create mode 100644 example/gctree.out.inference.184.svg create mode 100644 example/gctree.out.inference.185.nk create mode 100644 example/gctree.out.inference.185.svg create mode 100644 example/gctree.out.inference.186.nk create mode 100644 example/gctree.out.inference.186.svg create mode 100644 example/gctree.out.inference.187.nk create mode 100644 example/gctree.out.inference.187.svg create mode 100644 example/gctree.out.inference.188.nk create mode 100644 example/gctree.out.inference.188.svg create mode 100644 example/gctree.out.inference.189.nk create mode 100644 example/gctree.out.inference.189.svg create mode 100644 example/gctree.out.inference.19.nk create mode 100644 example/gctree.out.inference.19.svg create mode 100644 example/gctree.out.inference.190.nk create mode 100644 example/gctree.out.inference.190.svg create mode 100644 example/gctree.out.inference.191.nk create mode 100644 example/gctree.out.inference.191.svg create mode 100644 example/gctree.out.inference.192.nk create mode 100644 example/gctree.out.inference.192.svg create mode 100644 example/gctree.out.inference.193.nk create mode 100644 example/gctree.out.inference.193.svg create mode 100644 example/gctree.out.inference.194.nk create mode 100644 example/gctree.out.inference.194.svg create mode 100644 example/gctree.out.inference.195.nk create mode 100644 example/gctree.out.inference.195.svg create mode 100644 example/gctree.out.inference.196.nk create mode 100644 example/gctree.out.inference.196.svg create mode 100644 example/gctree.out.inference.197.nk create mode 100644 example/gctree.out.inference.197.svg create mode 100644 example/gctree.out.inference.198.nk create mode 100644 example/gctree.out.inference.198.svg create mode 100644 example/gctree.out.inference.199.nk create mode 100644 example/gctree.out.inference.199.svg create mode 100644 example/gctree.out.inference.2.nk create mode 100644 example/gctree.out.inference.2.svg create mode 100644 example/gctree.out.inference.20.nk create mode 100644 example/gctree.out.inference.20.svg create mode 100644 example/gctree.out.inference.200.nk create mode 100644 example/gctree.out.inference.200.svg create mode 100644 example/gctree.out.inference.201.nk create mode 100644 example/gctree.out.inference.201.svg create mode 100644 example/gctree.out.inference.202.nk create mode 100644 example/gctree.out.inference.202.svg create mode 100644 example/gctree.out.inference.203.nk create mode 100644 example/gctree.out.inference.203.svg create mode 100644 example/gctree.out.inference.204.nk create mode 100644 example/gctree.out.inference.204.svg create mode 100644 example/gctree.out.inference.205.nk create mode 100644 example/gctree.out.inference.205.svg create mode 100644 example/gctree.out.inference.206.nk create mode 100644 example/gctree.out.inference.206.svg create mode 100644 example/gctree.out.inference.207.nk create mode 100644 example/gctree.out.inference.207.svg create mode 100644 example/gctree.out.inference.208.nk create mode 100644 example/gctree.out.inference.208.svg create mode 100644 example/gctree.out.inference.209.nk create mode 100644 example/gctree.out.inference.209.svg create mode 100644 example/gctree.out.inference.21.nk create mode 100644 example/gctree.out.inference.21.svg create mode 100644 example/gctree.out.inference.210.nk create mode 100644 example/gctree.out.inference.210.svg create mode 100644 example/gctree.out.inference.211.nk create mode 100644 example/gctree.out.inference.211.svg create mode 100644 example/gctree.out.inference.212.nk create mode 100644 example/gctree.out.inference.212.svg create mode 100644 example/gctree.out.inference.213.nk create mode 100644 example/gctree.out.inference.213.svg create mode 100644 example/gctree.out.inference.214.nk create mode 100644 example/gctree.out.inference.214.svg create mode 100644 example/gctree.out.inference.215.nk create mode 100644 example/gctree.out.inference.215.svg create mode 100644 example/gctree.out.inference.216.nk create mode 100644 example/gctree.out.inference.216.svg create mode 100644 example/gctree.out.inference.217.nk create mode 100644 example/gctree.out.inference.217.svg create mode 100644 example/gctree.out.inference.218.nk create mode 100644 example/gctree.out.inference.218.svg create mode 100644 example/gctree.out.inference.219.nk create mode 100644 example/gctree.out.inference.219.svg create mode 100644 example/gctree.out.inference.22.nk create mode 100644 example/gctree.out.inference.22.svg create mode 100644 example/gctree.out.inference.220.nk create mode 100644 example/gctree.out.inference.220.svg create mode 100644 example/gctree.out.inference.221.nk create mode 100644 example/gctree.out.inference.221.svg create mode 100644 example/gctree.out.inference.222.nk create mode 100644 example/gctree.out.inference.222.svg create mode 100644 example/gctree.out.inference.223.nk create mode 100644 example/gctree.out.inference.223.svg create mode 100644 example/gctree.out.inference.224.nk create mode 100644 example/gctree.out.inference.224.svg create mode 100644 example/gctree.out.inference.225.nk create mode 100644 example/gctree.out.inference.225.svg create mode 100644 example/gctree.out.inference.226.nk create mode 100644 example/gctree.out.inference.226.svg create mode 100644 example/gctree.out.inference.227.nk create mode 100644 example/gctree.out.inference.227.svg create mode 100644 example/gctree.out.inference.228.nk create mode 100644 example/gctree.out.inference.228.svg create mode 100644 example/gctree.out.inference.229.nk create mode 100644 example/gctree.out.inference.229.svg create mode 100644 example/gctree.out.inference.23.nk create mode 100644 example/gctree.out.inference.23.svg create mode 100644 example/gctree.out.inference.230.nk create mode 100644 example/gctree.out.inference.230.svg create mode 100644 example/gctree.out.inference.231.nk create mode 100644 example/gctree.out.inference.231.svg create mode 100644 example/gctree.out.inference.232.nk create mode 100644 example/gctree.out.inference.232.svg create mode 100644 example/gctree.out.inference.233.nk create mode 100644 example/gctree.out.inference.233.svg create mode 100644 example/gctree.out.inference.234.nk create mode 100644 example/gctree.out.inference.234.svg create mode 100644 example/gctree.out.inference.235.nk create mode 100644 example/gctree.out.inference.235.svg create mode 100644 example/gctree.out.inference.236.nk create mode 100644 example/gctree.out.inference.236.svg create mode 100644 example/gctree.out.inference.237.nk create mode 100644 example/gctree.out.inference.237.svg create mode 100644 example/gctree.out.inference.238.nk create mode 100644 example/gctree.out.inference.238.svg create mode 100644 example/gctree.out.inference.239.nk create mode 100644 example/gctree.out.inference.239.svg create mode 100644 example/gctree.out.inference.24.nk create mode 100644 example/gctree.out.inference.24.svg create mode 100644 example/gctree.out.inference.240.nk create mode 100644 example/gctree.out.inference.240.svg create mode 100644 example/gctree.out.inference.241.nk create mode 100644 example/gctree.out.inference.241.svg create mode 100644 example/gctree.out.inference.242.nk create mode 100644 example/gctree.out.inference.242.svg create mode 100644 example/gctree.out.inference.243.nk create mode 100644 example/gctree.out.inference.243.svg create mode 100644 example/gctree.out.inference.244.nk create mode 100644 example/gctree.out.inference.244.svg create mode 100644 example/gctree.out.inference.245.nk create mode 100644 example/gctree.out.inference.245.svg create mode 100644 example/gctree.out.inference.246.nk create mode 100644 example/gctree.out.inference.246.svg create mode 100644 example/gctree.out.inference.247.nk create mode 100644 example/gctree.out.inference.247.svg create mode 100644 example/gctree.out.inference.248.nk create mode 100644 example/gctree.out.inference.248.svg create mode 100644 example/gctree.out.inference.249.nk create mode 100644 example/gctree.out.inference.249.svg create mode 100644 example/gctree.out.inference.25.nk create mode 100644 example/gctree.out.inference.25.svg create mode 100644 example/gctree.out.inference.250.nk create mode 100644 example/gctree.out.inference.250.svg create mode 100644 example/gctree.out.inference.251.nk create mode 100644 example/gctree.out.inference.251.svg create mode 100644 example/gctree.out.inference.252.nk create mode 100644 example/gctree.out.inference.252.svg create mode 100644 example/gctree.out.inference.253.nk create mode 100644 example/gctree.out.inference.253.svg create mode 100644 example/gctree.out.inference.254.nk create mode 100644 example/gctree.out.inference.254.svg create mode 100644 example/gctree.out.inference.255.nk create mode 100644 example/gctree.out.inference.255.svg create mode 100644 example/gctree.out.inference.256.nk create mode 100644 example/gctree.out.inference.256.svg create mode 100644 example/gctree.out.inference.257.nk create mode 100644 example/gctree.out.inference.257.svg create mode 100644 example/gctree.out.inference.258.nk create mode 100644 example/gctree.out.inference.258.svg create mode 100644 example/gctree.out.inference.259.nk create mode 100644 example/gctree.out.inference.259.svg create mode 100644 example/gctree.out.inference.26.nk create mode 100644 example/gctree.out.inference.26.svg create mode 100644 example/gctree.out.inference.260.nk create mode 100644 example/gctree.out.inference.260.svg create mode 100644 example/gctree.out.inference.261.nk create mode 100644 example/gctree.out.inference.261.svg create mode 100644 example/gctree.out.inference.262.nk create mode 100644 example/gctree.out.inference.262.svg create mode 100644 example/gctree.out.inference.263.nk create mode 100644 example/gctree.out.inference.263.svg create mode 100644 example/gctree.out.inference.264.nk create mode 100644 example/gctree.out.inference.264.svg create mode 100644 example/gctree.out.inference.265.nk create mode 100644 example/gctree.out.inference.265.svg create mode 100644 example/gctree.out.inference.266.nk create mode 100644 example/gctree.out.inference.266.svg create mode 100644 example/gctree.out.inference.267.nk create mode 100644 example/gctree.out.inference.267.svg create mode 100644 example/gctree.out.inference.268.nk create mode 100644 example/gctree.out.inference.268.svg create mode 100644 example/gctree.out.inference.269.nk create mode 100644 example/gctree.out.inference.269.svg create mode 100644 example/gctree.out.inference.27.nk create mode 100644 example/gctree.out.inference.27.svg create mode 100644 example/gctree.out.inference.270.nk create mode 100644 example/gctree.out.inference.270.svg create mode 100644 example/gctree.out.inference.271.nk create mode 100644 example/gctree.out.inference.271.svg create mode 100644 example/gctree.out.inference.272.nk create mode 100644 example/gctree.out.inference.272.svg create mode 100644 example/gctree.out.inference.273.nk create mode 100644 example/gctree.out.inference.273.svg create mode 100644 example/gctree.out.inference.274.nk create mode 100644 example/gctree.out.inference.274.svg create mode 100644 example/gctree.out.inference.275.nk create mode 100644 example/gctree.out.inference.275.svg create mode 100644 example/gctree.out.inference.276.nk create mode 100644 example/gctree.out.inference.276.svg create mode 100644 example/gctree.out.inference.277.nk create mode 100644 example/gctree.out.inference.277.svg create mode 100644 example/gctree.out.inference.278.nk create mode 100644 example/gctree.out.inference.278.svg create mode 100644 example/gctree.out.inference.279.nk create mode 100644 example/gctree.out.inference.279.svg create mode 100644 example/gctree.out.inference.28.nk create mode 100644 example/gctree.out.inference.28.svg create mode 100644 example/gctree.out.inference.280.nk create mode 100644 example/gctree.out.inference.280.svg create mode 100644 example/gctree.out.inference.281.nk create mode 100644 example/gctree.out.inference.281.svg create mode 100644 example/gctree.out.inference.282.nk create mode 100644 example/gctree.out.inference.282.svg create mode 100644 example/gctree.out.inference.283.nk create mode 100644 example/gctree.out.inference.283.svg create mode 100644 example/gctree.out.inference.284.nk create mode 100644 example/gctree.out.inference.284.svg create mode 100644 example/gctree.out.inference.285.nk create mode 100644 example/gctree.out.inference.285.svg create mode 100644 example/gctree.out.inference.286.nk create mode 100644 example/gctree.out.inference.286.svg create mode 100644 example/gctree.out.inference.287.nk create mode 100644 example/gctree.out.inference.287.svg create mode 100644 example/gctree.out.inference.288.nk create mode 100644 example/gctree.out.inference.288.svg create mode 100644 example/gctree.out.inference.289.nk create mode 100644 example/gctree.out.inference.289.svg create mode 100644 example/gctree.out.inference.29.nk create mode 100644 example/gctree.out.inference.29.svg create mode 100644 example/gctree.out.inference.290.nk create mode 100644 example/gctree.out.inference.290.svg create mode 100644 example/gctree.out.inference.291.nk create mode 100644 example/gctree.out.inference.291.svg create mode 100644 example/gctree.out.inference.292.nk create mode 100644 example/gctree.out.inference.292.svg create mode 100644 example/gctree.out.inference.293.nk create mode 100644 example/gctree.out.inference.293.svg create mode 100644 example/gctree.out.inference.294.nk create mode 100644 example/gctree.out.inference.294.svg create mode 100644 example/gctree.out.inference.295.nk create mode 100644 example/gctree.out.inference.295.svg create mode 100644 example/gctree.out.inference.296.nk create mode 100644 example/gctree.out.inference.296.svg create mode 100644 example/gctree.out.inference.3.nk create mode 100644 example/gctree.out.inference.3.svg create mode 100644 example/gctree.out.inference.30.nk create mode 100644 example/gctree.out.inference.30.svg create mode 100644 example/gctree.out.inference.31.nk create mode 100644 example/gctree.out.inference.31.svg create mode 100644 example/gctree.out.inference.32.nk create mode 100644 example/gctree.out.inference.32.svg create mode 100644 example/gctree.out.inference.33.nk create mode 100644 example/gctree.out.inference.33.svg create mode 100644 example/gctree.out.inference.34.nk create mode 100644 example/gctree.out.inference.34.svg create mode 100644 example/gctree.out.inference.35.nk create mode 100644 example/gctree.out.inference.35.svg create mode 100644 example/gctree.out.inference.36.nk create mode 100644 example/gctree.out.inference.36.svg create mode 100644 example/gctree.out.inference.37.nk create mode 100644 example/gctree.out.inference.37.svg create mode 100644 example/gctree.out.inference.38.nk create mode 100644 example/gctree.out.inference.38.svg create mode 100644 example/gctree.out.inference.39.nk create mode 100644 example/gctree.out.inference.39.svg create mode 100644 example/gctree.out.inference.4.nk create mode 100644 example/gctree.out.inference.4.svg create mode 100644 example/gctree.out.inference.40.nk create mode 100644 example/gctree.out.inference.40.svg create mode 100644 example/gctree.out.inference.41.nk create mode 100644 example/gctree.out.inference.41.svg create mode 100644 example/gctree.out.inference.42.nk create mode 100644 example/gctree.out.inference.42.svg create mode 100644 example/gctree.out.inference.43.nk create mode 100644 example/gctree.out.inference.43.svg create mode 100644 example/gctree.out.inference.44.nk create mode 100644 example/gctree.out.inference.44.svg create mode 100644 example/gctree.out.inference.45.nk create mode 100644 example/gctree.out.inference.45.svg create mode 100644 example/gctree.out.inference.46.nk create mode 100644 example/gctree.out.inference.46.svg create mode 100644 example/gctree.out.inference.47.nk create mode 100644 example/gctree.out.inference.47.svg create mode 100644 example/gctree.out.inference.48.nk create mode 100644 example/gctree.out.inference.48.svg create mode 100644 example/gctree.out.inference.49.nk create mode 100644 example/gctree.out.inference.49.svg create mode 100644 example/gctree.out.inference.5.nk create mode 100644 example/gctree.out.inference.5.svg create mode 100644 example/gctree.out.inference.50.nk create mode 100644 example/gctree.out.inference.50.svg create mode 100644 example/gctree.out.inference.51.nk create mode 100644 example/gctree.out.inference.51.svg create mode 100644 example/gctree.out.inference.52.nk create mode 100644 example/gctree.out.inference.52.svg create mode 100644 example/gctree.out.inference.53.nk create mode 100644 example/gctree.out.inference.53.svg create mode 100644 example/gctree.out.inference.54.nk create mode 100644 example/gctree.out.inference.54.svg create mode 100644 example/gctree.out.inference.55.nk create mode 100644 example/gctree.out.inference.55.svg create mode 100644 example/gctree.out.inference.56.nk create mode 100644 example/gctree.out.inference.56.svg create mode 100644 example/gctree.out.inference.57.nk create mode 100644 example/gctree.out.inference.57.svg create mode 100644 example/gctree.out.inference.58.nk create mode 100644 example/gctree.out.inference.58.svg create mode 100644 example/gctree.out.inference.59.nk create mode 100644 example/gctree.out.inference.59.svg create mode 100644 example/gctree.out.inference.6.nk create mode 100644 example/gctree.out.inference.6.svg create mode 100644 example/gctree.out.inference.60.nk create mode 100644 example/gctree.out.inference.60.svg create mode 100644 example/gctree.out.inference.61.nk create mode 100644 example/gctree.out.inference.61.svg create mode 100644 example/gctree.out.inference.62.nk create mode 100644 example/gctree.out.inference.62.svg create mode 100644 example/gctree.out.inference.63.nk create mode 100644 example/gctree.out.inference.63.svg create mode 100644 example/gctree.out.inference.64.nk create mode 100644 example/gctree.out.inference.64.svg create mode 100644 example/gctree.out.inference.65.nk create mode 100644 example/gctree.out.inference.65.svg create mode 100644 example/gctree.out.inference.66.nk create mode 100644 example/gctree.out.inference.66.svg create mode 100644 example/gctree.out.inference.67.nk create mode 100644 example/gctree.out.inference.67.svg create mode 100644 example/gctree.out.inference.68.nk create mode 100644 example/gctree.out.inference.68.svg create mode 100644 example/gctree.out.inference.69.nk create mode 100644 example/gctree.out.inference.69.svg create mode 100644 example/gctree.out.inference.7.nk create mode 100644 example/gctree.out.inference.7.svg create mode 100644 example/gctree.out.inference.70.nk create mode 100644 example/gctree.out.inference.70.svg create mode 100644 example/gctree.out.inference.71.nk create mode 100644 example/gctree.out.inference.71.svg create mode 100644 example/gctree.out.inference.72.nk create mode 100644 example/gctree.out.inference.72.svg create mode 100644 example/gctree.out.inference.73.nk create mode 100644 example/gctree.out.inference.73.svg create mode 100644 example/gctree.out.inference.74.nk create mode 100644 example/gctree.out.inference.74.svg create mode 100644 example/gctree.out.inference.75.nk create mode 100644 example/gctree.out.inference.75.svg create mode 100644 example/gctree.out.inference.76.nk create mode 100644 example/gctree.out.inference.76.svg create mode 100644 example/gctree.out.inference.77.nk create mode 100644 example/gctree.out.inference.77.svg create mode 100644 example/gctree.out.inference.78.nk create mode 100644 example/gctree.out.inference.78.svg create mode 100644 example/gctree.out.inference.79.nk create mode 100644 example/gctree.out.inference.79.svg create mode 100644 example/gctree.out.inference.8.nk create mode 100644 example/gctree.out.inference.8.svg create mode 100644 example/gctree.out.inference.80.nk create mode 100644 example/gctree.out.inference.80.svg create mode 100644 example/gctree.out.inference.81.nk create mode 100644 example/gctree.out.inference.81.svg create mode 100644 example/gctree.out.inference.82.nk create mode 100644 example/gctree.out.inference.82.svg create mode 100644 example/gctree.out.inference.83.nk create mode 100644 example/gctree.out.inference.83.svg create mode 100644 example/gctree.out.inference.84.nk create mode 100644 example/gctree.out.inference.84.svg create mode 100644 example/gctree.out.inference.85.nk create mode 100644 example/gctree.out.inference.85.svg create mode 100644 example/gctree.out.inference.86.nk create mode 100644 example/gctree.out.inference.86.svg create mode 100644 example/gctree.out.inference.87.nk create mode 100644 example/gctree.out.inference.87.svg create mode 100644 example/gctree.out.inference.88.nk create mode 100644 example/gctree.out.inference.88.svg create mode 100644 example/gctree.out.inference.89.nk create mode 100644 example/gctree.out.inference.89.svg create mode 100644 example/gctree.out.inference.9.nk create mode 100644 example/gctree.out.inference.9.svg create mode 100644 example/gctree.out.inference.90.nk create mode 100644 example/gctree.out.inference.90.svg create mode 100644 example/gctree.out.inference.91.nk create mode 100644 example/gctree.out.inference.91.svg create mode 100644 example/gctree.out.inference.92.nk create mode 100644 example/gctree.out.inference.92.svg create mode 100644 example/gctree.out.inference.93.nk create mode 100644 example/gctree.out.inference.93.svg create mode 100644 example/gctree.out.inference.94.nk create mode 100644 example/gctree.out.inference.94.svg create mode 100644 example/gctree.out.inference.95.nk create mode 100644 example/gctree.out.inference.95.svg create mode 100644 example/gctree.out.inference.96.nk create mode 100644 example/gctree.out.inference.96.svg create mode 100644 example/gctree.out.inference.97.nk create mode 100644 example/gctree.out.inference.97.svg create mode 100644 example/gctree.out.inference.98.nk create mode 100644 example/gctree.out.inference.98.svg create mode 100644 example/gctree.out.inference.99.nk create mode 100644 example/gctree.out.inference.99.svg create mode 100644 example/gctree.out.inference.abundance_rank.svg create mode 100644 example/gctree.out.inference.likelihood_rank.svg create mode 100644 example/gctree.out.inference.parsimony_forest.p create mode 100644 example/outfile create mode 100644 example/outtree diff --git a/example/abundances.csv b/example/abundances.csv new file mode 100644 index 00000000..ae98a189 --- /dev/null +++ b/example/abundances.csv @@ -0,0 +1,43 @@ +GL,0 +seq1,1 +seq2,1 +seq3,1 +seq4,1 +seq5,1 +seq6,1 +seq7,1 +seq8,1 +seq9,3 +seq10,1 +seq11,1 +seq12,1 +seq13,1 +seq14,3 +seq15,3 +seq16,1 +seq17,1 +seq18,1 +seq19,1 +seq20,1 +seq21,1 +seq22,1 +seq23,1 +seq24,1 +seq25,1 +seq26,1 +seq27,1 +seq28,1 +seq29,2 +seq30,1 +seq31,1 +seq32,1 +seq33,1 +seq34,1 +seq35,1 +seq36,1 +seq37,1 +seq38,1 +seq39,1 +seq40,1 +seq41,1 +seq42,17 diff --git a/example/deduplicated.phylip b/example/deduplicated.phylip new file mode 100644 index 00000000..4f6612d2 --- /dev/null +++ b/example/deduplicated.phylip @@ -0,0 +1,265 @@ + 43 264 +GL ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq1 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq2 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq3 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq4 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq5 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq6 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq7 ggacctagcc tcgtgaaatc ttctcagact ctgtccctca cctgttctgt +seq8 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq9 ggacctagcc tcgtaaaacc ttctcagact ctgtccctca cctgttctgt +seq10 ggacctagcc tcgtgaaacc ttttcagact ctgtccctca cctgttctgt +seq11 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq12 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq13 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq14 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq15 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq16 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca catgttctgt +seq17 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq18 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq19 ggacctagcc tcgtaaaacc ttctcagact ctgtccctca cctgttctgt +seq20 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq21 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq22 ggacctagcc tcgtaaaacc ttctcagact ctgtccctca cctgttctgt +seq23 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq24 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq25 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq26 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq27 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctggtctgt +seq28 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq29 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq30 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq31 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq32 ggacctagcc tcgtgaaacc ttctcagagt ctgtccctca cctgttctgt +seq33 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq34 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq35 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq36 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq37 ggacctagcc tcgtaaaacc ttctcagact ctgtccctca cctgttctgt +seq38 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq39 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq40 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq41 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt +seq42 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt + + cactggcgac tccatcacca gtggttactg gaactggatc cggaaattcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaggttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaggttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaaattcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaggttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gagctggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcagca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccttcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaggttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + cactggcgac tccatcacca gtggttactg gaactggatc cggaagttcc + + cagggaataa acttgagtac atggggtaca taagctacag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtggtact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cggggaataa acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taggcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taaccttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atgggataca taagcttcag tggtggcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgtatac ctggggtaca taagcttcac tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcagt + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taggcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtggcact + cagggaatag acttgagtac atggggtaca taggcttcag tggtagcact + cagggaatag acttaagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgaatac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagattcag tggtagcact + cagggaatag acttgagtac atggggtaca tgagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taaacttcag tggtggcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtaacact + cagggaatag acttgagtac atggggtaca taagcttcag tggtaacact + cagggaatag acttgagtac atggggtaca taaacttcag tggtggcact + cagggaatag acttgaatac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtgca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag cggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tgataacgct + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagaac atggggtaca taagcttcag tggtaccact + cagggaatag acttgagtac atggggtaca taaacttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tgataccact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taggcttcag tggtagcact + cagggaatag acttgactac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taggcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtggcact + cagggaatag acttgagtac atggggtaca taagcttcag tggtagcact + + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacagtc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tataacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc cctctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatt tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc ttcatcactc gagacacatc + tactacaatc catctctcaa aagtcgactc tccatcactc gagacacatc + tactacaatc cctctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc cctctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgagtc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gaggcacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + tactacaatc catctctcaa aagtcgaatc tccatcactc gagacacatc + + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag taccacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacccgc agttgaattc tgtgactact gaggacacag + caagaaccag tacgacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caggaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tatgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaaatc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tgctacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc atttaaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaaatc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccaa tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tacttcctgc agttgagttc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactccctgc agttgaattc tgtgactact gaggacacag + ccagaaccag tactacctgc atttgatttc tgtgactact gaggacacag + caagaaccag ttctacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgacttct gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaagacacag + cgagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + caagaaccag tactacctgc agttgaattc tgtgactact gaggacacag + + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccgcatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatca ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ttgt + ccgcatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + ccacatatta ctgt + diff --git a/example/dnapars.cfg b/example/dnapars.cfg new file mode 100644 index 00000000..0bcae1a9 --- /dev/null +++ b/example/dnapars.cfg @@ -0,0 +1,10 @@ +/Users/williamdewitt/Desktop/repos.nosync/gctree/example/deduplicated.phylip +J +1559131 +10 +O +1 +4 +5 +. +Y diff --git a/example/gc1.png b/example/gc1.png deleted file mode 100644 index 111a76082c64ef2f206f9f9438dc704ebb0dbad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85316 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�I=*E3~7w*GL-s*Viu#J^^Jnf>i zcn_&k#*!H#Wg+zJ?Zh+kljd6_G_9p}#s%8g)`xo+LRTAt{g{|-##Kfd2;a&Xf1WCy zS%n6*f=A7ajCJ_VMsmK7XqUAU_7l^IYaHJ4wP+v-6lP&L5`_ZtqlO(0{C#wXkfO9MQ@St+xOvFCd#f8sUji0jKOw1t&{Hu0s z7+>d*;Yoh;C@=e-OfP)k!m*fR6X0x*AzA{6gE!35IgupQ72~BDqKb^b9f;O&B7saW z@_G-vA)pyG)Qq1@`l4`2CMKF-*)o$FJxgYIFF4HnnKV~mE`$y&ff-E?^I3iyjZ|}9 z`p7oZw`sJ!sRCd#rJE^&0Jt^(xaSfSUgo|BKqx3}xV9y~(~pW2Q7j(Q0sQvHC&#@^ zHF?AK_9Q;(F(GO)$$IX(DUeFVB@3$+=y{{FL*#Y}&)Shz!k=9i`@ANT05}M&XC$@6 zG|1BgKK%uFd@_q@1vc7PiK%!7K;I`7vafxSvpdCiL0$c z4e~Sgu&#!@pUor?5^MUv_(bDTjR>j8n~xL&#}OyMBTW32ej{QOFhF_N*|~l9=U%3A z_c%ftfR{%o!6A<}rQ@0w%ilBTqfx5TVgewQKv=21l%GzKngJ#Y+GwCsW=Rr%nbRyp zW=<8kb{a!n1oRk*CsP&VCK8$YELp8kCi}Rn2}0K-w>gNGpJMKc8q;I(|N zi4ti_#CIfI%)OZm1Mv=A|HOvY1NJOdf*G4u_331YWHpDu`Mrd}pePu}c2JTXN!!x! zrtSU?t^3t^JK?L1cS(yvTY+DW8@UDZRdlimr_do_AHN- z&TcA7*|}^b;H$abd{HX!73`K<{FQdBhp)WOC5cDJkozacI~x&z&_Hn2)N2k6J%a5K zSvi>7JO1jpdiog)6VWh)_JJ$#h6&bY{M*K5ZiIv^qsu<#I3B~~0Mzi-axo5&0sPLp#7$gcu{8R2= z?+f;JK4E#uS#@*s@6ZsN?cuZ#LOqXq5L*O#ODxfb1yKb#B1n9BPh|ecaW7NRVvxyv z4ys!!(X4T{LFC7riv+?Pq!DfQskQgg#~)N=hYFMuS+lJ8`EkJ#cGP9Zb{8d9Gs|P* z&Pg}QS7KEU`XVGS7EG2%Z zDVi)ba)Uz&oo}wCtmgLyygJs>=GTKI!zlnYwT#+uzhH(IG#3m&V0tM*M9Kn!QfR{v zI|dR0kIXf3-c;3SQQisTi;r@rFuzPyuEhIjn{peiPuq)UkamNoR-)B~mj}|xFoRMa zb9^w`R3}e+)$JS76HFLq%~@`bQ=~h`>BO@B4Hi$WaD;9sjQJCKV@A7(%qb2g6Xy_V zfi@{t4E5kb@33qiDF^I+@G`Dkvn9O3=DeSgJz!o~9iu_LW{p7fpsdO>g_(FVEYJuAL zd{eoM)yBnU!%Ya{mYNc{0$vt2ngH^lVVrC4AmJP%nbmc8@I|$M^fl36q-(|;o3_uY z$?YF0mWf$xTy6C-u%!e#ZUiCK5HnUT^}v9bqp|I6FowBAN#R^8L5>McYWiD7+-mYc zly*S|?II8`X-Vlw!cMY|ih6sL>Ac&L_qt%(2>BXfRx|QHQocAF!~+avDH1);BoPew zi5bE@yJn{`BLlo&Z9kKB<}%7;tsJj=R_K0@|zbN8)ZrX&Wi<1dC|}f zH`zWe(KgRK_-n<@FPWuWFL3ObA3*$ncW6rK6!7^jb?p)1BD`}t*BHq)ePaA1P=G5m zIN5WrSq0ud0KSK`>> ztaQLB;4liuf{AmC!Q9gCT6qy-t1)I8&W$(aHH#^oXEV=!%sy##bOO4dG1G%Xj|xLqJm`cI2l9jcD|LT_ zv^(s@y8qzUN2k2j^nhIvPUXH5w3v0JC+DIYtMQDzg#j2iOp&h_B zND^r}O$1eUe9ti$KROU5G7f}@YbgfR4l-i41vyGIF~(C6Mv1nDsOPi?I3l!=)+?y3 zwkOnDRw6?Acu22+#8D6&fs-5M&rVbLEARR3qyAGH`mO}+b&527nZIK~3IOJn0tN~T zab`UdkGfY?-?0SuO==UZX&JsNtQN>?%~$ybW}(gpd<1q8oD<9Uly9H&8i#XahETOJ zhaJxLs>Vh=!30MuZ1*AH!%a2Bf$`|kpnArlRt4`q z^fTbo?X$v{MTp;ZUq{s&!jiVE%ZoR)5m0X36G{fA4fJG2;F{GF_4))&b-<1+ zFuL2q0{mzndg9yuRg4?{)PfO=-br9D_*xUlyX1a35Ivd&v@s62U4O4KRC zb6-N@!!RQ@W!q;iz@+}0BjWKcXyEcII%z`??L#)#8e@_%9~HYCd8pZpovXppa-a$$ zxj^j)W)gYgzYrx41hlAg2dKazBdDb^#{_Y72xWKoc==5jBgG-$B^}`D_ zXm?{bby3Hw$umy0!&9Y(G=g_TLZE2M2*dDfE`tY7a!Ep>|J0;@A|zw-_+Tj^P;<>C zH-iJlv@jOB0IdLyuBO#BaLvGr6VXiYRr52n4jU@$IVK&0w`=qZQ7LokTA^)^_Ss>D z$y8c`4~A$<;wx7~VQiQve*3mnP2ZZGiLo(+taT%-dJ_}5E*cn5y41(j4X&Xwx+Zf{ z(gea)dT=qU<1>f_=C>`hjTUC2ntENJnhA6S1Qbw&h$bS8Cw&x!!7~UgV+a+rhDp_G zIsOHWnx&F{gdS~AJ!0*L<9?=!sOCYC5;v~D1=0%Bnf$T$B`P=>xfMic-lbcBz{x$4 z)NxT-ddYL12U+{fvOguM%=p;}G4Gq|8Vb>%`1yke)vrE3srrZg>UVD^)o;H$tKP6D z&;*;CE&`TYV1Tf()0IqJ=Cd4&Nf<2xX3_uAXqsa}4C?tSM4FVkr8SNki3aRSXH7EO zv_=Fi+2Ox5aa99f2H`vS z#Fs+B>%34pSg><1Ngtu5Ghebo~zzz8mGj5bdz;(Q|v{#&F ziyqFCe-M*@xp-I2XKcvFWUk3&+yHM)Cu$<=T(e!}u;tcUXt$^ywGp&{pw{DOj*=2K zr)E?&Ij$pqk@8kEOiq}+kKe$Yk>bv|O2@VFdVBuKaW7Nto})R1Hkw`wM~ieiB$xP; z6uo?>GsApo1MjIG3o|CSHq2+Q)`Wr>DPFBd)euQHV$D0=}AlCN(nn~gE#(Lw2qS=xapwQO1+>m$oLc;MWFF!03Kn2?wr-S>>$`a$AgFIw`CU<^LuCs zn7&OvQj*Jz+SS41L3Qw807JGAq_S~~D4h+Tn$-?fb#Y11HsNm03tF{!FW=Hm(+bLU zibUr6N0mGv^0RG6Dc=7N*>^MQtDE8 z27(PD!tolUs%+ks7@Tid5q@+FP}>E;mZTuNpi!=0IvwvA z{oCs5mW=}FG$o11+%B-8S%;&_&PrMk+1fbw0CPbc1Blh|B4HUOKET;{nkR zioO`_Re!pjRR8>r$oR7}_S_|h91_`eT%wA>4(0Yh>J><#!MH|~+6=X<<}t^C-$qP` zV1agyM?~0Bl5Ljwb1Ub9=wszi!#stcZQ;gDtPnx8b2?2%EDVzNMe9(KR9mVG&U}~0 z_`^m2i!;EdQZC7eKF@o+AEE#!nw6;U^p{dwrb@?CuL}o91UNg7mgOykGi@N?qAE)r z5qMNlIts${oLfK){I;Ro5-mAICtyhFaX|QkXY@k4-H`ianGBSDjWB%-mW8MxDz`YY ze^-0m>Kz0*qYX|=#BW3aGK(8X9K%=-PurM$Y)Jr>G36O;lq9H_(x0Q0h6EKdV#qJqJq-h z-+P%V=8>ImXDBiG_9#&dT$fPjfJpfQUWi1#_g-N_A3;N5QY}!|EnW1uFS}xx!RChL zB=z>ZI=k7cez$mBy?wn0qgB;8F;|NXtB%d01LC9zU8FiTx}$wezzOBh=@7z(XJs4% zZc{G}#WK7*B%&}9ZJ?B@y@yNIy8_5H%Wyr@79!2Sf7e#uqch`u<8cv~#3b+^Z?tl&TEv5f?2Nds3(T>htCX>A)1pCPh2#8>b7_)WsW2tfFyj zC-v;1oyHG{PKjl;#6$-_ZktN^b2Oy;Aup%6tY>(BVX`fg=hlDqg7Ghr{^!3rs-FGT zY4ywh%5IpX4R9>fCp4>r#)1Q&T)e|%?`<>I>h`Ab)+XhExCDjL)q)I(VmneupuM%q%Wj}Rz0V&wpkaSKhQ z$)^*}qzlWym`+sPI@ojNXQ$(un^pCC)34t0t#Wkb=tft%5(V+qLH)AM z1g&9Mif{8l^+sx_l0nJ_Ns|S3FrS_x!L-g0B+x`iNC0*~iN9ggpChnxpC9q$Ku}a& z2$Or|z1%I&`_~6J3OYXek&6;s+MiPG0Di`FEcHaQP`x#v|6lzX&y$O)sHiJz>x})MEwrv(x?Rm(P!@ z0~q8D^GbhyH>s{%<|0EfUO;L9qUE81)Jka1Ig+Nvxq!8q#i>iYf7frO)x|p^8elFp zvh}$6o+-gqTMDWrktpZyC)KN$=Ar=JLn1F+jO^3v002M$Nkl|kt$u?R`3>veuIAMx zT5rUp@E-G$145f5gD%41@R;!z@aPfN@`kqJ6ubztq- zcO^qC0A$XEaW{xA8VJ~-gY@^V^MJ41qeJXduKTwPPtZ>EL)`J)E7lP=A=(Yj5V!nE z(j!-;Bfzyb6nuHthJ14T2boGZ1VO+Ar+o7_Ka`$#je%SQI^&Exz#A58%1~FCQ?N$_ zI+WypN?^R;^tta+zKm5&I)BLwFsHNS5^00b0uxP$(*kc4ja?WF%PWaOfEhE%ilkJ6 z876jj0A>co;4+Ou;#jmFHOfxI`I8FE-}067FiXywyWH~~n;4d%Ji8T8Ib=LF2i@d1 z&nVyw%h3^%2oA?n5L4O&aSw1v?Bne_eS8q6YNKhyv6@YAvSpBEpk0)(cjG2&0}s|A z9$YhKJ7a2M(mlX&u=k)$wBIsiad}zx6UNwPVij2ro+Xo>LWaDKHD10LS}^?kZ!Tf3 zWi-}`CJjh|V5oR40}zhl#GH0$`ap@p^>&Mi-wk6NX3j;H2*7wl zD&c)$Wu~ciHNP!OMr^r}7z9#~Oi?yccodg*uxoLInR0Y4hy>SfDXpbwcOfiu47*nF zoK50S!i0ny!jdBWm&4+kXLgsYGS^ZU?d87A5Jm*a@mPrlaUu73-!dWg(g$`R*JWgg zH(7)#PK2;u6s-FeLR=b%RSQDu|5y{T%A)t zW}@}bZ3V@2y3q^fWM7bEC^tlc(;dY4!G>ItCa9NZbv{sG`mHJ9?yK~)E#gx8)&8=L z^b=md2vFJ_MpFA*7Wj$t!a8+msKtRy58xJDmu*@N&vP6mlYe~N&s27L&})Hoeh?<% z0F*4sQT}?yO>Al?0zeH5;7aqpk}M3NjX>wh;VUPFjXEZ@f4z0*5AspKa3eGdvay;f zy_kD2YeSLFG&Jh05ROq9X$u=8xC^?IC)whZ$2yoR@gh0J03o<_i_df!lXUkXL}uiT zJ>OK6%e`RAKH{Q+dfj@|RQl}<16P+t0BVPx|j_u~}dC$*$} zUG<6u|7&JCwV-xJM8yk%bM`M@5YjYa4$Qut zvgCfw4l?c{X)vtwab0L=;qoR4-zq30{e+{-)OJp+f1t2QzBoXrCta>E5k>TCLIvp38y?N$TX6 zZ4UhcC*0DUb6G(O92tB1ENw#V@*a(_FDO6#=X*9*GuSm&5|pN~o@<_4C(VRHUjqF2 z_z9*efEMxROQMQ$A+*vU&IR0x(;$BXP_Dt*ad{gjwFf+yeatVpq+TfjW+O>m;X2qK zSNkBj<8ly+GCF%mq=1Msx&gZ)+N(tev$~Pi(3OgT#DhZ<-?JovJ)#yD9afxR+JGxoD+KB+yhG%gx-4z%1z z4ZV#;F~HC^`jg{+rlKyZjGYd_#@x!4uu_TbkgJ)koN4xAWe9PsXQ7$nGxCKKsZ8ZC2TLS_F!6f{;loEq;3+RxPh ze5_6Qbdz&CR`gpm;6MKUtXiX`e);ng#%itV;2{eQ-;arKp&yyfa7FSyQ5=ua@a|Ok z`Wmy%rSBnDz_47~L7@`2my^H-I?y5O1!N`kAY;-m2(%tk14H5n_pum6w~mnx{p~o- zc}Pt;kDhL8%&&ImIqwlcLY~PQm%3UdUc#7NFadoMO$Z?3)sKg`jYbnF+OCsE(d7|= zDd1d5zX_v^#{I0vqwIJB<5A=ut16_oo*Q>Vhvxf>HiI!uoa4Ca)8qfWa`!}PzWY^9 z08AngTcR{@0!%~{zxft0*G;*tNf)MZvX^E7oMs@u84no&+yU4Q&xPRd*p1O9Pw2!D zIl1=gvtqK$l@_~klNt?6vIoNZm<4^A2m;c(rL++_^0%5oua_+04k30b)?RhZA5cL7 z&T}CR-SvZaqu}V}JrG}}JlaaoVSWFVr!&|rk zPdz4l9YeWFc=fsIWRoWptygRPz&RKG{qytiJM>g3^m z^|xOiS59|ceM^46Ya9wRE=(g=(4LG{Ukcs?G)q86q@Z<%;2=f_!XU{FdC+HU3Hs*y z>*`_#B521J0@cJ+BuIpM$LNJf-yq(mYRiv@>>f!zccio%Ya8=sO17Hv;3{~G&b7fD zMN5_QT=I_;`Ir}#?-M5%&b<}&TysErW3QooIYSg*Jh3CYrjD#&kr+k~f%)FTP{5YhD;* zA|FHaV?HMclO=6lf*a?_hEK<=Rq9nw>CO864Y)vBGsd%EnIKwRI3ZY*+O+jn(w~X$ zP#D3~Zs$5a8C4Il7*4(-*`|1%6eJmqF7916RI>_P+~~0kLx9M7dsq$X=d_KSkfh8* zLWuO#t7TLyBpMk4r#ihRyw}0Z96w+g5rNunR;YP*Lu$Rr84j5lc0Y8Y@Y1Sva$IJK zg}`qaEWyr})gmtjuKP`E0^KnN#o97%bxo)o5*;jvi;s_cnMz_QYK|JzP7P-Tc5PM& zIfodr=QRJgmive@FUv^on%8Dr)iO?xwKFo6Zrh%2bQuJ~>Z6`VuEjY*gYn|XAWb?# zgVLIPPKn+p-b%AfbJ5Aln0pXytcKD@F)5;YAfgR(Dhu4Tx}9A{kbSNoU>RwxmZS5X zoEPR00Uc`j0|G^#lgQ*5(ef8~sxGg{cX-akC$R8{(Ni>6ao~}b<}7INBKT5!OZ>^s zB(Wjco%S$LGv*FN+99H#yWg)4*%x@s_|M7R^H(?34NQ{BQ^y>bsvACrBN>dUS8jLFkgc%^HCYj_#Y@MugRpteJcr-oX5WJuZy9q6 z`W1he&EVKnQ{K4&UB7rbs{R%sw8h2#>g6?riS@vQz0c4LJDRpaFPNg{_)t(R5o$z} zrLT=yJbp}Y?U%UHpY~%d)N{>4#IHg{PaqbJyJc=+fCYlYB{vEcScCAWXVqqm`3Vu5 zeaUfFj9IK7`yuBFO~&7umxAz*pM75a`oH~s_4EJot7>#Sz?FYd{pmMg^(N#%>Ysc!Yp(ZumPm5=*)5s7@`G1^juWK zX9JPwy+ao3AWkWEoKnMtnD8Xpie3b2SStPLDqjjO4hzes(M!iAg3D(Kq4g&)i`)uf zDn-{2`I>JvMV5&0WI9LT!AokZ5pL^;Bs1w?mTs9Ot!dj5;_;Hs1c~5$oDWe}I4qF&PeK9|NyBOa?IK5s~yV z`T03mKnw0MhSKCa{c6mz9t8l5s`h8S)fISM>SUpgjI)4AfphczvRc0)za-gZ`~2Q8 zHsAE0(r&bZ$^)X-v^67>4ug0Gr3mOmx*$}82>OHS!53dvU;p(lBCOU=9?-R|>ipfD z4dAcIX9-g&A^GnleBP8E>9a)Xu)mq(dzFQGLJYxDQ|biCL^K-HVMduF+x33=zMrW= zv;gRf5^V_1$|Z6LCIn?65Q*av%rnhC?i7>94g=vp1j3E~a!du$$3CScAghIY+&PT} zlJ)AFv+BDuHb3C{C7reg@s`_V-a_-qL3$FVAXQ|-o&$7)Loo?$yMufs_?AU-CLz&X z>jWl{g9w-%hU#FGE5$R1gH($fS0>;itlG~Va_uQ0&;NX0{pJkq#Qe&PiOU&YGe2u2 zD7Khrp{4%g@crF4=Q3#aE}rKhdkviF{s&NmhWAb6*ur73?9<6Go$cHI`k)$bj?gX; z>l+GW{N!3OqbWw1cl*T1CC-joSHQ5qOzb@&ub%HK&)DGHJSui}pZ2KfTQJ6!fLnWJ z00SCOD+4HBeQpn7bBgJG^4VbmX21W-dG(Ggy^`#}eZi3WFJG^#_vDwD)5nj{;5B2@ z>z5a-?j@j>zUiZBkDr>NjIj@Z=wVb-x>s`ofN67MjFV(kU{9K$qnuG)&2FUHJ=-z_de5Iin;T zOF*`i1!Q8IGNNGxlya|49!ucQiOB}GqRLavA2gG0t7tdeF8g#oQI$2F9)VSdLHYEqifBy*e&bH<|4s9{|0)0UX> zl&`=TGu2>-&E0{ic z?17W!GAWGdMmaacI$qQNS{+8$?_sHI$+^G6X|Y{mao{0z{gX_!BKm@xjOR%DDxFb| zwC22J2jK~Oal$HNb{ZMz4tEk)@$Wc4{bb$lO?Fxxoc@CHfN%Z|CZ-HG z&|XqX^ZSS1x54GOpQ$1W?0yQe;&NKv0-$K2=2wcQ;m#Aq#VB2?CgJRLM^6=lJv5A) zWW_}Zt!AlF+pPU@;hES`Md$x z=c5^rNJcOx90*U8CZH~M^d=wcg4iK4>r^brkV-?q2+?MtqGq2&Oee{J+zE5q3L4{u zd~5z?eUd+Y#`lz*Xyw4dAV==G}*@#J;ig@ zXMy0&HB9b%FyD%C%j7li4haLpWMwf^)uy~YjM{QTKA(Z8trt-a0 z2l0(~_Yk6e!kpC+v4IcKS}Pb7{{&Iur43`v?*nj+fIc|wSCiSex`hFTn1zp?A6Ab) z#~B4P;ZUuXz)7Ka6?@g$cjuUUL{ogrir;hR8HsX7fZifVSnmQ3r6r797_5(lqM&ut z^aGq33$(ct^kP!WsAe16n&d&N9vf6h2aIcUcDeM&Em3uvV5mj|FQ=30#h<^y1bke5 zN!qk^ds>~n`L25N&1)9YTg3j zA^^!nndYX`ROst{guoI7Pn{uDq~;37srg>xI(KngBrU}y(TD_!rixNl(pdo-g1-fB z&Wgeo>0An;XbK7A@@L8iK7BJF;FdNfdD_oAr z6Y@1?*XKVwt{yzwkBRsd-O#0sS1)d>-@HXABC(GTV3I@J`$Ri@fz#=TB^%e6uOpf2 z2@~z4eik1iBHC{t_&J&mdjn@FksMea6UJ?71x;&(hHcmE)(NGiy=9DL-#dk1Ah2}n zu9?o!75FhTp{WJCY!1esRow;ijVxL;zH~!^%=y$zCkQT{*94iKUsu2V=YOiE;P!U; zw?zA|s^9<&_Cb&Zq1P$fhU z_#n!8lO%u%LDC#G0}?Jdwb4!nfZ72@4|jMb{L#Q}W4e^Hb>lYXDQd?pN-eb;65RWm zl*K%y0T5yquB99dNTr$tjutTgcNRZ-LT@#mg@Hx&J0$}xCFpj4!n0F7D zSQiic?lFij!mCxCAP7fD@t1f^=V+e=QRk~$1ST+vk8Dt(M4_V0Q&Hx2DsI3z-p*TA zee1-^4ll$SE-}9ize;vs%4iekIqV)o8+a@Gxfw9YPP7SnRgm{^gk@_}RXNY(Iqrwnp)Ki4p3sQm ziNYX$e{kH-Q~*}A6z}m*3G5LNIFITCsa9~e7gR&|F2QgtWS+N9%MHA6RA~Mf9>RP} zH%<)*d{>7=W;v9uIhbPj9cLm2veGSw-$)Lbumw}QGecs%Y$(Je1IU1MQy!;?AVHq< zTnh;+H0yYVXel=V-yo5k?{Zc0h)hbxrs3--460`0u)cW1s3+fEdobAS`9->Q#`|1Bx6tofer{6N|QWRm%RgwS+{0ChA;~w*>gF- zpM6^n%KPNFm#HkvPoZ{;C`HEeCztzM%J9R3@st1@XU%)swvv_y5`k5`CD@jRKsYfU zA+n4=LTog^azS)yAg9(s*>}v%1&XB8xd9SF(LTd@F%4xX4`Bi^p7O_c!f2GQ6f-rJ zlgJ7PO^}Q`7=tV&9_C+kYs(<;AYGBt(jl59+Whj8hi#KceKxfPCNDrNUg6ui3m|-R z1U|u&aKc%ou*})PR3>&AqFMHk)+02J-mexCdrC!rjd0Wgn=dY|-6HYg<8yalT zJR2l-B23f{w+xDSM&T3{L;olg+#{E7a; zxP*D%LbRjlVRia5%BLvXZ6}x#Of0I6Rg7wjB@Cx%*kWR*-Lz3=3;snQU7SUJ+;kq- zTok(A(JKfKn1K!XM7(b9rH&y4n>%>yGEHp|fJQa|K4UN70LNQ3C5Y~`1x_pkRt(qB z+lp+P8_H;_jqqe7kG?4Ufqp0ubWjS-Di`>cfJKadn@Nl6vKk$6&onHS@G=C$5ns+p7G@W}yDX!8U_N= z&{)i45&6<%2bsa}IZhnr^16CP-(fYe2^~yG=TmRdpb^}ZU8u#*uq|qH;bLs%B{XLu zcs!^7q__x1e}8iPBvTc2D5*CGr5AdpF(D}n1{J8`Y_}=3L3AS9TnBQFw3`VtktyJI zD9;raxn#z{bCDEuCYTB3rA}MpNj@Oc!cq!~`avd7+0*@6QRP*)Z24zBJv!{0=`;eES_Paa8EQXPXL}Cp4k0~Cf z1{t|J?QhZeFdyx)7c)QUUR#uCJ^n3bDQ$y(x5OaYKjK^b-Hp?gPW+bPf9$xIsnT#I zBJUSdrBo{*VT=$sH*L7mmbgCChDq!ujpqVVlst9hzE+=`a9-po$x-+*@!W|p+uZPk z3{&=AQUjC*NMK2XZyVC+<}c+)1OXvTQyOXcc@h}%N`6alB8*q)NbryA8p);|t_?vs zOQf8O(?nWk*QvK?80xUSye=bII))eg>%^+<23DDw|EZ5_9i*ThM8{CV<5)??HpE4V zo{r(VuVpOPoI78fAQ#)(2sB9IvE%(Rgy4DK0$pb2UWcNfp#)TQ;o#XQuMXplIh3KuY(Mu3SD@!^RF^{btN z4Eqy2%TP(Njc`yqIKFX{3dve{P52YR22SjMX>rAMcOzke8EL0a@D380!({n@t(sam z%GL^_DU4zqP(EIoj6Q93!N z^B15TJ0e`Iey7 zNZRr)2`>nOQ=@VCmf3tugD6&cBUQafEi4_O z6oK(MxN40w)SRKKFncVRj^(~}ZHU>kJ|nB!Fq%u}9ZP0R0UJmMMx!YF3^sm_%1?=A2b^lwFvH_VS#olZ99G6#-fB$faG^fcJt!J(QW(CD3*vS1@F}}V#?qw=z&QGBk8q5!o0ADH1()_dWNr-<||u&#BAjt(zl%L3GA;Rw=>R7Vf+AhH%BBNQdS%-jD&C*Hc0; zLP0#iAAj+!<3^#vZ&@#O*^s+mo;S>FdEB!;xA{>OEm2Q#`*YnqfNC^&4g8_ect)69 znQKg)#k*i}hD0{Fmd8q@g%j!A_jd*%0`3P#hVyhXJ-t-$;WJhZcWxLz6&%32{5NZE z(KtF$jD}%gPrs>Kjo_fPf+v_bj1Ih`Qvz8b?0r@wJ0G}!S#2OW=-16A8lKY`0#U@E~9?A8&@RM(J^EM&fOwCdYF4IpEsg+Np8Qs z<{#U<#Y6&!nl+iP;ydJM9g2e;GN~&{nYvO_U;rLlE+qLm1?~&y?%Ch;5lG{0bpS#d@Yx1Brs5o;1I~fjCJCDU5mq5N=a@CBiv35qx}W zvIU94=(*MA1+V)bCZP?%0p(|_9D2#+7tkQ(3YS6*W|QG<0|1Bu*GaV;dq5~lq^y7> zRTw53k}3@4rq_w1WDF(S`OkV|Ed=)sOkNWXY-3U2^hbfo`vQ%b$TJ<7B3W~ByX#z9 zC;CK_o_jD_m$|EX|)tkpq#*9OQ=S#GX=C<0@ z1Vk2xP=Q{Z?&+WuBKTp(WQw9Zrw-iA{UK)ZmyFlO1R&TSpB_KKRFp|Y;xk0VpLD&1 zYLC+RTtTYX$!jJ+obA@OU7PiWcb&X6=rIF4?CV7PD&2Tnvjyx%YB`?;X$E1rDe>fl zx_C@4TQP=0won`wy~FjG13VvZj+aZ%023uZkTO=W-6<2qMqBw9(%PtkxboS9sqK0p z+7ZtXlBq)^c4Gcq{mJuw?zAGmgv(F*lM@-z-yy`*ogW!1rNexN>&}^Qk#p|T%FqTs ze9tJ4LO3)L{D=j|XJH}=5oMnHZtz39{TGiKZOegsGtLkQNU5(JFio^$AvK?Q0-a2j zK&;&IVp@R@HIT*0^fFABmuoo5ur06m_b}sODx(!LiEY18h72OnOSI;=c>m4&s`CoH z!Q}EjVNhKd(Dh#SgC5p7v3CXz$2dtWCXg5V3WS0lf@K3cnk0=?y8*9DFr>PWp8^5c zb@s^qs4UF89{XIekdj27CW|R1D@=2Uvkc}~5`$Rld~qI&jS92jh1wTJiSsE1Ysx~S zM9V}oJ31B)V9!#1)>lo*l>4uL`PVSp^y^au$;acWdzngP+jSvC&UR)})>fr*E>hvv zcs^7qU4W$01qm5IG;(_uDB^L!%H}GzY!I(qs-)0lwBYm?L`i)TBNwdMpR%9CmLEKv zUvhbl+zA1MgMrugc83z}uIw-!cfd{Y?s(7l%QO0U>?v*iU5Jx?oY65b*|7y3d`sCr z?|uIWmwlh#%_ZmSxTXe@k?>GZJ{MA`&ophcE&SiLS(C+z3XG)+c_nrGoJ^EP<_|cg z1u%WuLQe`pqNg=+97|y?IaYJLWR|2A5egz9SjOa(M14ar)P$Or&}Ly6`iBmP_2{@r z+(bhWjF-N%-J*d%GC)Bg1V>m=i$t52X{u_2cn=xtj1gc%qH${$RW5H?`OEtO02 z>3^U}9Zq`V5?AQiA1)7JUI9YqgZD)((Xro&Y!!M50P4?Eib&7bg5eude1s3E{G3(xsl9`_;6im6(z#12ov5>9UWL^>ZRb1eiZ zF$j+($t-FEr8pho^*At;=sw{!+tnO`wKIvm>c`?Dc*6GZ`n`w1jTKz7 zM#_bi29oN2b|tikD8eV?nF{P=JX zXFQcH9OSWjQURFzxgoM(B0Hb=45zUXVNe*ec|C~8TVCK5-_Ll+GB_m0;@>L2Q(jKF zVQ1UByCblcA1VqX5b}JU%W3LQ8)-vg_voBtAF?y(6=4*Lq};M7d+Nh)%gXNtR?e-) z%bFyPFU-5x!kAAUK4GG~yw(&I34K=v_n}iYle#1xOrG;m$)o(GF?m;J^AdlQ-eA$T zv=LhFWA%Wg8=tWh!<`Qg&gWJ4PgQjW!MS|i)xR=q%t*~R-{S-Sx2ur`iuw zSOPQ}B#Rn3H%-D24fl}c_lMBR6=R~Mv4JjU!4yrNNQCmh;9uxzh1Xc04XR3n6y}WQ zPG<CcKL_QEKoPVr+yB1VG!Ra~(d=tTb%iQfA`y9!Z@#QCnuKo;?*&FqVt!G|POF5GDBq3^2t2!zkr>1{ zR?HF)I8mO`gsszArQ86MvYX$0i39%g?cV}#IV(h}fC-$!BC}a<3I}e8HItome%jaI zQk1B<)nt}scAy|A{kUt31sA;Oobe+wyM}3>4cGRcFwseH>=V{N$=xdk@aC_m(Hv^f zH37JK%ctrDB%-Een=YbLW zzUz2Ku-AIvp!ymIg_G?IL&F%?I2o*IX3-SGJ?M%brNzn$;t4hDz`vT%u%ztLNc$Y4 zY2N9Hl;7=RjRM2G6rc)@n#dT}VlDVyu+iXT@{;J0mk0pj{%o`wiQ0@r@lXTtmrtQ@ zEd&`V{sSISn3S{_xOrH9q)wjUhLY5_gc<0(1X6~v=oE@nm^jgA;uNd1QtMU9d%?PMJr$R8 z>kFu8kF<~9mZ6Y~Fc3PGHbkrWCE>IgK${3tFH!_p3U@5PbC`nG0hDy8=cVp)%^Si` zmB89l+DlaYOO%IrbZo%jen>(c(?s|77@!k4Y*K!2cVOlb=d6k-0ldJq#$;Rpn|WQP z+^bnt>ztORm6|4u%c|Uyr$kW@xo}Onh@g1evS<{Tf^*7FVt;-cV&#}fq#0UdghqrH zFn}OFB3#^pCLVRJ?TpM#ns_eL&}b|!tDD0Y9^{{qRk6z9-p zrx5u0(Qz+R**P?mGAK+5B(m=Ql?qZxiW4Xr597#;u5xvor4BnKt_ft!UQ?JR9rt4u z3urBZS|}cg1|y~>8J9X7gxbzbCIfmBr9ga24*rWao)-}uzSw-i?EDlTHafiKP3q93 zD2xJuQ%{7G%tl=_FM>c5Cz=Z47U}M(WJE%jc?=D#5Op3daEN5_k^Z4R3sRC9GuA=0 z8&g4J%D5z+44$XHp6jF_N)y6Z=8}knDPE~1W{wk%Hb8ubmARkx*>1{LU&S>A0Yg@b_bciK~1E zFr|yj-hqo-r9H&0NvxR~+;d;}&C%Gy;b5dj_kdg$EPo&0?32U74cdr~feDimfO4}@ z9WcycCizDkmk0~X#ghd|n}mdkn_ewMC1r`F3ccu*-qdWJ3;iYz6Lvch;)G{vZ}Ss{s)NU7Q|n zo{{-jabTZja*dvsprG-lv{GjC_gnBsVAz?gj-6<3I@4 ziCUw93?Lz}zL65-2I$~gU#-b6zVX?|UbV%eT@9s#E*uK??EkMAmunOcxwv4>qo8 zXJk{dP#1MtnV;R!oO{LP3gJlVasZsD5%A<@07JrOjtQd~k#j_P0VF;I^hSIb13(H$9A?t?}D zg~{m^*+-#8QV;r$e&RIqmgZE4>1h@B#5LWV27LVIex{-gMIV=!>9VE(i-AaYC7S*g z1Qr_R7EFoWUXz*2kc+CrL49%)cKtj5D9o4IL6i<58D!f~LGb1tJ zcB@tiw56#-ht(1WF?4C7<#Ckel=Jcf7-&Z(`y5PBdE^7kTqCJh4$j#zq$U*SApx%& zRt~R8ad7yE^-|!&Vb&22guQQx%LBgY8}iFj%mmF+)1OYf_L9L`;F*5Np2Faw(?mQcqo1?fG}80aKP4qmN@ERu^qxI>_hUe0@#et@UYii0t&W+~((# z<9?=!83f^^(6G1C9CUEfvWt0!6ycEo(T!5!u7)`+j06wb_NKhyB@K)+Bf5Z;YL0t3} z9Z)=rQqz_KG9J-9QVWn{q01U1=lHq|{D%$xzthqhrl4{0JOE#7e9yNnm zo0KpZE3ARS5ky7lUJTHw=+@eH=L*^VK>27L+fJAUJE zM;Uw3WSK5HZ4uNheYIhdZlB3oGcjRd>D_I&j`&EkR7P1K5u76OTL*lwuG+*8YSKfu zVJHzU(fO>OPmX(;N&w2yNO~Hu8@Ch$@Vk*cF!y&x)~2r)Q{B$ysL|E?G$O6^N{iX(&(hqY1rlS4dP;7RpM8NWc=E zgu&BlfF$upLc80#HhD6VLildfY&=k6!r;JY5-A86>?n$8+H6_nDD|br)FVxJ^NuV; zw!|rHEce$(VnIeBv`LS(f~jZcMw(y>(%D(Ufi^U(X9%&@Fjq3?`krmE;?lfwZhah) zT~w^b5@#R6kzi0vx&;?&G|0Z|s~9eHA!wItoF1~Z&?8bj_YW)f){y_J)pul`y+$Zf zp?mzUkZMZ!t_%*YoJ&e(D1<^B9n?Djw{5h@jJ0Wk>#>cyos7ebvqqS@n>EY&fp2;N ztiYi&LSBtGjk>yMf1M6#tBs%_*NB-#%Hsxar3`F(HHmePm-Qmb@R?6XW5(iuR@ADF zhdKsuBgD*&PlJG$^;N{|4G4touvEi1RlBKXELCrh8Mm>S8~svNU!&DwHnY=aUjQ_G zi)Areo*_6AIL+DwAPqn4ctTir$GuFYM7D+gOF!Dd{*tOvsF*4D6>nj%Xe-obd6nmo zA25yc7;2Zcb2f-5E(0V9@!OaksOpqyh!eXij;JTNpf6+fMFJ`b>2M*kPE9$Ui^B4v zFW6Jf5r~1Y2osj2Gv{I|XLnE^Xnyg2aw0&PO9ca;4rN$`CS$x;eDBP;f&e*(Ld9sl zX@mq{sJlFp`hkmr6v)&8Ah7CB^W)g$7-^v`Rw$edu<)~#*f zWghg|QV?HF`3gMHk_$$)OI(@i5H#SHa5IiE)QU;Y1u)zKjQRDBXd zGAwD&xg_h{yUy5bfwl@2Q9b};TH&a&RWSY<_+(m9wuhE_NUp=n_g7iAAp?ytJBM7) z0!akYlrf_?P$Zb5E<{DSiSEgmf%0KK0}d8LlHo8uIzT&Va+`%q4b_L)7HGD0_aS{x zkb=&%mQw{Voem2fZg{U9BfH`IhJA;P+EDOt0)5h-rBl)~yFd3b6|LqODWi032vx2J z86Nq&`(p*7N9n-x;!Gx>YC73532(zpNvvsucqYNNsB=^aPa!3=ao2k+hUQ(gh8b2h z6|!Fx4VO?ncDxgUwL`2#n5=_;jxVjhG*+Y*^TCu~PBNP1R9oBkJ99&;tXn3~tlPDV zn;#r9uT}Z+%OmAmx99%(;FWl+l$>1F36elzI>LDmy`QE!rUw%n*MsofWkg<0dSMtm zizhA9f~`nkEkAYmyWEU75FF;R8Wtk;A+>-=aPZy19NhE}0F1M`P@xeLYD2dSy@ZI| zY;OhwERTqVBl}VdmBtDz-0WbJGL16NK2lVw>2))iv8wl)EWzadLyJsUitn;{1?Pz6 z7UM_bYMe!jnzxjrw~n@(C22*j4b4RRE6yN7M_O5=M!(R<_Mmu(xsG?S#U^!fjwYS? zL+m>pAnu!Go3lz9!PFK;#<7mc-R(sy#SPi%SthliFFc-o^6xtYaKi}aEZtw&_Q3Vv z9gS*lQPvvmx54zDMF#}{T$;1UH zHUI!X07*naR6f*aX?K^U-v*RAwgNXnN)I!`RAqV>mk?TZg78~}Nubsz;%I)tifpe! zgt{f#v|obuS+yRgK^25xF2mp))2>CQdL)}Fi~82MzFoF)Lq72V2~+x*A6q6IZc=E+*^|N0;WLFQCUC<{paOj$@F&n&X=KIxa;j@p^chpH)GK-X=aB$3(@ert< zkpBCcJ**!8=dY^I@ifZRXMcEKoqvDE7>)YGHGN3V=nM`OFfccWL7zOmi00ssMo z2Pd9=c-+fWj$tBIG~qyemV-kfbXy3;GVMJ7Q9khAw z0i2!c`L!fCQDOj8qz406I=brU@`NC%FI%1Xmg63zM43xyI)Uq{#y|Yec&J~6(yh4HoSP7U!oA!`wzAKC}Wi%pi#EVF$QADI($>{(LFuFvoBSN>J(aOG? zLoEiAswtsZ+DdyNYVT+Mhw@eER%cpfmeP?gf(vS5B2Oe#I2-R7WuQT2it3^eT2??~ zvbkJE&6NOLZfhxs02#`1HE;P-Ok2uz^8*Q0jqT(s_+M=22oRAUeF)Ps$npPSNa-2Et2dpse@ZQx0%k9a= zG-sh=meRnm(e4zLb!3!lmo;C&4PI%8X~5sGFrB8Z)0&mgu|tr`m}!5O_ut)tG+u;tc}f zJ%SKZ6y{T_>0Gm4Q*b){<3IN@Rir%tXwo?FRvoGtxD+hpTWIeN&c#gmb9XhpFX!vB zgh`@Z0A4RmcCK?mEg5YcbI~I*E{8^SeS?i2kTuid6?~MIFI(C0~3&%4z*y~lzIys z798Rh=ai#Epa3k<(Ar`^dHJbbOSI7A;)`=MsrJQqn(o0OZDdRaI&;sa6CfbR)(***(W)P zkTB9VDwp2Dbm%h1>X10boB<&$5F+||N_GtHP)=_)QDMBD24vkOD{P8a8aL^(&ZtkF(2@2d&O z*hx4Cgr;Z)M?+1&hkDl#ZfL`p{}8#%CoBD{eWc`8gp zo%LhfTaYHqp@aF+&%e2XA#p_mTl!M1%@M&w$$Bj%Qmv9`A@Iec1jVj#dNBEm!(wXW z2JjO*1tZdj;8?RasqYYyj>TO1PbFb6Vw^Zf8Azm>_MpkB8TTx%S+bE~3tDKkWLL%d zjB=nU-W}L(RITRY3Qym1`HJVculZ*mQEHh+QY?zLLSLMIbll5SK4l-<=yCvLG?Pf? z@Fs_y=p#|-b}Eu3_q}JG@ctGNr70EnI-Re!QW|tI@h~v3d{n&*NY#c>-4qDYG%5OY zX7A)MiTX_@;|_Z@v+4;2vXvZhAe7U*m)7$;Jjb`Tu}s&+)WhFr{XdEziK4dV9>} zj9DMF&)kiR_S`;aj%$5+c@xcHW+!3QiQ(cr%XtH&6NxHHL zOlN+@9xrzGVIXjvth&+z&&8WeS(?x$uMFNWGiQwXW-EeriAFy_sHhp;V#x>%m$%cU zX}9W3T8ODHEouP?tq3K;w9ooODbANc95b;v7*1Ib)s$m(=Zw)$s{)X3V+t z7<{*pWJ?D4mm_R!91ixqyNz@pDkn&d4tETdhzW?l2SI0ifhGb|Ncp|$;G z*0IQBjF%I~#J0`Ga!B$uZ8F7ILZi?m=6c^B(F)2>5NW+vos*<;N+Od;XwVKM34;>% z<|ub6qDx3pAAzvX25fsUaW>dyK%dPIbe5ncH7O9HDohj zRx9wI+Ym2}Oa>gPSH%|qK>$SHj`cE@1K18u3RFmdEE8-rT1`b~91?5x@bNxgBx1ji z)_pXHhb$`-#%U0SqQNqxH-SyL2mYvw`drwCIn*Z+q#7k!gc3H)mRq0ctK6>Br2TI8 zqq>i{!k%($bCE4()&k^q8_76b|#oOW}*%kk|7b_0lUL{RJL)4l4D zy>rc#*K+n==+*}e$mw>MLTHvDvGnB_yXUw@$q2@oet_wLZ2&BNJ}!CCJ7!?)2nlb> z;{|wL%FxU?9Xw{Mo2Q4sPjmoq>xMQ5#|(xx_*8SNgIOuzx&CVC`XuMefb9lm3X`61 zm<(pE)H#ff<{Qyh9pVN1Ecb9iRUU9R4&D3%H0!{9b+I4JlHN4ab>tXFn*1OzMB8{k=)}of`_Bj)53?p2O`(!7Bxyqg#l|T2 zq)p<_a4LT7D zMgv2<5}ydMPAi1Or0=_577+&p-v-m#h0bzomq|c&Y>^541xb41Hq;FYK?LQ3G$$-! zNj?lFg_8;#&xGN*9|%CAjt&uPfUlSPFpBPN#gy91i{>1sk|NVIP52~YgXe97ANnub z&~R$eNIlxd$0g$f>M<_BEZ!@b45!BoiZkk6vrIwZ4ut&!;e!#pWTGAz&8YA_W8)wy zBPp;uVIJDcGyc3~7m^VfME`i)-cr&rW!szs>W#d z(INPy4z~zu55Na5dKd0xq8og<0i5AcF3->ubSIS_6Py%R-2&H*6T4UjLt+za91zNG z-e!CPV?vZeG!~^G2#9V!BUswp6zos6VFK9&gW8I2{HMUtxuSM-IfsmFu;?FI9 zCMLWjbFf+^JCR`aIa#b0JAhYr>TMglIN@0}DvHQ-CkN(`t zR1#qV4h_tL5KZzP4!~9$j-OR~!>>R9JBcH~TobjNy$CSY7>5EUWgsU3sD_aULSsW1 zl(+B(x~j87Yqk4*BkqmOP zlOMz-!jjJ%qRs$5j7rDCoO<6VqJfR_`Q3#}BqYZpvg#JezG6;fh7>+TGCQbN2@AeF z$ka;)|NJD>MG*p+coA2+s35&ITqtowibKdf2vV!UG3h=UL(6%9#&;htx2oAFd69w& z6!ZUSp4pdkw&66aYI)6`QWtbA!sqx2gtTCy({6zoTZ}O^$pMu~Px=W>wnqfKT6qAo z=>7!|%s{@z)D2FuFBAmb1t0D*qLo2s05^4mbi;TS5HR3CT)>A@LMMc~g4jWb9fT7m zs?ib<`vwhu2@|b&kA|TIDO0B6kiHd@uG&=?s;LGrm8QM!e1+bE{&kGz);ZDyrUf9w z<`w~SPhMSA-$2a$y&+>OXofo0q;nR>(o_wsJ&}rrF#<;ilI-r3iSQbKneZ*};F6e? z18LY#TgLc4K`m1_v{eQI9hp?8JbO3)xF!=SOfwD)HP}G={Nv+ZrV1zXtTt*qHAsP& z4yf=^|3P&$c*0%Wy@-h=yLQVsQDmu1Y{*ms2yqE?Zh9T0YeLdMsbS4vu+4<8;}*d) z8<516dl09I7^hdaF%{G>0z5#QEbV;04UI~}949Doot%|M1~?%wshmd<1{vQZl(pKF z@+Fewx$|K<0+MF1%D0_MuvAzDg4bc8>lcFpxalg0qvv280$J(-gQ1NEcg6{>N07=a z6heEm{M+$^h__AjE>8ij_h0~U+19Ix25pas_|U{da10a-ZajBYa-+}Q6G2Woy~_VXd(MW%*|+vVMSeV)?<7ov$&(pkS*qWYD>&qb=6%tfsk>)C;7qx~=>_h^etU&>C8 z;DPpP_Bll%CCGTr>BUFSbxp4tvsTo)JsL=Dd!;_{@9;6e#3?Z$^9S@Ow! zpM@T6$EU}=Ocm*`Da0E!D$*$5-WX3EdjPfBcU8@R&H~7XL;^f!5c(G?RB8qtsW}=; z2ts2(5!=;fGW+faEtNQ{q~YIxC@+)|Neo(6;21%c@?$;eY8Y&SbzP&nd&)H`kmB4jfu| z$@)lTYJq@oLG!J5uXBXvrGCe(a|ZWvqmt7sL23pGphRM07Q!IYD?3hM!21xf8eqYy z+ZpE48uLl>tB+{|g5gbK>~KeCpDfxtg`ouY@zJ9QZhs z&?HjA^o+Gu%v%|WVeH-#_%FV_sowwjg22~VwAY^Te<}^yq()yNG+d(ZuJbx+Z1;-r zCueG9>;brRa@vR!HKc}-JC^j&HXH7>7=LwGDLuyN^7yl(>N&YLB(WDSE~@Xq^$ek@ zQ$(uTQnwor$YfH!W2Fw`M$L3N-pKnk+6VJU36eh5tkc7%W-?yY$aTCqoFlYiR~9;< zfR7I4|r+(?TdB-BZU5N%|T;kv+eL*b#gffj_qW( z@X_l>(|arw8}uLYIvyD}~_3y@wRDK{c-BTfAtkKI105;d&lb46dl1zyL-Y zEJz==C3J`wXvQ~zI(zQUFz-wxx&n?p>gqA|(C%x#05WFjEiUf25bZ5+C&>voS~E5= zC5ZDfwwDC3P*PRqA!)YE7t2%vVP&W$P40|0!I}M0V?pQ$adq+pvwE%v69Hwg ztz&k*jRy$BHRCL|@rk8EBZWy1o7zsN2Ebtw1FTGA9WbLNWyywxU?9LzEhwes89ji~ z2G^Wh^Sg!WUTm1Y!4I$|hlN}0)X-U3t*yPmGrSI>a%8Fqi>v%7UkXqiDrz;!=hNdS zn5w8sClY&b{D#DX%L~^09}xgL|ANTslXT1+-~VEU`KJn{^x`q3SSytqXh<3c({-d6 zI$3SkA3SCg=4UL+IN>^I;FH9U0K8Iau&iK7+?BKAHHcZz$#{m5J`n86@fQulJ#2Kd z9ctxjrGdonZy0ka_0S1MNr_Xn=o0bS=0d_uAUqMMl-Deffx)&E$y^woEGAbCulc`} z-B*`nIg;S_&?04JsqUWc5qmg?59Ig%6nt4e@o=|yIihumlp#Glg8!evBTMXL?OD(C zaQAz00fWI53&&N>~V zavDpeHr5EzINY|>U_N*FiphG~ z;n>@~w}1Gs_pWqfG@=lzcYiBd;=8pDg(0mY+Fx}u)Q+sx$UVT9V-1lMizuN&)( zZO1r%o@U64nz7c#$+l+H#)sD(>C+LcoBGcRVRFk~Xng)$dw>4R+gbOrLs|;yh>J9c zej3YQIv~-}T9;>cv?)ST%-ogrbswGaUIt$DOUosMIwWp{OV?nm zMk?ZI*V5QNfByO;Q-O8DF#_iPA^&}&AQ<)bAzSwH_tg`zBoePK|D5FcV+5NkwSV=n zcc0T3H?3WibvR~f`LKojFETCuDQ8EY=Pz<`XG#u$9!Zi$(EDuO_|XX>Gs%n))o>8u zP4~

YWwy=pmQ#nt&V7o22?lgr}rMW_^fv`h=DssmxtAhLl&cf?s=(!1TDE6EXUX z`LYF!c@vW8?RnkfN&y;WE?mw#oJ+ zwG1w`BX!(u#z=yb&WMV3p8n<9KWmNa_|Z_dsZ`yu1{AZZV0OxgZjFZ!PoA? zCJ|bHA|fW%hrl=+vnRn6ArEgSMOguCciCSJgWybdwES~h(az>GX*T~bo9Yq#1icE) zPB?I--^IWrd*H@kY;dd!J-LjV4;^KznBOr)Z7Dx{DfvnZvP_$Z&RprB3HEjCm(p)( z2*&*DZ0iI{IIoj5C@<4P#IdP8Og3|cw9-WhGT-GKxF`b?7yJXqPuJ1JOr)z+^oqcI zVNh2Q^?9Dez1-^RC2bFQF#18%BomsOm}kXEX)6oCG{87Cu)N6q@FU~XO)%ToXLBNk z$-$qf3~LPmK{dUpei)o+d|Ii?A7b#!1Rf1)-h3RhJSjT$x08?-5g&@wCLtq* z=29k@+0qfyz%ZTc@nFKBjp1m0#G!9sqCteQ+(#Un(>CNKIftQ`U46HY=d4eof1ylj zUA7Y$Ou63;PJcf#iGD!j*xK&o)w?ED%WE+L1Ui_PwawPBZ66Z}WIatQ$g%LGsEp5= zSikr(;%SmD!1OH5_pU5M7cm}>-o(odZezwiH`)5LuBOfEv{p=e&(z|n+>fyS-tFv!HotRA?Vq!TLdU$1yXr`aX{&F zLc@G^&h?5I%$;cZ$&~^Z93HhV^k^GnJ;X@z|7C_mMDBxlbWYc3CPdb~1oed6MT4^_ zUoTPUFw*c+fBsjQ3W1R{)^^5GVg3k;4MA3LsMv0;pcZV@B%Oq0)X#d&L!uZWW^kF1%_qaDJ9zwdVXbe0hLV~rO zJ7GtKAKi_1ia9ZObo_MuFaMW@ouzR14gQW zLFQPpV%)wF<7pl)+tqox&PuBC^vknO^=sj>IMkJ3Gy^#8{8>37K73!GXgh7W<;4+B z{GHzs9!*6e=pPMtp39w^`_9p$Z(0*7%Hd+N%{J$3j38`4r!pnj5`6G+Y5eSmYkENV(p2VE`lNTm)WL;`CpvPiiU*yDh*oIX}b}`eN)r zZ>8BTT@&DFHGo@i3z1?3g?<<$)IIWXejxgoXx!%o&WfC9unIj9aF#T>+0uN3h*>SEdkiG6Pnet(b5pxRROYZN~&q`_<0vG1Od;OKD^@kVpKF8P}I)dkIc%8mY0IfMr!ufD25=`S7mLJ_!Y{>2nP*Eo!)zADA?d)LB<% z&z1h`Rzx+Y#M}8AGf8-I)|v`4@F-1n`qYDwnm)%=$1&ihXVsV5&QsYY!5HAQ{+$+> zdi5^i{@!G(0`MB{X4^}q5+Nm$oQXS&+R8*oQo!xUq$d6;0+ z_35ZS%o{X%uRh%hP1}EW$L2o%{n4 z%1wiC*Oqf`+sD@^{W^%yhp~ePtW3FZTJs?#gh|GKP&}H=a~6@uTxhUh3%;f+p4~lf zSxqy9!}O-EOn_!LsD0(3VkY&$N^y=EoZDKi3B<1Nbup7R^QS(IN3ln1+=JbSvAbt} zcH+#Zgw-<>_i#=|j`OBAWE|3-Tz);#2jWT^b6I>&RC_P(u-{WJ%Gq4OBju3=0L7t`-<4N#AN z;W8O&O0eQXlYiZ_IG=(FkGt{cH!I>{zl=<;6G*{z-oo^0k@c2B8n`jn>)tT%I3bwo zX%vnLFj=1A$y;u25V0J>r}-zOWL6$G@7-Dk%HeX5V`)5mF_*mlBLw z7ck00&C`w&L*KQlJn!^$z3;v(*7|tG)p>oAshAS;Ibb8W}Lz8joc9Uuc~ z)}G(Vc2}$e%72DC)>FI6$3W3KDn5QdzDw8c{V@66LZ9Wp3 zX5K@1aBv`sfxo&Q7$4lZK+kzvNL|8O3-)2AVW!9n~~U$QD^ zIxt+<^^EHA$_nE`JJx~vI*gern6Z2p{-3@$-241%YjA1K>M&wbnb|@wx_-Q`^-;ne zOBJjLaP((7NzW{P%a%Y3jk9G9yAq7SHUYDZZmdV8_7*JDOH}|!y}rX~?NtV|4EbZP z`2s8Jwe}SDeTS3B>p%YdG*eZz*ZMoC?$^=?u|PodXcdo_X|z#*AQWh~d_Qn3U}ocC zNHr6=ZvuGNHs*uFj;lN=)Fw1D0eQEKY%1Q>65lF@VZpgSs<|AS9VFuR>iAbmGr zfvOE5H_d-DS*o`R@R;r8R{EV#vEMnjj@o?E!mai^N8?%4M7|@{Nx|^8O`_W52MTrh z98a-ijKHdm+Nq%#nE{LRUicA~RkOor=2)Ot#CxI~;5<0Y zzcIF#DS&kzOBt8-=|hXymkFcu2Ey|i6F9xeQ)&*zjGHH2hv1&=>%agbL%Q#!DX&)U2sC_eYQ)z0Tdz#*}XSM_a{sI{;P%Kl}R& zOr^Dt(67e=W}A%}%|~B8GdVPrBt{sBZXOx5HaO7Hz3Ef;Okm+wVCKYS1#MIDv6h%Y zG7Cj_1F!VVPxC^Z7Swr|G(Akh@)`{ajG8t`k(yn=g~wt&>h?GV#$Gyf)sgu#n&2|C()QnB@W zG;)m@qq-d4(!iC4dZyh-6W{x{@a=kUFsTwkp|y|xLv!$P%Qu(HQFEQ;aa$kZHA5`M zPkT`R3isT4JU9p)o~=F%+hco*O#paW$xW1JPt{SL>cfQhQJ&`v%N}a{&Gj=Mhm>~o zG{jK}8Mo}7801#}SUc5+ne}}%ZcXUN4y^T~Cw~0;Wu_W#s0UMpE>xBO0rU8tTo8k; zRSw}9++nDm47UD|?&9{GqELePvvSOxf4+B?RG6H8I+v+Zc=iP9;yk7RGbZ*M+zzu< z)vlFkA1uS*sH>Njhtc|QuR?wFuTOUQY%p`pbKPDJ7X=%3S_IrZJMaGJH>cm#Dplhyl9+OP~N)X((mEECi z!m2&eG!n!8i0YO#Y4XGXt7u6TIvgplBMVP)<0gEba0zU|K;oBI1 zcTr!@C0GYF>refwY_~Z!gs9O9v^QOaAoI*eE2}@l3&H78f}6QJ)fhzey4AhO!B|+_ zIt1Zq*&VF5DK+B;;Pcs<+C$yC}uX4T)cpD-kFJ(yR3Tfh9)FQ!@)L@7Vd zOZb_54wZkMN%tWp{jSiB_ZFQ?OJK7h52QKk@vqAv9zKK*-DD!JlR}c@edngOU@D;d zp7hp7c#WtBvGrqe9zt`{FG#2FgS%k&AECqle0ok535n&v(wB;bgQp3Wr_K9LqJeyX z)tjK|!EJ3AoatwkJkFzxkk0aox;L-d8rTT*#!}e|{nj>L#K_ zw&?ue5_;>{LZWE!C@CfpwiIK@IvX?b@=XLnh&gM!hJe-c1{|TC^el71gw%S>&AWqK zz@?LFpebfAoz);|&H(^au+D&mG-gNG3pon80lsQ=uRCV+D?gm^X@EkkPje?@Y4LOz zs%s*oXOL@4Z=qw>sVXy}Kt!TvgMo>VfF127io?1dZ<^c_*Y$--#-oK;_Z;GK1&Ds#yC^t=i5%m4J%-sivR^of$Jyl)5WeOtJNrhJH){`LR zYb1@J&5UrojoRUi_Y~Iy@&|8!;q~t z-4^*UDa;!0yVU-DLPy#$p2erOa6;JIY_o0_G0K>G7sC!w>qGZw0m8`3d~J>(r9#7D1GwCSl^sUo zDlektyXJjge7o8ERmpL#M?1$1)x%mjD>CJxvAZt_VZ4ZqVJyu1bF6{{dw!sBUz@^i5+by;dA;?!5suM7Kz6?{F_w_^Hasxh!9<8$$Mmje zRNm)$yY|EDlT0;5b`}2cy*ej&7DZ@-CNgPWq4YsG6GXy8XXiDi<5 zl{4|SzebXmOm zc8y&y1^_obi(-TLlbdZj{4 z56r#1Mv%2lKp^W)W-ASH-=vlF4&`_!VhUXdB}peIo`JL8rZ*UOHQCxv+V!9?DT}qK zxsi|qf>wvafm2I`X&uO*S>@wdY@kP~o740_eA_^V4-Z#64J6H)$bJjY2>XCpS;Ne+ zMq&p0u6`2=XG!_<2u`M=56!WlL*7It-hB*zP_B#ZRTumJM24&ge$H5i1JZvO6xl?) zjqwm;0_8Y!9bQZVoc+WK(D_+Is*hfyDO~j1|8NyT$3>2Soj%f23u)bAOz5RC)Q^+! zWFMJqT61z@@rQ#Ons6vxon6!Uu5or)u3*Waff)~#jjhQeDjL4ch!We(7}E9&ZtE%{ zUXpGxy|OV&j5V|c#zFsTOY>to1KoFje)jrhrc$_P0&R$40G(PNuW1bdG?)Q0IRZm4 zvunbYGNUHHUy@?xXfYG1i@8V%fscD{9dw*@PnuUKjEYLAV2R5D6Y#oL`?Zr&gJCM2t=DFV|W+FsEjd|eNqwae)$os)#7CI11pxlsx!S5a< zDQhg3qz&CeWNYv=HcXLpx9}~ef+{B{IL6EZ8$v-v$&TP$5}sC>#mCH^qw~&l`l5{# znPoTSUAU9;A+u*D&fy$0owP~uNoMkCxd@LYEGg5p9C+4%Eb5l4a^_GUY6RgpR!Z{7 zw=Ec7g|GL2dOf-G5aDbLW#+~t7>!`C(^o_b2ECu?mH0q4+=*5`vQe2~8zHUDH2QSxq{tfuFp7fvNO7$Od6QJVOH2{Oh(@Lx8uzpl)E z2OmGMvoj~g|5_WQDsR<8<|JDlh)fxfYHc7!EC#sSyDmfsm@GIz8%N$|OCL4*TbxzB zN6r1JHuxh%qt^2`4az2X*S3wYp__?X^9|lS(drtIxhW7L(gwXUTL%#&5Tb;L5sU;u zAMn!?BGP%`4qCKi>W$>=h6E@gBc6Z$yvX;C*NhlR`fc9An>TRJoXIR}ZBHJGXTe%G zhUnja*H)Ku*GUjV@Z3@f^{b_z+6>0ZZ_@m;tv&Piw0J=Rk0z8z$NHf2a~G*rX#{sr zA1#NN*W6Z4fb5t?C_BOSXeJH1bdY(*A=PsyxwdVm;bp9XPCaN3+@Ig?{d=%5IUA~p zjK67n%f*`&8NZ?`XrTJqYXoFpF#~Bg0o}o3&P;J}c33`m?8p7K&?9F}hX>Y_vwR(} zJyt{Yj3a*}EMaJ%408e{U{LWWjQU`zGXeu6ja`e;4Af6wzra+h;K03mu4?C{A_$uo zX3}`bvv&pnp?I#X$Dm@#d-uGoXs6EtsOxDaxIIWSU@%e2*QFlAWFiMNG)?GJk8`k<9*P3zCT4fD(Qg`{YZ1vbrNInQqn-iMvx6LH8o>JFK9FM6@%9Z9#$*r`98mg@ z^qMoADkc-tJR6)u;5Zpjf6`N~1jmbFCWMn8y4>#VnC&ftE ziX%_OXeq!}-mBWGKLOdgsxyFTCy6ze3BJ6rW9=Bd9{XQ3|9T=CF!1X|cc^Ih8{tLm zBbA0wBSMpJZuDM@$3vQD^r+{SwD;*zb)`gi^AvOnIRz@xF~2Z1WcLHNq!kO?!~FGZhSg*X-a-Ix2AWe?#ga!9KueTwK~Fy6GEPpm6kwz^Q|rFgB@L~N6bg1W6%VOlOpBpd*LLL%5!uO zp0klnml^}?znbJ(`D$Iln{@JlmJ23#d(x=&)RFS&a zSb{lPOkiy@Sr6}gZ`W{jh~%FW64P8PuPPp4w$?CfD~7^klc9EOR^}qy)kl@{QVt&V z(EF#a|B0qr+&hm%p;a5w77z#(a#t%qDwh-q?DfcSO82N#gEG{;$|^CgWCXn%fKe{g zRzxC<#eS=!6E4)4D);oa`{j2a-Ky6qAWxfLeBNfZU;V?&+4Hka^IfE^wkF~Yn)V=S zwQIcV!(3aQG+Js-kZ1tR^(H@G*M=a1H?XEBf>a@2cg*>iv9bnDG(dwaq>6T8>siCO z&I#bi8hP&yghmk-2?g`D!C!C;Oa?yH%RNp4^D3TykwpJ(X`6pj+UZx#d7=gRBuWdI z$yMFWVG8u0el1~89qq-M#oC)BYp_{VXS%&^U(jnicHu0oFORw*q;+P`T75K#$ikY` zyV4+Er8Ok;WZK%4Xg)LIrDj-n=4j#@A7cFTb`dZi#S+robAku~0&%?w45quaI3Z`Y z#!T2(3`n!n67E@kIBuNmD|?q9`mU4%4m|jfkYJ^75QX+x+jLrqdFFjf74SNP61)a# zoKCem^Tj}zq?eg-2WhZ<)=$odqqNs`bNq|$JJ`EQ8Vi(NoeA-~eaUu&owYkyq($wH zQ>pPE#};e^H>S1wA!H7%|M<@@FjcMA7}R(%*=A*Z{ai%xv8KmT3No9#G0SQcJNj?( zte(2Eq#5&T2zKOkEs+M@HIQA$oVQ8lyS!;68?%mtf`p?2ZeNz@^79g+JT%#TD4+64 znOSEZfbc;cB1U^6qTXsm#|AUVhM23YFM$_vk;0h5b5p+Wn1IV2SR)OyrR8GRH>Zb? zpb%?7$81SMIn02^YMd<9DTvkL=R}-WoLNZFXqvWD`C-KM>Yu*c`}IG**!$wQZ8v|O zrQgw+;{t3BvLRq{Lq6dlEHUQ0q`KovIf?XzusCe~_o5^*UltN&yoEizYu)OS)Q?~Z zD~)0*+j^XG65vVgh=><4rn6&r3CsE%%z;03b1pDxhc@HZRigwy~mKbQk z#xdUF;W=ur*;&Hxv#(z4y=py@m+ms$ysOR2H1oy#i?)GWj6gB25}sbg;20Vmm={j~ z>^KsVL1{c8S^4qOq&X8Bn~B1Q(_rz@;PfR5K=54<{JmetB*#M+Hs2l|c9>gIVo^oq zP{%Mxm8hcU(dqr{7&fb}PvHx_q61i;wb-nOpTB;AsbH%LdVIY!*1LvB%6_b=`ypdy zi1Ua>5iZG~qah{?=ijSX+QYz_Z)h1YlHL)j74$i&Q4=bth)($<&Tf*pB$<>yX!3j{ z8lyK2D9QhR#4JVC)bIHo#0bm%(-+!+;~^#((+%T6enpj@*g%XNfgCh|`Yp0y;D}*n zeQ6joLPTjbZQVqnqxy#c@6wc&oZRS~Ei<^Gz?^4mlU?TVVbre7U^O_GXN=~Q{PM}9 z>TIK93t?dh24M7Z2af1&i1~|jB}Ld zCJ!Cc5+TqUQmN_Nbh>Ux;F82zj0yh6WZdE1gW5VGO|{AFyf}*y8xO(` zTujiV9eOzAKO_jWV{OdoiyL+DGQeBgPd0geC8fD)942{9?G1UWXU3w>=2$~-;q#z% z!Y^`myi5!K|j8_NRdrz*V+XFVD%GD&mlD*-y~F&j4xTEll-eB_ZOgv>)b*Mrn! z>m6+MP({7;7!mavtxi%X=oJ>5bIlHnb>ZXRUtlT{ZFR_i&^)BV!8p0Qj(@GGe)&18jqkgjt*8Xq(zMNHsr5%1m-{ z21Vj9>LHAz*44Kc>*V(aezbz;EEGq`;`An;d4qHkQ!+!wWHS;YX^VVl;7qKU6*5F^ zbD?Q(?CIKu1v^Xc6WinJ4q}VI&;t218hJ5mW(gW*l$;Nw<}4&v7n!I0NV{-h7cT~s z@yABY_aBPNZ;w$kk0f$)wdzO#?LCd)Phv93W5zQk!DSjzl>9@&q zOP!B$KUU7v!Rv^IkIK|}djJ4H07*naRC{w@8Yr&h0AxU$zg(Gzhk0~n!WfI@(0ClY z6iAw=Rv@y+rZs&5amboIIMv6FWnYWTw&9Kj6K?Y~hPsWRuK(JO;?{W1VhjtD&O%!_?7Fzyq39&lo%6e$r{%4oIp|q2-1CDPCgdHaB8?TJPk?C2XncI^l9N- z9oDv~Py2ZsRV36(y6v<2`l9dWIZ?KSMjhtq+rO|N8w00ptRY3g;|(4*qx~|8pL{8m zU29l*0-259WQ}~^`?_`n8WR%e#LfVg$9QV{#B_vQmBw_VV^Q#w9c7W05`((MFg-8v z>r59y3Z@>Vpo8JX$0IY%E`iFBPZ4krs`aO@Pcqd=vDklAS*4i7TN5gqrXDM66h=eo zNL&sfsYY9;qtb{dk5c73-Kob?xkqjJXf%ZAuz3xl45_}eWoNK!OXrdu)9D%y;VU-p z46#NuA}KHx57;&r?Rh(dPm<&v9KZLjXWs|vxPVEiFkki2Lz0yQj@VC2kLAQcOh&uN zCVP3Bw&>t$>B!ddOoK%drs)ixKX73i#tdCuv=HhVX9p*Sj7rjPJ+FS7EDy>>A$6Gu zhm+p$C-0zGy>~IlehF91eQ2tSJZ^L7bkE=C3}HIjZ*FcGsWL)0i^{dZMDRO^fnqVr z92ik{@5Z-zG|C)Dw?JIh*w0>{WGdPQwF5w9wni*oa;4Vhj{Ck>B0$FbB0JGs$lmO( z)VdCB-cA;#7T@ll2XK-&B9?<3bQtM0;(qa~2Cytc_Yuwae|%Tc&O9-Oy8Hey7bMPq z^}ElLcnvC3?Yn|-Bbf6hyHA=xKjhI_$Hz3NfhMkPkV8E*09?AyI;89@jo`#XtNEf6 z2ocg+z6RSP6KjTVE%AQznOUv@AaUqL(;PE>>_&lL;ItK}yr;S2U)5DLrSnU8~U4Hn#<{%-;N`&QL$sM}An(Grs7e`Yct!J30yw?1;82kHF#%e^N_;U_T^M@CuQ(upxd zgM2;AkQT{yrvU}-%1Lfv)e8K?_$d>Zn8RE_B*&~NrA=(rm=4swGO%zj3@NE*-Zy4T z&zt|qq{Pj9mRtPES5Nnzw1#GWdv80uNwrjI=17t(A{Om!mv33O z_I`Up+Mn)ylMuNH=bRRs?@J65JWq1)oSM_sDU5!aM0QI1b!}Y500%;d5$@@~nGu<=v)nzKe-J{P|7el%_27=tElguQBya4D~Lz z{hLf#4w$nSPm?VXNrW%&I-&PG97?jewcs5$z0c$Lo~az{wA7qyMpIgp?m3BI>_#T2 zUo;lY07tRBM+W^h;9-#xum1jI@71^Er}%TL?ID#mOZT>& z;dre@A%+lbK44BP8bf_2!7*bL!lS8)GXvbA^`bOjBa@9&8@EwqB6^eC+B$}PN7oIw zNCJ!{pcHXqqpIwC-x$&uNdtr71}j2hj-Dl*pSKZEzQ5y`>#X?frfFt!BRUw9_D;c8(QS{{io2NV;xa?2-^k3ld=WJ!AX-W%J!Xhu7Dw zPYFG9cCkHYFV4>QUWC7i8i|3=6PhoB^B|_WNQ-m#zv<+AP9JEWeD-Oi*{Dz-$#5Q2 zruTXE6o53!O>h6*Jx3ecu>2|DNnhRbWD2g~KojM|=K`+A(~0 z^IbwAx=QfH3Jpzl5iXdo3C+QzZ|eHbUcbmx%EtKcYOL3%AAWl^BJ9igf`du?af$dI zAajp7CVVM1+zv|z8RrYmG>f?E$Wg~bJpVez`nx)Lo_WF>R9fg)|9HIjtM{EY5#tE9 zm0S{GJ0<>I>8)s_qwIU}dWhdT9vJNo{tz|aMEo?l<1d*R(xE*tu`GgCpLLnBJ|eJ# z%urh)Oop$US6OcwSAPgyJ;Vf=BuVd+w1ojCNHB-}R~9y(e%ayGMHr0flB5;`Xb`Ro zw=tiQkNzPBbWnf+a_Zv&4IHCd06nbkeOfFgd?*C|I=F5#2Tv`M(yE!P*O|r-Uu2FY z(Pcbx*aDOG1IB6F{sRpbflHaq@p2h4UBzVE)a7~WT4%p01$9U|Oly3TcQCm&jtNd3 z<4j{!JT1pW3LiOrcjdUd+J>*O}v?r@3VP zs!jRPrD(oMC|cX&W)~p+bymZR>f)JnNcmCyqE(O>SG^2U-r%tf#r)PiP8DNd{mdE5 z=hgRh+Ut43^Igx47dQOeWer{D(Yt8+vE8&@*Y4hJC)hY_aHcK>qjq_F)yzeHc#zBe z;Cb{Z*ZLy&p>2}1Hv3zTx&ab!{Ot8$Sp^i7&1 zX4!Ai?)ps*iI`_RfhLe4nPV3NjjFFlynYv?Yp|Jrj5$yNJ7h%_*za_E*j%iE66(*4 zokaebHIs$4!53}>Cz(ReGqawUi*amJ7oNjB&%SW4`B^E9sr4}lgGp@LeQiBh zON!uTa$CQJL(%?&(%PV@cZHC4<>Nd092q+DsUj zcjot*qeZGahiy{r86Or(pQzz5t&b=g!d@W^EI)gFnyD02-n&Y?aOav^t=~WVMIpOi zm??&&Jq|?m_L~oj{23N+04G4PYa*Q|B&NG(Nrl6sx3!@i`TdfH&DfbRbMj!)Hk^js z>!fa;u~u?y6$ov67Y($zi;y2FsU5s+A=26q4ec}>dh<4OV+c2?8Bat6m4TfQV;eiu zPaNDh9snDx7I$f*=b0p5|I@3z7hi?&7+~gKag|UsI0W@c?5-buM!+Z&7C*+iBc zzA3xy|JOaZ*vomqF9ToT$v?99b$@;>2CnhgWSaixOr6HgY;qrE>&gz$}w20%!FmJrYQ1nChGz3aK_{ z1Ro@nn7aaUkJDUFgXw_zokQkLTIn*OdmFP6ju>XbgObXlEfNqVYoE@USI=2t;qyZb z^ZSJ4dAo_9$LOC2`)_I6=DvR{OYnaW6WWMy&#P@}thcebm0ew))2U|am%J=Ua zYRJ${a1Y}U>iwI52H)l~qN~$Cdwr6rW<2JB9wJh;;Q2>&$H1M}s&uqegqX~$OblhQ zw`Y>){RUS=l@vH>(M|NPHLCOMufz8zonX;C=}mK}FYDAn>9ZP>t2X&v=Mxux)#D*y zdH;m@CxGjCCQ8WE?(8;UyGKywR*>L?^G#A-;Bq!rbFJ<*$V@(qk518J?o|DBYeJD4 zq&ZQMrw+clVp)Mxh>Lp7(WsRNTTLebuuWJCS0^1=b6MrI4=0Sl zXNGY-bERJ=7?_$D5u`lj7O-zevfA9=bBI4P@jegSam3}6dFS>XwPtlRc|qz!eV0Po z_6Bpa+vbUXBVZ!Zruci$N;^#*zD%=ynTGp1#{4|^oDeCf^frS25Z7&cR(7O0-6Y8* z=-5kSinzsXS%GPW+s5a%jgI>XH0xu7uV7};K23W+DRhdn`THCVZwn!#nJthrX`S`! z7}5itPjeRY$(YMxv-Zr7EDOG_Pp@lNFtYdLG3i<6CWf;9x1ZLVb<3D=<~ZRwxmU}H z?KG1)>{%Y%vz8wIF^zxPVee-hhVkc9+l6q2VGYMrs3?Wi$S*YDdJGVb!s zL6(eQ2PLDtX)9>D{=djnq|2CcRRe}0?eNV@WX5Q6Jb<}Xdlueo^ippAX1>g}_uYNh zNQYNPuVS~eCY%jc{C51d1<^kp?ET@teU_?k@|$1Du#A@=DHvmDJmaI&Ke3Ls{WoHrBZG`r^Io9ir z^So%A$88Ik@+(YKe)k=VCnFN?*VD|OtKJ8B?mjQL_DRefZPi{qt7FmU%*pOM&uX-A z1oW-v^S#u#qKx4w+_>Ujj-fWB;=mEQFjExP*v|LWCCHD!cCT2an{|d1txelHo~13$JBd(c zo(E-X+g_=uw@wR-8o4#h+YiKy@FVQR$?O~2Ty-=|&WDQ*Az)TLwD5_#%(XNr8s$Zv zhJXIYS9_oT?)ly~dB8S#*Is;4nW_L|#j3hitDn1BHloSgG_b@_nMMaO)>Urx(}?OJ zjTPC9$@DB|#_yYZ{Y!_&iQ-t%*Ab?1BdiHapSmBOj5CLgxW=0pw98RaA)Z%l zU$o%nUAL&4=bQ(P;d$yDV{nUKBuJd_p$(3x_txhG|8@_fbu0YV z*USoD*#mRmU^MO)+Q&TaS%A8}`;$;D4@V~WP4B1C!JivH%=?E1=e^9x&7C%m(Xp0g z<7SSt8tQ-At9hO|6d`1m?ohbp3w+C6o-{A%HZwHrgo`*xDNRN z`r?c1^sh6kBIt+QtPhztm_wM7Br4`W2p7^U3=2igaAUhMtz|MA7%vw!GNs~F`X)STw7UMHtlU&KVj zO<&+R4Q>IH+gp8{Ftby(tj>FRCC^Cfv`H+qciuV1e<|tthx&b>&4`YcTEb}&Oiu+r zrtP!-TT8O&E=uIQywsE`S!u_6et`iqFcV_SteuE zdB{G>x1VAy)^WS{*YFl564INFIn6Ri^T_3Yf1l%`;+A=aP8zp)OW43j$b($MINqaqMV6VR^ z+CpfH)@qk|V6nD?J+fvPctA23ZfHY4f-yNUVg*2$mO zh3O%bQmU?`!Yr*DoiYPF>f*W1GsRc*olu67V=lWonDhd_SCHq-SZ(m+dNs*Y|&IJBf{n zwRKecGrr;WEQvJdX~j@qRQ74(c9H-*4=#sqU$x+C4)Eu)2Heb`H zRMi@f+ChW;A4D2Abi6v=Cx-G0k;{-u3+f|NwfA3}GJKQ6YukC%o2}@HG?eHFLRFk! z=6M~guQVp+NL;4HwymQYQ4Wk5%*Gm6L)v}wxqcgOKm7XX>yu1XD>a6ydXWmfrW?NQ zI=Z8b^^>_&rzdZO#&vd{2 z(mWGm7E&NJ9$w5>pBEbY-94-KlK6{zJ8aT>Xf-xljKhQL977GFBkEMrv^97(NWpRy z^Ix}<_11!DbzoBXM7UM3a5p%pU0OJ&!iPL;-%+UW-0SMI0rfs&r>R&PYk=X~K(A35j2T-zfyQwr>}Yf) z$WtmU8q7kTXy%QOmLT6R0M!85ZqS7$!$o=9a@`raPm|!z^}Rc{@LSm?r(ChpE1Ofz z0om+vIBOt?g*CZ^Os12$2pB^sq#CTsb}O#iNy$MdVygKF+j`9Vq^#2^o-~oQxSHiO zb^&wTeLM(jCjcE^?bP=pD=_q;K_X}%?|dpvJQhA~E4C1_@Y zBHVV}$AoVgP`Dr3=%e=FedsDizPn9$(Kwse;ir(V=1qbRIC$p4sS5@hs~vOnW#G1c zxTAo_Ci_fi;sZFDXA^XlpK`Qbw|@Tm1*X~+#~8TFPYeQp`QM+2aZzu?jRNPTlfKNK z-7`9nSyv$A^~t-vw@m=gHm#)urBf0Q+H5EBiP)^kfU6TpNEwSvY>z@929q{Sq_u@g zf}V?X4th5DGz~VlG9CgTjHcw#n(Vpi41SA;uw$OYW9a2PsWCOWK7qr^G*}po#&v?> zx36#Z&da3wbsFheX_f2I5)MhM$s-p4bBG%#(r6ztXD{DbdvU^sD2>>;HYKXLs?Q=2 zwmD=BBckr%;^VIN{@*_pADOB3J9v-a!2BU%zsy!5jAYY&R;ZBv6B5)HT8`IqLr1VN zF7xlMIhzyR{eF{!;vm&3j*+H@o8-f2FCNO{%rplvFhR$QTD2H@%+%|q?J>h$8tPuS z5G@wIjq#*`?ze?=P7F>9H?ERePKP}1&GB#>elKa!V4;OhTU36NW23#8IcA)$(CFn>|ZdNqc%jRui^RadrqBxaUFMYA3-vga|uPhX#8s^wv+653=y@E6Wh z;$0&(sB`ghzkBsDrq*D5ckK~QuF42}TbRg=WSIM9{0Z>uB;oc#cj~C;t7g_rAUeYC z*36SmbLnp0Ki#|eF2_X;U70&H!NrWI4ReY_0N%h3Nlem^&auGM6JIv))un^XPZ|SZ zNSrci38IqRa3>tb21I0kS3B?j(w2r?$3kkJd_h}<&=yz>v^LC}MzfjQv{EEeX?upOL!#Ds0VAX8X+GJ5vvoal>qEr$uWc`|`2FfPnaDB2_kS#At!*v3 zBZtM;e=kV3xz1?}-N2q^Qqkt4nS+@?&|d&?LBD%l)WEkZzlT8L=bxEuhwHlSbd9U# zv}@;W1mwE@n@^>YjfHcowrR3F8^IM`GtHwq!;JuX*XJ}-ih}(=_;~#~qV2gC&8>tO z-4^mRp;~1ae%t)%ufP9p?>IB^?c3|U@BU{UVyAW1npDrifxh(` z>Li?_^e{4-YoghQ8GHU`uTL`7Fv`xJ_6&kSKjSLz`#3UOcXM~o*Le+h>;Q_vMydqV zgHys&$G3I*q)w2VW3PKiKiH@$jIhmFW=lSeQsWkXmn19%sde~p0N7d8d) z4t={RAtq0%uACGv`6To4S)$$?A^n>R+v$_f_TIkA^sA2hm^NU`yi^jEgo!@&2cXqi zmZCDBOnnig#GMa4gZK%OICaKM2os!n7DEsH!EIHnNxET+$bUpd(@c+uA!J$bMmmSe z0&nO;IH}ZxU>3)9?R-c$TKHzZ&0Gd5{7X=pB48*v(Ba5@%URM#X+?0ceoPw#?A~o+ zsJ3%xh44;lhW{$7t~o5d&--FdF&rwH`EPe;;KM4KS=tXi``7sT9DLDezCRY9FY0i? zkDtDNgpQxyAeF`)zN>6{0ju*`^NpW8G51!(L%QIZp9Urq4`Paz;L;RpwZDDU0%>Mk zlU%CS3O=N>qvNBA5*WrNHVs4sVta%EpM}$i)1u*YDwi);Cpwo&XKS(xN&RLXJXSFY zC^4uiLB(TO)!v*Y6P|-;sPzVsgGdC2HWAyloC}+%t6?1t=hzk+lIfD5Ugi@G70xy> zAr5wO{gbXeO~aftIk#Oz;(ghS3?j|{c#t?^vajl@fME;5S4r=Q39Roo%*P#^4(a}^ zy;D!0HGKM4pH9*&Ppj8i$shVXY0L8HUB;lK?`csEvfG~JB=F3;90+X4(bO@O&?4LF z#YTdO@We=no9QhA9in`6xi(W3ePJOD@zt+x^$PZI$n3iazlF$$o3M=$DnC1>n_qqS zW^eCb8n@Rm^4osfeosCcP%vqC7^%9p2`{D=3vMlD*Jv*XGi;sZo5{Did(*h3&4-GH zEv5{3Fd2dVFx$E73)le<;y%WDG48!x_{dyCK&zT@=Y!2p{1lGo^(aNwulf6FrkckA zuT^F1q|g57*ih`QUU%!!d`wxlr!fU0n*L!e2N~O}2m#yemtnX)FdeVM!)1StyyTlY zJl?r!t7jr8Hure$5LRv9#!$2S6Sst)!!(@4A_pxTp9CMd!t;hmF~_WZbe-99lxx26 zn>me%yZ#M=YJVakl6zMnh^{0!rUC1@awf<0h!mzIMyh*Hil5^rL)Aglj_q2osRdDGiZ7^X+ zh^qfHpXkfbSoa&ODci^lV}}fgo7b%2AiiFYS5ZPx%+?Lt@JH*cs+)Tiiqv?1s7>YO zjAD%3ZxQN@O7oY;cgUz5IAb7Yyt(06A(%JQdh;fDTZ0<2uaf3Gz1BLC;TLY?u(x%c z6c}C^NoyQ}@1rKtgWl>-{fd`_ic>tW*sH@nhv=f{6O$yCD#7(*oxJFKy4`j|^^ zs$IzM?+nOe<-=3`SlsVZ+*L?xo$BWH`@M_P_O#UcY2wS~09!VsK(pa2$m11*iK#+V zmw1Z~%7AM?X9Hok$0m*mxw*OW59UO`oN9( zOd&KT@s0{z8xwm-|G?6RjdZ7Q5ghL&v&yy zd=)zKpkeZh;@z%elo4jtOXJ^FOT^l-XTyHFw)TSYhU6=zsF+b+n znFe9pE@=*fVJezv2%Qjx+uY@MEzXWDJ|C_8@b#zPCcihAQa}vX*SM~)wH>Ya6>u;$ z-(3SF6z{H2o0Xd)X^A?c!#6kIW(GC5A>;Vwd1heSDUdX0M!VoRlkfX}Aoi!u6F$~W zlBZ*mVXPfAG2=4Rc=L{8um}5zK+xKa$@3wcPDDcRF)7rSsWzUi>Y)XAzfLosOoDBr zH|HBMZy-Wy0yKv2OAN)Eci9&H%UtA_xxeLFur0yBZ(6J2)QBTeK;eOAq7j-?z+^Lv zCiBe!GRv4l7zf5y1_IhA*o-#?!O4N9`&tx1Js*i_H0#idYBon}itDz8P zE)$Sup7~VIkF`>pn3$$t&-HA0SVl{IASe@xV=2_FO4ZvwD>EaA*+KvkLgMJvpJ{)} z_Dz{68@ta5^9g5X0%M*#?(&$*>GQ`$mye0Y8p<5J&vDV8;8`%U`6r#2d02IgKz{6N zEiTYz!VwT?x!1t5pxIr}L6>(gUv_05FZKCJreab#h*%|TQe2DM4+|>_gf24)06o8c zsItzwG~10w%XN!QJ8(C#FN|n=|9yd#+3;6wTTV~eWhpN3pwH9OuZmYIJ}FEi70=D8 zcks_(HMp~%rh6lmlZZ^SQZlr@6%qCwlbEAol5OiZ4>!rRo*zOFCgzTOag%E>N5Xl8 zEC0C2_V07|zHfWJJy5fKo0~S~v{Uu_za<1BOp(xU+s1#>o2yy0g_qL@MV>=5^Uz+W zan)yvg@Tz=7!ksSj+lgvh&6_lr3mwx$9jHKwpmAqZm6(uB!jDd{bBttGGFjH?%h>30Ln46T}Z z5#|j8t9ZtKOwnLl)`{tZ$O|+i5>Y-rSW0ESMYGMpHCbjdYJTn#R z%e1*zeH>f6-xy`IWqlZEgK;hN_c@TSe#|uG5%2~6{QV?TS@<|P7Hu3*5+5SMDz7^O z>|&}%W>MD~j79m_L3g~WVFn{CsVucKh|LU~Y)j2QHX&%=`9a$!eKyf4M*y8m`avo) zV|6`Z3x*k#{>-2^AhuZR+rG4CxykLZXWhogIx^e#6CB6&3nMe5MJ@<@C3Kj_1OO9k97f?x!-83v;)K-f($=Ty zu8L@GN%T2>rZP1F*BSgr=Z|<-D(n`e2)Y6H=U|j zOgI{>yGtOD1fB=JC+b8dGA#|hNvja7KYx9isd(!m4C^RIG1y%uKu|R(5e=ZaH{?Ay z(cq6>t^suS$zJyiTp}C}3-0O%n;3I_Cc6U-!MBFcX0bW>F4Kd{_2`Z!TQH2asWeFj zAyp6zb==-1TOcy|APLOJ5t0pv;5@V!;y9_DEkB+t5{#sc(4NYP@aq?Q=cOcusI!Rc zHWO|m77e(SgG>ueR=?C| zn?i`JQAsEL^ouer6*EZ_f5Wh6xD%qrVgwa%-^&64p+R44*R=p?Cc8IJpA!ocUMZ z20q>Etsl$#7j_i;+3S-`#f`a1jh4A%!ZHR^3xmPGh<6~Gh8EM*+z-`HYyF-}J^_Ge zDmx5Gl9PC(Qmj#AzyaIcig@jEUl$oUx@1nUKwRRU^UyrkU!UGH)Vs2N4s#;p@aX=I8kV2J?*OEw z%y&;JHz}Pzns~H*WfJhFCKDf8Uqws=SvYJSj2WV%yBM|A(C8p+*M1lt7{`1C@Vo%_ zc>VF(x>M8Ls&6|eb#kUTQ_T0qsP8jhtK83DpJXaXG;vMVu77pdH|lYSZ;&;GhMP%` zc@5BWv!Cme2{E;dG*(JI?t#p}04z`nGoSo`CFVHTPrG!@b6nbYF_dj53qc|s(q7d+ zEkqFMj^;r<(tu4~^I`*Si4e$3LQfO`qU+x@-IEZt$ust*$@_7poHY~+ua|`jO>id- zi-|E?WydRsAi-NDi>ckOAIkQ1>ZaWi5F!%T;>N;T8AUl#4E9_#f~p)suY3$81Mkx| z`Z;A#Hln5B5-ziwHxFW#4^Q9ZGcOsZ=!_)Fz%dp?^BpG~JZJ`>Ft0Ki20$uZ ztNPVwR301u_$8w9;2_qYzGJ+pPhE3kMsp2rwtn+15yJ=f&8?cTZbv$0Cf4(5w^~F% zldcb~&{~ugKex%8yt^#o{rGD3C^;SQuy7>vs|mLmq7Jd<58zHBz6<7yoDGv(z5WOz zn&8jOTv6dOVb#wVYXm`qWYCxeSb9ubllbb<%~{Nn=l3o{s_U69hK+(MTt0DkqF^`pDtV#Mxw$IcWN>0N56W*Pl*=i0lX7Cnbw^bL7;Cv1N52e!En!2OK>T*MhND;mf16x-CB4w4sH(u)=*dN z6jI0fzUoJ)GY6%W2GrFyAwW|?+ijg;CEOHXEq-rmG+r8`~_0b4SmVZuzO)fz1spe&4khYm+B0e@W35!P)xP_M%LyqQ7%Khyf&U#w;YU*H2NbyHQT4k2 z_~4XX*Ob9HV=E}z_tEY?Jwo90>At>5Ew&K_0XI`VdKk)1h?=+7w-z}1ZmMAZk6yrq zN&5!}bA>i}q@^zGU|X%OzYA!Mpf#VKeC+V5XD)VMwF9y;kGB;6(d*MpHQJ@0HrVtlZpF$CWjDFJ=U`XmrV#! z_Vq}!Q`wZ3gaZf<7dTZtrbG3)KiPJadmNaE*d5X2Q+UVOG{uaGvg!k3eF8Jn2^_S@ zXrb;szGmPm|1jRk)ix+jV~S^)Z_C?OM${bLS5(dT>9}2ro=W;N2seHUr^aC6a0*o0q7Cf^W))VKvN7|t z(O2U$!lmo6eYXmZ-84rGj{S1)#(vTGaiepHdK z8q+qd7XRtoT=3!c{51%>>miU+0eMeatk7uszIqI~q|V5z0ReGa8SmmCXL?FkBAtFq-58Y3)QprbU^HT&*^m^1O3!L!o|anuWnXI z)yySK4Gd;q+x23ov`(6Fyp1$u+G?8YyK)BI*;AfHV8htC*J+-MymQ~cXNN9GMj|H9 z2FDN0oz`40<_l$r(_G0q8CSW?MMK=-f?z_lV=c)HZC4komV~RUw^yc*7P-G(|Yq7;#dfq9RR^jkcyC!T{M%_Uz|DP~9snDY zDc$cKm@Y45xKRgo9b5s#!LMNd=knCkrJue2CrnjoPkU>$&#A1h^G*GTO~(+Z5gRG& zb{(iu?UF9OsA5T{I+Izm21iX1LrB9=`y*9iB9qkY=>w6)&8c)}Y-Zz<_A+4|3NdKS zPiB8qwIGyeRHgH0!O)y)D5SEktD{c>B6+UhAaa;;id4RWGXy+d0QZ_Yee?xDy9@fL z2#3f7^rjuM(B}SVkOFRH`B@Ry5p(~L$+)1E3P1R6*8XywyzP0(VYWFbXyJ3XOWR!b zp8ONx<`EXDq&ZOTZA#1}qRCkSTG5LQ2T$J3367q@s6oUGQK0Vs2nC;R^&Zf7pRRc! zM#DJ#^^sA!pyNBd_=>4qT-XbDqLP*GVfRLR_^cs#Sm$KbpJ3;`yD#Wf2HCsTqvYa~ zYadNClN=|`QK4#^9+td?!7=dZSK~C@!@LGJP1Z!VGEBc|xJH-YbNBHzLfif6lOFV% zjx2heN*_D8TB`tT?8?pqKmGGbrkY0vyE_o({7l&x$~yooIB!gz zYYK-?s;@qm3$|y1VcY8dew!4PQOlyZ+72!WHgC&gz4H3CkuO+M%A@tv_sEPQ-lM!> zrU~4w-(<(khm8R)K#=Xt;su*A0@Ij`DAKjYLH~W$&VT}UGdBGiv&k5n#~9!)RqV0k zj*ABGt_`t)LBZjouFUV?`H1@k<7|0}=p6)Lb15e9eNuz5PO9au#oWnRKEf6bbMZb{ zgCiI+e-p_1*Ny4-jG1vXzWRV5rl$3$Qpj!hW9+4_tTH}4@85#I3scs8SLUjR=ZPPF z&83fjKFL&%l`O*7*s5yGrD|J%#i?3rP|9TKqt`S*~R`V)o3A&LRfU$J#d2bK^eUX&yBNAFds}(>6AQ5D&`st>&cJDRL>$gW; zW`fWBc$lkax@c^Jcs_}=G0*jDOnhN)jXOrJkqJQ(j+EdyY|V{@w~e6)qH$zZ?w}}s z7baw`nzamebq^3bV8AmLle+WHR;V()d=3Be+I`F&*Qmn(;HB8^>Ap-YKPmMKOto70 zDN%mp;Q?p?Q@QG$Q#tAdlLIKj@uO}rP{W5gLX@=!02$CwzDoCia2db7*#=CZGCYLD z9%=%9SR5i7n`AC#V32y3-OQtQ*j(hX`=bdVu2SAZIP-g58tu{bX{YO(5X{>|QyvAQ z?H2nDpygJJt;>bHaA6<@iHN!CvV|8twra97cof^v=UX)6or*c0;ePQ;A4HP|qc*jj&gv!QN zo61?9kWJPcjSv~<09;m~`LMl1-~gdGjNK>gG#$_h<4%CAT6(5u35Xh?<*b^*BMmp2s#b*}QR9Kx>1JYZ;6+d{Qxx;c{Gx{LTpPK%aoN3a~W zn^>^#LG#7Qyc;tZ?j=p@`>fGazIo-QImSI#I3Nbq&7Uma95uJZbhWSVaPJMZ;@u`X zrPI}`Z5FnrTDG|CzPW@oEUntsB0_X7MKwSiceQpxgSg564Q?-@tyUc{fxc=sr8Ro)x`%MGxn1-4zl#L5rfb%e0 zus$;0jB8CVA-F&>ax;6a?OBI1UX7Df2Q=hk*+B@nqp2TWgT>v?T|52yaf!KUOn&zI zpEA{B`JX)MM{Och$n>w?>1V%pz{L4$h?NQnq)l2y=Nqoxp7CS@-PZ}r?-xn64UwMV z^H<{Czl#f@C$B4OEO=GhF8Gt`}F-^c@;I|Q< z!7SxuDF)M8IRGYLR9}1jfVPy>(-y(F2rxpc42DqA+G;^iBuvKSi>C^);S8jzUL5B=4){`F;kgs;Js_T1O`U~6q` z=81ime8t+CJQ1=SEyfD(jdu%g2@sz})zDTkns)Bk$yL0P`6!DnYC}H>&gxxleFO+p z^KVC){r=&b9->RaWnSumzx8YP*RSc!Pk+1gSa4AI<1)LVef$DbJwC0`^}sUeR>cPK z~ks|a)4RC|C z@!h@Vq0y|vP)S_}oY8n(#oD=(6sFfYp+uBV9=^1am_32i-06hwVwxp<(8H|j^?aSJ#$7qU&?=Z0WZ~wKWKUSxk&jBfQ(-JLvdNCf1`cfybe1#L|2ADD}J)UD7hg+r8=mW{UYSwy`(goaC9^ zv%&7Juqvx_+7qxi>r83MA=2hNJzO1W;QBSYjVmiZU+mf&e!xy@Yl~FxI&Wirb_@($ zU`O*%2M*NT%Je*ffD>kLGHe_^X%6mw&I-9Vx>#M|$CznKTck>#`_{zzBuwnTs?t>s zBld5KR+6S221z5?+cbIi;JK&A#P7O?LtjD}9QqBY+Vb+9 z^)r$$2)aDC2asUvcSF!?;dA()3y*ZU=z2X=>D|NgfXaJVzqRF>Pj4U7+u8!py7c3} zpJb}V$y0+`=9#H_K^B;<1#Ew9wKzHXBE~8mm4!QbsM`ZGZdijjV*)AWJ^hYAn0+%d zc9Ro>cTbTWLWa38UstBXZ1DcM&J@`ciqy%X5t2Lwx!oh6yG@71J^8ZxF_{)p3l^Bc z@5!kT6UHU3zbPkK~z)ua4XS2 zhMF<0{+UB%j&6h39Lhp;7w36w<@x1osL}c}(}wP@SJ%+s{4^SN0{3I+GC>v|K9-v@ z#=yI)Lx@YW_u%wvXkyCw0|p=ScRl0x)a{F}Q&HuDb1ux~p8-Y-x%B+`G*eA6++QWT zMpQCY4v>*eKyoA7xqEu@RTA=L?x?&=h&8djc1zkZ8~`4ywHXAR+X1H|ZV{bRZG=D@ zOlP|@c5|Y3E>-ps^(MGHTl*SwaYo69;G{6zybH|9cHZkDjFg%|G+@j)Hw8_g{2{S0$)!* z>Kn()Lz)&t%$~C566?53dxj$FYB)YBe|&bg{3mH7*C79^pW8%BjBERK=lUE|&Bj9}>}W9vQKNUT8E|7cv`5P= zI)VRgOwozf=>DP(&vkeAq1=M|@pD*z>QOZ&Hwvp(SLR}WR@o+WuR2L6 z^BxS)>Gkc^s3>M#vNXR`gGJIZjVf1pozhi=WZ(?QOw4;860b?p<{08iv=w5a#Ty8D9Z21~a>ZG_Kj}caW7;8Nf^6|+sFbu_ZPX8apm`824MltQo*ViR zQQ7}>Y5x}rufO&L9mk}H4#~pc2?)o*2o}BLut0bbD5*UJSpOua;aJ%0eb?Z%JwJjK zrt>(!GY4TN!5^X>F$8 z%d`u7=%?1_%v_09GFutrJz^9Fwu1*|_sj4YJ;Z36`f=0PF+FR%YJ;yWFMxcJ@<_#Yhu=}QXl>0regu2>he=_Q zFzD~#Zj~L!m1irX2B0s-T=hNHt8On>AMebC-Jee~)v7GQ(23ongY#hujaDLTkC}u> z?>Zay{&l9)-x??VR9*@XOz`aI$%t(;}Bo#J6bV=bBdM6pB779l?Vp4V% zuuY5$snh4cYEX^S%q^PKH(|dug16skp^QD>#8|&A>Eu7;CVw#``H-0zkmc%YU}K6~ z;V{?V#8l-pAZ3rgY93PZOXk?^wQ_$5-FSrBObgO zCg0q@i5Zf@E%=h4$0x5k>E!b?DdLZSt4FTy+fGN{cD#$Z#kllm1S6tuJ@9Z{!KE3+Ir+cISF>K#joy`N)cpaYk2XD(tKP3j?` z=?B_sTn8Sv8=r85tA@-5a&R`*NYVIJYX0@iXfL;`ZPm5z`m4u2m)Yz)yoL#Qa z8Z-BeE{zL_)IBK%OcOBNywne8tAsk1q^#vVo z_B*cR?%xLJy9kx^bdth^<6BY8gqewL#6r6b(jae;fjKdi&bn549qaofUUWTayT2vD zG_ItE0igVxp=XVb9(=qu9b3GK7`hLZqrcr%@6MGzH7i^9CkZ< z%|!p9owfA=l1r~r6-nj#YWu|gNsfbD;KygL8jzT;XYX%fc#B560q2@GH&e$12Gc;z zT`=MhOnBLpO=?q8QRU2|2A2_(?&#kZ+^F;wtS2M)ANl?ePV6gHz!(}l3CB>wHrJQ zQ-9TUG@D7&yhWA&|LvX2Zrd;rMNLVtofHKMIEw-SnqTT~^q;%$CRsam9JuG)p&cM- zx+uJ)3|kg8e9fCfigFIgIu_oR=_GTkxJom))NKXNVMus~v*hGA{SNI-z_Q1cwcYkz zG>BU*4gBN0o`<-Vf2s_@;2UY^9H#wLv2+WV3|wKLsg^P#9Kb2Oe4@y#$Cg;9`NM0W z0`&tc9587RIRfY9Uycuj%Fb3HT8Lg51*D&9Qkl$E5D>>5e_C^FBSFf{+pt&`D+N(0 z4DAqUhZ%BE7+C}bRw0Fm1RjDYU^35w#!Nd%jGIS?)Gk>flo}u&<+=vK(DQ^<5*4ly zQz|AwexV|?FCGi8IY`c(YKQeIJZZ0Z z<)Q?cGh=j>=AYCQaSenM z%V9z^JKBg+;u>uhUSxLrfED=?Mw!{Az}KJo=Oq|a(pnH$$o z?d~Wj{iMn60+iQXQkIW3I8dK_RtN>*o(sA_5?^=NR{})_ESPJBMk}G^kMfD;CLgVq zHH_TBvE*U(1;QG9fhQ+XnXRIZa^KYSTKyRXp%|x*Jj=!6`QcQ%1^v%nRaqzGt+8_7BecthtYvhEAS~9 z=U=o$<&f}6hk3G2@a(?n+Cdg`S?)zpu`H(L?G;IvSi-5*Wt1ActNjgTtYwl<_q-Bw zm;Kpi$6O%z=n7`?%nYs#4zw4?Ogy85HJEUBd|Tm(Ft@aw2)Hb3#xH!Eb6+wDj2D-I zz8FR~;^*plH@#2Yz5fb*tcA?h7>6LB1`6_!r5ZgJorofCp#$}WRUuB+)|1eMOIdk# zqa9X@DHB%3i;dW{4Hi(CC2QJtyj!)+8jC7)ijCjuad|1Eu1_)T*m5X995?s8dQp9Rt zc_t>dPdus-_fv}^(@L+X8w5ll=R+c2nN?olnwnE7$uw z<9c9VVBo(npxlpRU|?Y2iWnF|bwy;3q6P-Uz!0jz2Ll6F#=sD&D Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.inference.abundance_rank.png b/example/gctree.inference.abundance_rank.png deleted file mode 100644 index 0d56173041e430723bb274f9ac6479e922aa2806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127924 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 he=^Pg=b2`+cx{>Z~H%c#>MVCmI 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¨IC}BLR?H$OHNT=6B_JdC0AQDF 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 diff --git a/example/gctree.out.inference.1.nk b/example/gctree.out.inference.1.nk new file mode 100644 index 00000000..e049c851 --- /dev/null +++ b/example/gctree.out.inference.1.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)10:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.1.svg b/example/gctree.out.inference.1.svg new file mode 100644 index 00000000..ddc77376 --- /dev/null +++ b/example/gctree.out.inference.1.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.10.nk b/example/gctree.out.inference.10.nk new file mode 100644 index 00000000..3e48eb17 --- /dev/null +++ b/example/gctree.out.inference.10.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)10:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.10.svg b/example/gctree.out.inference.10.svg new file mode 100644 index 00000000..24eeb5c8 --- /dev/null +++ b/example/gctree.out.inference.10.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.100.nk b/example/gctree.out.inference.100.nk new file mode 100644 index 00000000..3b2dd930 --- /dev/null +++ b/example/gctree.out.inference.100.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)10:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.100.svg b/example/gctree.out.inference.100.svg new file mode 100644 index 00000000..24b830ed --- /dev/null +++ b/example/gctree.out.inference.100.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.101.nk b/example/gctree.out.inference.101.nk new file mode 100644 index 00000000..09951113 --- /dev/null +++ b/example/gctree.out.inference.101.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)10:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.101.svg b/example/gctree.out.inference.101.svg new file mode 100644 index 00000000..24b830ed --- /dev/null +++ b/example/gctree.out.inference.101.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.102.nk b/example/gctree.out.inference.102.nk new file mode 100644 index 00000000..4d566dd6 --- /dev/null +++ b/example/gctree.out.inference.102.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3)7:1,(seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.102.svg b/example/gctree.out.inference.102.svg new file mode 100644 index 00000000..747c38db --- /dev/null +++ b/example/gctree.out.inference.102.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.103.nk b/example/gctree.out.inference.103.nk new file mode 100644 index 00000000..070c434a --- /dev/null +++ b/example/gctree.out.inference.103.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:2,seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.103.svg b/example/gctree.out.inference.103.svg new file mode 100644 index 00000000..15159cf7 --- /dev/null +++ b/example/gctree.out.inference.103.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.104.nk b/example/gctree.out.inference.104.nk new file mode 100644 index 00000000..1648a2f1 --- /dev/null +++ b/example/gctree.out.inference.104.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.104.svg b/example/gctree.out.inference.104.svg new file mode 100644 index 00000000..41f128be --- /dev/null +++ b/example/gctree.out.inference.104.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.105.nk b/example/gctree.out.inference.105.nk new file mode 100644 index 00000000..7df01741 --- /dev/null +++ b/example/gctree.out.inference.105.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.105.svg b/example/gctree.out.inference.105.svg new file mode 100644 index 00000000..15159cf7 --- /dev/null +++ b/example/gctree.out.inference.105.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.106.nk b/example/gctree.out.inference.106.nk new file mode 100644 index 00000000..7b3c5414 --- /dev/null +++ b/example/gctree.out.inference.106.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.106.svg b/example/gctree.out.inference.106.svg new file mode 100644 index 00000000..8e4135cf --- /dev/null +++ b/example/gctree.out.inference.106.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.107.nk b/example/gctree.out.inference.107.nk new file mode 100644 index 00000000..d7e87d8d --- /dev/null +++ b/example/gctree.out.inference.107.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.107.svg b/example/gctree.out.inference.107.svg new file mode 100644 index 00000000..8e4135cf --- /dev/null +++ b/example/gctree.out.inference.107.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.108.nk b/example/gctree.out.inference.108.nk new file mode 100644 index 00000000..9fa83e53 --- /dev/null +++ b/example/gctree.out.inference.108.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)8:1)11:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.108.svg b/example/gctree.out.inference.108.svg new file mode 100644 index 00000000..e731720a --- /dev/null +++ b/example/gctree.out.inference.108.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.109.nk b/example/gctree.out.inference.109.nk new file mode 100644 index 00000000..c8177192 --- /dev/null +++ b/example/gctree.out.inference.109.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq34:2,seq30:2,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)8:1)9:1)11:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.109.svg b/example/gctree.out.inference.109.svg new file mode 100644 index 00000000..ceaa1665 --- /dev/null +++ b/example/gctree.out.inference.109.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.11.nk b/example/gctree.out.inference.11.nk new file mode 100644 index 00000000..80726734 --- /dev/null +++ b/example/gctree.out.inference.11.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:3,(seq34:2,seq28:2)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.11.svg b/example/gctree.out.inference.11.svg new file mode 100644 index 00000000..a39d0d63 --- /dev/null +++ b/example/gctree.out.inference.11.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.110.nk b/example/gctree.out.inference.110.nk new file mode 100644 index 00000000..32117102 --- /dev/null +++ b/example/gctree.out.inference.110.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq34:2,seq28:2)12:1)9:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.110.svg b/example/gctree.out.inference.110.svg new file mode 100644 index 00000000..012f4dba --- /dev/null +++ b/example/gctree.out.inference.110.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.111.nk b/example/gctree.out.inference.111.nk new file mode 100644 index 00000000..5dfaae62 --- /dev/null +++ b/example/gctree.out.inference.111.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)9:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.111.svg b/example/gctree.out.inference.111.svg new file mode 100644 index 00000000..a4f0585c --- /dev/null +++ b/example/gctree.out.inference.111.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.112.nk b/example/gctree.out.inference.112.nk new file mode 100644 index 00000000..7ac7d3e9 --- /dev/null +++ b/example/gctree.out.inference.112.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.112.svg b/example/gctree.out.inference.112.svg new file mode 100644 index 00000000..3fd7d003 --- /dev/null +++ b/example/gctree.out.inference.112.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.113.nk b/example/gctree.out.inference.113.nk new file mode 100644 index 00000000..005ea0ea --- /dev/null +++ b/example/gctree.out.inference.113.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)11:1)10:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.113.svg b/example/gctree.out.inference.113.svg new file mode 100644 index 00000000..cf8c4a12 --- /dev/null +++ b/example/gctree.out.inference.113.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.114.nk b/example/gctree.out.inference.114.nk new file mode 100644 index 00000000..451946cc --- /dev/null +++ b/example/gctree.out.inference.114.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1)8:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.114.svg b/example/gctree.out.inference.114.svg new file mode 100644 index 00000000..1392ba3d --- /dev/null +++ b/example/gctree.out.inference.114.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.115.nk b/example/gctree.out.inference.115.nk new file mode 100644 index 00000000..83a0817f --- /dev/null +++ b/example/gctree.out.inference.115.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.115.svg b/example/gctree.out.inference.115.svg new file mode 100644 index 00000000..a9223013 --- /dev/null +++ b/example/gctree.out.inference.115.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.116.nk b/example/gctree.out.inference.116.nk new file mode 100644 index 00000000..9aba948f --- /dev/null +++ b/example/gctree.out.inference.116.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)10:1)12:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.116.svg b/example/gctree.out.inference.116.svg new file mode 100644 index 00000000..f6d3864d --- /dev/null +++ b/example/gctree.out.inference.116.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.117.nk b/example/gctree.out.inference.117.nk new file mode 100644 index 00000000..3fe1e5d6 --- /dev/null +++ b/example/gctree.out.inference.117.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.117.svg b/example/gctree.out.inference.117.svg new file mode 100644 index 00000000..217a9f4e --- /dev/null +++ b/example/gctree.out.inference.117.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.118.nk b/example/gctree.out.inference.118.nk new file mode 100644 index 00000000..aa589433 --- /dev/null +++ b/example/gctree.out.inference.118.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)10:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.118.svg b/example/gctree.out.inference.118.svg new file mode 100644 index 00000000..b978f64a --- /dev/null +++ b/example/gctree.out.inference.118.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.119.nk b/example/gctree.out.inference.119.nk new file mode 100644 index 00000000..606450bd --- /dev/null +++ b/example/gctree.out.inference.119.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq31:1)seq6:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.119.svg b/example/gctree.out.inference.119.svg new file mode 100644 index 00000000..de1f5804 --- /dev/null +++ b/example/gctree.out.inference.119.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.12.nk b/example/gctree.out.inference.12.nk new file mode 100644 index 00000000..494fd487 --- /dev/null +++ b/example/gctree.out.inference.12.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)10:1)8:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.12.svg b/example/gctree.out.inference.12.svg new file mode 100644 index 00000000..753d23fc --- /dev/null +++ b/example/gctree.out.inference.12.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.120.nk b/example/gctree.out.inference.120.nk new file mode 100644 index 00000000..fca810e6 --- /dev/null +++ b/example/gctree.out.inference.120.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq31:1)seq6:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.120.svg b/example/gctree.out.inference.120.svg new file mode 100644 index 00000000..de1f5804 --- /dev/null +++ b/example/gctree.out.inference.120.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.121.nk b/example/gctree.out.inference.121.nk new file mode 100644 index 00000000..c5e6e6c6 --- /dev/null +++ b/example/gctree.out.inference.121.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:2,seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.121.svg b/example/gctree.out.inference.121.svg new file mode 100644 index 00000000..53ab8b25 --- /dev/null +++ b/example/gctree.out.inference.121.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.122.nk b/example/gctree.out.inference.122.nk new file mode 100644 index 00000000..1cf9e277 --- /dev/null +++ b/example/gctree.out.inference.122.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.122.svg b/example/gctree.out.inference.122.svg new file mode 100644 index 00000000..d68a854f --- /dev/null +++ b/example/gctree.out.inference.122.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.123.nk b/example/gctree.out.inference.123.nk new file mode 100644 index 00000000..ee0478c1 --- /dev/null +++ b/example/gctree.out.inference.123.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.123.svg b/example/gctree.out.inference.123.svg new file mode 100644 index 00000000..53ab8b25 --- /dev/null +++ b/example/gctree.out.inference.123.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.124.nk b/example/gctree.out.inference.124.nk new file mode 100644 index 00000000..bb1f0da5 --- /dev/null +++ b/example/gctree.out.inference.124.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3)10:1)8:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.124.svg b/example/gctree.out.inference.124.svg new file mode 100644 index 00000000..074ed101 --- /dev/null +++ b/example/gctree.out.inference.124.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.125.nk b/example/gctree.out.inference.125.nk new file mode 100644 index 00000000..052e470a --- /dev/null +++ b/example/gctree.out.inference.125.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,(seq22:1,seq23:2)8:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.125.svg b/example/gctree.out.inference.125.svg new file mode 100644 index 00000000..0120f5e6 --- /dev/null +++ b/example/gctree.out.inference.125.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.126.nk b/example/gctree.out.inference.126.nk new file mode 100644 index 00000000..db2abf58 --- /dev/null +++ b/example/gctree.out.inference.126.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.126.svg b/example/gctree.out.inference.126.svg new file mode 100644 index 00000000..d05911ee --- /dev/null +++ b/example/gctree.out.inference.126.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.127.nk b/example/gctree.out.inference.127.nk new file mode 100644 index 00000000..5f294998 --- /dev/null +++ b/example/gctree.out.inference.127.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq28:3)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.127.svg b/example/gctree.out.inference.127.svg new file mode 100644 index 00000000..209b4e78 --- /dev/null +++ b/example/gctree.out.inference.127.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.128.nk b/example/gctree.out.inference.128.nk new file mode 100644 index 00000000..d0e76c90 --- /dev/null +++ b/example/gctree.out.inference.128.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)9:1)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.128.svg b/example/gctree.out.inference.128.svg new file mode 100644 index 00000000..3c49e4e8 --- /dev/null +++ b/example/gctree.out.inference.128.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.129.nk b/example/gctree.out.inference.129.nk new file mode 100644 index 00000000..17d25a25 --- /dev/null +++ b/example/gctree.out.inference.129.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.129.svg b/example/gctree.out.inference.129.svg new file mode 100644 index 00000000..9c8255c8 --- /dev/null +++ b/example/gctree.out.inference.129.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.13.nk b/example/gctree.out.inference.13.nk new file mode 100644 index 00000000..fcf5585d --- /dev/null +++ b/example/gctree.out.inference.13.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)10:1)8:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.13.svg b/example/gctree.out.inference.13.svg new file mode 100644 index 00000000..753d23fc --- /dev/null +++ b/example/gctree.out.inference.13.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.130.nk b/example/gctree.out.inference.130.nk new file mode 100644 index 00000000..db2875b1 --- /dev/null +++ b/example/gctree.out.inference.130.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1,seq19:3,(seq22:1,seq23:2)8:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.130.svg b/example/gctree.out.inference.130.svg new file mode 100644 index 00000000..dc82ccf6 --- /dev/null +++ b/example/gctree.out.inference.130.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.131.nk b/example/gctree.out.inference.131.nk new file mode 100644 index 00000000..2e0c201a --- /dev/null +++ b/example/gctree.out.inference.131.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.131.svg b/example/gctree.out.inference.131.svg new file mode 100644 index 00000000..f7e088fd --- /dev/null +++ b/example/gctree.out.inference.131.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.132.nk b/example/gctree.out.inference.132.nk new file mode 100644 index 00000000..b3cc5ec8 --- /dev/null +++ b/example/gctree.out.inference.132.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)14:1)13:1)12:1)10:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.132.svg b/example/gctree.out.inference.132.svg new file mode 100644 index 00000000..f7e088fd --- /dev/null +++ b/example/gctree.out.inference.132.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.133.nk b/example/gctree.out.inference.133.nk new file mode 100644 index 00000000..22a51060 --- /dev/null +++ b/example/gctree.out.inference.133.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.133.svg b/example/gctree.out.inference.133.svg new file mode 100644 index 00000000..c794363f --- /dev/null +++ b/example/gctree.out.inference.133.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.134.nk b/example/gctree.out.inference.134.nk new file mode 100644 index 00000000..b664e4a4 --- /dev/null +++ b/example/gctree.out.inference.134.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)11:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.134.svg b/example/gctree.out.inference.134.svg new file mode 100644 index 00000000..df49bbd9 --- /dev/null +++ b/example/gctree.out.inference.134.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.135.nk b/example/gctree.out.inference.135.nk new file mode 100644 index 00000000..f16f5b05 --- /dev/null +++ b/example/gctree.out.inference.135.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)11:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.135.svg b/example/gctree.out.inference.135.svg new file mode 100644 index 00000000..df49bbd9 --- /dev/null +++ b/example/gctree.out.inference.135.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.136.nk b/example/gctree.out.inference.136.nk new file mode 100644 index 00000000..8269fa3d --- /dev/null +++ b/example/gctree.out.inference.136.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:2,seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.136.svg b/example/gctree.out.inference.136.svg new file mode 100644 index 00000000..3e8f8449 --- /dev/null +++ b/example/gctree.out.inference.136.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.137.nk b/example/gctree.out.inference.137.nk new file mode 100644 index 00000000..8158e0fe --- /dev/null +++ b/example/gctree.out.inference.137.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)11:1)12:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.137.svg b/example/gctree.out.inference.137.svg new file mode 100644 index 00000000..3e8f8449 --- /dev/null +++ b/example/gctree.out.inference.137.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.138.nk b/example/gctree.out.inference.138.nk new file mode 100644 index 00000000..6b95061b --- /dev/null +++ b/example/gctree.out.inference.138.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,seq28:3)12:1,(seq22:2,seq23:1)9:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.138.svg b/example/gctree.out.inference.138.svg new file mode 100644 index 00000000..574a5671 --- /dev/null +++ b/example/gctree.out.inference.138.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.139.nk b/example/gctree.out.inference.139.nk new file mode 100644 index 00000000..664ad19a --- /dev/null +++ b/example/gctree.out.inference.139.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq34:2,seq28:2)12:1)9:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.139.svg b/example/gctree.out.inference.139.svg new file mode 100644 index 00000000..da92d620 --- /dev/null +++ b/example/gctree.out.inference.139.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.14.nk b/example/gctree.out.inference.14.nk new file mode 100644 index 00000000..638e4522 --- /dev/null +++ b/example/gctree.out.inference.14.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq34:2,seq28:2)11:1)8:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.14.svg b/example/gctree.out.inference.14.svg new file mode 100644 index 00000000..524e63a5 --- /dev/null +++ b/example/gctree.out.inference.14.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.140.nk b/example/gctree.out.inference.140.nk new file mode 100644 index 00000000..7b6a20c6 --- /dev/null +++ b/example/gctree.out.inference.140.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)9:1)10:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.140.svg b/example/gctree.out.inference.140.svg new file mode 100644 index 00000000..f1470be0 --- /dev/null +++ b/example/gctree.out.inference.140.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.141.nk b/example/gctree.out.inference.141.nk new file mode 100644 index 00000000..d56300d6 --- /dev/null +++ b/example/gctree.out.inference.141.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq34:2,seq28:2)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.141.svg b/example/gctree.out.inference.141.svg new file mode 100644 index 00000000..5b24af0a --- /dev/null +++ b/example/gctree.out.inference.141.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.142.nk b/example/gctree.out.inference.142.nk new file mode 100644 index 00000000..1366c3da --- /dev/null +++ b/example/gctree.out.inference.142.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)8:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.142.svg b/example/gctree.out.inference.142.svg new file mode 100644 index 00000000..d386f184 --- /dev/null +++ b/example/gctree.out.inference.142.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.143.nk b/example/gctree.out.inference.143.nk new file mode 100644 index 00000000..68da6fd5 --- /dev/null +++ b/example/gctree.out.inference.143.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:2,seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.143.svg b/example/gctree.out.inference.143.svg new file mode 100644 index 00000000..94cecd06 --- /dev/null +++ b/example/gctree.out.inference.143.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.144.nk b/example/gctree.out.inference.144.nk new file mode 100644 index 00000000..605ca918 --- /dev/null +++ b/example/gctree.out.inference.144.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.144.svg b/example/gctree.out.inference.144.svg new file mode 100644 index 00000000..41528e22 --- /dev/null +++ b/example/gctree.out.inference.144.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.145.nk b/example/gctree.out.inference.145.nk new file mode 100644 index 00000000..a0198626 --- /dev/null +++ b/example/gctree.out.inference.145.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)11:1)12:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.145.svg b/example/gctree.out.inference.145.svg new file mode 100644 index 00000000..94cecd06 --- /dev/null +++ b/example/gctree.out.inference.145.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.146.nk b/example/gctree.out.inference.146.nk new file mode 100644 index 00000000..cab8e7e7 --- /dev/null +++ b/example/gctree.out.inference.146.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)12:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.146.svg b/example/gctree.out.inference.146.svg new file mode 100644 index 00000000..41528e22 --- /dev/null +++ b/example/gctree.out.inference.146.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.147.nk b/example/gctree.out.inference.147.nk new file mode 100644 index 00000000..08f349e5 --- /dev/null +++ b/example/gctree.out.inference.147.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.147.svg b/example/gctree.out.inference.147.svg new file mode 100644 index 00000000..e883acc7 --- /dev/null +++ b/example/gctree.out.inference.147.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.148.nk b/example/gctree.out.inference.148.nk new file mode 100644 index 00000000..24fb0be6 --- /dev/null +++ b/example/gctree.out.inference.148.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.148.svg b/example/gctree.out.inference.148.svg new file mode 100644 index 00000000..e883acc7 --- /dev/null +++ b/example/gctree.out.inference.148.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.149.nk b/example/gctree.out.inference.149.nk new file mode 100644 index 00000000..15819223 --- /dev/null +++ b/example/gctree.out.inference.149.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)12:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.149.svg b/example/gctree.out.inference.149.svg new file mode 100644 index 00000000..d7942cc0 --- /dev/null +++ b/example/gctree.out.inference.149.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.15.nk b/example/gctree.out.inference.15.nk new file mode 100644 index 00000000..b9881e49 --- /dev/null +++ b/example/gctree.out.inference.15.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3)8:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.15.svg b/example/gctree.out.inference.15.svg new file mode 100644 index 00000000..5daf8d66 --- /dev/null +++ b/example/gctree.out.inference.15.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.150.nk b/example/gctree.out.inference.150.nk new file mode 100644 index 00000000..5b5b85a5 --- /dev/null +++ b/example/gctree.out.inference.150.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)12:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.150.svg b/example/gctree.out.inference.150.svg new file mode 100644 index 00000000..d7942cc0 --- /dev/null +++ b/example/gctree.out.inference.150.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.151.nk b/example/gctree.out.inference.151.nk new file mode 100644 index 00000000..a05d87c3 --- /dev/null +++ b/example/gctree.out.inference.151.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)7:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.151.svg b/example/gctree.out.inference.151.svg new file mode 100644 index 00000000..28a1d705 --- /dev/null +++ b/example/gctree.out.inference.151.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.152.nk b/example/gctree.out.inference.152.nk new file mode 100644 index 00000000..cb1b974e --- /dev/null +++ b/example/gctree.out.inference.152.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)7:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.152.svg b/example/gctree.out.inference.152.svg new file mode 100644 index 00000000..28a1d705 --- /dev/null +++ b/example/gctree.out.inference.152.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.153.nk b/example/gctree.out.inference.153.nk new file mode 100644 index 00000000..e6431847 --- /dev/null +++ b/example/gctree.out.inference.153.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)8:1)11:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.153.svg b/example/gctree.out.inference.153.svg new file mode 100644 index 00000000..adc3da26 --- /dev/null +++ b/example/gctree.out.inference.153.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.154.nk b/example/gctree.out.inference.154.nk new file mode 100644 index 00000000..7fb0a097 --- /dev/null +++ b/example/gctree.out.inference.154.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq34:2,seq30:2,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)8:1)11:1)12:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.154.svg b/example/gctree.out.inference.154.svg new file mode 100644 index 00000000..d0ac48b2 --- /dev/null +++ b/example/gctree.out.inference.154.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.155.nk b/example/gctree.out.inference.155.nk new file mode 100644 index 00000000..789380b3 --- /dev/null +++ b/example/gctree.out.inference.155.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)12:1)9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.155.svg b/example/gctree.out.inference.155.svg new file mode 100644 index 00000000..790361fc --- /dev/null +++ b/example/gctree.out.inference.155.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.156.nk b/example/gctree.out.inference.156.nk new file mode 100644 index 00000000..679097d7 --- /dev/null +++ b/example/gctree.out.inference.156.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1,(seq22:1,seq23:2)8:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.156.svg b/example/gctree.out.inference.156.svg new file mode 100644 index 00000000..228596e1 --- /dev/null +++ b/example/gctree.out.inference.156.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.157.nk b/example/gctree.out.inference.157.nk new file mode 100644 index 00000000..a5ec1919 --- /dev/null +++ b/example/gctree.out.inference.157.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)13:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq37:1,(seq22:1,(seq23:1,seq28:3)11:1)8:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.157.svg b/example/gctree.out.inference.157.svg new file mode 100644 index 00000000..1b779cf9 --- /dev/null +++ b/example/gctree.out.inference.157.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.158.nk b/example/gctree.out.inference.158.nk new file mode 100644 index 00000000..a5a18d62 --- /dev/null +++ b/example/gctree.out.inference.158.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.158.svg b/example/gctree.out.inference.158.svg new file mode 100644 index 00000000..7acbe583 --- /dev/null +++ b/example/gctree.out.inference.158.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.159.nk b/example/gctree.out.inference.159.nk new file mode 100644 index 00000000..552985a2 --- /dev/null +++ b/example/gctree.out.inference.159.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq27:2,(seq19:2,(seq22:2,seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.159.svg b/example/gctree.out.inference.159.svg new file mode 100644 index 00000000..78b9d4dc --- /dev/null +++ b/example/gctree.out.inference.159.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.16.nk b/example/gctree.out.inference.16.nk new file mode 100644 index 00000000..d354d58c --- /dev/null +++ b/example/gctree.out.inference.16.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,seq30:3,(seq34:2,seq28:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.16.svg b/example/gctree.out.inference.16.svg new file mode 100644 index 00000000..9058fa49 --- /dev/null +++ b/example/gctree.out.inference.16.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.160.nk b/example/gctree.out.inference.160.nk new file mode 100644 index 00000000..853f1d9c --- /dev/null +++ b/example/gctree.out.inference.160.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)10:1)13:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.160.svg b/example/gctree.out.inference.160.svg new file mode 100644 index 00000000..94258f29 --- /dev/null +++ b/example/gctree.out.inference.160.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.161.nk b/example/gctree.out.inference.161.nk new file mode 100644 index 00000000..9a1edf7c --- /dev/null +++ b/example/gctree.out.inference.161.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)7:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.161.svg b/example/gctree.out.inference.161.svg new file mode 100644 index 00000000..1f54c229 --- /dev/null +++ b/example/gctree.out.inference.161.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.162.nk b/example/gctree.out.inference.162.nk new file mode 100644 index 00000000..abda07a8 --- /dev/null +++ b/example/gctree.out.inference.162.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.162.svg b/example/gctree.out.inference.162.svg new file mode 100644 index 00000000..80564845 --- /dev/null +++ b/example/gctree.out.inference.162.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.163.nk b/example/gctree.out.inference.163.nk new file mode 100644 index 00000000..33c1a6fd --- /dev/null +++ b/example/gctree.out.inference.163.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)11:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.163.svg b/example/gctree.out.inference.163.svg new file mode 100644 index 00000000..a772e941 --- /dev/null +++ b/example/gctree.out.inference.163.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.164.nk b/example/gctree.out.inference.164.nk new file mode 100644 index 00000000..7732759e --- /dev/null +++ b/example/gctree.out.inference.164.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)10:1)13:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.164.svg b/example/gctree.out.inference.164.svg new file mode 100644 index 00000000..07f0ee93 --- /dev/null +++ b/example/gctree.out.inference.164.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.165.nk b/example/gctree.out.inference.165.nk new file mode 100644 index 00000000..1c7a0688 --- /dev/null +++ b/example/gctree.out.inference.165.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,seq23:2)8:1,(seq19:2,seq27:3)10:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.165.svg b/example/gctree.out.inference.165.svg new file mode 100644 index 00000000..8d1f6845 --- /dev/null +++ b/example/gctree.out.inference.165.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.166.nk b/example/gctree.out.inference.166.nk new file mode 100644 index 00000000..96bbca9a --- /dev/null +++ b/example/gctree.out.inference.166.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.166.svg b/example/gctree.out.inference.166.svg new file mode 100644 index 00000000..8877d7a3 --- /dev/null +++ b/example/gctree.out.inference.166.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.167.nk b/example/gctree.out.inference.167.nk new file mode 100644 index 00000000..4a7a49ef --- /dev/null +++ b/example/gctree.out.inference.167.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)13:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq28:3)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.167.svg b/example/gctree.out.inference.167.svg new file mode 100644 index 00000000..6cd773ed --- /dev/null +++ b/example/gctree.out.inference.167.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.168.nk b/example/gctree.out.inference.168.nk new file mode 100644 index 00000000..79ae8964 --- /dev/null +++ b/example/gctree.out.inference.168.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1,seq19:3,(seq22:1,seq23:2)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)8:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.168.svg b/example/gctree.out.inference.168.svg new file mode 100644 index 00000000..266705d5 --- /dev/null +++ b/example/gctree.out.inference.168.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.169.nk b/example/gctree.out.inference.169.nk new file mode 100644 index 00000000..f132098a --- /dev/null +++ b/example/gctree.out.inference.169.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)9:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.169.svg b/example/gctree.out.inference.169.svg new file mode 100644 index 00000000..aaec6e00 --- /dev/null +++ b/example/gctree.out.inference.169.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.17.nk b/example/gctree.out.inference.17.nk new file mode 100644 index 00000000..3f3446de --- /dev/null +++ b/example/gctree.out.inference.17.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.17.svg b/example/gctree.out.inference.17.svg new file mode 100644 index 00000000..9058fa49 --- /dev/null +++ b/example/gctree.out.inference.17.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.170.nk b/example/gctree.out.inference.170.nk new file mode 100644 index 00000000..8b9c06f4 --- /dev/null +++ b/example/gctree.out.inference.170.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.170.svg b/example/gctree.out.inference.170.svg new file mode 100644 index 00000000..5667f353 --- /dev/null +++ b/example/gctree.out.inference.170.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.171.nk b/example/gctree.out.inference.171.nk new file mode 100644 index 00000000..64bb2cb3 --- /dev/null +++ b/example/gctree.out.inference.171.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)11:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.171.svg b/example/gctree.out.inference.171.svg new file mode 100644 index 00000000..5667f353 --- /dev/null +++ b/example/gctree.out.inference.171.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.172.nk b/example/gctree.out.inference.172.nk new file mode 100644 index 00000000..eddf288d --- /dev/null +++ b/example/gctree.out.inference.172.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.172.svg b/example/gctree.out.inference.172.svg new file mode 100644 index 00000000..e4c3caff --- /dev/null +++ b/example/gctree.out.inference.172.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.173.nk b/example/gctree.out.inference.173.nk new file mode 100644 index 00000000..5cb1d1bf --- /dev/null +++ b/example/gctree.out.inference.173.nk @@ -0,0 +1 @@ +((seq3:2,(seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.173.svg b/example/gctree.out.inference.173.svg new file mode 100644 index 00000000..10c82170 --- /dev/null +++ b/example/gctree.out.inference.173.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.174.nk b/example/gctree.out.inference.174.nk new file mode 100644 index 00000000..fb300db0 --- /dev/null +++ b/example/gctree.out.inference.174.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.174.svg b/example/gctree.out.inference.174.svg new file mode 100644 index 00000000..a4476e6c --- /dev/null +++ b/example/gctree.out.inference.174.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.175.nk b/example/gctree.out.inference.175.nk new file mode 100644 index 00000000..c5ba961a --- /dev/null +++ b/example/gctree.out.inference.175.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)9:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.175.svg b/example/gctree.out.inference.175.svg new file mode 100644 index 00000000..14c13c24 --- /dev/null +++ b/example/gctree.out.inference.175.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.176.nk b/example/gctree.out.inference.176.nk new file mode 100644 index 00000000..4ea80083 --- /dev/null +++ b/example/gctree.out.inference.176.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:2,seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.176.svg b/example/gctree.out.inference.176.svg new file mode 100644 index 00000000..ec0169d4 --- /dev/null +++ b/example/gctree.out.inference.176.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.177.nk b/example/gctree.out.inference.177.nk new file mode 100644 index 00000000..5ea9f513 --- /dev/null +++ b/example/gctree.out.inference.177.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.177.svg b/example/gctree.out.inference.177.svg new file mode 100644 index 00000000..ec0169d4 --- /dev/null +++ b/example/gctree.out.inference.177.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.178.nk b/example/gctree.out.inference.178.nk new file mode 100644 index 00000000..cb4652f2 --- /dev/null +++ b/example/gctree.out.inference.178.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.178.svg b/example/gctree.out.inference.178.svg new file mode 100644 index 00000000..921bc5b5 --- /dev/null +++ b/example/gctree.out.inference.178.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.179.nk b/example/gctree.out.inference.179.nk new file mode 100644 index 00000000..c2358e8b --- /dev/null +++ b/example/gctree.out.inference.179.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq31:1)seq6:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)10:1)13:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.179.svg b/example/gctree.out.inference.179.svg new file mode 100644 index 00000000..3dcb0164 --- /dev/null +++ b/example/gctree.out.inference.179.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.18.nk b/example/gctree.out.inference.18.nk new file mode 100644 index 00000000..d44ab7b8 --- /dev/null +++ b/example/gctree.out.inference.18.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)9:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.18.svg b/example/gctree.out.inference.18.svg new file mode 100644 index 00000000..7b68b1aa --- /dev/null +++ b/example/gctree.out.inference.18.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.180.nk b/example/gctree.out.inference.180.nk new file mode 100644 index 00000000..7439068d --- /dev/null +++ b/example/gctree.out.inference.180.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1,(seq22:2,seq23:1)8:1)11:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.180.svg b/example/gctree.out.inference.180.svg new file mode 100644 index 00000000..3da6e002 --- /dev/null +++ b/example/gctree.out.inference.180.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.181.nk b/example/gctree.out.inference.181.nk new file mode 100644 index 00000000..216d9b3b --- /dev/null +++ b/example/gctree.out.inference.181.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq23:1,(seq34:2,seq28:2)12:1,(seq22:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1)8:1)9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.181.svg b/example/gctree.out.inference.181.svg new file mode 100644 index 00000000..c3f70072 --- /dev/null +++ b/example/gctree.out.inference.181.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.182.nk b/example/gctree.out.inference.182.nk new file mode 100644 index 00000000..917cd039 --- /dev/null +++ b/example/gctree.out.inference.182.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)11:1,(seq34:2,seq30:2)13:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.182.svg b/example/gctree.out.inference.182.svg new file mode 100644 index 00000000..6e6cb05c --- /dev/null +++ b/example/gctree.out.inference.182.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.183.nk b/example/gctree.out.inference.183.nk new file mode 100644 index 00000000..9073c716 --- /dev/null +++ b/example/gctree.out.inference.183.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.183.svg b/example/gctree.out.inference.183.svg new file mode 100644 index 00000000..152d5d0c --- /dev/null +++ b/example/gctree.out.inference.183.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.184.nk b/example/gctree.out.inference.184.nk new file mode 100644 index 00000000..ee3f3b96 --- /dev/null +++ b/example/gctree.out.inference.184.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)11:1)10:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.184.svg b/example/gctree.out.inference.184.svg new file mode 100644 index 00000000..152d5d0c --- /dev/null +++ b/example/gctree.out.inference.184.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.185.nk b/example/gctree.out.inference.185.nk new file mode 100644 index 00000000..4d7aa172 --- /dev/null +++ b/example/gctree.out.inference.185.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.185.svg b/example/gctree.out.inference.185.svg new file mode 100644 index 00000000..b23945cd --- /dev/null +++ b/example/gctree.out.inference.185.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.186.nk b/example/gctree.out.inference.186.nk new file mode 100644 index 00000000..b612f0b6 --- /dev/null +++ b/example/gctree.out.inference.186.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.186.svg b/example/gctree.out.inference.186.svg new file mode 100644 index 00000000..b23945cd --- /dev/null +++ b/example/gctree.out.inference.186.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.187.nk b/example/gctree.out.inference.187.nk new file mode 100644 index 00000000..92e6f045 --- /dev/null +++ b/example/gctree.out.inference.187.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.187.svg b/example/gctree.out.inference.187.svg new file mode 100644 index 00000000..d3670026 --- /dev/null +++ b/example/gctree.out.inference.187.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.188.nk b/example/gctree.out.inference.188.nk new file mode 100644 index 00000000..ec1d2edb --- /dev/null +++ b/example/gctree.out.inference.188.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.188.svg b/example/gctree.out.inference.188.svg new file mode 100644 index 00000000..d3670026 --- /dev/null +++ b/example/gctree.out.inference.188.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.189.nk b/example/gctree.out.inference.189.nk new file mode 100644 index 00000000..0836fe56 --- /dev/null +++ b/example/gctree.out.inference.189.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.189.svg b/example/gctree.out.inference.189.svg new file mode 100644 index 00000000..99197e95 --- /dev/null +++ b/example/gctree.out.inference.189.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.19.nk b/example/gctree.out.inference.19.nk new file mode 100644 index 00000000..10ccffd2 --- /dev/null +++ b/example/gctree.out.inference.19.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)8:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.19.svg b/example/gctree.out.inference.19.svg new file mode 100644 index 00000000..c4bbaf86 --- /dev/null +++ b/example/gctree.out.inference.19.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.190.nk b/example/gctree.out.inference.190.nk new file mode 100644 index 00000000..ea48d6ef --- /dev/null +++ b/example/gctree.out.inference.190.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)11:1,(seq34:2,seq30:2)13:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.190.svg b/example/gctree.out.inference.190.svg new file mode 100644 index 00000000..20a6c5f8 --- /dev/null +++ b/example/gctree.out.inference.190.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.191.nk b/example/gctree.out.inference.191.nk new file mode 100644 index 00000000..451ec9c0 --- /dev/null +++ b/example/gctree.out.inference.191.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1,seq19:3,(seq22:1,seq23:2)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.191.svg b/example/gctree.out.inference.191.svg new file mode 100644 index 00000000..493e4b7b --- /dev/null +++ b/example/gctree.out.inference.191.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.192.nk b/example/gctree.out.inference.192.nk new file mode 100644 index 00000000..354b1232 --- /dev/null +++ b/example/gctree.out.inference.192.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.192.svg b/example/gctree.out.inference.192.svg new file mode 100644 index 00000000..d3215ea0 --- /dev/null +++ b/example/gctree.out.inference.192.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.193.nk b/example/gctree.out.inference.193.nk new file mode 100644 index 00000000..702b241d --- /dev/null +++ b/example/gctree.out.inference.193.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)13:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3)11:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.193.svg b/example/gctree.out.inference.193.svg new file mode 100644 index 00000000..069ceae0 --- /dev/null +++ b/example/gctree.out.inference.193.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.194.nk b/example/gctree.out.inference.194.nk new file mode 100644 index 00000000..3cd4e81d --- /dev/null +++ b/example/gctree.out.inference.194.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)12:1)9:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.194.svg b/example/gctree.out.inference.194.svg new file mode 100644 index 00000000..5118d8e3 --- /dev/null +++ b/example/gctree.out.inference.194.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.195.nk b/example/gctree.out.inference.195.nk new file mode 100644 index 00000000..400a6a44 --- /dev/null +++ b/example/gctree.out.inference.195.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)12:1)9:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.195.svg b/example/gctree.out.inference.195.svg new file mode 100644 index 00000000..5118d8e3 --- /dev/null +++ b/example/gctree.out.inference.195.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.196.nk b/example/gctree.out.inference.196.nk new file mode 100644 index 00000000..f3131e24 --- /dev/null +++ b/example/gctree.out.inference.196.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.196.svg b/example/gctree.out.inference.196.svg new file mode 100644 index 00000000..401c453d --- /dev/null +++ b/example/gctree.out.inference.196.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.197.nk b/example/gctree.out.inference.197.nk new file mode 100644 index 00000000..3ffe11de --- /dev/null +++ b/example/gctree.out.inference.197.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.197.svg b/example/gctree.out.inference.197.svg new file mode 100644 index 00000000..401c453d --- /dev/null +++ b/example/gctree.out.inference.197.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.198.nk b/example/gctree.out.inference.198.nk new file mode 100644 index 00000000..8d82e8b1 --- /dev/null +++ b/example/gctree.out.inference.198.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)9:1)12:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.198.svg b/example/gctree.out.inference.198.svg new file mode 100644 index 00000000..f5592bb4 --- /dev/null +++ b/example/gctree.out.inference.198.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.199.nk b/example/gctree.out.inference.199.nk new file mode 100644 index 00000000..881e513d --- /dev/null +++ b/example/gctree.out.inference.199.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq34:2,seq30:2,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)9:1)10:1)12:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.199.svg b/example/gctree.out.inference.199.svg new file mode 100644 index 00000000..55599a1c --- /dev/null +++ b/example/gctree.out.inference.199.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.2.nk b/example/gctree.out.inference.2.nk new file mode 100644 index 00000000..ca17d202 --- /dev/null +++ b/example/gctree.out.inference.2.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.2.svg b/example/gctree.out.inference.2.svg new file mode 100644 index 00000000..eee45795 --- /dev/null +++ b/example/gctree.out.inference.2.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.20.nk b/example/gctree.out.inference.20.nk new file mode 100644 index 00000000..f3ca53bb --- /dev/null +++ b/example/gctree.out.inference.20.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.20.svg b/example/gctree.out.inference.20.svg new file mode 100644 index 00000000..a7a0b055 --- /dev/null +++ b/example/gctree.out.inference.20.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.200.nk b/example/gctree.out.inference.200.nk new file mode 100644 index 00000000..435f3a2d --- /dev/null +++ b/example/gctree.out.inference.200.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)12:1)11:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.200.svg b/example/gctree.out.inference.200.svg new file mode 100644 index 00000000..03b04801 --- /dev/null +++ b/example/gctree.out.inference.200.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.201.nk b/example/gctree.out.inference.201.nk new file mode 100644 index 00000000..f1b2d74d --- /dev/null +++ b/example/gctree.out.inference.201.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq30:3,(seq23:2,(seq34:1,seq28:3)13:1)11:1)12:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.201.svg b/example/gctree.out.inference.201.svg new file mode 100644 index 00000000..fbf58d69 --- /dev/null +++ b/example/gctree.out.inference.201.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.202.nk b/example/gctree.out.inference.202.nk new file mode 100644 index 00000000..1bb09121 --- /dev/null +++ b/example/gctree.out.inference.202.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)11:1)13:1)12:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.202.svg b/example/gctree.out.inference.202.svg new file mode 100644 index 00000000..927faaad --- /dev/null +++ b/example/gctree.out.inference.202.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.203.nk b/example/gctree.out.inference.203.nk new file mode 100644 index 00000000..8985bc87 --- /dev/null +++ b/example/gctree.out.inference.203.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,(seq22:1,seq23:2)9:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.203.svg b/example/gctree.out.inference.203.svg new file mode 100644 index 00000000..86c56d33 --- /dev/null +++ b/example/gctree.out.inference.203.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.204.nk b/example/gctree.out.inference.204.nk new file mode 100644 index 00000000..41de6301 --- /dev/null +++ b/example/gctree.out.inference.204.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,(seq34:2,seq28:2)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.204.svg b/example/gctree.out.inference.204.svg new file mode 100644 index 00000000..51aa9339 --- /dev/null +++ b/example/gctree.out.inference.204.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.205.nk b/example/gctree.out.inference.205.nk new file mode 100644 index 00000000..779e9250 --- /dev/null +++ b/example/gctree.out.inference.205.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)13:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq37:1,(seq22:1,(seq23:1,seq28:3)12:1)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.205.svg b/example/gctree.out.inference.205.svg new file mode 100644 index 00000000..f0d773e1 --- /dev/null +++ b/example/gctree.out.inference.205.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.206.nk b/example/gctree.out.inference.206.nk new file mode 100644 index 00000000..00e76a3a --- /dev/null +++ b/example/gctree.out.inference.206.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)9:1)11:1)13:1)12:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.206.svg b/example/gctree.out.inference.206.svg new file mode 100644 index 00000000..84efd007 --- /dev/null +++ b/example/gctree.out.inference.206.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.207.nk b/example/gctree.out.inference.207.nk new file mode 100644 index 00000000..1da69974 --- /dev/null +++ b/example/gctree.out.inference.207.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)9:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.207.svg b/example/gctree.out.inference.207.svg new file mode 100644 index 00000000..b6b876d0 --- /dev/null +++ b/example/gctree.out.inference.207.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.208.nk b/example/gctree.out.inference.208.nk new file mode 100644 index 00000000..bdae803e --- /dev/null +++ b/example/gctree.out.inference.208.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)10:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.208.svg b/example/gctree.out.inference.208.svg new file mode 100644 index 00000000..1637808e --- /dev/null +++ b/example/gctree.out.inference.208.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.209.nk b/example/gctree.out.inference.209.nk new file mode 100644 index 00000000..c839f7f6 --- /dev/null +++ b/example/gctree.out.inference.209.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)8:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.209.svg b/example/gctree.out.inference.209.svg new file mode 100644 index 00000000..ca0cc8fe --- /dev/null +++ b/example/gctree.out.inference.209.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.21.nk b/example/gctree.out.inference.21.nk new file mode 100644 index 00000000..38927ade --- /dev/null +++ b/example/gctree.out.inference.21.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.21.svg b/example/gctree.out.inference.21.svg new file mode 100644 index 00000000..6242e03a --- /dev/null +++ b/example/gctree.out.inference.21.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.210.nk b/example/gctree.out.inference.210.nk new file mode 100644 index 00000000..3a92b5dc --- /dev/null +++ b/example/gctree.out.inference.210.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.210.svg b/example/gctree.out.inference.210.svg new file mode 100644 index 00000000..171019b5 --- /dev/null +++ b/example/gctree.out.inference.210.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.211.nk b/example/gctree.out.inference.211.nk new file mode 100644 index 00000000..497da39a --- /dev/null +++ b/example/gctree.out.inference.211.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)12:1)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.211.svg b/example/gctree.out.inference.211.svg new file mode 100644 index 00000000..7a1ae327 --- /dev/null +++ b/example/gctree.out.inference.211.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.212.nk b/example/gctree.out.inference.212.nk new file mode 100644 index 00000000..d92a6947 --- /dev/null +++ b/example/gctree.out.inference.212.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,seq23:2)9:1,(seq19:2,seq27:3)11:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.212.svg b/example/gctree.out.inference.212.svg new file mode 100644 index 00000000..33cf333a --- /dev/null +++ b/example/gctree.out.inference.212.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.213.nk b/example/gctree.out.inference.213.nk new file mode 100644 index 00000000..df3e441b --- /dev/null +++ b/example/gctree.out.inference.213.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,(seq34:2,seq28:2)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.213.svg b/example/gctree.out.inference.213.svg new file mode 100644 index 00000000..f389cfb2 --- /dev/null +++ b/example/gctree.out.inference.213.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.214.nk b/example/gctree.out.inference.214.nk new file mode 100644 index 00000000..77137c36 --- /dev/null +++ b/example/gctree.out.inference.214.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)13:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq28:3)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.214.svg b/example/gctree.out.inference.214.svg new file mode 100644 index 00000000..fbdc6f32 --- /dev/null +++ b/example/gctree.out.inference.214.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.215.nk b/example/gctree.out.inference.215.nk new file mode 100644 index 00000000..d5c7f8ff --- /dev/null +++ b/example/gctree.out.inference.215.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq37:1,seq19:3,(seq22:1,seq23:2)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.215.svg b/example/gctree.out.inference.215.svg new file mode 100644 index 00000000..fdb1dbfb --- /dev/null +++ b/example/gctree.out.inference.215.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.216.nk b/example/gctree.out.inference.216.nk new file mode 100644 index 00000000..550f0c33 --- /dev/null +++ b/example/gctree.out.inference.216.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.216.svg b/example/gctree.out.inference.216.svg new file mode 100644 index 00000000..b9cea97b --- /dev/null +++ b/example/gctree.out.inference.216.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.217.nk b/example/gctree.out.inference.217.nk new file mode 100644 index 00000000..a73a90e2 --- /dev/null +++ b/example/gctree.out.inference.217.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1,(seq22:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1)8:1)9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.217.svg b/example/gctree.out.inference.217.svg new file mode 100644 index 00000000..45c84ce0 --- /dev/null +++ b/example/gctree.out.inference.217.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.218.nk b/example/gctree.out.inference.218.nk new file mode 100644 index 00000000..cff97286 --- /dev/null +++ b/example/gctree.out.inference.218.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.218.svg b/example/gctree.out.inference.218.svg new file mode 100644 index 00000000..7c61bbf4 --- /dev/null +++ b/example/gctree.out.inference.218.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.219.nk b/example/gctree.out.inference.219.nk new file mode 100644 index 00000000..cdd07489 --- /dev/null +++ b/example/gctree.out.inference.219.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.219.svg b/example/gctree.out.inference.219.svg new file mode 100644 index 00000000..7c61bbf4 --- /dev/null +++ b/example/gctree.out.inference.219.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.22.nk b/example/gctree.out.inference.22.nk new file mode 100644 index 00000000..7dcc5708 --- /dev/null +++ b/example/gctree.out.inference.22.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.22.svg b/example/gctree.out.inference.22.svg new file mode 100644 index 00000000..3d9a7566 --- /dev/null +++ b/example/gctree.out.inference.22.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.220.nk b/example/gctree.out.inference.220.nk new file mode 100644 index 00000000..6c42ed9e --- /dev/null +++ b/example/gctree.out.inference.220.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq23:1,seq30:3,(seq34:2,seq28:2)11:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.220.svg b/example/gctree.out.inference.220.svg new file mode 100644 index 00000000..9dcfc170 --- /dev/null +++ b/example/gctree.out.inference.220.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 \ No newline at end of file diff --git a/example/gctree.out.inference.221.nk b/example/gctree.out.inference.221.nk new file mode 100644 index 00000000..57bcd69e --- /dev/null +++ b/example/gctree.out.inference.221.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.221.svg b/example/gctree.out.inference.221.svg new file mode 100644 index 00000000..9dcfc170 --- /dev/null +++ b/example/gctree.out.inference.221.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 \ No newline at end of file diff --git a/example/gctree.out.inference.222.nk b/example/gctree.out.inference.222.nk new file mode 100644 index 00000000..70494247 --- /dev/null +++ b/example/gctree.out.inference.222.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)12:1)8:1,(seq27:2,(seq19:2,(seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.222.svg b/example/gctree.out.inference.222.svg new file mode 100644 index 00000000..b5cc0ed3 --- /dev/null +++ b/example/gctree.out.inference.222.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.223.nk b/example/gctree.out.inference.223.nk new file mode 100644 index 00000000..fb996c56 --- /dev/null +++ b/example/gctree.out.inference.223.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1)seq9:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)10:1)7:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.223.svg b/example/gctree.out.inference.223.svg new file mode 100644 index 00000000..012a97f3 --- /dev/null +++ b/example/gctree.out.inference.223.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.224.nk b/example/gctree.out.inference.224.nk new file mode 100644 index 00000000..9f541f2f --- /dev/null +++ b/example/gctree.out.inference.224.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.224.svg b/example/gctree.out.inference.224.svg new file mode 100644 index 00000000..f6c418e0 --- /dev/null +++ b/example/gctree.out.inference.224.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.225.nk b/example/gctree.out.inference.225.nk new file mode 100644 index 00000000..fba9fd8f --- /dev/null +++ b/example/gctree.out.inference.225.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.225.svg b/example/gctree.out.inference.225.svg new file mode 100644 index 00000000..f6c418e0 --- /dev/null +++ b/example/gctree.out.inference.225.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.226.nk b/example/gctree.out.inference.226.nk new file mode 100644 index 00000000..73e17f26 --- /dev/null +++ b/example/gctree.out.inference.226.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)8:1)seq31:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.226.svg b/example/gctree.out.inference.226.svg new file mode 100644 index 00000000..8da8454e --- /dev/null +++ b/example/gctree.out.inference.226.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.227.nk b/example/gctree.out.inference.227.nk new file mode 100644 index 00000000..4ba02d91 --- /dev/null +++ b/example/gctree.out.inference.227.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1,(seq34:2,seq30:2,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)8:1)9:1)11:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.227.svg b/example/gctree.out.inference.227.svg new file mode 100644 index 00000000..fef60be4 --- /dev/null +++ b/example/gctree.out.inference.227.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.228.nk b/example/gctree.out.inference.228.nk new file mode 100644 index 00000000..20eb3fac --- /dev/null +++ b/example/gctree.out.inference.228.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:2,seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.228.svg b/example/gctree.out.inference.228.svg new file mode 100644 index 00000000..c8ec81fe --- /dev/null +++ b/example/gctree.out.inference.228.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.229.nk b/example/gctree.out.inference.229.nk new file mode 100644 index 00000000..b7e499e3 --- /dev/null +++ b/example/gctree.out.inference.229.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.229.svg b/example/gctree.out.inference.229.svg new file mode 100644 index 00000000..428816f4 --- /dev/null +++ b/example/gctree.out.inference.229.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.23.nk b/example/gctree.out.inference.23.nk new file mode 100644 index 00000000..b2cb866c --- /dev/null +++ b/example/gctree.out.inference.23.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.23.svg b/example/gctree.out.inference.23.svg new file mode 100644 index 00000000..e16d714e --- /dev/null +++ b/example/gctree.out.inference.23.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.230.nk b/example/gctree.out.inference.230.nk new file mode 100644 index 00000000..bc77e2ff --- /dev/null +++ b/example/gctree.out.inference.230.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq34:2,seq30:2,(seq23:1,seq28:3)11:1)12:1,(seq22:2,seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.230.svg b/example/gctree.out.inference.230.svg new file mode 100644 index 00000000..c8ec81fe --- /dev/null +++ b/example/gctree.out.inference.230.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.231.nk b/example/gctree.out.inference.231.nk new file mode 100644 index 00000000..7bf374c5 --- /dev/null +++ b/example/gctree.out.inference.231.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)11:1)9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.231.svg b/example/gctree.out.inference.231.svg new file mode 100644 index 00000000..431f4c29 --- /dev/null +++ b/example/gctree.out.inference.231.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.232.nk b/example/gctree.out.inference.232.nk new file mode 100644 index 00000000..e48cfde9 --- /dev/null +++ b/example/gctree.out.inference.232.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,seq28:3)13:1,(seq22:2,seq23:1)9:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.232.svg b/example/gctree.out.inference.232.svg new file mode 100644 index 00000000..ed0ed4eb --- /dev/null +++ b/example/gctree.out.inference.232.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.233.nk b/example/gctree.out.inference.233.nk new file mode 100644 index 00000000..d96ffc15 --- /dev/null +++ b/example/gctree.out.inference.233.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)10:1)13:1)11:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.233.svg b/example/gctree.out.inference.233.svg new file mode 100644 index 00000000..290fae71 --- /dev/null +++ b/example/gctree.out.inference.233.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.234.nk b/example/gctree.out.inference.234.nk new file mode 100644 index 00000000..86953df6 --- /dev/null +++ b/example/gctree.out.inference.234.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.234.svg b/example/gctree.out.inference.234.svg new file mode 100644 index 00000000..99fed085 --- /dev/null +++ b/example/gctree.out.inference.234.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.235.nk b/example/gctree.out.inference.235.nk new file mode 100644 index 00000000..755b17cd --- /dev/null +++ b/example/gctree.out.inference.235.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.235.svg b/example/gctree.out.inference.235.svg new file mode 100644 index 00000000..99fed085 --- /dev/null +++ b/example/gctree.out.inference.235.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.236.nk b/example/gctree.out.inference.236.nk new file mode 100644 index 00000000..9df4d4d7 --- /dev/null +++ b/example/gctree.out.inference.236.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)11:1)13:1)12:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.236.svg b/example/gctree.out.inference.236.svg new file mode 100644 index 00000000..c5b55e50 --- /dev/null +++ b/example/gctree.out.inference.236.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.237.nk b/example/gctree.out.inference.237.nk new file mode 100644 index 00000000..bbc818cd --- /dev/null +++ b/example/gctree.out.inference.237.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq27:2,(seq19:2,(seq22:2,seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.237.svg b/example/gctree.out.inference.237.svg new file mode 100644 index 00000000..7ffdb766 --- /dev/null +++ b/example/gctree.out.inference.237.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.238.nk b/example/gctree.out.inference.238.nk new file mode 100644 index 00000000..2e815480 --- /dev/null +++ b/example/gctree.out.inference.238.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)13:1)11:1,(seq27:2,(seq19:2,(seq22:2,seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.238.svg b/example/gctree.out.inference.238.svg new file mode 100644 index 00000000..37cd2832 --- /dev/null +++ b/example/gctree.out.inference.238.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.239.nk b/example/gctree.out.inference.239.nk new file mode 100644 index 00000000..db873670 --- /dev/null +++ b/example/gctree.out.inference.239.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq23:1,(seq22:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.239.svg b/example/gctree.out.inference.239.svg new file mode 100644 index 00000000..8d5bf0e7 --- /dev/null +++ b/example/gctree.out.inference.239.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.24.nk b/example/gctree.out.inference.24.nk new file mode 100644 index 00000000..532100cd --- /dev/null +++ b/example/gctree.out.inference.24.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)10:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.24.svg b/example/gctree.out.inference.24.svg new file mode 100644 index 00000000..8843781d --- /dev/null +++ b/example/gctree.out.inference.24.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.240.nk b/example/gctree.out.inference.240.nk new file mode 100644 index 00000000..dacbb8b8 --- /dev/null +++ b/example/gctree.out.inference.240.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.240.svg b/example/gctree.out.inference.240.svg new file mode 100644 index 00000000..9c22a20e --- /dev/null +++ b/example/gctree.out.inference.240.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.241.nk b/example/gctree.out.inference.241.nk new file mode 100644 index 00000000..c9a7d753 --- /dev/null +++ b/example/gctree.out.inference.241.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.241.svg b/example/gctree.out.inference.241.svg new file mode 100644 index 00000000..381333f6 --- /dev/null +++ b/example/gctree.out.inference.241.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.242.nk b/example/gctree.out.inference.242.nk new file mode 100644 index 00000000..bdf869ce --- /dev/null +++ b/example/gctree.out.inference.242.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)13:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.242.svg b/example/gctree.out.inference.242.svg new file mode 100644 index 00000000..670b85ce --- /dev/null +++ b/example/gctree.out.inference.242.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.243.nk b/example/gctree.out.inference.243.nk new file mode 100644 index 00000000..c90e2586 --- /dev/null +++ b/example/gctree.out.inference.243.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.243.svg b/example/gctree.out.inference.243.svg new file mode 100644 index 00000000..670b85ce --- /dev/null +++ b/example/gctree.out.inference.243.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.244.nk b/example/gctree.out.inference.244.nk new file mode 100644 index 00000000..63aeddf6 --- /dev/null +++ b/example/gctree.out.inference.244.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.244.svg b/example/gctree.out.inference.244.svg new file mode 100644 index 00000000..3e393653 --- /dev/null +++ b/example/gctree.out.inference.244.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.245.nk b/example/gctree.out.inference.245.nk new file mode 100644 index 00000000..0e3257bc --- /dev/null +++ b/example/gctree.out.inference.245.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.245.svg b/example/gctree.out.inference.245.svg new file mode 100644 index 00000000..4da820a0 --- /dev/null +++ b/example/gctree.out.inference.245.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.246.nk b/example/gctree.out.inference.246.nk new file mode 100644 index 00000000..844cf51f --- /dev/null +++ b/example/gctree.out.inference.246.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.246.svg b/example/gctree.out.inference.246.svg new file mode 100644 index 00000000..4da820a0 --- /dev/null +++ b/example/gctree.out.inference.246.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.247.nk b/example/gctree.out.inference.247.nk new file mode 100644 index 00000000..c7a52d36 --- /dev/null +++ b/example/gctree.out.inference.247.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.247.svg b/example/gctree.out.inference.247.svg new file mode 100644 index 00000000..92172ade --- /dev/null +++ b/example/gctree.out.inference.247.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.248.nk b/example/gctree.out.inference.248.nk new file mode 100644 index 00000000..eecbae7d --- /dev/null +++ b/example/gctree.out.inference.248.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.248.svg b/example/gctree.out.inference.248.svg new file mode 100644 index 00000000..92172ade --- /dev/null +++ b/example/gctree.out.inference.248.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.249.nk b/example/gctree.out.inference.249.nk new file mode 100644 index 00000000..5b604f30 --- /dev/null +++ b/example/gctree.out.inference.249.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.249.svg b/example/gctree.out.inference.249.svg new file mode 100644 index 00000000..8039204a --- /dev/null +++ b/example/gctree.out.inference.249.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.25.nk b/example/gctree.out.inference.25.nk new file mode 100644 index 00000000..aebc3147 --- /dev/null +++ b/example/gctree.out.inference.25.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:3,(seq34:2,seq28:2)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.25.svg b/example/gctree.out.inference.25.svg new file mode 100644 index 00000000..1f766e54 --- /dev/null +++ b/example/gctree.out.inference.25.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.250.nk b/example/gctree.out.inference.250.nk new file mode 100644 index 00000000..cd4c9467 --- /dev/null +++ b/example/gctree.out.inference.250.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq30:2,(seq22:2,seq23:1,(seq34:2,seq28:2)12:1)8:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.250.svg b/example/gctree.out.inference.250.svg new file mode 100644 index 00000000..32917fea --- /dev/null +++ b/example/gctree.out.inference.250.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.251.nk b/example/gctree.out.inference.251.nk new file mode 100644 index 00000000..b4f98869 --- /dev/null +++ b/example/gctree.out.inference.251.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.251.svg b/example/gctree.out.inference.251.svg new file mode 100644 index 00000000..c06f6964 --- /dev/null +++ b/example/gctree.out.inference.251.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.252.nk b/example/gctree.out.inference.252.nk new file mode 100644 index 00000000..5f844e1d --- /dev/null +++ b/example/gctree.out.inference.252.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.252.svg b/example/gctree.out.inference.252.svg new file mode 100644 index 00000000..fa7e8624 --- /dev/null +++ b/example/gctree.out.inference.252.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.253.nk b/example/gctree.out.inference.253.nk new file mode 100644 index 00000000..1f69ed8f --- /dev/null +++ b/example/gctree.out.inference.253.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.253.svg b/example/gctree.out.inference.253.svg new file mode 100644 index 00000000..fa7e8624 --- /dev/null +++ b/example/gctree.out.inference.253.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.254.nk b/example/gctree.out.inference.254.nk new file mode 100644 index 00000000..504692f6 --- /dev/null +++ b/example/gctree.out.inference.254.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)12:1,(seq22:2,seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.254.svg b/example/gctree.out.inference.254.svg new file mode 100644 index 00000000..6311b5aa --- /dev/null +++ b/example/gctree.out.inference.254.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.255.nk b/example/gctree.out.inference.255.nk new file mode 100644 index 00000000..4bee3657 --- /dev/null +++ b/example/gctree.out.inference.255.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.255.svg b/example/gctree.out.inference.255.svg new file mode 100644 index 00000000..3c593175 --- /dev/null +++ b/example/gctree.out.inference.255.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 \ No newline at end of file diff --git a/example/gctree.out.inference.256.nk b/example/gctree.out.inference.256.nk new file mode 100644 index 00000000..0d083c9b --- /dev/null +++ b/example/gctree.out.inference.256.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)8:1)11:1)14:1)12:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.256.svg b/example/gctree.out.inference.256.svg new file mode 100644 index 00000000..5fcbe3da --- /dev/null +++ b/example/gctree.out.inference.256.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.257.nk b/example/gctree.out.inference.257.nk new file mode 100644 index 00000000..8c9d42b6 --- /dev/null +++ b/example/gctree.out.inference.257.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)13:1)9:1,(seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.257.svg b/example/gctree.out.inference.257.svg new file mode 100644 index 00000000..d06780d0 --- /dev/null +++ b/example/gctree.out.inference.257.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.258.nk b/example/gctree.out.inference.258.nk new file mode 100644 index 00000000..9af89d45 --- /dev/null +++ b/example/gctree.out.inference.258.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)14:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.258.svg b/example/gctree.out.inference.258.svg new file mode 100644 index 00000000..d7b51be6 --- /dev/null +++ b/example/gctree.out.inference.258.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.259.nk b/example/gctree.out.inference.259.nk new file mode 100644 index 00000000..6fede0c0 --- /dev/null +++ b/example/gctree.out.inference.259.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1)8:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.259.svg b/example/gctree.out.inference.259.svg new file mode 100644 index 00000000..13bdf32e --- /dev/null +++ b/example/gctree.out.inference.259.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.26.nk b/example/gctree.out.inference.26.nk new file mode 100644 index 00000000..b2e54625 --- /dev/null +++ b/example/gctree.out.inference.26.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)9:1)11:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.26.svg b/example/gctree.out.inference.26.svg new file mode 100644 index 00000000..8122538c --- /dev/null +++ b/example/gctree.out.inference.26.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.260.nk b/example/gctree.out.inference.260.nk new file mode 100644 index 00000000..50e8e710 --- /dev/null +++ b/example/gctree.out.inference.260.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1)8:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.260.svg b/example/gctree.out.inference.260.svg new file mode 100644 index 00000000..13bdf32e --- /dev/null +++ b/example/gctree.out.inference.260.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.261.nk b/example/gctree.out.inference.261.nk new file mode 100644 index 00000000..33995253 --- /dev/null +++ b/example/gctree.out.inference.261.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1,(seq27:2,(seq19:2,(seq22:2,seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.261.svg b/example/gctree.out.inference.261.svg new file mode 100644 index 00000000..5301e7f0 --- /dev/null +++ b/example/gctree.out.inference.261.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.262.nk b/example/gctree.out.inference.262.nk new file mode 100644 index 00000000..f1cb9b2a --- /dev/null +++ b/example/gctree.out.inference.262.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)14:1)12:1,(seq37:1,(seq22:1,seq23:2)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.262.svg b/example/gctree.out.inference.262.svg new file mode 100644 index 00000000..d120884f --- /dev/null +++ b/example/gctree.out.inference.262.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.263.nk b/example/gctree.out.inference.263.nk new file mode 100644 index 00000000..1f5bc9e5 --- /dev/null +++ b/example/gctree.out.inference.263.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)14:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,(seq22:1,(seq23:1,seq28:3)12:1)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.263.svg b/example/gctree.out.inference.263.svg new file mode 100644 index 00000000..415c0818 --- /dev/null +++ b/example/gctree.out.inference.263.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.264.nk b/example/gctree.out.inference.264.nk new file mode 100644 index 00000000..826ece85 --- /dev/null +++ b/example/gctree.out.inference.264.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq37:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.264.svg b/example/gctree.out.inference.264.svg new file mode 100644 index 00000000..8d96fdd9 --- /dev/null +++ b/example/gctree.out.inference.264.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.265.nk b/example/gctree.out.inference.265.nk new file mode 100644 index 00000000..4cfb6a63 --- /dev/null +++ b/example/gctree.out.inference.265.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq34:2,seq30:2,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)9:1)10:1)12:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.265.svg b/example/gctree.out.inference.265.svg new file mode 100644 index 00000000..cf7cbbc0 --- /dev/null +++ b/example/gctree.out.inference.265.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.266.nk b/example/gctree.out.inference.266.nk new file mode 100644 index 00000000..5ebc9a9b --- /dev/null +++ b/example/gctree.out.inference.266.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.266.svg b/example/gctree.out.inference.266.svg new file mode 100644 index 00000000..0f1aa586 --- /dev/null +++ b/example/gctree.out.inference.266.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.267.nk b/example/gctree.out.inference.267.nk new file mode 100644 index 00000000..d1e4bfea --- /dev/null +++ b/example/gctree.out.inference.267.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.267.svg b/example/gctree.out.inference.267.svg new file mode 100644 index 00000000..0f1aa586 --- /dev/null +++ b/example/gctree.out.inference.267.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.268.nk b/example/gctree.out.inference.268.nk new file mode 100644 index 00000000..81f9b057 --- /dev/null +++ b/example/gctree.out.inference.268.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)14:1)12:1)11:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.268.svg b/example/gctree.out.inference.268.svg new file mode 100644 index 00000000..30df3b33 --- /dev/null +++ b/example/gctree.out.inference.268.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.269.nk b/example/gctree.out.inference.269.nk new file mode 100644 index 00000000..a722691d --- /dev/null +++ b/example/gctree.out.inference.269.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)14:1)12:1)11:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.269.svg b/example/gctree.out.inference.269.svg new file mode 100644 index 00000000..2ba97a19 --- /dev/null +++ b/example/gctree.out.inference.269.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.27.nk b/example/gctree.out.inference.27.nk new file mode 100644 index 00000000..55454934 --- /dev/null +++ b/example/gctree.out.inference.27.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:2,(seq34:1,seq28:3)12:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.27.svg b/example/gctree.out.inference.27.svg new file mode 100644 index 00000000..0ea72ae5 --- /dev/null +++ b/example/gctree.out.inference.27.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.270.nk b/example/gctree.out.inference.270.nk new file mode 100644 index 00000000..8aa227fb --- /dev/null +++ b/example/gctree.out.inference.270.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)14:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq28:3)12:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.270.svg b/example/gctree.out.inference.270.svg new file mode 100644 index 00000000..e110995a --- /dev/null +++ b/example/gctree.out.inference.270.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.271.nk b/example/gctree.out.inference.271.nk new file mode 100644 index 00000000..fdd212f8 --- /dev/null +++ b/example/gctree.out.inference.271.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)15:1)13:1,(seq39:1,seq5:1,(seq16:4,seq36:1)16:1)seq14:1,(seq37:1,(seq22:1,seq23:2)10:1,(seq19:2,seq27:3)12:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.271.svg b/example/gctree.out.inference.271.svg new file mode 100644 index 00000000..0eed981c --- /dev/null +++ b/example/gctree.out.inference.271.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.272.nk b/example/gctree.out.inference.272.nk new file mode 100644 index 00000000..98dd4c41 --- /dev/null +++ b/example/gctree.out.inference.272.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1,(seq22:1,(seq37:1)seq9:1)8:1)9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.272.svg b/example/gctree.out.inference.272.svg new file mode 100644 index 00000000..005562dd --- /dev/null +++ b/example/gctree.out.inference.272.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 \ No newline at end of file diff --git a/example/gctree.out.inference.273.nk b/example/gctree.out.inference.273.nk new file mode 100644 index 00000000..2253e77a --- /dev/null +++ b/example/gctree.out.inference.273.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)10:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq30:2,(seq34:1,seq28:3)14:1)13:1,(seq37:1,(seq19:2,seq27:3)12:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.273.svg b/example/gctree.out.inference.273.svg new file mode 100644 index 00000000..caca1b8e --- /dev/null +++ b/example/gctree.out.inference.273.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.274.nk b/example/gctree.out.inference.274.nk new file mode 100644 index 00000000..cfe13163 --- /dev/null +++ b/example/gctree.out.inference.274.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq30:2,(seq34:1,(seq28:2,(seq23:1,(seq22:1,(seq37:1,seq19:3)seq9:1)9:1)10:1)12:1)14:1)13:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.274.svg b/example/gctree.out.inference.274.svg new file mode 100644 index 00000000..3b7d1208 --- /dev/null +++ b/example/gctree.out.inference.274.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.275.nk b/example/gctree.out.inference.275.nk new file mode 100644 index 00000000..b2010afa --- /dev/null +++ b/example/gctree.out.inference.275.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)14:1)13:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.275.svg b/example/gctree.out.inference.275.svg new file mode 100644 index 00000000..8db965cf --- /dev/null +++ b/example/gctree.out.inference.275.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.276.nk b/example/gctree.out.inference.276.nk new file mode 100644 index 00000000..24577eb0 --- /dev/null +++ b/example/gctree.out.inference.276.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq27:2,(seq19:2,(seq37:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)14:1)12:1)9:1)seq9:1)7:1)11:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.276.svg b/example/gctree.out.inference.276.svg new file mode 100644 index 00000000..e81dad8b --- /dev/null +++ b/example/gctree.out.inference.276.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.277.nk b/example/gctree.out.inference.277.nk new file mode 100644 index 00000000..96306611 --- /dev/null +++ b/example/gctree.out.inference.277.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)11:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.277.svg b/example/gctree.out.inference.277.svg new file mode 100644 index 00000000..ba60e7b3 --- /dev/null +++ b/example/gctree.out.inference.277.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 \ No newline at end of file diff --git a/example/gctree.out.inference.278.nk b/example/gctree.out.inference.278.nk new file mode 100644 index 00000000..0fa32b8d --- /dev/null +++ b/example/gctree.out.inference.278.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.278.svg b/example/gctree.out.inference.278.svg new file mode 100644 index 00000000..cd47b3cb --- /dev/null +++ b/example/gctree.out.inference.278.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.279.nk b/example/gctree.out.inference.279.nk new file mode 100644 index 00000000..ced5d7bf --- /dev/null +++ b/example/gctree.out.inference.279.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)12:1)8:1,(seq27:2,(seq19:2,(seq37:1)seq9:1)7:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.279.svg b/example/gctree.out.inference.279.svg new file mode 100644 index 00000000..ba9594c9 --- /dev/null +++ b/example/gctree.out.inference.279.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.28.nk b/example/gctree.out.inference.28.nk new file mode 100644 index 00000000..0ca6318c --- /dev/null +++ b/example/gctree.out.inference.28.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.28.svg b/example/gctree.out.inference.28.svg new file mode 100644 index 00000000..fdc1f718 --- /dev/null +++ b/example/gctree.out.inference.28.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.280.nk b/example/gctree.out.inference.280.nk new file mode 100644 index 00000000..ce1d5355 --- /dev/null +++ b/example/gctree.out.inference.280.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)14:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq27:2,(seq19:2,(seq37:1,(seq22:1,(seq23:1,seq28:3)12:1)9:1)seq9:1)7:1)11:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)13:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.280.svg b/example/gctree.out.inference.280.svg new file mode 100644 index 00000000..7d223d73 --- /dev/null +++ b/example/gctree.out.inference.280.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.281.nk b/example/gctree.out.inference.281.nk new file mode 100644 index 00000000..65a8ef3a --- /dev/null +++ b/example/gctree.out.inference.281.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)14:1)12:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.281.svg b/example/gctree.out.inference.281.svg new file mode 100644 index 00000000..94a6c708 --- /dev/null +++ b/example/gctree.out.inference.281.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.282.nk b/example/gctree.out.inference.282.nk new file mode 100644 index 00000000..c13dcf87 --- /dev/null +++ b/example/gctree.out.inference.282.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq37:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)14:1)12:1)9:1)seq9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.282.svg b/example/gctree.out.inference.282.svg new file mode 100644 index 00000000..94a6c708 --- /dev/null +++ b/example/gctree.out.inference.282.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.283.nk b/example/gctree.out.inference.283.nk new file mode 100644 index 00000000..f23016fc --- /dev/null +++ b/example/gctree.out.inference.283.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)13:1)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)14:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.283.svg b/example/gctree.out.inference.283.svg new file mode 100644 index 00000000..5abd468a --- /dev/null +++ b/example/gctree.out.inference.283.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.284.nk b/example/gctree.out.inference.284.nk new file mode 100644 index 00000000..77ef7977 --- /dev/null +++ b/example/gctree.out.inference.284.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)13:1)seq15:1,(seq37:1,(seq19:2,seq27:3)10:1,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)14:1)12:1)11:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.284.svg b/example/gctree.out.inference.284.svg new file mode 100644 index 00000000..5abd468a --- /dev/null +++ b/example/gctree.out.inference.284.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.285.nk b/example/gctree.out.inference.285.nk new file mode 100644 index 00000000..23547235 --- /dev/null +++ b/example/gctree.out.inference.285.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)14:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.285.svg b/example/gctree.out.inference.285.svg new file mode 100644 index 00000000..87d4423c --- /dev/null +++ b/example/gctree.out.inference.285.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.286.nk b/example/gctree.out.inference.286.nk new file mode 100644 index 00000000..4c68ed64 --- /dev/null +++ b/example/gctree.out.inference.286.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1,(seq37:1,(seq19:2,seq27:3)11:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)14:1)12:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.286.svg b/example/gctree.out.inference.286.svg new file mode 100644 index 00000000..87d4423c --- /dev/null +++ b/example/gctree.out.inference.286.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.287.nk b/example/gctree.out.inference.287.nk new file mode 100644 index 00000000..5a7bc724 --- /dev/null +++ b/example/gctree.out.inference.287.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq23:1,seq28:3,(seq34:2,seq30:2)13:1,(seq22:1,(seq37:1)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.287.svg b/example/gctree.out.inference.287.svg new file mode 100644 index 00000000..8da59b9d --- /dev/null +++ b/example/gctree.out.inference.287.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.288.nk b/example/gctree.out.inference.288.nk new file mode 100644 index 00000000..b269a15b --- /dev/null +++ b/example/gctree.out.inference.288.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)13:1)11:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.288.svg b/example/gctree.out.inference.288.svg new file mode 100644 index 00000000..2c2a0ba9 --- /dev/null +++ b/example/gctree.out.inference.288.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.289.nk b/example/gctree.out.inference.289.nk new file mode 100644 index 00000000..522f6d85 --- /dev/null +++ b/example/gctree.out.inference.289.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,((seq23:2,seq30:2,(seq34:1,seq28:3)13:1)11:1,(seq22:1,(seq37:1)seq9:1)7:1)8:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)12:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.289.svg b/example/gctree.out.inference.289.svg new file mode 100644 index 00000000..0e32ed1e --- /dev/null +++ b/example/gctree.out.inference.289.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.29.nk b/example/gctree.out.inference.29.nk new file mode 100644 index 00000000..0267b83e --- /dev/null +++ b/example/gctree.out.inference.29.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)11:1)10:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.29.svg b/example/gctree.out.inference.29.svg new file mode 100644 index 00000000..d6b2bed1 --- /dev/null +++ b/example/gctree.out.inference.29.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.290.nk b/example/gctree.out.inference.290.nk new file mode 100644 index 00000000..697909d8 --- /dev/null +++ b/example/gctree.out.inference.290.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)13:1)seq15:1,(seq27:2,(seq19:2,(seq37:1,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)14:1)12:1)9:1)seq9:1)7:1)11:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.290.svg b/example/gctree.out.inference.290.svg new file mode 100644 index 00000000..21571ae8 --- /dev/null +++ b/example/gctree.out.inference.290.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.291.nk b/example/gctree.out.inference.291.nk new file mode 100644 index 00000000..fc6b4bfc --- /dev/null +++ b/example/gctree.out.inference.291.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)16:1)seq14:1,(seq30:2,(seq34:1,(seq28:2,(seq23:1,(seq22:1,(seq37:1,seq19:3)seq9:1)9:1)10:1)12:1)15:1)13:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.291.svg b/example/gctree.out.inference.291.svg new file mode 100644 index 00000000..2be8d38a --- /dev/null +++ b/example/gctree.out.inference.291.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.292.nk b/example/gctree.out.inference.292.nk new file mode 100644 index 00000000..531216b2 --- /dev/null +++ b/example/gctree.out.inference.292.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)10:1)13:1)15:1)14:1,(seq37:1,(seq19:2,seq27:3)12:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)16:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.292.svg b/example/gctree.out.inference.292.svg new file mode 100644 index 00000000..7e0f901e --- /dev/null +++ b/example/gctree.out.inference.292.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.293.nk b/example/gctree.out.inference.293.nk new file mode 100644 index 00000000..145131df --- /dev/null +++ b/example/gctree.out.inference.293.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)16:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1,(seq37:1,(seq19:2,seq27:3)12:1,(seq22:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)15:1)14:1)13:1)10:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.293.svg b/example/gctree.out.inference.293.svg new file mode 100644 index 00000000..494adc07 --- /dev/null +++ b/example/gctree.out.inference.293.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.294.nk b/example/gctree.out.inference.294.nk new file mode 100644 index 00000000..17504011 --- /dev/null +++ b/example/gctree.out.inference.294.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq23:1,(seq30:2,(seq34:1,seq28:3)14:1)12:1,(seq22:1,(seq37:1)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.294.svg b/example/gctree.out.inference.294.svg new file mode 100644 index 00000000..422b8afc --- /dev/null +++ b/example/gctree.out.inference.294.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.295.nk b/example/gctree.out.inference.295.nk new file mode 100644 index 00000000..531216b2 --- /dev/null +++ b/example/gctree.out.inference.295.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq30:2,(seq34:1,(seq28:2,(seq22:2,seq23:1)10:1)13:1)15:1)14:1,(seq37:1,(seq19:2,seq27:3)12:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)16:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.295.svg b/example/gctree.out.inference.295.svg new file mode 100644 index 00000000..7e0f901e --- /dev/null +++ b/example/gctree.out.inference.295.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.296.nk b/example/gctree.out.inference.296.nk new file mode 100644 index 00000000..507e732f --- /dev/null +++ b/example/gctree.out.inference.296.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)11:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)15:1)seq14:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)14:1)12:1,(seq22:1,(seq37:1)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)7:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.296.svg b/example/gctree.out.inference.296.svg new file mode 100644 index 00000000..422b8afc --- /dev/null +++ b/example/gctree.out.inference.296.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.3.nk b/example/gctree.out.inference.3.nk new file mode 100644 index 00000000..98fcb77c --- /dev/null +++ b/example/gctree.out.inference.3.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,(seq34:2,seq28:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.3.svg b/example/gctree.out.inference.3.svg new file mode 100644 index 00000000..645e7299 --- /dev/null +++ b/example/gctree.out.inference.3.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.30.nk b/example/gctree.out.inference.30.nk new file mode 100644 index 00000000..c4ae5aff --- /dev/null +++ b/example/gctree.out.inference.30.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)10:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.30.svg b/example/gctree.out.inference.30.svg new file mode 100644 index 00000000..ed102158 --- /dev/null +++ b/example/gctree.out.inference.30.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.31.nk b/example/gctree.out.inference.31.nk new file mode 100644 index 00000000..141dc2a8 --- /dev/null +++ b/example/gctree.out.inference.31.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1,(seq37:1,seq19:3,(seq22:1,seq23:2)8:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.31.svg b/example/gctree.out.inference.31.svg new file mode 100644 index 00000000..a963c3dd --- /dev/null +++ b/example/gctree.out.inference.31.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.32.nk b/example/gctree.out.inference.32.nk new file mode 100644 index 00000000..d517ce7d --- /dev/null +++ b/example/gctree.out.inference.32.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq34:2,seq28:2)11:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.32.svg b/example/gctree.out.inference.32.svg new file mode 100644 index 00000000..13b57c0e --- /dev/null +++ b/example/gctree.out.inference.32.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.33.nk b/example/gctree.out.inference.33.nk new file mode 100644 index 00000000..58506350 --- /dev/null +++ b/example/gctree.out.inference.33.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3)10:1)8:1)seq9:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.33.svg b/example/gctree.out.inference.33.svg new file mode 100644 index 00000000..77c01663 --- /dev/null +++ b/example/gctree.out.inference.33.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.34.nk b/example/gctree.out.inference.34.nk new file mode 100644 index 00000000..f1bca9ed --- /dev/null +++ b/example/gctree.out.inference.34.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:3,(seq34:2,seq28:2)13:1)12:1,(seq22:2,seq37:1,(seq19:2,seq27:3)11:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.34.svg b/example/gctree.out.inference.34.svg new file mode 100644 index 00000000..4606d2c6 --- /dev/null +++ b/example/gctree.out.inference.34.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.35.nk b/example/gctree.out.inference.35.nk new file mode 100644 index 00000000..d0a996ed --- /dev/null +++ b/example/gctree.out.inference.35.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq34:2,seq28:2)11:1)9:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.35.svg b/example/gctree.out.inference.35.svg new file mode 100644 index 00000000..798b605d --- /dev/null +++ b/example/gctree.out.inference.35.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.36.nk b/example/gctree.out.inference.36.nk new file mode 100644 index 00000000..ec1a133b --- /dev/null +++ b/example/gctree.out.inference.36.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)9:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.36.svg b/example/gctree.out.inference.36.svg new file mode 100644 index 00000000..9464beb4 --- /dev/null +++ b/example/gctree.out.inference.36.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.37.nk b/example/gctree.out.inference.37.nk new file mode 100644 index 00000000..a981741d --- /dev/null +++ b/example/gctree.out.inference.37.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq30:3,(seq34:2,seq28:2)11:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.37.svg b/example/gctree.out.inference.37.svg new file mode 100644 index 00000000..ccf9a6bb --- /dev/null +++ b/example/gctree.out.inference.37.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.38.nk b/example/gctree.out.inference.38.nk new file mode 100644 index 00000000..5035bbf8 --- /dev/null +++ b/example/gctree.out.inference.38.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)11:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.38.svg b/example/gctree.out.inference.38.svg new file mode 100644 index 00000000..ccf9a6bb --- /dev/null +++ b/example/gctree.out.inference.38.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.39.nk b/example/gctree.out.inference.39.nk new file mode 100644 index 00000000..1ccd7efc --- /dev/null +++ b/example/gctree.out.inference.39.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.39.svg b/example/gctree.out.inference.39.svg new file mode 100644 index 00000000..013f1fce --- /dev/null +++ b/example/gctree.out.inference.39.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.4.nk b/example/gctree.out.inference.4.nk new file mode 100644 index 00000000..825f867f --- /dev/null +++ b/example/gctree.out.inference.4.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)9:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.4.svg b/example/gctree.out.inference.4.svg new file mode 100644 index 00000000..d5402805 --- /dev/null +++ b/example/gctree.out.inference.4.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.40.nk b/example/gctree.out.inference.40.nk new file mode 100644 index 00000000..9ee47f02 --- /dev/null +++ b/example/gctree.out.inference.40.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.40.svg b/example/gctree.out.inference.40.svg new file mode 100644 index 00000000..91d887b7 --- /dev/null +++ b/example/gctree.out.inference.40.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.41.nk b/example/gctree.out.inference.41.nk new file mode 100644 index 00000000..e002a8af --- /dev/null +++ b/example/gctree.out.inference.41.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.41.svg b/example/gctree.out.inference.41.svg new file mode 100644 index 00000000..91d887b7 --- /dev/null +++ b/example/gctree.out.inference.41.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.42.nk b/example/gctree.out.inference.42.nk new file mode 100644 index 00000000..3b40b59d --- /dev/null +++ b/example/gctree.out.inference.42.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)8:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.42.svg b/example/gctree.out.inference.42.svg new file mode 100644 index 00000000..dfb14fb7 --- /dev/null +++ b/example/gctree.out.inference.42.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.43.nk b/example/gctree.out.inference.43.nk new file mode 100644 index 00000000..a86ec414 --- /dev/null +++ b/example/gctree.out.inference.43.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.43.svg b/example/gctree.out.inference.43.svg new file mode 100644 index 00000000..d2099093 --- /dev/null +++ b/example/gctree.out.inference.43.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.44.nk b/example/gctree.out.inference.44.nk new file mode 100644 index 00000000..6cb3430e --- /dev/null +++ b/example/gctree.out.inference.44.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,(seq34:2,seq28:2)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.44.svg b/example/gctree.out.inference.44.svg new file mode 100644 index 00000000..e6c5f4f7 --- /dev/null +++ b/example/gctree.out.inference.44.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.45.nk b/example/gctree.out.inference.45.nk new file mode 100644 index 00000000..216d95cb --- /dev/null +++ b/example/gctree.out.inference.45.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)10:1,(seq34:2,seq30:2)12:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.45.svg b/example/gctree.out.inference.45.svg new file mode 100644 index 00000000..a92d476b --- /dev/null +++ b/example/gctree.out.inference.45.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.46.nk b/example/gctree.out.inference.46.nk new file mode 100644 index 00000000..60ab0087 --- /dev/null +++ b/example/gctree.out.inference.46.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.46.svg b/example/gctree.out.inference.46.svg new file mode 100644 index 00000000..57af32de --- /dev/null +++ b/example/gctree.out.inference.46.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.47.nk b/example/gctree.out.inference.47.nk new file mode 100644 index 00000000..279fa788 --- /dev/null +++ b/example/gctree.out.inference.47.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:2,(seq30:3,(seq34:2,seq28:2)12:1)10:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.47.svg b/example/gctree.out.inference.47.svg new file mode 100644 index 00000000..a86b4e4a --- /dev/null +++ b/example/gctree.out.inference.47.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.48.nk b/example/gctree.out.inference.48.nk new file mode 100644 index 00000000..fee329f6 --- /dev/null +++ b/example/gctree.out.inference.48.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)9:1)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.48.svg b/example/gctree.out.inference.48.svg new file mode 100644 index 00000000..9b304c6d --- /dev/null +++ b/example/gctree.out.inference.48.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.49.nk b/example/gctree.out.inference.49.nk new file mode 100644 index 00000000..2ee92511 --- /dev/null +++ b/example/gctree.out.inference.49.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.49.svg b/example/gctree.out.inference.49.svg new file mode 100644 index 00000000..dd6877b6 --- /dev/null +++ b/example/gctree.out.inference.49.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.5.nk b/example/gctree.out.inference.5.nk new file mode 100644 index 00000000..bb8ea3f7 --- /dev/null +++ b/example/gctree.out.inference.5.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq34:2,seq28:2)10:1)8:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.5.svg b/example/gctree.out.inference.5.svg new file mode 100644 index 00000000..7fe67560 --- /dev/null +++ b/example/gctree.out.inference.5.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.50.nk b/example/gctree.out.inference.50.nk new file mode 100644 index 00000000..ab6d21a8 --- /dev/null +++ b/example/gctree.out.inference.50.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,(seq34:2,seq28:2)12:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.50.svg b/example/gctree.out.inference.50.svg new file mode 100644 index 00000000..dd3bec30 --- /dev/null +++ b/example/gctree.out.inference.50.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.51.nk b/example/gctree.out.inference.51.nk new file mode 100644 index 00000000..835b8235 --- /dev/null +++ b/example/gctree.out.inference.51.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)10:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.51.svg b/example/gctree.out.inference.51.svg new file mode 100644 index 00000000..34e7fda9 --- /dev/null +++ b/example/gctree.out.inference.51.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.52.nk b/example/gctree.out.inference.52.nk new file mode 100644 index 00000000..4fdabe07 --- /dev/null +++ b/example/gctree.out.inference.52.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq37:1,seq19:3,(seq22:1,seq23:2)8:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.52.svg b/example/gctree.out.inference.52.svg new file mode 100644 index 00000000..a114e4ef --- /dev/null +++ b/example/gctree.out.inference.52.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.53.nk b/example/gctree.out.inference.53.nk new file mode 100644 index 00000000..33c36b86 --- /dev/null +++ b/example/gctree.out.inference.53.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq34:2,seq28:2)12:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.53.svg b/example/gctree.out.inference.53.svg new file mode 100644 index 00000000..7e1de4ea --- /dev/null +++ b/example/gctree.out.inference.53.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.54.nk b/example/gctree.out.inference.54.nk new file mode 100644 index 00000000..7343c316 --- /dev/null +++ b/example/gctree.out.inference.54.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.54.svg b/example/gctree.out.inference.54.svg new file mode 100644 index 00000000..27aab9d1 --- /dev/null +++ b/example/gctree.out.inference.54.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.55.nk b/example/gctree.out.inference.55.nk new file mode 100644 index 00000000..64c55583 --- /dev/null +++ b/example/gctree.out.inference.55.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq23:1,seq28:3,(seq22:1,(seq37:1,seq19:3)seq9:1)8:1)9:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.55.svg b/example/gctree.out.inference.55.svg new file mode 100644 index 00000000..0f062d76 --- /dev/null +++ b/example/gctree.out.inference.55.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.56.nk b/example/gctree.out.inference.56.nk new file mode 100644 index 00000000..fa52fda6 --- /dev/null +++ b/example/gctree.out.inference.56.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq34:2,seq28:2)11:1)8:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.56.svg b/example/gctree.out.inference.56.svg new file mode 100644 index 00000000..4f3107dc --- /dev/null +++ b/example/gctree.out.inference.56.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.57.nk b/example/gctree.out.inference.57.nk new file mode 100644 index 00000000..f9817ec3 --- /dev/null +++ b/example/gctree.out.inference.57.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)11:1)10:1)8:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.57.svg b/example/gctree.out.inference.57.svg new file mode 100644 index 00000000..929f8e90 --- /dev/null +++ b/example/gctree.out.inference.57.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.58.nk b/example/gctree.out.inference.58.nk new file mode 100644 index 00000000..3ac0e8dc --- /dev/null +++ b/example/gctree.out.inference.58.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq31:1)seq6:1,(seq22:2,seq23:1)8:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.58.svg b/example/gctree.out.inference.58.svg new file mode 100644 index 00000000..c9ea1417 --- /dev/null +++ b/example/gctree.out.inference.58.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.59.nk b/example/gctree.out.inference.59.nk new file mode 100644 index 00000000..29e8c71b --- /dev/null +++ b/example/gctree.out.inference.59.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,(seq34:2,seq28:2)11:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.59.svg b/example/gctree.out.inference.59.svg new file mode 100644 index 00000000..202f365e --- /dev/null +++ b/example/gctree.out.inference.59.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.6.nk b/example/gctree.out.inference.6.nk new file mode 100644 index 00000000..c80f752c --- /dev/null +++ b/example/gctree.out.inference.6.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)10:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)8:1,(seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.6.svg b/example/gctree.out.inference.6.svg new file mode 100644 index 00000000..8ddd66a5 --- /dev/null +++ b/example/gctree.out.inference.6.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.60.nk b/example/gctree.out.inference.60.nk new file mode 100644 index 00000000..1abd3877 --- /dev/null +++ b/example/gctree.out.inference.60.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)11:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.60.svg b/example/gctree.out.inference.60.svg new file mode 100644 index 00000000..d8751578 --- /dev/null +++ b/example/gctree.out.inference.60.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.61.nk b/example/gctree.out.inference.61.nk new file mode 100644 index 00000000..609eb0c6 --- /dev/null +++ b/example/gctree.out.inference.61.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1)seq9:1,(seq22:2,seq23:1,(seq34:2,seq28:2)10:1)7:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.61.svg b/example/gctree.out.inference.61.svg new file mode 100644 index 00000000..7ebf076c --- /dev/null +++ b/example/gctree.out.inference.61.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.62.nk b/example/gctree.out.inference.62.nk new file mode 100644 index 00000000..0bcac8d0 --- /dev/null +++ b/example/gctree.out.inference.62.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq30:3,(seq34:2,seq28:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.62.svg b/example/gctree.out.inference.62.svg new file mode 100644 index 00000000..d58a202a --- /dev/null +++ b/example/gctree.out.inference.62.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.63.nk b/example/gctree.out.inference.63.nk new file mode 100644 index 00000000..9b830f05 --- /dev/null +++ b/example/gctree.out.inference.63.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)11:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.63.svg b/example/gctree.out.inference.63.svg new file mode 100644 index 00000000..d58a202a --- /dev/null +++ b/example/gctree.out.inference.63.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.64.nk b/example/gctree.out.inference.64.nk new file mode 100644 index 00000000..71d9a5bc --- /dev/null +++ b/example/gctree.out.inference.64.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)11:1)10:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.64.svg b/example/gctree.out.inference.64.svg new file mode 100644 index 00000000..e17be37f --- /dev/null +++ b/example/gctree.out.inference.64.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.65.nk b/example/gctree.out.inference.65.nk new file mode 100644 index 00000000..e76cbb63 --- /dev/null +++ b/example/gctree.out.inference.65.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:2,seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.65.svg b/example/gctree.out.inference.65.svg new file mode 100644 index 00000000..eea5647a --- /dev/null +++ b/example/gctree.out.inference.65.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.66.nk b/example/gctree.out.inference.66.nk new file mode 100644 index 00000000..5c00e438 --- /dev/null +++ b/example/gctree.out.inference.66.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq22:2,seq37:1,(seq19:2,seq27:3)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.66.svg b/example/gctree.out.inference.66.svg new file mode 100644 index 00000000..eea5647a --- /dev/null +++ b/example/gctree.out.inference.66.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.67.nk b/example/gctree.out.inference.67.nk new file mode 100644 index 00000000..b1fc706c --- /dev/null +++ b/example/gctree.out.inference.67.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq30:3,(seq34:2,seq28:2)11:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.67.svg b/example/gctree.out.inference.67.svg new file mode 100644 index 00000000..b37f5a4b --- /dev/null +++ b/example/gctree.out.inference.67.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.68.nk b/example/gctree.out.inference.68.nk new file mode 100644 index 00000000..76e62278 --- /dev/null +++ b/example/gctree.out.inference.68.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3,(seq34:2,seq30:2)11:1)10:1)8:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.68.svg b/example/gctree.out.inference.68.svg new file mode 100644 index 00000000..b37f5a4b --- /dev/null +++ b/example/gctree.out.inference.68.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.69.nk b/example/gctree.out.inference.69.nk new file mode 100644 index 00000000..a2b32f90 --- /dev/null +++ b/example/gctree.out.inference.69.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.69.svg b/example/gctree.out.inference.69.svg new file mode 100644 index 00000000..4f2ef055 --- /dev/null +++ b/example/gctree.out.inference.69.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.7.nk b/example/gctree.out.inference.7.nk new file mode 100644 index 00000000..51b07074 --- /dev/null +++ b/example/gctree.out.inference.7.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,seq28:3,(seq34:2,seq30:2)10:1)9:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)11:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.7.svg b/example/gctree.out.inference.7.svg new file mode 100644 index 00000000..f6633025 --- /dev/null +++ b/example/gctree.out.inference.7.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.70.nk b/example/gctree.out.inference.70.nk new file mode 100644 index 00000000..2abe3319 --- /dev/null +++ b/example/gctree.out.inference.70.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)12:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.70.svg b/example/gctree.out.inference.70.svg new file mode 100644 index 00000000..f1f4fa68 --- /dev/null +++ b/example/gctree.out.inference.70.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.71.nk b/example/gctree.out.inference.71.nk new file mode 100644 index 00000000..7ae2438e --- /dev/null +++ b/example/gctree.out.inference.71.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)10:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,((seq6:1)seq31:1,(seq24:2)seq21:2)8:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.71.svg b/example/gctree.out.inference.71.svg new file mode 100644 index 00000000..9bfe9b17 --- /dev/null +++ b/example/gctree.out.inference.71.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.72.nk b/example/gctree.out.inference.72.nk new file mode 100644 index 00000000..fb1938be --- /dev/null +++ b/example/gctree.out.inference.72.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.72.svg b/example/gctree.out.inference.72.svg new file mode 100644 index 00000000..7cd31a1d --- /dev/null +++ b/example/gctree.out.inference.72.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.73.nk b/example/gctree.out.inference.73.nk new file mode 100644 index 00000000..adb54d44 --- /dev/null +++ b/example/gctree.out.inference.73.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.73.svg b/example/gctree.out.inference.73.svg new file mode 100644 index 00000000..7cd31a1d --- /dev/null +++ b/example/gctree.out.inference.73.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.74.nk b/example/gctree.out.inference.74.nk new file mode 100644 index 00000000..8515a85d --- /dev/null +++ b/example/gctree.out.inference.74.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq34:2,seq30:2,(seq22:2,seq23:1,seq28:3)9:1)11:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.74.svg b/example/gctree.out.inference.74.svg new file mode 100644 index 00000000..abc24424 --- /dev/null +++ b/example/gctree.out.inference.74.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.75.nk b/example/gctree.out.inference.75.nk new file mode 100644 index 00000000..cd7353f3 --- /dev/null +++ b/example/gctree.out.inference.75.nk @@ -0,0 +1 @@ +((seq3:2,(seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.75.svg b/example/gctree.out.inference.75.svg new file mode 100644 index 00000000..26e1ce55 --- /dev/null +++ b/example/gctree.out.inference.75.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.76.nk b/example/gctree.out.inference.76.nk new file mode 100644 index 00000000..40a5b443 --- /dev/null +++ b/example/gctree.out.inference.76.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.76.svg b/example/gctree.out.inference.76.svg new file mode 100644 index 00000000..4eb46b12 --- /dev/null +++ b/example/gctree.out.inference.76.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.77.nk b/example/gctree.out.inference.77.nk new file mode 100644 index 00000000..b3d50797 --- /dev/null +++ b/example/gctree.out.inference.77.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)11:1,(seq34:2,seq30:2)12:1,seq29:1,(seq19:3,seq27:2)10:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.77.svg b/example/gctree.out.inference.77.svg new file mode 100644 index 00000000..2495a677 --- /dev/null +++ b/example/gctree.out.inference.77.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.78.nk b/example/gctree.out.inference.78.nk new file mode 100644 index 00000000..1fc4e9dd --- /dev/null +++ b/example/gctree.out.inference.78.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq22:2,seq23:1)9:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.78.svg b/example/gctree.out.inference.78.svg new file mode 100644 index 00000000..0d40ef37 --- /dev/null +++ b/example/gctree.out.inference.78.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.79.nk b/example/gctree.out.inference.79.nk new file mode 100644 index 00000000..9fd3df4c --- /dev/null +++ b/example/gctree.out.inference.79.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq23:1,seq28:3)11:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.79.svg b/example/gctree.out.inference.79.svg new file mode 100644 index 00000000..0dd8d447 --- /dev/null +++ b/example/gctree.out.inference.79.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.8.nk b/example/gctree.out.inference.8.nk new file mode 100644 index 00000000..ec94f367 --- /dev/null +++ b/example/gctree.out.inference.8.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)11:1)10:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.8.svg b/example/gctree.out.inference.8.svg new file mode 100644 index 00000000..fe2c37d4 --- /dev/null +++ b/example/gctree.out.inference.8.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.80.nk b/example/gctree.out.inference.80.nk new file mode 100644 index 00000000..277ffa68 --- /dev/null +++ b/example/gctree.out.inference.80.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)7:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq6:1,((seq24:2)seq21:2,(seq8:1,seq41:1,seq1:2)seq15:1)9:1)seq31:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.80.svg b/example/gctree.out.inference.80.svg new file mode 100644 index 00000000..5398f72f --- /dev/null +++ b/example/gctree.out.inference.80.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.81.nk b/example/gctree.out.inference.81.nk new file mode 100644 index 00000000..49b62428 --- /dev/null +++ b/example/gctree.out.inference.81.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)11:1)10:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.81.svg b/example/gctree.out.inference.81.svg new file mode 100644 index 00000000..9ec2ffc3 --- /dev/null +++ b/example/gctree.out.inference.81.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.82.nk b/example/gctree.out.inference.82.nk new file mode 100644 index 00000000..4e8edf8f --- /dev/null +++ b/example/gctree.out.inference.82.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq30:3,(seq23:2,(seq34:1,seq28:3)12:1)10:1)11:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.82.svg b/example/gctree.out.inference.82.svg new file mode 100644 index 00000000..fa2e660f --- /dev/null +++ b/example/gctree.out.inference.82.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.83.nk b/example/gctree.out.inference.83.nk new file mode 100644 index 00000000..165bdcda --- /dev/null +++ b/example/gctree.out.inference.83.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq30:2,(seq34:1,(seq23:2,seq28:2)10:1)12:1)11:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.83.svg b/example/gctree.out.inference.83.svg new file mode 100644 index 00000000..ab6e3257 --- /dev/null +++ b/example/gctree.out.inference.83.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.84.nk b/example/gctree.out.inference.84.nk new file mode 100644 index 00000000..04b546a5 --- /dev/null +++ b/example/gctree.out.inference.84.nk @@ -0,0 +1 @@ +((seq3:2,(seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.84.svg b/example/gctree.out.inference.84.svg new file mode 100644 index 00000000..66d1f32c --- /dev/null +++ b/example/gctree.out.inference.84.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.85.nk b/example/gctree.out.inference.85.nk new file mode 100644 index 00000000..18119442 --- /dev/null +++ b/example/gctree.out.inference.85.nk @@ -0,0 +1 @@ +((seq3:2,(seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.85.svg b/example/gctree.out.inference.85.svg new file mode 100644 index 00000000..be73ad2d --- /dev/null +++ b/example/gctree.out.inference.85.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.86.nk b/example/gctree.out.inference.86.nk new file mode 100644 index 00000000..304df2e1 --- /dev/null +++ b/example/gctree.out.inference.86.nk @@ -0,0 +1 @@ +((seq3:2,(seq23:2,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:3,(seq34:2,seq28:2)13:1)12:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq22:2,seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)14:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.86.svg b/example/gctree.out.inference.86.svg new file mode 100644 index 00000000..d357aedc --- /dev/null +++ b/example/gctree.out.inference.86.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.87.nk b/example/gctree.out.inference.87.nk new file mode 100644 index 00000000..4abc011c --- /dev/null +++ b/example/gctree.out.inference.87.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq30:2,(seq34:1,seq28:3)12:1)11:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq37:1,seq19:3,(seq22:1,seq23:2)9:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.87.svg b/example/gctree.out.inference.87.svg new file mode 100644 index 00000000..e57ad06d --- /dev/null +++ b/example/gctree.out.inference.87.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.88.nk b/example/gctree.out.inference.88.nk new file mode 100644 index 00000000..d1b76912 --- /dev/null +++ b/example/gctree.out.inference.88.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,(seq34:2,seq28:2)12:1)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.88.svg b/example/gctree.out.inference.88.svg new file mode 100644 index 00000000..4fb18a10 --- /dev/null +++ b/example/gctree.out.inference.88.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.89.nk b/example/gctree.out.inference.89.nk new file mode 100644 index 00000000..410f771f --- /dev/null +++ b/example/gctree.out.inference.89.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq37:1,seq19:3,(seq22:1,(seq23:1,seq28:3)11:1)9:1)seq9:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.89.svg b/example/gctree.out.inference.89.svg new file mode 100644 index 00000000..928435ff --- /dev/null +++ b/example/gctree.out.inference.89.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.9.nk b/example/gctree.out.inference.9.nk new file mode 100644 index 00000000..8405ac11 --- /dev/null +++ b/example/gctree.out.inference.9.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq23:1,(seq34:2,seq28:2)11:1)10:1,(seq6:1,(seq24:2)seq21:3)seq31:1,(seq22:2,seq37:1,seq19:3)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.9.svg b/example/gctree.out.inference.9.svg new file mode 100644 index 00000000..c3c183a3 --- /dev/null +++ b/example/gctree.out.inference.9.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.90.nk b/example/gctree.out.inference.90.nk new file mode 100644 index 00000000..84a5cce0 --- /dev/null +++ b/example/gctree.out.inference.90.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)8:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)10:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.90.svg b/example/gctree.out.inference.90.svg new file mode 100644 index 00000000..89b1af52 --- /dev/null +++ b/example/gctree.out.inference.90.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.91.nk b/example/gctree.out.inference.91.nk new file mode 100644 index 00000000..5194024e --- /dev/null +++ b/example/gctree.out.inference.91.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)12:1)10:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq31:1,(seq24:2)seq21:2)11:1)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.91.svg b/example/gctree.out.inference.91.svg new file mode 100644 index 00000000..89b1af52 --- /dev/null +++ b/example/gctree.out.inference.91.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.92.nk b/example/gctree.out.inference.92.nk new file mode 100644 index 00000000..fa6fbcd4 --- /dev/null +++ b/example/gctree.out.inference.92.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq30:3,(seq34:2,seq28:2)11:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.92.svg b/example/gctree.out.inference.92.svg new file mode 100644 index 00000000..930476b0 --- /dev/null +++ b/example/gctree.out.inference.92.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.93.nk b/example/gctree.out.inference.93.nk new file mode 100644 index 00000000..38ec4d26 --- /dev/null +++ b/example/gctree.out.inference.93.nk @@ -0,0 +1 @@ +((seq3:2,(seq31:1,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,(seq22:2,seq23:1,seq28:3,(seq34:2,seq30:2)11:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq39:1,seq5:1,(seq16:4,seq36:1)12:1)seq14:1,(seq8:1,seq41:1,seq1:2,(seq24:2)seq21:3)seq15:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.93.svg b/example/gctree.out.inference.93.svg new file mode 100644 index 00000000..930476b0 --- /dev/null +++ b/example/gctree.out.inference.93.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.94.nk b/example/gctree.out.inference.94.nk new file mode 100644 index 00000000..5eadb52b --- /dev/null +++ b/example/gctree.out.inference.94.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,seq30:3,(seq34:2,seq28:2)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.94.svg b/example/gctree.out.inference.94.svg new file mode 100644 index 00000000..bef31128 --- /dev/null +++ b/example/gctree.out.inference.94.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.95.nk b/example/gctree.out.inference.95.nk new file mode 100644 index 00000000..3d55530e --- /dev/null +++ b/example/gctree.out.inference.95.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq23:1,seq28:3,(seq34:2,seq30:2)12:1)10:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.95.svg b/example/gctree.out.inference.95.svg new file mode 100644 index 00000000..bef31128 --- /dev/null +++ b/example/gctree.out.inference.95.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.96.nk b/example/gctree.out.inference.96.nk new file mode 100644 index 00000000..49e344aa --- /dev/null +++ b/example/gctree.out.inference.96.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq19:3,seq27:2)9:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq34:2,seq30:2,(seq23:1,seq28:3)10:1)11:1,(seq22:2,seq37:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.96.svg b/example/gctree.out.inference.96.svg new file mode 100644 index 00000000..e5fa8d17 --- /dev/null +++ b/example/gctree.out.inference.96.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.97.nk b/example/gctree.out.inference.97.nk new file mode 100644 index 00000000..53433290 --- /dev/null +++ b/example/gctree.out.inference.97.nk @@ -0,0 +1 @@ +((seq3:2,(seq27:3,seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq37:1,seq19:3)seq9:1,(seq22:2,seq23:1,(seq28:2,(seq34:1,seq30:3)12:1)10:1)8:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.97.svg b/example/gctree.out.inference.97.svg new file mode 100644 index 00000000..0e2c301b --- /dev/null +++ b/example/gctree.out.inference.97.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.98.nk b/example/gctree.out.inference.98.nk new file mode 100644 index 00000000..2631e21b --- /dev/null +++ b/example/gctree.out.inference.98.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq30:3,seq33:1,seq32:3,seq10:1,seq7:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,(seq34:2,seq28:2)12:1)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.98.svg b/example/gctree.out.inference.98.svg new file mode 100644 index 00000000..0ecc77f3 --- /dev/null +++ b/example/gctree.out.inference.98.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.99.nk b/example/gctree.out.inference.99.nk new file mode 100644 index 00000000..8becebf7 --- /dev/null +++ b/example/gctree.out.inference.99.nk @@ -0,0 +1 @@ +((seq3:2,(seq6:1,seq2:1,seq13:2,seq40:1,seq35:3,seq38:1,seq12:2,seq20:2,seq26:1,seq33:1,seq32:3,seq10:1,seq7:1,(seq34:2,seq30:2)12:1,seq29:1,(seq17:2)seq4:1,(seq18:1,seq25:1,seq11:3)6:1,((seq24:2)seq21:3)seq31:1,(seq22:2,seq23:1,seq28:3)8:1,(seq37:1,(seq19:2,seq27:3)10:1)seq9:1,(seq8:1,seq41:1,seq1:2)seq15:1,(seq39:1,seq5:1,(seq16:4,seq36:1)13:1)seq14:1)seq42:1)1:2); \ No newline at end of file diff --git a/example/gctree.out.inference.99.svg b/example/gctree.out.inference.99.svg new file mode 100644 index 00000000..5ad3d50a --- /dev/null +++ b/example/gctree.out.inference.99.svg @@ -0,0 +1 @@ + Generated with ETE http://etetoolkit.org Generated with ETE http://etetoolkit.org 1 17 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 1 \ No newline at end of file diff --git a/example/gctree.out.inference.abundance_rank.svg b/example/gctree.out.inference.abundance_rank.svg new file mode 100644 index 00000000..353ed2dd --- /dev/null +++ b/example/gctree.out.inference.abundance_rank.svg @@ -0,0 +1,1122 @@ + + + + + + + + 2021-06-30T18:42:27.023397 + image/svg+xml + + + Matplotlib v3.4.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/gctree.out.inference.likelihood_rank.svg b/example/gctree.out.inference.likelihood_rank.svg new file mode 100644 index 00000000..6ce3d07d --- /dev/null +++ b/example/gctree.out.inference.likelihood_rank.svg @@ -0,0 +1,1205 @@ + + + + + + + + 2021-06-30T18:42:26.635322 + image/svg+xml + + + Matplotlib v3.4.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/gctree.out.inference.parsimony_forest.p b/example/gctree.out.inference.parsimony_forest.p new file mode 100644 index 0000000000000000000000000000000000000000..e1ff170e5e8df354bb1339a564a491db30ad2f49 GIT binary patch literal 5386767 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ΜEw3OttU|hy`77 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 F{|DdNf Date: Wed, 30 Jun 2021 18:54:20 -0700 Subject: [PATCH 28/32] minor tidying --- .gitignore | 3 +-- environment.yml | 1 - gctree/mkconfig.py | 2 +- notebooks/runtime_experiment.ipynb | 8 ++++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c23aa93b..1fac37da 100755 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,7 @@ ._* # example output dir -test -gctree.out* +_build # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/environment.yml b/environment.yml index 1e11bf1f..3ccbc7a6 100644 --- a/environment.yml +++ b/environment.yml @@ -7,7 +7,6 @@ dependencies: - scons - nestly - phylip - - seqmagick - pip - pip: - . # installs gctree package from current directory "." diff --git a/gctree/mkconfig.py b/gctree/mkconfig.py index 657dd666..730ecaa5 100755 --- a/gctree/mkconfig.py +++ b/gctree/mkconfig.py @@ -23,7 +23,7 @@ def get_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("phylip", help="PHYLIP input", type=str) - parser.add_argument("treeprog", help="dnaml or dnapars", type=str) + parser.add_argument("treeprog", help="dnapars, dnaml, or seqboot", type=str) parser.add_argument( "--quick", action="store_true", help="quicker (less thourough) dnapars" ) diff --git a/notebooks/runtime_experiment.ipynb b/notebooks/runtime_experiment.ipynb index fc283a11..d15c1fb8 100644 --- a/notebooks/runtime_experiment.ipynb +++ b/notebooks/runtime_experiment.ipynb @@ -15,10 +15,10 @@ "```bash\n", "$ for N in 50 100 150\n", " do\n", - " scons --simulate --outdir=working/timetest.$N --lambda=1.5 --lambda0=.25 --N=$N --nsim=5 --debug=time\n", + " scons --simulate --outdir=_build/timetest.$N --lambda=1.5 --lambda0=.25 --N=$N --nsim=5 --debug=time\n", " done | grep \"Command execution time\" | cut -f4- -d\" \" > notebooks/runtime_experiment.data.log\n", "```\n", - "The branching parameters process parameters `--lambda=1.5` and `--lambda0=.25` are set according to summary statistics on real data as described in the manuscript. Output is stored in the directory `working/`. Note that this will probably take a while." + "The branching parameters process parameters `--lambda=1.5` and `--lambda0=.25` are set according to summary statistics on real data as described in the manuscript. Output is stored in the directory `_build/`. Note that this will probably take a while." ] }, { @@ -49,8 +49,8 @@ "df = pd.read_csv('runtime_experiment.data.log', delimiter=\" \", header=None, names=('computation step', 'runtime (min)', 'units'))\n", "df['runtime (min)'] = df['runtime (min)']/60\n", "df = df[df['computation step'].str.endswith('dnapars/log.log:') | df['computation step'].str.endswith('gctree.inference.log:')]\n", - "df['run'] = df['computation step'].str.extract('working/timetest.[0-9]+/[.0-9]+/[.0-9]+/(?P[0-9]+)/', expand=False)\n", - "df['number of cells'] = df['computation step'].str.extract('working/timetest.(?P[0-9]+).', expand=False)\n", + "df['run'] = df['computation step'].str.extract('_build/timetest.[0-9]+/[.0-9]+/[.0-9]+/(?P[0-9]+)/', expand=False)\n", + "df['number of cells'] = df['computation step'].str.extract('_build/timetest.(?P[0-9]+).', expand=False)\n", "df['number of cells'] = pd.to_numeric(df['number of cells'])\n", "df.loc[df['computation step'].str.endswith('dnapars/log.log:'), 'computation step'] = 'dnapars'\n", "df.loc[df['computation step'].str.endswith('gctree.inference.log:'), 'computation step'] = 'gctree'" From 3d391e8d78c32f98cd2d2b8598e3ad954ffe2b45 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 18:54:40 -0700 Subject: [PATCH 29/32] simplify readme (we have docs now) --- README.md | 111 ++++++++++-------------------------------------------- 1 file changed, 19 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index ff0a8ed6..194feb34 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ Implements phylogenetic inference for data with repeated sequences, as described DeWitt, Mesin, Victora, Minin and Matsen, *Using genotype abundance to improve phylogenetic inference*, [arXiv:1708.08944](https://arxiv.org/abs/1708.08944). +**Note: full documentation of the gctree package is available at: https://matsengrp.github.io/gctree** + +This readme provides info on use of scons pipelines that wrap the base gctree package. + ## Installation ### Linux/MacOS @@ -12,7 +16,7 @@ DeWitt, Mesin, Victora, Minin and Matsen, *Using genotype abundance to improve p If you only want the base gctree package (without the pipeline infrastructure, see below), you can simply ```bash -pip intall . +pip intall gctree ``` to install the gctree package and its command line interface. Subcommands are described in help @@ -25,12 +29,13 @@ The most important subcommand is `gctree infer`. Additionally, the following command line utilities will be installed (each with help `-h`): - `deduplicate`: deduplicate fasta data with repeated genotypes - `mkconfig`: generate a config file for the phylip program -- `phylip_parse`: parse output from +- `phylip_parse`: parse output from phylip #### Pipeline install `SCons` pipelines can be used to for end-to-end phylogenetic inference from sequence data. +These must be run from the repo directory after cloning. 0. For installing dependencies, [conda](https://conda.io/docs/) environment management is recommended. First install conda or miniconda. 1. Create a python 3 conda environment called gctree from the included environment file: @@ -50,7 +55,7 @@ All commands should be issued from within the gctree repo directory. - *input file*: `FASTA` or `PHYLIP` file containing a sequence for each observed individual/cell, and an additional sequence containing the ancestral genotype of all observed sequences (used for outgroup rooting). - *run inference*: ``` - scons --inference --outdir= --input= --rootID= + scons --inference --outdir= --input= --root_id= ``` - *description of inference output files*: After the inference pipeline has completed, the output directory will contain the following output files: - `.idmap`: text file mapping collapsed sequenced ids to cell ids from the original input file @@ -69,114 +74,36 @@ All commands should be issued from within the gctree repo directory. scons --simulate --outdir= --N= ``` -## Example +## Pipeline example -### run gctree inference on the included `FASTA` file +### run gctree inference pipeline on the included `FASTA` file * **Example input data set** - `example/150228_Clone_3-8.fasta` contains heavy chain V gene sequences from 65 germinal B cells sorted from a brainbow mouse using multicolor fate mapping. - ``` - $ head example/150228_Clone_3-8.fasta - >VIBM1S4A05IgG - ggacctagcctcgtgaaaccttctcagactctgtccctcacctgttctgtcactggcgac - tccatcaccagtggttactggaactggatccggaagttcccagggaatagacttgagtac - atggggtacataagcttcagtggtggtacttactacaatccatctctcaaaagtcgaatc - tccatcactcgagacacatccaagaaccagtaccacctgcagttgaattctgtgactact - gaggacacagccacatattactgt - >VIBM1S4A06IgG - ggacctagcctcgtgaaaccttctcagactctgtccctcacctgttctgtcactggcgac - tccatcaccagtggttactggaactggatccggaagttcccagggaatagacttgagtac - atggggtacataagcttcagtggtagcacttactacaatccatctctcaaaagtcgaatc - ``` - These data were published in [Tas et al. 2016. *Visualizing Antibody Affinity Maturation in Germinal Centers.* Science 351 (6277)](http://science.sciencemag.org/content/351/6277/1048)) and shown in Fig. 4 (lymph node 2, germinal center 1). - ![](example/gc1.png) + See the quickstart docs page for a description of these example data. * **Run inference** From within the `gctree` repository directory: ``` - scons --inference --input=example/150228_Clone_3-8.fasta --outdir=test --id_abundances --rootID=GL --jobs=2 - ``` - This command will produce output in subdirectory `test/`. - This includes a log file with some messages about results (including the number of trees and the fitted branching process parameters), and then lists each parsimony tree by decreasing likelihood (with tree 1 corresponding to the gctree MLE). - ```bash - $ head test/gctree.inference.log - number of trees with integer branch lengths: 58 - 58 trees exhibit unobserved unifurcation from root. Adding psuedocounts to these roots - params = [0.4961832081885355, 0.36484189590092164] - tree alleles logLikelihood - 1 48 -79.016217483 - 2 48 -79.016217483 - 3 48 -80.0883965146 - 4 48 -80.1148297716 - 5 49 -80.3507858934 - 6 49 -80.3507858934 - ``` - For each tree, the directory will include an SVG file rendering of the tree. E.g. the MLE `test/gctree.inference.1.svg`: - ![](example/gctree.inference.1.svg) - There is also a rank plot of genotype abundance `test/gctree.inference.abundance_rank.png`: - ![](example/gctree.inference.abundance_rank.png) - and of gctree likelihood over the trees `test/gctree.inference.likelihood_rank.png`: - ![](example/gctree.inference.likelihood_rank.png) - - Finally, there are text files indicating abundance of each unique sequence, + scons --inference --input=example/150228_Clone_3-8.fasta --outdir=_build --id_abundances --root_id=GL --jobs=2 ``` - $ head test/150228_Clone_3-8.counts - seq22,3 - seq23,1 - seq20,1 - seq21,1 - seq26,1 - seq27,1 - seq24,1 - seq25,1 - seq28,1 - seq29,1 - ``` - the mapping of unique sequence ids to the sequence ids in the input `FASTA`, - ``` - $ head test/150228_Clone_3-8.idmap - seq22,VIBM1S4B10IgG:VIBM1S4C09IgG:VIBM1S4H12IgG - seq23,VIBM1S4E03IgG - seq20,VIBM1S4D02IgG - seq21,VIBM1S4A05IgG - seq26,VIBM1S4F11IgG - seq27,VIBM1S4E12IgG - seq24,VIBM1S4B03IgG - seq25,VIBM1S4D05IgG - seq28,VIBM1S4G04IgG - seq29,VIBM1S4E09IgG - ``` - and the `PHYLIP` alignment of the unique sequences, - ``` - $ head test/150228_Clone_3-8.phylip - 43 264 - gl ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq1 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq2 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq3 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq4 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq5 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq6 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq7 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - seq8 ggacctagcc tcgtgaaacc ttctcagact ctgtccctca cctgttctgt - ``` - When using the optional `--idlabel` flag, which shows labels `seq1, seq2, ...` in the tree rendering (see documentation below), these id/sequence files can be used to associate DNA sequences or cell labels with specific tree nodes. + This command will produce output in subdirectory `_build/`. + * **Explanation of arguments** - `--outdir=test` specifies that results are to be saved in directory `test/` (which will be created if it does not exist) + `--outdir=_build` specifies that results are to be saved in directory `_build/` (which will be created if it does not exist) `--id_abundances` flag means that integer sequence IDs in the input file are interpreted as abundances. The example input `FASTA` includes a sequence with id "17". - `--rootID=GL` indicates that the root root sequence has id "GL" in the input `FASTA`. This sequence is the germline sequence of the V gene used in the V(D)J rearrangement that defines this clonal family. + `--root_id=GL` indicates that the root root sequence has id "GL" in the input `FASTA`. This sequence is the germline sequence of the V gene used in the V(D)J rearrangement that defines this clonal family. `--jobs=2` indicates that 2 parallel processes should be used If running on a remote machine via ssh, it may be necessary to provide the flag `--xvfb` which will allow X rendering of ETE trees without X forwarding. -## Inference +## Inference pipeline `scons --inference ...` @@ -186,7 +113,7 @@ scons --simulate --outdir= --N= --N= Date: Wed, 30 Jun 2021 19:11:10 -0700 Subject: [PATCH 30/32] tweak dev docs headers --- docs/source/developer.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/developer.rst b/docs/source/developer.rst index 133d1be2..6dada1ee 100644 --- a/docs/source/developer.rst +++ b/docs/source/developer.rst @@ -4,7 +4,7 @@ Open source code repository All code is freely available at ``_ Developer tools ---------------- +=============== Developer install:: @@ -22,16 +22,16 @@ Lint:: make lint -Build docs locally (You can then see the generated documentation in ``docs/_build/index.html``.):: +Build docs locally (you can then see the generated documentation in ``docs/_build/index.html``.):: make docs -Deploy docs:: +Deploy docs to gh-pages (https://matsengrp.github.io/gctree):: make deploy Todo list ---------- +========= .. todolist:: From 18f263bb81970b8232052d203811c27e882942f6 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 19:24:07 -0700 Subject: [PATCH 31/32] fix linting/format issues --- docs/source/conf.py | 28 ++++++++++++++++++---------- gctree/deduplicate.py | 4 +--- gctree/phylip_parse.py | 1 - gctree/utils.py | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 06e7265c..6493858a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -30,17 +30,25 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - "sphinx.ext.autodoc", # Core Sphinx library for auto html doc generation from docstrings - "sphinx.ext.autosummary", # Create neat summary tables for modules/classes/methods etc + # Core Sphinx library for auto html doc generation from docstrings + "sphinx.ext.autodoc", + # Create neat summary tables for modules/classes/methods etc + "sphinx.ext.autosummary", "sphinx.ext.githubpages", - "sphinx.ext.intersphinx", # Link to other project's documentation (see mapping below) + # Link to other project's documentation (see mapping below) + "sphinx.ext.intersphinx", "sphinx.ext.mathjax", - "sphinx.ext.viewcode", # Add a link to the Python source code for classes, functions etc. - "sphinx.ext.napoleon", # support NumPy and Google style docstrings - "sphinx_autodoc_typehints", # Automatically document param types (less noise in class signature) - "sphinx.ext.todo", # track to do list items + # Add a link to the Python source code for classes, functions etc. + "sphinx.ext.viewcode", + # support NumPy and Google style docstrings + "sphinx.ext.napoleon", + # Automatically document param types (less noise in class signature) + "sphinx_autodoc_typehints", + # track to do list items + "sphinx.ext.todo", "sphinxarg.ext", - "sphinxcontrib.programoutput", # render command line output + # render command line output + "sphinxcontrib.programoutput", ] # show todos in output @@ -58,8 +66,8 @@ autodoc_inherit_docstrings = True # If no class summary, inherit base class summary autodoc_default_options = { - 'members': True, - 'member-order': 'bysource', + 'members': True, + 'member-order': 'bysource', 'special-members': '__init__', } diff --git a/gctree/deduplicate.py b/gctree/deduplicate.py index a53bfbd8..cb1851bb 100755 --- a/gctree/deduplicate.py +++ b/gctree/deduplicate.py @@ -74,9 +74,7 @@ def fasta_parse(aln_file, root, frame=None, aln_file2=None, id_abundances=False) root: len(seqs_unique_counts[root_seq]) } # Add the count for the root sequence id_map = {root: [x for x in seqs_unique_counts[root_seq] if x != root]} - del seqs_unique_counts[ - root_seq - ] # Now delete the root so it does not appear twice + del seqs_unique_counts[root_seq] # Now delete the root so it does not appear twice for i, seq in enumerate(seqs_unique_counts, 1): new_id = "seq" + str(i) new_aln.append(SeqRecord(Seq(seq), id=new_id)) diff --git a/gctree/phylip_parse.py b/gctree/phylip_parse.py index b194663e..b066ac91 100644 --- a/gctree/phylip_parse.py +++ b/gctree/phylip_parse.py @@ -17,7 +17,6 @@ import pickle import argparse -import os # iterate over recognized sections in the phylip output file. diff --git a/gctree/utils.py b/gctree/utils.py index 798bf7f3..28f0627f 100755 --- a/gctree/utils.py +++ b/gctree/utils.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -"""Utility functions""" +"""Utility functions.""" def hamming_distance(seq1, seq2): From df47a8f552ad77e8e8cfbd28666fce3297753d19 Mon Sep 17 00:00:00 2001 From: William DeWitt Date: Wed, 30 Jun 2021 19:26:34 -0700 Subject: [PATCH 32/32] fail faster in CI with tests after linting --- .github/workflows/build-and-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index ca5904d4..c024a742 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -27,10 +27,6 @@ jobs: python -m pip install --upgrade pip make install - - name: Test - run: | - make test - - name: Lint run: | make lint @@ -38,3 +34,7 @@ jobs: - name: Check format with black run: | black --check gctree + + - name: Test + run: | + make test