X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FAnnotationRenderer.java;h=70d534c71ac6d228463615e0e908bc8d6b10484e;hb=60230a4056ce0094603ca68c6596129e1048dc85;hp=1f3d5a9c381bc3a043224613206a553db9220f44;hpb=7717b24f1e894ad268121890c479848c53df64b0;p=jalview.git diff --git a/src/jalview/renderer/AnnotationRenderer.java b/src/jalview/renderer/AnnotationRenderer.java index 1f3d5a9..70d534c 100644 --- a/src/jalview/renderer/AnnotationRenderer.java +++ b/src/jalview/renderer/AnnotationRenderer.java @@ -29,6 +29,7 @@ import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; +import jalview.datamodel.HiddenMarkovModel; import jalview.datamodel.ProfilesI; import jalview.schemes.ColourSchemeI; import jalview.schemes.NucleotideColourScheme; @@ -73,10 +74,13 @@ public class AnnotationRenderer boolean av_renderHistogram = true, av_renderProfile = true, av_normaliseProfile = false; + boolean av_renderInformationHistogram = true, av_renderHMMProfile = true, + av_normaliseHMMProfile = false, av_infoHeight = false; + ResidueShaderI profcolour = null; private ColumnSelection columnSelection; - + private HiddenColumns hiddenColumns; private ProfilesI hconsensus; @@ -188,8 +192,9 @@ public class AnnotationRenderer * display a backward arrow */ g.fillPolygon(new int[] { lastSSX + 5, lastSSX + 5, lastSSX }, - new int[] { y + iconOffset, y + 14 + iconOffset, - y + 8 + iconOffset }, 3); + new int[] + { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, + 3); x1 += 5; } if (diffdownstream) @@ -206,8 +211,10 @@ public class AnnotationRenderer * if annotation ending with an opeing base pair half of the stem, * display a forward arrow */ - g.fillPolygon(new int[] { x2 - 5, x2 - 5, x2 }, new int[] { - y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, 3); + g.fillPolygon(new int[] { x2 - 5, x2 - 5, x2 }, + new int[] + { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, + 3); x2 -= 5; } if (diffupstream) @@ -239,7 +246,8 @@ public class AnnotationRenderer boolean diffdownstream = !validRes || !validEnd || row_annotations[column] == null || !dc.equals(row_annotations[column].displayCharacter); - // System.out.println("Column "+column+" diff up: "+diffupstream+" down:"+diffdownstream); + // System.out.println("Column "+column+" diff up: "+diffupstream+" + // down:"+diffdownstream); // If a closing base pair half of the stem, display a backward arrow if (column > 0 && Rna.isClosingParenthesis(dc)) { @@ -249,8 +257,9 @@ public class AnnotationRenderer // dc.equals(row_annotations[column-2].displayCharacter)) { g.fillPolygon(new int[] { lastSSX + 5, lastSSX + 5, lastSSX }, - new int[] { y + iconOffset, y + 14 + iconOffset, - y + 8 + iconOffset }, 3); + new int[] + { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, + 3); x1 += 5; } if (diffdownstream) @@ -264,8 +273,10 @@ public class AnnotationRenderer // display a forward arrow if (diffdownstream) { - g.fillPolygon(new int[] { x2 - 5, x2 - 5, x2 }, new int[] { - y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, 3); + g.fillPolygon(new int[] { x2 - 5, x2 - 5, x2 }, + new int[] + { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, + 3); x2 -= 5; } if (diffupstream) @@ -319,6 +330,9 @@ public class AnnotationRenderer av_renderHistogram = av.isShowConsensusHistogram(); av_renderProfile = av.isShowSequenceLogo(); av_normaliseProfile = av.isNormaliseSequenceLogo(); + av_renderInformationHistogram = av.isShowInformationHistogram(); + av_renderHMMProfile = av.isShowHMMSequenceLogo(); + av_normaliseHMMProfile = av.isNormaliseHMMSequenceLogo(); profcolour = av.getResidueShading(); if (profcolour == null || profcolour.getColourScheme() == null) { @@ -327,7 +341,8 @@ public class AnnotationRenderer * the alignment has no colourscheme set * (would like to use user preference but n/a for applet) */ - ColourSchemeI col = av.getAlignment().isNucleotide() ? new NucleotideColourScheme() + ColourSchemeI col = av.getAlignment().isNucleotide() + ? new NucleotideColourScheme() : new ZappoColourScheme(); profcolour = new ResidueShader(col); } @@ -338,6 +353,7 @@ public class AnnotationRenderer hStrucConsensus = av.getRnaStructureConsensusHash(); av_ignoreGapsConsensus = av.isIgnoreGapsConsensus(); av_ignoreBelowBackground = av.isIgnoreBelowBackground(); + av_infoHeight = av.isInfoLetterHeight(); } @@ -357,10 +373,11 @@ public class AnnotationRenderer // properties/rendering attributes as a global 'alignment group' which holds // all vis settings for the alignment as a whole rather than a subset // - if (aa.label.startsWith("Information")) + if ("HMM".equals(aa.getCalcId())) { - return AAFrequency.getHMMProfileFor(aa, column, - av_ignoreBelowBackground); // TODO check if this follows standard + HiddenMarkovModel hmm = aa.sequenceRef.getHMM(); + return AAFrequency.extractHMMProfile(hmm, column, + av_ignoreBelowBackground, av_infoHeight); // TODO check if this follows standard // pipeline } if (aa.autoCalculated @@ -382,13 +399,12 @@ public class AnnotationRenderer { if (forComplement) { - return AAFrequency.extractCdnaProfile( - complementConsensus[column], av_ignoreGapsConsensus); + return AAFrequency.extractCdnaProfile(complementConsensus[column], + av_ignoreGapsConsensus); } else { - return AAFrequency.extractProfile( -hconsensus.get(column), + return AAFrequency.extractProfile(hconsensus.get(column), av_ignoreGapsConsensus); } } @@ -474,7 +490,8 @@ hconsensus.get(column), .getAlignmentStrucConsensusAnnotation(); final AlignmentAnnotation complementConsensusAnnot = av .getComplementConsensusAnnotation(); - boolean renderHistogram = true, renderProfile = true, normaliseProfile = false, isRNA = rna; + boolean renderHistogram = true, renderProfile = true, + normaliseProfile = false, isRNA = rna; BitSet graphGroupDrawn = new BitSet(); int charOffset = 0; // offset for a label @@ -507,6 +524,12 @@ hconsensus.get(column), renderProfile = av_renderProfile; normaliseProfile = av_normaliseProfile; } + else if ("HMM".equals(row.getCalcId())) + { + renderHistogram = av_renderInformationHistogram; + renderProfile = av_renderHMMProfile; + normaliseProfile = av_normaliseHMMProfile; + } else { renderHistogram = true; @@ -525,8 +548,8 @@ hconsensus.get(column), lastSS = ' '; lastSSX = 0; - if (!useClip - || ((y - charHeight) < visHeight && (y + row.height + charHeight * 2) >= sOffset)) + if (!useClip || ((y - charHeight) < visHeight + && (y + row.height + charHeight * 2) >= sOffset)) {// if_in_visible_region if (!clipst) { @@ -566,8 +589,8 @@ hconsensus.get(column), { y += charHeight; usedFaded = true; - g.drawImage(fadedImage, 0, y - row.height, imgWidth, y, 0, y - - row.height, imgWidth, y, annotationPanel); + g.drawImage(fadedImage, 0, y - row.height, imgWidth, y, 0, + y - row.height, imgWidth, y, annotationPanel); g.setColor(Color.black); // g.drawString("Calculating "+aa[i].label+"....",20, y-row.height/2); @@ -625,7 +648,8 @@ hconsensus.get(column), { validRes = true; } - final String displayChar = validRes ? row_annotations[column].displayCharacter + final String displayChar = validRes + ? row_annotations[column].displayCharacter : null; if (x > -1) { @@ -695,17 +719,17 @@ hconsensus.get(column), if (column == 0 || row.graph > 0) { - g.drawString(displayChar, (x * charWidth) + charOffset, y - + iconOffset); + g.drawString(displayChar, (x * 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 == ' '))) + 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 * charWidth + charOffset, y - + iconOffset); + g.drawString(displayChar, x * charWidth + charOffset, + y + iconOffset); } g.setFont(ofont); } @@ -769,7 +793,8 @@ hconsensus.get(column), { int nb_annot = x - temp; - // System.out.println("\t type :"+lastSS+"\t x :"+x+"\t nbre annot :"+nb_annot); + // System.out.println("\t type :"+lastSS+"\t x :"+x+"\t nbre + // annot :"+nb_annot); switch (lastSS) { case '(': // Stem case for RNA secondary structure @@ -863,8 +888,8 @@ hconsensus.get(column), break; default: g.setColor(Color.gray); - g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth) - - lastSSX, 2); + g.fillRect(lastSSX, y + 6 + iconOffset, + (x * charWidth) - lastSSX, 2); temp = x; break; } @@ -1063,7 +1088,7 @@ hconsensus.get(column), { clipend = true; } - }// end if_in_visible_region + } // end if_in_visible_region if (row.graph > 0 && row.hasText) { y += charHeight; @@ -1080,13 +1105,13 @@ hconsensus.get(column), { if (clipst) { - System.err.println("Start clip at : " + yfrom + " (index " + f_i - + ")"); + 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( + "End clip at : " + yto + " (index " + f_to + ")"); } } ; @@ -1109,8 +1134,8 @@ hconsensus.get(column), private Color sdNOTCANONICAL_COLOUR; void drawGlyphLine(Graphics g, Annotation[] row, int lastSSX, int x, - int y, int iconOffset, int startRes, int column, - boolean validRes, boolean validEnd) + int y, int iconOffset, int startRes, int column, boolean validRes, + boolean validEnd) { g.setColor(GLYPHLINE_COLOR); g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth) - lastSSX, 2); @@ -1118,31 +1143,34 @@ hconsensus.get(column), void drawSheetAnnot(Graphics g, Annotation[] row, - int lastSSX, int x, int y, int iconOffset, int startRes, int column, - boolean validRes, boolean validEnd) + int lastSSX, int x, int y, int iconOffset, int startRes, + int column, boolean validRes, boolean validEnd) { g.setColor(SHEET_COLOUR); if (!validEnd || !validRes || row == null || row[column] == null || row[column].secondaryStructure != 'E') { - g.fillRect(lastSSX, y + 4 + iconOffset, - (x * charWidth) - lastSSX - 4, 7); - g.fillPolygon(new int[] { (x * charWidth) - 4, (x * charWidth) - 4, - (x * charWidth) }, new int[] { y + iconOffset, - y + 14 + iconOffset, y + 7 + iconOffset }, 3); + g.fillRect(lastSSX, y + 4 + iconOffset, (x * charWidth) - lastSSX - 4, + 7); + g.fillPolygon( + new int[] + { (x * charWidth) - 4, (x * charWidth) - 4, (x * charWidth) }, + new int[] + { y + iconOffset, y + 14 + iconOffset, y + 7 + iconOffset }, + 3); } else { - g.fillRect(lastSSX, y + 4 + iconOffset, - (x + 1) * charWidth - lastSSX, 7); + g.fillRect(lastSSX, y + 4 + iconOffset, (x + 1) * charWidth - lastSSX, + 7); } } void drawHelixAnnot(Graphics g, Annotation[] row, int lastSSX, int x, - int y, int iconOffset, int startRes, int column, - boolean validRes, boolean validEnd) + int y, int iconOffset, int startRes, int column, boolean validRes, + boolean validEnd) { g.setColor(HELIX_COLOUR); @@ -1174,8 +1202,8 @@ hconsensus.get(column), else { // g.setColor(Color.magenta); - g.fillRoundRect(lastSSX + ofs, y + 4 + iconOffset, x2 - x1 - ofs - + 1, 8, 0, 0); + g.fillRoundRect(lastSSX + ofs, y + 4 + iconOffset, + x2 - x1 - ofs + 1, 8, 0, 0); } @@ -1201,8 +1229,8 @@ hconsensus.get(column), } void drawLineGraph(Graphics g, AlignmentAnnotation _aa, - Annotation[] aa_annotations, int sRes, int eRes, int y, - float min, float max, int graphHeight) + Annotation[] aa_annotations, int sRes, int eRes, int y, float min, + float max, int graphHeight) { if (sRes > aa_annotations.length) { @@ -1270,13 +1298,13 @@ hconsensus.get(column), g.setColor(aa_annotations[column].colour); } - y1 = y - - (int) (((aa_annotations[column - 1].value - min) / range) * graphHeight); - y2 = y - - (int) (((aa_annotations[column].value - min) / range) * graphHeight); + y1 = y - (int) (((aa_annotations[column - 1].value - min) / range) + * graphHeight); + y2 = y - (int) (((aa_annotations[column].value - min) / range) + * graphHeight); - g.drawLine(x * charWidth - charWidth / 2, y1, x * charWidth - + charWidth / 2, y2); + g.drawLine(x * charWidth - charWidth / 2, y1, + x * charWidth + charWidth / 2, y2); x++; } @@ -1285,7 +1313,8 @@ hconsensus.get(column), g.setColor(_aa.threshold.colour); Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE, - BasicStroke.JOIN_ROUND, 3f, new float[] { 5f, 3f }, 0f)); + BasicStroke.JOIN_ROUND, 3f, new float[] + { 5f, 3f }, 0f)); y2 = (int) (y - ((_aa.threshold.value - min) / range) * graphHeight); g.drawLine(0, y2, (eRes - sRes) * charWidth, y2); @@ -1347,8 +1376,8 @@ hconsensus.get(column), g.setColor(aa_annotations[column].colour); } - y1 = y - - (int) (((aa_annotations[column].value - min) / (range)) * _aa.graphHeight); + y1 = y - (int) (((aa_annotations[column].value - min) / (range)) + * _aa.graphHeight); if (renderHistogram) { @@ -1422,10 +1451,10 @@ hconsensus.get(column), ht += scl; // next profl[] position is profile % for the character(s) scl = htn * scale * profl[c++]; - lm = ofont.getLineMetrics(dc, 0, 1, g.getFontMetrics() - .getFontRenderContext()); - Font font = ofont.deriveFont(AffineTransform.getScaleInstance( - wdth, scl / lm.getAscent())); + lm = ofont.getLineMetrics(dc, 0, 1, + g.getFontMetrics().getFontRenderContext()); + Font font = ofont.deriveFont(AffineTransform + .getScaleInstance(wdth, scl / lm.getAscent())); g.setFont(font); lm = g.getFontMetrics().getLineMetrics(dc, 0, 1, g); @@ -1453,8 +1482,8 @@ hconsensus.get(column), } g.setColor(colour == Color.white ? Color.lightGray : colour); - hght = (ht + (scl - lm.getDescent() - lm.getBaselineOffsets()[lm - .getBaselineIndex()])); + hght = (ht + (scl - lm.getDescent() + - lm.getBaselineOffsets()[lm.getBaselineIndex()])); g.drawChars(dc, 0, dc.length, x * charWidth, (int) hght); valuesProcessed++; @@ -1469,10 +1498,11 @@ hconsensus.get(column), g.setColor(_aa.threshold.colour); Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE, - BasicStroke.JOIN_ROUND, 3f, new float[] { 5f, 3f }, 0f)); + BasicStroke.JOIN_ROUND, 3f, new float[] + { 5f, 3f }, 0f)); - y2 = (int) (y - ((_aa.threshold.value - min) / range) - * _aa.graphHeight); + y2 = (int) (y + - ((_aa.threshold.value - min) / range) * _aa.graphHeight); g.drawLine(0, y2, (eRes - sRes) * charWidth, y2); g2.setStroke(new BasicStroke()); }