#!/usr/bin/env sh

# Usage: ./new_tools_predic.sh infile outdir

infile=$(realpath $1)
outdir=$(realpath $2)

wd=${outdir}/wd
infaname=${infile##*/}
mkdir -p ${outdir}
mkdir ${wd}
cp ${infile} ${wd}
infile=${wd}/${infaname}
CONFDIR="../../data/confs"

# cpat
time -p -o ${outdir}/cpat_human.time cpat.py -g ${infile} -o ${outdir}/cpat_human.out -x ${CONFDIR}/CPAT-1.2.2/dat/Human_Hexamer.tsv -d ${CONFDIR}/CPAT-1.2.2/dat/Human_logitModel.RData
time -p -o ${outdir}/cpat_mouse.time cpat.py -g ${infile} -o ${outdir}/cpat_mouse.out -x ${CONFDIR}/CPAT-1.2.2/dat/Mouse_Hexamer.tsv -d ${CONFDIR}/CPAT-1.2.2/dat/Mouse_logitModel.RData
time -p -o ${outdir}/cpat_zebrafish.time cpat.py -g ${infile} -o ${outdir}/cpat_zebrafish.out -x ${CONFDIR}/CPAT-1.2.2/dat/zebrafish_Hexamer.tsv -d ${CONFDIR}/CPAT-1.2.2/dat/Zebrafish_logitModel.RData
time -p -o ${outdir}/cpat_fly.time cpat.py -g ${infile} -o ${outdir}/cpat_fly.out -x ${CONFDIR}/CPAT-1.2.2/dat/fly_Hexamer.tsv -d ${CONFDIR}/CPAT-1.2.2/dat/Fly_logitModel.RData

# CPC2 order is not working. It must run in CPC2.py path
time -p -o ${outdir}/cpc2.time ${CONFDIR}/CPC2-beta/bin/CPC2.py -i ${infile} -o ${outdir}/cpc2.out


# longdist
time -p -o ${outdir}/longdist_GRCm38_GRCz10.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCm38_GRCz10_firstOrf.plk.conf --out ${outdir}/longdist_GRCm38_GRCz10.out
time -p -o ${outdir}/longdist_GRCh37.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCh37_firstOrf.plk.conf --out ${outdir}/longdist_GRCh37.out
time -p -o ${outdir}/longdist_GRCh37_GRCm38.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCh37_GRCm38_firstOrf.plk.conf --out ${outdir}/longdist_GRCh37_GRCm38.out
time -p -o ${outdir}/longdist_GRCh38_GRCm38.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCh38_GRCm38_firstOrf.plk.conf --out ${outdir}/longdist_GRCh38_GRCm38.out
time -p -o ${outdir}/longdist_GRCm38.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCm38_firstOrf.plk.conf --out ${outdir}/longdist_GRCm38.out
time -p -o ${outdir}/longdist_GRCh38.time longdist --predict --input ${infile} --model_config ${CONFDIR}/longdist.py/models/GRCh38_firstOrf.plk.conf --out ${outdir}/longdist_GRCh38.out

# PlncPro
# Run in the directory where PlncPro is installed.
cd /Path/to/dir/PLncPRO/
time -p -o ${outdir}/plncpro1.time python prediction.py -i ${infile} -o ${outdir} -p plncpro1.out -m models/monocot.model -d ${CONFDIR}/UniProt/uniprot -t 16
time -p -o ${outdir}/plncpro2.time python prediction.py -i ${infile} -o ${outdir} -p plncpro2.out -m models/dicot.model -d ${CONFDIR}/UniProt/uniprot -t 16
cd -

# FEELnc
# should training model

# Set feelnc trainning data
train_coding="../../data/train_data/CPC2_coding_training_dataset.fa"
train_noncoding="../../data/train_data/CPC2_noncoding_training_dataset.fa"
train_hm_coding="../../data/train_data/mRNA_human_atcg.fa"
train_hm_noncoding="../../data/train_data/lncRNA_human_atcg.fa"
train_ms_coding="../../data/train_data/mRNA_mouse_atcg.fa"
train_ms_noncoding="../../data/train_data/lncRNA_mouse_atcg.fa"
train_zf_coding="../../data/train_data/mRNA_zebrafish_atcg.fa"
train_zf_noncoding="../../data/train_data/lncRNA_zebrafish_atcg.fa"
train_wm_coding="../../data/train_data/mRNA_worm_atcg.fa"
train_wm_noncoding="../../data/train_data/lncRNA_worm_atcg.fa"
train_ab_coding="../../data/train_data/mRNA_arabidopsis_atcg.fa"
train_ab_noncoding="../../data/train_data/lncRNA_arabidopsis_atcg.fa"
train_ff_coding="../../data/train_data/mRNA_fruitfly_atcg.fa"
train_ff_noncoding="../../data/train_data/lncRNA_fruitfly_atcg.fa"

feelnc_sp=("all" "hm" "ms" "zf" "wm" "ab" "ff")
feelnc_cd=("${train_coding}" "${train_hm_coding}" "${train_ms_coding}" "${train_zf_coding}" "${train_wm_coding}" "${train_ab_coding}" "${train_ff_coding}")
feelnc_nc=("${train_noncoding}" "${train_hm_noncoding}" "${train_ms_noncoding}" "${train_zf_noncoding}" "${train_wm_noncoding}" "${train_ab_noncoding}" "${train_ff_noncoding}")

# Set feelnc enviroment.
export FEELNCPATH=/Path/To/FEELnc
export PERL5LIB=$PERL5LIB:${FEELNCPATH}/lib/ #order is important to avoid &Bio::DB::IndexedBase::_strip_crnl error with bioperl >=v1.7
export PATH=$PATH:${FEELNCPATH}/scripts/
export PATH=$PATH:${FEELNCPATH}/utils/
export PATH=$PATH:${FEELNCPATH}/bin/LINUX/

l=${#feelnc_sp[@]}
for((i=0;i<${l};i++))
do
    mysp=${feelnc_sp[$i]}

    # --outdir should be set
    eval "time -p -o ${outdir}/feelnc_${mysp}_cl.time ${FEELNCPATH}/scripts/FEELnc_codpot.pl -i ${infile} -a ${feelnc_cd[$i]} -l ${feelnc_nc[$i]} -o feelnc_${mysp}_cl.out --outdir ${outdir}"
    # coding-shuffle traning
    eval "time -p -o ${outdir}/feelnc_${mysp}_sf.time ${FEELNCPATH}/scripts/FEELnc_codpot.pl -i ${infile} -a ${feelnc_cd[$i]} --mode=shuffle -o feelnc_${mysp}_sf.out --outdir ${outdir}"
    eval "mv ${outdir}/feelnc_${mysp}_cl.out_RF.txt ${outdir}/feelnc_${mysp}_cl.out"
    eval "mv ${outdir}/feelnc_${mysp}_sf.out_RF.txt ${outdir}/feelnc_${mysp}_sf.out"
done

# RNAploncpipe
# outfile name is rnaplonc.out defined in RNAploncpipe.sh
time -p -o ${outdir}/rnaplonc.time /Path/To/RNAplonc/RNAploncpipe.sh ${infile} ${outdir}

#hmmscan
myfa_p=${infile%.*}.p.fa
if [ ! -f ${myfa_p} ];then
    transeq -frame F ${infile} ${myfa_p}
fi
# hmmscan out is useless
# only need hmmscan.t.out
time -p -o ${outdir}/hmmscan.time hmmscan --tblout ${outdir}/hmmscan.t.out -o ${outdir}/hmmscan.outm ${CONFDIR}/Pfam/Pfam-A.hmm $myfa_p
time -p -o ${outdir}/hmmscan_b.time hmmscan --tblout ${outdir}/hmmscan_b.t.out -o ${outdir}/hmmscan_b.outm ${CONFDIR}/Pfam/Pfam-B.hmm $myfa_p


#PLEK
time -p -o ${outdir}/PLEK.time PLEK_pred -fasta ${infile} -out ${outdir}/PLEK.out

#CNCI
time -p -o ${outdir}/CNCI_ve.time CNCI -f ${infile} -m ve -p 16 -o ${outdir}/CNCI_ve
time -p -o ${outdir}/CNCI_pl.time CNCI -f ${infile} -m pl -p 16 -o ${outdir}/CNCI_pl
mv ${outdir}/CNCI_ve/CNCI.index ${outdir}/CNCI_ve.out
mv ${outdir}/CNCI_pl/CNCI.index ${outdir}/CNCI_pl.out

# cpc
mkdir ${outdir}/cpc_work
time -p -o ${outdir}/cpc.time cpc_predict ${infile} ${outdir}/cpc.out ${outdir}/cpc_work cpc_blast 

## mv intermediate file

itmf=${outdir}/itmf
predres=${outdir}/predres
mkdir ${itmf}
mkdir ${predres}
rm -r ${wd}
mv ${outdir}/*.out ${predres}
mv ${outdir}/*.time ${predres}
mv ${outdir}/* ${itmf}
mv ${itmf}/predres ${predres}
