//Fensteralgo4.java // erzeugt File Namens Beta.txt mit den Beta-Werten von
// 2 Vorgegebenen Strings (String x ist eine selbst generierte Sequenz (zufaellig gleichverteilte A,G,C,Ts),
// String y aus echter CpG-Insel 312 Basen lang;
// Sequenz wird mit "Fenstermethode" durchlaufen
// Beta.txt kann im Excel als Plott dargestellt werden. Übergänge zwischen den verschiedenen 
// Sequenzen sichbar


import java.io.*;

class Fensteralgo4 {
	    static String x="aaagatatcgtgtactcagcgttgtcgagacagggaaatctactactagaaatgcgatcttgggcggttgagtgcgcataaagcggtagtggaacgccgccttaatccgatatcatctttcggccagtacctgtcatatattgacagcccggttaatgcaagtatccttctacccagcaacccaaccagcgtctgcttgatcaccctggcagacagggctgcggtacctgctttttcacctcacgctgtttgcaaaatttcgatacaaccgcttctaaggtcaaagttgagaatgctccaatccatgattccagtagtgaagcgcaaaaccggtgacagctgcgtcactccttttagcttgtcgacggctcgacaggacctaatggacttctacgtcaggaaacgctttggagttgtggaactgaaatcttgaattatctttacactcggttgaccgcggccagatgtcggtccacttgctatctaggttgttgcttgttgacgaaggatagagcgatccgggatggtacttgccggctgcaagcgggatgggtacgcgtactccgtgatactggagacgagagaacgtccccgggtggagaaaggaagtaccacgtctcccggataggttgcttaattgttgttaaccctgttttccaccatcgcgagctcacctgcggtaaagttatacccagtgagccggttatccgacttcaatcgaagtccatccacccctcggcttagtcgtttatataatctgcctgtcctcataacagtgtatttactataggctgtaggtcagaccgcgtcgctttcacacctccaaatatcagtgactcgcgaactgtgtgaaatagaattgcgcgtagagggactgtggcacactattgggagaagtcttgctggaaccgcgtgcgctctccaaatacgcggtttgggggtgcggtgccatcgcgaaagtgaggagtccgtgttcttcgaacgcattccgactacaggcgagcctcagtcttgctgccatgtagttaccagcggtagtgcaggctgtacgcgctgggatgcttaccgaacatcaacgcaaaatagctctgccaatggtcagaaaggagctaaagtcgagttagtcaagcaattccaccaaaacgaatcgggttcagtagatctgtttttggcgagacgatcacgtttcctaccatcagagtcttgagacgtaatccctcgcagcgcactatggcgcgcagacaggtacgtccgcaatccagggcggagcatactctgtccggtgcaccgcatgattccttcacagaagagccgacccgatacctatccctgagttccaccatttccccggtgcaaaggaaacgtaccccgtggcgaagtcacgcccgattcttccattcatatcagccggcgcgtccactaccttgtggttatgagcatgctaagttggtctactgcaattgcccgttgagggtatctcgacttgtcatacggcgcaaattattaggatcaactttgatcttaaaatccacttaccagaagctgtgcgcttcgtaaggtaccgaccgccgaaagagttccgcaccaacatagggcggagaaggagtcacatcatctttgcgttccatatacgtggccctattaggattaaacaacgataccctctttaatgcgctggttcctaaccgggtcggcggctgcgttcaccaaggtttataccgggtagacaagtaccctctctgcagcccaggtctagggctttcgatgtgactcgggacgcggttacctgtgcgtgtaatgatcactgacacttcttccgataagaaaccatacttatctagtgcagttcctcaaacgtcaccagcgagcgaaggtcagcaagtcccgacaaacgggatgtccccactaaaaccccccaaaacccgtaccaacagccactgccgtttaccaatgccgtctttgaagagcagtacaatagtcgtggctttcgctcaacttga";
		static String y="ataggagaaggctctgttggcagaagacctaagagacgggaggaggcgcctggcgtcagcgggtcgcttctcagccgtgaccacgagcggccagcaggtgtcagtgcgtcctcgctttgccctggcgctcggctcctggacccctccccacctcggtctaagggggcgcggtccagaccccgggtcttgcgtttcccgcagacagcatcgcggctgggaggacacgtagccgcttcttcc ctaagcggaggtctgaactccggcttgtaccacttccccgtgggtgctgtccattccgcc ccaggggttc";	
	
		
	static public void main (String[] args){
		int i=0, j=0;
		float[][] a1, a2;
		float[][] a3=new float[4][4];
		
		System.out.println(x.length());
		System.out.println(y.length());
		
		float Beta=BerechneBeta(x,y); //ruft Mehtode BerechneBeta() auf und uebergibt String x und y
		
		FileWriter fw; //Bereitet Ausgabe in File vor
		try{ 			
			fw=new FileWriter("Beta.txt"); //File name : Beta.txt
	
			// "Fensteralgorithmus
			String d=x+y+x;
			int nWin =300; //Fensterbreite
			for (i=nWin; i<d.length()-nWin; i++) {
				String sLeft=d.substring(i-nWin,i);
				String sRight=d.substring(i,i+nWin);
				float b = BerechneBeta(sLeft,sRight);
				//System.out.println(i+" "+b);
				fw.write(i+" "+b+"\n");
			}
		fw.close();
		} // end try 
		catch (FileNotFoundException e) {}
		catch(IOException e){}

		} // end main


		static public float BerechneBeta(String x, String y) {
			int i=0, j=0;
			float [][] a1, a2;
			float[][] a3=new float[4][4];
		
			a1 = CpGMatrix(x); //uebergibt String x an CpGMatrix(String z)
		
			a2 = CpGMatrix(y); //uebergibt String y an CpGMatrix(String z)
		
			//Vergleich beider Matrices
			//System.out.println("Beta-Matrix:");
				for (i=0; i<4; i++){
					for (j=0;j<4;j++){
						if (a1[i][j]*a2[i][j]>0) // Abfangen von 0 Werten für a1 und a2
						a3[i][j]=(float)Math.log((double)(a1[i][j]/a2[i][j]));
					else
						a3[i][j]=0;
					//	System.out.print(a3[i][j] + " ");
					}
					//	System.out.println();
				}
		
		
			// Berechne Summe aller Einträge aus der Beta-Matrix
			float BETA=0;
				for (i=0; i<4; i++){
					for (j=0;j<4;j++){
						BETA=BETA + a3[i][j];
					}
				} //System.out.println();
					//System.out.println("BETA-Wert: " + BETA);
		
			return BETA;
		}//end BerechneBeta()
	
	
	
	// erzeugt Matrix augrund der Haeufigkeitsverteilung der 16 moeglichen Basenkombinationen	
	public static float[][] CpGMatrix(String z) {
		int ix, i,j, hori=0,  verti=0;
			float[][] aij=new float[4][4];
				for (i=0; i<4; i++){
					for (j=0;j<4;j++) {aij[i][j]=0;}
				}
		
				// 2 Matrixen mit der folgenden Belegung werden erzeugt	
				/*	0	1	2	3 Dies Zeile und die 1.Spalte werden nicht geschrieben
				0	aa	ac	ag	at
		 		1	ca	cc	cg	ct	
		 		2	ga	gc	gg	gt
		 		3	ta	tc	tg	tt
				*/
		
			for (ix=0; ix<z.length()-1; ix++){
				if (z.charAt(ix)=='a'){hori=0;} //Schreibt 'a' in horizontal 0 fur Matrix aij um
				if (z.charAt(ix)=='c'){hori=1;} //Schreibt 'c' in horizontal 1 fur Matrix aij um
				if (z.charAt(ix)=='g'){hori=2;} //Schreibt 'g' in horizontal 2 fur Matrix aij um
				if (z.charAt(ix)=='t'){hori=3;} //Schreibt 't' in horizontal 3 fur Matrix aij um

				if (z.charAt(ix+1)=='a'){verti=0;} //Schreibt 'a' in vertikal 0 fur Matrix aij um
				if (z.charAt(ix+1)=='c'){verti=1;}
				if (z.charAt(ix+1)=='g'){verti=2;}
				if (z.charAt(ix+1)=='t'){verti=3;}
				
				aij[hori][verti] = aij[hori][verti] + 1.0f; //für jede Kombination zaehle Eintraege hoch
				}
			
		// Ausgabe der Anzahl der gefundenen AS-Paare in Tabelle	
		//System.out.println("Anzahl der gefundenen AA-Paare");
		//for (i=0; i<4; i++){
		//	for (j=0;j<4;j++) {	
			//	System.out.print(aij[i][j] +" ");
		//} //System.out.println();
		// }
					
		float sum;		//Summe ueber alle Ereignisse pro Zeile	
			for (i=0; i<4;i++) {
				sum=0.0f;
				for (j=0;j<4;j++) {	 //1. Zeiledurchlauf für Summenbildung
					sum = sum + aij[i][j];
				}
				if (sum==0)
					sum = 1.0f; //Abfangen der 0
				//System.out.println(i + " " + sum);	
				for (j=0;j<4;j++) {	         // 2. Zeilendurchlauf für Normierung auf 1;			
					aij[i][j]=aij[i][j]/sum; // berechnen der Wahrscheinlichkeit
				}	
			}

		//System.out.println();
		//System.out.println("Uebergangswahrscheinlichkeiten Array");
		//for (i=0; i<4; i++){
		//	for (j=0;j<4;j++) {	
			//	System.out.print(aij[i][j] +" ");
		//	} System.out.println();
		//}	//System.out.println();
		 
			return aij;
	} // end CpGMatrix(String z)
	
}//end class
