JAL-1807 still testing
[jalviewjs.git] / bin / jalview / renderer / AnnotationRenderer.js
index 221e5d3..00d98e4 100644 (file)
-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;
-});
+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