#!/usr/bin/perl

use Switch;

#Dieses tolle kleine Skript soll eine Fastadatei an YMF senden, die ersten n Ergebnisse runterladen
#und dann ueber einen einfachen Stringmatch guggn an welchen Positionen das Teil letztendlich sitzt
#ACHTUNG: Die Matritzengeschichte wird nicht erstellt!

#INPUT: Fastadatei Anzahlmotifs Organismus
#wird noch was an 4. stelle geschrieben, dann kommen DEBUG/hinweis ausgaben wenn auch sehr wenige
#OUTPUT: Start Ene YMFScore motif_#	YMF	-	Sequenz

$action="http://wingless.cs.washington.edu/YMF/YMFWeb/YMFInput.pl";

$verbose=0;
if(@ARGV==4){$verbose=1;}

if( (@ARGV < 2) || (@ARGV >4)) { print "INPUT: FASTADATEI AnzahlMotive ORGANISMUS\n organismen: 
	 SC=Saccharomyces cerevisiae
	 CE=Caenorhabditis elegans
	 HS=Homo sapiens
	 AT=Arabidopsis thaliana
	 MM=Mus musculus
	 At=Agrobacterium tumefaceiens C58 UWash
	 EC=Escherichia coli K12
	 HI=Haemophilus influenzae
	 MJ=Methanococcus jannaschi
	 MT=Mycobacterium tuberculosis
	 DM=Drosophila melanogaster (EPD)
	 MG=M. grisea\n
Um noch irgendwelchen Kram sich anzuguggn einfach noch nen letzten Paramter eingeben, dabei werden auch die Dateien die temporaer erstellt werden nicht geloescht, was zum debuggen genutzt wird, ACHTUNG da wget genutzt wird welches brav neue Nummern an die dateien hinten dranschreibt, muss man manuell die NEU enstandenen Dateien LOESCHEN!! sonst gibts keine anderen Ergebnisse

ACHTUNG, fuer die DEBUGausgabe muss auch noch der Organismus angegeben werden, da das Skript nach Anzahl nicht nach Art geht!
StandardOrganismus ist Menschi

Hinweis: Die Fastadatei sollte im Namen der >VIEHNAME  keine Leerzeichen oder > weiterhin haben, da alles rausgekickt wird bis auf das letzte WORT nach / oder Leerzeichen\n";}

#normalisieren der Fastadatei...jaja fuer meine Daten wohl am ehesten Gedacht, sollte keinen Schaden bei anderen anrichten:

open(INPUT,"$ARGV[0]") || die "Die Datei $ARGV[0] gibts nicht zum oeffnen";
@lines = <INPUT>;
close(INPUT);

open (OUTPUT, ">$ARGV[0].tmp_fa");
$count=0;

foreach $line(@lines) {
        if ( $line =~ /^>.*/) {
                chomp($line);
                $name= ($line =~ /([^\/> ]*)$/)[0];
                if ($count == 0){
                        print OUTPUT ">$name\n";
                }
                else { print OUTPUT "\n>$name\n";
                }
                $count++;
        }
        else {  
                chomp($line);
                print OUTPUT $line;
        }
}


#senden an den WEBserver mittels wget

$org="human";

if(@ARGV > 2){

	switch($ARGV[2]){
		case "SC" {$org="yeast";break;}
		case "CE" {$org="celegans";break;}
		case "AT" {$org="athaliana";break;}
		case "MM" {$org="mouse";break;}
		case "At"{	$org="agrobacterium_UWash";break;}
		case "EC"{	$org="ecoli_K12";break;}
		case "HI"{	$org="hinfluenzae";break;}
		case "MJ"{	$org="mjannasachii";break;}
		case "MT"{		$org="mtuberculosis";break;}
		case  "DM"{		$org="dmelepd";break;}
		case  "MG" {$org="mgrisea";break;}
		else 	{$org="human";break;};
	}
}

$q="-q";
if($verbose){$q="";}

system("wget $q --post-data \"program=ymf&motifsize=8&spacersize=0&jokersize=0&organismname=${org}&sequences=`cat $ARGV[0].tmp_fa`\" $action");

$url=`grep "results.txt.*Get" YMFInput.pl`;
$url=($url=~ /^.*blank.*href="([^"]*)".*/)[0];

system("rm YMFInput.pl");

system("wget $q $url");
$file=((split("/", $url))[-1]);
if($verbose){print "DIE DATEI: $file\n";}

open(INPUT,$file) || die "IRGENDWO ist ein Fehler ...aufm server oder im skrip";


#so wir gehen jetzt brav jedes Sequenz durch, die der uns ausgespuckt hat, nat. wird dabei gezaehlt ob wir n schon erreicht haben

open(FASTA,"$ARGV[0].tmp_fa") || die "skriptfehler\n";
@fasta= <FASTA>;
chomp(@fasta);
close(FASTA);


$seq="";
$new=0;
$n=0;

while(<INPUT>){
	
	if($_=~ /^[ACGT]+/){
		$search=( (split(" ",$_))[0]);
		$new=1;#wir haben ein neues Motiv
		if($n == $ARGV[1]){goto RAUSAUSDERSCHLEIFE;} #logisch, weil so wuerden wir ja das naechste mal erhoehen und eins zu viel haben
		$score=( (split(" ",$_))[-1]);
		foreach $line(@fasta){
			if($line=~ /^>.*/){
				#print "$line\n";
				$seq=( $line=~ /^>(.*)/)[0];
			}
	
			$pos=0;
			while($pos !=-1){
				#print "DEBUG: $search	$n	$pos	$new\n"; 
				if($new==1){$n++;$new=0;};#wenn wir eine neue Sequenz haben und etwas gefunden, dann wird die Motivnummer erhoeht, und auf nicht mehr neu gesetzt
				$pos=index($line, $search,$pos);
				#print "$_ $pos\n"; 
				if($pos != -1){
                                        print ".";
                                        open ( OUTFILE , ">>$seq.ymf.data") || die ("Kann net data Datei anlegen: $seq.ymf.data");
                                        
                                        # Write forward motif
					print OUTFILE $pos."	".(length($search)+$pos - 1) . "\t$score\t$n\t$search\tymf\t1\t$seq\n";

                                        close ( OUTFILE);

					if($n > $ARGV[1]) { goto RAUSAUSDERSCHLEIFE;}
					$pos++ #ja, wichtig! sonst findet der die selbe stelle immer wieder!
				}
		  		
			}
			
			# Hier wird invertiert um die von YMF generierte Seq. in unserer
                        # fasta seq. zu finden. Das ist dann auch die Seq., die in die data 
                        # Datei mit eingeht.
			$invert= reverse($search);
			$invert=~ s/A/P/g;
			$invert=~ s/T/A/g;
			$invert=~ s/P/T/g;
			$invert=~ s/C/Q/g;
			$invert=~ s/G/C/g;
			$invert=~ s/Q/G/g;

			$pos=0;
                        while($pos !=-1){
				#print "DEBUG: $search	$n	$pos	$new\n"; 

				if($new==1){$n++;$new=0;};


			 	$pos=index($line, $invert,$pos);
			     	

			     	if($pos != -1){
                                        
                                        print ".";
                                        open ( OUTFILE , ">>$seq.ymf.data") || die ("Kann net data Datei anlegen: $seq.ymf.data");

                                        # Write reverse motif, the variable $invert corresponds to the seq. in the promoter,
                                        # The original seq. from which was reverse came from the ymf.
					print OUTFILE $pos."	".(length($invert) + $pos - 1) . "\t$score\t$n\t$invert\tymf\t0\t$seq\n";
				        
                                        close( OUTFILE);

                                     if($n > $ARGV[1]) { goto RAUSAUSDERSCHLEIFE;}
				     $pos++ #ja, wichtig! sonst findet der die selbe stelle immer wieder!
			     	}
                        }
		}
	}
}

RAUSAUSDERSCHLEIFE:
close(INPUT);
system("rm $file");

print "\n";
exit;
