| 
0
 | 
     1 #!/usr/bin/env python
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 import os
 | 
| 
 | 
     4 import errno
 | 
| 
 | 
     5 import sys
 | 
| 
 | 
     6 import subprocess
 | 
| 
 | 
     7 import shutil
 | 
| 
 | 
     8 from Population import Population
 | 
| 
 | 
     9 import gd_composite
 | 
| 
 | 
    10 
 | 
| 
 | 
    11 ################################################################################
 | 
| 
 | 
    12 
 | 
| 
 | 
    13 def mkdir_p(path):
 | 
| 
 | 
    14   try:
 | 
| 
 | 
    15     os.makedirs(path)
 | 
| 
 | 
    16   except OSError, e:
 | 
| 
 | 
    17     if e.errno <> errno.EEXIST:
 | 
| 
 | 
    18       raise
 | 
| 
 | 
    19 
 | 
| 
 | 
    20 ################################################################################
 | 
| 
 | 
    21 
 | 
| 
 | 
    22 if len(sys.argv) < 11:
 | 
| 
 | 
    23     print >> sys.stderr, "Usage"
 | 
| 
 | 
    24     sys.exit(1)
 | 
| 
 | 
    25 
 | 
| 
 | 
    26 input, p1_input, output, extra_files_path, minimum_coverage, minimum_quality, dbkey, data_source, draw_tree_options = sys.argv[1:10]
 | 
| 
 | 
    27 
 | 
| 
 | 
    28 individual_metadata = sys.argv[10:]
 | 
| 
 | 
    29 
 | 
| 
 | 
    30 # note: TEST THIS
 | 
| 
 | 
    31 if dbkey in ['', '?', 'None']:
 | 
| 
 | 
    32     dbkey = 'none'
 | 
| 
 | 
    33 
 | 
| 
 | 
    34 p_total = Population()
 | 
| 
 | 
    35 p_total.from_tag_list(individual_metadata)
 | 
| 
 | 
    36 
 | 
| 
 | 
    37 
 | 
| 
 | 
    38 ################################################################################
 | 
| 
 | 
    39 
 | 
| 
 | 
    40 mkdir_p(extra_files_path)
 | 
| 
 | 
    41 
 | 
| 
 | 
    42 ################################################################################
 | 
| 
 | 
    43 
 | 
| 
 | 
    44 def run_program(prog, args, ofh):
 | 
| 
 | 
    45     #print "args: ", ' '.join(args)
 | 
| 
 | 
    46     p = subprocess.Popen(args, bufsize=-1, executable=prog, stdin=None, stdout=ofh, stderr=subprocess.PIPE)
 | 
| 
 | 
    47     (stdoutdata, stderrdata) = p.communicate()
 | 
| 
 | 
    48     rc = p.returncode
 | 
| 
 | 
    49     ofh.close()
 | 
| 
 | 
    50 
 | 
| 
 | 
    51     if rc != 0:
 | 
| 
 | 
    52         #print >> sys.stderr, "FAILED: rc={0}: {1}".format(rc, ' '.join(args))
 | 
| 
 | 
    53         print >> sys.stderr, stderrdata
 | 
| 
 | 
    54         sys.exit(1)
 | 
| 
 | 
    55 
 | 
| 
 | 
    56 ################################################################################
 | 
| 
 | 
    57 
 | 
| 
 | 
    58 phylip_outfile = os.path.join(extra_files_path, 'distance_matrix.phylip')
 | 
| 
 | 
    59 newick_outfile = os.path.join(extra_files_path, 'phylogenetic_tree.newick')
 | 
| 
 | 
    60 ps_outfile = 'tree.ps'
 | 
| 
 | 
    61 pdf_outfile = os.path.join(extra_files_path, 'tree.pdf')
 | 
| 
 | 
    62 
 | 
| 
 | 
    63 ################################################################################
 | 
| 
 | 
    64 
 | 
| 
 | 
    65 informative_snp_file = os.path.join(extra_files_path, 'informative_snps.txt')
 | 
| 
 | 
    66 mega_distance_matrix_file = os.path.join(extra_files_path, 'mega_distance_matrix.txt')
 | 
| 
 | 
    67 
 | 
| 
 | 
    68 prog = 'dist_mat'
 | 
| 
 | 
    69 
 | 
| 
 | 
    70 args = []
 | 
| 
 | 
    71 args.append(prog)
 | 
| 
 | 
    72 args.append(input)
 | 
| 
 | 
    73 args.append(minimum_coverage)
 | 
| 
 | 
    74 args.append(minimum_quality)
 | 
| 
 | 
    75 args.append(dbkey)
 | 
| 
 | 
    76 args.append(data_source)
 | 
| 
 | 
    77 args.append(informative_snp_file)
 | 
| 
 | 
    78 args.append(mega_distance_matrix_file)
 | 
| 
 | 
    79 
 | 
| 
 | 
    80 if p1_input == "all_individuals":
 | 
| 
 | 
    81     tags = p_total.tag_list()
 | 
| 
 | 
    82 else:
 | 
| 
 | 
    83     p1 = Population()
 | 
| 
 | 
    84     p1.from_population_file(p1_input)
 | 
| 
 | 
    85     if not p_total.is_superset(p1):
 | 
| 
 | 
    86         print >> sys.stderr, 'There is an individual in the population that is not in the SNP table'
 | 
| 
 | 
    87         sys.exit(1)
 | 
| 
 | 
    88     tags = p1.tag_list()
 | 
| 
 | 
    89 
 | 
| 
 | 
    90 for tag in tags:
 | 
| 
 | 
    91     args.append(tag)
 | 
| 
 | 
    92 
 | 
| 
 | 
    93 fh = open(phylip_outfile, 'w')
 | 
| 
 | 
    94 run_program(None, args, fh)
 | 
| 
 | 
    95 
 | 
| 
 | 
    96 ################################################################################
 | 
| 
 | 
    97 
 | 
| 
 | 
    98 prog = 'quicktree'
 | 
| 
 | 
    99 
 | 
| 
 | 
   100 args = []
 | 
| 
 | 
   101 args.append(prog)
 | 
| 
 | 
   102 args.append('-in')
 | 
| 
 | 
   103 args.append('m')
 | 
| 
 | 
   104 args.append('-out')
 | 
| 
 | 
   105 args.append('t')
 | 
| 
 | 
   106 args.append(phylip_outfile)
 | 
| 
 | 
   107 
 | 
| 
 | 
   108 fh = open(newick_outfile, 'w')
 | 
| 
 | 
   109 run_program(None, args, fh)
 | 
| 
 | 
   110 
 | 
| 
 | 
   111 ################################################################################
 | 
| 
 | 
   112 
 | 
| 
 | 
   113 prog = 'draw_tree'
 | 
| 
 | 
   114 
 | 
| 
 | 
   115 args = []
 | 
| 
 | 
   116 args.append(prog)
 | 
| 
 | 
   117 if draw_tree_options:
 | 
| 
 | 
   118     args.append(draw_tree_options)
 | 
| 
 | 
   119 args.append(newick_outfile)
 | 
| 
 | 
   120 
 | 
| 
 | 
   121 fh = open(ps_outfile, 'w')
 | 
| 
 | 
   122 run_program(None, args, fh)
 | 
| 
 | 
   123 
 | 
| 
 | 
   124 ################################################################################
 | 
| 
 | 
   125 
 | 
| 
 | 
   126 prog = 'ps2pdf'
 | 
| 
 | 
   127 
 | 
| 
 | 
   128 args = []
 | 
| 
 | 
   129 args.append(prog)
 | 
| 
 | 
   130 args.append('-dPDFSETTINGS=/prepress')
 | 
| 
 | 
   131 args.append(ps_outfile)
 | 
| 
 | 
   132 args.append('-')
 | 
| 
 | 
   133 
 | 
| 
 | 
   134 fh = open(pdf_outfile, 'w')
 | 
| 
 | 
   135 run_program(None, args, fh)
 | 
| 
 | 
   136 
 | 
| 
 | 
   137 shutil.copyfile(pdf_outfile, output)
 | 
| 
 | 
   138 
 | 
| 
 | 
   139 ################################################################################
 | 
| 
 | 
   140 
 | 
| 
 | 
   141 info_page = gd_composite.InfoPage()
 | 
| 
 | 
   142 info_page.set_title('Phylogenetic tree Galaxy Composite Dataset')
 | 
| 
 | 
   143 
 | 
| 
 | 
   144 display_file = gd_composite.DisplayFile()
 | 
| 
 | 
   145 display_value = gd_composite.DisplayValue()
 | 
| 
 | 
   146 
 | 
| 
 | 
   147 out_pdf = gd_composite.Parameter(name='tree.pdf', value='tree.pdf', display_type=display_file)
 | 
| 
 | 
   148 out_newick = gd_composite.Parameter(value='phylogenetic_tree.newick', name='phylogenetic tree (newick)', display_type=display_file)
 | 
| 
 | 
   149 out_phylip = gd_composite.Parameter(value='distance_matrix.phylip', name='Phylip distance matrix', display_type=display_file)
 | 
| 
 | 
   150 out_mega = gd_composite.Parameter(value='mega_distance_matrix.txt', name='Mega distance matrix', display_type=display_file)
 | 
| 
 | 
   151 out_snps = gd_composite.Parameter(value='informative_snps.txt', name='informative SNPs', display_type=display_file)
 | 
| 
 | 
   152 
 | 
| 
 | 
   153 info_page.add_output_parameter(out_pdf)
 | 
| 
 | 
   154 info_page.add_output_parameter(out_newick)
 | 
| 
 | 
   155 info_page.add_output_parameter(out_phylip)
 | 
| 
 | 
   156 info_page.add_output_parameter(out_mega)
 | 
| 
 | 
   157 info_page.add_output_parameter(out_snps)
 | 
| 
 | 
   158 
 | 
| 
 | 
   159 in_min_cov = gd_composite.Parameter(description='Minimum coverage', value=minimum_coverage, display_type=display_value)
 | 
| 
 | 
   160 in_min_qual = gd_composite.Parameter(description='Minimum quality', value=minimum_quality, display_type=display_value)
 | 
| 
 | 
   161 
 | 
| 
 | 
   162 include_ref_value = 'no'
 | 
| 
 | 
   163 if dbkey != 'none':
 | 
| 
 | 
   164     include_ref_value = 'yes'
 | 
| 
 | 
   165 
 | 
| 
 | 
   166 in_include_ref = gd_composite.Parameter(description='Include reference sequence', value=include_ref_value, display_type=display_value)
 | 
| 
 | 
   167 
 | 
| 
 | 
   168 if data_source == '0':
 | 
| 
 | 
   169     data_source_value = 'sequence coverage'
 | 
| 
 | 
   170 elif data_source == '1':
 | 
| 
 | 
   171     data_source_value = 'estimated genotype'
 | 
| 
 | 
   172 
 | 
| 
 | 
   173 in_data_source = gd_composite.Parameter(description='Data source', value=data_source_value, display_type=display_value)
 | 
| 
 | 
   174 
 | 
| 
 | 
   175 branch_type_value = 'square'
 | 
| 
 | 
   176 if 'd' in draw_tree_options:
 | 
| 
 | 
   177     branch_type_value = 'diagonal'
 | 
| 
 | 
   178 
 | 
| 
 | 
   179 in_branch_type = gd_composite.Parameter(description='Branch type', value=branch_type_value, display_type=display_value)
 | 
| 
 | 
   180 
 | 
| 
 | 
   181 branch_scale_value = 'yes'
 | 
| 
 | 
   182 if 's' in draw_tree_options:
 | 
| 
 | 
   183     branch_scale_value = 'no'
 | 
| 
 | 
   184 
 | 
| 
 | 
   185 in_branch_scale = gd_composite.Parameter(description='Draw branches to scale', value=branch_scale_value, display_type=display_value)
 | 
| 
 | 
   186 
 | 
| 
 | 
   187 branch_length_value = 'yes'
 | 
| 
 | 
   188 if 'b' in draw_tree_options:
 | 
| 
 | 
   189     branch_length_value = 'no'
 | 
| 
 | 
   190 
 | 
| 
 | 
   191 in_branch_length = gd_composite.Parameter(description='Show branch lengths', value=branch_length_value, display_type=display_value)
 | 
| 
 | 
   192 
 | 
| 
 | 
   193 tree_layout_value = 'horizontal'
 | 
| 
 | 
   194 if 'v' in draw_tree_options:
 | 
| 
 | 
   195     tree_layout_value = 'vertical'
 | 
| 
 | 
   196 
 | 
| 
 | 
   197 in_tree_layout = gd_composite.Parameter(description='Tree layout', value=tree_layout_value, display_type=display_value)
 | 
| 
 | 
   198 
 | 
| 
 | 
   199 info_page.add_input_parameter(in_min_cov)
 | 
| 
 | 
   200 info_page.add_input_parameter(in_min_qual)
 | 
| 
 | 
   201 info_page.add_input_parameter(in_include_ref)
 | 
| 
 | 
   202 info_page.add_input_parameter(in_data_source)
 | 
| 
 | 
   203 info_page.add_input_parameter(in_branch_type)
 | 
| 
 | 
   204 info_page.add_input_parameter(in_branch_scale)
 | 
| 
 | 
   205 info_page.add_input_parameter(in_branch_length)
 | 
| 
 | 
   206 info_page.add_input_parameter(in_tree_layout)
 | 
| 
 | 
   207 
 | 
| 
 | 
   208 misc_individuals = gd_composite.Parameter(name='Individuals', value=tags, display_type=gd_composite.DisplayTagList())
 | 
| 
 | 
   209 
 | 
| 
 | 
   210 info_page.add_misc(misc_individuals)
 | 
| 
 | 
   211 
 | 
| 
 | 
   212 
 | 
| 
 | 
   213 with open(output, 'w') as ofh:
 | 
| 
 | 
   214     print >> ofh, info_page.render()
 | 
| 
 | 
   215 
 | 
| 
 | 
   216 ################################################################################
 | 
| 
 | 
   217 
 | 
| 
 | 
   218 sys.exit(0)
 | 
| 
 | 
   219 
 |