int endRes;\r
int startSeq;\r
int endSeq;\r
- boolean showFullId = false;\r
+ boolean showJVSuffix = true;\r
boolean showText = true;\r
boolean showColourText = false;\r
boolean showBoxes = true;\r
SequenceGroup selectionGroup;\r
int charHeight;\r
int charWidth;\r
- int chunkWidth;\r
- int chunkHeight;\r
- Font font = new Font("SansSerif", Font.PLAIN, 10);\r
+ boolean validCharWidth;\r
+ int wrappedWidth;\r
+ Font font;\r
AlignmentI alignment;\r
ColumnSelection colSel = new ColumnSelection();\r
int threshold;\r
boolean scaleAboveWrapped = false;\r
boolean scaleLeftWrapped = true;\r
boolean scaleRightWrapped = true;\r
+ boolean hasHiddenColumns = false;\r
+ boolean hasHiddenRows = false;\r
+ boolean showHiddenMarkers = true;\r
+\r
+ boolean cursorMode = false;\r
+\r
+ // The following vector holds the features which are\r
+ // currently visible, in the correct order or rendering\r
+ Hashtable featuresDisplayed = null;\r
+\r
\r
/** DOCUMENT ME!! */\r
public Vector vconsensus;\r
AlignmentAnnotation consensus;\r
AlignmentAnnotation conservation;\r
AlignmentAnnotation quality;\r
+ boolean autoCalculateConsensus = true;\r
\r
/** DOCUMENT ME!! */\r
public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!\r
\r
boolean ignoreGapsInConsensusCalculation = false;\r
\r
+ boolean isDataset = false;\r
+\r
+ boolean antiAlias = false;\r
+\r
+ boolean padGaps = false;\r
+\r
+\r
+ public AlignViewport(AlignmentI al, boolean dataset)\r
+ {\r
+ isDataset = dataset;\r
+ setAlignment(al);\r
+ init();\r
+ }\r
/**\r
* Creates a new AlignViewport object.\r
*\r
public AlignViewport(AlignmentI al)\r
{\r
setAlignment(al);\r
- this.startRes = 0;\r
- this.endRes = al.getWidth() - 1;\r
- this.startSeq = 0;\r
- this.endSeq = al.getHeight() - 1;\r
-\r
- updateFromPreferences();\r
+ init();\r
}\r
-\r
/**\r
- * DOCUMENT ME!\r
+ * Create a new AlignViewport with hidden regions\r
+ * @param al AlignmentI\r
+ * @param hiddenColumns ColumnSelection\r
*/\r
- public void updateFromPreferences()\r
+ public AlignViewport(AlignmentI al, ColumnSelection hiddenColumns) {\r
+ setAlignment(al);\r
+ if (hiddenColumns!=null) {\r
+ this.colSel = hiddenColumns;\r
+ if (hiddenColumns.getHiddenColumns() != null)\r
+ hasHiddenColumns = true;\r
+ }\r
+ init();\r
+ }\r
+\r
+ void init()\r
{\r
- showFullId = Cache.getDefault("SHOW_FULL_ID", true);\r
+ this.startRes = 0;\r
+ this.endRes = alignment.getWidth() - 1;\r
+ this.startSeq = 0;\r
+ this.endSeq = alignment.getHeight() - 1;\r
+\r
+ antiAlias = Cache.getDefault("ANTI_ALIAS", false);\r
+\r
+ showJVSuffix = Cache.getDefault("SHOW_JVSUFFIX", true);\r
showAnnotation = Cache.getDefault("SHOW_ANNOTATIONS", true);\r
showConservation = Cache.getDefault("SHOW_CONSERVATION", true);\r
\r
showQuality = Cache.getDefault("SHOW_QUALITY", true);\r
showIdentity = Cache.getDefault("SHOW_IDENTITY", true);\r
\r
+ autoCalculateConsensus = Cache.getDefault("AUTO_CALC_CONSENSUS", true);\r
+\r
+ padGaps = Cache.getDefault("PAD_GAPS", false);\r
+\r
String fontName = Cache.getDefault("FONT_NAME", "SansSerif");\r
String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "") ;\r
String fontSize = Cache.getDefault("FONT_SIZE", "10");\r
\r
// We must set conservation and consensus before setting colour,\r
// as Blosum and Clustal require this to be done\r
- updateConservation();\r
- updateConsensus();\r
+ if(vconsensus==null && !isDataset)\r
+ {\r
+ updateConservation();\r
+ updateConsensus();\r
+ }\r
\r
if (jalview.bin.Cache.getProperty("DEFAULT_COLOUR") != null)\r
{\r
*\r
* @param b DOCUMENT ME!\r
*/\r
- public void showSequenceFeatures(boolean b)\r
+ public void setShowSequenceFeatures(boolean b)\r
{\r
showSequenceFeatures = b;\r
}\r
\r
+ public boolean getShowSequenceFeatures()\r
+ {\r
+ return showSequenceFeatures;\r
+ }\r
+\r
/**\r
* DOCUMENT ME!\r
*/\r
public void updateConservation()\r
{\r
+ if(alignment.isNucleotide())\r
+ return;\r
+\r
try{\r
Conservation cons = new jalview.analysis.Conservation("All",\r
jalview.schemes.ResidueProperties.propHash, 3,\r
ConsPercGaps + "% gaps",\r
annotations, 0f, // cons.qualityRange[0].floatValue(),\r
11f, // cons.qualityRange[1].floatValue()\r
- 1);\r
+ AlignmentAnnotation.BAR_GRAPH);\r
\r
if (showConservation)\r
{\r
qannotations,\r
cons.qualityRange[0].floatValue(),\r
cons.qualityRange[1].floatValue(),\r
- 1);\r
+ AlignmentAnnotation.BAR_GRAPH);\r
\r
if (showQuality)\r
{\r
quality.annotations = qannotations;\r
quality.graphMax = cons.qualityRange[1].floatValue();\r
}\r
- }catch(OutOfMemoryError error)\r
+ }\r
+ catch (OutOfMemoryError error)\r
{\r
- System.out.println("Out of memory calculating conservation.");\r
+ javax.swing.SwingUtilities.invokeLater(new Runnable()\r
+ {\r
+ public void run()\r
+ {\r
+ javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
+ "Out of memory calculating conservation!!"\r
+ +\r
+ "\nSee help files for increasing Java Virtual Machine memory."\r
+ , "Out of memory",\r
+ javax.swing.JOptionPane.WARNING_MESSAGE);\r
+ }\r
+ });\r
+\r
+ System.out.println("Conservation calculation: " + error);\r
+ System.gc();\r
+\r
}\r
}\r
\r
if (consensus == null)\r
{\r
consensus = new AlignmentAnnotation("Consensus", "PID",\r
- annotations, 0f, 100f, 1);\r
+ annotations, 0f, 100f,AlignmentAnnotation.BAR_GRAPH);\r
\r
if (showIdentity)\r
{\r
\r
}catch(OutOfMemoryError error)\r
{\r
- System.out.println("Out of memory calculating consensus.");\r
+ javax.swing.SwingUtilities.invokeLater(new Runnable()\r
+ {\r
+ public void run()\r
+ {\r
+ javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
+ "Out of memory calc45ulating consensus!!"\r
+ +\r
+ "\nSee help files for increasing Java Virtual Machine memory."\r
+ , "Out of memory",\r
+ javax.swing.JOptionPane.WARNING_MESSAGE);\r
+ }\r
+ });\r
+\r
+\r
+ System.out.println("Consensus calculation: " + error);\r
+ System.gc();\r
}\r
\r
}\r
java.awt.FontMetrics fm = c.getFontMetrics(font);\r
setCharHeight(fm.getHeight());\r
setCharWidth(fm.charWidth('M'));\r
+ validCharWidth = true;\r
}\r
\r
/**\r
*\r
* @param w DOCUMENT ME!\r
*/\r
- public void setChunkWidth(int w)\r
+ public void setWrappedWidth(int w)\r
{\r
- this.chunkWidth = w;\r
+ this.wrappedWidth = w;\r
}\r
\r
/**\r
*\r
* @return DOCUMENT ME!\r
*/\r
- public int getChunkWidth()\r
+ public int getWrappedWidth()\r
{\r
- return chunkWidth;\r
+ return wrappedWidth;\r
}\r
\r
- /**\r
- * DOCUMENT ME!\r
- *\r
- * @param h DOCUMENT ME!\r
- */\r
- public void setChunkHeight(int h)\r
- {\r
- this.chunkHeight = h;\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- *\r
- * @return DOCUMENT ME!\r
- */\r
- public int getChunkHeight()\r
- {\r
- return chunkHeight;\r
- }\r
\r
/**\r
* DOCUMENT ME!\r
return increment;\r
}\r
\r
- /**\r
- * DOCUMENT ME!\r
- *\r
- * @param y DOCUMENT ME!\r
- *\r
- * @return DOCUMENT ME!\r
- */\r
- public int getIndex(int y)\r
- {\r
- int y1 = 0;\r
- int starty = getStartSeq();\r
- int endy = getEndSeq();\r
-\r
- for (int i = starty; i <= endy; i++)\r
- {\r
- if ((i < alignment.getHeight()) &&\r
- (alignment.getSequenceAt(i) != null))\r
- {\r
- int y2 = y1 + getCharHeight();\r
-\r
- if ((y >= y1) && (y <= y2))\r
- {\r
- return i;\r
- }\r
-\r
- y1 = y2;\r
- }\r
- else\r
- {\r
- return -1;\r
- }\r
- }\r
-\r
- return -1;\r
- }\r
\r
/**\r
* DOCUMENT ME!\r
*\r
* @return DOCUMENT ME!\r
*/\r
- public boolean getShowFullId()\r
+ public boolean getShowJVSuffix()\r
{\r
- return showFullId;\r
+ return showJVSuffix;\r
}\r
\r
/**\r
*\r
* @param b DOCUMENT ME!\r
*/\r
- public void setShowFullId(boolean b)\r
+ public void setShowJVSuffix(boolean b)\r
{\r
- showFullId = b;\r
+ showJVSuffix = b;\r
}\r
\r
+\r
/**\r
* DOCUMENT ME!\r
*\r
{\r
globalColourScheme.setThreshold(globalColourScheme.getThreshold(), ignoreGapsInConsensusCalculation);\r
}\r
-\r
}\r
\r
public boolean getIgnoreGapsConsensus()\r
{\r
return ignoreGapsInConsensusCalculation;\r
}\r
+\r
+ public void setDataset(boolean b)\r
+ {\r
+ isDataset = b;\r
+ }\r
+\r
+ public boolean isDataset()\r
+ {\r
+ return isDataset;\r
+ }\r
+\r
+\r
+ public void hideSelectedColumns()\r
+ {\r
+ if (colSel.size() < 1)\r
+ return;\r
+\r
+ colSel.hideSelectedColumns();\r
+ setSelectionGroup(null);\r
+\r
+ hasHiddenColumns = true;\r
+ }\r
+\r
+\r
+ public void hideColumns(int start, int end)\r
+ {\r
+ if(start==end)\r
+ colSel.hideColumns(start);\r
+ else\r
+ colSel.hideColumns(start, end);\r
+\r
+ hasHiddenColumns = true;\r
+ }\r
+\r
+ public void hideAllSelectedSeqs()\r
+ {\r
+ if (selectionGroup == null)\r
+ return;\r
+\r
+ SequenceI[] seqs = selectionGroup.getSequencesInOrder(alignment);\r
+\r
+ for (int i = 0; i < seqs.length; i++)\r
+ {\r
+ alignment.getHiddenSequences().hideSequence(seqs[i]);\r
+ }\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ hasHiddenRows = true;\r
+ setSelectionGroup(null);\r
+ }\r
+\r
+ public void hideSequence(SequenceI seq)\r
+ {\r
+ if(seq!=null)\r
+ {\r
+ alignment.getHiddenSequences().hideSequence(seq);\r
+ hasHiddenRows = true;\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ }\r
+ }\r
+\r
+ public void showSequence(int index)\r
+ {\r
+ Vector tmp = alignment.getHiddenSequences().showSequence(index);\r
+ if(tmp.size()>0)\r
+ {\r
+ if(selectionGroup==null)\r
+ {\r
+ selectionGroup = new SequenceGroup();\r
+ selectionGroup.setEndRes(alignment.getWidth()-1);\r
+ }\r
+\r
+ for (int t = 0; t < tmp.size(); t++)\r
+ {\r
+ selectionGroup.addSequence(\r
+ (SequenceI) tmp.elementAt(t), false\r
+ );\r
+ }\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ }\r
+\r
+ if(alignment.getHiddenSequences().getSize()<1)\r
+ hasHiddenRows = false;\r
+ }\r
+\r
+ public void showColumn(int col)\r
+ {\r
+ colSel.revealHiddenColumns(col);\r
+ if(colSel.getHiddenColumns()==null)\r
+ hasHiddenColumns = false;\r
+ }\r
+\r
+ public void showAllHiddenColumns()\r
+ {\r
+ colSel.revealAllHiddenColumns();\r
+ hasHiddenColumns = false;\r
+ }\r
+\r
+ public void showAllHiddenSeqs()\r
+ {\r
+ if(alignment.getHiddenSequences().getSize()>0)\r
+ {\r
+ if(selectionGroup==null)\r
+ {\r
+ selectionGroup = new SequenceGroup();\r
+ selectionGroup.setEndRes(alignment.getWidth()-1);\r
+ }\r
+ Vector tmp = alignment.getHiddenSequences().showAll();\r
+ for(int t=0; t<tmp.size(); t++)\r
+ {\r
+ selectionGroup.addSequence(\r
+ (SequenceI)tmp.elementAt(t), false\r
+ );\r
+ }\r
+ firePropertyChange("alignment", null, alignment.getSequences());\r
+ hasHiddenRows = false;\r
+ }\r
+ }\r
+\r
+ public void invertColumnSelection()\r
+ {\r
+ int column;\r
+ for(int i=0; i<alignment.getWidth(); i++)\r
+ {\r
+ column = i;\r
+\r
+ if(colSel.contains(column))\r
+ colSel.removeElement(column);\r
+ else\r
+ colSel.addElement(column);\r
+\r
+ }\r
+\r
+ }\r
+\r
+ public int adjustForHiddenSeqs(int alignmentIndex)\r
+ {\r
+ return alignment.getHiddenSequences().adjustForHiddenSeqs(alignmentIndex);\r
+ }\r
+\r
+ /**\r
+ * This method returns the a new SequenceI [] with\r
+ * the selection sequence and start and end points adjusted\r
+ * @return String[]\r
+ */\r
+ public SequenceI[] getSelectionAsNewSequence()\r
+ {\r
+ SequenceI[] sequences;\r
+\r
+ if (selectionGroup == null)\r
+ sequences = alignment.getSequencesArray();\r
+ else\r
+ sequences = selectionGroup.getSelectionAsNewSequences(alignment);\r
+\r
+ return sequences;\r
+ }\r
+\r
+ /**\r
+ * This method returns the visible alignment as text, as\r
+ * seen on the GUI, ie if columns are hidden they will not\r
+ * be returned in the result.\r
+ * Use this for calculating trees, PCA, redundancy etc on views\r
+ * which contain hidden columns.\r
+ * @return String[]\r
+ */\r
+ public jalview.datamodel.CigarArray getViewAsCigars(boolean selectedRegionOnly)\r
+ {\r
+ CigarArray selection=null;\r
+ SequenceI [] seqs= null;\r
+ int i, iSize;\r
+ int start = 0, end = 0;\r
+ if(selectedRegionOnly && selectionGroup!=null)\r
+ {\r
+ iSize = selectionGroup.getSize(false);\r
+ seqs = selectionGroup.getSequencesInOrder(alignment);\r
+ start = selectionGroup.getStartRes();\r
+ end = selectionGroup.getEndRes(); // inclusive for start and end in SeqCigar constructor\r
+ }\r
+ else\r
+ {\r
+ iSize = alignment.getHeight();\r
+ seqs = alignment.getSequencesArray();\r
+ end = alignment.getWidth()-1;\r
+ }\r
+ SeqCigar[] selseqs = new SeqCigar[iSize];\r
+ for(i=0; i<iSize; i++)\r
+ {\r
+ selseqs[i] = new SeqCigar(seqs[i], start, end);\r
+ }\r
+ selection=new CigarArray(selseqs);\r
+ // now construct the CigarArray operations\r
+ if (hasHiddenColumns) {\r
+ Vector regions = colSel.getHiddenColumns();\r
+ int [] region;\r
+ int hideStart, hideEnd;\r
+ int last=start;\r
+ for (int j = 0; last<end & j < regions.size(); j++)\r
+ {\r
+ region = (int[]) regions.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+ // edit hidden regions to selection range\r
+ if(hideStart<last) {\r
+ if (hideEnd > last)\r
+ {\r
+ hideStart = last;\r
+ } else\r
+ continue;\r
+ }\r
+\r
+ if (hideStart>end)\r
+ break;\r
+\r
+ if (hideEnd>end)\r
+ hideEnd=end;\r
+\r
+ if (hideStart>hideEnd)\r
+ break;\r
+ /**\r
+ * form operations...\r
+ */\r
+ if (last<hideStart)\r
+ selection.addOperation(CigarArray.M, hideStart-last);\r
+ selection.addOperation(CigarArray.D, 1+hideEnd-hideStart);\r
+ last = hideEnd+1;\r
+ }\r
+ // Final match if necessary.\r
+ if (last<end)\r
+ selection.addOperation(CigarArray.M, end-last);\r
+ } else {\r
+ selection.addOperation(CigarArray.M, end-start);\r
+ }\r
+ return selection;\r
+ }\r
+ /**\r
+ * return a compact representation of the current alignment selection to\r
+ * pass to an analysis function\r
+ * @param selectedOnly boolean true to just return the selected view\r
+ * @return AlignmentView\r
+ */\r
+ jalview.datamodel.AlignmentView getAlignmentView(boolean selectedOnly) {\r
+ // JBPNote:\r
+ // this is here because the AlignmentView constructor modifies the CigarArray\r
+ // object. Refactoring of Cigar and alignment view representation should\r
+ // be done to remove redundancy.\r
+ CigarArray aligview = getViewAsCigars(selectedOnly);\r
+ if (aligview!=null)\r
+ return new AlignmentView(aligview);\r
+ return null;\r
+ }\r
+ /**\r
+ * This method returns the visible alignment as text, as\r
+ * seen on the GUI, ie if columns are hidden they will not\r
+ * be returned in the result.\r
+ * Use this for calculating trees, PCA, redundancy etc on views\r
+ * which contain hidden columns.\r
+ * @return String[]\r
+ */\r
+ public String [] getViewAsString(boolean selectedRegionOnly)\r
+ {\r
+ String [] selection = null;\r
+ SequenceI [] seqs= null;\r
+ int i, iSize;\r
+ int start = 0, end = 0;\r
+ if(selectedRegionOnly && selectionGroup!=null)\r
+ {\r
+ iSize = selectionGroup.getSize(false);\r
+ seqs = selectionGroup.getSequencesInOrder(alignment);\r
+ start = selectionGroup.getStartRes();\r
+ end = selectionGroup.getEndRes()+1;\r
+ }\r
+ else\r
+ {\r
+ iSize = alignment.getHeight();\r
+ seqs = alignment.getSequencesArray();\r
+ end = alignment.getWidth();\r
+ }\r
+\r
+ selection = new String[iSize];\r
+\r
+\r
+ for(i=0; i<iSize; i++)\r
+ {\r
+ if (hasHiddenColumns)\r
+ {\r
+ StringBuffer visibleSeq = new StringBuffer();\r
+ Vector regions = colSel.getHiddenColumns();\r
+\r
+ int blockStart = start, blockEnd=end;\r
+ int [] region;\r
+ int hideStart, hideEnd;\r
+\r
+ for (int j = 0; j < regions.size(); j++)\r
+ {\r
+ region = (int[]) regions.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+\r
+ if(hideStart < start)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ blockStart = Math.min(blockStart, hideEnd+1);\r
+ blockEnd = Math.min(blockEnd, hideStart);\r
+\r
+ if(blockStart>blockEnd)\r
+ {\r
+ break;\r
+ }\r
+\r
+\r
+ visibleSeq.append(seqs[i].getSequence(blockStart, blockEnd));\r
+\r
+ blockStart = hideEnd+1;\r
+ blockEnd = end;\r
+ }\r
+\r
+ if(end>blockStart)\r
+ visibleSeq.append(seqs[i].getSequence(blockStart, end));\r
+\r
+ selection[i] = visibleSeq.toString();\r
+ }\r
+ else\r
+ {\r
+ selection[i] = seqs[i].getSequence(start, end);\r
+ }\r
+ }\r
+\r
+ return selection;\r
+ }\r
+\r
+ public boolean getShowHiddenMarkers()\r
+ {\r
+ return showHiddenMarkers;\r
+ }\r
+\r
+ public void setShowHiddenMarkers(boolean show)\r
+ {\r
+ showHiddenMarkers = show;\r
+ }\r
}\r