X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FStructureFrequency.java;h=32a4e29e7b57f7a70cfe906035778b54c0d430a9;hb=60403f610c291791bf7c58f9c7232206469687cd;hp=0c9f8308a4d329233f4f195bfbbe2c9daf324ed1;hpb=41b7d299a0bba7ed34fe40bd7fffa33e0bc2c4c1;p=jalview.git diff --git a/src/jalview/analysis/StructureFrequency.java b/src/jalview/analysis/StructureFrequency.java index 0c9f830..32a4e29 100644 --- a/src/jalview/analysis/StructureFrequency.java +++ b/src/jalview/analysis/StructureFrequency.java @@ -1,13 +1,13 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) - * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) + * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * + * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ + package jalview.analysis; import java.util.*; @@ -58,11 +59,15 @@ public class StructureFrequency */ public static int findPair(SequenceFeature[] pairs, int indice) { + System.out.print("indice"+indice+" "); for (int i = 0; i < pairs.length; i++) { if (pairs[i].getBegin() == indice) + { + System.out.println(pairs[i].getEnd()); return pairs[i].getEnd(); + } } return -1; @@ -83,15 +88,26 @@ public class StructureFrequency int end, Hashtable[] result, boolean profile, AlignmentAnnotation rnaStruc) { +// System.out.println("longueur="+sequences.length); +// for(int l=0;l<=(sequences.length-1);l++){ +// System.out.println("sequences "+l+":"+sequences[l].getSequenceAsString()); +// } +// System.out.println("start="+start); + System.out.println("end="+end); +// System.out.println("result="+result.length); +// +// System.out.println("profile="+profile); +// System.out.println("rnaStruc="+rnaStruc); Hashtable residueHash; String maxResidue; - char[] seq, struc = rnaStruc.getRNAStruc().toCharArray(); + char[] struc = rnaStruc.getRNAStruc().toCharArray(); SequenceFeature[] rna = rnaStruc._rnasecstr; char c, s, cEnd; - int count, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length; + int count = 0, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length; int[] values; int[][] pairs; float percentage; + boolean wooble = true; for (i = start; i < end; i++) // foreach column { @@ -100,9 +116,11 @@ public class StructureFrequency values = new int[255]; pairs = new int[255][255]; bpEnd = -1; + //System.out.println("s="+struc[i]); if (i < struc.length) { s = struc[i]; + } else { @@ -113,7 +131,7 @@ public class StructureFrequency s = '-'; } - if (s != '(') + if (s != '(' && s != '[') { if (s == '-') { @@ -122,7 +140,10 @@ public class StructureFrequency } else { + + bpEnd = findPair(rna, i); + if (bpEnd>-1) { for (j = 0; j < jSize; j++) // foreach row @@ -134,29 +155,42 @@ public class StructureFrequency continue; } c = sequences[j].getCharAt(i); - { + //System.out.println("c="+c); + // standard representation for gaps in sequence and structure if (c == '.' || c == ' ') { - c = '-'; - } - - if (c == '-') - { - values['-']++; + System.err + .println("WARNING: Consensus skipping null sequence - possible race condition."); continue; } cEnd = sequences[j].getCharAt(bpEnd); - if (checkBpType(c, cEnd)) + + + System.out.println("pairs ="+c+","+cEnd); + if (checkBpType(c, cEnd)==true) { values['(']++; // H means it's a helix (structured) + maxResidue = "("; + wooble=true; + System.out.println("It's a pair wc"); + } - pairs[c][cEnd]++; + if (checkBpType(c, cEnd)==false) + { + wooble =false; + values['[']++; // H means it's a helix (structured) + maxResidue = "["; + System.out.println("It's an pair non canonic"); + System.out.println(sequences[j].getRNA()); + System.out.println(rnaStruc.getRNAStruc().charAt(i)); + } + pairs[c][cEnd]++; + + + } - maxResidue = "("; - } - } } // nonGap++; } @@ -169,13 +203,18 @@ public class StructureFrequency residueHash.put(PAIRPROFILE, pairs); } - + if (wooble==true) + { count = values['(']; - + } + if (wooble==false) + { + count = values['[']; + } residueHash.put(MAXCOUNT, new Integer(count)); residueHash.put(MAXRESIDUE, maxResidue); - percentage = ((float) count * 100) / (float) jSize; + percentage = ((float) count * 100) / jSize; residueHash.put(PID_GAPS, new Float(percentage)); // percentage = ((float) count * 100) / (float) nongap; @@ -186,12 +225,19 @@ public class StructureFrequency } if (bpEnd > 0) { - values[')'] = values['(']; + values[')'] = values['(']; + values[']'] = values['[']; values['('] = 0; - + values['['] = 0; residueHash = new Hashtable(); - maxResidue = ")"; - + if (wooble==true){ + System.out.println(maxResidue+","+wooble); + maxResidue = ")"; + } + if(wooble==false){ + System.out.println(maxResidue+","+wooble); + maxResidue = "]"; + } if (profile) { residueHash.put(PROFILE, new int[][] @@ -204,7 +250,7 @@ public class StructureFrequency residueHash.put(MAXCOUNT, new Integer(count)); residueHash.put(MAXRESIDUE, maxResidue); - percentage = ((float) count * 100) / (float) jSize; + percentage = ((float) count * 100) / jSize; residueHash.put(PID_GAPS, new Float(percentage)); result[bpEnd] = residueHash; @@ -310,7 +356,8 @@ public class StructureFrequency } for (int i = iStart; i < width; i++) { - if (i >= hconsensus.length) + Hashtable hci; + if (i >= hconsensus.length || ((hci = hconsensus[i]) == null)) { // happens if sequences calculated over were shorter than alignment // width @@ -318,30 +365,31 @@ public class StructureFrequency continue; } value = 0; + Float fv; if (ignoreGapsInConsensusCalculation) { - value = ((Float) hconsensus[i].get(StructureFrequency.PID_NOGAPS)) - .floatValue(); + fv = (Float) hci.get(StructureFrequency.PID_NOGAPS); } else { - value = ((Float) hconsensus[i].get(StructureFrequency.PID_GAPS)) - .floatValue(); + fv = (Float) hci.get(StructureFrequency.PID_GAPS); } - - String maxRes = hconsensus[i].get(StructureFrequency.MAXRESIDUE) - .toString(); - String mouseOver = hconsensus[i].get(StructureFrequency.MAXRESIDUE) - + " "; + if (fv == null) + { + consensus.annotations[i] = null; + // data has changed below us .. give up and + continue; + } + value = fv.floatValue(); + String maxRes = hci.get(StructureFrequency.MAXRESIDUE).toString(); + String mouseOver = hci.get(StructureFrequency.MAXRESIDUE) + " "; if (maxRes.length() > 1) { mouseOver = "[" + maxRes + "] "; maxRes = "+"; } - int[][] profile = (int[][]) hconsensus[i] - .get(StructureFrequency.PROFILE); - int[][] pairs = (int[][]) hconsensus[i] - .get(StructureFrequency.PAIRPROFILE); + int[][] profile = (int[][]) hci.get(StructureFrequency.PROFILE); + int[][] pairs = (int[][]) hci.get(StructureFrequency.PAIRPROFILE); if (pairs != null && includeAllConsSymbols) // Just responsible for the // tooltip @@ -349,7 +397,9 @@ public class StructureFrequency { mouseOver = ""; - /* TODO It's not sure what is the purpose of the alphabet and wheter it is useful for structure? + /* + * TODO It's not sure what is the purpose of the alphabet and wheter it + * is useful for structure? * * if (alphabet != null) { for (int c = 0; c < alphabet.length; c++) { * tval = ((float) profile[0][alphabet[c]]) 100f / (float) @@ -366,7 +416,7 @@ public class StructureFrequency { ca[x] = new int[] { c, d }; - vl[x] = (float) pairs[c][d]; + vl[x] = pairs[c][d]; x++; } } @@ -377,7 +427,7 @@ public class StructureFrequency { if (vl[c] > 0) { - tval = ((float) vl[c] * 100f / (float) profile[1][ignoreGapsInConsensusCalculation ? 1 + tval = (vl[c] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1 : 0]); mouseOver += ((p == 0) ? "" : "; ") + (char) ((int[]) ca[c])[0] + (char) ((int[]) ca[c])[1] + " " + ((int) tval) + "%"; @@ -406,7 +456,7 @@ public class StructureFrequency public static int[] extractProfile(Hashtable hconsensus, boolean ignoreGapsInConsensusCalculation) { - int[] rtnval = new int[52]; // 2*(5*5)+2 + int[] rtnval = new int[74]; // 2*(5*5)+2 int[][] profile = (int[][]) hconsensus.get(StructureFrequency.PROFILE); int[][] pairs = (int[][]) hconsensus .get(StructureFrequency.PAIRPROFILE); @@ -424,7 +474,7 @@ public class StructureFrequency { ca[x] = new int[] { c, d }; - vl[x] = (float) pairs[c][d]; + vl[x] = pairs[c][d]; x++; } } @@ -438,9 +488,9 @@ public class StructureFrequency { rtnval[rtnval[0]++] = ((int[]) ca[c])[0]; rtnval[rtnval[0]++] = ((int[]) ca[c])[1]; - rtnval[rtnval[0]] = (int) ((float) vl[c] * 100f / (float) profile[1][ignoreGapsInConsensusCalculation ? 1 + rtnval[rtnval[0]] = (int) (vl[c] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1 : 0]); - rtnval[1]+=rtnval[rtnval[0]++]; + rtnval[1] += rtnval[rtnval[0]++]; } }