#!/usr/bin/perl -w

# A simple script to translated all six reading frames, generate one amino acid sequence per reading frame
# input nucleotide sequence should be present in just one line
#output goes on the terminal

if (@ARGV != 1) { die "correct usage\n\t translateWholeGenome.pl <InputSeqFile>";}
#$MIN_LENGTH = $ARGV[1]; # minimum protein length

open(CODING,"resourceFiles/codonAminoAcid22.txt") || die"can't open codonAminoAcid22.txt";
while(defined(my $line=<CODING>)){
	chomp $line;
	my @arr = split /\t/,$line;
	$codon2AminoPositive{$arr[0]}=$arr[1];
	$codon2AminoNegative{reverse($arr[0])}=$arr[1];
}
close(CODING);
	
open(INPUT,$ARGV[0])|| die "cant open input fasta file\n";
my $chrNum=0;
while(defined(my $line =<INPUT>)){
	if($line =~/^>(.+)\n/){
		$chrNum++;
		my $chrName = "Chr".$chrNum."_Frame";		
		$line =<INPUT>;
		chomp $line;
		$length = length($line);
	
		# Frame 1
		$start=0; # codon start site
		print ">$chrName 1\n";
		$orfSeq=""; # sequence seen so far
		while($start <= $length-3){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoPositive{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start+3;
		}
		print "\n";
		
		
		# Frame 2
		$start=1; # codon start site
		print ">$chrName 2\n";
		$orfSeq=""; # sequence seen so far
		while($start <= $length-3){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoPositive{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start+3;
		}
		print "\n";
		
		# Frame 3
		$start=2; # codon start site
		print ">$chrName 3\n";
		$orfSeq=""; # sequence seen so far
		while($start <= $length-3){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoPositive{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start+3;
		}
		print "\n";
		
		# Now take the complement of the chromosome sequence
		$line =~ tr/TACG/ATGC/;		  		

		# Frame 4
		$start=$length-3; # codon start site
		print ">$chrName 4\n";
		$orfSeq=""; # sequence seen so far
		while($start >=0){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoNegative{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start-3;
		}
		print "\n";
		
		# Frame 5
		$start=$length-4; # codon start site
		print ">$chrName 5\n";
		$orfSeq=""; # sequence seen so far
		while($start >=0){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoNegative{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start-3;
		}
		print "\n";
		
		# Frame 6
		$start=$length-5; # codon start site
		print ">$chrName 6\n";
		$orfSeq=""; # sequence seen so far
		while($start >=0){
			$codon=substr($line,$start,3);
			$amino= $codon2AminoNegative{$codon};
			if(!defined($amino)){$amino = "X"; }
			print $amino;
			$start=$start-3;
		}
		print "\n";
	}
}
