#!/usr/bin/perl
# talos2aco
#
# written by Brian Volkman (bvolkman@mcw.edu)
#
# generate DYANA format PHI/PSI dihedral angle constraints (.aco file) 
# from TALOS output (pred.tab file)
#
# syntax: talos2aco talos_filename > dyana_aco_filename
#
# adjust minimum angle restraint by changing value of 'min_ang' on 
# the following line; TALOS will generate restraints based on the 
# standard deviation of the 10 best predicted conformations for each
# residue, and in some cases this can be as little as +/- 5 degrees or 
# less, probably too tight for tyipcal structure refinement. original
# value is 10, which produces restraints no tighter than +/- 10 degrees.

$min_ang = 10;

$file1 = $ARGV[0];
$lb = 0;
$sum = 0;
$count = 0;
%amino = (
	"A" => "ALA",
	"C" => "CYS",
	"D" => "ASP-",
	"E" => "GLU-",
	"F" => "PHE",
	"G" => "GLY",
	"H" => "HIST",
	"I" => "ILE",
	"K" => "LYS+",
	"L" => "LEU",
	"M" => "MET",
	"N" => "ASN",
	"P" => "PRO",
	"Q" => "GLN",
	"R" => "ARG+",
	"S" => "SER",
	"T" => "THR",
	"V" => "VAL",
	"W" => "TRP",
	"Y" => "TYR",
);
	
    open (FILE1, "$file1") || die "syntax: talos2aco talos_filename > dyana_aco_filename\n";
    while (<FILE1>) {
	@fld = split(/\s+/, $_);        #delimits by whitespace
        if($fld[9] eq "Good") {

        if($fld[2] ne "P") {
        
		if($fld[5]<$min_ang) {
			$fld[5]=$min_ang;
		}
		
		if($fld[6]<$min_ang) {
			$fld[6]=$min_ang;
		}
	$angle = "PHI";
        $lower = $fld[3]-$fld[5];
        $upper = $fld[3]+$fld[5];

	$~ = "DYANA_ACO";
	write;
    	}	
        $angle = "PSI";
        $lower = $fld[4]-$fld[6];
        $upper = $fld[4]+$fld[6];

	$~ = "DYANA_ACO";
	write;

	}
     }
	
close(FILE1);

#define format for output
format DYANA_ACO =
@>>> @<<<  @<<<  @####.# @####.#
$fld[1], $amino{"$fld[2]"}, $angle, $lower,  $upper
.
