# Need samtools and bowtie2 in path to work.
# Execute with command: snakemake -s bowtie2 ../intermediate_data/[run_name].bam

import re
configfile: "config.json"

def mapping_bowtie2_command():
    if len(config["reads"])==2:
        return " -1 "+config["reads"][0]+" -2 "+config["reads"][1]+" "
    elif len(config["reads"])==1:
        return " -U "+config["reads"][0]+" "
    else:
        raise(Exception("Reads should be paired or single ended."))

# path to index file without extension (removed .fa or .fasta)
folder = "intermediate_data/"
index_basename=folder+"index/"+config["reference_name"]
sample=config["name"]+"_on_ref_"+config["reference_name"]

def get_reference(wildcards):
    if config["reference_path"]:
        return config["reference_path"]
    else:
        return rules.trinity.output

rule bowtie2_index:
    input:
        get_reference
    output:
        expand(index_basename+".{index}.bt2", index=range(1,5)),
        expand(index_basename+".rev.{index}.bt2", index=range(1,3))
    log:
        "logs/bowtie2_index_"+config["reference_name"]+".log"
    threads:
        config["threads"]
    run:
        
        try:
            shell("bowtie2-build 2>&1 | grep 'threads'")
            shell("bowtie2-build --threads {threads} {input} "+index_basename+" | tee {log}")
        except:
            shell("bowtie2-build {input} "+index_basename+" | tee {log}")

rule bowtie2_map:
    input:
        # Indexed files
        expand(index_basename+".{index}.bt2", index=range(1,5)),
        expand(index_basename+".rev.{index}.bt2", index=range(1,3)),
        # Read files
        rules.subsample_fastq.output
    output:
        folder+sample+"_mapped.bam"
    threads:
        config["threads"]
    log:
        "logs/bowtie2_map_"+sample+".log"
    run:

        shell("bowtie2 \
        -x {index_basename} \
        "+mapping_bowtie2_command()+"\
        --threads {threads} \
        2> >(tee {log} >&2) \
        | samtools view -bS - > {output}")
