Skip to content

Commit

Permalink
Rewrite mentalist_tree tool in python
Browse files Browse the repository at this point in the history
  • Loading branch information
dfornika committed Jun 13, 2018
1 parent f59b512 commit 2ad4624
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 23 deletions.
68 changes: 48 additions & 20 deletions galaxy/tools/mentalist_tree/mentalist_tree
Original file line number Diff line number Diff line change
@@ -1,24 +1,52 @@
#!/usr/bin/env Rscript
#!/usr/bin/env python

args = commandArgs(trailingOnly=TRUE)
import sys
import csv
import numpy as np

usage <- function() {
cat("usage: mentalist_tree <input.tsv>\n")
}
import Bio.Phylo
from Bio.Phylo.TreeConstruction import DistanceMatrix, DistanceTreeConstructor

main <- function(args) {
if(is.na(args[1])){
usage()
return()
}
suppressMessages(library(phangorn))

distance_matrix <- as.matrix(read.csv(args[1], row.names=1, sep="\t"))
nj_tree <- NJ(distance_matrix)
newick_tree <- write.tree(nj_tree)
cat(newick_tree, '\n')
}
def usage():
print("usage: mentalist_tree <input.tsv>\n")

if(!interactive()) {
main(args)
}
def process_input_matrix(input_matrix):
""" Converts an array-of-arrays containting sample IDs and distances
into a BioPython DistanceMatrix object
"""
input_matrix.pop(0)
sample_names = [row[0] for row in input_matrix]
for row in input_matrix:
row.pop(0)
distance_matrix = []
for input_matrix_row in input_matrix:
distance_matrix.append([int(i) for i in input_matrix_row])
distance_matrix = np.tril(np.array(distance_matrix))
num_rows = distance_matrix.shape[0]
lower_triangular_idx_mask = np.tril_indices(num_rows)
linear_distance_matrix = distance_matrix[lower_triangular_idx_mask]
distance_matrix = []
min = 0
max = 1
for i in range(num_rows):
distance_matrix.append(linear_distance_matrix[min:max].tolist())
min = max
max = max + (i + 2)
distance_matrix = DistanceMatrix(names=sample_names, matrix=distance_matrix)
return distance_matrix

def main():
if len(sys.argv) < 2:
usage()
sys.exit(1)

input_file = sys.argv[1]
reader = csv.reader(open(input_file, "r"), delimiter="\t")
input_matrix = list(reader)
distance_matrix = process_input_matrix(input_matrix)
constructor = DistanceTreeConstructor()
tree = constructor.nj(distance_matrix)
Bio.Phylo.write(tree, sys.stdout, 'newick')

if __name__ == '__main__':
main()
5 changes: 2 additions & 3 deletions galaxy/tools/mentalist_tree/mentalist_tree.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<tool id="mentalist_tree" name="MentaLiST Tree" version="0.1-SNAPSHOT">
<tool id="mentalist_tree" name="MentaLiST Tree" version="0.1.8">
<requirements>
<requirement type="package" version="3.4.1">r-base</requirement>
<requirement type="package" version="2.3.1">r-phangorn</requirement>
<requirement type="package" version="1.7.0">biopython</requirement>
</requirements>
<command detect_errors="exit_code"><![CDATA[
$__tool_directory__/mentalist_tree
Expand Down

0 comments on commit 2ad4624

Please sign in to comment.