Generates clusters and fasta file of
        dereplicated subsequences

        Parameters
        ----------

        fasta_filepath : string
           input filepath of fasta file to be dereplicated
        output_filepath : string
           write the dereplicated sequences to output_filepath
        working_dir : string, optional
           directory path for storing intermediate output
        output_uc : boolean, optional
           uutput dereplication results in a file using a
           uclust-like format
        strand : string, optional
           when searching for strictly identical sequences,
           check the 'strand' only (default: both) or
           check the plus strand only
        maxuniquesize : integer, optional
           discard sequences with an abundance value greater
           than maxuniquesize
        minuniquesize : integer, optional
           discard sequences with an abundance value smaller
           than integer
        sizein : boolean, optional
           take into account the abundance annotations present in
           the input fasta file,  (search for the pattern
           "[>;]size=integer[;]" in sequence headers)
        sizeout : boolean, optional
           add abundance annotations to the output fasta file
           (add the pattern ";size=integer;" to sequence headers)
        log_name : string, optional
           specifies log filename
        HALT_EXEC : boolean, optional
           used for debugging app controller

        Return
        ------

        output_filepath : string
           filepath to dereplicated fasta file
        uc_filepath : string
           filepath to dereplication results in uclust-like format
        log_filepath : string
           filepath to log file

def vsearch_dereplicate_exact_seqs(
    fasta_filepath,
    output_filepath,
    output_uc=False,
    working_dir=None,
    strand="both",
    maxuniquesize=None,
    minuniquesize=None,
    sizein=False,
    sizeout=True,
    log_name="derep.log",
    HALT_EXEC=False):
    """ Generates clusters and fasta file of
        dereplicated subsequences

        Parameters
        ----------

        fasta_filepath : string
           input filepath of fasta file to be dereplicated
        output_filepath : string
           write the dereplicated sequences to output_filepath
        working_dir : string, optional
           directory path for storing intermediate output
        output_uc : boolean, optional
           uutput dereplication results in a file using a
           uclust-like format
        strand : string, optional
           when searching for strictly identical sequences,
           check the 'strand' only (default: both) or
           check the plus strand only
        maxuniquesize : integer, optional
           discard sequences with an abundance value greater
           than maxuniquesize
        minuniquesize : integer, optional
           discard sequences with an abundance value smaller
           than integer
        sizein : boolean, optional
           take into account the abundance annotations present in
           the input fasta file,  (search for the pattern
           "[>;]size=integer[;]" in sequence headers)
        sizeout : boolean, optional
           add abundance annotations to the output fasta file
           (add the pattern ";size=integer;" to sequence headers)
        log_name : string, optional
           specifies log filename
        HALT_EXEC : boolean, optional
           used for debugging app controller

        Return
        ------

        output_filepath : string
           filepath to dereplicated fasta file
        uc_filepath : string
           filepath to dereplication results in uclust-like format
        log_filepath : string
           filepath to log file
    """

    # write all vsearch output files to same directory
    # as output_filepath if working_dir is not specified
    if not working_dir:
        working_dir = dirname(abspath(output_filepath))

    app = Vsearch(WorkingDir=working_dir, HALT_EXEC=HALT_EXEC)

    log_filepath = join(working_dir, log_name)
    uc_filepath = None
    if output_uc:
        root_name = splitext(abspath(output_filepath))[0]
        uc_filepath = join(working_dir, '%s.uc' % root_name)
        app.Parameters['--uc'].on(uc_filepath)

    if maxuniquesize:
        app.Parameters['--maxuniquesize'].on(maxuniquesize)
    if minuniquesize:
        app.Parameters['--minuniquesize'].on(minuniquesize)
    if sizein:
        app.Parameters['--sizein'].on()
    if sizeout:
        app.Parameters['--sizeout'].on()
    if (strand == "both" or strand == "plus"):
        app.Parameters['--strand'].on(strand)
    else:
        raise ValueError("Option --strand accepts only 'both'"
                         "or 'plus' values")
    app.Parameters['--derep_fulllength'].on(fasta_filepath)
    app.Parameters['--output'].on(output_filepath)
    app.Parameters['--log'].on(log_filepath)

    app_result = app()

    return output_filepath, uc_filepath, log_filepath