def to_dict(self): # for multiple HSPs pick the one with highest score d = OrderedDict() for line in self: if (line.query, line.subject) not in d: d[(line.query, line.subject)] = line else: cur_score = d[(line.query, line.subject)].score if line.score > cur_score: d[(line.query, line.subject)] = line return d
def draw(args): """ %prog draw --input newicktrees [options] Draw phylogenetic trees into single or combined plots. Input trees should be one of the following: 1. single Newick format tree file 2. a dir containing *ONLY* the tree files to be drawn Newick format: http://evolution.genetics.washington.edu/phylip/newicktree.html This function wraps on jcvi.graphics.tree This function is better used for trees generated by jcvi.apps.phylo (rooted if possible). For drawing general Newick trees from external sources invoke jcvi.graphics.tree directly, which also gives more drawing options. """ trunc_name_options = ['headn', 'oheadn', 'tailn', 'otailn'] p = OptionParser(draw.__doc__) p.add_option("--input", help="path to single input tree file or a dir "\ "containing ONLY the input tree files") p.add_option("--combine", type="string", default="1x1", \ help="combine multiple trees into one plot in nrowxncol") p.add_option("--trunc_name", default=None, help="Options are: {0}. " \ "truncate first n chars, retains only first n chars, " \ "truncate last n chars, retain only last chars. " \ "n=1~99. [default: %default]".format(trunc_name_options)) p.add_option("--SH", default=None, help="path to a file containing SH test p-values in format:" \ "tree_file_name<tab>p-values " \ "This file can be generated with jcvi.apps.phylo build [default: %default]") p.add_option( "--scutoff", default=50, type="int", help="cutoff for displaying node support, 0-100 [default: %default]") p.add_option("--barcode", default=None, help="path to seq/taxon name barcode mapping file: " \ "barcode<tab>new_name " \ "This option is downstream of `--trunc_name` [default: %default]") p.add_option("--leafcolorfile", default=None, help="path to a mapping file containing font colors " \ "for the OTUs: leafname<tab>color [default: %default]") p.add_option("--outdir", type="string", default=".", \ help="path to output dir. New dir is made if not existed [default: %default]") opts, args, iopts = p.set_image_options(figsize="8x6") input = opts.input outdir = opts.outdir combine = opts.combine.split("x") trunc_name = opts.trunc_name SH = opts.SH mkdir(outdir) if not input: sys.exit(not p.print_help()) elif op.isfile(input): trees_file = input treenames = [op.basename(input)] elif op.isdir(input): trees_file = op.join(outdir, "alltrees.dnd") treenames = [] for f in sorted(os.listdir(input)): sh("cat {0}/{1} >> {2}".format(input, f, trees_file), log=False) treenames.append(f) else: sys.exit(not p.print_help()) trees = OrderedDict() tree = "" i = 0 for row in LineFile(trees_file, comment="#", load=True).lines: if i == len(treenames): break if not len(row): continue if ";" in row: # sanity check if row.index(";") != len(row) - 1: ts = row.split(";") for ii in xrange(len(ts) - 1): ts[ii] += ";" else: ts = [row] for t in ts: if ";" in t: tree += t if tree: trees[treenames[i]] = tree tree = "" i += 1 else: tree += t else: tree += row logging.debug("A total of {0} trees imported.".format(len(trees))) sh("rm {0}".format(op.join(outdir, "alltrees.dnd"))) _draw_trees(trees, nrow=int(combine[0]), ncol=int(combine[1]), rmargin=.3,\ iopts=iopts, outdir=outdir, shfile=SH, trunc_name=trunc_name, \ scutoff=opts.scutoff, barcodefile = opts.barcode, leafcolorfile=opts.leafcolorfile)