#!/bin/bash
#The script is the full pipeline that reconstructs the proteins structure based on the input contact map matirx. 
#The CA trace is recovered using the ft-comar program (loops are added to multichain proteins) than backbone is rebuild by SABBAC or REMO.
#Final stage is relaxation of the structure using scwrl 4.0 .


#USAGE:
#con_map2struct <name_10con12.cmap> <threshold> <use_filter> <pdb_file> < orient_pdb_full_path> <rmsd_threshold> <run_num> <insert_loops_flag> <loop length> <insert_pt1> ..

EXPECTED_ARGS=7
BAD_ARGS=55
SABBAC_ERR=3

if [ $# -lt ${EXPECTED_ARGS} ]
then
	echo "USAGE: cmap2struct <name_10con12.cmap> <threshold> <use_filter> <pdb_file> <orient_pdb_full_path> <chainIDs_in_output> <rmsd_threshold> <run_num> <insert_loops_flag> <loop length> <insert_pt1> .."
	exit $BAD_ARGS
fi


con_map_file=$1
con_threshold=$2
use_filter=$3
pdb_file=$4
orient_pdb=$5
chain_seq=$6
rmsd_threshold=$7
run_num=$8
ins_loops_flag=$9
CA_rmsd_to_native=$rmsd_threshold
SABBAC_WAIT=150



echo "Arguments read:"
echo "Contact map file:  ${con_map_file}"
echo "Contact threshold: ${con_threshold}"
echo "Using filter: ${use_filter}"
echo "Real pdb file: ${pdb_file}"
echo "Sequence of chains in PDB out files: $chain_seq" 
echo "Run number: ${run_num}"
echo "Insert loops: ${ins_loops_flag}"
echo "********************************************"
if [ ${ins_loops_flag} -ne "0" ]
then
	#If there is a line with the number of residues at the beging of the *.cmap file
	#it has to be removed before adding loops
	no_residues=`awk '{if (FNR==1){if(NF!=1) num++;else {num=0; exit 0;}} else num++}END{print num;}' ${con_map_file}`
	if [ $no_residues -eq 0 ]
	then
		echo "Removing residue number line"
		sed -i 1d ${con_map_file}
	fi
	echo "Inserting loops"
	echo "${@:10:$#}"
	cmap_insert_loops ${con_map_file} ${@:10:$#}
	con_map_file=${con_map_file%%.*}_loop.cmap
	mv $con_map_file ${con_map_file%%.*}_${run_num}.cmap
	con_map_file=${con_map_file%%.*}_${run_num}.cmap
fi

echo "********************************************"

name_pre=${con_map_file%%.*}
echo "First part of file names: $name_pre"
ft_name="${name_pre}_FT_raw.pdb"
echo "FT-COMAR output file name: $ft_name"

no_residues=`awk '{if (FNR==1){if(NF!=1) num++;else {num=0; exit 0;}} else num++}END{print num;}' ${con_map_file}`
if [ $no_residues -ne 0 ]
	then
		echo "Adding number of resiudes to the beginging of ${con_map_file}"
		sed -i '1i'${no_residues}'' ${con_map_file}
else 
	echo "The contact map file is ok for ftcomar"
fi
ft_comar_count=0
ft_comar_max=9
while [ $CA_rmsd_to_native -ge $rmsd_threshold ]; do
	ft_comar_count=$[$ft_comar_count+1]
	if [ $ft_comar_count -gt $ft_comar_max ]
	then
		echo "********************************************"
		echo -e "ft-comar got stuck \nAborting current run"
		echo "********************************************"

		exit 2
	fi
	echo "Running ft-comar (run $ft_comar_count)"
	ftcomar $con_map_file $con_threshold $use_filter $ft_name > oe.${con_map_file}_${run_num} 2>&1	
	
	if [ ${ins_loops_flag} -ne "0" ]
	then
		echo "Trimming loops"
		cmap_trim_loops $ft_name ${@:10:$#}
	fi
	ftcomar_format_output $pdb_file $ft_name > ${name_pre}_FT.pdb
	#tmp=/home/Bob/Contacts2Struct/3fb7/3fb7_1con12/Symetric_models/Generate_models/3fb7_assembly_1con12_loop_2_FT.pdb
	CA_rmsd_to_native=`prot_s2s_rmsd.py ${name_pre}_FT.pdb ${pdb_file}`
	#CA_rmsd_to_native=`prot_s2s_rmsd.py $tmp ${pdb_file}`
	echo "CA_trace RMSD to Native: ${CA_rmsd_to_native}"
	CA_rmsd_to_native=${CA_rmsd_to_native%%.*}
	echo $CA_rmsd_to_native
	if [ ${#CA_rmsd_to_native} -ge 15 ]; #if prot_s2s_rmsd.py returns "No convergence" ERROR
		then
		CA_rmsd_to_native=$rmsd_threshold
	fi
	if [ $CA_rmsd_to_native -ge $rmsd_threshold ];
		then
		echo "Low CA_trace RMSD. Repeating ft-comar reconstruction."
	fi 
done
echo "ft-comar stage completed"
echo "********************************************"
mkdir ${run_num}
mv ${con_map} ${run_num}/
mv $ft_name ${run_num}/
mv ${name_pre}_FT.pdb ${run_num}/
mv ${name_pre}_FT_raw_loops.pdb ${run_num}/
cd ${run_num}
#echo "Preparing for averaging CA trace"
#$pymol_orient_script ${name_pre}_FT.pdb $orient_pdb
#echo "Positioning structure"
#c2s_position_struct.py ${name_pre}_FT.pdb
pdb_separate_chains ${name_pre}_FT.pdb
#CA_traces=(`ls ${name_pre}_FT_[A-Z].pdb 2>/dev/null`)
#c2s_generate_average.py ${CA_traces[@]}
mkdir Single_chains
mv ${name_pre}_FT_[A-Z].pdb Single_chains/ >/dev/null
cd Single_chains/
echo "********************************************"
# ************************************************* Reconstruction of protein backbone ***************************
echo "Backbone reconstruction with SABBAC server"
counter=0;
number_of_query_files=`ls -l Q* 2>/dev/null | grep -c Query`
CA_traces=(`ls ${name_pre}_FT_[A-Z].pdb 2>/dev/null`)
seconds=0
backbone_step="SAB"

for i in ${CA_traces[*]}
do
        echo "Sending $i to SABBAC server"
        prot_send2SAB.pl $i > ${i%%.*}_SAB.pdb &
        counter=$[$counter+1]
done
echo "Waiting for SABBAC results (waiting condition set to $SABBAC_WAIT): "

while [ `ls -l Q* 2>/dev/null | grep -c Query` -lt $[$counter+$number_of_query_files] ]
do
        printf "\rElapsed time: %d s" $[$seconds*5]
	if [ $[$seconds*5] -ge $SABBAC_WAIT ];then
		echo -e "\nERROR: No SABBAC response within set time limit"
		cd ../../
		rm -r ${run_num}
		exit $SABBAC_ERR
	fi
        sleep 5
        seconds=$[$seconds+1]
done
echo ""
backbone_files=(`ls *[A-Z]_SAB.pdb`)
for i in ${backbone_files[*]}
do
        SABBAC_file_name=`cat $i`
        echo "Recieved SABBAC file: " $SABBAC_file_name "Writting to : "$i
        mv $SABBAC_file_name $i
done

echo "********************************************"
# *************************Merging SABBAC output chains and positioning structure **************************
full_chain_file_name=${name_pre}_FT_${backbone_step}.pdb

echo "Full chain name after ${backbone_step} : ${full_chain_file_name}"
pattern='*'${run_num}'_FT_[A-Z]_'${backbone_step}'.pdb'
#echo ${pattern}
echo "Merging chains"
pdb_cat_chains "$pattern" > $full_chain_file_name
echo "********************************************"
echo "Orienting and positioning structure"
c2s_orient_struct.py $full_chain_file_name $orient_pdb
c2s_position_struct.py $full_chain_file_name

echo "********************************************"
# **************************** Seperating chains, generating averaged chain and generating symetric models ***************************
pdb_separate_chains $full_chain_file_name
backbone_files2=`ls *_SAB_[A-Z].pdb`
c2s_generate_average.py ${backbone_files2[@]}
averaged=`ls *AV.pdb`
echo "Sending averaged structure to SABBAC server"
averaged_SAB=`prot_send2SAB.pl $averaged`
mv $averaged_SAB $averaged
echo "Received SABBAC response: $averaged "
backbone_files2="$backbone_files2 $averaged"
echo "********************************************"
echo "Generating symetric models"
for i in ${backbone_files2[@]}
do
	c2s_generate_symetric.py $i $chain_seq
done

echo "********************************************"
# *****************************************  Adding side chains & performing relaxation *******************
echo "Running SCWRL 4.0 for adding sidechains and optimizing rotamers"
ls *SYM.pdb | while read sym_model_file_name;do
	echo ${sym_model_file_name}
	scwrl4 -h -i ${sym_model_file_name} -o ${sym_model_file_name%%.pdb}_SCWRL.pdb >> ./../oe.${con_map_file}_${run_num} 2>&1
done 
echo "Moving full chain files"
mkdir ../Full_chains
mkdir ../Final_chains
mv *SYM_SCWRL.pdb ../Final_chains/
mv *SYM.pdb ../Full_chains/
echo "********************************************"
echo "Generating PQR files was commented out - cmap2struct: line 214"
# *****************************************  Generating PQR files *******************
#echo "Sending final files to PDB2PQR server"
#cd ../Final_chains
#final_models=`ls -1 *SCWRL.pdb`
#final_models_count=`ls -1 *SCWRL.pdb | wc -l`
#counter=0;
#for i in ${final_models[@]}; do 
	#echo $i
	#prot_send2PDB2PQR.pl $i 1>&2 &
#done
#counter=`ls -1 *.pqr 2>/dev/null | wc -l `
#PDB2PQR_WAIT=250
#echo "Waiting for PDB2PQR results (waiting condition set to $PDB2PQR_WAIT):"

#while [ $counter -ne $final_models_count ];do
	#counter=`ls -1 *.pqr | wc -l 2>/dev/null`
	#sleep 5
	#repeat=$[$repeat+1]
	#printf "\rElapsed time: %d s Results received: %d/%d " $[$repeat*5] $counter $final_models_count
	#if [ $[$repeat*5] -ge $PDB2PQR_WAIT ];then
        #        echo -e "\nERROR: no PDB2PQR response within set time limit" 1>&2
#		break
#	fi
#done
#echo -e "\nPqr files downloaded:"
#ls -1 *.pqr

echo "********************************************"
echo "WORK COMPLETED"
