Source code for trifusion.base.sanity

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#
#  Copyright 2012 Unknown <diogo@arch>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.

from argparse import ArgumentTypeError
import os

try:
    from process.base import print_col, RED, YELLOW
except ImportError:
    from trifusion.process.base import print_col, RED, YELLOW


[docs]def triseq_arg_check(arg): if arg.gcoder and "nexus" not in arg.output_format: print_col("Gap coding can only be performed for Nexus output format.", RED) if arg.gcoder and "nexus" in arg.output_format and \ arg.output_format != ["nexus"]: print_col("Gap coding can only be performed for Nexus output format." " This operation will be ignored for other output formats.", YELLOW, quiet=arg.quiet) if arg.conversion and arg.reverse: print_col("Ignoring conversion flag (-c) when specifying reverse" " concatenation (-r)", YELLOW, quiet=arg.quiet) if arg.outfile and arg.reverse: print_col("Ignoring output file option (-o) when specifying reverse" " concatenation (-r)", YELLOW, quiet=arg.quiet) if arg.partition_file is not None and arg.outfile is None: print_col("An output file must be provided with option '-o'", RED) if "ima2" in arg.output_format and arg.ima2_params is None: print_col("Additional arguments must be provided with the" " option --ima2-params when selecting ima2 output format", RED) if "ima2" in arg.output_format and len(arg.ima2_params) != 4: print_col("Four additional arguments must be provided with" " option --ima2-params when selecting the " "ima2 output format. %s were given" % (len(arg.ima2_params)), RED) if arg.partition_file is not None: return 0 if arg.conversion is None and arg.outfile is None and arg.reverse is None\ and arg.select is None and arg.get_taxa is False: print_col( "If you wish to concatenate provide the output file name using " "the '-o' option. If you wish to convert a " "file, specify it using the '-c' option", RED) if len(arg.infile) == 1 and arg.conversion is None and arg.reverse is None\ and arg.collapse is None: print_col( "Cannot perform concatenation of a single file. Please provide" " additional files to concatenate, or specify the conversion " "'-c' option", RED) if arg.zorro is not None and len(arg.infile) == 1: print_col( "The '-z' option cannot be invoked when only a single input " "file is provided. This option is reserved for" " concatenation of multiple alignment files", RED) if arg.consensus and arg.output_format != ["fasta"]: print_col("Output format must be only Fasta when using the " "consensus option", RED) if not arg.consensus and arg.consensus_single: print_col("Ignoring consensus single file option (--consensus-single-" "file) when the consensus operation is not specified", YELLOW, quiet=arg.quiet) else: return 0
[docs]def post_aln_checks(arg, aln_obj): if arg.consensus == ["IUPAC"] and aln_obj.sequence_code[0] != "DNA": print_col("'IUPAC' option of the consensus operation can " "only be performed on nucleotide alignments.", RED) if arg.codon_filter and aln_obj.sequence_code[0] != "DNA": print_col("The codon filter option (--codon-filter) can only be" " performed on nucleotide alignments.", RED) if aln_obj.bad_alignments: print_col("The following input files could not be read or are empty" ": {}".format(" ".join(aln_obj.bad_alignments)), YELLOW) if aln_obj.non_alignments: print_col("The following input files have alignments of unequal " "length: {}".format(" ".join(aln_obj.non_alignments)), YELLOW) else: return 0
[docs]def mfilters(filt): """ Checks the type of the some filter options. Assures that the values are within the accepted boundaries of [0-100]. If the provided filter is a decimal, it converts to percentage automatically :param filt: (string) The value provided with the --missing-filter :return: """ # Check if filt is convertable to float try: filt = float(filt) except ValueError: raise ArgumentTypeError("The value '{}' is not a " "number between 0 and 100.".format(filt)) # Check if filt is within acceptable range if not (0 <= filt <= 100): raise ArgumentTypeError("The value '{}' must be a number between " "0 and 100.".format(int(filt))) # If filt is a float between 0 and 1, convert to percentage if 0 <= filt < 1: filt = int(filt * 100) else: filt = int(filt) return filt
[docs]def check_infile_list(infiles): dirs = [] lost = [] good_files = [] for fpath in infiles: if not os.path.exists(fpath): lost.append(fpath) elif os.path.isdir(fpath): dirs.append(fpath) else: good_files.append(fpath) return good_files, dirs, lost