X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignViewport.java;h=bd43a978c259eb94fd712394363c9082aa76d947;hb=4ebc6d5b362bc093c39312aa1a69836e3dd6ae84;hp=fe03a31b731e6aad6285f3dc0eecbe0de4390a59;hpb=a35ccec335158616a10026952e0cefad8083fe62;p=jalview.git diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index fe03a31..bd43a97 100755 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -1,71 +1,86 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ package jalview.gui; +import java.util.*; + import java.awt.*; + import jalview.analysis.*; -import jalview.analysis.NJTree; +import jalview.bin.*; import jalview.datamodel.*; import jalview.schemes.*; -import java.util.*; -import jalview.bin.Cache; public class AlignViewport { int startRes; int endRes; - int startSeq; int endSeq; - boolean showFullId = false; - boolean showText=true; - boolean showColourText=false; - boolean showBoxes=true; - boolean wrapAlignment=false; + boolean showText = true; + boolean showColourText = false; + boolean showBoxes = true; + boolean wrapAlignment = false; boolean renderGaps = true; boolean showSequenceFeatures = false; boolean showAnnotation = true; boolean showConservation = true; boolean showQuality = true; boolean showIdentity = true; - boolean colourAppliesToAllGroups = true; ColourSchemeI globalColourScheme = null; boolean conservationColourSelected = false; boolean abovePIDThreshold = false; - SequenceGroup selectionGroup = new SequenceGroup(); - - - int charHeight; - int charWidth; - int chunkWidth; - int chunkHeight; - - Font font = new Font("SansSerif",Font.PLAIN,10); - AlignmentI alignment; - + int charHeight; + int charWidth; + int chunkWidth; + int chunkHeight; + Font font = new Font("SansSerif", Font.PLAIN, 10); + AlignmentI alignment; ColumnSelection colSel = new ColumnSelection(); - int threshold; int increment; - NJTree currentTree = null; - boolean scaleAboveWrapped = false; - boolean scaleLeftWrapped = true; + boolean scaleLeftWrapped = true; boolean scaleRightWrapped = true; + public Vector vconsensus; + AlignmentAnnotation consensus; + AlignmentAnnotation conservation; + AlignmentAnnotation quality; + public int ConsPercGaps = 25; // JBPNote : This should be a scalable property! + // JBPNote Prolly only need this in the applet version. + private java.beans.PropertyChangeSupport changeSupport = new java.beans. + PropertyChangeSupport(this); public AlignViewport(AlignmentI al) { setAlignment(al); this.startRes = 0; - this.endRes = al.getWidth()-1; + this.endRes = al.getWidth() - 1; this.startSeq = 0; - this.endSeq = al.getHeight()-1; + this.endSeq = al.getHeight() - 1; updateFromPreferences(); - } public void updateFromPreferences() @@ -76,20 +91,30 @@ public class AlignViewport showQuality = Preferences.showQuality; showIdentity = Preferences.showIdentity; showFullId = Preferences.showFullId; + String fontName = Preferences.fontName; String fontStyle = Preferences.fontStyle; String fontSize = Cache.getProperty("FONT_SIZE"); - if (fontName != null && fontStyle != null && fontSize != null) + + if ( (fontName != null) && (fontStyle != null) && (fontSize != null)) { int style = 0; - if(fontStyle.equals("bold")) + + if (fontStyle.equals("bold")) + { style = 1; - else if(fontStyle.equals("italic")) + } + else if (fontStyle.equals("italic")) + { style = 2; + } + setFont(new Font(fontName, style, Integer.parseInt(fontSize))); } else + { setFont(font); + } alignment.setGapCharacter(Preferences.gapSymbol); @@ -97,49 +122,55 @@ public class AlignViewport // as Blosum and Clustal require this to be done updateConservation(); updateConsensus(); - if(Preferences.defaultColour!=null) + + if (Preferences.defaultColour != null) { - globalColourScheme = ColourSchemeProperty.getColour(alignment, Preferences.defaultColour); - if(globalColourScheme instanceof UserColourScheme) + globalColourScheme = ColourSchemeProperty.getColour(alignment, + Preferences.defaultColour); + + if (globalColourScheme instanceof UserColourScheme) { globalColourScheme = UserDefinedColours.loadDefaultColours(); } - if(globalColourScheme!=null) - globalColourScheme.setConsensus( vconsensus ); - } - } - - public void showSequenceFeatures(boolean b) - { - showSequenceFeatures = b; - } - - public Vector vconsensus; - AlignmentAnnotation consensus; - AlignmentAnnotation conservation; - AlignmentAnnotation quality; + if (globalColourScheme != null) + { + globalColourScheme.setConsensus(vconsensus); + } + } + } - public int ConsPercGaps = 25; // JBPNote : This should be a scalable property! + public void showSequenceFeatures(boolean b) + { + showSequenceFeatures = b; + } public void updateConservation() { Conservation cons = new jalview.analysis.Conservation("All", jalview.schemes.ResidueProperties.propHash, 3, - alignment.getSequences(), 0, - alignment.getWidth()-1); + alignment.getSequences(), 0, alignment.getWidth() - 1); cons.calculate(); cons.verdict(false, ConsPercGaps); cons.findQuality(); + int alWidth = alignment.getWidth(); - Annotation [] annotations = new Annotation[alWidth]; - Annotation [] qannotations = new Annotation[alWidth]; + Annotation[] annotations = new Annotation[alWidth]; + Annotation[] qannotations = new Annotation[alWidth]; String sequence = cons.getConsSequence().getSequence(); - float minR,minG,minB, maxR,maxG,maxB; + float minR; + float minG; + float minB; + float maxR; + float maxG; + float maxB; minR = 0.3f; minG = 0.0f; minB = 0f; - maxR = 1.0f-minR; maxG=0.9f-minG; maxB=0f-minB; // scalable range for colouring both Conservation and Quality + maxR = 1.0f - minR; + maxG = 0.9f - minG; + maxB = 0f - minB; // scalable range for colouring both Conservation and Quality + float min = 0f; float max = 11f; float qmin = cons.qualityRange[0].floatValue(); @@ -148,108 +179,140 @@ public class AlignViewport for (int i = 0; i < alWidth; i++) { float value = 0; + try + { + value = Integer.parseInt(sequence.charAt(i) + ""); + } + catch (Exception ex) + { + if (sequence.charAt(i) == '*') { - value = Integer.parseInt(sequence.charAt(i) + ""); + value = 11; } - catch (Exception ex) + + if (sequence.charAt(i) == '+') { - if (sequence.charAt(i) == '*') value = 11; - if (sequence.charAt(i) == '+') value = 10; + value = 10; } - float vprop = value-min; - vprop/=max; - annotations[i] = new Annotation(sequence.charAt(i) + "", - "", ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); + } + + float vprop = value - min; + vprop /= max; + annotations[i] = new Annotation(sequence.charAt(i) + "", "", ' ', + value, + new Color(minR + (maxR * vprop), + minG + (maxG * vprop), + minB + (maxB * vprop))); + // Quality calc - value = ((Double) cons.quality.get(i)).floatValue(); + value = ( (Double) cons.quality.get(i)).floatValue(); vprop = value - qmin; - vprop/=qmax; - qannotations[i] = new Annotation(" ", - String.valueOf(value), ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); + vprop /= qmax; + qannotations[i] = new Annotation(" ", String.valueOf(value), ' ', + value, + new Color(minR + (maxR * vprop), + minG + (maxG * vprop), + minB + (maxB * vprop))); } - if(conservation==null) + if (conservation == null) { conservation = new AlignmentAnnotation("Conservation", - "Conservation of total alignment less than "+ConsPercGaps+"% gaps", - annotations, - 0f, // cons.qualityRange[0].floatValue(), + "Conservation of total alignment less than " + + ConsPercGaps + "% gaps", + annotations, 0f, // cons.qualityRange[0].floatValue(), 11f, // cons.qualityRange[1].floatValue() 1); - if(showConservation) - alignment.addAnnotation(conservation); + + if (showConservation) + { + alignment.addAnnotation(conservation); + } + quality = new AlignmentAnnotation("Quality", "Alignment Quality based on Blosum62 scores", qannotations, cons.qualityRange[0].floatValue(), - cons.qualityRange[1].floatValue(), - 1); - if(showQuality) + cons.qualityRange[1].floatValue(), 1); + + if (showQuality) + { alignment.addAnnotation(quality); + } } - else { + else + { conservation.annotations = annotations; quality.annotations = qannotations; quality.graphMax = cons.qualityRange[1].floatValue(); } - - } public void updateConsensus() { - Annotation [] annotations = new Annotation[alignment.getWidth()]; + Annotation[] annotations = new Annotation[alignment.getWidth()]; // this routine prevents vconsensus becoming a new object each time // consenus is calculated. Important for speed of Blosum62 // and PID colouring of alignment - if(vconsensus == null) - vconsensus = alignment.getAAFrequency(); + if (vconsensus == null) + { + vconsensus = alignment.getAAFrequency(); + } else { - Vector temp = alignment.getAAFrequency(); - vconsensus.clear(); - Enumeration e = temp.elements(); - while(e.hasMoreElements()) - { - vconsensus.add(e.nextElement()); - } + Vector temp = alignment.getAAFrequency(); + vconsensus.clear(); + + Enumeration e = temp.elements(); + + while (e.hasMoreElements()) + { + vconsensus.add(e.nextElement()); + } } + Hashtable hash = null; - for (int i = 0; i2) - { - mouseOver = "["+maxRes+"] "; - maxRes = "+ "; - } + hash = (Hashtable) vconsensus.elementAt(i); + + float value = Float.parseFloat(hash.get("maxCount").toString()); + value /= Float.parseFloat(hash.get("size").toString()); - mouseOver += (int)value+"%"; - annotations[i] = new Annotation(maxRes, mouseOver, ' ', value); + value *= 100; + String maxRes = hash.get("maxResidue") + " "; + String mouseOver = hash.get("maxResidue") + " "; + + if (maxRes.length() > 2) + { + mouseOver = "[" + maxRes + "] "; + maxRes = "+ "; + } + + mouseOver += ( (int) value + "%"); + annotations[i] = new Annotation(maxRes, mouseOver, ' ', value); } - if(consensus==null) - { - consensus = new AlignmentAnnotation("Consensus", - "PID", annotations, 0f, 100f, 1); - if(showIdentity) - alignment.addAnnotation(consensus); - } - else - consensus.annotations = annotations; + if (consensus == null) + { + consensus = new AlignmentAnnotation("Consensus", "PID", + annotations, 0f, 100f, 1); + if (showIdentity) + { + alignment.addAnnotation(consensus); + } + } + else + { + consensus.annotations = annotations; + } } - public SequenceGroup getSelectionGroup() { return selectionGroup; @@ -260,42 +323,44 @@ public class AlignViewport selectionGroup = sg; } + public boolean getConservationSelected() + { + return conservationColourSelected; + } - public boolean getConservationSelected() - { - return conservationColourSelected; - } - - public void setConservationSelected(boolean b) - { - conservationColourSelected = b; - } + public void setConservationSelected(boolean b) + { + conservationColourSelected = b; + } - public boolean getAbovePIDThreshold() - { - return abovePIDThreshold; - } + public boolean getAbovePIDThreshold() + { + return abovePIDThreshold; + } - public void setAbovePIDThreshold(boolean b) - { - abovePIDThreshold = b; - } + public void setAbovePIDThreshold(boolean b) + { + abovePIDThreshold = b; + } - public int getStartRes() { + public int getStartRes() + { return startRes; } - public int getEndRes() { + public int getEndRes() + { return endRes; } - public int getStartSeq() { + public int getStartSeq() + { return startSeq; } public void setGlobalColourScheme(ColourSchemeI cs) { - globalColourScheme = cs; + globalColourScheme = cs; } public ColourSchemeI getGlobalColourScheme() @@ -303,91 +368,134 @@ public class AlignViewport return globalColourScheme; } - - public void setStartRes(int res) { + public void setStartRes(int res) + { this.startRes = res; } - public void setStartSeq(int seq) { + + public void setStartSeq(int seq) + { this.startSeq = seq; } - public void setEndRes(int res) { - if (res > alignment.getWidth()-1) { + + public void setEndRes(int res) + { + if (res > (alignment.getWidth() - 1)) + { // log.System.out.println(" Corrected res from " + res + " to maximum " + (alignment.getWidth()-1)); - res = alignment.getWidth()-1; + res = alignment.getWidth() - 1; } - if (res < 0) { + + if (res < 0) + { res = 0; } + this.endRes = res; } - public void setEndSeq(int seq) { - if (seq > alignment.getHeight()) { + + public void setEndSeq(int seq) + { + if (seq > alignment.getHeight()) + { seq = alignment.getHeight(); } - if (seq < 0) { + + if (seq < 0) + { seq = 0; } + this.endSeq = seq; } - public int getEndSeq() { + + public int getEndSeq() + { return endSeq; } - public void setFont(Font f) { + public void setFont(Font f) + { font = f; + javax.swing.JFrame temp = new javax.swing.JFrame(); temp.addNotify(); + java.awt.FontMetrics fm = temp.getGraphics().getFontMetrics(font); setCharHeight(fm.getHeight()); setCharWidth(fm.charWidth('M')); } - public Font getFont() { + public Font getFont() + { return font; } - public void setCharWidth(int w) { + + public void setCharWidth(int w) + { this.charWidth = w; } - public int getCharWidth() { + + public int getCharWidth() + { return charWidth; } - public void setCharHeight(int h) { + + public void setCharHeight(int h) + { this.charHeight = h; } - public int getCharHeight() { + + public int getCharHeight() + { return charHeight; } - public void setChunkWidth(int w) { + + public void setChunkWidth(int w) + { this.chunkWidth = w; } - public int getChunkWidth() { + + public int getChunkWidth() + { return chunkWidth; } - public void setChunkHeight(int h) { + + public void setChunkHeight(int h) + { this.chunkHeight = h; } - public int getChunkHeight() { + + public int getChunkHeight() + { return chunkHeight; } - public AlignmentI getAlignment() { + + public AlignmentI getAlignment() + { return alignment; } - public void setAlignment(AlignmentI align) { + + public void setAlignment(AlignmentI align) + { this.alignment = align; } - public void setWrapAlignment(boolean state) { + public void setWrapAlignment(boolean state) + { wrapAlignment = state; } - public void setShowText(boolean state) { + + public void setShowText(boolean state) + { showText = state; } - public void setRenderGaps(boolean state){ + public void setRenderGaps(boolean state) + { renderGaps = state; } - public boolean getColourText() { return showColourText; @@ -398,79 +506,117 @@ public class AlignViewport showColourText = state; } - public void setShowBoxes(boolean state) { + public void setShowBoxes(boolean state) + { showBoxes = state; } - public boolean getWrapAlignment() { - return wrapAlignment; + public boolean getWrapAlignment() + { + return wrapAlignment; } - public boolean getShowText() { + + public boolean getShowText() + { return showText; } - public boolean getShowBoxes() { + + public boolean getShowBoxes() + { return showBoxes; } - public char getGapCharacter() { + public char getGapCharacter() + { return getAlignment().getGapCharacter(); } - public void setGapCharacter(char gap) { - if (getAlignment() != null) { + + public void setGapCharacter(char gap) + { + if (getAlignment() != null) + { getAlignment().setGapCharacter(gap); } } - public void setThreshold(int thresh) { + + public void setThreshold(int thresh) + { threshold = thresh; } - public int getThreshold() { + + public int getThreshold() + { return threshold; } - public void setIncrement(int inc) { + + public void setIncrement(int inc) + { increment = inc; } - public int getIncrement() { + + public int getIncrement() + { return increment; } - public int getIndex(int y) { - int y1 = 0; + + public int getIndex(int y) + { + int y1 = 0; int starty = getStartSeq(); - int endy = getEndSeq(); + int endy = getEndSeq(); - for (int i = starty; i <= endy; i++) { - if (i < alignment.getHeight() && alignment.getSequenceAt(i) != null) { + for (int i = starty; i <= endy; i++) + { + if ( (i < alignment.getHeight()) && + (alignment.getSequenceAt(i) != null)) + { int y2 = y1 + getCharHeight(); - if (y>=y1 && y <=y2) { + if ( (y >= y1) && (y <= y2)) + { return i; } - y1 = y2; - } else { + + y1 = y2; + } + else + { return -1; } } + return -1; } - public ColumnSelection getColumnSelection() { + public ColumnSelection getColumnSelection() + { return colSel; } - public void resetSeqLimits(int height) { - setEndSeq(height/getCharHeight()); + public void resetSeqLimits(int height) + { + setEndSeq(height / getCharHeight()); } - public void setCurrentTree(NJTree tree) { - currentTree = tree; + + public void setCurrentTree(NJTree tree) + { + currentTree = tree; } - public NJTree getCurrentTree() { + + public NJTree getCurrentTree() + { return currentTree; } public void setColourAppliesToAllGroups(boolean b) - { colourAppliesToAllGroups = b; } + { + colourAppliesToAllGroups = b; + } public boolean getColourAppliesToAllGroups() - {return colourAppliesToAllGroups; } + { + return colourAppliesToAllGroups; + } public boolean getShowFullId() { @@ -483,38 +629,59 @@ public class AlignViewport } public boolean getShowAnnotation() - { return showAnnotation; } + { + return showAnnotation; + } public void setShowAnnotation(boolean b) - { showAnnotation = b; } + { + showAnnotation = b; + } public boolean getScaleAboveWrapped() - { return scaleAboveWrapped;} + { + return scaleAboveWrapped; + } public boolean getScaleLeftWrapped() - { return scaleLeftWrapped; } + { + return scaleLeftWrapped; + } public boolean getScaleRightWrapped() - { return scaleRightWrapped; } + { + return scaleRightWrapped; + } public void setScaleAboveWrapped(boolean b) - { scaleAboveWrapped = b; } + { + scaleAboveWrapped = b; + } public void setScaleLeftWrapped(boolean b) - { scaleLeftWrapped = b; } + { + scaleLeftWrapped = b; + } public void setScaleRightWrapped(boolean b) - { scaleRightWrapped = b; } - // JBPNote Prolly only need this in the applet version. - private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(this); - public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) { + { + scaleRightWrapped = b; + } + + public void addPropertyChangeListener( + java.beans.PropertyChangeListener listener) + { changeSupport.addPropertyChangeListener(listener); } - public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) { + public void removePropertyChangeListener( + java.beans.PropertyChangeListener listener) + { changeSupport.removePropertyChangeListener(listener); } - public void firePropertyChange(String prop, Object oldvalue, Object newvalue) { + + public void firePropertyChange(String prop, Object oldvalue, Object newvalue) + { changeSupport.firePropertyChange(prop, oldvalue, newvalue); } }