X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fdatamodel%2FContactMatrixI.java;h=ce4b0d7dfe45e52d2af83b552fb46bd423ff497a;hb=f1b00517fe5f888f3213d70270e27a83dffe1695;hp=3510ed135f9809b4dd8c5f2d060fffb2c6926f3a;hpb=b7e9e2edf0c1557089eff0e4b5c17c0b31e698c2;p=jalview.git
diff --git a/src/jalview/datamodel/ContactMatrixI.java b/src/jalview/datamodel/ContactMatrixI.java
index 3510ed1..ce4b0d7 100644
--- a/src/jalview/datamodel/ContactMatrixI.java
+++ b/src/jalview/datamodel/ContactMatrixI.java
@@ -1,3 +1,23 @@
+/*
+ * 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 java.awt.Color;
@@ -5,6 +25,9 @@ import java.util.Arrays;
import java.util.BitSet;
import java.util.List;
+import jalview.util.ColorUtils;
+import jalview.ws.datamodel.MappableContactMatrixI;
+
public interface ContactMatrixI
{
@@ -14,10 +37,6 @@ public interface ContactMatrixI
float getMax();
- boolean hasReferenceSeq();
-
- SequenceI getReferenceSeq();
-
String getAnnotDescr();
String getAnnotLabel();
@@ -33,47 +52,188 @@ public interface ContactMatrixI
int getWidth();
int getHeight();
-
- default boolean hasGroups() {
- return false;
+
+ public GroupSetI getGroupSet();
+
+ /// proxy methods to simplify use of the interface
+ /// Mappable contact matrices can override these to perform mapping
+
+ default public boolean hasGroupSet()
+ {
+ return getGroupSet() != null;
}
- default BitSet getGroupsFor(int column) {
- BitSet colbitset = new BitSet();
- colbitset.set(column);
- return colbitset;
+
+ default boolean hasGroups()
+ {
+ return hasGroupSet() && getGroupSet().hasGroups();
}
- default List getGroups() {
- return Arrays.asList();
+ default BitSet getGroupsFor(int column)
+ {
+ if (!hasGroupSet())
+ {
+ BitSet colbitset = new BitSet();
+ colbitset.set(column);
+ return colbitset;
+ }
+ return getGroupSet().getGroupsFor(column);
}
- default boolean hasTree() {
- return false;
+ default List getGroups()
+ {
+ if (!hasGroupSet())
+ {
+ return Arrays.asList();
+ }
+ return getGroupSet().getGroups();
+ }
+
+ default boolean hasTree()
+ {
+ return hasGroupSet() ? getGroupSet().hasTree() : false;
}
/**
* Newick representation of clustered matrix
+ *
* @return null unless hasTree is true
*/
- default String getNewick() {
- return null;
+ default String getNewick()
+ {
+ return hasGroupSet() ? getGroupSet().getNewick() : null;
+ }
+
+ default String getTreeMethod()
+ {
+ return hasGroupSet() ? getGroupSet().getTreeMethod() : null;
}
- default String getTreeMethod() {
- return null;
+ default boolean hasCutHeight()
+ {
+ return hasGroupSet() ? getGroupSet().hasCutHeight() : false;
}
- default boolean hasCutHeight() {
- return false;
+ default double getCutHeight()
+ {
+ return hasGroupSet() ? getGroupSet().getCutHeight() : 0;
}
- default double getCutHeight() {
- return 0;
+ default void updateGroups(List colGroups)
+ {
+ if (hasGroupSet())
+ {
+ getGroupSet().updateGroups(colGroups);
+ }
}
- void updateGroups(List colGroups);
+ default void setColorForGroup(BitSet bs, Color color)
+ {
+ if (hasGroupSet())
+ {
+ getGroupSet().setColorForGroup(bs, color);
+ }
+ }
+
+ default Color getColourForGroup(BitSet bs)
+ {
+ if (hasGroupSet())
+ {
+ return getGroupSet().getColourForGroup(bs);
+ }
+ else
+ {
+ return Color.white;
+ }
+ }
- void setColorForGroup(BitSet bs, Color color);
+ void setGroupSet(GroupSet makeGroups);
+
+ default void randomlyReColourGroups()
+ {
+ if (hasGroupSet())
+ {
+ GroupSetI groups = getGroupSet();
+ for (BitSet group : groups.getGroups())
+ {
+ groups.setColorForGroup(group, ColorUtils.getARandomColor());
+ }
+ }
+ }
+
+ default void transferGroupColorsTo(AlignmentAnnotation aa)
+ {
+ if (hasGroupSet())
+ {
+ GroupSetI groups = getGroupSet();
+ // stash colors in linked annotation row.
+ // doesn't work yet. TESTS!
+ int sstart = aa.sequenceRef != null ? aa.sequenceRef.getStart() - 1
+ : 0;
+ Annotation ae;
+ Color gpcol = null;
+ int[] seqpos = null;
+ for (BitSet gp : groups.getGroups())
+ {
+ gpcol = groups.getColourForGroup(gp);
+ for (int p = gp.nextSetBit(0); p >= 0
+ && p < Integer.MAX_VALUE; p = gp.nextSetBit(p + 1))
+ {
+ if (this instanceof MappableContactMatrixI)
+ {
+ MappableContactMatrixI mcm = (MappableContactMatrixI) this;
+ seqpos = mcm.getMappedPositionsFor(aa.sequenceRef, p);
+ if (seqpos == null)
+ {
+ // no mapping for this column.
+ continue;
+ }
+ // TODO: handle ranges...
+ ae = aa.getAnnotationForPosition(seqpos[0]);
+ }
+ else
+ {
+ ae = aa.getAnnotationForPosition(p + sstart);
+ }
+ if (ae != null)
+ {
+ ae.colour = gpcol.brighter().darker();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * look up the colour for a column in the associated contact matrix
+ *
+ * @return Color.white or assigned colour
+ */
+ default Color getGroupColorForPosition(int column)
+ {
+ if (hasGroupSet())
+ {
+ GroupSetI groups = getGroupSet();
+ for (BitSet gp : groups.getGroups())
+ {
+ if (gp.get(column))
+ {
+ return groups.getColourForGroup(gp);
+ }
+ }
+ }
+ return Color.white;
+ }
+
+ /**
+ * direct access to column and row position of matrix
+ *
+ * Implementations are allowed to throw RunTimeExceptions if _column/i are out
+ * of bounds
+ *
+ * @param column
+ * @param row
+ * @return
+ */
+ double getElementAt(int column, int row);
- default Color getColourForGroup(BitSet bs) { return Color.white;};
}