From 005a444f9cbe4648ccf48e3a6f7f91507af5cca9 Mon Sep 17 00:00:00 2001 From: Daniel Blankenberg Date: Tue, 13 Mar 2007 18:23:08 +0000 Subject: [PATCH] Add HYPHY branch lengths tool. --- tool_conf.xml.sample | 3 + tools/hyphy/hyphy_branch_lengths_wrapper.py | 53 ++ tools/hyphy/hyphy_branch_lengths_wrapper.xml | 93 ++++ tools/hyphy/hyphy_util.py | 516 +++++++++++++++++++ 4 files changed, 665 insertions(+) create mode 100644 tools/hyphy/hyphy_branch_lengths_wrapper.py create mode 100644 tools/hyphy/hyphy_branch_lengths_wrapper.xml create mode 100644 tools/hyphy/hyphy_util.py diff --git a/tool_conf.xml.sample b/tool_conf.xml.sample index 5151d04bb2e..42b08403f85 100644 --- a/tool_conf.xml.sample +++ b/tool_conf.xml.sample @@ -343,4 +343,7 @@ +
+ +
diff --git a/tools/hyphy/hyphy_branch_lengths_wrapper.py b/tools/hyphy/hyphy_branch_lengths_wrapper.py new file mode 100644 index 00000000000..dd17ec8257e --- /dev/null +++ b/tools/hyphy/hyphy_branch_lengths_wrapper.py @@ -0,0 +1,53 @@ +#Dan Blankenberg +#takes commandline tree def and input multiple fasta alignment file and runs the branch length ananlysis +import os, sys +import hyphy_util + +#Retrieve hard coded hyphy path, this will need to be the same across the cluster +HYPHY_PATH = hyphy_util.HYPHY_PATH +HYPHY_EXECUTABLE = hyphy_util.HYPHY_EXECUTABLE + +#Read command line arguments +input_filename = os.path.abspath(sys.argv[1].strip()) +output_filename = os.path.abspath(sys.argv[2].strip()) +tree_contents = sys.argv[3].strip() +nuc_model = sys.argv[4].strip() +base_freq = sys.argv[5].strip() +model_options = sys.argv[6].strip() + +#Set up Temporary files for hyphy run +#set up tree file +tree_filename = hyphy_util.get_filled_temp_filename(tree_contents) + +#Guess if this is a single or multiple FASTA input file +found_blank = False +is_multiple = False +for line in open(input_filename): + line = line.strip() + if line == "": found_blank = True + elif line.startswith(">") and found_blank: + is_multiple = True + break + else: found_blank = False + +#set up BranchLengths file +BranchLengths_filename = hyphy_util.get_filled_temp_filename(hyphy_util.BranchLengths) +if is_multiple: + os.unlink(BranchLengths_filename) + BranchLengths_filename = hyphy_util.get_filled_temp_filename(hyphy_util.BranchLengthsMF) + print "Multiple Alignment Analyses" +else: print "Single Alignment Analyses" + +#setup Config file +config_filename = hyphy_util.get_branch_lengths_config_filename(input_filename, nuc_model, model_options, base_freq, tree_filename, output_filename, BranchLengths_filename) + +#Run Hyphy +hyphy_cmd = "%s BASEPATH=%s USEPATH=/dev/null %s" % (HYPHY_EXECUTABLE, HYPHY_PATH, config_filename) +hyphy = os.popen(hyphy_cmd, 'r') +#print hyphy.read() +hyphy.close() + +#remove temporary files +os.unlink(BranchLengths_filename) +os.unlink(tree_filename) +os.unlink(config_filename) diff --git a/tools/hyphy/hyphy_branch_lengths_wrapper.xml b/tools/hyphy/hyphy_branch_lengths_wrapper.xml new file mode 100644 index 00000000000..9e2789cf51f --- /dev/null +++ b/tools/hyphy/hyphy_branch_lengths_wrapper.xml @@ -0,0 +1,93 @@ + + + + Estimation + + hyphy_branch_lengths_wrapper.py $input1 $out_file1 "$tree" "$model" "$base_freq" "Global" + + + + + + + + + + + + + + + + + + + + + + + + + + + + +This tool takes a single or multiple FASTA alignment file and estimates branch lengths using HYPHY_, a maximum likelihood analyses package. + +For the tree definition, you only need to specify the species build names. For example, you could use the tree *((hg17,panTro1),(mm5,rn3),canFam1)*, if your FASTA file looks like this:: + + >hg17.chr7(+):26907301-26907310|hg17_0 + GTGGGAGGT + >panTro1.chr6(+):28037319-28037328|panTro1_0 + GTGGGAGGT + >mm5.chr6(+):52104022-52104031|mm5_0 + GTGGGAGGT + >rn3.chr4(+):80734395-80734404|rn3_0 + GTGGGAGGT + >canFam1.chr14(+):42826409-42826418|canFam1_0 + GTGGGAGGT + + >hg17.chr7(+):26907310-26907326|hg17_1 + AGTCAGAGTGTCTGAG + >panTro1.chr6(+):28037328-28037344|panTro1_1 + AGTCAGAGTGTCTGAG + >mm5.chr6(+):52104031-52104047|mm5_1 + AGTCAGAGTGTCTGAG + >rn3.chr4(+):80734404-80734420|rn3_1 + AGTCAGAGTATCTGAG + >canFam1.chr14(+):42826418-42826434|canFam1_1 + AGTCAGAGTGTCTGAG + + >hg17.chr7(+):26907326-26907338|hg17_2 + GTAGAAGACCCC + >panTro1.chr6(+):28037344-28037356|panTro1_2 + GTAGAAGACCCC + >mm5.chr6(+):52104047-52104059|mm5_2 + GTAGACGATGCC + >rn3.chr4(+):80734420-80734432|rn3_2 + GTAGATGATGCG + >canFam1.chr14(+):42826434-42826446|canFam1_2 + GTAGAAGACCCC + + >hg17.chr7(+):26907338-26907654|hg17_3 + GGGGAAGGAACGCAGGGCGAAGAGCTGGACTTCTCTGAGGAT---TCCTCGGCCTTCTCGT-----CGTTTCCTGG----CGGGGTGGCCGGAGAGATGGGCAAGAGACCCTCCTTCTCACGTTTCTTTTGCTTCATTCGGCGGTTCTGGAACCAGATCTTCACTTGGGTCTCGTTGAGCTGCAGGGATGCAGCGATCTCCACCCTGCGGGCGCGCGTCAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGTTCCGTGAGCTGCTTGGTAGTGAAGTTGGTGCGCACCGCGTTGGGTTGACCCAGGTAGCCGTACTCTCCAACTTTCC + >panTro1.chr6(+):28037356-28037672|panTro1_3 + GGGGAAGGAACGCAGGGCGAAGAGCTGGACTTCTCTGAGGAT---TCCTCGGCCTTCTCGT-----CGTTTCCTGG----CGGGGTGGCCGGAGAGATGGGCAAGAGACCCTCCTTCTCACGTTTCTTTTGCTTCATTCGGCGGTTCTGGAACCAGATCTTCACTTGGGTCTCGTTGAGCTGCAGGGATGCAGCGATCTCCACCCTGCGGGCGCGCGTCAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGTTCCGTGAGCTGCTTGGTAGTGAAGTTGGTGCGCACCGCGTTGGGTTGACCCAGGTAGCCGTACTCTCCAACTTTCC + >mm5.chr6(+):52104059-52104375|mm5_3 + GGAGAAGGGGCACTGGGCGAGGGGCTAGATTTCTCAGATGAT---TCTTCCGTTTTCTCAT-----CGCTGCCAGG----AGGAGTGGCAGGGGAGATGGGCAGGAGCCCCTCCTTCTCACGCTTCTTCTGCTTCATGCGGCGATTCTGGAACCAGATCTTCACCTGGGTCTCATTGAGCTGTAGGGACGCGGCAATCTCCACCCTGCGCGCTCGTGTAAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGCTCTGTGAGCTGCTTGGTGGTGAAATTGGTGCGCACTGCGTTGGGTTGACCCACGTAGCCGTACTCTCCAACTTTCC + >rn3.chr4(+):80734432-80734748|rn3_3 + GGAGAAGGGGCGCTGGGCGAGGAGCTGGATTTCTCAGATGAT---TCTTCAGTTTTCTCAT-----CGCTTCCAGG----AGGGGTGGCGGGTGAAATGGGCAAGAGCCCCTCTTTCTCGCGCTTCTTCTGCTTCATGCGGCGATTCTGGAACCAGATCTTCACCTGGGTCTCATTGAGTTGCAGGGACGCGGCTATCTCCACCCTGCGGGCTCTTGTTAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGCTCTGTGAGCTGCTTGGTGGTGAAGTTGGTGCGCACTGCGTTGGGTTGACCCACGTAGCCATACTCTCCAACTTTCC + >canFam1.chr14(+):42826446-42826762|canFam1_3 + GGAGACGGAATGCAGGGCGAGGAGCTGGATTTCTCTGAAGAT---TCCTCCGCCTTCTCCT-----CACTTCCTGG----CGGGGTGGCAGGGGAGATGGGCAAAAGGCCCTCTTTCTCTCGTTTCTTCTGCTTCATCCGGCGGTTCTGGAACCAGATCTTCACCTGGGTCTCGTTGAGCTGCAGGGATGCTGCGATCTCCACCCTGCGGGCGCGGGTCAGATACTTATTGAAGTGGAACTCCTTTTCCAGCTCGGTGAGCTGCTTGGTGGTGAAGTTGGTACGCACTGCATTCGGTTGACCCACGTAGCCGTACTCTCCAACTTTCC + + + +.. _HYPHY: http://www.hyphy.org + + + diff --git a/tools/hyphy/hyphy_util.py b/tools/hyphy/hyphy_util.py new file mode 100644 index 00000000000..01e4a4ac5ba --- /dev/null +++ b/tools/hyphy/hyphy_util.py @@ -0,0 +1,516 @@ +#Dan Blankenberg +#Contains file contents and helper methods for HYPHY configurations +import tempfile, os + +def get_filled_temp_filename(contents): + fh = tempfile.NamedTemporaryFile('w') + filename = fh.name + fh.close() + fh = open(filename, 'w') + fh.write(contents) + fh.close() + return filename + +#Hard Coded hyphy path, this will need to be the same across the cluster +HYPHY_PATH = "/home/universe/linux-i686/HYPHY" +HYPHY_EXECUTABLE = os.path.join(HYPHY_PATH,"HYPHY") + +BranchLengthsMF = """ +VERBOSITY_LEVEL = -1; +fscanf (PROMPT_FOR_FILE, "Lines", inLines); + +_linesIn = Columns (inLines); + +/*---------------------------------------------------------*/ + +_currentGene = 1; +_currentState = 0; +geneSeqs = ""; +geneSeqs * 128; + +for (l=0; l<_linesIn; l=l+1) +{ + if (Abs(inLines[l]) == 0) + { + if (_currentState == 1) + { + geneSeqs * 0; + DataSet ds = ReadFromString (geneSeqs); + _processAGene (_currentGene); + geneSeqs * 128; + _currentGene = _currentGene + 1; + } + } + else + { + if (_currentState == 0) + { + _currentState = 1; + } + geneSeqs * inLines[l]; + geneSeqs * "\\n"; + } +} + +if (_currentState == 1) +{ + geneSeqs * 0; + if (Abs(geneSeqs)) + { + DataSet ds = ReadFromString (geneSeqs); + _processAGene (_currentGene); + } +} + +fprintf (resultFile,CLOSE_FILE); + +/*---------------------------------------------------------*/ + +function _processAGene (_geneID) +{ + DataSetFilter filteredData = CreateFilter (ds,1); + if (_currentGene == 1) + { + SelectTemplateModel (filteredData); + + SetDialogPrompt ("Tree file"); + fscanf (PROMPT_FOR_FILE, "Tree", givenTree); + fscanf (stdin, "String", resultFile); + + /* do sequence to branch map */ + + validNames = {}; + taxonNameMap = {}; + + for (k=0; k