def WriteTree(self, tree): """write tree to file. """ nexus = TreeTools.Newick2Nexus(tree) t = nexus.trees[0] TreeTools.MapTaxa(t, self.mMapOld2New) outfile = open(self.mTempdir + "/" + self.mFilenameTree, "w") outfile.write("%i 1\n" % self.mNumSequences) outfile.write("%s\n" % TreeTools.Tree2Newick(t)) outfile.close()
def parseOutput(self, lines, out, err): lines = re.sub("\s", "", "".join(lines)) lines = re.sub("\[[^\]]+\]", "", lines) t = TreeTools.Newick2Nexus("".join(lines)) result = Result() t = t.trees[0] TreeTools.MapTaxa(t, self.mMapNew2Old) result.mTree = t result.mLog = out result.mErr = err return result
def run(self): self.prepareRun() if not self.mProgram: raise UsageError("no program specified.") s = subprocess.Popen("%s" % (self.mProgram), shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.mTempdir, close_fds=True) (out, err) = s.communicate("\n".join(self.mOptions) + "\n") if s.returncode != 0: raise UsageError, "Error in running phylip.\n%s\n%s\nTemporary directory was %s" % ( out, err, self.mTempdir) # Parse output files that might have been created: result = PhylipResult() # parse tree file if os.path.exists("%s/outtree" % self.mTempdir): nexus = TreeTools.Newick2Nexus( open("%s/outtree" % self.mTempdir, "r")) for tree in nexus.trees: TreeTools.MapTaxa(tree, self.mMapPhylip2Input) result.mNexus = nexus if self.mLogLevel >= 1: print "# received tree with %i taxa" % (len( TreeTools.GetTaxa(nexus.trees[0]))) elif os.path.exists("%s/outfile" % self.mTempdir): if self.mProgram in ("dnadist", "protdist"): infile = open("%s/outfile" % self.mTempdir, "r") result.mMatrix, row_headers, col_headers = MatlabTools.readMatrix( infile, format="phylip") result.mRowHeaders = [] for x in row_headers: result.mRowHeaders.append(self.mMapPhylip2Input[x]) result.mColHeaders = result.mRowHeaders elif self.mProgram == "contrast": infile = open("%s/outfile" % self.mTempdir, "r") result.parseContrasts(infile) infile.close() else: raise "other return types not implemented" if self.mLogLevel >= 2: print out if self.mLogLevel == 0: shutil.rmtree(self.mTempdir) return result
def prepareRun(self): self.__reset() self.mTempdir = tempfile.mkdtemp() # self.mTempdir = "tmp" if not os.path.exists(self.mTempdir): os.mkdir(self.mTempdir) if self.mInputMatrix and self.mInputData: raise ValueError( "please specify either input matrix or input data, but not both." ) # prepare input matrix. Should already be in phylip like # format, but long identifiers are shortened and tabs are # replaced by spaces. if self.mInputMatrix: outfile = open(self.mTempdir + "/infile", "w") identifiers = map(lambda x: re.split("\s+", x[:-1])[0], self.mInputMatrix[1:]) self.updateMaps(identifiers) outfile.write(self.mInputMatrix[0]) for line in self.mInputMatrix[1:]: data = re.split("\s+", line[:-1]) new_line = self.mMapInput2Phylip[ data[0]] + " " + " ".join(data[1:]) outfile.write(new_line + "\n") outfile.close() if self.mLogLevel >= 1: print "# written input matrix with %i taxa to %s" % ( len(identifiers), self.mTempdir + "/infile") os.system("cat %s" % self.mTempdir + "/infile") elif self.mInputData: outfile = open(self.mTempdir + "/infile", "w") outfile.write("%i %i\n" % (len(self.mInputData), len(self.mInputData[0]) - 1)) identifiers = map(lambda x: x[0], self.mInputData) self.updateMaps(identifiers) for x in range(len(identifiers)): outfile.write("%-10s %s\n" % (self.mMapInput2Phylip[identifiers[x]], " ".join( self.mInputData[x][1:]))) outfile.close() if self.mLogLevel >= 1: print "# written input matrix with %i taxa to %s" % ( len(identifiers), self.mTempdir + "/infile") os.system("cat %s" % self.mTempdir + "/infile") # prepare input tree or trees self.mNInputTrees = 0 if self.mInputTree or self.mInputTrees: outfile = open(self.mTempdir + "/intree", "w") if self.mInputTree and self.mInputTrees: raise UsageError( "please supply either one or mupltiple trees, but not both." ) if self.mInputTree: trees = [self.mInputTree] else: trees = self.mInputTrees for tree in trees: if self.mPruneTree: taxa = self.mMapInput2Phylip.keys() TreeTools.PruneTree(tree, taxa) taxa = TreeTools.GetTaxa(tree) self.updateMaps(taxa) TreeTools.MapTaxa(tree, self.mMapInput2Phylip) # check if taxa are unique taxa = tree.get_taxa() staxa = set() skip = False for t in taxa: if t in staxa: if self.mLogLevel >= 1: print "# skipping tree %s because of duplicate taxa." % ( tree.name) skip = True staxa.add(t) if skip: continue outfile.write(TreeTools.Tree2Newick(tree) + "\n") self.mNInputTrees += 1 if self.mLogLevel >= 1: print "# written input tree with %i taxa to %s" % (len( TreeTools.GetTaxa(tree)), self.mTempdir + "/intree") print "#", TreeTools.Tree2Newick(tree) outfile.close() # prepare input multiple alignment if self.mInputMali: if self.mInputMatrix: raise "both mali and matrix supplied - infile conflict." outfile = open(self.mTempdir + "/infile", "w") identifiers = self.mInputMali.getIdentifiers() self.updateMaps(identifiers) self.mInputMali.mapIdentifiers(self.mMapInput2Phylip) self.mInputMali.writeToFile(outfile, format="phylip") outfile.close() if self.mLogLevel >= 1: print "# written input multiple alignments with %i taxa and with %i to %s" %\ (self.mInputMali.getLength(), self.mInputMali.getWidth(), self.mTempdir + "/intree")