def wrfdist_task(newick_string_a, newick_string_b, normalise): """ Celery-distributed version of tree_distance.rfdist Parameters: two valid newick strings and a boolean """ try: tree_a = Tree(newick_string_a) tree_b = Tree(newick_string_b) return treedist.wrfdist(tree_a, tree_b, normalise) except Exception as exc: wrfdist_task.retry(exc=exc, countdown=1, max_retries=5)
def get_tree_collection_strings(self, scale=1): """ Function to get input strings for tree_collection tree_collection needs distvar, genome_map and labels - these are returned in the order above """ # aliases num_matrices = len(self.distances) label_set = reduce(lambda x, y: x.union(y), (set(l) for l in self.headers)) labels_len = len(label_set) # labels string can be built straight away labels_string = '{0}\n{1}\n'.format(labels_len, ' '.join(label_set)) # distvar and genome_map need to be built up distvar_list = [str(num_matrices)] genome_map_list = ['{0} {1}'.format(num_matrices, labels_len)] # build up lists to turn into strings for i in range(num_matrices): labels = self.headers[i] dim = len(labels) dmatrix = np.array(self.distances[i]) vmatrix = np.array(self.variances[i]) matrix = np.zeros(dmatrix.shape) matrix[np.triu_indices(len(dmatrix), 1)] = dmatrix[np.triu_indices(len(dmatrix), 1)] matrix[np.tril_indices(len(vmatrix), -1)] = vmatrix[np.tril_indices(len(vmatrix), -1)] if scale: matrix[np.triu_indices(dim, 1)] *= scale matrix[np.tril_indices(dim, -1)] *= scale * scale if isinstance(matrix, np.ndarray): matrix_string = '\n'.join([' '.join(str(x) for x in row) for row in matrix]) + '\n' else: matrix_string = matrix distvar_list.append('{0} {0} {1}\n{2}'.format(dim, i + 1, matrix_string)) genome_map_entry = ' '.join((str(labels.index(lab) + 1) if lab in labels else '-1') for lab in label_set) genome_map_list.append(genome_map_entry) distvar_string = '\n'.join(distvar_list) genome_map_string = '\n'.join(genome_map_list) guide_tree = Tree(self.mrp_tree) for e in guide_tree.postorder_edge_iter(): if e.length is None: if e.head_node == guide_tree.seed_node: e.length = 0.0 else: e.length = np.random.uniform() if not guide_tree.is_rooted: guide_tree.reroot_at_midpoint() if not guide_tree.is_rooted: raise Exception('Couldn\'t root the guide tree') tree_string = guide_tree.scale(scale).newick return distvar_string, genome_map_string, labels_string, tree_string
def get_tree_collection_strings(self, scale=1): """ Function to get input strings for tree_collection tree_collection needs distvar, genome_map and labels - these are returned in the order above """ # aliases num_matrices = len(self.distances) label_set = reduce(lambda x, y: x.union(y), (set(l) for l in self.headers)) labels_len = len(label_set) # labels string can be built straight away labels_string = '{0}\n{1}\n'.format(labels_len, ' '.join(label_set)) # distvar and genome_map need to be built up distvar_list = [str(num_matrices)] genome_map_list = ['{0} {1}'.format(num_matrices, labels_len)] # build up lists to turn into strings for i in range(num_matrices): labels = self.headers[i] dim = len(labels) dmatrix = np.array(self.distances[i]) vmatrix = np.array(self.variances[i]) matrix = np.zeros(dmatrix.shape) matrix[np.triu_indices(len(dmatrix), 1)] = dmatrix[np.triu_indices( len(dmatrix), 1)] matrix[np.tril_indices(len(vmatrix), -1)] = vmatrix[np.tril_indices( len(vmatrix), -1)] if scale: matrix[np.triu_indices(dim, 1)] *= scale matrix[np.tril_indices(dim, -1)] *= scale * scale if isinstance(matrix, np.ndarray): matrix_string = '\n'.join( [' '.join(str(x) for x in row) for row in matrix]) + '\n' else: matrix_string = matrix distvar_list.append('{0} {0} {1}\n{2}'.format( dim, i + 1, matrix_string)) genome_map_entry = ' '.join( (str(labels.index(lab) + 1) if lab in labels else '-1') for lab in label_set) genome_map_list.append(genome_map_entry) distvar_string = '\n'.join(distvar_list) genome_map_string = '\n'.join(genome_map_list) guide_tree = Tree(self.mrp_tree) for e in guide_tree.postorder_edge_iter(): if e.length is None: if e.head_node == guide_tree.seed_node: e.length = 0.0 else: e.length = np.random.uniform() if not guide_tree.is_rooted: guide_tree.reroot_at_midpoint() if not guide_tree.is_rooted: raise Exception('Couldn\'t root the guide tree') tree_string = guide_tree.scale(scale).newick return distvar_string, genome_map_string, labels_string, tree_string
def minsq_task(dv, gm, lab, tree, niters=10): tree, sse = tree_collection.compute(dv, gm, lab, tree, niters, False, True) tree = Tree(tree) tree.deroot() return dict(tree=tree.newick, sse=sse)