X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FContactMatrix.java;h=b8593d842fd8474487f96ae14e3fe4b6dea82e26;hb=b028e684c807365decd0c6e6111aa4bf368a6fa8;hp=fac1deee73cdda802f7259315e9e0d67e7904e8c;hpb=326540793e46af73aed8c7e69bd77a957eec86c1;p=jalview.git diff --git a/src/jalview/datamodel/ContactMatrix.java b/src/jalview/datamodel/ContactMatrix.java index fac1dee..b8593d8 100644 --- a/src/jalview/datamodel/ContactMatrix.java +++ b/src/jalview/datamodel/ContactMatrix.java @@ -1,12 +1,33 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * 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 + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.datamodel; -import jalview.ws.params.InvalidArgumentException; - -import java.awt.Color; import java.util.ArrayList; import java.util.List; +import java.util.StringTokenizer; + +import jalview.bin.Console; -public class ContactMatrix implements ContactMatrixI +public abstract class ContactMatrix extends GroupSetHolder + implements ContactMatrixI { /** * are contacts reflexive ? @@ -28,7 +49,7 @@ public class ContactMatrix implements ContactMatrixI { if (left < 0 || right < 0) { - throw new Error(new InvalidArgumentException( + throw new Error(new RuntimeException( "Cannot have negative indices for contact left=" + left + " right=" + right + " strength=" + strength)); } @@ -74,13 +95,6 @@ public class ContactMatrix implements ContactMatrixI } } - Color minColor = Color.white, maxColor = Color.magenta; - - Color shadeFor(float value) - { - return jalview.util.ColorUtils.getGraduatedColour(value, 0, - Color.white, max, Color.magenta); - } @Override public ContactListI getContactList(final int column) { @@ -88,78 +102,155 @@ public class ContactMatrix implements ContactMatrixI { return null; } - return new ContactListI() + + return new ContactListImpl(new ContactListProviderI() { int p = column; @Override - public Color getColorForScore(int column) + public int getPosition() { + return p; + } + + @Override + public int getContactHeight() + { + return width; - return shadeFor((float) getContactAt(column)); } @Override - public Color getColorForRange(int i, int j) + public double getContactAt(int column) { - double contc; - double v = 0; - for (int r=i;r clist; + Float cl = null; + if (symmetric) + { + if (p < column) { - return 1; + clist = contacts.get(p); + cl = clist.get(column); } - - @Override - public int getContactHeight() + else { - return width; - + clist = contacts.get(column); + cl = clist.get(p); } + } + else + { + clist = contacts.get(p); + cl = clist.get(column); + } + return cl; + } - @Override - public double getContactAt(int column) + @Override + public double getElementAt(int column, int row) + { + Float cl = getFloatElementAt(column, row); + if (cl != null) + { + return cl; + } + throw (new RuntimeException("Out of Bounds " + column + "," + row)); + } + + @Override + public float getMin() + { + return min; + } + + @Override + public float getMax() + { + return max; + } + + @Override + public String getAnnotLabel() + { + return "Contact Matrix"; + } + + @Override + public String getAnnotDescr() + { + return "Contact Matrix"; + } + + public static String contactToFloatString(ContactMatrixI cm) + { + StringBuilder sb = new StringBuilder(); + for (int c = 0; c < cm.getWidth(); c++) + { + ContactListI cl = cm.getContactList(c); + long lastsb = -1; + if (cl != null) { - List clist; - Float cl = null; - if (symmetric) + for (int h = 0; h <= cl.getContactHeight(); h++) { - if (p < column) - { - clist = contacts.get(p); - cl = clist.get(column); - } - else + if (sb.length() > 0) { - clist = contacts.get(column); - cl = clist.get(p); + if (sb.length() - lastsb > 320) + { + // newline + sb.append('\n'); + lastsb = sb.length(); + } + else + { + sb.append('\t'); + } } + sb.append(cl.getContactAt(h)); } - else - { - clist = contacts.get(p); - cl = clist.get(column); - } - if (cl == null) - { - // return 0 not NaN ? - return Double.NaN; - } - return cl.doubleValue(); } - }; + } + return sb.toString(); } + public static float[][] fromFloatStringToContacts(String values, int cols, + int rows) + { + float[][] vals = new float[cols][rows]; + StringTokenizer tabsep = new StringTokenizer(values, "" + '\t' + '\n'); + int c = 0, r = 0; + while (tabsep.hasMoreTokens()) + { + double elem = Double.valueOf(tabsep.nextToken()); + vals[c][r++] = (float) elem; + if (r >= vals[c].length) + { + r = 0; + c++; + } + if (c >= vals.length) + { + break; + } + } + if (tabsep.hasMoreElements()) + { + Console.warn( + "Ignoring additional elements for Float string to contact matrix parsing."); + } + return vals; + } }