/* * 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; import java.util.Arrays; import java.util.BitSet; import java.util.List; import jalview.util.ColorUtils; import jalview.ws.datamodel.MappableContactMatrixI; public interface ContactMatrixI { ContactListI getContactList(int column); float getMin(); float getMax(); String getAnnotDescr(); String getAnnotLabel(); /** * string indicating how the contactMatrix should be rendered - stored in * calcId * * @return */ String getType(); int getWidth(); int getHeight(); 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 boolean hasGroups() { return hasGroupSet() && getGroupSet().hasGroups(); } default BitSet getGroupsFor(int column) { if (!hasGroupSet()) { BitSet colbitset = new BitSet(); colbitset.set(column); return colbitset; } return getGroupSet().getGroupsFor(column); } 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 hasGroupSet() ? getGroupSet().getNewick() : null; } default String getTreeMethod() { return hasGroupSet() ? getGroupSet().getTreeMethod() : null; } default boolean hasCutHeight() { return hasGroupSet() ? getGroupSet().hasCutHeight() : false; } default double getCutHeight() { return hasGroupSet() ? getGroupSet().getCutHeight() : 0; } default void updateGroups(List colGroups) { if (hasGroupSet()) { getGroupSet().updateGroups(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 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); }