1 package jalview.datamodel;
3 import java.math.BigInteger;
4 import java.util.ArrayList;
6 import java.util.Spliterator;
7 import java.util.StringTokenizer;
9 import jalview.bin.Console;
11 public abstract class ContactMatrix implements ContactMatrixI
14 * are contacts reflexive ?
16 boolean symmetric = true;
18 public ContactMatrix(boolean symmetric)
20 this.symmetric = symmetric;
23 List<List<Float>> contacts = null;
25 int width = 0, numcontacts = 0;
27 float min = 0f, max = 0f;
29 public void addContact(int left, int right, float strength)
31 if (left < 0 || right < 0)
33 throw new Error(new RuntimeException(
34 "Cannot have negative indices for contact left=" + left
35 + " right=" + right + " strength=" + strength));
49 // TODO: use sparse list for efficiency ?
50 contacts = new ArrayList<List<Float>>();
52 List<Float> clist = contacts.get(left);
55 clist = new ArrayList<Float>();
56 contacts.set(left, clist);
58 Float last = clist.set(right, strength);
59 // TODO: if last is non null, may need to recompute range
60 checkBounds(strength);
67 private void checkBounds(float strength)
80 public ContactListI getContactList(final int column)
82 if (column < 0 || column >= width)
87 return new ContactListImpl(new ContactListProviderI()
92 public int getPosition()
98 public int getContactHeight()
105 public double getContactAt(int column)
113 clist = contacts.get(p);
114 cl = clist.get(column);
118 clist = contacts.get(column);
124 clist = contacts.get(p);
125 cl = clist.get(column);
129 // return 0 not NaN ?
132 return cl.doubleValue();
138 public float getMin()
144 public float getMax()
150 public boolean hasReferenceSeq()
152 // TODO Auto-generated method stub
157 public SequenceI getReferenceSeq()
159 // TODO Auto-generated method stub
164 public String getAnnotLabel()
166 return "Contact Matrix";
170 public String getAnnotDescr()
172 return "Contact Matrix";
175 public static String contactToFloatString(ContactMatrixI cm)
177 StringBuilder sb = new StringBuilder();
178 for (int c=0;c<cm.getWidth();c++)
180 ContactListI cl=cm.getContactList(c);
182 for (int h=0;h<=cl.getContactHeight();h++)
187 sb.append(cl.getContactAt(h));
191 return sb.toString();
194 public static float[][] fromFloatStringToContacts(String values, int cols,
197 float[][] vals = new float[cols][rows];
198 StringTokenizer tabsep = new StringTokenizer(values,""+'\t');
201 while (tabsep.hasMoreTokens())
203 double elem = Double.valueOf(tabsep.nextToken());
204 vals[c][r++]=(float) elem;
205 if (r>=vals[c].length)
216 if (tabsep.hasMoreElements())
218 Console.warn("Ignoring additional elements for Float string to contact matrix parsing.");