def mutect_caller(align_bams, items, ref_file, assoc_files, region=None,
                  out_file=None):
    """Run the MuTect paired analysis algorithm.
    """
    config = items[0]["config"]
    if out_file is None:
        out_file = "%s-paired-variants.vcf.gz" % os.path.splitext(align_bams[0])[0]
    if not file_exists(out_file):
        base_config = items[0]["config"]
        broad_runner = broad.runner_from_config(base_config, "mutect")
        out_file_mutect = (out_file.replace(".vcf", "-mutect.vcf")
                           if "vcf" in out_file else out_file + "-mutect.vcf")
        broad_runner, params = \
            _mutect_call_prep(align_bams, items, ref_file, assoc_files,
                                   region, out_file_mutect)
        if (not isinstance(region, (list, tuple)) and
              not all(has_aligned_reads(x, region) for x in align_bams)):
            paired = vcfutils.get_paired(items)
            vcfutils.write_empty_vcf(out_file, samples=[x for x in (paired.tumor_name, paired.normal_name) if x])
            return
        out_file_orig = "%s-orig%s" % utils.splitext_plus(out_file_mutect)
        if not file_exists(out_file_orig):
            with file_transaction(config, out_file_orig) as tx_out_file:
                # Rationale: MuTect writes another table to stdout, which we don't need
                params += ["--vcf", tx_out_file, "-o", os.devnull]
                broad_runner.run_mutect(params)
        is_paired = "-I:normal" in params
        if not utils.file_uptodate(out_file_mutect, out_file_orig):
            out_file_mutect = _fix_mutect_output(out_file_orig, config, out_file_mutect, is_paired)
        indelcaller = vcfutils.get_indelcaller(base_config)
        if ("scalpel" in indelcaller.lower() and region and isinstance(region, (tuple, list))
              and chromhacks.is_autosomal_or_sex(region[0])):
            # Scalpel InDels
            out_file_indels = (out_file.replace(".vcf", "-somaticIndels.vcf")
                               if "vcf" in out_file else out_file + "-somaticIndels.vcf")
            if scalpel.is_installed(items[0]["config"]):
                if not is_paired:
                    vcfutils.check_paired_problems(items)
                    scalpel._run_scalpel_caller(align_bams, items, ref_file, assoc_files,
                                                region=region, out_file=out_file_indels)
                else:
                    scalpel._run_scalpel_paired(align_bams, items, ref_file, assoc_files,
                                                region=region, out_file=out_file_indels)
                out_file = vcfutils.combine_variant_files(orig_files=[out_file_mutect, out_file_indels],
                                                          out_file=out_file,
                                                          ref_file=items[0]["sam_ref"],
                                                          config=items[0]["config"],
                                                          region=region)
            else:
                utils.symlink_plus(out_file_mutect, out_file)
        elif "pindel" in indelcaller.lower():
            from bcbio.structural import pindel
            out_file_indels = (out_file.replace(".vcf", "-somaticIndels.vcf")
                               if "vcf" in out_file else out_file + "-somaticIndels.vcf")
            if pindel.is_installed(items[0]["config"]):
                pindel._run_tumor_pindel_caller(align_bams, items, ref_file, assoc_files, region=region,
                                          out_file=out_file_indels)
                out_file = vcfutils.combine_variant_files(orig_files=[out_file_mutect, out_file_indels],
                                                          out_file=out_file,
                                                          ref_file=ref_file,
                                                          config=items[0]["config"],
                                                          region=region)
            else:
                utils.symlink_plus(out_file_mutect, out_file)
        elif (("somaticindeldetector" in indelcaller.lower() or "sid" in indelcaller.lower())
              and "appistry" in broad_runner.get_mutect_version()):
            # SomaticIndelDetector InDels
            out_file_indels = (out_file.replace(".vcf", "-somaticIndels.vcf")
                               if "vcf" in out_file else out_file + "-somaticIndels.vcf")
            params_indels = _SID_call_prep(align_bams, items, ref_file, assoc_files,
                                           region, out_file_indels)
            with file_transaction(config, out_file_indels) as tx_out_file:
                params_indels += ["-o", tx_out_file]
                broad_runner.run_mutect(params_indels)
            out_file = vcfutils.combine_variant_files(orig_files=[out_file_mutect, out_file_indels],
                                                      out_file=out_file,
                                                      ref_file=items[0]["sam_ref"],
                                                      config=items[0]["config"],
                                                      region=region)
        else:
            utils.symlink_plus(out_file_mutect, out_file)
    return out_file
def mutect_caller ( align_bams , items , ref_file , assoc_files , region = None , out_file = None ) : config = items [ 0 ] [ "config" ] if out_file is None : out_file = "%s-paired-variants.vcf.gz" % os . path . splitext ( align_bams [ 0 ] ) [ 0 ] if not file_exists ( out_file ) : base_config = items [ 0 ] [ "config" ] broad_runner = broad . runner_from_config ( base_config , "mutect" ) out_file_mutect = ( out_file . replace ( ".vcf" , "-mutect.vcf" ) if "vcf" in out_file else out_file + "-mutect.vcf" ) broad_runner , params = _mutect_call_prep ( align_bams , items , ref_file , assoc_files , region , out_file_mutect ) if ( not isinstance ( region , ( list , tuple ) ) and not all ( has_aligned_reads ( x , region ) for x in align_bams ) ) : paired = vcfutils . get_paired ( items ) vcfutils . write_empty_vcf ( out_file , samples = [ x for x in ( paired . tumor_name , paired . normal_name ) if x ] ) return out_file_orig = "%s-orig%s" % utils . splitext_plus ( out_file_mutect ) if not file_exists ( out_file_orig ) : with file_transaction ( config , out_file_orig ) as tx_out_file : params += [ "--vcf" , tx_out_file , "-o" , os . devnull ] broad_runner . run_mutect ( params ) is_paired = "-I:normal" in params if not utils . file_uptodate ( out_file_mutect , out_file_orig ) : out_file_mutect = _fix_mutect_output ( out_file_orig , config , out_file_mutect , is_paired ) indelcaller = vcfutils . get_indelcaller ( base_config ) if ( "scalpel" in indelcaller . lower ( ) and region and isinstance ( region , ( tuple , list ) ) and chromhacks . is_autosomal_or_sex ( region [ 0 ] ) ) : out_file_indels = ( out_file . replace ( ".vcf" , "-somaticIndels.vcf" ) if "vcf" in out_file else out_file + "-somaticIndels.vcf" ) if scalpel . is_installed ( items [ 0 ] [ "config" ] ) : if not is_paired : vcfutils . check_paired_problems ( items ) scalpel . _run_scalpel_caller ( align_bams , items , ref_file , assoc_files , region = region , out_file = out_file_indels ) else : scalpel . _run_scalpel_paired ( align_bams , items , ref_file , assoc_files , region = region , out_file = out_file_indels ) out_file = vcfutils . combine_variant_files ( orig_files = [ out_file_mutect , out_file_indels ] , out_file = out_file , ref_file = items [ 0 ] [ "sam_ref" ] , config = items [ 0 ] [ "config" ] , region = region ) else : utils . symlink_plus ( out_file_mutect , out_file ) elif "pindel" in indelcaller . lower ( ) : from bcbio . structural import pindel out_file_indels = ( out_file . replace ( ".vcf" , "-somaticIndels.vcf" ) if "vcf" in out_file else out_file + "-somaticIndels.vcf" ) if pindel . is_installed ( items [ 0 ] [ "config" ] ) : pindel . _run_tumor_pindel_caller ( align_bams , items , ref_file , assoc_files , region = region , out_file = out_file_indels ) out_file = vcfutils . combine_variant_files ( orig_files = [ out_file_mutect , out_file_indels ] , out_file = out_file , ref_file = ref_file , config = items [ 0 ] [ "config" ] , region = region ) else : utils . symlink_plus ( out_file_mutect , out_file ) elif ( ( "somaticindeldetector" in indelcaller . lower ( ) or "sid" in indelcaller . lower ( ) ) and "appistry" in broad_runner . get_mutect_version ( ) ) : out_file_indels = ( out_file . replace ( ".vcf" , "-somaticIndels.vcf" ) if "vcf" in out_file else out_file + "-somaticIndels.vcf" ) params_indels = _SID_call_prep ( align_bams , items , ref_file , assoc_files , region , out_file_indels ) with file_transaction ( config , out_file_indels ) as tx_out_file : params_indels += [ "-o" , tx_out_file ] broad_runner . run_mutect ( params_indels ) out_file = vcfutils . combine_variant_files ( orig_files = [ out_file_mutect , out_file_indels ] , out_file = out_file , ref_file = items [ 0 ] [ "sam_ref" ] , config = items [ 0 ] [ "config" ] , region = region ) else : utils . symlink_plus ( out_file_mutect , out_file ) return out_file
Run the MuTect paired analysis algorithm.