<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run_somaticsniper(job, tumor_bam, normal_bam, univ_options, somaticsniper_options, split=True):
 """ Run the SomaticSniper subgraph on the DNA bams. Optionally split the results into per-chromosome vcfs. :param dict tumor_bam: Dict of bam and bai for tumor DNA-Seq :param dict normal_bam: Dict of bam and bai for normal DNA-Seq :param dict univ_options: Dict of universal options used by almost all tools :param dict somaticsniper_options: Options specific to SomaticSniper :param bool split: Should the results be split into perchrom vcfs? :return: Either the fsID to the genome-level vcf or a dict of results from running SomaticSniper on every chromosome perchrom_somaticsniper: |- 'chr1': fsID |- 'chr2' fsID | | +- 'chrM': fsID :rtype: toil.fileStore.FileID|dict """

    # Get a list of chromosomes to handle
    if somaticsniper_options['chromosomes']:
        chromosomes = somaticsniper_options['chromosomes']
    else:
        chromosomes = sample_chromosomes(job, somaticsniper_options['genome_fai'])
    perchrom_somaticsniper = defaultdict()
    snipe = job.wrapJobFn(run_somaticsniper_full, tumor_bam, normal_bam, univ_options,
                          somaticsniper_options,
                          disk=PromisedRequirement(sniper_disk,
                                                   tumor_bam['tumor_dna_fix_pg_sorted.bam'],
                                                   normal_bam['normal_dna_fix_pg_sorted.bam'],
                                                   somaticsniper_options['genome_fasta']),
                          memory='6G')
    pileup = job.wrapJobFn(run_pileup, tumor_bam, univ_options, somaticsniper_options,
                           disk=PromisedRequirement(pileup_disk,
                                                    tumor_bam['tumor_dna_fix_pg_sorted.bam'],
                                                    somaticsniper_options['genome_fasta']),
                           memory='6G')
    filtersnipes = job.wrapJobFn(filter_somaticsniper, tumor_bam, snipe.rv(), pileup.rv(),
                                 univ_options, somaticsniper_options,
                                 disk=PromisedRequirement(sniper_filter_disk,
                                                          tumor_bam['tumor_dna_fix_pg_sorted.bam'],
                                                          somaticsniper_options['genome_fasta']),
                                 memory='6G')

    job.addChild(snipe)
    job.addChild(pileup)
    snipe.addChild(filtersnipes)
    pileup.addChild(filtersnipes)
    if split:
        unmerge_snipes = job.wrapJobFn(unmerge, filtersnipes.rv(), 'somaticsniper', chromosomes,
                                       somaticsniper_options, univ_options)
        filtersnipes.addChild(unmerge_snipes)
        return unmerge_snipes.rv()
    else:
        return filtersnipes.rv()