#!/usr/bin/make -f
#Pipeline for the LINKS program
#Written by Murathan Goktas
#Default Parameters

#parameters
d=4000
k=15
t=2
o=0
e=0.1
z=500
p=0.001
x=0
v=0
j=3

l=5
a=0.3

r=
r_conditional=
ifneq ($r,)
r_conditional=-r
endif

b=k$k_t$t_l$l_a$a_o$o_e$e

bin=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))

SHELL=bash -e -o pipefail
ifeq ($(shell zsh -e -o pipefail -c 'true' 2>/dev/null; echo $$?), 0)
#Set pipefail to ensure that all commands of a pipe succeed.
SHELL=zsh -e -o pipefail
#Report run time and memory usage with zsh.
export REPORTTIME=1
export TIMEFMT=time user=%U system=%S elapsed=%E cpu=%P memory=%M job=%J
endif

#Use pigz or bgzip for parallel compression if available.
ifneq ($(shell command -v pigz),)
gzip=pigz -p$t
else
ifneq ($(shell command -v bgzip),)
gzip=bgzip -@$t
else
gzip=gzip
endif
endif

#Record run time and memory usage in a file using GNU time.
ifdef time
ifneq ($(shell command -v gtime),)
gtime=command gtime -v -o $@.time
else
gtime=command time -v -o $@.time
endif
endif


.PHONY: all version help clean LINKS
.DELETE_ON_ERROR:
.SECONDARY: 


all: help
#Help
help:
	@echo ""
	@echo "Usage: ./LINKS-make [COMMAND] [OPTION=VALUE]..."
	@echo "	Example: ./LINKS-make links draft=NA1281_draft.fa readsFof=NA1281_reads.fof k=17 t=5"
	@echo "	Commands:"
	@echo ""
	@echo "		links		run LINKS"
	@echo "		help            display this help page"
	@echo "		version         display the software version"
	@echo "		clean           remove intermediate files"
	@echo ""
	@echo "	General Options:"
	@echo ""
	@echo "		draft           draft name. File must have .fasta or .fa extension"
	@echo "		readsFof        file of files for reads. Files must have .fastq.gz or .fq.gz extension"
	@echo "		time		logs time and memory usage to file for main steps (Set to 1 to enable logging)"	
	@echo ""
	@echo "	LINKS Options:"
	@echo ""
	@echo "	d	distance between k-mer pairs (ie. target distances to re-scaffold on. default -d 4000, optional)"
	@echo "			Multiple distances are separated by comma. eg. -d 500,1000,2000,3000"
	@echo "	k	k-mer value (default -k 15, optional)"
	@echo "	t	step of sliding window when extracting k-mer pairs from long reads"
	@echo "			(default -t 2, optional)"
	@echo "			Multiple steps are separated by comma. eg. -t 10,5"
	@echo "	j	threads  (default -j 3, optional)"
	@echo "	o	offset position for extracting k-mer pairs (default -o 0, optional)"
	@echo "	e	error (%) allowed on -d distance   e.g. -e 0.1  == distance +/- 10%"
	@echo "		(default -e 0.1, optional)"
	@echo "	l	minimum number of links (k-mer pairs) to compute scaffold (default -l 5, optional)"
	@echo "	a	maximum link ratio between two best contig pairs (default -a 0.3, optional)"
	@echo "			*higher values lead to least accurate scaffolding*"
	@echo "	z	minimum contig length to consider for scaffolding (default -z 500, optional)"
	@echo "	b	base name for your output files (optional)"
	@echo "	r	Bloom filter input file for sequences supplied in -s (optional, if none provided will output to .bloom)"
	@echo "			NOTE: BLOOM FILTER MUST BE DERIVED FROM THE SAME FILE SUPPLIED IN -f WITH SAME -k VALUE"
	@echo "			IF YOU DO NOT SUPPLY A BLOOM FILTER, ONE WILL BE CREATED (.bloom)"
	@echo "	p	Bloom filter false positive rate (default -p 0.001, optional; increase to prevent memory allocation errors)"
	@echo "	x	Turn off Bloom filter functionality (1 = yes, default = no, optional)"
	@echo "	v	Runs in verbose mode (1 = yes, default = no, optional)"
	@echo ""

clean:
	rm -f *.pairing_issues *.tsv
	@echo "Clean Done"

version:
	@echo "links-make v2.0.1"

#Make an Empty fof File
empty.fof:
	touch $@

$(b).tigpair_checkpoint.tsv : $(draft) $(readsFof)
	$(gtime) LINKS_CPP -f $(draft) -s $(readsFof) $(r_conditional) $r -d $d -k $k -t $t -j $j -l $l -o $o -e $e -z $z -p $p -b $b -v $v -x $x

$(b).scaffold.fa : $(b).tigpair_checkpoint.tsv empty.fof
	$(gtime) LINKS.pl -f $(draft) -s empty.fof -b $b -l $l -a $a -e $e -z $z -p $p -v $v

#Run LINKS
LINKS: $(b).scaffold.fa
