X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=39a1c187827064fc414351c485e0cc212f80241a;hb=b5667f39acdf309cd92881b73edfda591e0acaf4;hp=96a35f96540eccbed854dc49d79c76f9fea94177;hpb=29cd3c8168e0b16d14d58b9dedfe738ebb6070ac;p=jalview.git diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index 96a35f9..39a1c18 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -22,6 +22,7 @@ package jalview.viewmodel; import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.Conservation; +import jalview.analysis.TreeModel; import jalview.api.AlignCalcManagerI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; @@ -33,12 +34,9 @@ import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.Annotation; -import jalview.datamodel.CigarArray; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; import jalview.datamodel.HiddenSequences; -import jalview.datamodel.ProfileI; -import jalview.datamodel.Profiles; import jalview.datamodel.ProfilesI; import jalview.datamodel.SearchResultsI; import jalview.datamodel.Sequence; @@ -70,6 +68,7 @@ import java.util.BitSet; import java.util.Deque; import java.util.HashMap; import java.util.Hashtable; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -83,7 +82,7 @@ import java.util.Map; public abstract class AlignmentViewport implements AlignViewportI, CommandListener, VamsasSource { - final protected ViewportRanges ranges; + protected ViewportRanges ranges; protected ViewStyleI viewStyle = new ViewStyle(); @@ -99,10 +98,69 @@ public abstract class AlignmentViewport protected Deque redoList = new ArrayDeque<>(); + protected String sequenceSetID; + + /* + * probably unused indicator that view is of a dataset rather than an + * alignment + */ + protected boolean isDataset = false; + + private Map hiddenRepSequences; + + protected ColumnSelection colSel = new ColumnSelection(); + + public boolean autoCalculateConsensus = true; + + protected boolean autoCalculateStrucConsensus = true; + + protected boolean ignoreGapsInConsensusCalculation = false; + + protected boolean ignoreBelowBackGroundFrequencyCalculation = false; + + protected boolean infoLetterHeight = false; + + protected ResidueShaderI residueShading = new ResidueShader(); + + protected AlignmentAnnotation consensus; + + protected AlignmentAnnotation complementConsensus; + + protected AlignmentAnnotation occupancy; + + protected AlignmentAnnotation strucConsensus; + + protected AlignmentAnnotation conservation; + + protected AlignmentAnnotation quality; + + /** + * alignment displayed in the viewport + */ + private AlignmentI alignment; + + /** + * results of alignment consensus analysis for visible portion of view + */ + protected ProfilesI consensusProfiles; + + /** + * HMM profile for the alignment + */ + protected ProfilesI hmmProfiles; + + /** + * results of cDNA complement consensus visible portion of view + */ + protected Hashtable[] hcomplementConsensus; + /** - * alignment displayed in the viewport. Please use get/setter + * results of secondary structure base pair consensus for visible portion of + * view */ - protected AlignmentI alignment; + protected Hashtable[] hStrucConsensus; + + protected Conservation hconservation; public AlignmentViewport(AlignmentI al) { @@ -408,6 +466,7 @@ public abstract class AlignmentViewport public void setWrapAlignment(boolean state) { viewStyle.setWrapAlignment(state); + ranges.setWrappedMode(state); } /** @@ -582,14 +641,6 @@ public abstract class AlignmentViewport return alignment.getGapCharacter(); } - protected String sequenceSetID; - - /** - * probably unused indicator that view is of a dataset rather than an - * alignment - */ - protected boolean isDataset = false; - public void setDataset(boolean b) { isDataset = b; @@ -600,22 +651,6 @@ public abstract class AlignmentViewport return isDataset; } - private Map hiddenRepSequences; - - protected ColumnSelection colSel = new ColumnSelection(); - - public boolean autoCalculateConsensus = true; - - public boolean autoCalculateInformation = true; - - protected boolean autoCalculateStrucConsensus = true; - - protected boolean ignoreGapsInConsensusCalculation = false; - - protected boolean ignoreBelowBackGroundFrequencyCalculation = false; - - protected ResidueShaderI residueShading = new ResidueShader(); - @Override public void setGlobalColourScheme(ColourSchemeI cs) { @@ -647,6 +682,11 @@ public abstract class AlignmentViewport { residueShading.setConservation(hconservation); } + /* + * reset conservation flag in case just set to false if + * Conservation was null (calculation still in progress) + */ + residueShading.setConservationApplied(getConservationSelected()); residueShading.alignmentChanged(alignment, hiddenRepSequences); } @@ -662,7 +702,8 @@ public abstract class AlignmentViewport * retain any colour thresholds per group while * changing choice of colour scheme (JAL-2386) */ - sg.setColourScheme(cs); + sg.setColourScheme( + cs == null ? null : cs.getInstance(this, sg)); if (cs != null) { sg.getGroupColourScheme().alignmentChanged(sg, @@ -683,47 +724,6 @@ public abstract class AlignmentViewport { return residueShading; } - - protected AlignmentAnnotation consensus; - - protected AlignmentAnnotation complementConsensus; - - protected AlignmentAnnotation gapcounts; - - protected AlignmentAnnotation strucConsensus; - - protected AlignmentAnnotation conservation; - - protected AlignmentAnnotation quality; - - protected AlignmentAnnotation[] groupConsensus; - - protected AlignmentAnnotation[] groupConservation; - - protected List groupInformation = new ArrayList<>(); - - protected List information = new ArrayList<>(); - - /** - * results of alignment consensus analysis for visible portion of view - */ - protected ProfilesI hconsensus = null; - - protected List hinformation = new ArrayList<>(); - - /** - * results of cDNA complement consensus visible portion of view - */ - protected Hashtable[] hcomplementConsensus = null; - - /** - * results of secondary structure base pair consensus for visible portion of - * view - */ - protected Hashtable[] hStrucConsensus = null; - - protected Conservation hconservation = null; - @Override public void setConservation(Conservation cons) { @@ -743,9 +743,9 @@ public abstract class AlignmentViewport } @Override - public void setSequenceConsensusHash(ProfilesI hconsensus) + public void setConsensusProfiles(ProfilesI hconsensus) { - this.hconsensus = hconsensus; + this.consensusProfiles = hconsensus; } @Override @@ -755,33 +755,21 @@ public abstract class AlignmentViewport } @Override - public ProfilesI getSequenceConsensusHash() - { - return hconsensus; - } - - @Override - public void setSequenceInformationHashes(List info) + public ProfilesI getConsensusProfiles() { - hinformation = info; + return consensusProfiles; } @Override - public void setSequenceInformationHash(ProfilesI info, int index) + public void setHmmProfiles(ProfilesI info) { - hinformation.set(index, info); + hmmProfiles = info; } @Override - public List getSequenceInformationHashes() + public ProfilesI getHmmProfiles() { - return hinformation; - } - - @Override - public ProfilesI getSequenceInformationHash(int index) - { - return hinformation.get(index); + return hmmProfiles; } @Override @@ -822,21 +810,9 @@ public abstract class AlignmentViewport } @Override - public List getInformationAnnotations() - { - return information; - } - - @Override - public AlignmentAnnotation getInformationAnnotation(int index) + public AlignmentAnnotation getOccupancyAnnotation() { - return information.get(index); - } - - @Override - public AlignmentAnnotation getAlignmentGapAnnotation() - { - return gapcounts; + return occupancy; } @Override @@ -925,17 +901,14 @@ public abstract class AlignmentViewport } } - /** - * trigger update of information annotation - */ - public void updateInformation(final AlignmentViewPanel ap) + @Override + public void initInformationWorker(final AlignmentViewPanel ap) { if (calculator .getRegisteredWorkersOfClass(InformationThread.class) == null) { calculator.registerWorker(new InformationThread(this, ap)); } - } // --------START Structure Conservation @@ -1001,14 +974,16 @@ public abstract class AlignmentViewport strucConsensus = null; conservation = null; quality = null; - groupConsensus = null; - groupConservation = null; - hconsensus = null; + consensusProfiles = null; + hconservation = null; hcomplementConsensus = null; - // colour scheme may hold reference to consensus - residueShading = null; - // TODO remove listeners from changeSupport? + occupancy = null; + calculator = null; + residueShading = null; // may hold a reference to Consensus changeSupport = null; + ranges = null; + currentTree = null; + selectionGroup = null; setAlignment(null); } @@ -1054,17 +1029,17 @@ public abstract class AlignmentViewport /** * should hmm profile be rendered by default */ - protected boolean showHMMSequenceLogo = false; + protected boolean hmmShowSequenceLogo = false; /** * should hmm profile be rendered normalised to row height */ - protected boolean normaliseHMMSequenceLogo = false; + protected boolean hmmNormaliseSequenceLogo = false; /** * should information histograms be rendered by default */ - protected boolean showInformationHistogram = true; + protected boolean hmmShowHistogram = true; /** * @return the showConsensusProfile @@ -1081,7 +1056,7 @@ public abstract class AlignmentViewport @Override public boolean isShowHMMSequenceLogo() { - return showHMMSequenceLogo; + return hmmShowSequenceLogo; } /** @@ -1104,12 +1079,14 @@ public abstract class AlignmentViewport public void setShowHMMSequenceLogo(boolean showHMMSequenceLogo) { - if (showHMMSequenceLogo != this.showHMMSequenceLogo) + if (showHMMSequenceLogo != this.hmmShowSequenceLogo) { - this.showHMMSequenceLogo = showHMMSequenceLogo; - calculator.updateAnnotationFor(InformationThread.class); + this.hmmShowSequenceLogo = showHMMSequenceLogo; + // TODO: updateAnnotation if description (tooltip) will show + // profile in place of information content? + // calculator.updateAnnotationFor(InformationThread.class); } - this.showHMMSequenceLogo = showHMMSequenceLogo; + this.hmmShowSequenceLogo = showHMMSequenceLogo; } /** @@ -1123,11 +1100,10 @@ public abstract class AlignmentViewport /** * @param showInformationHistogram - * the showInformationHistogram to set */ public void setShowInformationHistogram(boolean showInformationHistogram) { - this.showInformationHistogram = showInformationHistogram; + this.hmmShowHistogram = showInformationHistogram; } /** @@ -1183,7 +1159,7 @@ public abstract class AlignmentViewport @Override public boolean isShowInformationHistogram() { - return this.showInformationHistogram; + return this.hmmShowHistogram; } /** @@ -1274,7 +1250,7 @@ public abstract class AlignmentViewport @Override public boolean hasHiddenColumns() { - return colSel != null + return alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns(); } @@ -1335,24 +1311,22 @@ public abstract class AlignmentViewport ignoreGapsInConsensusCalculation = b; if (ap != null) { - updateConsensus(ap); if (residueShading != null) { residueShading.setThreshold(residueShading.getThreshold(), ignoreGapsInConsensusCalculation); } } - } public void setIgnoreBelowBackground(boolean b, AlignmentViewPanel ap) { ignoreBelowBackGroundFrequencyCalculation = b; - if (ap != null) - { - updateInformation(ap); - } + } + public void setInfoLetterHeight(boolean b, AlignmentViewPanel ap) + { + infoLetterHeight = b; } private long sgrouphash = -1, colselhash = -1; @@ -1415,6 +1389,12 @@ public abstract class AlignmentViewport return ignoreBelowBackGroundFrequencyCalculation; } + @Override + public boolean isInfoLetterHeight() + { + return infoLetterHeight; + } + // property change stuff // JBPNote Prolly only need this in the applet version. private PropertyChangeSupport changeSupport = new PropertyChangeSupport( @@ -1460,7 +1440,10 @@ public abstract class AlignmentViewport public void removePropertyChangeListener( java.beans.PropertyChangeListener listener) { - changeSupport.removePropertyChangeListener(listener); + if (changeSupport != null) + { + changeSupport.removePropertyChangeListener(listener); + } } /** @@ -1521,6 +1504,9 @@ public abstract class AlignmentViewport // common hide/show seq stuff public void showAllHiddenSeqs() { + int startSeq = ranges.getStartSeq(); + int endSeq = ranges.getEndSeq(); + if (alignment.getHiddenSequences().getSize() > 0) { if (selectionGroup == null) @@ -1538,6 +1524,8 @@ public abstract class AlignmentViewport hiddenRepSequences = null; + ranges.setStartEndSeq(startSeq, endSeq + tmp.size()); + firePropertyChange("alignment", null, alignment.getSequences()); // used to set hasHiddenRows/hiddenRepSequences here, after the property // changed event @@ -1547,6 +1535,9 @@ public abstract class AlignmentViewport public void showSequence(int index) { + int startSeq = ranges.getStartSeq(); + int endSeq = ranges.getEndSeq(); + List tmp = alignment.getHiddenSequences().showSequence(index, hiddenRepSequences); if (tmp.size() > 0) @@ -1562,6 +1553,9 @@ public abstract class AlignmentViewport selectionGroup.addSequence(seq, false); setSequenceAnnotationsVisible(seq, true); } + + ranges.setStartEndSeq(startSeq, endSeq + tmp.size()); + firePropertyChange("alignment", null, alignment.getSequences()); sendSelection(); } @@ -1583,6 +1577,11 @@ public abstract class AlignmentViewport public void hideSequence(SequenceI[] seq) { + /* + * cache offset to first visible sequence + */ + int startSeq = ranges.getStartSeq(); + if (seq != null) { for (int i = 0; i < seq.length; i++) @@ -1590,6 +1589,7 @@ public abstract class AlignmentViewport alignment.getHiddenSequences().hideSequence(seq[i]); setSequenceAnnotationsVisible(seq[i], false); } + ranges.setStartSeq(startSeq); firePropertyChange("alignment", null, alignment.getSequences()); } } @@ -1737,6 +1737,7 @@ public abstract class AlignmentViewport public void invertColumnSelection() { colSel.invertColumnSelection(0, alignment.getWidth(), alignment); + isColSelChanged(true); } @Override @@ -1760,7 +1761,8 @@ public abstract class AlignmentViewport } else { - sequences = selectionGroup.getSelectionAsNewSequences(alignment); + sequences = selectionGroup.getSelectionAsNewSequences(alignment, + true); } return sequences; @@ -1782,13 +1784,6 @@ public abstract class AlignmentViewport } @Override - public CigarArray getViewAsCigars(boolean selectedRegionOnly) - { - return new CigarArray(alignment, alignment.getHiddenColumns(), - (selectedRegionOnly ? selectionGroup : null)); - } - - @Override public jalview.datamodel.AlignmentView getAlignmentView( boolean selectedOnly) { @@ -1800,7 +1795,8 @@ public abstract class AlignmentViewport boolean selectedOnly, boolean markGroups) { return new AlignmentView(alignment, alignment.getHiddenColumns(), - selectionGroup, alignment.getHiddenColumns() != null + selectionGroup, + alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns(), selectedOnly, markGroups); } @@ -1848,8 +1844,12 @@ public abstract class AlignmentViewport if (alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns()) { - selection = alignment.getHiddenColumns() - .getVisibleSequenceStrings(start, end, seqs); + for (i = 0; i < iSize; i++) + { + Iterator blocks = alignment.getHiddenColumns() + .getVisContigsIterator(start, end + 1, false); + selection[i] = seqs[i].getSequenceStringFromIterator(blocks); + } } else { @@ -1876,10 +1876,10 @@ public abstract class AlignmentViewport { if (start == 0) { - start = hidden.adjustForHiddenColumns(start); + start = hidden.visibleToAbsoluteColumn(start); } - end = hidden.getHiddenBoundaryRight(start); + end = hidden.getNextHiddenBoundary(false, start); if (start == end) { end = max; @@ -1894,8 +1894,8 @@ public abstract class AlignmentViewport if (hidden != null && hidden.hasHiddenColumns()) { - start = hidden.adjustForHiddenColumns(end); - start = hidden.getHiddenBoundaryLeft(start) + 1; + start = hidden.visibleToAbsoluteColumn(end); + start = hidden.getNextHiddenBoundary(true, start) + 1; } } while (end < max); @@ -1917,13 +1917,13 @@ public abstract class AlignmentViewport AlignmentAnnotation clone = new AlignmentAnnotation(annot); if (selectedOnly && selectionGroup != null) { - alignment.getHiddenColumns().makeVisibleAnnotation( + clone.makeVisibleAnnotation( selectionGroup.getStartRes(), selectionGroup.getEndRes(), - clone); + alignment.getHiddenColumns()); } else { - alignment.getHiddenColumns().makeVisibleAnnotation(clone); + clone.makeVisibleAnnotation(alignment.getHiddenColumns()); } ala.add(clone); } @@ -1956,28 +1956,6 @@ public abstract class AlignmentViewport { alignment.padGaps(); } - if (autoCalculateConsensus) - { - updateConsensus(ap); - } - if (hconsensus != null && autoCalculateConsensus) - { - updateConservation(ap); - } - if (autoCalculateStrucConsensus) - { - updateStrucConsensus(ap); - } - updateInformation(ap); - - Map hmmSequences; - hmmSequences = alignment.getHMMConsensusSequences(false); - - for (Map.Entry entry : hmmSequences.entrySet()) - { - SequenceI seq = entry.getValue(); - seq.updateHMMMapping(); - } // Reset endRes of groups if beyond alignment width int alWidth = alignment.getWidth(); @@ -2000,7 +1978,6 @@ public abstract class AlignmentViewport updateAllColourSchemes(); calculator.restartWorkers(); - // alignment.adjustSequenceAnnotations(); } /** @@ -2013,7 +1990,7 @@ public abstract class AlignmentViewport { rs.alignmentChanged(alignment, hiddenRepSequences); - rs.setConsensus(hconsensus); + rs.setConsensus(consensusProfiles); if (rs.conservationApplied()) { rs.setConservation(Conservation.calculateConservation("All", @@ -2038,7 +2015,7 @@ public abstract class AlignmentViewport // depending on if the user wants to see the annotation or not in a // specific alignment - if (hconsensus == null && !isDataset) + if (consensusProfiles == null && !isDataset) { if (!alignment.isNucleotide()) { @@ -2054,7 +2031,7 @@ public abstract class AlignmentViewport new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(consensus); - initGapCounts(); + initOccupancy(); initComplementConsensus(); } @@ -2111,39 +2088,22 @@ public abstract class AlignmentViewport } } - public void initInformation(SequenceI hmmSequence) - { - AlignmentAnnotation information; - information = new AlignmentAnnotation(hmmSequence.getName(), - MessageManager.getString("label.information_description"), - new Annotation[1], 0f, 6.52f, AlignmentAnnotation.BAR_GRAPH); - information.hasText = true; - information.autoCalculated = true; - information.hasText = true; - information.autoCalculated = false; - information.sequenceRef = hmmSequence; - information.setCalcId("HMM annotation"); - this.information.add(information); - hinformation.add(new Profiles(new ProfileI[1])); - alignment.addAnnotation(information); - } - // these should be extracted from the view model - style and settings for // derived annotation - private void initGapCounts() + private void initOccupancy() { if (showOccupancy) { - gapcounts = new AlignmentAnnotation("Occupancy", + occupancy = new AlignmentAnnotation("Occupancy", MessageManager.getString("label.occupancy_descr"), new Annotation[1], 0f, alignment.getHeight(), AlignmentAnnotation.BAR_GRAPH); - gapcounts.hasText = true; - gapcounts.autoCalculated = true; - gapcounts.scaleColLabel = true; - gapcounts.graph = AlignmentAnnotation.BAR_GRAPH; + occupancy.hasText = true; + occupancy.autoCalculated = true; + occupancy.scaleColLabel = true; + occupancy.graph = AlignmentAnnotation.BAR_GRAPH; - alignment.addAnnotation(gapcounts); + alignment.addAnnotation(occupancy); } } @@ -2317,7 +2277,7 @@ public abstract class AlignmentViewport sg.setshowSequenceLogo(showprf); sg.setShowConsensusHistogram(showConsHist); sg.setNormaliseSequenceLogo(normLogo); - sg.setshowHMMSequenceLogo(showHMMPrf); + sg.setShowHMMSequenceLogo(showHMMPrf); sg.setShowInformationHistogram(showInfoHist); sg.setNormaliseHMMSequenceLogo(normHMMLogo); } @@ -2923,7 +2883,7 @@ public abstract class AlignmentViewport int lastSeq = alignment.getHeight() - 1; List seqMappings = null; for (int seqNo = ranges - .getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) + .getStartSeq(); seqNo <= lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) @@ -3019,6 +2979,8 @@ public abstract class AlignmentViewport */ private SearchResultsI searchResults = null; + protected TreeModel currentTree = null; + @Override public boolean hasSearchResults() { @@ -3037,4 +2999,155 @@ public abstract class AlignmentViewport return searchResults; } + /** + * get the consensus sequence as displayed under the PID consensus annotation + * row. + * + * @return consensus sequence as a new sequence object + */ + public SequenceI getConsensusSeq() + { + if (consensus == null) + { + updateConsensus(null); + } + if (consensus == null) + { + return null; + } + StringBuffer seqs = new StringBuffer(); + for (int i = 0; i < consensus.annotations.length; i++) + { + Annotation annotation = consensus.annotations[i]; + if (annotation != null) + { + String description = annotation.description; + if (description != null && description.startsWith("[")) + { + // consensus is a tie - just pick the first one + seqs.append(description.charAt(1)); + } + else + { + seqs.append(annotation.displayCharacter); + } + } + } + + SequenceI sq = new Sequence("Consensus", seqs.toString()); + sq.setDescription("Percentage Identity Consensus " + + ((ignoreGapsInConsensusCalculation) ? " without gaps" : "")); + return sq; + } + + public boolean hasReferenceAnnotation() + { + AlignmentAnnotation[] annots = this.alignment.getAlignmentAnnotation(); + for (AlignmentAnnotation annot : annots) + { + if ("RF".equals(annot.label) || annot.label.contains("Reference")) + { + return true; + } + } + return false; + } + + @Override + public void setCurrentTree(TreeModel tree) + { + currentTree = tree; + } + + @Override + public TreeModel getCurrentTree() + { + return currentTree; + } + + @Override + public boolean isNormaliseSequenceLogo() + { + return normaliseSequenceLogo; + } + + public void setNormaliseSequenceLogo(boolean state) + { + normaliseSequenceLogo = state; + } + + @Override + public boolean isNormaliseHMMSequenceLogo() + { + return hmmNormaliseSequenceLogo; + } + + public void setNormaliseHMMSequenceLogo(boolean state) + { + hmmNormaliseSequenceLogo = state; + } + + /** + * flag set to indicate if structure views might be out of sync with sequences + * in the alignment + */ + + private boolean needToUpdateStructureViews = false; + + @Override + public boolean isUpdateStructures() + { + return needToUpdateStructureViews; + } + + @Override + public void setUpdateStructures(boolean update) + { + needToUpdateStructureViews = update; + } + + @Override + public boolean needToUpdateStructureViews() + { + boolean update = needToUpdateStructureViews; + needToUpdateStructureViews = false; + return update; + } + + @Override + public void addSequenceGroup(SequenceGroup sequenceGroup) + { + alignment.addGroup(sequenceGroup); + + Color col = sequenceGroup.idColour; + if (col != null) + { + col = col.brighter(); + + for (SequenceI sq : sequenceGroup.getSequences()) + { + setSequenceColour(sq, col); + } + } + + if (codingComplement != null) + { + SequenceGroup mappedGroup = MappingUtils + .mapSequenceGroup(sequenceGroup, this, codingComplement); + if (mappedGroup.getSequences().size() > 0) + { + codingComplement.getAlignment().addGroup(mappedGroup); + + if (col != null) + { + for (SequenceI seq : mappedGroup.getSequences()) + { + codingComplement.setSequenceColour(seq, col); + } + } + } + // propagate the structure view update flag according to our own setting + codingComplement.setUpdateStructures(needToUpdateStructureViews); + } + } }