#!/usr/bin/perl
use strict;

my $usage= << "JUS";
  **************************************************************
  von Sven & Julian
  **************************************************************
  Aufruf: 	score2xmgrace.pl ersterPrameter zweiterParameter dritterParameter
  		ListeVonDataDatein
  Funktion:	ersterPrameter:
  			muss 0 oder 1 sein und gibt an ob eine Grafik
  			mit festem score (= 0) oder mit dem Score
  			der jeweiligen Methode (= 1) erzeugt wird
  		zweiterParameter:
  			muss 0 oder 1 sein und gibt an ob "Treppen" von
  			Alignace geloescht werden (0 = nicht loeschen, 1 = loeschen)
		dritterParameter:
			muss 0 oder 1 sein und gibt an ob als Label in der Grafik
			der Name des Programms steht oder Tiernamen (0 = Programm,
			1 = Tiername)
  		ListeVonDataDatein:
  			muss eine eine Liste (mit mindestens einem Element) von
  			Datein im speziellen data-Format sein
  Ergebnis:	im Ordner xmgrace* liegen PS-Files mit Grafiken im Kurven-Format
  Beispiel:	score2xmgrace.pl 1 1 *.data
JUS
if(@ARGV < 4){
	print $usage;
	exit;
}
#nimmt ersten Parameter
my $mit_score = shift(@ARGV);
# "Treppen" von Alignace grillen
my $grill = shift(@ARGV);
# Angabe ob das Label das Programm oder die  der Tiername sein
my $tierein = shift(@ARGV);
my $dir_pattern =  $mit_score.$grill.$tierein;
mkdir("xmgrace".$dir_pattern);
my $score_file;
my $out;
my $outdatei;
my $reihenfolge;

foreach $score_file (@ARGV){
	my @dateiname;
	@dateiname = split(/\./,$score_file);
	$out ="@    s0 legend  \"".$dateiname[0]."\"\n";
	pop(@dateiname); push(@dateiname,"grace");
	$outdatei = join('.',@dateiname);
	open(FI,"< $score_file") or die "error by opening input file";
	$out = &scorecalc($out);
	open(FO,"> ".$reihenfolge.$outdatei) or die "error by opening output file";
	print FO $out;
	system("xmgrace ".$reihenfolge.$outdatei." -hardcopy -printfile xmgrace".$dir_pattern."/$outdatei.ps");
	close(FI);
	close(FO);
}
&mehrere;
&vergleichen;

# grace verschieben
if(!(-e "./grace".$dir_pattern)) {
	print ("\n*** \"grace".$dir_pattern."\" exisitert noch nicht, wird erzeugt!\n\n");
	system("mkdir grace".$dir_pattern);
	}
system("mv *.grace grace".$dir_pattern);

sub scorecalc{
	my $out = $_[0];
	my @cwlines = <FI>;
	chop @cwlines;
	my @start;
	my @stop;
	my @score;
	my %dubletten=();
	my $cwline;
	my $j = 0;
	my $prog;
	my $tier;
	foreach $cwline (@cwlines){
		$dubletten{$cwline}++;
		#this entdfernd dubledden ;o)
		if($dubletten{$cwline} > 1){
			print "dubledden weg\n";
			next;
		}
		my @zwischen = split(/\t/,$cwline);
		$start[$j] = $zwischen[0];
		#print $start[$j]."\n";
		$stop[$j] = $zwischen[1];
		$prog = $zwischen[5];
		$tier = $zwischen[7];
		$score[$j] = $zwischen[2];
		if($prog =~ /meme/i){ #  Logaritmus
			$score[$j] = (((substr($zwischen[2],-2,2)) * 10));
			$reihenfolge = 2;
		}
		if($prog =~ /alignace/i){
			#$score[$j] = $zwischen[2];
			$score[$j] = (sprintf("%.0f", $zwischen[2]));
			$reihenfolge = 0;
		}
		if($prog =~ /biop/i){
			#$score[$j] = (($zwischen[2] * 1000)-1950);
			#neue webinterface bioprospector
			$score[$j] = (($zwischen[2] * 1000)-2400);
			$reihenfolge = 1;
		}
		if($prog =~ /pwmatch/i){
			#$score[$j] = ($zwischen[2] * 10);
			$score[$j] = (int($zwischen[2] * 10));
			$reihenfolge = 5;
		}
		if($prog =~ /tfsearch/i){
			$score[$j] = ($zwischen[2] * 100);
			$reihenfolge = 4;
		}
		if($prog =~ /ymf/i){
			$score[$j] = ((sprintf("%.0f", $zwischen[2]))*3);
			$reihenfolge = 3;
		}
		$j++;
	}
	# Grillen von Treppen
	if($prog =~ /alignace/i && $grill == 1) {
		my %intervall = ();
		my %score_hash = ();

		for(my $l=0;$l<=@start;$l++)  {
			# mit Motivl�ge
			#if($intervall{$start[$l]} < $stop[$l]) {

			# mit Score
			if($score_hash{$start[$l]} < $score[$l]) {
				$intervall {$start[$l]} = $stop[$l];
				$score_hash {$start[$l]} = $score[$l];
			}

		}
		@start = ();
		@stop = ();
		@score = ();
		my $m =0;
		foreach my $hashkey (keys(%intervall)) {
			$start[$m] = $hashkey;
			$stop[$m] = $intervall{$hashkey};
			$score[$m] = $score_hash{$hashkey};
			#print "key: $hashkey, value: $intervall{$hashkey}\n";
			$m++;
		}

	}
	$out .= "#".$prog."\t".$tier."\n";
	$out .= "&\n";
	my $length = @start;
	my $k;
	for(my $i=0; $i <= 500; $i++){
		my $tempscore = 0;
		for($k = 0; $k < $length; $k++){
			if($start[$k] <= $i && $stop[$k] >= $i){
				if($mit_score == 1){
					$tempscore += $score[$k];
				}
				else{$tempscore++;}
			}
		}
		$out .= $i." ".$tempscore."\n";
	}
	return $out;
}
sub mehrere{
	$out = "";
	my @data_datein = glob "*.data";
	my $outanf = "";
	my $k = 0;
	my $prog;
	my $tier;
	my @grace_datein = glob "*.grace";
	foreach my $file (@grace_datein){
		if($file eq "all".$dir_pattern.".grace" || $file eq "vergleich.grace"){
			#print "ja\t".$file."\n";
		}
		else{
			#print "nein\t".$file."\n";
			open(FI,"< $file") or die "error by opening input file";
			open(FO,"> all".$dir_pattern.".grace") or die "error by opening output file";
			my @lines = <FI>; chop @lines; my $line;
			foreach $line (@lines){
				if($line =~ /#/){
					my @z = split(/\t/,$line);
					$prog = substr($z[0],1,10);
					$tier = $z[1];
					$tier = substr($tier, 0 , index($tier,'.'));
					print $tier."\n";
					if($tierein == 1){
						$outanf .= "@    s".$k." legend  \"".$tier."\"\n";
					}
					else{
						$outanf .= "@    s".$k." legend  \"".$prog."\"\n";
					}
					$k++;
				}
				if($line =~ /@/){
				}
				else{
					$out .= $line."\n";
				}
			}
		}
	}
	$out = $outanf.$out;
	print FO $out;
	close(FO);
	system("xmgrace all".$dir_pattern.".grace -hardcopy -printfile xmgrace".$dir_pattern."/all".$dir_pattern.".ps");
}
sub vergleichen{
	open(FI,"< all".$dir_pattern.".grace") or die "error by opening input file";
	open(FO,"> vergleich".$dir_pattern.".grace") or die "error by opening output file";
	$out = "";
	my @array;
	foreach my $text (<FI>){
		chomp($text);
		my $sub = substr($text,0,1);
		if($sub ne "#" && $_ ne "&" && $sub ne "@"){
			my @zahl = split(/ /, $text);
			$array[$zahl[0]] += $zahl[1];
		}
	}
	for(my $i = 0; $i <=500; $i++){
		$out .= $i." ".$array[$i]."\n";
	}
	print FO $out;
	close(F0);
	close(FI);
	system("xmgrace vergleich".$dir_pattern.".grace -hardcopy -printfile xmgrace".$dir_pattern."/vergleich".$dir_pattern.".ps");
}
