예제 #1
0
def _run_cleanup_pipeline(args):
    bam_cleanup = _build_wrapper_command(args)
    procs = {}
    try:
        # Update 'procs' and get the last process in the pipeline
        if args.paired_ended:
            last_proc = _setup_paired_ended_pipeline(procs, bam_cleanup)
        else:
            last_proc = _setup_single_ended_pipeline(procs, bam_cleanup)

        # Sort, output to stdout (-o)
        call_sort = ['samtools', 'sort', "-o", "-", args.temp_prefix]
        procs["sort"] = processes.open_proc(call_sort,
                                            stdin=last_proc.stdout,
                                            stdout=processes.PIPE,
                                            close_fds=True)
        last_proc.stdout.close()

        # Update NM and MD tags; output BAM (-b) to stdout
        call_calmd = ['samtools', 'calmd', '-b', '-', args.fasta]
        procs["calmd"] = processes.open_proc(call_calmd,
                                             stdin=procs["sort"].stdout)
        procs["sort"].stdout.close()

        if any(processes.join_procs(procs.values())):
            return 1
        return 0
    except:
        for proc in procs.itervalues():
            proc.terminate()
        raise
예제 #2
0
파일: cleanup.py 프로젝트: CarlesV/paleomix
def _setup_paired_ended_pipeline(procs, bam_cleanup):
    # Convert input to (uncompressed) BAM
    procs["pipe"] = processes.open_proc(bam_cleanup + ["pipe"],
                                        stdin=sys.stdin,
                                        stdout=processes.PIPE,
                                        close_fds=True)
    sys.stdin.close()

    # Fix mate information for PE reads
    call_fixmate = ['samtools', 'fixmate', '-', '-']
    procs["fixmate"] = processes.open_proc(call_fixmate,
                                           stdin=procs["pipe"].stdout,
                                           stdout=processes.PIPE,
                                           close_fds=True)
    procs["pipe"].stdout.close()

    # Cleanup / filter reads. Must be done after 'fixmate', as BWA may produce
    # hits where the mate-unmapped flag is incorrect, which 'fixmate' fixes.
    procs["cleanup"] = processes.open_proc(bam_cleanup + ['cleanup'],
                                           stdin=procs["fixmate"].stdout,
                                           stdout=processes.PIPE,
                                           close_fds=True)
    procs["fixmate"].stdout.close()

    return procs["cleanup"]
예제 #3
0
def _setup_paired_ended_pipeline(procs, bam_cleanup):
    # Convert input to (uncompressed) BAM
    procs["pipe"] = processes.open_proc(bam_cleanup + ["pipe"],
                                        stdin=sys.stdin,
                                        stdout=processes.PIPE,
                                        close_fds=True)
    sys.stdin.close()

    # Fix mate information for PE reads
    call_fixmate = ['samtools', 'fixmate', '-', '-']
    procs["fixmate"] = processes.open_proc(call_fixmate,
                                           stdin=procs["pipe"].stdout,
                                           stdout=processes.PIPE,
                                           close_fds=True)
    procs["pipe"].stdout.close()

    # Cleanup / filter reads. Must be done after 'fixmate', as BWA may produce
    # hits where the mate-unmapped flag is incorrect, which 'fixmate' fixes.
    procs["cleanup"] = processes.open_proc(bam_cleanup + ['cleanup'],
                                           stdin=procs["fixmate"].stdout,
                                           stdout=processes.PIPE,
                                           close_fds=True)
    procs["fixmate"].stdout.close()

    return procs["cleanup"]
예제 #4
0
파일: cleanup.py 프로젝트: CarlesV/paleomix
def _run_cleanup_pipeline(args):
    bam_cleanup = _build_wrapper_command(args)
    procs = {}
    try:
        # Update 'procs' and get the last process in the pipeline
        if args.paired_ended:
            last_proc = _setup_paired_ended_pipeline(procs, bam_cleanup)
        else:
            last_proc = _setup_single_ended_pipeline(procs, bam_cleanup)

        # Sort, output to stdout (-o)
        call_sort = ['samtools', 'sort', "-o", "-", args.temp_prefix]
        procs["sort"] = processes.open_proc(call_sort,
                                            stdin=last_proc.stdout,
                                            stdout=processes.PIPE,
                                            close_fds=True)
        last_proc.stdout.close()

        # Update NM and MD tags; output BAM (-b) to stdout
        call_calmd = ['samtools', 'calmd', '-b', '-', args.fasta]
        procs["calmd"] = processes.open_proc(call_calmd,
                                             stdin=procs["sort"].stdout)
        procs["sort"].stdout.close()

        if any(processes.join_procs(procs.values())):
            return 1
        return 0
    except:
        for proc in procs.itervalues():
            proc.terminate()
        raise
예제 #5
0
    def _create_genotyping_proc(setup):
        mpileup_args = {"-u": None,
                        "-l": setup["files"]["bed"]}
        mpileup_call = build_call(call=("samtools", "mpileup"),
                                  args=mpileup_args,
                                  new_args=args.mpileup_argument,
                                  positional=("-",))

        sys.stderr.write("Running 'samtools mpileup': %s\n"
                         % (" ".join(mpileup_call)))

        procs = setup["procs"]
        procs["mpileup"] \
            = processes.open_proc(mpileup_call,
                                  stdin=procs["filter"].stdout,
                                  stdout=processes.PIPE,
                                  close_fds=True)

        bcftools_call = build_call(call=("bcftools", "view"),
                                   args={},
                                   new_args=args.bcftools_argument,
                                   positional=("-",))

        sys.stderr.write("Running 'bcftools call': %s\n"
                         % (" ".join(bcftools_call)))

        procs["bcftools"] \
            = processes.open_proc(bcftools_call,
                                  stdin=procs["mpileup"].stdout,
                                  stdout=processes.PIPE,
                                  close_fds=True)

        return procs["bcftools"].stdout
예제 #6
0
def setup_basic_batch(args, regions, prefix, func):
    setup = {"files": {},
             "temp_files": {},
             "procs": {},
             "handles": {}}

    try:
        setup["files"]["bed"] = write_bed_file(prefix, regions)
        setup["temp_files"]["bed"] = setup["files"]["bed"]

        filter_builder = factory.new("genotype")
        filter_builder.set_option("--filter-only")
        filter_builder.set_option("--bedfile", setup["files"]["bed"])
        filter_builder.add_option(args.bamfile)
        filter_builder.add_option(args.destination)

        setup["procs"]["filter"] \
            = processes.open_proc(filter_builder.call,
                                  stdout=processes.PIPE,
                                  close_fds=True)

        setup["handles"]["outfile"] = open(prefix, "w")
        zip_proc = processes.open_proc(["bgzip"],
                                       stdin=func(setup),
                                       stdout=setup["handles"]["outfile"],
                                       close_fds=True)

        setup["procs"]["gzip"] = zip_proc

        return setup
    except:
        sys.stderr.write(traceback.format_exc() + "\n")
        cleanup_batch(setup)
        raise
예제 #7
0
def setup_basic_batch(args, regions, prefix, func):
    setup = {"files": {}, "temp_files": {}, "procs": {}, "handles": {}}

    try:
        setup["files"]["bed"] = write_bed_file(prefix, regions)
        setup["temp_files"]["bed"] = setup["files"]["bed"]

        filter_builder = factory.new("genotype")
        filter_builder.set_option("--filter-only")
        filter_builder.set_option("--bedfile", setup["files"]["bed"])
        filter_builder.add_option(args.bamfile)
        filter_builder.add_option(args.destination)

        setup["procs"]["filter"] = processes.open_proc(filter_builder.call, stdout=processes.PIPE, close_fds=True)

        setup["handles"]["outfile"] = open(prefix, "w")
        zip_proc = processes.open_proc(["bgzip"], stdin=func(setup), stdout=setup["handles"]["outfile"], close_fds=True)

        setup["procs"]["gzip"] = zip_proc

        return setup
    except:
        sys.stderr.write(traceback.format_exc() + "\n")
        cleanup_batch(setup)
        raise
예제 #8
0
def _setup_single_ended_pipeline(procs, bam_cleanup):
    # Convert input to BAM and cleanup / filter reads
    procs["pipe"] = processes.open_proc(bam_cleanup + ['cleanup-sam'],
                                        stdin=sys.stdin,
                                        stdout=processes.PIPE,
                                        close_fds=True)
    sys.stdin.close()

    return procs["pipe"]
예제 #9
0
파일: cleanup.py 프로젝트: CarlesV/paleomix
def _setup_single_ended_pipeline(procs, bam_cleanup):
    # Convert input to BAM and cleanup / filter reads
    procs["pipe"] = processes.open_proc(bam_cleanup + ['cleanup-sam'],
                                        stdin=sys.stdin,
                                        stdout=processes.PIPE,
                                        close_fds=True)
    sys.stdin.close()

    return procs["pipe"]
예제 #10
0
    def _create_mpileup_proc(setup):
        mpileup_args = {"-l": setup["files"]["bed"]}
        call = build_call(
            call=("samtools", "mpileup"), args=mpileup_args, new_args=args.mpileup_argument, positional=("-",)
        )

        sys.stderr.write("Running 'samtools mpileup': %s\n" % (" ".join(call)))
        procs = setup["procs"]
        procs["mpileup"] = processes.open_proc(
            call, stdin=procs["filter"].stdout, stdout=processes.PIPE, close_fds=True
        )

        return procs["mpileup"].stdout
예제 #11
0
    def _create_genotyping_proc(setup):
        mpileup_args = {"-u": None, "-l": setup["files"]["bed"]}
        mpileup_call = build_call(
            call=("samtools", "mpileup"), args=mpileup_args, new_args=args.mpileup_argument, positional=("-",)
        )

        sys.stderr.write("Running 'samtools mpileup': %s\n" % (" ".join(mpileup_call)))

        procs = setup["procs"]
        procs["mpileup"] = processes.open_proc(
            mpileup_call, stdin=procs["filter"].stdout, stdout=processes.PIPE, close_fds=True
        )

        bcftools_call = build_call(
            call=("bcftools", "view"), args={}, new_args=args.bcftools_argument, positional=("-",)
        )

        sys.stderr.write("Running 'bcftools call': %s\n" % (" ".join(bcftools_call)))

        procs["bcftools"] = processes.open_proc(
            bcftools_call, stdin=procs["mpileup"].stdout, stdout=processes.PIPE, close_fds=True
        )

        return procs["bcftools"].stdout
예제 #12
0
    def _create_mpileup_proc(setup):
        mpileup_args = {"-l": setup["files"]["bed"]}
        call = build_call(call=("samtools", "mpileup"),
                          args=mpileup_args,
                          new_args=args.mpileup_argument,
                          positional=("-",))

        sys.stderr.write("Running 'samtools mpileup': %s\n" % (" ".join(call)))
        procs = setup["procs"]
        procs["mpileup"] \
            = processes.open_proc(call,
                                  stdin=procs["filter"].stdout,
                                  stdout=processes.PIPE,
                                  close_fds=True)

        return procs["mpileup"].stdout