if config["mockreference"] == "":
    pass
else:
    rule ExistingMockRefGenome_AlignReads:
        """
        Align reads to an existing Mock Reference Genome (BWA).
        """
        input:
            reference="%s" % (config["mockreference"]),
            refFiles="%s" % (config["mockref-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/SAM/alignments_existingMock/{samples}.sam" % (config["project-folder"]))
        log:
            "%s/logs/BWA/ExMockRefGenome_AlignReads.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/ExistingMockRefGenome_AlignReads.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        singularity: config["singularity"]["gbs"]
        shell:"""
            df -h &> {log}
            bwa mem -t {threads} -M {input.reference} {input.R1} {input.R2} > {output} 2> {log}
      	"""

if config["mockreference"] == "":
    pass
else:
    rule ExistingMockRefGenome_SamToSortedBam:
        """
        Sam to sorted bam for existing mock reference genome bam (SAMTOOLS)
        """
        input:
            "%s/SAM/alignments_existingMock/{samples}.sam" % (config["project-folder"])
        output:
            bam=temp("%s/BAM/alignments_existingMock/{samples}.bam" % (config["project-folder"])),
            sorted="%s/BAM/alignments_existingMock/{samples}.sorted.bam" % (config["project-folder"])
        log:
            "%s/logs/Samtools/ExMockRefGenome_SamToSortedBam.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/ExistingMockRefGenome_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}
      	"""

if config["mockreference"] == "":
    pass
else:
    rule ExistingMockRefGenome_AlignmentStats:
        """
        Get the mapping stats for the existing mock reference.
        """
        input:
            sam="%s/SAM/alignments_existingMock/{samples}.sam" % (config["project-folder"]),
            sbam="%s/BAM/alignments_existingMock/{samples}.sorted.bam" % (config["project-folder"])
        output:
            fs="%s/BAM/alignments_existingMock/{samples}.sam.flagstat" % (config["project-folder"]),
            c="%s/BAM/alignments_existingMock/{samples}.coverage" % (config["project-folder"])
        log:
            "%s/logs/Samtools/ExMockRefGenome_AlignmentStats.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/ExistingMockRefGenome_AlignmentStats.{samples}.tsv" % (config["project-folder"])
        threads: lambda cores: cpu_count()
        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}
      	"""

if config["existingvariants"] == "":
    pass
else:
    rule transformVCFtoBed:
        """
        Prepare the input files for targeted variant calling
        """
        input:
            "%s" % (config["existingvariants"])
        output:
            "%s/references/existing_variants.bed" % (config["project-folder"])
        log:
            "%s/logs/BASH/vcf2bed.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/transformVCFtoBed.tsv" % (config["project-folder"])
        params:
            pipefolder=config["pipeline-folder"]
        singularity: config["singularity"]["gbs"]
        shell:"""
            {params.pipefolder}/scripts/vcf2bed.sh {input}  > {output} 2> {log}
        """
      	
if config["mockreference"] == "":
    pass
else:
    rule ExistingMockRefGenome_SortedBamToVCF:
        """
        Get Mpileup for existing mock Reference Genome.
        """
        input:
            bam="%s/BAM/alignments_existingMock/{samples}.sorted.bam" % (config["project-folder"]),
            reference="%s" % (config["mockreference"]),
            bed="%s/references/existing_variants.bed" % (config["project-folder"])
        output:
            vcf="%s/MPILEUP/mpileup_existingMock/{samples}.vcf.gz" % (config["project-folder"]),
            index="%s/MPILEUP/mpileup_existingMock/{samples}.vcf.gz.csi" % (config["project-folder"])
        log:
            "%s/logs/Samtools/ExMockRefGenome_SortedBamToMpileup.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/ExistingMockRefGenome_SortedBamToVCF.{samples}.tsv" % (config["project-folder"])
        singularity: config["singularity"]["samtools"]
        shell:"""
            samtools mpileup --positions {input.bed} -B -g -f {input.reference} {input.bam} | bcftools call -c -Ob > {output.vcf}
            sleep 10
            bcftools index {output.vcf}
      	"""
      	
if config["mockreference"] == "":
    pass
else:
    rule ExistingMockRefGenome_mergeVCFs:
        """
        Merge the vcf files.
        """
        input:
            expand("%s/MPILEUP/mpileup_existingMock/{samples}.vcf.gz" % (config["project-folder"]), samples=samples)
        output:
            "%s/VCF/variants_existingMock.vcf" % (config["project-folder"])
        log:
            "%s/logs/bcftools/ExMockRefGenome_mergeVCF.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/ExistingMockRefGenome_mergeVCFs.tsv" % (config["project-folder"])
        singularity: config["singularity"]["samtools"]
        shell:"""
            bcftools merge {input} --threads 5 -Ov | grep -v '##contig=<ID=' > {output} 2> {log}
      	"""
