예제 #1
0
def test_requirement__same_obj_if_name_differ():
    obj1 = versions.Requirement("echo", "", versions.GE(1))
    assert obj1.name == "echo"
    obj2 = versions.Requirement("echo", "", versions.GE(1), name="foo")
    assert obj2.name == "foo"
    assert obj1 is obj2

    obj3 = versions.Requirement("echo", "", versions.GE(1), name="bar")
    assert obj3.name == "bar"
    assert obj2 is obj3

    obj4 = versions.Requirement("echo", "", versions.GE(1))
    assert obj3.name == "bar"
    assert obj3 is obj4
예제 #2
0
def test_requirement__same_obj_if_name_differ():
    obj1 = versions.Requirement("echo", "", versions.GE(1))
    assert_equal(obj1.name, "echo")
    obj2 = versions.Requirement("echo", "", versions.GE(1), name="foo")
    assert_equal(obj2.name, "foo")
    assert_is(obj1, obj2)

    obj3 = versions.Requirement("echo", "", versions.GE(1), name="bar")
    assert_equal(obj3.name, "bar")
    assert_is(obj2, obj3)

    obj4 = versions.Requirement("echo", "", versions.GE(1))
    assert_equal(obj3.name, "bar")
    assert_is(obj3, obj4)
예제 #3
0
def picard_command(config, command):
    """Returns basic AtomicJavaCmdBuilder for Picard tools commands."""
    jar_path = os.path.join(config.jar_root, _PICARD_JAR)

    if jar_path not in _PICARD_VERSION_CACHE:
        params = AtomicJavaCmdBuilder(jar_path,
                                      temp_root=config.temp_root,
                                      jre_options=config.jre_options)

        # Arbitrary command, since just '--version' does not work
        params.set_option("MarkDuplicates")
        params.set_option("--version")

        requirement = versions.Requirement(
            call=params.finalized_call,
            name="Picard tools",
            search=r"\b(\d+)\.(\d+)\.\d+",
            checks=versions.GE(1, 137),
        )
        _PICARD_VERSION_CACHE[jar_path] = requirement

    version = _PICARD_VERSION_CACHE[jar_path]
    params = AtomicJavaCmdBuilder(
        jar_path,
        temp_root=config.temp_root,
        jre_options=config.jre_options,
        CHECK_JAR=version,
        set_cwd=True,
    )
    params.set_option(command)

    return params
예제 #4
0
def requirement(module, checks=versions.Any(), cache={}):
    key = (module, checks)
    result = cache.get(key)
    if result is None:
        filename = rscript("common", "requires.r")
        result = versions.Requirement(
            call=("Rscript", filename, module),
            search="d0fd3ea6: (\d+)\.(\d+)(?:\.(\d+))?",
            checks=checks,
            name="R module: {}".format(module))

        cache[(module, checks)] = result

    return result
예제 #5
0
파일: gatk.py 프로젝트: jelber2/paleomix
def _get_gatk_version_check(config):
    """Returns a version-check object for the "GenomeAnalysisTK.jar" located at
    config.jar_root; for now, this check only serves to verify that the JAR can
    be executed, which may not be the case if the JRE is outdated.
    """
    jar_file = os.path.join(config.jar_root, "GenomeAnalysisTK.jar")
    if jar_file not in _GATK_VERSION:
        params = AtomicJavaCmdBuilder(jar_file,
                                      temp_root=config.temp_root,
                                      jre_options=config.jre_options)
        params.add_value("--version")

        # Any version is fine; for now just catch old JREs
        requirement = versions.Requirement(call=params.finalized_call,
                                           name="GenomeAnalysisTK",
                                           search=r"^(\d+)\.(\d+)",
                                           checks=versions.Any())
        _GATK_VERSION[jar_file] = requirement
    return _GATK_VERSION[jar_file]
예제 #6
0
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
from paleomix.node import CommandNode, NodeError
from paleomix.atomiccmd.builder import (
    AtomicCmdBuilder,
    apply_options,
)
from paleomix.common.fileutils import reroot_path
from paleomix.common.formats.msa import MSA, MSAError
import paleomix.common.versions as versions

MAFFT_VERSION = versions.Requirement(call=("mafft", "--version"),
                                     search=r"v(\d+)\.(\d+)",
                                     checks=versions.GE(7, 0))

# Presets mainly taken from
# http://mafft.cbrc.jp/alignment/software/algorithms/algorithms.html
_PRESETS = {
    "mafft": ["mafft"],
    "auto": ["mafft", "--auto"],
    "fft-ns-1": ["mafft-fftns", "--retree", 1],
    "fft-ns-2": ["mafft-fftns"],
    "fft-ns-i": ["mafft-fftnsi"],
    "nw-ns-i": ["mafft-nwnsi"],
    "l-ins-i": ["mafft-linsi"],
    "e-ins-i": ["mafft-einsi"],
    "g-ins-i": ["mafft-ginsi"],
}
예제 #7
0
# SOFTWARE.
#
import os

from paleomix.node import CommandNode
from paleomix.atomiccmd.builder import (
    AtomicCmdBuilder,
    apply_options,
)

import paleomix.common.fileutils as fileutils
import paleomix.common.versions as versions

_VERSION_CHECK = versions.Requirement(
    call=("AdapterRemoval", "--version"),
    search=r"ver. (\d+)\.(\d+)\.(\d+)",
    checks=versions.GE(2, 1, 5),
)


class SE_AdapterRemovalNode(CommandNode):
    def __init__(self,
                 input_file,
                 output_prefix,
                 threads=1,
                 options={},
                 dependencies=()):
        # See below for parameters in common between SE/PE
        cmd = _get_common_parameters(threads=threads, options=options)

        # Prefix for output files, ensure that all end up in temp folder
예제 #8
0
    describe_files
from paleomix.common.utilities import \
    safe_coerce_to_tuple

from paleomix.node import \
    NodeError, \
    CommandNode
from paleomix.nodes.picard import \
    MultiBAMInputNode
from paleomix.atomiccmd.builder import \
    AtomicCmdBuilder, \
    use_customizable_cli_parameters, \
    create_customizable_cli_parameters

MAPDAMAGE_VERSION = versions.Requirement(call=("mapDamage", "--version"),
                                         search=r"(\d+)\.(\d+).(\d+)",
                                         checks=versions.GE(2, 0, 1))

RSCRIPT_VERSION = versions.Requirement(call=("Rscript", "--version"),
                                       search=r"(\d+)\.(\d+).(\d+)",
                                       checks=versions.GE(2, 15, 1),
                                       priority=10)


class MapDamagePlotNode(MultiBAMInputNode):
    @create_customizable_cli_parameters
    def customize(self,
                  config,
                  reference,
                  input_files,
                  output_directory,
예제 #9
0
    AtomicCmdBuilder, \
    use_customizable_cli_parameters, \
    create_customizable_cli_parameters
from paleomix.atomiccmd.sets import \
    ParallelCmds
from paleomix.nodes.bwa import \
    _get_node_description, \
    _process_output, \
    _get_max_threads
from paleomix.common.utilities import \
    safe_coerce_to_tuple

import paleomix.common.versions as versions

BOWTIE2_VERSION = versions.Requirement(call=("bowtie2", "--version"),
                                       search=r"version (\d+)\.(\d+)\.(\d+)",
                                       checks=versions.GE(2, 1, 0))


class Bowtie2IndexNode(CommandNode):
    def __init__(self, input_file, prefix=None, dependencies=()):
        prefix = prefix if prefix else input_file
        builder = _bowtie2_template(("bowtie2-build"),
                                    prefix,
                                    iotype="OUT",
                                    IN_FILE=input_file,
                                    TEMP_OUT_PREFIX=os.path.basename(prefix),
                                    CHECK_VERSION=BOWTIE2_VERSION)

        builder.add_value("%(IN_FILE)s")
        # Destination prefix, in temp folder
예제 #10
0
파일: common.py 프로젝트: tmancill/paleomix
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import collections

import paleomix.yaml

import paleomix.common.versions as versions

# Format number for database file; is incremented when the format is changed.
# The 'revision' field specifies updates to the table that do not change the
# format of the database (see below).
_SUPPORTED_DB_FORMAT = 1

RSCRIPT_VERSION = versions.Requirement(
    call=("Rscript", "--version"),
    search=r"version (\d+)\.(\d+)\.(\d+)",
    checks=versions.GE(3, 0, 0),
    priority=10,
)


class DBFileError(RuntimeError):
    pass


def get_sample_names(handle):
    samples = []
    for readgroup in handle.header.get("RG", ()):
        if "SM" in readgroup:
            samples.append(readgroup["SM"])
    return frozenset(samples)
예제 #11
0
# SOFTWARE.
#
import os
import re
import random

import paleomix.common.fileutils as fileutils
import paleomix.common.versions as versions

from paleomix.node import CommandNode
from paleomix.atomiccmd.builder import AtomicCmdBuilder


RAXML_VERSION = versions.Requirement(
    call=("raxmlHPC", "-version"),
    search=r"version (\d+)\.(\d+)\.(\d+)",
    checks=versions.GE(7, 3, 2),
)
RAXML_PTHREADS_VERSION = versions.Requirement(
    call=("raxmlHPC-PTHREADS", "-version"),
    search=r"version (\d+)\.(\d+)\.(\d+)",
    checks=versions.GE(7, 3, 2),
)


class RAxMLRapidBSNode(CommandNode):
    def __init__(
        self,
        input_alignment,
        output_template,
        input_partition=None,
예제 #12
0
    AtomicCmd
from paleomix.node import \
    CommandNode, \
    Node, \
    NodeError

from paleomix.common.bedtools import \
    read_bed_file
from paleomix.common.fileutils import \
    move_file, \
    reroot_path


BEDTOOLS_VERSION \
    = versions.Requirement(call=("bedtools", "--version"),
                           search=r"bedtools v?(\d+)\.(\d+)\.(\d+)",
                           checks=versions.GE(2, 15, 0))


class SlopBedNode(CommandNode):
    def __init__(self,
                 infile,
                 outfile,
                 genome,
                 from_start=0,
                 from_end=0,
                 strand_relative=False,
                 dependencies=()):
        if type(from_start) != type(from_end):
            raise ValueError("Parameters 'from_start' and 'from_end' should "
                             "be of same type!")
예제 #13
0
def test_requirement__new_obj_if_call_differ():
    obj1 = versions.Requirement("echo", "", versions.LT(1))
    obj2 = versions.Requirement("true", "", versions.LT(1))
    assert_is_not(obj1, obj2)
예제 #14
0
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
import os

from paleomix.node import CommandNode
from paleomix.atomiccmd.builder import AtomicCmdBuilder
from paleomix.atomiccmd.command import AtomicCmd

from paleomix.common.fileutils import reroot_path
import paleomix.common.versions as versions

_VERSION_REGEX = r"Version: (\d+)\.(\d+)(?:\.(\d+))?"

SAMTOOLS_VERSION = versions.Requirement(call=("samtools", ),
                                        search=_VERSION_REGEX,
                                        checks=versions.GE(1, 3, 0))

BCFTOOLS_VERSION = versions.Requirement(call=("bcftools", ),
                                        search=_VERSION_REGEX,
                                        checks=versions.GE(1, 3, 0))

TABIX_VERSION = versions.Requirement(call=("tabix", ),
                                     search=_VERSION_REGEX,
                                     checks=versions.GE(1, 3, 0))


class TabixIndexNode(CommandNode):
    """Tabix indexes a BGZip compressed VCF or pileup file.

    The class currently supports the following presets:
예제 #15
0
import paleomix.common.versions as versions
import paleomix.tools.factory as factory

from paleomix.atomiccmd.builder import (
    AtomicCmdBuilder,
    apply_options,
)
from paleomix.atomiccmd.command import AtomicCmd
from paleomix.atomiccmd.sets import ParallelCmds
from paleomix.common.fileutils import describe_paired_files
from paleomix.node import CommandNode, NodeError
from paleomix.nodes.samtools import SAMTOOLS_VERSION

BWA_VERSION = versions.Requirement(call=("bwa", ),
                                   search=r"Version: (\d+)\.(\d+)\.(\d+)",
                                   checks=versions.GE(0, 7, 9))


class BWAIndexNode(CommandNode):
    def __init__(self, input_file, prefix=None, dependencies=()):
        prefix = prefix if prefix else input_file
        builder = _new_bwa_command(
            ("bwa", "index", "%(IN_FILE)s", "-p", "%(TEMP_OUT_PREFIX)s"),
            prefix,
            iotype="OUT",
            IN_FILE=input_file,
            TEMP_OUT_PREFIX=os.path.basename(prefix),
        )

        description = "<BWA Index '%s' -> '%s.*'>" % (input_file, prefix)
예제 #16
0
def test_requirement_highest_priority_retained():
    obj1 = versions.Requirement("echo", "", versions.LT(1), priority=5)
    assert obj1.priority == 5
    obj2 = versions.Requirement("echo", "", versions.LT(1), priority=0)
    assert obj1 is obj2
    assert obj2.priority == 5
예제 #17
0
def test_requirement_highest_priority_retained():
    obj1 = versions.Requirement("echo", "", versions.LT(1), priority=5)
    assert_equal(obj1.priority, 5)
    obj2 = versions.Requirement("echo", "", versions.LT(1), priority=0)
    assert_is(obj1, obj2)
    assert_equal(obj2.priority, 5)
예제 #18
0
def test_requirement__new_obj_if_checks_differ():
    obj1 = versions.Requirement("echo", "", versions.GE(1))
    obj2 = versions.Requirement("echo", "", versions.LT(1))
    assert obj1 is not obj2
예제 #19
0
def test_requirement__new_obj_if_search_differ():
    obj1 = versions.Requirement("echo", r"(\d+)", versions.LT(1))
    obj2 = versions.Requirement("echo", "", versions.LT(1))
    assert obj1 is not obj2
예제 #20
0
def test_requirement__obj_is_cached_for_same_values():
    obj1 = versions.Requirement("echo", "", versions.LT(1))
    obj2 = versions.Requirement("echo", "", versions.LT(1))
    assert obj1 is obj2
예제 #21
0
파일: examl.py 프로젝트: jelber2/paleomix
import paleomix.common.fileutils as fileutils
import paleomix.common.versions as versions

from paleomix.node import CommandNode
from paleomix.atomiccmd.builder import \
    AtomicCmdBuilder, \
    AtomicMPICmdBuilder, \
    use_customizable_cli_parameters, \
    create_customizable_cli_parameters

from paleomix.nodegraph import \
    FileStatusCache

EXAML_VERSION = versions.Requirement(call=("examl", "-version"),
                                     search=r"version (\d+)\.(\d+)\.(\d+)",
                                     checks=versions.GE(3, 0, 0))

PARSER_VERSION = versions.Requirement(call=("parse-examl", "-h"),
                                      search=r"version (\d+)\.(\d+)\.(\d+)",
                                      checks=versions.GE(3, 0, 0))


class ExaMLParserNode(CommandNode):
    @create_customizable_cli_parameters
    def customize(cls,
                  input_alignment,
                  input_partition,
                  output_file,
                  dependencies=()):
        """
예제 #22
0
파일: bwa.py 프로젝트: jelber2/paleomix
    use_customizable_cli_parameters, \
    create_customizable_cli_parameters

from paleomix.atomiccmd.sets import ParallelCmds
from paleomix.nodes.samtools import SAMTOOLS_VERSION
from paleomix.common.fileutils import \
    describe_paired_files, \
    missing_files

import paleomix.common.versions as versions
import paleomix.tools.factory as factory


BWA_VERSION = versions.Requirement(call=("bwa",),
                                   search=r"Version: (\d+)\.(\d+)\.(\d+)",
                                   checks=versions.Or(versions.EQ(0, 5, 9),
                                                      versions.EQ(0, 5, 10),
                                                      versions.EQ(0, 6, 2),
                                                      versions.GE(0, 7, 9)))

BWA_VERSION_07x = versions.Requirement(call=("bwa",),
                                       search=r"Version: (\d+)\.(\d+)\.(\d+)",
                                       checks=versions.GE(0, 7, 9))


class BWAIndexNode(CommandNode):
    def __init__(self, input_file, prefix=None, dependencies=()):
        prefix = prefix if prefix else input_file
        builder = _get_bwa_template(("bwa", "index"), prefix, iotype="OUT",
                                    IN_FILE=input_file,
                                    TEMP_OUT_PREFIX=os.path.basename(prefix),
                                    CHECK_BWA=BWA_VERSION)
예제 #23
0
import paleomix.common.rtools as rtools
import paleomix.common.versions as versions
import paleomix.tools.factory as factory

from paleomix.atomiccmd.builder import AtomicCmdBuilder
from paleomix.atomiccmd.command import AtomicCmd
from paleomix.atomiccmd.sets import SequentialCmds
from paleomix.node import CommandNode, Node, NodeError

from paleomix.tools.zonkey.common import \
    RSCRIPT_VERSION, \
    contig_name_to_plink_name, \
    read_summary

ADMIXTURE_VERSION = versions.Requirement(call=("admixture", "--version"),
                                         search="(\d+)\.(\d+)",
                                         checks=versions.GE(1, 3))

PLINK_VERSION = versions.Requirement(call=("plink", "--noweb", "--help",
                                           "--out", "/tmp/plink"),
                                     search="v(\d+)\.(\d+)",
                                     checks=versions.GE(1, 7))

SMARTPCA_VERSION = versions.Requirement(call=("smartpca", ),
                                        search="version: (\d+)",
                                        checks=versions.GE(13050))

TREEMIX_VERSION = versions.Requirement(call=("treemix", ),
                                       search="TreeMix v. (\d+)\.(\d+)",
                                       checks=versions.GE(1, 12))
예제 #24
0
import os

from paleomix.node import CommandNode
from paleomix.atomiccmd.command import AtomicCmd
from paleomix.atomiccmd.sets import SequentialCmds

from paleomix.common.fileutils import reroot_path, swap_ext
import paleomix.common.versions as versions

_VERSION_REGEX = r"Version: (\d+)\.(\d+)(?:\.(\d+))?"

# v0.2.0 was the pre-release version of v1.0, and lacks required features
_COMMON_CHECK = versions.Or(versions.EQ(0, 1, 19), versions.GE(1, 0, 0))

SAMTOOLS_VERSION = versions.Requirement(call=("samtools", ),
                                        search=_VERSION_REGEX,
                                        checks=_COMMON_CHECK)

SAMTOOLS_VERSION_1x = versions.Requirement(call=("samtools", ),
                                           search=_VERSION_REGEX,
                                           checks=versions.GE(1, 0, 0))

SAMTOOLS_VERSION_0119 = versions.Requirement(call=("samtools", ),
                                             search=_VERSION_REGEX,
                                             checks=versions.EQ(0, 1, 19))

BCFTOOLS_VERSION_0119 \
    = versions.Requirement(call=("bcftools",),
                           search=_VERSION_REGEX,
                           checks=versions.EQ(0, 1, 19))