JAL-1807 test
[jalviewjs.git] / bin / jalview / renderer / AnnotationRenderer.js
index 00d98e4..221e5d3 100644 (file)
-Clazz.declarePackage ("jalview.renderer");\r
-Clazz.load (["jalview.util.Platform", "java.awt.Color"], "jalview.renderer.AnnotationRenderer", ["jalview.analysis.AAFrequency", "$.CodingUtils", "$.StructureFrequency", "jalview.jsdev.RegExp", "jalview.schemes.NucleotideColourScheme", "$.ResidueProperties", "$.ZappoColourScheme", "java.awt.BasicStroke", "java.awt.geom.AffineTransform", "java.util.BitSet"], function () {\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.debugRedraw = false;\r
-this.charWidth = 0;\r
-this.endRes = 0;\r
-this.charHeight = 0;\r
-this.validCharWidth = false;\r
-this.hasHiddenColumns = false;\r
-this.fm = null;\r
-this.MAC = false;\r
-this.av_renderHistogram = true;\r
-this.av_renderProfile = true;\r
-this.av_normaliseProfile = false;\r
-this.profcolour = null;\r
-this.columnSelection = null;\r
-this.hconsensus = null;\r
-this.complementConsensus = null;\r
-this.hStrucConsensus = null;\r
-this.av_ignoreGapsConsensus = false;\r
-this.fadedImage = null;\r
-this.annotationPanel = null;\r
-this.imgWidth = 0;\r
-this.sOffset = 0;\r
-this.visHeight = 0;\r
-this.useClip = true;\r
-this.canClip = false;\r
-this.rna = false;\r
-this.sdNOTCANONICAL_COLOUR = null;\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.renderer, "AnnotationRenderer");\r
-Clazz.prepareFields (c$, function () {\r
-this.MAC = jalview.util.Platform.isAMac ();\r
-});\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-this.construct (false);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (debugRedraw) {\r
-this.debugRedraw = debugRedraw;\r
-}, "~B");\r
-Clazz.defineMethod (c$, "drawStemAnnot", \r
-function (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {\r
-g.setColor (jalview.renderer.AnnotationRenderer.STEM_COLOUR);\r
-var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;\r
-var x1 = lastSSX;\r
-var x2 = (x * this.charWidth);\r
-var closeparen = jalview.jsdev.RegExp.newRegex (["(\\))"]);\r
-var dc = (column == 0 || row_annotations[column - 1] == null) ? ' ' : row_annotations[column - 1].secondaryStructure;\r
-var diffupstream = sCol == 0 || row_annotations[sCol - 1] == null || dc != row_annotations[sCol - 1].secondaryStructure;\r
-var diffdownstream = !validRes || !validEnd || row_annotations[column] == null || dc != row_annotations[column].secondaryStructure;\r
-if (column > 0 && jalview.schemes.ResidueProperties.isCloseParenRNA (dc)) {\r
-if (diffupstream) {\r
-g.fillPolygon ( Clazz.newIntArray (-1, [lastSSX + 5, lastSSX + 5, lastSSX]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);\r
-x1 += 5;\r
-}if (diffdownstream) {\r
-x2 -= 1;\r
-}} else {\r
-if (diffdownstream) {\r
-g.fillPolygon ( Clazz.newIntArray (-1, [x2 - 5, x2 - 5, x2]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);\r
-x2 -= 5;\r
-}if (diffupstream) {\r
-x1 += 1;\r
-}}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 7);\r
-}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");\r
-Clazz.defineMethod (c$, "drawNotCanonicalAnnot", \r
-function (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {\r
-g.setColor (nonCanColor);\r
-var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;\r
-var x1 = lastSSX;\r
-var x2 = (x * this.charWidth);\r
-var closeparen = jalview.jsdev.RegExp.newRegex (["}|]|<|[a-z]"]);\r
-var dc = (column == 0 || row_annotations[column - 1] == null) ? "" : row_annotations[column - 1].displayCharacter;\r
-var diffupstream = sCol == 0 || row_annotations[sCol - 1] == null || !dc.equals (row_annotations[sCol - 1].displayCharacter);\r
-var diffdownstream = !validRes || !validEnd || row_annotations[column] == null || !dc.equals (row_annotations[column].displayCharacter);\r
-if (column > 0 && closeparen.search (dc)) {\r
-if (diffupstream) {\r
-g.fillPolygon ( Clazz.newIntArray (-1, [lastSSX + 5, lastSSX + 5, lastSSX]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);\r
-x1 += 5;\r
-}if (diffdownstream) {\r
-x2 -= 1;\r
-}} else {\r
-if (diffdownstream) {\r
-g.fillPolygon ( Clazz.newIntArray (-1, [x2 - 5, x2 - 5, x2]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);\r
-x2 -= 5;\r
-}if (diffupstream) {\r
-x1 += 1;\r
-}}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 7);\r
-}, "java.awt.Graphics,java.awt.Color,~A,~N,~N,~N,~N,~N,~N,~B,~B");\r
-Clazz.defineMethod (c$, "updateFromAwtRenderPanel", \r
-function (annotPanel, av) {\r
-this.fm = annotPanel.getFontMetrics ();\r
-this.annotationPanel = annotPanel;\r
-this.fadedImage = annotPanel.getFadedImage ();\r
-this.imgWidth = annotPanel.getFadedImageWidth ();\r
-var bounds = annotPanel.getVisibleVRange ();\r
-if (bounds != null) {\r
-this.sOffset = bounds[0];\r
-this.visHeight = bounds[1];\r
-if (this.visHeight == 0) {\r
-this.useClip = false;\r
-} else {\r
-this.useClip = this.canClip;\r
-}} else {\r
-this.useClip = false;\r
-}this.updateFromAlignViewport (av);\r
-}, "jalview.renderer.AwtRenderPanelI,jalview.api.AlignViewportI");\r
-Clazz.defineMethod (c$, "updateFromAlignViewport", \r
-function (av) {\r
-this.charWidth = av.getCharWidth ();\r
-this.endRes = av.getEndRes ();\r
-this.charHeight = av.getCharHeight ();\r
-this.hasHiddenColumns = av.hasHiddenColumns ();\r
-this.validCharWidth = av.isValidCharWidth ();\r
-this.av_renderHistogram = av.isShowConsensusHistogram ();\r
-this.av_renderProfile = av.isShowSequenceLogo ();\r
-this.av_normaliseProfile = av.isNormaliseSequenceLogo ();\r
-this.profcolour = av.getGlobalColourScheme ();\r
-if (this.profcolour == null) {\r
-this.profcolour = av.getAlignment ().isNucleotide () ?  new jalview.schemes.NucleotideColourScheme () :  new jalview.schemes.ZappoColourScheme ();\r
-}this.columnSelection = av.getColumnSelection ();\r
-this.hconsensus = av.getSequenceConsensusHash ();\r
-this.complementConsensus = av.getComplementConsensusHash ();\r
-this.hStrucConsensus = av.getRnaStructureConsensusHash ();\r
-this.av_ignoreGapsConsensus = av.isIgnoreGapsConsensus ();\r
-}, "jalview.api.AlignViewportI");\r
-Clazz.defineMethod (c$, "getProfileFor", \r
-function (aa, column) {\r
-if (aa.autoCalculated && (aa.label.startsWith ("Consensus") || aa.label.startsWith ("cDNA Consensus"))) {\r
-var forComplement = aa.label.startsWith ("cDNA Consensus");\r
-if (aa.groupRef != null && aa.groupRef.consensusData != null && aa.groupRef.isShowSequenceLogo ()) {\r
-return jalview.analysis.AAFrequency.extractProfile (aa.groupRef.consensusData[column], aa.groupRef.getIgnoreGapsConsensus ());\r
-}if (aa.groupRef == null && aa.sequenceRef == null) {\r
-if (forComplement) {\r
-return jalview.analysis.AAFrequency.extractCdnaProfile (this.complementConsensus[column], this.av_ignoreGapsConsensus);\r
-} else {\r
-return jalview.analysis.AAFrequency.extractProfile (this.hconsensus[column], this.av_ignoreGapsConsensus);\r
-}}} else {\r
-if (aa.autoCalculated && aa.label.startsWith ("StrucConsensus")) {\r
-if (aa.groupRef == null && aa.sequenceRef == null && this.hStrucConsensus != null && this.hStrucConsensus.length > column) {\r
-return jalview.analysis.StructureFrequency.extractProfile (this.hStrucConsensus[column], this.av_ignoreGapsConsensus);\r
-}}}return null;\r
-}, "jalview.datamodel.AlignmentAnnotation,~N");\r
-Clazz.defineMethod (c$, "drawComponent", \r
-function (annotPanel, av, g, activeRow, startRes, endRes) {\r
-var stime = System.currentTimeMillis ();\r
-var usedFaded = false;\r
-this.updateFromAwtRenderPanel (annotPanel, av);\r
-this.fm = g.getFontMetrics ();\r
-var aa = av.getAlignment ().getAlignmentAnnotation ();\r
-var temp = 0;\r
-if (aa == null) {\r
-return false;\r
-}var x = 0;\r
-var y = 0;\r
-var column = 0;\r
-var lastSS;\r
-var lastSSX;\r
-var iconOffset = 0;\r
-var validRes = false;\r
-var validEnd = false;\r
-var labelAllCols = false;\r
-var centreColLabels;\r
-var centreColLabelsDef = av.isCentreColumnLabels ();\r
-var scaleColLabel = false;\r
-var consensusAnnot = av.getAlignmentConsensusAnnotation ();\r
-var structConsensusAnnot = av.getAlignmentStrucConsensusAnnotation ();\r
-var complementConsensusAnnot = av.getComplementConsensusAnnotation ();\r
-var renderHistogram = true;\r
-var renderProfile = true;\r
-var normaliseProfile = false;\r
-var isRNA = this.rna;\r
-var graphGroupDrawn =  new java.util.BitSet ();\r
-var charOffset = 0;\r
-var fmWidth;\r
-var fmScaling = 1;\r
-var ofont = g.getFont ();\r
-var yfrom = 0;\r
-var f_i = 0;\r
-var yto = 0;\r
-var f_to = 0;\r
-var clipst = false;\r
-var clipend = false;\r
-for (var i = 0; i < aa.length; i++) {\r
-var row = aa[i];\r
-isRNA = row.isRNA ();\r
-{\r
-if (row.groupRef != null && row === row.groupRef.getConsensus ()) {\r
-renderHistogram = row.groupRef.isShowConsensusHistogram ();\r
-renderProfile = row.groupRef.isShowSequenceLogo ();\r
-normaliseProfile = row.groupRef.isNormaliseSequenceLogo ();\r
-} else if (row === consensusAnnot || row === structConsensusAnnot || row === complementConsensusAnnot) {\r
-renderHistogram = this.av_renderHistogram;\r
-renderProfile = this.av_renderProfile;\r
-normaliseProfile = this.av_normaliseProfile;\r
-} else {\r
-renderHistogram = true;\r
-}}var row_annotations = row.annotations;\r
-if (!row.visible) {\r
-continue;\r
-}centreColLabels = row.centreColLabels || centreColLabelsDef;\r
-labelAllCols = row.showAllColLabels;\r
-scaleColLabel = row.scaleColLabel;\r
-lastSS = ' ';\r
-lastSSX = 0;\r
-if (!this.useClip || ((y - this.charHeight) < this.visHeight && (y + row.height + this.charHeight * 2) >= this.sOffset)) {\r
-if (!clipst) {\r
-clipst = true;\r
-yfrom = y;\r
-f_i = i;\r
-}yto = y;\r
-f_to = i;\r
-if (row.graph > 0) {\r
-if (row.graphGroup > -1 && graphGroupDrawn.get (row.graphGroup)) {\r
-continue;\r
-}y += row.height;\r
-if (row.hasText) {\r
-iconOffset = this.charHeight - this.fm.getDescent ();\r
-y -= this.charHeight;\r
-}} else if (row.hasText) {\r
-iconOffset = this.charHeight - this.fm.getDescent ();\r
-} else {\r
-iconOffset = 0;\r
-}if (row.autoCalculated && av.isCalculationInProgress (row)) {\r
-y += this.charHeight;\r
-usedFaded = true;\r
-g.drawImage (this.fadedImage, 0, y - row.height, this.imgWidth, y, 0, y - row.height, this.imgWidth, y, this.annotationPanel);\r
-g.setColor (java.awt.Color.black);\r
-continue;\r
-}x = (startRes == 0) ? 0 : -1;\r
-while (x < endRes - startRes) {\r
-if (this.hasHiddenColumns) {\r
-column = this.columnSelection.adjustForHiddenColumns (startRes + x);\r
-if (column > row_annotations.length - 1) {\r
-break;\r
-}} else {\r
-column = startRes + x;\r
-}if ((row_annotations == null) || (row_annotations.length <= column) || (row_annotations[column] == null)) {\r
-validRes = false;\r
-} else {\r
-validRes = true;\r
-}var displayChar = validRes ? row_annotations[column].displayCharacter : null;\r
-if (x > -1) {\r
-if (activeRow == i) {\r
-g.setColor (java.awt.Color.red);\r
-if (this.columnSelection != null) {\r
-for (var n = 0; n < this.columnSelection.size (); n++) {\r
-var v = this.columnSelection.columnAt (n);\r
-if (v == column) {\r
-g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);\r
-}}\r
-}}if (row.getInvalidStrucPos () > x) {\r
-g.setColor (java.awt.Color.orange);\r
-g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);\r
-} else if (row.getInvalidStrucPos () == x) {\r
-g.setColor (java.awt.Color.orange.darker ());\r
-g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);\r
-}if (this.validCharWidth && validRes && displayChar != null && (displayChar.length > 0)) {\r
-fmWidth = this.fm.charsWidth (displayChar.toCharArray (), 0, displayChar.length);\r
-if (scaleColLabel) {\r
-if (fmWidth > this.charWidth) {\r
-fmScaling = this.charWidth;\r
-fmScaling /= fmWidth;\r
-g.setFont (ofont.deriveFont (java.awt.geom.AffineTransform.getScaleInstance (fmScaling, 1.0)));\r
-fmWidth = this.charWidth;\r
-}}charOffset = Clazz.floatToInt ((this.charWidth - fmWidth) / 2);\r
-if (row_annotations[column].colour == null) {\r
-g.setColor (java.awt.Color.black);\r
-} else {\r
-g.setColor (row_annotations[column].colour);\r
-}if (column == 0 || row.graph > 0) {\r
-g.drawString (displayChar, (x * this.charWidth) + charOffset, y + iconOffset);\r
-} else if (row_annotations[column - 1] == null || (labelAllCols || !displayChar.equals (row_annotations[column - 1].displayCharacter) || (displayChar.length < 2 && row_annotations[column].secondaryStructure == ' '))) {\r
-g.drawString (displayChar, x * this.charWidth + charOffset, y + iconOffset);\r
-}g.setFont (ofont);\r
-}}if (row.hasIcons) {\r
-var ss = validRes ? row_annotations[column].secondaryStructure : '-';\r
-if (ss == '(') {\r
-if (displayChar.indexOf (')') > -1) {\r
-ss = ')';\r
-}}if (ss == '[') {\r
-if ((displayChar.indexOf (']') > -1)) {\r
-ss = ']';\r
-}}if (ss == '{') {\r
-if (displayChar.indexOf ('}') > -1) {\r
-ss = '}';\r
-}}if (ss == '<') {\r
-if (displayChar.indexOf ('<') > -1) {\r
-ss = '>';\r
-}}if (ss.charCodeAt (0) >= 65) {\r
-if (displayChar.indexOf (ss.charCodeAt (0) + 32) > -1) {\r
-ss = String.fromCharCode (ss.charCodeAt (0) + 32);\r
-}}if (!validRes || (ss != lastSS)) {\r
-if (x > -1) {\r
-var nb_annot = x - temp;\r
-switch (lastSS) {\r
-case '(':\r
-case ')':\r
-this.drawStemAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-temp = x;\r
-break;\r
-case 'H':\r
-if (!isRNA) {\r
-this.drawHelixAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-}case 'E':\r
-if (!isRNA) {\r
-this.drawSheetAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-}case '{':\r
-case '}':\r
-case '[':\r
-case ']':\r
-case '>':\r
-case '<':\r
-case 'A':\r
-case 'a':\r
-case 'B':\r
-case 'b':\r
-case 'C':\r
-case 'c':\r
-case 'D':\r
-case 'd':\r
-case 'e':\r
-case 'F':\r
-case 'f':\r
-case 'G':\r
-case 'g':\r
-case 'h':\r
-case 'I':\r
-case 'i':\r
-case 'J':\r
-case 'j':\r
-case 'K':\r
-case 'k':\r
-case 'L':\r
-case 'l':\r
-case 'M':\r
-case 'm':\r
-case 'N':\r
-case 'n':\r
-case 'O':\r
-case 'o':\r
-case 'P':\r
-case 'p':\r
-case 'Q':\r
-case 'q':\r
-case 'R':\r
-case 'r':\r
-case 'S':\r
-case 's':\r
-case 'T':\r
-case 't':\r
-case 'U':\r
-case 'u':\r
-case 'V':\r
-case 'v':\r
-case 'W':\r
-case 'w':\r
-case 'X':\r
-case 'x':\r
-case 'Y':\r
-case 'y':\r
-case 'Z':\r
-case 'z':\r
-var nonCanColor = this.getNotCanonicalColor (lastSS);\r
-this.drawNotCanonicalAnnot (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-temp = x;\r
-break;\r
-default:\r
-g.setColor (java.awt.Color.gray);\r
-g.fillRect (lastSSX, y + 6 + iconOffset, (x * this.charWidth) - lastSSX, 2);\r
-temp = x;\r
-break;\r
-}\r
-}if (validRes) {\r
-lastSS = ss;\r
-} else {\r
-lastSS = ' ';\r
-}if (x > -1) {\r
-lastSSX = (x * this.charWidth);\r
-}}}column++;\r
-x++;\r
-}\r
-if (column >= row_annotations.length) {\r
-column = row_annotations.length - 1;\r
-validEnd = false;\r
-} else {\r
-validEnd = true;\r
-}if ((row_annotations == null) || (row_annotations.length <= column) || (row_annotations[column] == null)) {\r
-validRes = false;\r
-} else {\r
-validRes = true;\r
-}if (row.hasIcons) {\r
-switch (lastSS) {\r
-case 'H':\r
-if (!isRNA) {\r
-this.drawHelixAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-}case 'E':\r
-if (!isRNA) {\r
-this.drawSheetAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-}case '(':\r
-case ')':\r
-this.drawStemAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-case '{':\r
-case '}':\r
-case '[':\r
-case ']':\r
-case '>':\r
-case '<':\r
-case 'A':\r
-case 'a':\r
-case 'B':\r
-case 'b':\r
-case 'C':\r
-case 'c':\r
-case 'D':\r
-case 'd':\r
-case 'e':\r
-case 'F':\r
-case 'f':\r
-case 'G':\r
-case 'g':\r
-case 'h':\r
-case 'I':\r
-case 'i':\r
-case 'J':\r
-case 'j':\r
-case 'K':\r
-case 'k':\r
-case 'L':\r
-case 'l':\r
-case 'M':\r
-case 'm':\r
-case 'N':\r
-case 'n':\r
-case 'O':\r
-case 'o':\r
-case 'P':\r
-case 'p':\r
-case 'Q':\r
-case 'q':\r
-case 'R':\r
-case 'r':\r
-case 'T':\r
-case 't':\r
-case 'U':\r
-case 'u':\r
-case 'V':\r
-case 'v':\r
-case 'W':\r
-case 'w':\r
-case 'X':\r
-case 'x':\r
-case 'Y':\r
-case 'y':\r
-case 'Z':\r
-case 'z':\r
-var nonCanColor = this.getNotCanonicalColor (lastSS);\r
-this.drawNotCanonicalAnnot (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-default:\r
-this.drawGlyphLine (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);\r
-break;\r
-}\r
-}if (row.graph > 0 && row.graphHeight > 0) {\r
-if (row.graph == 2) {\r
-if (row.graphGroup > -1 && !graphGroupDrawn.get (row.graphGroup)) {\r
-var groupmax = -999999;\r
-var groupmin = 9999999;\r
-for (var gg = 0; gg < aa.length; gg++) {\r
-if (aa[gg].graphGroup != row.graphGroup) {\r
-continue;\r
-}if (aa[gg] !== row) {\r
-aa[gg].visible = false;\r
-}if (aa[gg].graphMax > groupmax) {\r
-groupmax = aa[gg].graphMax;\r
-}if (aa[gg].graphMin < groupmin) {\r
-groupmin = aa[gg].graphMin;\r
-}}\r
-for (var gg = 0; gg < aa.length; gg++) {\r
-if (aa[gg].graphGroup == row.graphGroup) {\r
-this.drawLineGraph (g, aa[gg], aa[gg].annotations, startRes, endRes, y, groupmin, groupmax, row.graphHeight);\r
-}}\r
-graphGroupDrawn.set (row.graphGroup);\r
-} else {\r
-this.drawLineGraph (g, row, row_annotations, startRes, endRes, y, row.graphMin, row.graphMax, row.graphHeight);\r
-}} else if (row.graph == 1) {\r
-this.drawBarGraph (g, row, row_annotations, startRes, endRes, row.graphMin, row.graphMax, y, renderHistogram, renderProfile, normaliseProfile);\r
-}}} else {\r
-if (clipst && !clipend) {\r
-clipend = true;\r
-}}if (row.graph > 0 && row.hasText) {\r
-y += this.charHeight;\r
-}if (row.graph == 0) {\r
-y += aa[i].height;\r
-}}\r
-if (this.debugRedraw) {\r
-if (this.canClip) {\r
-if (clipst) {\r
-System.err.println ("Start clip at : " + yfrom + " (index " + f_i + ")");\r
-}if (clipend) {\r
-System.err.println ("End clip at : " + yto + " (index " + f_to + ")");\r
-}};System.err.println ("Annotation Rendering time:" + (System.currentTimeMillis () - stime));\r
-};return !usedFaded;\r
-}, "jalview.renderer.AwtRenderPanelI,jalview.api.AlignViewportI,java.awt.Graphics,~N,~N,~N");\r
-Clazz.defineMethod (c$, "drawGlyphLine", \r
-function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {\r
-g.setColor (jalview.renderer.AnnotationRenderer.GLYPHLINE_COLOR);\r
-g.fillRect (lastSSX, y + 6 + iconOffset, (x * this.charWidth) - lastSSX, 2);\r
-}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");\r
-Clazz.defineMethod (c$, "drawSheetAnnot", \r
-function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {\r
-g.setColor (jalview.renderer.AnnotationRenderer.SHEET_COLOUR);\r
-if (!validEnd || !validRes || row == null || row[column] == null || row[column].secondaryStructure != 'E') {\r
-g.fillRect (lastSSX, y + 4 + iconOffset, (x * this.charWidth) - lastSSX - 4, 7);\r
-g.fillPolygon ( Clazz.newIntArray (-1, [(x * this.charWidth) - 4, (x * this.charWidth) - 4, (x * this.charWidth)]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 7 + iconOffset]), 3);\r
-} else {\r
-g.fillRect (lastSSX, y + 4 + iconOffset, (x + 1) * this.charWidth - lastSSX, 7);\r
-}}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");\r
-Clazz.defineMethod (c$, "drawHelixAnnot", \r
-function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {\r
-g.setColor (jalview.renderer.AnnotationRenderer.HELIX_COLOUR);\r
-var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;\r
-var x1 = lastSSX;\r
-var x2 = (x * this.charWidth);\r
-if (this.MAC) {\r
-var ofs = Clazz.doubleToInt (this.charWidth / 2);\r
-g.fillRoundRect (lastSSX, y + 4 + iconOffset, x2 - x1, 8, 8, 8);\r
-if (sCol == 0 || row[sCol - 1] == null || row[sCol - 1].secondaryStructure != 'H') {\r
-} else {\r
-g.fillRoundRect (lastSSX, y + 4 + iconOffset, x2 - x1 - ofs + 1, 8, 0, 0);\r
-}if (!validRes || row[column] == null || row[column].secondaryStructure != 'H') {\r
-} else {\r
-g.fillRoundRect (lastSSX + ofs, y + 4 + iconOffset, x2 - x1 - ofs + 1, 8, 0, 0);\r
-}return;\r
-}if (sCol == 0 || row[sCol - 1] == null || row[sCol - 1].secondaryStructure != 'H') {\r
-g.fillArc (lastSSX, y + 4 + iconOffset, this.charWidth, 8, 90, 180);\r
-x1 += Clazz.doubleToInt (this.charWidth / 2);\r
-}if (!validRes || row[column] == null || row[column].secondaryStructure != 'H') {\r
-g.fillArc ((x * this.charWidth) - this.charWidth, y + 4 + iconOffset, this.charWidth, 8, 270, 180);\r
-x2 -= Clazz.doubleToInt (this.charWidth / 2);\r
-}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 8);\r
-}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");\r
-Clazz.defineMethod (c$, "drawLineGraph", \r
-function (g, _aa, aa_annotations, sRes, eRes, y, min, max, graphHeight) {\r
-if (sRes > aa_annotations.length) {\r
-return;\r
-}var x = 0;\r
-if (eRes < this.endRes) {\r
-eRes++;\r
-}eRes = Math.min (eRes, aa_annotations.length);\r
-if (sRes == 0) {\r
-x++;\r
-}var y1 = y;\r
-var y2 = y;\r
-var range = max - min;\r
-if (min < 0) {\r
-y2 = y - Clazz.floatToInt ((0 - min / range) * graphHeight);\r
-}g.setColor (java.awt.Color.gray);\r
-g.drawLine (x - this.charWidth, y2, (eRes - sRes + 1) * this.charWidth, y2);\r
-eRes = Math.min (eRes, aa_annotations.length);\r
-var column;\r
-var aaMax = aa_annotations.length - 1;\r
-while (x < eRes - sRes) {\r
-column = sRes + x;\r
-if (this.hasHiddenColumns) {\r
-column = this.columnSelection.adjustForHiddenColumns (column);\r
-}if (column > aaMax) {\r
-break;\r
-}if (aa_annotations[column] == null || aa_annotations[column - 1] == null) {\r
-x++;\r
-continue;\r
-}if (aa_annotations[column].colour == null) {\r
-g.setColor (java.awt.Color.black);\r
-} else {\r
-g.setColor (aa_annotations[column].colour);\r
-}y1 = y - Clazz.floatToInt (((aa_annotations[column - 1].value - min) / range) * graphHeight);\r
-y2 = y - Clazz.floatToInt (((aa_annotations[column].value - min) / range) * graphHeight);\r
-g.drawLine (x * this.charWidth - Clazz.doubleToInt (this.charWidth / 2), y1, x * this.charWidth + Clazz.doubleToInt (this.charWidth / 2), y2);\r
-x++;\r
-}\r
-if (_aa.threshold != null) {\r
-g.setColor (_aa.threshold.colour);\r
-var g2 = g;\r
-g2.setStroke ( new java.awt.BasicStroke (1, 2, 1, 3,  Clazz.newFloatArray (-1, [5, 3]), 0));\r
-y2 = Clazz.floatToInt (y - ((_aa.threshold.value - min) / range) * graphHeight);\r
-g.drawLine (0, y2, (eRes - sRes) * this.charWidth, y2);\r
-g2.setStroke ( new java.awt.BasicStroke ());\r
-}}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "drawBarGraph", \r
-function (g, _aa, aa_annotations, sRes, eRes, min, max, y, renderHistogram, renderProfile, normaliseProfile) {\r
-if (sRes > aa_annotations.length) {\r
-return;\r
-}var ofont = g.getFont ();\r
-eRes = Math.min (eRes, aa_annotations.length);\r
-var x = 0;\r
-var y1 = y;\r
-var y2 = y;\r
-var range = max - min;\r
-if (min < 0) {\r
-y2 = y - Clazz.floatToInt ((0 - min / (range)) * _aa.graphHeight);\r
-}g.setColor (java.awt.Color.gray);\r
-g.drawLine (x, y2, (eRes - sRes) * this.charWidth, y2);\r
-var column;\r
-var aaMax = aa_annotations.length - 1;\r
-while (x < eRes - sRes) {\r
-column = sRes + x;\r
-if (this.hasHiddenColumns) {\r
-column = this.columnSelection.adjustForHiddenColumns (column);\r
-}if (column > aaMax) {\r
-break;\r
-}if (aa_annotations[column] == null) {\r
-x++;\r
-continue;\r
-}if (aa_annotations[column].colour == null) {\r
-g.setColor (java.awt.Color.black);\r
-} else {\r
-g.setColor (aa_annotations[column].colour);\r
-}y1 = y - Clazz.floatToInt (((aa_annotations[column].value - min) / (range)) * _aa.graphHeight);\r
-if (renderHistogram) {\r
-if (y1 - y2 > 0) {\r
-g.fillRect (x * this.charWidth, y2, this.charWidth, y1 - y2);\r
-} else {\r
-g.fillRect (x * this.charWidth, y1, this.charWidth, y2 - y1);\r
-}}if (renderProfile) {\r
-var profl = this.getProfileFor (_aa, column);\r
-if (profl != null && profl[2] != 0) {\r
-var isStructureProfile = profl[0] == 1;\r
-var isCdnaProfile = profl[0] == 2;\r
-var ht = normaliseProfile ? y - _aa.graphHeight : y1;\r
-var htn = normaliseProfile ? _aa.graphHeight : (y2 - y1);\r
-var hght;\r
-var wdth;\r
-var ht2 = 0;\r
-var dc;\r
-dc =  Clazz.newCharArray (isStructureProfile ? 2 : (isCdnaProfile ? 3 : 1), '\0');\r
-var lm = g.getFontMetrics (ofont).getLineMetrics ("Q", g);\r
-var scale = 1 / (normaliseProfile ? profl[2] : 100);\r
-var ofontHeight = 1 / lm.getAscent ();\r
-var scl = 0.0;\r
-var c = 3;\r
-var valuesProcessed = 0;\r
-while (valuesProcessed < profl[1]) {\r
-if (isStructureProfile) {\r
-dc[0] = String.fromCharCode (profl[c++]);\r
-dc[1] = String.fromCharCode (profl[c++]);\r
-} else if (isCdnaProfile) {\r
-dc = jalview.analysis.CodingUtils.decodeCodon (profl[c++]);\r
-} else {\r
-dc[0] = String.fromCharCode (profl[c++]);\r
-}wdth = this.charWidth;\r
-wdth /= this.fm.charsWidth (dc, 0, dc.length);\r
-ht += scl;\r
-scl = htn * scale * profl[c++];\r
-lm = ofont.getLineMetrics (dc, 0, 1, g.getFontMetrics ().getFontRenderContext ());\r
-g.setFont (ofont.deriveFont (java.awt.geom.AffineTransform.getScaleInstance (wdth, scl / lm.getAscent ())));\r
-lm = g.getFontMetrics ().getLineMetrics (dc, 0, 1, g);\r
-var colour = null;\r
-if (isCdnaProfile) {\r
-var codonTranslation = jalview.schemes.ResidueProperties.codonTranslate ( String.instantialize (dc));\r
-colour = this.profcolour.findColour (codonTranslation.charAt (0), column, null);\r
-} else {\r
-colour = this.profcolour.findColour (dc[0], column, null);\r
-}g.setColor (colour === java.awt.Color.white ? java.awt.Color.lightGray : colour);\r
-hght = (ht + (scl - lm.getDescent () - lm.getBaselineOffsets ()[lm.getBaselineIndex ()]));\r
-g.drawChars (dc, 0, dc.length, x * this.charWidth, Clazz.doubleToInt (hght));\r
-valuesProcessed++;\r
-}\r
-g.setFont (ofont);\r
-}}x++;\r
-}\r
-if (_aa.threshold != null) {\r
-g.setColor (_aa.threshold.colour);\r
-var g2 = g;\r
-g2.setStroke ( new java.awt.BasicStroke (1, 2, 1, 3,  Clazz.newFloatArray (-1, [5, 3]), 0));\r
-y2 = Clazz.floatToInt (y - ((_aa.threshold.value - min) / range) * _aa.graphHeight);\r
-g.drawLine (0, y2, (eRes - sRes) * this.charWidth, y2);\r
-g2.setStroke ( new java.awt.BasicStroke ());\r
-}}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N,~N,~B,~B,~B");\r
-Clazz.defineMethod (c$, "drawGraph", \r
-function (g, _aa, aa_annotations, width, y, sRes, eRes) {\r
-eRes = Math.min (eRes, aa_annotations.length);\r
-g.setColor (java.awt.Color.white);\r
-g.fillRect (0, 0, width, y);\r
-g.setColor ( new java.awt.Color (0, 0, 180));\r
-var x = 0;\r
-var height;\r
-for (var j = sRes; j < eRes; j++) {\r
-if (aa_annotations[j] != null) {\r
-if (aa_annotations[j].colour == null) {\r
-g.setColor (java.awt.Color.black);\r
-} else {\r
-g.setColor (aa_annotations[j].colour);\r
-}height = Clazz.floatToInt ((aa_annotations[j].value / _aa.graphMax) * y);\r
-if (height > y) {\r
-height = y;\r
-}g.fillRect (x, y - height, this.charWidth, height);\r
-}x += this.charWidth;\r
-}\r
-}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "getNotCanonicalColor", \r
-function (lastss) {\r
-switch (lastss) {\r
-case '{':\r
-case '}':\r
-return  new java.awt.Color (255, 125, 5);\r
-case '[':\r
-case ']':\r
-return  new java.awt.Color (245, 115, 10);\r
-case '>':\r
-case '<':\r
-return  new java.awt.Color (235, 135, 15);\r
-case 'A':\r
-case 'a':\r
-return  new java.awt.Color (225, 105, 20);\r
-case 'B':\r
-case 'b':\r
-return  new java.awt.Color (215, 145, 30);\r
-case 'C':\r
-case 'c':\r
-return  new java.awt.Color (205, 95, 35);\r
-case 'D':\r
-case 'd':\r
-return  new java.awt.Color (195, 155, 45);\r
-case 'E':\r
-case 'e':\r
-return  new java.awt.Color (185, 85, 55);\r
-case 'F':\r
-case 'f':\r
-return  new java.awt.Color (175, 165, 65);\r
-case 'G':\r
-case 'g':\r
-return  new java.awt.Color (170, 75, 75);\r
-case 'H':\r
-case 'h':\r
-return  new java.awt.Color (160, 175, 85);\r
-case 'I':\r
-case 'i':\r
-return  new java.awt.Color (150, 65, 95);\r
-case 'J':\r
-case 'j':\r
-return  new java.awt.Color (140, 185, 105);\r
-case 'K':\r
-case 'k':\r
-return  new java.awt.Color (130, 55, 110);\r
-case 'L':\r
-case 'l':\r
-return  new java.awt.Color (120, 195, 120);\r
-case 'M':\r
-case 'm':\r
-return  new java.awt.Color (110, 45, 130);\r
-case 'N':\r
-case 'n':\r
-return  new java.awt.Color (100, 205, 140);\r
-case 'O':\r
-case 'o':\r
-return  new java.awt.Color (90, 35, 150);\r
-case 'P':\r
-case 'p':\r
-return  new java.awt.Color (85, 215, 160);\r
-case 'Q':\r
-case 'q':\r
-return  new java.awt.Color (75, 25, 170);\r
-case 'R':\r
-case 'r':\r
-return  new java.awt.Color (65, 225, 180);\r
-case 'S':\r
-case 's':\r
-return  new java.awt.Color (55, 15, 185);\r
-case 'T':\r
-case 't':\r
-return  new java.awt.Color (45, 235, 195);\r
-case 'U':\r
-case 'u':\r
-return  new java.awt.Color (35, 5, 205);\r
-case 'V':\r
-case 'v':\r
-return  new java.awt.Color (25, 245, 215);\r
-case 'W':\r
-case 'w':\r
-return  new java.awt.Color (15, 0, 225);\r
-case 'X':\r
-case 'x':\r
-return  new java.awt.Color (10, 255, 235);\r
-case 'Y':\r
-case 'y':\r
-return  new java.awt.Color (5, 150, 245);\r
-case 'Z':\r
-case 'z':\r
-return  new java.awt.Color (0, 80, 255);\r
-default:\r
-System.out.println ("This is not a interaction : " + lastss);\r
-return null;\r
-}\r
-}, "~S");\r
-c$.GLYPHLINE_COLOR = c$.prototype.GLYPHLINE_COLOR = java.awt.Color.gray;\r
-c$.SHEET_COLOUR = c$.prototype.SHEET_COLOUR = java.awt.Color.green;\r
-c$.HELIX_COLOUR = c$.prototype.HELIX_COLOUR = java.awt.Color.red;\r
-c$.STEM_COLOUR = c$.prototype.STEM_COLOUR = java.awt.Color.blue;\r
-});\r
+Clazz.declarePackage ("jalview.renderer");
+Clazz.load (["jalview.util.Platform", "java.awt.Color"], "jalview.renderer.AnnotationRenderer", ["jalview.analysis.AAFrequency", "$.CodingUtils", "$.StructureFrequency", "jalview.jsdev.RegExp", "jalview.schemes.NucleotideColourScheme", "$.ResidueProperties", "$.ZappoColourScheme", "java.awt.BasicStroke", "java.awt.geom.AffineTransform", "java.util.BitSet"], function () {
+c$ = Clazz.decorateAsClass (function () {
+this.debugRedraw = false;
+this.charWidth = 0;
+this.endRes = 0;
+this.charHeight = 0;
+this.validCharWidth = false;
+this.hasHiddenColumns = false;
+this.fm = null;
+this.MAC = false;
+this.av_renderHistogram = true;
+this.av_renderProfile = true;
+this.av_normaliseProfile = false;
+this.profcolour = null;
+this.columnSelection = null;
+this.hconsensus = null;
+this.complementConsensus = null;
+this.hStrucConsensus = null;
+this.av_ignoreGapsConsensus = false;
+this.fadedImage = null;
+this.annotationPanel = null;
+this.imgWidth = 0;
+this.sOffset = 0;
+this.visHeight = 0;
+this.useClip = true;
+this.canClip = false;
+this.rna = false;
+this.sdNOTCANONICAL_COLOUR = null;
+Clazz.instantialize (this, arguments);
+}, jalview.renderer, "AnnotationRenderer");
+Clazz.prepareFields (c$, function () {
+this.MAC = jalview.util.Platform.isAMac ();
+});
+Clazz.makeConstructor (c$, 
+function () {
+this.construct (false);
+});
+Clazz.makeConstructor (c$, 
+function (debugRedraw) {
+this.debugRedraw = debugRedraw;
+}, "~B");
+Clazz.defineMethod (c$, "drawStemAnnot", 
+function (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {
+g.setColor (jalview.renderer.AnnotationRenderer.STEM_COLOUR);
+var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;
+var x1 = lastSSX;
+var x2 = (x * this.charWidth);
+var closeparen = jalview.jsdev.RegExp.newRegex (["(\\))"]);
+var dc = (column == 0 || row_annotations[column - 1] == null) ? ' ' : row_annotations[column - 1].secondaryStructure;
+var diffupstream = sCol == 0 || row_annotations[sCol - 1] == null || dc != row_annotations[sCol - 1].secondaryStructure;
+var diffdownstream = !validRes || !validEnd || row_annotations[column] == null || dc != row_annotations[column].secondaryStructure;
+if (column > 0 && jalview.schemes.ResidueProperties.isCloseParenRNA (dc)) {
+if (diffupstream) {
+g.fillPolygon ( Clazz.newIntArray (-1, [lastSSX + 5, lastSSX + 5, lastSSX]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);
+x1 += 5;
+}if (diffdownstream) {
+x2 -= 1;
+}} else {
+if (diffdownstream) {
+g.fillPolygon ( Clazz.newIntArray (-1, [x2 - 5, x2 - 5, x2]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);
+x2 -= 5;
+}if (diffupstream) {
+x1 += 1;
+}}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 7);
+}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");
+Clazz.defineMethod (c$, "drawNotCanonicalAnnot", 
+function (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {
+g.setColor (nonCanColor);
+var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;
+var x1 = lastSSX;
+var x2 = (x * this.charWidth);
+var closeparen = jalview.jsdev.RegExp.newRegex (["}|]|<|[a-z]"]);
+var dc = (column == 0 || row_annotations[column - 1] == null) ? "" : row_annotations[column - 1].displayCharacter;
+var diffupstream = sCol == 0 || row_annotations[sCol - 1] == null || !dc.equals (row_annotations[sCol - 1].displayCharacter);
+var diffdownstream = !validRes || !validEnd || row_annotations[column] == null || !dc.equals (row_annotations[column].displayCharacter);
+if (column > 0 && closeparen.search (dc)) {
+if (diffupstream) {
+g.fillPolygon ( Clazz.newIntArray (-1, [lastSSX + 5, lastSSX + 5, lastSSX]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);
+x1 += 5;
+}if (diffdownstream) {
+x2 -= 1;
+}} else {
+if (diffdownstream) {
+g.fillPolygon ( Clazz.newIntArray (-1, [x2 - 5, x2 - 5, x2]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset]), 3);
+x2 -= 5;
+}if (diffupstream) {
+x1 += 1;
+}}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 7);
+}, "java.awt.Graphics,java.awt.Color,~A,~N,~N,~N,~N,~N,~N,~B,~B");
+Clazz.defineMethod (c$, "updateFromAwtRenderPanel", 
+function (annotPanel, av) {
+this.fm = annotPanel.getFontMetrics ();
+this.annotationPanel = annotPanel;
+this.fadedImage = annotPanel.getFadedImage ();
+this.imgWidth = annotPanel.getFadedImageWidth ();
+var bounds = annotPanel.getVisibleVRange ();
+if (bounds != null) {
+this.sOffset = bounds[0];
+this.visHeight = bounds[1];
+if (this.visHeight == 0) {
+this.useClip = false;
+} else {
+this.useClip = this.canClip;
+}} else {
+this.useClip = false;
+}this.updateFromAlignViewport (av);
+}, "jalview.renderer.AwtRenderPanelI,jalview.api.AlignViewportI");
+Clazz.defineMethod (c$, "updateFromAlignViewport", 
+function (av) {
+this.charWidth = av.getCharWidth ();
+this.endRes = av.getEndRes ();
+this.charHeight = av.getCharHeight ();
+this.hasHiddenColumns = av.hasHiddenColumns ();
+this.validCharWidth = av.isValidCharWidth ();
+this.av_renderHistogram = av.isShowConsensusHistogram ();
+this.av_renderProfile = av.isShowSequenceLogo ();
+this.av_normaliseProfile = av.isNormaliseSequenceLogo ();
+this.profcolour = av.getGlobalColourScheme ();
+if (this.profcolour == null) {
+this.profcolour = av.getAlignment ().isNucleotide () ?  new jalview.schemes.NucleotideColourScheme () :  new jalview.schemes.ZappoColourScheme ();
+}this.columnSelection = av.getColumnSelection ();
+this.hconsensus = av.getSequenceConsensusHash ();
+this.complementConsensus = av.getComplementConsensusHash ();
+this.hStrucConsensus = av.getRnaStructureConsensusHash ();
+this.av_ignoreGapsConsensus = av.isIgnoreGapsConsensus ();
+}, "jalview.api.AlignViewportI");
+Clazz.defineMethod (c$, "getProfileFor", 
+function (aa, column) {
+if (aa.autoCalculated && (aa.label.startsWith ("Consensus") || aa.label.startsWith ("cDNA Consensus"))) {
+var forComplement = aa.label.startsWith ("cDNA Consensus");
+if (aa.groupRef != null && aa.groupRef.consensusData != null && aa.groupRef.isShowSequenceLogo ()) {
+return jalview.analysis.AAFrequency.extractProfile (aa.groupRef.consensusData[column], aa.groupRef.getIgnoreGapsConsensus ());
+}if (aa.groupRef == null && aa.sequenceRef == null) {
+if (forComplement) {
+return jalview.analysis.AAFrequency.extractCdnaProfile (this.complementConsensus[column], this.av_ignoreGapsConsensus);
+} else {
+return jalview.analysis.AAFrequency.extractProfile (this.hconsensus[column], this.av_ignoreGapsConsensus);
+}}} else {
+if (aa.autoCalculated && aa.label.startsWith ("StrucConsensus")) {
+if (aa.groupRef == null && aa.sequenceRef == null && this.hStrucConsensus != null && this.hStrucConsensus.length > column) {
+return jalview.analysis.StructureFrequency.extractProfile (this.hStrucConsensus[column], this.av_ignoreGapsConsensus);
+}}}return null;
+}, "jalview.datamodel.AlignmentAnnotation,~N");
+Clazz.defineMethod (c$, "drawComponent", 
+function (annotPanel, av, g, activeRow, startRes, endRes) {
+var stime = System.currentTimeMillis ();
+var usedFaded = false;
+this.updateFromAwtRenderPanel (annotPanel, av);
+this.fm = g.getFontMetrics ();
+var aa = av.getAlignment ().getAlignmentAnnotation ();
+var temp = 0;
+if (aa == null) {
+return false;
+}var x = 0;
+var y = 0;
+var column = 0;
+var lastSS;
+var lastSSX;
+var iconOffset = 0;
+var validRes = false;
+var validEnd = false;
+var labelAllCols = false;
+var centreColLabels;
+var centreColLabelsDef = av.isCentreColumnLabels ();
+var scaleColLabel = false;
+var consensusAnnot = av.getAlignmentConsensusAnnotation ();
+var structConsensusAnnot = av.getAlignmentStrucConsensusAnnotation ();
+var complementConsensusAnnot = av.getComplementConsensusAnnotation ();
+var renderHistogram = true;
+var renderProfile = true;
+var normaliseProfile = false;
+var isRNA = this.rna;
+var graphGroupDrawn =  new java.util.BitSet ();
+var charOffset = 0;
+var fmWidth;
+var fmScaling = 1;
+var ofont = g.getFont ();
+var yfrom = 0;
+var f_i = 0;
+var yto = 0;
+var f_to = 0;
+var clipst = false;
+var clipend = false;
+for (var i = 0; i < aa.length; i++) {
+var row = aa[i];
+isRNA = row.isRNA ();
+{
+if (row.groupRef != null && row === row.groupRef.getConsensus ()) {
+renderHistogram = row.groupRef.isShowConsensusHistogram ();
+renderProfile = row.groupRef.isShowSequenceLogo ();
+normaliseProfile = row.groupRef.isNormaliseSequenceLogo ();
+} else if (row === consensusAnnot || row === structConsensusAnnot || row === complementConsensusAnnot) {
+renderHistogram = this.av_renderHistogram;
+renderProfile = this.av_renderProfile;
+normaliseProfile = this.av_normaliseProfile;
+} else {
+renderHistogram = true;
+}}var row_annotations = row.annotations;
+if (!row.visible) {
+continue;
+}centreColLabels = row.centreColLabels || centreColLabelsDef;
+labelAllCols = row.showAllColLabels;
+scaleColLabel = row.scaleColLabel;
+lastSS = ' ';
+lastSSX = 0;
+if (!this.useClip || ((y - this.charHeight) < this.visHeight && (y + row.height + this.charHeight * 2) >= this.sOffset)) {
+if (!clipst) {
+clipst = true;
+yfrom = y;
+f_i = i;
+}yto = y;
+f_to = i;
+if (row.graph > 0) {
+if (row.graphGroup > -1 && graphGroupDrawn.get (row.graphGroup)) {
+continue;
+}y += row.height;
+if (row.hasText) {
+iconOffset = this.charHeight - this.fm.getDescent ();
+y -= this.charHeight;
+}} else if (row.hasText) {
+iconOffset = this.charHeight - this.fm.getDescent ();
+} else {
+iconOffset = 0;
+}if (row.autoCalculated && av.isCalculationInProgress (row)) {
+y += this.charHeight;
+usedFaded = true;
+g.drawImage (this.fadedImage, 0, y - row.height, this.imgWidth, y, 0, y - row.height, this.imgWidth, y, this.annotationPanel);
+g.setColor (java.awt.Color.black);
+continue;
+}x = (startRes == 0) ? 0 : -1;
+while (x < endRes - startRes) {
+if (this.hasHiddenColumns) {
+column = this.columnSelection.adjustForHiddenColumns (startRes + x);
+if (column > row_annotations.length - 1) {
+break;
+}} else {
+column = startRes + x;
+}if ((row_annotations == null) || (row_annotations.length <= column) || (row_annotations[column] == null)) {
+validRes = false;
+} else {
+validRes = true;
+}var displayChar = validRes ? row_annotations[column].displayCharacter : null;
+if (x > -1) {
+if (activeRow == i) {
+g.setColor (java.awt.Color.red);
+if (this.columnSelection != null) {
+for (var n = 0; n < this.columnSelection.size (); n++) {
+var v = this.columnSelection.columnAt (n);
+if (v == column) {
+g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);
+}}
+}}if (row.getInvalidStrucPos () > x) {
+g.setColor (java.awt.Color.orange);
+g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);
+} else if (row.getInvalidStrucPos () == x) {
+g.setColor (java.awt.Color.orange.darker ());
+g.fillRect (x * this.charWidth, y, this.charWidth, this.charHeight);
+}if (this.validCharWidth && validRes && displayChar != null && (displayChar.length > 0)) {
+fmWidth = this.fm.charsWidth (displayChar.toCharArray (), 0, displayChar.length);
+if (scaleColLabel) {
+if (fmWidth > this.charWidth) {
+fmScaling = this.charWidth;
+fmScaling /= fmWidth;
+g.setFont (ofont.deriveFont (java.awt.geom.AffineTransform.getScaleInstance (fmScaling, 1.0)));
+fmWidth = this.charWidth;
+}}charOffset = Clazz.floatToInt ((this.charWidth - fmWidth) / 2);
+if (row_annotations[column].colour == null) {
+g.setColor (java.awt.Color.black);
+} else {
+g.setColor (row_annotations[column].colour);
+}if (column == 0 || row.graph > 0) {
+g.drawString (displayChar, (x * this.charWidth) + charOffset, y + iconOffset);
+} else if (row_annotations[column - 1] == null || (labelAllCols || !displayChar.equals (row_annotations[column - 1].displayCharacter) || (displayChar.length < 2 && row_annotations[column].secondaryStructure == ' '))) {
+g.drawString (displayChar, x * this.charWidth + charOffset, y + iconOffset);
+}g.setFont (ofont);
+}}if (row.hasIcons) {
+var ss = validRes ? row_annotations[column].secondaryStructure : '-';
+if (ss == '(') {
+if (displayChar.indexOf (')') > -1) {
+ss = ')';
+}}if (ss == '[') {
+if ((displayChar.indexOf (']') > -1)) {
+ss = ']';
+}}if (ss == '{') {
+if (displayChar.indexOf ('}') > -1) {
+ss = '}';
+}}if (ss == '<') {
+if (displayChar.indexOf ('<') > -1) {
+ss = '>';
+}}if (ss.charCodeAt (0) >= 65) {
+if (displayChar.indexOf (ss.charCodeAt (0) + 32) > -1) {
+ss = String.fromCharCode (ss.charCodeAt (0) + 32);
+}}if (!validRes || (ss != lastSS)) {
+if (x > -1) {
+var nb_annot = x - temp;
+switch (lastSS) {
+case '(':
+case ')':
+this.drawStemAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+temp = x;
+break;
+case 'H':
+if (!isRNA) {
+this.drawHelixAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+}case 'E':
+if (!isRNA) {
+this.drawSheetAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+}case '{':
+case '}':
+case '[':
+case ']':
+case '>':
+case '<':
+case 'A':
+case 'a':
+case 'B':
+case 'b':
+case 'C':
+case 'c':
+case 'D':
+case 'd':
+case 'e':
+case 'F':
+case 'f':
+case 'G':
+case 'g':
+case 'h':
+case 'I':
+case 'i':
+case 'J':
+case 'j':
+case 'K':
+case 'k':
+case 'L':
+case 'l':
+case 'M':
+case 'm':
+case 'N':
+case 'n':
+case 'O':
+case 'o':
+case 'P':
+case 'p':
+case 'Q':
+case 'q':
+case 'R':
+case 'r':
+case 'S':
+case 's':
+case 'T':
+case 't':
+case 'U':
+case 'u':
+case 'V':
+case 'v':
+case 'W':
+case 'w':
+case 'X':
+case 'x':
+case 'Y':
+case 'y':
+case 'Z':
+case 'z':
+var nonCanColor = this.getNotCanonicalColor (lastSS);
+this.drawNotCanonicalAnnot (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+temp = x;
+break;
+default:
+g.setColor (java.awt.Color.gray);
+g.fillRect (lastSSX, y + 6 + iconOffset, (x * this.charWidth) - lastSSX, 2);
+temp = x;
+break;
+}
+}if (validRes) {
+lastSS = ss;
+} else {
+lastSS = ' ';
+}if (x > -1) {
+lastSSX = (x * this.charWidth);
+}}}column++;
+x++;
+}
+if (column >= row_annotations.length) {
+column = row_annotations.length - 1;
+validEnd = false;
+} else {
+validEnd = true;
+}if ((row_annotations == null) || (row_annotations.length <= column) || (row_annotations[column] == null)) {
+validRes = false;
+} else {
+validRes = true;
+}if (row.hasIcons) {
+switch (lastSS) {
+case 'H':
+if (!isRNA) {
+this.drawHelixAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+}case 'E':
+if (!isRNA) {
+this.drawSheetAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+}case '(':
+case ')':
+this.drawStemAnnot (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+case '{':
+case '}':
+case '[':
+case ']':
+case '>':
+case '<':
+case 'A':
+case 'a':
+case 'B':
+case 'b':
+case 'C':
+case 'c':
+case 'D':
+case 'd':
+case 'e':
+case 'F':
+case 'f':
+case 'G':
+case 'g':
+case 'h':
+case 'I':
+case 'i':
+case 'J':
+case 'j':
+case 'K':
+case 'k':
+case 'L':
+case 'l':
+case 'M':
+case 'm':
+case 'N':
+case 'n':
+case 'O':
+case 'o':
+case 'P':
+case 'p':
+case 'Q':
+case 'q':
+case 'R':
+case 'r':
+case 'T':
+case 't':
+case 'U':
+case 'u':
+case 'V':
+case 'v':
+case 'W':
+case 'w':
+case 'X':
+case 'x':
+case 'Y':
+case 'y':
+case 'Z':
+case 'z':
+var nonCanColor = this.getNotCanonicalColor (lastSS);
+this.drawNotCanonicalAnnot (g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+default:
+this.drawGlyphLine (g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd);
+break;
+}
+}if (row.graph > 0 && row.graphHeight > 0) {
+if (row.graph == 2) {
+if (row.graphGroup > -1 && !graphGroupDrawn.get (row.graphGroup)) {
+var groupmax = -999999;
+var groupmin = 9999999;
+for (var gg = 0; gg < aa.length; gg++) {
+if (aa[gg].graphGroup != row.graphGroup) {
+continue;
+}if (aa[gg] !== row) {
+aa[gg].visible = false;
+}if (aa[gg].graphMax > groupmax) {
+groupmax = aa[gg].graphMax;
+}if (aa[gg].graphMin < groupmin) {
+groupmin = aa[gg].graphMin;
+}}
+for (var gg = 0; gg < aa.length; gg++) {
+if (aa[gg].graphGroup == row.graphGroup) {
+this.drawLineGraph (g, aa[gg], aa[gg].annotations, startRes, endRes, y, groupmin, groupmax, row.graphHeight);
+}}
+graphGroupDrawn.set (row.graphGroup);
+} else {
+this.drawLineGraph (g, row, row_annotations, startRes, endRes, y, row.graphMin, row.graphMax, row.graphHeight);
+}} else if (row.graph == 1) {
+this.drawBarGraph (g, row, row_annotations, startRes, endRes, row.graphMin, row.graphMax, y, renderHistogram, renderProfile, normaliseProfile);
+}}} else {
+if (clipst && !clipend) {
+clipend = true;
+}}if (row.graph > 0 && row.hasText) {
+y += this.charHeight;
+}if (row.graph == 0) {
+y += aa[i].height;
+}}
+if (this.debugRedraw) {
+if (this.canClip) {
+if (clipst) {
+System.err.println ("Start clip at : " + yfrom + " (index " + f_i + ")");
+}if (clipend) {
+System.err.println ("End clip at : " + yto + " (index " + f_to + ")");
+}};System.err.println ("Annotation Rendering time:" + (System.currentTimeMillis () - stime));
+};return !usedFaded;
+}, "jalview.renderer.AwtRenderPanelI,jalview.api.AlignViewportI,java.awt.Graphics,~N,~N,~N");
+Clazz.defineMethod (c$, "drawGlyphLine", 
+function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {
+g.setColor (jalview.renderer.AnnotationRenderer.GLYPHLINE_COLOR);
+g.fillRect (lastSSX, y + 6 + iconOffset, (x * this.charWidth) - lastSSX, 2);
+}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");
+Clazz.defineMethod (c$, "drawSheetAnnot", 
+function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {
+g.setColor (jalview.renderer.AnnotationRenderer.SHEET_COLOUR);
+if (!validEnd || !validRes || row == null || row[column] == null || row[column].secondaryStructure != 'E') {
+g.fillRect (lastSSX, y + 4 + iconOffset, (x * this.charWidth) - lastSSX - 4, 7);
+g.fillPolygon ( Clazz.newIntArray (-1, [(x * this.charWidth) - 4, (x * this.charWidth) - 4, (x * this.charWidth)]),  Clazz.newIntArray (-1, [y + iconOffset, y + 14 + iconOffset, y + 7 + iconOffset]), 3);
+} else {
+g.fillRect (lastSSX, y + 4 + iconOffset, (x + 1) * this.charWidth - lastSSX, 7);
+}}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");
+Clazz.defineMethod (c$, "drawHelixAnnot", 
+function (g, row, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd) {
+g.setColor (jalview.renderer.AnnotationRenderer.HELIX_COLOUR);
+var sCol = (Clazz.doubleToInt (lastSSX / this.charWidth)) + startRes;
+var x1 = lastSSX;
+var x2 = (x * this.charWidth);
+if (this.MAC) {
+var ofs = Clazz.doubleToInt (this.charWidth / 2);
+g.fillRoundRect (lastSSX, y + 4 + iconOffset, x2 - x1, 8, 8, 8);
+if (sCol == 0 || row[sCol - 1] == null || row[sCol - 1].secondaryStructure != 'H') {
+} else {
+g.fillRoundRect (lastSSX, y + 4 + iconOffset, x2 - x1 - ofs + 1, 8, 0, 0);
+}if (!validRes || row[column] == null || row[column].secondaryStructure != 'H') {
+} else {
+g.fillRoundRect (lastSSX + ofs, y + 4 + iconOffset, x2 - x1 - ofs + 1, 8, 0, 0);
+}return;
+}if (sCol == 0 || row[sCol - 1] == null || row[sCol - 1].secondaryStructure != 'H') {
+g.fillArc (lastSSX, y + 4 + iconOffset, this.charWidth, 8, 90, 180);
+x1 += Clazz.doubleToInt (this.charWidth / 2);
+}if (!validRes || row[column] == null || row[column].secondaryStructure != 'H') {
+g.fillArc ((x * this.charWidth) - this.charWidth, y + 4 + iconOffset, this.charWidth, 8, 270, 180);
+x2 -= Clazz.doubleToInt (this.charWidth / 2);
+}g.fillRect (x1, y + 4 + iconOffset, x2 - x1, 8);
+}, "java.awt.Graphics,~A,~N,~N,~N,~N,~N,~N,~B,~B");
+Clazz.defineMethod (c$, "drawLineGraph", 
+function (g, _aa, aa_annotations, sRes, eRes, y, min, max, graphHeight) {
+if (sRes > aa_annotations.length) {
+return;
+}var x = 0;
+if (eRes < this.endRes) {
+eRes++;
+}eRes = Math.min (eRes, aa_annotations.length);
+if (sRes == 0) {
+x++;
+}var y1 = y;
+var y2 = y;
+var range = max - min;
+if (min < 0) {
+y2 = y - Clazz.floatToInt ((0 - min / range) * graphHeight);
+}g.setColor (java.awt.Color.gray);
+g.drawLine (x - this.charWidth, y2, (eRes - sRes + 1) * this.charWidth, y2);
+eRes = Math.min (eRes, aa_annotations.length);
+var column;
+var aaMax = aa_annotations.length - 1;
+while (x < eRes - sRes) {
+column = sRes + x;
+if (this.hasHiddenColumns) {
+column = this.columnSelection.adjustForHiddenColumns (column);
+}if (column > aaMax) {
+break;
+}if (aa_annotations[column] == null || aa_annotations[column - 1] == null) {
+x++;
+continue;
+}if (aa_annotations[column].colour == null) {
+g.setColor (java.awt.Color.black);
+} else {
+g.setColor (aa_annotations[column].colour);
+}y1 = y - Clazz.floatToInt (((aa_annotations[column - 1].value - min) / range) * graphHeight);
+y2 = y - Clazz.floatToInt (((aa_annotations[column].value - min) / range) * graphHeight);
+g.drawLine (x * this.charWidth - Clazz.doubleToInt (this.charWidth / 2), y1, x * this.charWidth + Clazz.doubleToInt (this.charWidth / 2), y2);
+x++;
+}
+if (_aa.threshold != null) {
+g.setColor (_aa.threshold.colour);
+var g2 = g;
+g2.setStroke ( new java.awt.BasicStroke (1, 2, 1, 3,  Clazz.newFloatArray (-1, [5, 3]), 0));
+y2 = Clazz.floatToInt (y - ((_aa.threshold.value - min) / range) * graphHeight);
+g.drawLine (0, y2, (eRes - sRes) * this.charWidth, y2);
+g2.setStroke ( new java.awt.BasicStroke ());
+}}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N,~N,~N");
+Clazz.defineMethod (c$, "drawBarGraph", 
+function (g, _aa, aa_annotations, sRes, eRes, min, max, y, renderHistogram, renderProfile, normaliseProfile) {
+if (sRes > aa_annotations.length) {
+return;
+}var ofont = g.getFont ();
+eRes = Math.min (eRes, aa_annotations.length);
+var x = 0;
+var y1 = y;
+var y2 = y;
+var range = max - min;
+if (min < 0) {
+y2 = y - Clazz.floatToInt ((0 - min / (range)) * _aa.graphHeight);
+}g.setColor (java.awt.Color.gray);
+g.drawLine (x, y2, (eRes - sRes) * this.charWidth, y2);
+var column;
+var aaMax = aa_annotations.length - 1;
+while (x < eRes - sRes) {
+column = sRes + x;
+if (this.hasHiddenColumns) {
+column = this.columnSelection.adjustForHiddenColumns (column);
+}if (column > aaMax) {
+break;
+}if (aa_annotations[column] == null) {
+x++;
+continue;
+}if (aa_annotations[column].colour == null) {
+g.setColor (java.awt.Color.black);
+} else {
+g.setColor (aa_annotations[column].colour);
+}y1 = y - Clazz.floatToInt (((aa_annotations[column].value - min) / (range)) * _aa.graphHeight);
+if (renderHistogram) {
+if (y1 - y2 > 0) {
+g.fillRect (x * this.charWidth, y2, this.charWidth, y1 - y2);
+} else {
+g.fillRect (x * this.charWidth, y1, this.charWidth, y2 - y1);
+}}if (renderProfile) {
+var profl = this.getProfileFor (_aa, column);
+if (profl != null && profl[2] != 0) {
+var isStructureProfile = profl[0] == 1;
+var isCdnaProfile = profl[0] == 2;
+var ht = normaliseProfile ? y - _aa.graphHeight : y1;
+var htn = normaliseProfile ? _aa.graphHeight : (y2 - y1);
+var hght;
+var wdth;
+var ht2 = 0;
+var dc;
+dc =  Clazz.newCharArray (isStructureProfile ? 2 : (isCdnaProfile ? 3 : 1), '\0');
+var lm = g.getFontMetrics (ofont).getLineMetrics ("Q", g);
+var scale = 1 / (normaliseProfile ? profl[2] : 100);
+var ofontHeight = 1 / lm.getAscent ();
+var scl = 0.0;
+var c = 3;
+var valuesProcessed = 0;
+while (valuesProcessed < profl[1]) {
+if (isStructureProfile) {
+dc[0] = String.fromCharCode (profl[c++]);
+dc[1] = String.fromCharCode (profl[c++]);
+} else if (isCdnaProfile) {
+dc = jalview.analysis.CodingUtils.decodeCodon (profl[c++]);
+} else {
+dc[0] = String.fromCharCode (profl[c++]);
+}wdth = this.charWidth;
+wdth /= this.fm.charsWidth (dc, 0, dc.length);
+ht += scl;
+scl = htn * scale * profl[c++];
+lm = ofont.getLineMetrics (dc, 0, 1, g.getFontMetrics ().getFontRenderContext ());
+g.setFont (ofont.deriveFont (java.awt.geom.AffineTransform.getScaleInstance (wdth, scl / lm.getAscent ())));
+lm = g.getFontMetrics ().getLineMetrics (dc, 0, 1, g);
+var colour = null;
+if (isCdnaProfile) {
+var codonTranslation = jalview.schemes.ResidueProperties.codonTranslate ( String.instantialize (dc));
+colour = this.profcolour.findColour (codonTranslation.charAt (0), column, null);
+} else {
+colour = this.profcolour.findColour (dc[0], column, null);
+}g.setColor (colour === java.awt.Color.white ? java.awt.Color.lightGray : colour);
+hght = (ht + (scl - lm.getDescent () - lm.getBaselineOffsets ()[lm.getBaselineIndex ()]));
+g.drawChars (dc, 0, dc.length, x * this.charWidth, Clazz.doubleToInt (hght));
+valuesProcessed++;
+}
+g.setFont (ofont);
+}}x++;
+}
+if (_aa.threshold != null) {
+g.setColor (_aa.threshold.colour);
+var g2 = g;
+g2.setStroke ( new java.awt.BasicStroke (1, 2, 1, 3,  Clazz.newFloatArray (-1, [5, 3]), 0));
+y2 = Clazz.floatToInt (y - ((_aa.threshold.value - min) / range) * _aa.graphHeight);
+g.drawLine (0, y2, (eRes - sRes) * this.charWidth, y2);
+g2.setStroke ( new java.awt.BasicStroke ());
+}}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N,~N,~B,~B,~B");
+Clazz.defineMethod (c$, "drawGraph", 
+function (g, _aa, aa_annotations, width, y, sRes, eRes) {
+eRes = Math.min (eRes, aa_annotations.length);
+g.setColor (java.awt.Color.white);
+g.fillRect (0, 0, width, y);
+g.setColor ( new java.awt.Color (0, 0, 180));
+var x = 0;
+var height;
+for (var j = sRes; j < eRes; j++) {
+if (aa_annotations[j] != null) {
+if (aa_annotations[j].colour == null) {
+g.setColor (java.awt.Color.black);
+} else {
+g.setColor (aa_annotations[j].colour);
+}height = Clazz.floatToInt ((aa_annotations[j].value / _aa.graphMax) * y);
+if (height > y) {
+height = y;
+}g.fillRect (x, y - height, this.charWidth, height);
+}x += this.charWidth;
+}
+}, "java.awt.Graphics,jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~N,~N");
+Clazz.defineMethod (c$, "getNotCanonicalColor", 
+function (lastss) {
+switch (lastss) {
+case '{':
+case '}':
+return  new java.awt.Color (255, 125, 5);
+case '[':
+case ']':
+return  new java.awt.Color (245, 115, 10);
+case '>':
+case '<':
+return  new java.awt.Color (235, 135, 15);
+case 'A':
+case 'a':
+return  new java.awt.Color (225, 105, 20);
+case 'B':
+case 'b':
+return  new java.awt.Color (215, 145, 30);
+case 'C':
+case 'c':
+return  new java.awt.Color (205, 95, 35);
+case 'D':
+case 'd':
+return  new java.awt.Color (195, 155, 45);
+case 'E':
+case 'e':
+return  new java.awt.Color (185, 85, 55);
+case 'F':
+case 'f':
+return  new java.awt.Color (175, 165, 65);
+case 'G':
+case 'g':
+return  new java.awt.Color (170, 75, 75);
+case 'H':
+case 'h':
+return  new java.awt.Color (160, 175, 85);
+case 'I':
+case 'i':
+return  new java.awt.Color (150, 65, 95);
+case 'J':
+case 'j':
+return  new java.awt.Color (140, 185, 105);
+case 'K':
+case 'k':
+return  new java.awt.Color (130, 55, 110);
+case 'L':
+case 'l':
+return  new java.awt.Color (120, 195, 120);
+case 'M':
+case 'm':
+return  new java.awt.Color (110, 45, 130);
+case 'N':
+case 'n':
+return  new java.awt.Color (100, 205, 140);
+case 'O':
+case 'o':
+return  new java.awt.Color (90, 35, 150);
+case 'P':
+case 'p':
+return  new java.awt.Color (85, 215, 160);
+case 'Q':
+case 'q':
+return  new java.awt.Color (75, 25, 170);
+case 'R':
+case 'r':
+return  new java.awt.Color (65, 225, 180);
+case 'S':
+case 's':
+return  new java.awt.Color (55, 15, 185);
+case 'T':
+case 't':
+return  new java.awt.Color (45, 235, 195);
+case 'U':
+case 'u':
+return  new java.awt.Color (35, 5, 205);
+case 'V':
+case 'v':
+return  new java.awt.Color (25, 245, 215);
+case 'W':
+case 'w':
+return  new java.awt.Color (15, 0, 225);
+case 'X':
+case 'x':
+return  new java.awt.Color (10, 255, 235);
+case 'Y':
+case 'y':
+return  new java.awt.Color (5, 150, 245);
+case 'Z':
+case 'z':
+return  new java.awt.Color (0, 80, 255);
+default:
+System.out.println ("This is not a interaction : " + lastss);
+return null;
+}
+}, "~S");
+c$.GLYPHLINE_COLOR = c$.prototype.GLYPHLINE_COLOR = java.awt.Color.gray;
+c$.SHEET_COLOUR = c$.prototype.SHEET_COLOUR = java.awt.Color.green;
+c$.HELIX_COLOUR = c$.prototype.HELIX_COLOUR = java.awt.Color.red;
+c$.STEM_COLOUR = c$.prototype.STEM_COLOUR = java.awt.Color.blue;
+});