X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=8d2580b93833f17e643daf2b296da8fa3e0e817b;hb=00b6a6802349029e2c6fb3263201287ba921dd63;hp=b62c61c9cffe688064c0fce22f56256aafadf286;hpb=79631ef84a124bfefa84c24b85dc77883366ad4a;p=jalview.git diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index b62c61c..8d2580b 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -20,6 +20,17 @@ */ package jalview.viewmodel; +import java.awt.Color; +import java.beans.PropertyChangeSupport; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.Deque; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.Conservation; import jalview.api.AlignCalcManagerI; @@ -57,17 +68,6 @@ import jalview.workers.ComplementConsensusThread; import jalview.workers.ConsensusThread; import jalview.workers.StrucConsensusThread; -import java.awt.Color; -import java.beans.PropertyChangeSupport; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Deque; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; - /** * base class holding visualization and analysis attributes and common logic for * an active alignment view displayed in the GUI @@ -78,7 +78,7 @@ import java.util.Map; public abstract class AlignmentViewport implements AlignViewportI, CommandListener, VamsasSource { - protected ViewportPositionProps posProps; + protected ViewportRanges ranges; protected ViewStyleI viewStyle = new ViewStyle(); @@ -589,9 +589,9 @@ public abstract class AlignmentViewport implements AlignViewportI, return isDataset; } + private Map hiddenRepSequences; - - // protected ColumnSelection colSel = new ColumnSelection(); + protected ColumnSelection colSel = new ColumnSelection(); public boolean autoCalculateConsensus = true; @@ -632,7 +632,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { residueShading.setConservation(hconservation); } - residueShading.alignmentChanged(alignment, getHiddenRepSequences()); + residueShading.alignmentChanged(alignment, hiddenRepSequences); } /* @@ -651,8 +651,7 @@ public abstract class AlignmentViewport implements AlignViewportI, if (cs != null) { sg.getGroupColourScheme() -.alignmentChanged(sg, - getHiddenRepSequences()); + .alignmentChanged(sg, hiddenRepSequences); } } } @@ -675,6 +674,8 @@ public abstract class AlignmentViewport implements AlignViewportI, protected AlignmentAnnotation complementConsensus; + protected AlignmentAnnotation gapcounts; + protected AlignmentAnnotation strucConsensus; protected AlignmentAnnotation conservation; @@ -777,6 +778,12 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override + public AlignmentAnnotation getAlignmentGapAnnotation() + { + return gapcounts; + } + + @Override public AlignmentAnnotation getComplementConsensusAnnotation() { return complementConsensus; @@ -816,7 +823,7 @@ public abstract class AlignmentViewport implements AlignViewportI, public void updateConsensus(final AlignmentViewPanel ap) { // see note in mantis : issue number 8585 - if (consensus == null || !autoCalculateConsensus) + if ((consensus == null || gapcounts == null) || !autoCalculateConsensus) { return; } @@ -1095,27 +1102,24 @@ public abstract class AlignmentViewport implements AlignViewportI, public void setHiddenColumns(ColumnSelection colsel) { - posProps.setHiddenColumns(colsel); - // this.colSel = colsel; + this.colSel = colsel; } @Override public ColumnSelection getColumnSelection() { - return posProps.getColumnSelection(); - // return colSel; + return colSel; } @Override public void setColumnSelection(ColumnSelection colSel) { - posProps.setColumnSelection(colSel); - /*this.colSel = colSel; + this.colSel = colSel; if (colSel != null) { updateHiddenColumns(); } - isColSelChanged(true);*/ + isColSelChanged(true); } /** @@ -1125,14 +1129,14 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public Map getHiddenRepSequences() { - return posProps.getHiddenRepSequences(); + return hiddenRepSequences; } @Override public void setHiddenRepSequences( Map hiddenRepSequences) { - posProps.getHiddenRepSequences(); + this.hiddenRepSequences = hiddenRepSequences; } @Override @@ -1145,8 +1149,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public boolean hasHiddenColumns() { - return posProps.hasHiddenColumns(); - // return colSel != null && colSel.hasHiddenColumns(); + return colSel != null && colSel.hasHiddenColumns(); } public void updateHiddenColumns() @@ -1216,7 +1219,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } - private long sgrouphash = -1; + private long sgrouphash = -1, colselhash = -1; /** * checks current SelectionGroup against record of last hash value, and @@ -1252,8 +1255,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean isColSelChanged(boolean b) { - return posProps.isColSelChanged(b); - /*int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode(); + int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode(); if (hc != -1 && hc != colselhash) { if (b) @@ -1262,7 +1264,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } return true; } - return false;*/ + return false; } @Override @@ -1293,14 +1295,6 @@ public abstract class AlignmentViewport implements AlignViewportI, */ private boolean followHighlight = true; - /*private int startRes; - - private int endRes; - - private int startSeq; - - private int endSeq;*/ - /** * Property change listener for changes in alignment * @@ -1343,21 +1337,6 @@ public abstract class AlignmentViewport implements AlignViewportI, // common hide/show column stuff - public void hideColumns(int start, int end) - { - posProps.hideColumns(start, end); - } - - public void showColumn(int col) - { - posProps.showColumn(col); - } - - public void showAllHiddenColumns() - { - posProps.showAllHiddenColumns(); - } - public void hideSelectedColumns() { if (colSel.isEmpty()) @@ -1370,41 +1349,61 @@ public abstract class AlignmentViewport implements AlignViewportI, isColSelChanged(true); } + public void hideColumns(int start, int end) + { + if (start == end) + { + colSel.hideColumns(start); + } + else + { + colSel.hideColumns(start, end); + } + isColSelChanged(true); + } + public void showColumn(int col) + { + colSel.revealHiddenColumns(col); + isColSelChanged(true); + } + + public void showAllHiddenColumns() + { + colSel.revealAllHiddenColumns(); + isColSelChanged(true); + } // common hide/show seq stuff public void showAllHiddenSeqs() { - selectionGroup = posProps.showAllHiddenSeqs(selectionGroup); - - /* if (alignment.getHiddenSequences().getSize() > 0) - { - if (selectionGroup == null) - { - selectionGroup = new SequenceGroup(); - selectionGroup.setEndRes(alignment.getWidth() - 1); - } - List tmp = alignment.getHiddenSequences().showAll( - hiddenRepSequences); - for (SequenceI seq : tmp) - { - selectionGroup.addSequence(seq, false); - setSequenceAnnotationsVisible(seq, true); - } + if (alignment.getHiddenSequences().getSize() > 0) + { + if (selectionGroup == null) + { + selectionGroup = new SequenceGroup(); + selectionGroup.setEndRes(alignment.getWidth() - 1); + } + List tmp = alignment.getHiddenSequences().showAll( + hiddenRepSequences); + for (SequenceI seq : tmp) + { + selectionGroup.addSequence(seq, false); + setSequenceAnnotationsVisible(seq, true); + } - hiddenRepSequences = null; + hiddenRepSequences = null; - firePropertyChange("alignment", null, alignment.getSequences()); - // used to set hasHiddenRows/hiddenRepSequences here, after the property - // changed event - sendSelection(); - }*/ + firePropertyChange("alignment", null, alignment.getSequences()); + // used to set hasHiddenRows/hiddenRepSequences here, after the property + // changed event + sendSelection(); + } } public void showSequence(int index) { - posProps.showSequence(index, selectionGroup); - /*List tmp = alignment.getHiddenSequences().showSequence( + List tmp = alignment.getHiddenSequences().showSequence( index, hiddenRepSequences); if (tmp.size() > 0) { @@ -1421,13 +1420,12 @@ public abstract class AlignmentViewport implements AlignViewportI, } firePropertyChange("alignment", null, alignment.getSequences()); sendSelection(); - }*/ + } } public void hideAllSelectedSeqs() { - posProps.hideAllSelectedSeqs(selectionGroup); - /*if (selectionGroup == null || selectionGroup.getSize() < 1) + if (selectionGroup == null || selectionGroup.getSize() < 1) { return; } @@ -1436,13 +1434,12 @@ public abstract class AlignmentViewport implements AlignViewportI, hideSequence(seqs); - setSelectionGroup(null);*/ + setSelectionGroup(null); } public void hideSequence(SequenceI[] seq) { - posProps.hideSequence(seq); - /*if (seq != null) + if (seq != null) { for (int i = 0; i < seq.length; i++) { @@ -1450,7 +1447,7 @@ public abstract class AlignmentViewport implements AlignViewportI, setSequenceAnnotationsVisible(seq[i], false); } firePropertyChange("alignment", null, alignment.getSequences()); - }*/ + } } /** @@ -1464,8 +1461,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public void hideSequences(SequenceI sequence, boolean representGroup) { - posProps.hideSequences(sequence, representGroup, selectionGroup); - /*if (selectionGroup == null || selectionGroup.getSize() < 1) + if (selectionGroup == null || selectionGroup.getSize() < 1) { hideSequence(new SequenceI[] { sequence }); return; @@ -1484,14 +1480,33 @@ public abstract class AlignmentViewport implements AlignViewportI, hideSequence(hseqs); setSelectionGroup(null); - sendSelection();*/ + sendSelection(); } + /** + * Set visibility for any annotations for the given sequence. + * + * @param sequenceI + */ + protected void setSequenceAnnotationsVisible(SequenceI sequenceI, + boolean visible) + { + AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); + if (anns != null) + { + for (AlignmentAnnotation ann : anns) + { + if (ann.sequenceRef == sequenceI) + { + ann.visible = visible; + } + } + } + } public void hideRepSequences(SequenceI repSequence, SequenceGroup sg) { - posProps.hideRepSequences(repSequence, sg); - /*int sSize = sg.getSize(); + int sSize = sg.getSize(); if (sSize < 2) { return; @@ -1521,7 +1536,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } sg.setSeqrep(repSequence); // note: not done in 2.7applet sg.setHidereps(true); // note: not done in 2.7applet - hideSequence(seqs);*/ + hideSequence(seqs); } @@ -1551,9 +1566,8 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean isHiddenRepSequence(SequenceI seq) { - return posProps.isHiddenRepSequence(seq); - // return (hiddenRepSequences != null && hiddenRepSequences - // .containsKey(seq)); + return (hiddenRepSequences != null && hiddenRepSequences + .containsKey(seq)); } /** @@ -1564,24 +1578,21 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public SequenceGroup getRepresentedSequences(SequenceI seq) { - return posProps.getRepresentedSequences(seq); - // return (SequenceGroup) (hiddenRepSequences == null ? null - // : hiddenRepSequences.get(seq)); + return (SequenceGroup) (hiddenRepSequences == null ? null + : hiddenRepSequences.get(seq)); } @Override public int adjustForHiddenSeqs(int alignmentIndex) { - return posProps.adjustForHiddenSeqs(alignmentIndex); - // return alignment.getHiddenSequences().adjustForHiddenSeqs( - // alignmentIndex); + return alignment.getHiddenSequences().adjustForHiddenSeqs( + alignmentIndex); } @Override public void invertColumnSelection() { - posProps.invertColumnSelection(); - // colSel.invertColumnSelection(0, alignment.getWidth()); + colSel.invertColumnSelection(0, alignment.getWidth()); } @Override @@ -1629,7 +1640,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public CigarArray getViewAsCigars(boolean selectedRegionOnly) { - return new CigarArray(alignment, posProps.getColumnSelection(), + return new CigarArray(alignment, colSel, (selectedRegionOnly ? selectionGroup : null)); } @@ -1644,8 +1655,8 @@ public abstract class AlignmentViewport implements AlignViewportI, public jalview.datamodel.AlignmentView getAlignmentView( boolean selectedOnly, boolean markGroups) { - return new AlignmentView(alignment, posProps.getColumnSelection(), - selectionGroup, posProps.hasHiddenColumns(), selectedOnly, + return new AlignmentView(alignment, colSel, selectionGroup, + colSel != null && colSel.hasHiddenColumns(), selectedOnly, markGroups); } @@ -1689,9 +1700,9 @@ public abstract class AlignmentViewport implements AlignViewportI, } selection = new String[iSize]; - if (posProps.hasHiddenColumns()) + if (colSel != null && colSel.hasHiddenColumns()) { - selection = posProps.getVisibleSequenceStrings(start, end, seqs); + selection = colSel.getVisibleSequenceStrings(start, end, seqs); } else { @@ -1707,52 +1718,49 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public List getVisibleRegionBoundaries(int min, int max) { - return posProps.getVisibleRegionBoundaries(min, max); - /* ArrayList regions = new ArrayList(); - int start = min; - int end = max; + ArrayList regions = new ArrayList(); + int start = min; + int end = max; - do + do + { + if (colSel != null && colSel.hasHiddenColumns()) + { + if (start == 0) { - if (colSel != null && colSel.hasHiddenColumns()) - { - if (start == 0) - { - start = colSel.adjustForHiddenColumns(start); - } - - end = colSel.getHiddenBoundaryRight(start); - if (start == end) - { - end = max; - } - if (end > max) - { - end = max; - } - } + start = colSel.adjustForHiddenColumns(start); + } + + end = colSel.getHiddenBoundaryRight(start); + if (start == end) + { + end = max; + } + if (end > max) + { + end = max; + } + } - regions.add(new int[] { start, end }); + regions.add(new int[] { start, end }); - if (posProps.hasHiddenColumns()) - { - start = colSel.adjustForHiddenColumns(end); - start = colSel.getHiddenBoundaryLeft(start) + 1; - } - } while (end < max); + if (colSel != null && colSel.hasHiddenColumns()) + { + start = colSel.adjustForHiddenColumns(end); + start = colSel.getHiddenBoundaryLeft(start) + 1; + } + } while (end < max); - int[][] startEnd = new int[regions.size()][2]; + int[][] startEnd = new int[regions.size()][2]; - return regions;*/ + return regions; } @Override public List getVisibleAlignmentAnnotation( boolean selectedOnly) { - return posProps.getVisibleAlignmentAnnotation(selectedOnly, - selectionGroup); - /*ArrayList ala = new ArrayList(); + ArrayList ala = new ArrayList(); AlignmentAnnotation[] aa; if ((aa = alignment.getAlignmentAnnotation()) != null) { @@ -1771,7 +1779,7 @@ public abstract class AlignmentViewport implements AlignViewportI, ala.add(clone); } } - return ala;*/ + return ala; } @Override @@ -1844,7 +1852,7 @@ public abstract class AlignmentViewport implements AlignViewportI, ResidueShaderI rs = residueShading; if (rs != null) { - rs.alignmentChanged(alignment, posProps.getHiddenRepSequences()); + rs.alignmentChanged(alignment, hiddenRepSequences); rs.setConsensus(hconsensus); if (rs.conservationApplied()) @@ -1859,7 +1867,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { if (sg.cs != null) { - sg.cs.alignmentChanged(sg, posProps.getHiddenRepSequences()); + sg.cs.alignmentChanged(sg, hiddenRepSequences); } sg.recalcConservation(); } @@ -1885,16 +1893,21 @@ public abstract class AlignmentViewport implements AlignViewportI, consensus = new AlignmentAnnotation("Consensus", "PID", new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(consensus); + gapcounts = new AlignmentAnnotation("Occupancy", + "Number of aligned positions", + new Annotation[1], 0f, alignment.getHeight(), + AlignmentAnnotation.BAR_GRAPH); + initGapCounts(gapcounts); initComplementConsensus(); } } /** - * If this is a protein alignment and there are mappings to cDNA, add the cDNA - * consensus annotation. + * If this is a protein alignment and there are mappings to cDNA, adds the + * cDNA consensus annotation and returns true, else returns false. */ - public void initComplementConsensus() + public boolean initComplementConsensus() { if (!alignment.isNucleotide()) { @@ -1921,9 +1934,11 @@ public abstract class AlignmentViewport implements AlignViewportI, "PID for cDNA", new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(complementConsensus); + return true; } } } + return false; } private void initConsensus(AlignmentAnnotation aa) @@ -1937,6 +1952,21 @@ public abstract class AlignmentViewport implements AlignViewportI, } } + // these should be extracted from the view model - style and settings for + // derived annotation + private void initGapCounts(AlignmentAnnotation counts) + { + counts.hasText = true; + counts.autoCalculated = true; + counts.scaleColLabel = true; + counts.graph = AlignmentAnnotation.BAR_GRAPH; + + if (showConsensus) + { + alignment.addAnnotation(counts); + } + } + private void initConservation() { if (showConservation) @@ -2639,76 +2669,9 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public ViewportPositionProps getPosProps() + public ViewportRanges getRanges() { - return posProps; - } - - @Override - public int getStartRes() - { - return posProps.getStartRes(); - } - - @Override - public int getEndRes() - { - return posProps.getEndRes(); - } - - @Override - public int getStartSeq() - { - return posProps.getStartSeq(); - } - - public void setStartRes(int res) - { - posProps.setStartRes(res); - // this.startRes = res; - } - - public void setStartSeq(int seq) - { - posProps.setStartSeq(seq); - // this.startSeq = seq; - } - - public void setEndRes(int res) - { - posProps.setEndRes(res); - /*if (res > alignment.getWidth() - 1) - { - // log.System.out.println(" Corrected res from " + res + " to maximum " + - // (alignment.getWidth()-1)); - res = alignment.getWidth() - 1; - } - if (res < 0) - { - res = 0; - } - this.endRes = res;*/ - } - - public void setEndSeq(int seq) - { - posProps.setEndSeq(seq); - /*if (seq > alignment.getHeight()) - { - seq = alignment.getHeight(); - } - if (seq < 0) - { - seq = 0; - } - this.endSeq = seq;*/ - } - - @Override - public int getEndSeq() - { - return posProps.getEndSeq(); - // return endSeq; + return ranges; } /** @@ -2748,7 +2711,8 @@ public abstract class AlignmentViewport implements AlignViewportI, * locate 'middle' column (true middle if an odd number visible, left of * middle if an even number visible) */ - int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2; + int middleColumn = ranges.getStartRes() + + (ranges.getEndRes() - ranges.getStartRes()) / 2; final HiddenSequences hiddenSequences = getAlignment() .getHiddenSequences(); @@ -2758,7 +2722,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ int lastSeq = alignment.getHeight() - 1; List seqMappings = null; - for (int seqNo = getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) + for (int seqNo = ranges.getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) @@ -2800,11 +2764,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public void expandColSelection(SequenceGroup sg, boolean wholewidth) { - if (!this.hasSelectedColumns()) - { - posProps.expandColSelection(sg, wholewidth); - } - /*int sgs, sge; + int sgs, sge; if (sg != null && (sgs = sg.getStartRes()) >= 0 && sg.getStartRes() <= (sge = sg.getEndRes()) && !this.hasSelectedColumns()) @@ -2822,7 +2782,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { colSel.addElement(cspos); } - }*/ + } } /** @@ -2830,7 +2790,6 @@ public abstract class AlignmentViewport implements AlignViewportI, */ private boolean selectionIsDefinedGroup = false; - @Override public boolean isSelectionDefinedGroup() {