From 3f734555193e56f46b07d5bc12df77d26e180ec0 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 7 Jun 2012 10:44:43 +0100 Subject: [PATCH] JAL-967, JAL-1114, JAL-1115 - modified render and calculation api to work on bare array reference for current instance of data rather than via reference to container object, so as to minimise errors arising from race between rendering code and calculations triggered by alignment data edits which create new data arrays. --- src/jalview/analysis/AAFrequency.java | 25 ++-- src/jalview/appletgui/OverviewPanel.java | 2 +- src/jalview/gui/OverviewPanel.java | 31 ++-- src/jalview/renderer/AnnotationRenderer.java | 199 +++++++++++++------------- 4 files changed, 135 insertions(+), 122 deletions(-) diff --git a/src/jalview/analysis/AAFrequency.java b/src/jalview/analysis/AAFrequency.java index 375504d..7e77b0f 100755 --- a/src/jalview/analysis/AAFrequency.java +++ b/src/jalview/analysis/AAFrequency.java @@ -219,33 +219,40 @@ public class AAFrequency } for (int i = iStart; i < width; i++) { - if (i >= hconsensus.length) + Hashtable hci; + if (i >= hconsensus.length || ((hci=hconsensus[i])==null)) { // happens if sequences calculated over were shorter than alignment // width consensus.annotations[i] = null; continue; } + value = 0; + Float fv; if (ignoreGapsInConsensusCalculation) { - value = ((Float) hconsensus[i].get(AAFrequency.PID_NOGAPS)) - .floatValue(); + fv = (Float) hci.get(AAFrequency.PID_NOGAPS); } else { - value = ((Float) hconsensus[i].get(AAFrequency.PID_GAPS)) - .floatValue(); + fv = (Float) hci.get(AAFrequency.PID_GAPS); } - - String maxRes = hconsensus[i].get(AAFrequency.MAXRESIDUE).toString(); - String mouseOver = hconsensus[i].get(AAFrequency.MAXRESIDUE) + " "; + if (fv==null) + { + consensus.annotations[i] = null; + // data has changed below us .. give up and + continue; + } + value = fv.floatValue(); + String maxRes = hci.get(AAFrequency.MAXRESIDUE).toString(); + String mouseOver = hci.get(AAFrequency.MAXRESIDUE) + " "; if (maxRes.length() > 1) { mouseOver = "[" + maxRes + "] "; maxRes = "+"; } - int[][] profile = (int[][]) hconsensus[i].get(AAFrequency.PROFILE); + int[][] profile = (int[][]) hci.get(AAFrequency.PROFILE); if (profile != null && includeAllConsSymbols) { mouseOver = ""; diff --git a/src/jalview/appletgui/OverviewPanel.java b/src/jalview/appletgui/OverviewPanel.java index 4b646c3..ba066a1 100755 --- a/src/jalview/appletgui/OverviewPanel.java +++ b/src/jalview/appletgui/OverviewPanel.java @@ -367,7 +367,7 @@ public class OverviewPanel extends Panel implements Runnable, lastcol = (int) (col * sampleCol); { mg.translate(col, sequencesHeight); - ap.annotationPanel.renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(), + ap.annotationPanel.renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(),av.getAlignmentConservationAnnotation().annotations, (int) (sampleCol) + 1, graphHeight, (int) (col * sampleCol), (int) (col * sampleCol) + 1); mg.translate(-col, -sequencesHeight); diff --git a/src/jalview/gui/OverviewPanel.java b/src/jalview/gui/OverviewPanel.java index c844315..475f0c7 100755 --- a/src/jalview/gui/OverviewPanel.java +++ b/src/jalview/gui/OverviewPanel.java @@ -1,18 +1,18 @@ /* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle - * + * * This file is part of Jalview. - * + * * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License + * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.gui; @@ -26,7 +26,7 @@ import javax.swing.*; /** * DOCUMENT ME! - * + * * @author $author$ * @version $Revision$ */ @@ -67,7 +67,7 @@ public class OverviewPanel extends JPanel implements Runnable /** * Creates a new OverviewPanel object. - * + * * @param ap * DOCUMENT ME! */ @@ -115,6 +115,7 @@ public class OverviewPanel extends JPanel implements Runnable addComponentListener(new ComponentAdapter() { + @Override public void componentResized(ComponentEvent evt) { if ((getWidth() != width) @@ -127,6 +128,7 @@ public class OverviewPanel extends JPanel implements Runnable addMouseMotionListener(new MouseMotionAdapter() { + @Override public void mouseDragged(MouseEvent evt) { if (!av.wrapAlignment) @@ -142,6 +144,7 @@ public class OverviewPanel extends JPanel implements Runnable addMouseListener(new MouseAdapter() { + @Override public void mousePressed(MouseEvent evt) { if (!av.wrapAlignment) @@ -242,6 +245,7 @@ public class OverviewPanel extends JPanel implements Runnable /** * DOCUMENT ME! */ + @Override public void run() { miniMe = null; @@ -359,13 +363,13 @@ public class OverviewPanel extends JPanel implements Runnable if (av.getAlignmentConservationAnnotation()!= null) { - renderer.updateFromAlignViewport(av); + renderer.updateFromAlignViewport(av); for (col = 0; col < width; col++) { lastcol = (int) (col * sampleCol); { mg.translate(col, sequencesHeight); - renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(), + renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(),av.getAlignmentConservationAnnotation().annotations, (int) (sampleCol) + 1, graphHeight, (int) (col * sampleCol), (int) (col * sampleCol) + 1); mg.translate(-col, -sequencesHeight); @@ -438,10 +442,11 @@ public class OverviewPanel extends JPanel implements Runnable /** * DOCUMENT ME! - * + * * @param g * DOCUMENT ME! */ + @Override public void paintComponent(Graphics g) { if (resizing) diff --git a/src/jalview/renderer/AnnotationRenderer.java b/src/jalview/renderer/AnnotationRenderer.java index ace94f4..cfdfdf6 100644 --- a/src/jalview/renderer/AnnotationRenderer.java +++ b/src/jalview/renderer/AnnotationRenderer.java @@ -4,6 +4,7 @@ import jalview.analysis.AAFrequency; import jalview.analysis.StructureFrequency; import jalview.api.AlignViewportI; import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.schemes.ColourSchemeI; @@ -29,7 +30,7 @@ public class AnnotationRenderer // TODO Auto-generated constructor stub } - public void drawStemAnnot(Graphics g, AlignmentAnnotation row, + public void drawStemAnnot(Graphics g, Annotation[] row_annotations, int lastSSX, int x, int y, int iconOffset, int startRes, int column, boolean validRes, boolean validEnd) { @@ -39,21 +40,21 @@ public class AnnotationRenderer int x2 = (x * charWidth); Regex closeparen = new Regex("(\\))"); - String dc = (column == 0 || row.annotations[column - 1] == null) ? "" - : row.annotations[column - 1].displayCharacter; + String dc = (column == 0 || row_annotations[column - 1] == null) ? "" + : row_annotations[column - 1].displayCharacter; - boolean diffupstream = sCol == 0 || row.annotations[sCol - 1] == null - || !dc.equals(row.annotations[sCol - 1].displayCharacter); + boolean diffupstream = sCol == 0 || row_annotations[sCol - 1] == null + || !dc.equals(row_annotations[sCol - 1].displayCharacter); boolean diffdownstream = !validRes || !validEnd - || row.annotations[column] == null - || !dc.equals(row.annotations[column].displayCharacter); + || row_annotations[column] == null + || !dc.equals(row_annotations[column].displayCharacter); // 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 && closeparen.search(dc)) { if (diffupstream) - // if (validRes && column>1 && row.annotations[column-2]!=null && - // dc.equals(row.annotations[column-2].displayCharacter)) + // if (validRes && column>1 && row_annotations[column-2]!=null && + // dc.equals(row_annotations[column-2].displayCharacter)) { g.fillPolygon(new int[] { lastSSX + 5, lastSSX + 5, lastSSX }, new int[] @@ -252,7 +253,7 @@ public class AnnotationRenderer for (int i = 0; i < aa.length; i++) { AlignmentAnnotation row = aa[i]; - + Annotation[] row_annotations=row.annotations; if (!row.visible) { continue; @@ -329,7 +330,7 @@ public class AnnotationRenderer if (hasHiddenColumns) { column = columnSelection.adjustForHiddenColumns(startRes + x); - if (column > row.annotations.length - 1) + if (column > row_annotations.length - 1) { break; } @@ -339,8 +340,8 @@ public class AnnotationRenderer column = startRes + x; } - if ((row.annotations == null) || (row.annotations.length <= column) - || (row.annotations[column] == null)) + if ((row_annotations == null) || (row_annotations.length <= column) + || (row_annotations[column] == null)) { validRes = false; } @@ -375,16 +376,16 @@ public class AnnotationRenderer } if (validCharWidth && validRes - && row.annotations[column].displayCharacter != null - && (row.annotations[column].displayCharacter.length() > 0)) + && row_annotations[column].displayCharacter != null + && (row_annotations[column].displayCharacter.length() > 0)) { if (centreColLabels || scaleColLabel) { - fmWidth = (float) fm.charsWidth( - row.annotations[column].displayCharacter + fmWidth = fm.charsWidth( + row_annotations[column].displayCharacter .toCharArray(), 0, - row.annotations[column].displayCharacter.length()); + row_annotations[column].displayCharacter.length()); if (scaleColLabel) { @@ -403,29 +404,29 @@ public class AnnotationRenderer } else { - fmWidth = (float) fm - .charWidth(row.annotations[column].displayCharacter + fmWidth = fm + .charWidth(row_annotations[column].displayCharacter .charAt(0)); } charOffset = (int) ((charWidth - fmWidth) / 2f); - if (row.annotations[column].colour == null) + if (row_annotations[column].colour == null) g.setColor(Color.black); else - g.setColor(row.annotations[column].colour); + g.setColor(row_annotations[column].colour); if (column == 0 || row.graph > 0) { - g.drawString(row.annotations[column].displayCharacter, + g.drawString(row_annotations[column].displayCharacter, (x * charWidth) + charOffset, y + iconOffset); } - else if (row.annotations[column - 1] == null + else if (row_annotations[column - 1] == null || (labelAllCols - || !row.annotations[column].displayCharacter - .equals(row.annotations[column - 1].displayCharacter) || (row.annotations[column].displayCharacter - .length() < 2 && row.annotations[column].secondaryStructure == ' '))) + || !row_annotations[column].displayCharacter + .equals(row_annotations[column - 1].displayCharacter) || (row_annotations[column].displayCharacter + .length() < 2 && row_annotations[column].secondaryStructure == ' '))) { - g.drawString(row.annotations[column].displayCharacter, x + g.drawString(row_annotations[column].displayCharacter, x * charWidth + charOffset, y + iconOffset); } g.setFont(ofont); @@ -433,12 +434,12 @@ public class AnnotationRenderer } if (row.hasIcons) { - char ss = validRes ? row.annotations[column].secondaryStructure + char ss = validRes ? row_annotations[column].secondaryStructure : ' '; if (ss == 'S') { // distinguish between forward/backward base-pairing - if (row.annotations[column].displayCharacter.indexOf(')') > -1) + if (row_annotations[column].displayCharacter.indexOf(')') > -1) { ss = 's'; } @@ -450,18 +451,18 @@ public class AnnotationRenderer switch (lastSS) { case 'H': - drawHelixAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawHelixAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; case 'E': - drawSheetAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawSheetAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; case 'S': // Stem case for RNA secondary structure case 's': // and opposite direction - drawStemAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; @@ -490,17 +491,17 @@ public class AnnotationRenderer column++; x++; } - if (column >= row.annotations.length) + if (column >= row_annotations.length) { - column = row.annotations.length - 1; + column = row_annotations.length - 1; validEnd = false; } else { validEnd = true; } - if ((row.annotations == null) || (row.annotations.length <= column) - || (row.annotations[column] == null)) + if ((row_annotations == null) || (row_annotations.length <= column) + || (row_annotations[column] == null)) { validRes = false; } @@ -516,21 +517,21 @@ public class AnnotationRenderer switch (lastSS) { case 'H': - drawHelixAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawHelixAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; case 'E': - drawSheetAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawSheetAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; case 's': case 'S': // Stem case for RNA secondary structure - drawStemAnnot(g, row, lastSSX, x, y, iconOffset, startRes, + drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; default: - drawGlyphLine(g, row, lastSSX, x, y, iconOffset, startRes, + drawGlyphLine(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); break; } @@ -569,7 +570,7 @@ public class AnnotationRenderer { if (aa[gg].graphGroup == row.graphGroup) { - drawLineGraph(g, aa[gg], startRes, endRes, y, groupmin, + drawLineGraph(g, aa[gg], aa[gg].annotations, startRes, endRes, y, groupmin, groupmax, row.graphHeight); } } @@ -578,13 +579,13 @@ public class AnnotationRenderer } else { - drawLineGraph(g, row, startRes, endRes, y, row.graphMin, + drawLineGraph(g, row, row_annotations, startRes, endRes, y, row.graphMin, row.graphMax, row.graphHeight); } } else if (row.graph == AlignmentAnnotation.BAR_GRAPH) { - drawBarGraph(g, row, startRes, endRes, row.graphMin, + drawBarGraph(g, row, row_annotations, startRes, endRes, row.graphMin, row.graphMax, y); } } @@ -609,7 +610,7 @@ public class AnnotationRenderer private Color STEM_COLOUR = Color.blue; - public void drawGlyphLine(Graphics g, AlignmentAnnotation row, + public void drawGlyphLine(Graphics g, Annotation[] row, int lastSSX, int x, int y, int iconOffset, int startRes, int column, boolean validRes, boolean validEnd) { @@ -617,14 +618,14 @@ public class AnnotationRenderer g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth) - lastSSX, 2); } - public void drawSheetAnnot(Graphics g, AlignmentAnnotation row, + public void drawSheetAnnot(Graphics g, Annotation[] row, int lastSSX, int x, int y, int iconOffset, int startRes, int column, boolean validRes, boolean validEnd) { g.setColor(SHEET_COLOUR); - if (!validEnd || !validRes || row.annotations[column] == null - || row.annotations[column].secondaryStructure != 'E') + if (!validEnd || !validRes || row==null || row[column] == null + || row[column].secondaryStructure != 'E') { g.fillRect(lastSSX, y + 4 + iconOffset, (x * charWidth) - lastSSX - 4, 7); @@ -642,7 +643,7 @@ public class AnnotationRenderer } - public void drawHelixAnnot(Graphics g, AlignmentAnnotation row, + public void drawHelixAnnot(Graphics g, Annotation[] row, int lastSSX, int x, int y, int iconOffset, int startRes, int column, boolean validRes, boolean validEnd) { @@ -658,8 +659,8 @@ public class AnnotationRenderer // Off by 1 offset when drawing rects and ovals // to offscreen image on the MAC g.fillRoundRect(lastSSX, y + 4 + iconOffset, x2 - x1, 8, 8, 8); - if (sCol == 0 || row.annotations[sCol - 1] == null - || row.annotations[sCol - 1].secondaryStructure != 'H') + if (sCol == 0 || row[sCol - 1] == null + || row[sCol - 1].secondaryStructure != 'H') { } else @@ -668,8 +669,8 @@ public class AnnotationRenderer g.fillRoundRect(lastSSX, y + 4 + iconOffset, x2 - x1 - ofs + 1, 8, 0, 0); } - if (!validRes || row.annotations[column] == null - || row.annotations[column].secondaryStructure != 'H') + if (!validRes || row[column] == null + || row[column].secondaryStructure != 'H') { } @@ -684,15 +685,15 @@ public class AnnotationRenderer return; } - if (sCol == 0 || row.annotations[sCol - 1] == null - || row.annotations[sCol - 1].secondaryStructure != 'H') + if (sCol == 0 || row[sCol - 1] == null + || row[sCol - 1].secondaryStructure != 'H') { g.fillArc(lastSSX, y + 4 + iconOffset, charWidth, 8, 90, 180); x1 += charWidth / 2; } - if (!validRes || row.annotations[column] == null - || row.annotations[column].secondaryStructure != 'H') + if (!validRes || row[column] == null + || row[column].secondaryStructure != 'H') { g.fillArc((x * charWidth) - charWidth, y + 4 + iconOffset, charWidth, 8, 270, 180); @@ -702,10 +703,10 @@ public class AnnotationRenderer g.fillRect(x1, y + 4 + iconOffset, x2 - x1, 8); } - public void drawLineGraph(Graphics g, AlignmentAnnotation aa, int sRes, + public void drawLineGraph(Graphics g, AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, int eRes, int y, float min, float max, int graphHeight) { - if (sRes > aa.annotations.length) + if (sRes > aa_annotations.length) { return; } @@ -718,7 +719,7 @@ public class AnnotationRenderer eRes++; } - eRes = Math.min(eRes, aa.annotations.length); + eRes = Math.min(eRes, aa_annotations.length); if (sRes == 0) { @@ -737,10 +738,10 @@ public class AnnotationRenderer g.setColor(Color.gray); g.drawLine(x - charWidth, y2, (eRes - sRes + 1) * charWidth, y2); - eRes = Math.min(eRes, aa.annotations.length); + eRes = Math.min(eRes, aa_annotations.length); int column; - int aaMax = aa.annotations.length - 1; + int aaMax = aa_annotations.length - 1; while (x < eRes - sRes) { @@ -755,51 +756,51 @@ public class AnnotationRenderer break; } - if (aa.annotations[column] == null - || aa.annotations[column - 1] == null) + if (aa_annotations[column] == null + || aa_annotations[column - 1] == null) { x++; continue; } - if (aa.annotations[column].colour == null) + if (aa_annotations[column].colour == null) g.setColor(Color.black); else - g.setColor(aa.annotations[column].colour); + g.setColor(aa_annotations[column].colour); y1 = y - - (int) (((aa.annotations[column - 1].value - min) / range) * graphHeight); + - (int) (((aa_annotations[column - 1].value - min) / range) * graphHeight); y2 = y - - (int) (((aa.annotations[column].value - min) / range) * graphHeight); + - (int) (((aa_annotations[column].value - min) / range) * graphHeight); g.drawLine(x * charWidth - charWidth / 2, y1, x * charWidth + charWidth / 2, y2); x++; } - if (aa.threshold != null) + if (_aa.threshold != null) { - g.setColor(aa.threshold.colour); + 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)); - y2 = (int) (y - ((aa.threshold.value - min) / range) * graphHeight); + y2 = (int) (y - ((_aa.threshold.value - min) / range) * graphHeight); g.drawLine(0, y2, (eRes - sRes) * charWidth, y2); g2.setStroke(new BasicStroke()); } } - public void drawBarGraph(Graphics g, AlignmentAnnotation aa, int sRes, + public void drawBarGraph(Graphics g, AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, int eRes, float min, float max, int y) { - if (sRes > aa.annotations.length) + if (sRes > aa_annotations.length) { return; } Font ofont = g.getFont(); - eRes = Math.min(eRes, aa.annotations.length); + eRes = Math.min(eRes, aa_annotations.length); int x = 0, y1 = y, y2 = y; @@ -807,7 +808,7 @@ public class AnnotationRenderer if (min < 0) { - y2 = y - (int) ((0 - min / (range)) * aa.graphHeight); + y2 = y - (int) ((0 - min / (range)) * _aa.graphHeight); } g.setColor(Color.gray); @@ -815,16 +816,16 @@ public class AnnotationRenderer g.drawLine(x, y2, (eRes - sRes) * charWidth, y2); int column; - int aaMax = aa.annotations.length - 1; + int aaMax = aa_annotations.length - 1; boolean renderHistogram = true, renderProfile = true, normaliseProfile = false; // if (aa.autoCalculated && aa.label.startsWith("Consensus")) { // TODO: generalise this to have render styles for consensus/profile data - if (aa.groupRef != null) + if (_aa.groupRef != null) { - renderHistogram = aa.groupRef.isShowConsensusHistogram(); - renderProfile = aa.groupRef.isShowSequenceLogo(); - normaliseProfile = aa.groupRef.isNormaliseSequenceLogo(); + renderHistogram = _aa.groupRef.isShowConsensusHistogram(); + renderProfile = _aa.groupRef.isShowSequenceLogo(); + normaliseProfile = _aa.groupRef.isNormaliseSequenceLogo(); } else { @@ -846,18 +847,18 @@ public class AnnotationRenderer break; } - if (aa.annotations[column] == null) + if (aa_annotations[column] == null) { x++; continue; } - if (aa.annotations[column].colour == null) + if (aa_annotations[column].colour == null) g.setColor(Color.black); else - g.setColor(aa.annotations[column].colour); + g.setColor(aa_annotations[column].colour); y1 = y - - (int) (((aa.annotations[column].value - min) / (range)) * aa.graphHeight); + - (int) (((aa_annotations[column].value - min) / (range)) * _aa.graphHeight); if (renderHistogram) { @@ -874,12 +875,12 @@ public class AnnotationRenderer if (renderProfile) { - int profl[] = getProfileFor(aa, column); + int profl[] = getProfileFor(_aa, column); // just try to draw the logo if profl is not null if (profl != null && profl[1] != 0) { - float ht = normaliseProfile ? y - aa.graphHeight : y1; - double htn = normaliseProfile ? aa.graphHeight : (y2 - y1);// aa.graphHeight; + float ht = normaliseProfile ? y - _aa.graphHeight : y1; + double htn = normaliseProfile ? _aa.graphHeight : (y2 - y1);// aa.graphHeight; double hght; float wdth; double ht2 = 0; @@ -906,17 +907,17 @@ public class AnnotationRenderer { dc[0] = (char) profl[c++]; - if (aa.label.startsWith("StrucConsensus")) + if (_aa.label.startsWith("StrucConsensus")) { dc[1] = (char) profl[c++]; } wdth = charWidth; - wdth /= (float) fm.charsWidth(dc, 0, dc.length); + wdth /= fm.charsWidth(dc, 0, dc.length); ht += scl; { - scl = ((double) htn) * scale * ((double) profl[c++]); + scl = htn * scale * profl[c++]; lm = ofont.getLineMetrics(dc, 0, 1, g.getFontMetrics() .getFontRenderContext()); g.setFont(ofont.deriveFont(AffineTransform.getScaleInstance( @@ -941,25 +942,25 @@ public class AnnotationRenderer } x++; } - if (aa.threshold != null) + if (_aa.threshold != null) { - g.setColor(aa.threshold.colour); + 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)); - 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()); } } // used by overview window - public void drawGraph(Graphics g, AlignmentAnnotation aa, int width, + public void drawGraph(Graphics g, AlignmentAnnotation _aa, Annotation[] aa_annotations, int width, int y, int sRes, int eRes) { - eRes = Math.min(eRes, aa.annotations.length); + eRes = Math.min(eRes, aa_annotations.length); g.setColor(Color.white); g.fillRect(0, 0, width, y); g.setColor(new Color(0, 0, 180)); @@ -968,14 +969,14 @@ public class AnnotationRenderer for (int j = sRes; j < eRes; j++) { - if (aa.annotations[j] != null) + if (aa_annotations[j] != null) { - if (aa.annotations[j].colour == null) + if (aa_annotations[j].colour == null) g.setColor(Color.black); else - g.setColor(aa.annotations[j].colour); + g.setColor(aa_annotations[j].colour); - height = (int) ((aa.annotations[j].value / aa.graphMax) * y); + height = (int) ((aa_annotations[j].value / _aa.graphMax) * y); if (height > y) { height = y; -- 1.7.10.2