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
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"]
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
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
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
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"]
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
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
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