import jalview.analysis.Conservation;
import jalview.analysis.TreeModel;
import jalview.api.AlignViewportI;
+import jalview.bin.Console;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.Annotation;
import jalview.datamodel.BinaryNode;
import jalview.gui.JalviewColourChooser.ColourChooserListener;
import jalview.schemes.ColourSchemeI;
import jalview.structure.SelectionSource;
+import jalview.util.ColorUtils;
import jalview.util.Format;
import jalview.util.MessageManager;
import jalview.ws.datamodel.MappableContactMatrixI;
scrollPane = scroller;
addMouseListener(this);
addMouseMotionListener(this);
+
ToolTipManager.sharedInstance().registerComponent(this);
}
+ public void clearSelectedLeaves()
+ {
+ Vector<BinaryNode> leaves = tp.getTree()
+ .findLeaves(tp.getTree().getTopNode());
+ if (tp.isColumnWise())
+ {
+ markColumnsFor(getAssociatedPanels(), leaves, Color.white, true);
+ }
+ else
+ {
+ for (AlignmentPanel ap : getAssociatedPanels())
+ {
+ SequenceGroup selected = ap.av.getSelectionGroup();
+ if (selected != null)
+ {
+ {
+ for (int i = 0; i < leaves.size(); i++)
+ {
+ SequenceI seq = (SequenceI) leaves.elementAt(i).element();
+ if (selected.contains(seq))
+ {
+ selected.addOrRemove(seq, false);
+ }
+ }
+ selected.recalcConservation();
+ }
+ }
+ ap.av.sendSelection();
+ }
+ }
+ PaintRefresher.Refresh(tp, av.getSequenceSetId());
+ repaint();
+ }
/**
* DOCUMENT ME!
*
boolean has_placeholders = false;
longestName = "";
+ AlignmentAnnotation aa = tp.getAssocAnnotation();
+ ContactMatrixI cm = (aa!=null) ? av.getContactMatrix(aa) : null;
+ if (cm!=null && cm.hasCutHeight())
+ {
+ threshold=(float) cm.getCutHeight();
+ }
+
for (int i = 0; i < leaves.size(); i++)
{
BinaryNode lf = leaves.elementAt(i);
- if (lf instanceof SequenceNode && ((SequenceNode)lf).isPlaceholder())
+ if (lf instanceof SequenceNode && ((SequenceNode) lf).isPlaceholder())
{
has_placeholders = true;
}
longestName = TreeCanvas.PLACEHOLDER
+ ((Sequence) lf.element()).getName();
}
+ if (tp.isColumnWise() && cm!=null)
+ {
+ // get color from group colours, if they are set for the matrix
+ try {
+ Color col = cm.getGroupColorForPosition(parseColumnNode(lf));
+ setColor(lf,col.brighter());
+ } catch (NumberFormatException ex) {};
+ }
}
setMarkPlaceholders(has_placeholders);
* @param offy
* DOCUMENT ME!
*/
- public void drawNode(Graphics g, BinaryNode node, float chunk,
+ public void drawNode(Graphics g, BinaryNode node, double chunk,
double wscale, int width, int offx, int offy)
{
if (node == null)
g.drawString(nodeLabel, xstart + 2, ypos - 2);
}
- String name = (markPlaceholders && ((node instanceof SequenceNode && ((SequenceNode)node).isPlaceholder())))
- ? (PLACEHOLDER + node.getName())
- : node.getName();
+ String name = (markPlaceholders && ((node instanceof SequenceNode
+ && ((SequenceNode) node).isPlaceholder())))
+ ? (PLACEHOLDER + node.getName())
+ : node.getName();
int charWidth = fm.stringWidth(name) + 3;
int charHeight = font.getSize();
}
int ystart = (node.left() == null ? 0
- : (int) (((BinaryNode) node.left()).ycount * chunk)) + offy;
+ : (int) (node.left().ycount * chunk)) + offy;
int yend = (node.right() == null ? 0
- : (int) (((BinaryNode) node.right()).ycount * chunk))
- + offy;
+ : (int) (node.right().ycount * chunk)) + offy;
Rectangle pos = new Rectangle(xend - 2, ypos - 2, 5, 5);
nodeHash.put(node, pos);
if (top.count == 0)
{
- top.count = ((BinaryNode) top.left()).count
- + ((BinaryNode) top.right()).count;
+ top.count = top.left().count
+ + top.right().count;
}
float chunk = (float) (height - (offy)) / top.count;
else
{
Vector<BinaryNode> leaves = tree.findLeaves(highlightNode);
- if (tp.isColumnWise()) {
- markColumnsFor(getAssociatedPanels(), leaves, Color.red);
- } else {
- for (int i = 0; i < leaves.size(); i++)
+ if (tp.isColumnWise())
{
- SequenceI seq = (SequenceI) leaves.elementAt(i).element();
- treeSelectionChanged(seq);
+ markColumnsFor(getAssociatedPanels(), leaves, Color.red,false);
}
+ else
+ {
+ for (int i = 0; i < leaves.size(); i++)
+ {
+ SequenceI seq = (SequenceI) leaves.elementAt(i).element();
+ treeSelectionChanged(seq);
+ }
}
av.sendSelection();
}
threshold = 0f;
}
}
-
+ Console.log.debug("Tree cut threshold set at:" + threshold);
PaintRefresher.Refresh(tp,
getAssociatedPanel().av.getSequenceSetId());
repaint();
{
AlignmentPanel[] aps = getAssociatedPanels();
List<BitSet> colGroups = new ArrayList<>();
- Map<BitSet,Color> colors=new HashMap();
+ Map<BitSet, Color> colors = new HashMap();
for (int i = 0; i < groups.size(); i++)
{
- Color col = new Color((int) (Math.random() * 255),
- (int) (Math.random() * 255), (int) (Math.random() * 255));
+ Color col = ColorUtils.getARandomColor();
+
setColor(groups.get(i), col.brighter());
Vector<BinaryNode> l = tree.findLeaves(groups.get(i));
- if (!tp.isColumnWise()) {
+ if (!tp.isColumnWise())
+ {
createSeqGroupFor(aps, l, col);
- } else {
- BitSet gp=createColumnGroupFor(l,col);
+ }
+ else
+ {
+ BitSet gp = createColumnGroupFor(l, col);
colGroups.add(gp);
colors.put(gp, col);
if (tp.isColumnWise())
{
AlignmentAnnotation aa = tp.getAssocAnnotation();
- if (aa!=null) {
+ if (aa != null)
+ {
ContactMatrixI cm = av.getContactMatrix(aa);
- if (cm!=null)
+ if (cm != null)
{
cm.updateGroups(colGroups);
- for (BitSet gp:colors.keySet())
+ for (BitSet gp : colors.keySet())
{
cm.setColorForGroup(gp, colors.get(gp));
}
}
- // 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 : colors.keySet())
- {
- gpcol = colors.get(gp);
- for (int p = gp.nextSetBit(0); p >= 0 && p < Integer.MAX_VALUE; p = gp.nextSetBit(p + 1))
- {
- if (cm instanceof MappableContactMatrixI)
- {
- MappableContactMatrixI mcm = (MappableContactMatrixI) cm;
- 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();
- }
- }
- }
+ cm.transferGroupColorsTo(aa);
}
}
}
}
}
-
+ private int parseColumnNode(BinaryNode bn) throws NumberFormatException
+ {
+ return Integer.parseInt(
+ bn.getName().substring(bn.getName().indexOf("c") + 1));
+ }
private boolean isColumnForNodeSelected(BinaryNode bn)
{
SequenceI rseq = tp.assocAnnotation.sequenceRef;
int colm = -1;
try
{
- colm = Integer.parseInt(
- bn.getName().substring(bn.getName().indexOf("c") + 1));
+ colm = parseColumnNode(bn);
} catch (Exception e)
{
return false;
}
- if (av==null||av.getAlignment()==null)
+ if (av == null || av.getAlignment() == null)
{
// alignment is closed
return false;
}
ColumnSelection cs = av.getColumnSelection();
-
HiddenColumns hc = av.getAlignment().getHiddenColumns();
- int offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
- : colm;
+ AlignmentAnnotation aa = tp.getAssocAnnotation();
+ int offp=-1;
+ if (aa != null)
+ {
+ ContactMatrixI cm = av.getContactMatrix(aa);
+ // generally, we assume cm has 1:1 mapping to annotation row - probably wrong
+ // but.. if
+ if (cm instanceof MappableContactMatrixI)
+ {
+ int[] pos;
+ // use the mappable's mapping - always the case for PAE Matrices so good
+ // for 2.11.3
+ MappableContactMatrixI mcm = (MappableContactMatrixI) cm;
+ pos = mcm.getMappedPositionsFor(rseq, colm + 1);
+ // finally, look up the position of the column
+ if (pos != null)
+ {
+ offp = rseq.findIndex(pos[0]);
+ }
+ } else {
+ offp = colm;
+ }
+ }
+ if (offp<=0)
+ {
+ return false;
+ }
+ offp-=2;
if (!av.hasHiddenColumns())
{
- return cs.contains(offp-1);
+ return cs.contains(offp);
}
- if (hc.isVisible(offp-1))
+ if (hc.isVisible(offp))
{
- return cs.contains(offp-1);
-// return cs.contains(hc.absoluteToVisibleColumn(offp));
+ return cs.contains(offp);
+ // return cs.contains(hc.absoluteToVisibleColumn(offp));
}
return false;
}
-
- private BitSet createColumnGroupFor(Vector<BinaryNode> l,
- Color col)
+ private BitSet createColumnGroupFor(Vector<BinaryNode> l, Color col)
{
- BitSet gp=new BitSet();
- for (BinaryNode bn:l)
+ BitSet gp = new BitSet();
+ for (BinaryNode bn : l)
{
- int colm=-1;
- if (bn.element()!=null && bn.element()instanceof Integer)
- { colm = (Integer)bn.element();
- } else {
- // parse out from nodename
- try {
- colm = Integer.parseInt(bn.getName().substring(bn.getName().indexOf("c")+1));
- } catch (Exception e)
+ int colm = -1;
+ if (bn.element() != null && bn.element() instanceof Integer)
{
- continue;
+ colm = (Integer) bn.element();
}
+ else
+ {
+ // parse out from nodename
+ try
+ {
+ colm = parseColumnNode(bn);
+ } catch (Exception e)
+ {
+ continue;
+ }
}
gp.set(colm);
}
}
private void markColumnsFor(AlignmentPanel[] aps, Vector<BinaryNode> l,
- Color col)
+ Color col, boolean clearSelected)
{
SequenceI rseq = tp.assocAnnotation.sequenceRef;
-
if (av == null || av.getAlignment() == null)
{
// alignment is closed
return;
}
+ // TODO - sort indices for faster lookup
+ ColumnSelection cs = av.getColumnSelection();
+ HiddenColumns hc = av.getAlignment().getHiddenColumns();
+ ContactMatrixI cm = av.getContactMatrix(tp.assocAnnotation);
+ MappableContactMatrixI mcm = null;
+ int offp;
+ if (cm instanceof MappableContactMatrixI)
+ {
+ mcm = (MappableContactMatrixI) cm;
+ }
for (BinaryNode bn : l)
{
int colm = -1;
{
continue;
}
- // TODO - sort indices for faster lookup
-
- ColumnSelection cs = av.getColumnSelection();
- HiddenColumns hc = av.getAlignment().getHiddenColumns();
- ContactMatrixI cm = av.getContactMatrix(tp.assocAnnotation);
- MappableContactMatrixI mcm = null;
- int offp;
- if (cm instanceof MappableContactMatrixI)
+ if (mcm!=null)
{
- mcm = (MappableContactMatrixI) cm;
- int[] seqpos = mcm.getMappedPositionsFor(tp.assocAnnotation.sequenceRef,colm);
- if (seqpos==null)
+ int[] seqpos = mcm.getMappedPositionsFor(
+ rseq, colm);
+ if (seqpos == null)
{
// no mapping for this column.
continue;
}
// TODO: handle ranges...
- offp=seqpos[0];
+ offp = rseq.findIndex(seqpos[0])-1;
}
else
{
offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
: colm;
}
- if (!av.hasHiddenColumns() || hc.isVisible(offp - 1))
+ if (!av.hasHiddenColumns() || hc.isVisible(offp))
{
- if (cs.contains(offp - 1))
+ if (clearSelected || cs.contains(offp))
{
- cs.removeElement(offp - 1);
+ cs.removeElement(offp);
}
else
{
- cs.addElement(offp - 1);
+ cs.addElement(offp);
}
}
}
+ PaintRefresher.Refresh(tp, av.getSequenceSetId());
}
public void createSeqGroupFor(AlignmentPanel[] aps, Vector<BinaryNode> l,