if config["genome"] == "":
    pass
else:
    rule RefGenome_AlignReads:
        """
        Align reads to the Reference Genome (BWA).
        """
        input:
            reference="%s" % (config["genome"]),
            refFiles="%s" % (config["genome-bwa-index"]),
            R1="%s/FASTQ/TRIMMED/{samples}.R1.fq.gz" % (config["project-folder"]),
            R2="%s/FASTQ/TRIMMED/{samples}.R2.fq.gz" % (config["project-folder"]),
        output:
            temp("%s/FASTQ/TRIMMED/alignments_reference/{samples}.sam" % (config["project-folder"]))
        log:
            "%s/logs/BWA/RefGenome_AlignReads.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/RefGenome_AlignReads.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        conda:"envs/gbs.yaml"
        singularity: config["singularity"]["gbs"]
        shell:"""
            df -h &> {log}
            bwa mem -t {threads} -M {input.reference} {input.R1} {input.R2} > {output} 2> {log}
      	"""

if config["genome"] == "":
    pass
else:
    rule RefGenome_SamToSortedBam:
        """
        Sam to sorted bam for reference genome bam (SAMTOOLS)
        """
        input:
            "%s/FASTQ/TRIMMED/alignments_reference/{samples}.sam" % (config["project-folder"])
        output:
            bam=temp("%s/FASTQ/TRIMMED/alignments_reference/{samples}.bam" % (config["project-folder"])),
            sorted="%s/FASTQ/TRIMMED/alignments_reference/{samples}.sorted.bam" % (config["project-folder"]),
            pp=temp("%s/FASTQ/TRIMMED/alignments_reference/{samples}.sorted.pp.bam" % (config["project-folder"])),
            numberPairs=temp("%s/FASTQ/TRIMMED/alignments_reference/{samples}.name_sorted.bam.wcl" % (config["project-folder"])),
            namesorted=temp("%s/FASTQ/TRIMMED/alignments_reference/{samples}.name_sorted.bam" % (config["project-folder"]))
        log:
            "%s/logs/Samtools/RefGenome_SamToSortedBam.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/RefGenome_SamToSortedBam.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        params:
            q=config["params"]["step5d"]["q"],
            f=config["params"]["step5d"]["f"],
            F=config["params"]["step5d"]["F"]
        conda:"envs/samtools.yaml"
        singularity: config["singularity"]["gbs"]
        shell:"""
            df -h &> {log}
            echo "Number of threads used:" {threads}
            samtools view -b -q {params.q} -f {params.f} -F {params.F} {input} > {output.bam}
            samtools sort {output.bam} -o {output.sorted}
            samtools index -c {output.sorted}
            
            samtools view -bf 0x2 {output.sorted} > {output.pp}
            samtools sort -n {output.pp} -o {output.namesorted}
            
            samtools view {output.namesorted} | wc -l > {output.numberPairs}

      	"""

if config["genome"] == "":
    pass
else:
    rule RefGenome_GetAlignmentFlanking:
        """
        Get Flanking sites from individual alignments.
        """
        input:
            bam="%s/FASTQ/TRIMMED/alignments_reference/{samples}.name_sorted.bam" % (config["project-folder"]),
            numberPairs="%s/FASTQ/TRIMMED/alignments_reference/{samples}.name_sorted.bam.wcl" % (config["project-folder"])
        output:
            pa="%s/FASTQ/TRIMMED/alignments_reference/{samples}.paired_alignments" % (config["project-folder"]),
            left="%s/FASTQ/TRIMMED/alignments_reference/{samples}.flanking_left" % (config["project-folder"]),
            right="%s/FASTQ/TRIMMED/alignments_reference/{samples}.flanking_right" % (config["project-folder"])
        log:
            "%s/logs/RefGenome_GetAlignmentFlanking.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/RefGenome_GetAlignmentFlanking.{samples}.tsv" % (config["project-folder"])
        params:
            pipefolder=config["pipeline-folder"]
        singularity: config["singularity"]["gbs"]
        shell:"""
        
            lines=$(cut -f1 {input.numberPairs})
            
            if [ "$lines" -eq "0" ]; then
                touch {output.pa}
                touch {output.left}
                touch {output.right}
            else
                bedtools bamtobed -bedpe -i {input.bam} > {output.pa} 2> {log}
                {params.pipefolder}/scripts/getFlankingLeft.sh {output.pa} {output.left} 2>> {log}
                {params.pipefolder}/scripts/getFlankingRight.sh {output.pa} {output.right} 2>> {log}
            fi
       	"""

if config["genome"] == "":
    pass
else:
    rule RefGenome_SortedBamToMpileup:
        """
        Get Mpileup for Mock Reference Genome.
        """
        input:
            bam="%s/FASTQ/TRIMMED/alignments_reference/{samples}.sorted.bam" % (config["project-folder"]),
            reference="%s" % (config["genome"])
        output:
            "%s/MPILEUP/mpileup_reference/{samples}.mpileup" % (config["project-folder"])
        log:
            "%s/logs/Samtools/RefGenome_SortedBamToMpileup.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/RefGenome_SortedBamToMpileup.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        params:
            Q=config["params"]["step5d"]["Q"],
            q=config["params"]["step5d"]["q"]
        conda:"envs/samtools.yaml"
        singularity: config["singularity"]["gbs"]
        shell:"""
            df -h &> {log}
            echo "Number of threads used:" {threads}
            samtools mpileup -Q {params.Q} -q {params.q} -B -C 50 -f {input.reference} {input.bam} > {output}
      	"""

if config["genome"] == "":
    pass
else:
    rule RefGenome_AlignmentStats:
        """
        Get the mapping stats for the reference.
        """
        input:
            sam="%s/FASTQ/TRIMMED/alignments_reference/{samples}.sam" % (config["project-folder"]),
            sbam="%s/FASTQ/TRIMMED/alignments_reference/{samples}.sorted.bam" % (config["project-folder"])
        output:
            fs="%s/FASTQ/TRIMMED/alignments_reference/{samples}.sam.flagstat" % (config["project-folder"]),
            c="%s/FASTQ/TRIMMED/alignments_reference/{samples}.coverage" % (config["project-folder"])
        log:
            "%s/logs/Samtools/RefGenome_AlignmentStats.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/RefGenome_AlignmentStats.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        conda:"envs/samtools.yaml"
        singularity: config["singularity"]["gbs"]
        shell:"""
            df -h &> {log}
            echo "Number of threads used:" {threads}
            samtools flagstat {input.sam} > {output.fs}
            samtools idxstats {input.sbam} | awk '{{print $1\" \"$3}}' > {output.c}
      	"""

rule MockRef_AlignReads:
    """
    Align reads to the mock reference Genome.
    """
    input:
        reference="%s/FASTQ/TRIMMED/GSC.MR.Genome.fa" % (config["project-folder"]),
        refFiles="%s/FASTQ/TRIMMED/GSC.MR.Genome.fa.bwt" % (config["project-folder"]),
        R1="%s/FASTQ/TRIMMED/{samples}.R1.fq.gz" % (config["project-folder"]),
        R2="%s/FASTQ/TRIMMED/{samples}.R2.fq.gz" % (config["project-folder"]),
    output:
        temp("%s/FASTQ/TRIMMED/alignments/{samples}.sam" % (config["project-folder"]))
    log:
        "%s/logs/BWA/MockRef_AlignReads.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRef_AlignReads.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5b"]["threads"],
    conda:"envs/gbs.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        bwa mem -t {params.threads} -M {input.reference} {input.R1} {input.R2} > {output} 2> {log}
  	"""

rule MockRefClusters_AlignReads:
    """
    Index the Mock Reference Genome Clusters.
    """
    input:
        reference="%s/FASTQ/TRIMMED/GSC.MR.Clusters.fa" % (config["project-folder"]),
        refFiles="%s/FASTQ/TRIMMED/GSC.MR.Clusters.fa.bwt" % (config["project-folder"]),
        R1="%s/FASTQ/TRIMMED/{samples}.R1.fq.gz" % (config["project-folder"]),
        R2="%s/FASTQ/TRIMMED/{samples}.R2.fq.gz" % (config["project-folder"]),
    output:
        temp("%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sam" % (config["project-folder"]))
    log:
        "%s/logs/BWA/MockRefClusters_AlignReads.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRefClusters_AlignReads.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5c"]["threads"],
    conda:"envs/gbs.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        bwa mem -t {params.threads} -M {input.reference} {input.R1} {input.R2} > {output} 2> {log}
  	"""
  	
rule MockRef_SamToSortedBam:
    """
    Sam to sorted bam for mock reference (SAMTOOLS)
    """
    input:
        "%s/FASTQ/TRIMMED/alignments/{samples}.sam" % (config["project-folder"])
    output:
        bam=temp("%s/FASTQ/TRIMMED/alignments/{samples}.bam" % (config["project-folder"])),
        sorted="%s/FASTQ/TRIMMED/alignments/{samples}.sorted.bam" % (config["project-folder"])
    log:
        "%s/logs/Samtools/MockRef_SamToSortedBam.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRef_SamToSortedBam.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5d"]["threads"],
        q=config["params"]["step5d"]["q"],
        f=config["params"]["step5d"]["f"],
        F=config["params"]["step5d"]["F"]
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        echo "Available disc space" &> {log}
        df -h &>> {log}
        echo "Step 1:" &>> {log}
        echo "##################################################################" &>> {log}
        samtools view -b -q {params.q} -f {params.f} -F {params.F} {input} > {output.bam} 2>>{log}

        echo "Step 2:" &>> {log}
        echo "##################################################################" &>> {log}
        samtools sort {output.bam} -o {output.sorted} &>>{log}

        echo "Step 3:" &>> {log}
        echo "##################################################################" &>> {log}
        samtools index -c {output.sorted} &>>{log}
  	"""

rule MockRefClusters_SamToSortedBam:
    """
    Index the Mock Reference Clusters.
    """
    input:
        "%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sam" % (config["project-folder"])
    output:
        bam=temp("%s/FASTQ/TRIMMED/alignments_clusters/{samples}.bam" % (config["project-folder"])),
        sorted="%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sorted.bam" % (config["project-folder"])
    log:
        "%s/logs/Samtools/MockRefClusters_SamToSortedBam.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRefClusters_SamToSortedBam.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5e"]["threads"],
        q=config["params"]["step5e"]["q"],
        f=config["params"]["step5e"]["f"],
        F=config["params"]["step5e"]["F"]
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        samtools view -b -q {params.q} -f {params.f} -F {params.F} {input} > {output.bam}
        samtools sort {output.bam} -o {output.sorted}
        samtools index -c {output.sorted}
  	"""

rule MockRef_SortedBamToMpileup:
    """
    Get Mpileup for Mock Reference Genome.
    """
    input:
        bam="%s/FASTQ/TRIMMED/alignments/{samples}.sorted.bam" % (config["project-folder"]),
        reference="%s/FASTQ/TRIMMED/GSC.MR.Genome.fa" % (config["project-folder"])
    output:
        bam="%s/FASTQ/TRIMMED/{samples}.mpileup" % (config["project-folder"])
    log:
        "%s/logs/Samtoools/MockRef_SortedBamToMpileup.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRef_SortedBamToMpileup.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5d"]["threads"],
        Q=config["params"]["step5d"]["Q"],
        q=config["params"]["step5d"]["q"]
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        samtools mpileup -Q {params.Q} -q {params.q} -B -C 50 -f {input.reference} {input.bam} > {output}
  	"""


rule MockRef_AlignmentStats:
    """
    Alignment stats for reads mapped to mock ref
    """
    input:
        "%s/FASTQ/TRIMMED/alignments/{samples}.sam" % (config["project-folder"])
    output:
        "%s/FASTQ/TRIMMED/alignments/{samples}.sam.flagstat" % (config["project-folder"])
    log:
        "%s/logs/Samtools/MockRef_AlignmentStats.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRef_AlignmentStats.{samples}.tsv" % (config["project-folder"])
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        samtools flagstat {input} > {output}
  	"""

  	
rule MockRefClusters_AlignmentStats:
    """
    Alignment stats for mapping reads to mock reference clusters.
    """
    input:
        sam="%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sam" % (config["project-folder"]),
        sbam="%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sorted.bam" % (config["project-folder"])
    output:
        fs="%s/FASTQ/TRIMMED/alignments_clusters/{samples}.sam.flagstat" % (config["project-folder"]),
        c="%s/FASTQ/TRIMMED/alignments_clusters/{samples}.coverage" % (config["project-folder"])
    log:
        "%s/logs/Samtools/MockRefClusters_AlignmentStats.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/MockRefClusters_AlignmentStats.{samples}.tsv" % (config["project-folder"])
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        samtools flagstat {input.sam} > {output.fs}
        samtools idxstats {input.sbam} | awk '{{print $1\" \"$3}}' > {output.c}
  	"""

################################################################################
##
## Process the final Mock

rule FinalMockRef_AlignReads:
    """
    Align reads to the final mock reference Genome.
    """
    input:
        reference="%s/MockReference/MockReference.fa" % (config["project-folder"]),
        index="%s/MockReference/MockReference.fa.fai" % (config["project-folder"]),
        refFiles="%s/MockReference/MockReference.fa.bwt" % (config["project-folder"]),
        R1="%s/FASTQ/TRIMMED/{samples}.R1.fq.gz" % (config["project-folder"]),
        R2="%s/FASTQ/TRIMMED/{samples}.R2.fq.gz" % (config["project-folder"]),
    output:
        temp("%s/SAM/alignments_finalMock/{samples}.sam" % (config["project-folder"]))
    log:
        "%s/logs/BWA/FinalMockRef_AlignReads.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/FinalMockRef_AlignReads.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5b"]["threads"],
    conda:"envs/gbs.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        bwa mem -t {params.threads} -M {input.reference} {input.R1} {input.R2} > {output} 2> {log}
  	"""
  	
rule FinalMockRef_SamToSortedBam:
    """
    Sam to sorted bam for final mock reference (SAMTOOLS)
    """
    input:
        "%s/SAM/alignments_finalMock/{samples}.sam" % (config["project-folder"])
    output:
        bam=temp("%s/BAM/alignments_finalMock/{samples}.bam" % (config["project-folder"])),
        sorted="%s/BAM/alignments_finalMock/{samples}.sorted.bam" % (config["project-folder"])
    log:
        "%s/logs/Samtools/FinalMockRef_SamToSortedBam.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/FinalMockRef_SamToSortedBam.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5d"]["threads"],
        q=config["params"]["step5d"]["q"],
        f=config["params"]["step5d"]["f"],
        F=config["params"]["step5d"]["F"]
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        samtools view -b -q {params.q} -f {params.f} -F {params.F} {input} > {output.bam}
        samtools sort {output.bam} -o {output.sorted}
        samtools index -c {output.sorted}
  	"""

rule FinalMockRef_SortedBamToMpileup:
    """
    Get Mpileup for final Mock Reference Genome.
    """
    input:
        bam="%s/BAM/alignments_finalMock/{samples}.sorted.bam" % (config["project-folder"]),
        reference="%s/MockReference/MockReference.fa" % (config["project-folder"]),
        index="%s/MockReference/MockReference.fa.fai" % (config["project-folder"])
    output:
        bam="%s/MPILEUP/mpileup_finalMock/{samples}.mpileup" % (config["project-folder"])
    log:
        "%s/logs/Samtoools/FinalMockRef_SortedBamToMpileup.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/FinalMockRef_SortedBamToMpileup.{samples}.tsv" % (config["project-folder"])
    params:
        threads=config["params"]["step5d"]["threads"],
        Q=config["params"]["step5d"]["Q"],
        q=config["params"]["step5d"]["q"]
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        df -h &> {log}
        samtools mpileup -Q {params.Q} -q {params.q} -B -C 50 -f {input.reference} {input.bam} > {output}
  	"""


rule finalMockRef_AlignmentStats:
    """
    Alignment stats for reads mapped to final mock ref
    """
    input:
        sam="%s/SAM/alignments_finalMock/{samples}.sam" % (config["project-folder"]),
        sbam="%s/BAM/alignments_finalMock/{samples}.sorted.bam" % (config["project-folder"])
    output:
        fs="%s/BAM/alignments_finalMock/{samples}.sam.flagstat" % (config["project-folder"]),
        c="%s/BAM/alignments_finalMock/{samples}.coverage" % (config["project-folder"])
    log:
        "%s/logs/Samtools/FinalMockRef_AlignmentStats.{samples}.log" % (config["project-folder"])
    benchmark:
        "%s/benchmark/finalMockRef_AlignmentStats.{samples}.tsv" % (config["project-folder"])
    conda:"envs/samtools.yaml"
    singularity: config["singularity"]["gbs"]
    shell:"""
        samtools flagstat {input.sam} > {output.fs}
        samtools idxstats {input.sbam} | awk '{{print $1\" \"$3}}' > {output.c}
  	"""
