import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
+import java.util.ArrayList;
import java.util.BitSet;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import jalview.analysis.Conservation;
import jalview.analysis.TreeModel;
import jalview.api.AlignViewportI;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
import jalview.datamodel.BinaryNode;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.ContactMatrixI;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceGroup;
import jalview.structure.SelectionSource;
import jalview.util.Format;
import jalview.util.MessageManager;
+import jalview.ws.datamodel.MappableContactMatrixI;
/**
* DOCUMENT ME!
{
BinaryNode lf = leaves.elementAt(i);
- if (lf instanceof SequenceNode && ((SequenceNode)lf).isPlaceholder())
+ if (lf instanceof SequenceNode && ((SequenceNode) lf).isPlaceholder())
{
has_placeholders = true;
}
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();
// Colour selected leaves differently
boolean isSelected = false;
- if (tp.getColumnWise())
+ if (tp.isColumnWise())
{
isSelected = isColumnForNodeSelected(node);
}
int ystart = (node.left() == null ? 0
: (int) (((BinaryNode) node.left()).ycount * chunk)) + offy;
int yend = (node.right() == null ? 0
- : (int) (((BinaryNode) node.right()).ycount * chunk))
- + offy;
+ : (int) (((BinaryNode) node.right()).ycount * chunk)) + offy;
Rectangle pos = new Rectangle(xend - 2, ypos - 2, 5, 5);
nodeHash.put(node, pos);
else
{
Vector<BinaryNode> leaves = tree.findLeaves(highlightNode);
- if (tp.getColumnWise()) {
- 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);
}
+ else
+ {
+ for (int i = 0; i < leaves.size(); i++)
+ {
+ SequenceI seq = (SequenceI) leaves.elementAt(i).element();
+ treeSelectionChanged(seq);
+ }
}
av.sendSelection();
}
void colourGroups(List<BinaryNode> groups)
{
AlignmentPanel[] aps = getAssociatedPanels();
+ List<BitSet> colGroups = new ArrayList<>();
+ Map<BitSet, Color> colors = new HashMap();
for (int i = 0; i < groups.size(); i++)
{
Color col = new Color((int) (Math.random() * 255),
setColor(groups.get(i), col.brighter());
Vector<BinaryNode> l = tree.findLeaves(groups.get(i));
- if (!tp.getColumnWise()) {
+ if (!tp.isColumnWise())
+ {
createSeqGroupFor(aps, l, col);
- } else {
- markColumnsFor(aps,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)
+ {
+ ContactMatrixI cm = av.getContactMatrix(aa);
+ if (cm != null)
+ {
+ cm.updateGroups(colGroups);
+ 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();
+ }
+ }
+ }
}
}
{
return false;
}
+ 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() - 1 + colm)
+ int offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
: colm;
- if (!av.hasHiddenColumns() || hc.isVisible(offp))
+ if (!av.hasHiddenColumns())
{
- return cs.contains(offp);
+ return cs.contains(offp - 1);
+ }
+ if (hc.isVisible(offp - 1))
+ {
+ return cs.contains(offp - 1);
+ // return cs.contains(hc.absoluteToVisibleColumn(offp));
}
return false;
}
+ private BitSet createColumnGroupFor(Vector<BinaryNode> l, Color col)
+ {
+ 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)
+ {
+ continue;
+ }
+ }
+ gp.set(colm);
+ }
+ return gp;
+ }
private void markColumnsFor(AlignmentPanel[] aps, Vector<BinaryNode> l,
Color col)
{
SequenceI rseq = tp.assocAnnotation.sequenceRef;
- for (BinaryNode bn:l)
+ if (av == null || av.getAlignment() == null)
{
- int colm=-1;
- try {
- colm = Integer.parseInt(bn.getName().substring(bn.getName().indexOf("c")+1));
+ // alignment is closed
+ return;
+ }
+
+ for (BinaryNode bn : l)
+ {
+ int colm = -1;
+ try
+ {
+ colm = Integer.parseInt(
+ bn.getName().substring(bn.getName().indexOf("c") + 1));
} catch (Exception e)
{
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)
{
- int offp = (rseq!=null) ? rseq.findIndex(rseq.getStart()-1+colm) : colm;
-
- if (!av.hasHiddenColumns() || hc.isVisible(offp))
- {
- if (cs.contains(offp))
- {
- cs.removeElement(offp);
- } else {
- cs.addElement(offp);
- }
+ mcm = (MappableContactMatrixI) cm;
+ int[] seqpos = mcm.getMappedPositionsFor(
+ tp.assocAnnotation.sequenceRef, colm);
+ if (seqpos == null)
+ {
+ // no mapping for this column.
+ continue;
}
+ // TODO: handle ranges...
+ offp = seqpos[0];
}
- }
+ else
+ {
+ offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
+ : colm;
+ }
+ if (!av.hasHiddenColumns() || hc.isVisible(offp - 1))
+ {
+ if (cs.contains(offp - 1))
+ {
+ cs.removeElement(offp - 1);
+ }
+ else
+ {
+ cs.addElement(offp - 1);
+ }
+ }
+ }
}
public void createSeqGroupFor(AlignmentPanel[] aps, Vector<BinaryNode> l,