X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignViewport.java;h=9f6448d513ceb2a995cff47383a2cbc2b265b609;hb=2ad64bdec4782e3fbfa3b5867a1aa7d1571629fa;hp=cef87f7ca9b76497471470ebd6fca82a902742c9;hpb=e5127e5f27f02c8f328539eaac68eabfbee1d135;p=jalview.git diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java index cef87f7..9f6448d 100755 --- a/src/jalview/appletgui/AlignViewport.java +++ b/src/jalview/appletgui/AlignViewport.java @@ -1,11 +1,32 @@ +/* + * 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.appletgui; +import java.util.*; + import java.awt.*; -import jalview.bin.*; + import jalview.analysis.*; +import jalview.bin.*; import jalview.datamodel.*; import jalview.schemes.*; -import java.util.*; public class AlignViewport { @@ -15,11 +36,14 @@ public class AlignViewport int startSeq; int endSeq; - boolean showFullId = true; - boolean showText=true; - boolean showColourText=false; - boolean showBoxes=true; - boolean wrapAlignment=false; + + boolean cursorMode = false; + + boolean showJVSuffix = true; + boolean showText = true; + boolean showColourText = false; + boolean showBoxes = true; + boolean wrapAlignment = false; boolean renderGaps = true; boolean showSequenceFeatures = false; boolean showAnnotation = true; @@ -32,15 +56,15 @@ public class AlignViewport boolean conservationColourSelected = false; boolean abovePIDThreshold = false; - SequenceGroup selectionGroup = new SequenceGroup(); + SequenceGroup selectionGroup; - int charHeight; - int charWidth; - int chunkWidth; - int chunkHeight; + int charHeight; + int charWidth; + int wrappedWidth; - Font font = new Font("SansSerif",Font.PLAIN,10); - AlignmentI alignment; + Font font = new Font("SansSerif", Font.PLAIN, 10); + boolean validCharWidth = true; + AlignmentI alignment; ColumnSelection colSel = new ColumnSelection(); @@ -50,86 +74,138 @@ public class AlignViewport NJTree currentTree = null; boolean scaleAboveWrapped = true; - boolean scaleLeftWrapped = true; + boolean scaleLeftWrapped = true; boolean scaleRightWrapped = true; + // The following vector holds the features which are + // currently visible, in the correct order or rendering + Hashtable featuresDisplayed; + + + public Vector vconsensus; + AlignmentAnnotation consensus; + AlignmentAnnotation conservation; + AlignmentAnnotation quality; + + boolean autocalculateConsensus = true; + + public int ConsPercGaps = 25; // JBPNote : This should be a scalable property! + + private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(this); + + boolean ignoreGapsInConsensusCalculation = false; + public AlignViewport(AlignmentI al, JalviewLite applet) { 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; setFont(font); - - if(applet!=null) + if (applet != null) { String param = applet.getParameter("showFullId"); if (param != null) - showFullId = Boolean.valueOf(param).booleanValue(); + { + showJVSuffix = Boolean.valueOf(param).booleanValue(); + } param = applet.getParameter("showAnnotation"); if (param != null) + { showAnnotation = Boolean.valueOf(param).booleanValue(); + } param = applet.getParameter("showConservation"); if (param != null) + { showConservation = Boolean.valueOf(param).booleanValue(); + } param = applet.getParameter("showQuality"); if (param != null) + { showQuality = Boolean.valueOf(param).booleanValue(); + } param = applet.getParameter("showConsensus"); if (param != null) + { showConsensus = Boolean.valueOf(param).booleanValue(); + } } // We must set conservation and consensus before setting colour, // as Blosum and Clustal require this to be done updateConservation(); updateConsensus(); - if(applet!=null && applet.getParameter("defaultColour")!=null) + + if (applet != null) { - globalColourScheme = ColourSchemeProperty.getColour(alignment, - applet.getParameter("defaultColour")); - if(globalColourScheme!=null) - globalColourScheme.setConsensus( vconsensus ); - } - } + String colour = applet.getParameter("defaultColour"); + if(colour == null) + { + colour = applet.getParameter("userDefinedColour"); + if(colour !=null) + colour = "User Defined"; + } - public void showSequenceFeatures(boolean b) - { - showSequenceFeatures = b; - } + if(colour != null) + { + globalColourScheme = ColourSchemeProperty.getColour(alignment, colour); + if (globalColourScheme != null) + { + globalColourScheme.setConsensus(vconsensus); + } + } - public Vector vconsensus; - AlignmentAnnotation consensus; - AlignmentAnnotation conservation; - AlignmentAnnotation quality; + if(applet.getParameter("userDefinedColour")!=null) + { + ((UserColourScheme)globalColourScheme).parseAppletParameter( + applet.getParameter("userDefinedColour")); + } + + + } + } + + public void showSequenceFeatures(boolean b) + { + showSequenceFeatures = b; + } + + public boolean getShowSequenceFeatures() + { + return showSequenceFeatures; + } - public int ConsPercGaps = 25; // JBPNote : This should be a scalable property! public void updateConservation() { + if(alignment.isNucleotide()) + return; + Conservation cons = new jalview.analysis.Conservation("All", jalview.schemes.ResidueProperties.propHash, 3, alignment.getSequences(), 0, - alignment.getWidth()-1); + 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, minG, minB, maxR, maxG, 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(); @@ -139,107 +215,137 @@ public class AlignViewport { 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; + } + float vprop = value - min; + vprop /= max; + annotations[i] = new Annotation(sequence.charAt(i) + "", - "Conservation graph", ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); + "", ' ', value, + new Color(minR + maxR * vprop, + minG + maxG * vprop, + minB + maxB * vprop)); // Quality calc - value = ((Double) cons.quality.elementAt(i)).floatValue(); + value = ( (Double) cons.quality.elementAt(i)).floatValue(); vprop = value - qmin; - vprop/=qmax; + vprop /= qmax; qannotations[i] = new Annotation(" ", - String.valueOf(value), ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop)); + 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", + "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); + AlignmentAnnotation.BAR_GRAPH); + 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) + AlignmentAnnotation.BAR_GRAPH); + 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.removeAllElements(); - Enumeration e = temp.elements(); - while(e.hasMoreElements()) - { - vconsensus.addElement(e.nextElement()); - } + Vector temp = alignment.getAAFrequency(); + vconsensus.removeAllElements(); + Enumeration e = temp.elements(); + while (e.hasMoreElements()) + { + vconsensus.addElement(e.nextElement()); + } } Hashtable hash = null; - for (int i = 0; i2) - { - mouseOver = "["+maxRes+"] "; - maxRes = "+ "; - } + hash = (Hashtable) vconsensus.elementAt(i); + float value = 0; + if(ignoreGapsInConsensusCalculation) + value = ((Float)hash.get("pid_nogaps")).floatValue(); + else + value = ((Float)hash.get("pid_gaps")).floatValue(); + + String maxRes = hash.get("maxResidue").toString(); + String mouseOver = hash.get("maxResidue") + " "; + if (maxRes.length() > 1) + { + mouseOver = "[" + maxRes + "] "; + maxRes = "+"; + } + - mouseOver += (int)value+"%"; - annotations[i] = new Annotation(maxRes, mouseOver, ' ', value); + mouseOver += (int) value + "%"; + annotations[i] = new Annotation(maxRes, mouseOver, ' ', value); } - if(consensus==null) - { - consensus = new AlignmentAnnotation("Consensus", - "PID", annotations, 0f, 100f, 1); - if(showConsensus) - alignment.addAnnotation(consensus); - } - else - consensus.annotations = annotations; + if (consensus == null) + { + consensus = new AlignmentAnnotation("Consensus", + "PID", annotations, 0f, 100f, AlignmentAnnotation.BAR_GRAPH); + if (showConsensus) + { + alignment.addAnnotation(consensus); + } + } + else + { + consensus.annotations = annotations; + } + + if(globalColourScheme!=null) + globalColourScheme.setConsensus(vconsensus); } - public SequenceGroup getSelectionGroup() { return selectionGroup; @@ -250,42 +356,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() @@ -293,91 +401,123 @@ 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) { + java.awt.Frame nullFrame; + public void setFont(Font f) + { font = f; - java.awt.Frame temp = new java.awt.Frame(); - temp.addNotify(); - java.awt.FontMetrics fm = temp.getGraphics().getFontMetrics(font); + if(nullFrame == null) + { + nullFrame = new java.awt.Frame(); + nullFrame.addNotify(); + } + + java.awt.FontMetrics fm = nullFrame.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) { - this.chunkWidth = w; - } - public int getChunkWidth() { - return chunkWidth; - } - public void setChunkHeight(int h) { - this.chunkHeight = h; + + public void setWrappedWidth(int w) + { + this.wrappedWidth = w; } - public int getChunkHeight() { - return chunkHeight; + + public int getwrappedWidth() + { + return wrappedWidth; } - 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; @@ -388,89 +528,97 @@ 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() { - return increment; - } - public int getIndex(int y) { - int y1 = 0; - int starty = getStartSeq(); - int endy = getEndSeq(); - - for (int i = starty; i <= endy; i++) { - if (i < alignment.getHeight() && alignment.getSequenceAt(i) != null) { - int y2 = y1 + getCharHeight(); - if (y>=y1 && y <=y2) { - return i; - } - y1 = y2; - } else { - return -1; - } - } - return -1; + public int getIncrement() + { + return increment; } - 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() + public boolean getShowJVSuffix() { - return showFullId; + return showJVSuffix; } - public void setShowFullId(boolean b) + public void setShowJVSuffix(boolean b) { - showFullId = b; + showJVSuffix = b; } public boolean getShowAnnotation() @@ -484,22 +632,87 @@ public class AlignViewport } 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; } + { + scaleRightWrapped = b; + } + + public void setIgnoreGapsConsensus(boolean b) + { + ignoreGapsInConsensusCalculation = b; + updateConsensus(); + if (globalColourScheme!=null) + { + globalColourScheme.setThreshold(globalColourScheme.getThreshold(), + ignoreGapsInConsensusCalculation); + + } + } + + /** + * Property change listener for changes in alignment + * + * @param listener DOCUMENT ME! + */ + public void addPropertyChangeListener( + java.beans.PropertyChangeListener listener) + { + changeSupport.addPropertyChangeListener(listener); + } + + /** + * DOCUMENT ME! + * + * @param listener DOCUMENT ME! + */ + public void removePropertyChangeListener( + java.beans.PropertyChangeListener listener) + { + changeSupport.removePropertyChangeListener(listener); + } + + /** + * Property change listener for changes in alignment + * + * @param prop DOCUMENT ME! + * @param oldvalue DOCUMENT ME! + * @param newvalue DOCUMENT ME! + */ + public void firePropertyChange(String prop, Object oldvalue, Object newvalue) + { + changeSupport.firePropertyChange(prop, oldvalue, newvalue); + } + + + + public boolean getIgnoreGapsConsensus() + { + return ignoreGapsInConsensusCalculation; + } }