#!/bin/bash

# integrative subcmds testing

if [ $# -lt 1 ];then
    echo "Run all tests for subcommands of MACS2. Need 1 parameter for a tag name! A unique string combining date, time and MACS2 version is recommended. ./test.sh <TAG>"
    exit
fi

# test all sub-commands
TAG=$1

CHIP=CTCF_SE_ChIP_chr22_50k.bed.gz
CTRL=CTCF_SE_CTRL_chr22_50k.bed.gz

CHIPPE=CTCF_PE_ChIP_chr22_50k.bam
CTRLPE=CTCF_PE_CTRL_chr22_50k.bam

CHIPBEDPE=CTCF_PE_ChIP_chr22_50k.bedpe.gz
CTRLBEDPE=CTCF_PE_CTRL_chr22_50k.bedpe.gz

CHIPCONTIGS50K=contigs50k.bed.gz

CHIPBIGSPEEDTEST=CTCF_12878_5M.bed.gz
CTRLBIGSPEEDTEST=input_12878_5M.bed.gz

# callpeak
echo "1. callpeak"
echo "1.1 callpeak narrow"

mkdir ${TAG}_run_callpeak_narrow

macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow0 -B --outdir ${TAG}_run_callpeak_narrow --cutoff-analysis &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow0.log
macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow1 -B --outdir ${TAG}_run_callpeak_narrow --d-min 15 --call-summits &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow1.log
macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow2 -B --outdir ${TAG}_run_callpeak_narrow --nomodel --extsize 100 &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow2.log
macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow3 -B --outdir ${TAG}_run_callpeak_narrow --nomodel --extsize 100 --shift -50 &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow3.log
macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow4 -B --outdir ${TAG}_run_callpeak_narrow --nomodel --nolambda --extsize 100 --shift -50 &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow4.log
macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_narrow5 -B --outdir ${TAG}_run_callpeak_narrow --scale-to large &> ${TAG}_run_callpeak_narrow/run_callpeak_narrow5.log

echo "1.2 callpeak broad"
mkdir ${TAG}_run_callpeak_broad 

macs2 callpeak -g 52000000 -t $CHIP -c $CTRL -n run_callpeak_broad -B --outdir ${TAG}_run_callpeak_broad --broad &> ${TAG}_run_callpeak_broad/run_callpeak_broad.log

echo "1.3 callpeak on PE narrow/broad"

mkdir  ${TAG}_run_callpeak_pe_narrow

macs2 callpeak -g 52000000 -f BAMPE -t $CHIPPE -c $CTRLPE -n run_callpeak_bampe_narrow -B --outdir ${TAG}_run_callpeak_pe_narrow --call-summits &> ${TAG}_run_callpeak_pe_narrow/run_callpeak_bampe_narrow.log
macs2 callpeak -g 52000000 -f BEDPE -t $CHIPBEDPE -c $CTRLBEDPE -n run_callpeak_bedpe_narrow -B --outdir ${TAG}_run_callpeak_pe_narrow --call-summits &> ${TAG}_run_callpeak_pe_narrow/run_callpeak_bedpe_narrow.log
macs2 callpeak -g 52000000 -f BEDPE -t $CHIPBEDPE -n run_callpeak_pe_narrow_onlychip -B --outdir ${TAG}_run_callpeak_pe_narrow &> ${TAG}_run_callpeak_pe_narrow/run_callpeak_pe_narrow_onlychip.log

mkdir  ${TAG}_run_callpeak_pe_broad

macs2 callpeak -g 52000000 -f BAMPE -t $CHIPPE -c $CTRLPE -n run_callpeak_bampe_broad -B --outdir ${TAG}_run_callpeak_pe_broad --broad &> ${TAG}_run_callpeak_pe_broad/run_callpeak_bampe_broad.log
macs2 callpeak -g 52000000 -f BEDPE -t $CHIPBEDPE -c $CTRLBEDPE -n run_callpeak_bedpe_broad -B --outdir ${TAG}_run_callpeak_pe_broad --broad &> ${TAG}_run_callpeak_pe_broad/run_callpeak_bedpe_broad.log

# pileup
echo "2. pileup"

mkdir ${TAG}_run_pileup

macs2 pileup -f BED -i $CHIP --extsize 200 --outdir ${TAG}_run_pileup -o run_pileup_ChIP.bed.bdg &> ${TAG}_run_pileup/run_pileup_ChIP.bed.log
macs2 pileup -f BED -i $CTRL --extsize 200 --outdir ${TAG}_run_pileup -o run_pileup_CTRL.bed.bdg &> ${TAG}_run_pileup/run_pileup_CTRL.bed.log

macs2 pileup -f BAMPE -i $CHIPPE --outdir ${TAG}_run_pileup -o run_pileup_ChIPPE.bampe.bdg &> ${TAG}_run_pileup/run_pileup_ChIPPE.bampe.log
macs2 pileup -f BAMPE -i $CTRLPE --outdir ${TAG}_run_pileup -o run_pileup_CTRLPE.bampe.bdg &> ${TAG}_run_pileup/run_pileup_CTRLPE.bampe.log

macs2 pileup -f BEDPE -i $CHIPBEDPE --outdir ${TAG}_run_pileup -o run_pileup_ChIPPE.bedpe.bdg &> ${TAG}_run_pileup/run_pileup_ChIPPE.bedpe.log
macs2 pileup -f BEDPE -i $CTRLBEDPE --outdir ${TAG}_run_pileup -o run_pileup_CTRLPE.bedpe.bdg &> ${TAG}_run_pileup/run_pileup_CTRLPE.bedpe.log

# filterdup
echo "3. filterdup"

mkdir ${TAG}_run_filterdup 

macs2 filterdup -g 52000000 -i $CHIP --outdir ${TAG}_run_filterdup -o run_filterdup_result.bed --dry-run &> ${TAG}_run_filterdup/run_filterdup_d.log
macs2 filterdup -g 52000000 -i $CHIP --outdir ${TAG}_run_filterdup -o run_filterdup_result.bed &> ${TAG}_run_filterdup/run_filterdup.log

macs2 filterdup -g 52000000 -i $CHIPPE -f BAMPE --outdir ${TAG}_run_filterdup -o run_filterdup_result_pe.bedpe --dry-run &> ${TAG}_run_filterdup/run_filterdup_pe_d.log
macs2 filterdup -g 52000000 -i $CHIPPE -f BAMPE --outdir ${TAG}_run_filterdup -o run_filterdup_result_pe.bedpe &> ${TAG}_run_filterdup/run_filterdup_pe.log

# predictd
echo "4. predictd"

mkdir ${TAG}_run_predictd

macs2 predictd -g 52000000 -i $CHIP --d-min 10 --outdir ${TAG}_run_predictd --rfile run_predictd.R &> ${TAG}_run_predictd/run_predictd.log

# randsample
echo "5. randsample"

mkdir ${TAG}_run_randsample

macs2 randsample -i $CHIP -n 10000 --seed 31415926 --outdir ${TAG}_run_randsample -o run_randsample.bed &> ${TAG}_run_randsample/run_randsample.log

macs2 randsample -f BAMPE -i $CHIPPE -n 10000 --seed 31415926 --outdir ${TAG}_run_randsample -o run_randsample_bampe.bedpe &> ${TAG}_run_randsample/run_randsample_bampe.log

macs2 randsample -f BEDPE -i $CHIPBEDPE -n 10000 --seed 31415926 --outdir ${TAG}_run_randsample -o run_randsample_bedpe.bedpe &> ${TAG}_run_randsample/run_randsample_bedpe.log

# refinepeak
echo "6. refinepeak"

mkdir ${TAG}_run_refinepeak

macs2 refinepeak -b ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_peaks.narrowPeak -i $CHIP --outdir ${TAG}_run_refinepeak --o-prefix run_refinepeak_w_prefix &> ${TAG}_run_refinepeak/run_refinepeak_w_prefix.log

macs2 refinepeak -b ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_peaks.narrowPeak -i $CHIP --outdir ${TAG}_run_refinepeak -o run_refinepeak_w_ofile.bed &> ${TAG}_run_refinepeak/run_refinepeak_w_ofile.log

# bdgcmp
echo "7. bdgcmp"

mkdir ${TAG}_run_bdgcmp

macs2 bdgcmp -t ${TAG}_run_pileup/run_pileup_ChIP.bed.bdg -c ${TAG}_run_pileup/run_pileup_CTRL.bed.bdg  -m ppois FE -p 1 --outdir ${TAG}_run_bdgcmp --o-prefix run_bdgcmp &> ${TAG}_run_bdgcmp/run_bdgcmp.log

# bdgpeakcall
echo "8. bdgpeakcall"

mkdir ${TAG}_run_bdgpeakcall

macs2 bdgpeakcall -i ${TAG}_run_bdgcmp/run_bdgcmp_FE.bdg -c 2 --outdir ${TAG}_run_bdgpeakcall --o-prefix run_bdgpeakcall_w_prefix &> ${TAG}_run_bdgpeakcall/run_bdgpeakcall_w_prefix.log

macs2 bdgpeakcall -i ${TAG}_run_bdgcmp/run_bdgcmp_FE.bdg -c 2 --outdir ${TAG}_run_bdgpeakcall -o run_bdgpeakcall_cutoff.txt --cutoff-analysis &> ${TAG}_run_bdgpeakcall/run_bdgpeakcall_cutoff.log

# bdgbroadcall
echo "9. bdgbroadcall"

mkdir ${TAG}_run_bdgbroadcall

macs2 bdgbroadcall -i ${TAG}_run_bdgcmp/run_bdgcmp_FE.bdg -c 2 -C 1.5 --outdir ${TAG}_run_bdgbroadcall --o-prefix run_bdgbroadcall_w_prefix &> ${TAG}_run_bdgbroadcall/run_bdgbroadcall_w_prefix.log

# bdgdiff
echo "10. bdgdiff"

mkdir ${TAG}_run_callpeak_narrow_revert
mkdir ${TAG}_run_bdgdiff

macs2 callpeak -g 10000000 --nomodel --extsize 250 -c $CHIP -t $CTRL -n run_callpeak_narrow_revert -B --outdir ${TAG}_run_callpeak_narrow_revert &> ${TAG}_run_callpeak_narrow_revert/run_callpeak_narrow_revert.log

macs2 bdgdiff --t1 ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg --c1 ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_control_lambda.bdg --t2 ${TAG}_run_callpeak_narrow_revert/run_callpeak_narrow_revert_treat_pileup.bdg --c2 ${TAG}_run_callpeak_narrow_revert/run_callpeak_narrow_revert_control_lambda.bdg --o-prefix run_bdgdiff_prefix --outdir ${TAG}_run_bdgdiff &> ${TAG}_run_bdgdiff/run_bdgdiff_w_prefix.log

macs2 bdgdiff --t1 ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg --c1 ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_control_lambda.bdg --t2 ${TAG}_run_callpeak_narrow_revert/run_callpeak_narrow_revert_treat_pileup.bdg --c2 ${TAG}_run_callpeak_narrow_revert/run_callpeak_narrow_revert_control_lambda.bdg -o cond1.bed cond2.bed common.bed --outdir ${TAG}_run_bdgdiff &> ${TAG}_run_bdgdiff/run_bdgdiff_w_o_file.log

# cmbreps
echo "11. cmbreps"

mkdir ${TAG}_run_cmbreps

macs2 cmbreps -i ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_control_lambda.bdg ${TAG}_run_bdgcmp/run_bdgcmp_ppois.bdg -m max -o run_cmbreps_max.bdg --outdir ${TAG}_run_cmbreps &> ${TAG}_run_cmbreps/run_cmbreps_max.log
macs2 cmbreps -i ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_control_lambda.bdg ${TAG}_run_bdgcmp/run_bdgcmp_ppois.bdg -m mean -o run_cmbreps_mean.bdg --outdir ${TAG}_run_cmbreps &> ${TAG}_run_cmbreps/run_cmbreps_mean.log
macs2 cmbreps -i ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_control_lambda.bdg ${TAG}_run_bdgcmp/run_bdgcmp_ppois.bdg -m fisher -o run_cmbreps_fisher.bdg --outdir ${TAG}_run_cmbreps &> ${TAG}_run_cmbreps/run_cmbreps_fisher.log

# bdgopt
echo "12. bdgopt"

mkdir ${TAG}_run_bdgopt

macs2 bdgopt -m min -p 10 -i ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg -o run_bdgopt_min.bdg --outdir ${TAG}_run_bdgopt &> ${TAG}_run_bdgopt/run_bdgopt_min.log

macs2 bdgopt -m max -p 2 -i ${TAG}_run_callpeak_narrow/run_callpeak_narrow0_treat_pileup.bdg -o run_bdgopt_max.bdg --outdir ${TAG}_run_bdgopt &> ${TAG}_run_bdgopt/run_bdgopt_max.log

# test large amount of contigs
echo "13. 50k contigs with buffersize"

mkdir ${TAG}_run_50kcontigs

echo "13.1 callpeak"
macs2 callpeak -g 10000000 -t $CHIPCONTIGS50K -n run_callpeak_50kcontigs --outdir ${TAG}_run_50kcontigs --buffer-size 1000 --nomodel --extsize 200 &> ${TAG}_run_50kcontigs/run_callpeak_50kcontigs.log

echo "13.2 filterdup"
macs2 filterdup -g 10000000 -i $CHIPCONTIGS50K --outdir ${TAG}_run_50kcontigs -o run_filterdup_result.bed --buffer-size 1000 &> ${TAG}_run_50kcontigs/run_filterdup_50kcontigs.log

echo "13.3 pileup"
macs2 pileup -f BED -i $CHIPCONTIGS50K --extsize 200 --outdir ${TAG}_run_50kcontigs -o run_pileup_ChIP.bed.bdg --buffer-size 1000 &> ${TAG}_run_50kcontigs/run_pileup_ChIP.bed.log

echo "13.4 randsample"
macs2 randsample -i $CHIPCONTIGS50K -n 100000 --seed 31415926 --outdir ${TAG}_run_50kcontigs -o run_randsample.bed --buffer-size 1000 &> ${TAG}_run_50kcontigs/run_randsample.log

echo "14. search for errors or warnings in log files"
flag=0
for i in `ls ${TAG}_run_*/*.log`;do
    echo " checking $i..."
    egrep -A 2 -B 2 -i "error|warning" $i;
    if [[ $? == 0 ]];then
	echo " ... error/warning found!"
	let "flag=1";
    else
	echo " ... clear!"
    fi
done;

if [[ $flag == 1 ]]; then
    echo " Error or Warning can be found! Quit the test!"
    exit 1;
fi

echo "15. update standard outputs"

flag=0
# we do not check the consistency of random subsampling results
subfolders=(50kcontigs bdgbroadcall bdgcmp bdgdiff bdgpeakcall callpeak_broad callpeak_narrow callpeak_narrow_revert callpeak_pe_broad callpeak_pe_narrow cmbreps filterdup pileup refinepeak bdgopt)

m=0
n=0
for i in ${subfolders[@]};do
    let "m+=1"
    let "n=0"
    for j in `ls standard_results_${i}/*`; do
	k=`basename $j`
	let "n+=1"
	echo "14.${m}.${n} updating $i $k ..."
	fq=${TAG}_run_${i}/${k}
	fs=standard_results_${i}/${k}
	cp $fq $fs
    done
done

# exit with 1 if test fails
if [ $flag -eq 1 ];then
    exit $flag;
fi

echo "16. brief speed test"

macs2 callpeak -t CTCF_12878_5M.bed.gz -c Input_12878_5M.bed.gz -n speedtest -B &> speedtest.log &
# monitor the macs2 callpeak run and output CPU and mem usage
./prockreport 0.5 $!
wait;

# END of test
