import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.*; public class Mrg2sig extends Thread{ // Variablen String datei; int pmmm, bg; Thread t; // Hashmap für Werte Syntax: Atom_PM/MM [werte] String[] copy; HashMap gene = new HashMap (); // Einlesen mrg Zeilenweise und einordnen in Hashtable @SuppressWarnings("unchecked") //Modifizierter Start public void start(Thread th) { this.t = th; super.start(); } // Konstruktor // Start Parameter: Dateiname zum Einlesen, Verfahren (1 = PM-MM, 2 = PM), BG bearbeitet (1) oder nicht (2) public Mrg2sig(String datei, int pmmm, int bg) { this.datei = datei; this.pmmm = pmmm; this.bg = bg; } // Modifizierte Run public void run() { if(t != null) { try{t.join();t = null;} catch(InterruptedException e) {} } try { int wo = datei.indexOf("."); String nuname = datei.substring(0,wo); if(bg == 1){datei = nuname+"minbg.mrg";} else if(bg == 2){datei = nuname+"celcdf.mrg";} nuname = nuname +"_m2s.mrg"; readmrg(datei); if(pmmm == 1){calculate(nuname);} else{only_pm(nuname);} } catch (IOException e) { e.printStackTrace(); } catch (Exception es) { es.printStackTrace(); } Stammfenster.progress.setValue(Stammfenster.progress.getValue()+5); } public void readmrg(String datei) throws IOException { System.out.println("ReadMRG..."+datei); String line = "", gen = "", pf = "", atom = "", mean = ""; // READ BufferedReader mrg = new BufferedReader(new FileReader(datei)); while(line != null) { Pattern pat = Pattern.compile("\\d+\\t+\\d+\\t+(\\d+)\\.\\d+\\t+(\\S+)\\t+(\\d+)\\t+\\w\\t+\\w\\t+\\w\\t+(\\w+)");//("\\d+\\s+\\d+\\s+(\\d+)\\s+(\\w+)\\s+(\\d+)\\s+\\w\\s+\\w\\s+\\w\\s+(\\w+)"); Matcher mat = pat.matcher(line); if(mat.find()) { //System.out.println("ESMATCHT!"); mean = mat.group(1); gen = mat.group(2); atom = mat.group(3); pf = mat.group(4); // Kommt ein Name zum ersten Mal vor, neuen Index erstellen if(!gene.containsKey(gen+'@'+pf)) { gene.put(gen+'@'+pf,new ArrayList()); gene.get(gen+'@'+pf).add(atom +"@"+ mean); } // Sonst die Werte zur Liste hinzufügen else { gene.get(gen +'@'+ pf).add(atom +'@'+ mean); } } line = mrg.readLine(); } } // Nur PM verwenden public void only_pm(String output) { // WRITE try {PrintWriter daten = new PrintWriter(output); ArrayList pm; String[] atmeanPM = new String[2]; String ind; double numean; int count; ArrayList s2sn = new ArrayList(); // Einlesen nach Einträgen for(String aKey : gene.keySet()) // Alle Indices durchgehen { // Wenn PM dann übernehmen if(aKey.endsWith("@PM")) { // pm-Werte aus der Arraylist des Gens übertragen in ArrayList pm pm = new ArrayList(); pm = gene.get(aKey); // Endung entfernen ind = aKey.replace("@PM",""); ArrayList tmp = new ArrayList(); count = 0; for(String val : pm) { atmeanPM = val.split("@"); numean = Double.parseDouble(atmeanPM[1]); if(numean > 0 && numean < 10){numean = 10;} if(numean > 0) { tmp.add(new String(numean+"")); count++; break; } } String[] tmpp = new String[tmp.size()]; // Wichtig mit toArray(Objekt) absichern! tmp.toArray(tmpp); // daten.println(ind+"\t"+median(tmpp)); s2sn.add(ind+"@"+median(tmpp)); pm.clear(); tmp.clear(); tmpp = null; } } // Sig2Signorm String[] tmpp = new String[s2sn.size()]; s2sn.toArray(tmpp); daten.print(s2snorm(tmpp)); daten.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } // MM von PM abziehen public void calculate(String output) { // WRITE try {PrintWriter daten = new PrintWriter(output); ArrayList pm; ArrayList mm; String[] atmeanPM, atmeanMM; atmeanPM = new String[2]; atmeanMM = new String[2]; String ind; double numean; int count; ArrayList s2sn = new ArrayList(); // Einlesen nach Einträgen for(String aKey : gene.keySet()) // Alle Indices durchgehen { // Wenn PM dann passende MM suchen if(aKey.endsWith("@PM")) { pm = new ArrayList(); pm = gene.get(aKey); ind = aKey; ind = ind.replace("PM","MM"); mm = new ArrayList(); mm = gene.get(ind); ArrayList tmp = new ArrayList(); count = 0; for(String val : pm) { atmeanPM = val.split("@"); for(String val2 : mm) { atmeanMM = val2.split("@"); // Wenn die Atome übereinstimmen if(atmeanPM[0].equals(atmeanMM[0])) { // Neuen Wert ausrechenen PM-MM numean = Double.parseDouble(atmeanPM[1]) - Double.parseDouble(atmeanMM[1]); if(numean > 0 && numean < 10){numean = 10;} if(numean > 0) { tmp.add(new String(numean+"")); count++; break; } } } } ind = ind.replace("@MM",""); String[] tmpp = new String[tmp.size()]; // Wichtig mit toArray(Objekt) absichern! tmp.toArray(tmpp); // daten.println(ind+"\t"+median(tmpp)); s2sn.add(ind+"@"+median(tmpp)); mm.clear(); pm.clear(); tmp.clear(); tmpp = null; } } // Sig2Signorm String[] tmpp = new String[s2sn.size()]; s2sn.toArray(tmpp); daten.print(s2snorm(tmpp)); daten.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } // Median public double median(String[] values) { double numean = 0; int cou = 0; double[] kase = new double[values.length]; for(String m: values) { try{kase[cou] = Double.parseDouble(m);cou++;} catch(Exception e){} } // Sortieren Arrays.sort(kase); // Gerade if(kase.length > 0) { if(kase.length % 2 == 0 || kase.length == 1) { numean = kase[kase.length/2]; } // Ungerade else { int ind1, ind2; ind1 = (int)(kase.length/2)-1; ind2 = (int)(kase.length/2); numean = ((kase[ind1]) + (kase[ind2]))/2; } } return(numean); } //Sig2Signorm public String s2snorm(String tmpp[]) { String[] copy = new String[2]; String[] index = new String[tmpp.length]; String[] s2s = new String[tmpp.length]; String[] cop = new String[tmpp.length]; int za = 0; for(String bla:tmpp) { copy = bla.split("@"); index[za] = copy[0]; s2s[za] = copy[1]; za++; copy = null; } double anz = 0; cop = s2s.clone(); // Median aller Mediane berechnen anz = median(cop); za = 0; String out = "Normierung: " +anz+" \ns2s: "+s2s.length +"\ntmpp: "+tmpp.length +"\n"; for(String va:s2s) { try{double nuu = Double.parseDouble(va); nuu = nuu/anz; //if(nuu < 0){nuu = 10;} //else{ nuu = (nuu)*200; //} out += index[za] +"\t"+ nuu +"\n"; za++; }catch(Exception e){} } return(out); } }