<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="lib" path="/Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/lib/plugin.jar"/>
<classpathentry kind="lib" path="lib/activation.jar"/>
<classpathentry kind="lib" path="lib/axis.jar" sourcepath="D:/axis-1_2RC2-src/axis-1_2RC2"/>
<classpathentry kind="lib" path="lib/commons-discovery.jar"/>
<classpathentry kind="lib" path="lib/commons-codec-1.3.jar"/>
<classpathentry kind="lib" path="lib/Jmol-12.2.4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin.jar"/>
- <classpathentry kind="lib" path="appletlib/JmolApplet-12.2.4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="classes"/>
</classpath>
make an EPS file.</li>
</ul>
</p>
+<p><em>Automatically set ID width</em><br>
+When enabled, the column containing sequence and annotation labels at the left hand side of an exported figure will be made large enough to display each sequence ID and annotation label in its own line. Enable this if you have particularly long sequence IDs and need to generate EPS or PNG figures or web pages.</p>
+<p><em>Figure ID column width</em><br>
+Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if <em>"Automatically set ID width"</em> is set.
+</p>
<p><em>Sequence//Start-End Numbering</em><br>
The output tab also has a group of checkboxes for each file format. If
these are ticked, then Jalview will write files with the start and end
\r
String jalviewServletURL;\r
\r
- TCoffeeScoreFile tcoffeeScoreFile;\r
\r
public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded)\r
{\r
changeColour(new Blosum62ColourScheme());\r
}\r
else if (source == tcoffeeColour) {\r
- changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+ changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
}\r
else if (source == annotationColour)\r
{\r
\r
TCoffeeScoreFile file = TCoffeeScoreFile.load( new InputStreamReader( url.openStream() ) );\r
if( file == null ) {\r
+ // TODO: raise a dialog box here rather than bomb out.\r
+ \r
throw new RuntimeException("The file provided does not match the T-Coffee scores file format");\r
}\r
\r
*/\r
AlignmentI aln; \r
if( (aln=viewport.alignment) != null && (aln.getHeight() != file.getHeight() || aln.getWidth() != file.getWidth()) ) {\r
- throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+ // TODO: raise a dialog box here rather than bomb out.\r
+ throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+ \r
}\r
\r
- tcoffeeColour.setEnabled(true);\r
- tcoffeeScoreFile = file;\r
- \r
- // switch to this color\r
- changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+ // TODO add parameter to indicate if matching should be done\r
+ if (file.annotateAlignment(alignPanel.getAlignment(), false))\r
+ {\r
+ tcoffeeColour.setEnabled(true);\r
+ // switch to this color\r
+ changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
+ }\r
}\r
\r
\r
ColourSchemeI cs = globalColourScheme;
if (cs != null)
{
+ cs.alignmentChanged(alignment);
if (cs instanceof ClustalxColourScheme)
{
((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
{
if (cs != null)
{
- resBoxColour = cs.findColour(seq.getCharAt(i), i, seq.getIndex());
+ resBoxColour = cs.findColour(seq.getCharAt(i), i, seq);
}
else if (forOverview
&& !jalview.util.Comparison.isGap(seq.getCharAt(i)))
{
try
{
- col = oldColourScheme.findColour(aa.charAt(0), -1, -1);
+ col = oldColourScheme.findColour(aa.charAt(0), -1, null);
} catch (Exception ex)
{
}
* <li>ANNOTATIONCOLOUR_MAX (red) Shade used for maximum value of annotation when shading by annotation</li>
* <li>www.jalview.org (http://www.jalview.org) a property enabling all HTTP requests to be redirected to a mirror of http://www.jalview.org</li>
*
+ * <li>FIGURE_AUTOIDWIDTH (false) Expand the left hand column of an exported alignment figure to accommodate even the longest sequence ID or annotation label.</li>
+ * <li>FIGURE_FIXEDIDWIDTH Specifies the width to use for the left-hand column when exporting an alignment as a figure (setting FIGURE_AUTOIDWIDTH to true will override this).</li>
* <li></li>
*
* </ul>
}
return null;
}
+
+ /**
+ * get and parse a property as an integer. send any parsing problems to System.err
+ * @param property
+ * @return null or Integer
+ */
+ public static Integer getIntegerProperty(String property)
+ {
+ String val=getProperty(property);
+ if (val!=null && (val=val.trim()).length()>0)
+ {
+ try {
+ return Integer.valueOf(val);
+ } catch (NumberFormatException x)
+ {
+ System.err.println("Invalid integer in property '"+property+"' (value was '"+val+"')");
+ }
+ }
+ return null;
+ }
}
annotations = temp;
}
+ @Override
/**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * returns all annotation on the alignment
*/
public AlignmentAnnotation[] getAlignmentAnnotation()
{
/**
* Data structure to hold and manipulate a multiple sequence alignment
*/
-public interface AlignmentI
+public interface AlignmentI extends AnnotatedCollectionI
{
/**
* Calculates the number of sequences in an alignment
--- /dev/null
+package jalview.datamodel;
+
+import java.util.List;
+
+public interface AnnotatedCollectionI
+{
+
+ /**
+ * TODO: decide if null is a valid response if there is no annotation on the object
+ * @return null
+ */
+ AlignmentAnnotation[] getAlignmentAnnotation();
+
+}
* @author $author$
* @version $Revision$
*/
-public class SequenceGroup
+public class SequenceGroup implements AnnotatedCollectionI
{
String groupName;
{
return;
}
-
+ if (cs!=null)
+ {
+ cs.alignmentChanged(this);
+ }
try
{
Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes,
{
return showConsensusHistogram;
}
+
+ @Override
+ /**
+ * returns a new array with all annotation involving this group
+ */
+ public AlignmentAnnotation[] getAlignmentAnnotation()
+ {
+ // TODO add in other methods like 'getAlignmentAnnotation(String label), etc'
+ ArrayList<AlignmentAnnotation> annot = new ArrayList<AlignmentAnnotation>();
+ for (SequenceI seq:(Vector<SequenceI>)sequences)
+ {
+ for (AlignmentAnnotation al: seq.getAnnotation())
+ {
+ if (al.groupRef==this)
+ {
+ annot.add(al);
+ }
+ }
+ }
+ if (consensus!=null)
+ {
+ annot.add(consensus);
+ }
+ if (conservation!=null)
+ {
+ annot.add(conservation);
+ }
+ return annot.toArray(new AlignmentAnnotation[0]);
+ }
}
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)\r
{\r
StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);\r
-\r
+ // RACE CONDITION - getMapping only returns Jmol loaded filenames once Jmol callback has completed. \r
if (mapping == null || mapping.length < 1)\r
continue;\r
\r
String mset[] = new String[viewer.getModelCount()];\r
_modelFileNameMap = new int[mset.length];\r
int j = 1;\r
- mset[0] = viewer.getModelFileName(0);\r
+ String m=viewer.getModelFileName(0);\r
+ if (m!=null)\r
+ {\r
+ mset[0] = new File(m).getAbsolutePath();\r
+ }\r
for (int i = 1; i < mset.length; i++)\r
{\r
- mset[j] = viewer.getModelFileName(i);\r
+ m=viewer.getModelFileName(i);\r
+ if (m!=null) {\r
+ mset[j] = new File(m).getAbsolutePath();\r
+ }\r
_modelFileNameMap[j] = i; // record the model index for the filename\r
// skip any additional models in the same file (NMR structures)\r
if ((mset[j] == null ? mset[j] != mset[j - 1]\r
try\r
{\r
// recover PDB filename for the model hovered over.\r
- pdbfilename = viewer\r
- .getModelFileName(new Integer(mdlId).intValue() - 1);\r
+ int _mp=_modelFileNameMap.length-1,\r
+ mnumber=new Integer(mdlId).intValue() - 1;\r
+ while(mnumber<_modelFileNameMap[_mp])\r
+ {\r
+ _mp--;\r
+ }\r
+ pdbfilename = modelFileNames[_mp];\r
+ if (pdbfilename==null) {pdbfilename=new File(viewer\r
+ .getModelFileName(mnumber)).getAbsolutePath();\r
+ }\r
+ \r
} catch (Exception e)\r
{\r
}\r
}\r
else\r
{\r
- if (matches = pdbentry[pe].getFile().equals(fileName))\r
+ File fl;\r
+ if (matches = (fl=new File(pdbentry[pe].getFile())).equals(new File(fileName)))\r
{\r
foundEntry = true;\r
// TODO: Jmol can in principle retrieve from CLASSLOADER but\r
String protocol = AppletFormatAdapter.URL;\r
try\r
{\r
- File fl = new java.io.File(pdbentry[pe].getFile());\r
if (fl.exists())\r
{\r
protocol = AppletFormatAdapter.FILE;\r
} catch (Error e)\r
{\r
}\r
- ;\r
+ //Explicitly map to the filename used by Jmol ;\r
pdb = ssm.setMapping(sequence[pe], chains[pe],\r
- pdbentry[pe].getFile(), protocol);\r
+ fileName, protocol);\r
+ //pdbentry[pe].getFile(), protocol);\r
\r
}\r
}\r
{\r
String chid = new String(pdb.id + ":"\r
+ ((MCview.PDBChain) pdb.chains.elementAt(i)).id);\r
- chainFile.put(chid, pdbentry[pe].getFile());\r
+ chainFile.put(chid, fileName);\r
chainNames.addElement(chid);\r
}\r
notifyLoaded = true;\r
Vector alignPanels = new Vector();
- TCoffeeScoreFile tcoffeeScoreFile;
-
/**
* Last format used to load or save alignments in this window
*/
{
TCoffeeScoreFile result = TCoffeeScoreFile.load(new File(sFilePath));
if( result == null ) {
+ // TODO: raise a dialog box here rather than bomb out.
+
throw new RuntimeException("The file provided does not match the T-Coffee scores file format");
}
*/
AlignmentI aln;
if( (aln=viewport.alignment) != null && (aln.getHeight() != result.getHeight() || aln.getWidth() != result.getWidth()) ) {
- throw new RuntimeException("The scores matrix does not match the alignment dimensions");
+ // TODO: raise a dialog box here rather than bomb out.
+ throw new RuntimeException("The scores matrix does not match the alignment dimensions");
}
-
- changeColour( new TCoffeeColourScheme(result) );
- tcoffeeScoreFile = result;
- tcoffeeColour.setEnabled(true);
- tcoffeeColour.setSelected(true);
-
+ if (result.annotateAlignment(alignPanel.getAlignment(), true))
+ {
+ tcoffeeColour.setEnabled(true);
+ tcoffeeColour.setSelected(true);
+ // switch to this color
+ changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
+ } else {
+ tcoffeeColour.setEnabled(false);
+ tcoffeeColour.setSelected(false);
+ }
}
catch (Exception ex) {
JOptionPane.showMessageDialog(
@Override
protected void tcoffeeColorScheme_actionPerformed(ActionEvent e) {
- if( tcoffeeScoreFile != null ) {
- changeColour( new TCoffeeColourScheme(tcoffeeScoreFile) );
- }
+ changeColour( new TCoffeeColourScheme(alignPanel.getAlignment()) );
}
// /**
ColourSchemeI cs = globalColourScheme;
if (cs != null)
{
+ cs.alignmentChanged(alignment);
if (cs instanceof ClustalxColourScheme)
{
((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
*/
public Dimension calculateIdWidth()
{
+ // calculate sensible default width when no preference is available
+
+ int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
+ int maxwidth = Math.max(20,
+ Math.min(afwidth - 200, (int) 2 * afwidth / 3));
+ return calculateIdWidth(maxwidth);
+ }
+ /**
+ * Calculate the width of the alignment labels based on the displayed names
+ * and any bounds on label width set in preferences.
+ * @param maxwidth -1 or maximum width allowed for IdWidth
+ * @return Dimension giving the maximum width of the alignment label panel
+ * that should be used.
+ */
+ public Dimension calculateIdWidth(int maxwidth)
+ {
Container c = new Container();
FontMetrics fm = c.getFontMetrics(new Font(av.font.getName(),
Font.ITALIC, av.font.getSize()));
AlignmentI al = av.getAlignment();
- int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
- int maxwidth = Math.max(20,
- Math.min(afwidth - 200, (int) 2 * afwidth / 3));
int i = 0;
int idWidth = 0;
String id;
}
}
- return new Dimension(Math.min(maxwidth, idWidth), 12);
+ return new Dimension(maxwidth<0 ? idWidth : Math.min(maxwidth, idWidth), 12);
}
/**
public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi)
throws PrinterException
{
- int idWidth = getVisibleIdWidth();
+ int idWidth = getVisibleIdWidth(false);
FontMetrics fm = getFontMetrics(av.getFont());
int scaleHeight = av.charHeight + fm.getDescent();
int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap
+ annotationHeight;
- int idWidth = getVisibleIdWidth();
+ int idWidth = getVisibleIdWidth(false);
int maxwidth = av.alignment.getWidth();
if (av.hasHiddenColumns)
return Printable.NO_SUCH_PAGE;
}
}
-
+ /**
+ * get current sequence ID panel width, or nominal value if panel were to be displayed using default settings
+ * @return
+ */
int getVisibleIdWidth()
{
- return idPanel.getWidth() > 0 ? idPanel.getWidth()
- : calculateIdWidth().width + 4;
+ return getVisibleIdWidth(true);
+ }
+
+ /**
+ * get current sequence ID panel width, or nominal value if panel were to be displayed using default settings
+ * @param onscreen indicate if the Id width for onscreen or offscreen display should be returned
+ * @return
+ */
+ int getVisibleIdWidth(boolean onscreen)
+ {
+ // see if rendering offscreen - check preferences and calc width accordingly
+ if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
+ {
+ return calculateIdWidth(-1).width+4;
+ }
+ Integer idwidth=null;
+ if (onscreen || (idwidth=Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH"))==null) {
+ return (idPanel.getWidth() > 0 ? idPanel.getWidth()
+ : calculateIdWidth().width + 4);
+ }
+ return idwidth.intValue()+4;
}
void makeAlignmentImage(int type, File file)
int height = ((av.alignment.getHeight() + 1) * av.charHeight)
+ scalePanel.getHeight();
- int width = getVisibleIdWidth() + (maxwidth * av.charWidth);
+ int width = getVisibleIdWidth(false) + (maxwidth * av.charWidth);
if (av.getWrapAlignment())
{
if (System.getProperty("java.awt.headless") != null
&& System.getProperty("java.awt.headless").equals("true"))
{
- // TODO: JAL-244
+ // need to obtain default alignment width and then add in any additional allowance for id margin
+ // this duplicates the calculation in getWrappedHeight but adjusts for offscreen idWith
width = alignFrame.getWidth() - vscroll.getPreferredSize().width
- alignFrame.getInsets().left
- - alignFrame.getInsets().right;
+ - alignFrame.getInsets().right
+ - getVisibleIdWidth()+getVisibleIdWidth(false);
}
else
{
- width = seqPanel.getWidth() + getVisibleIdWidth();
+ width = seqPanel.getWidth() + getVisibleIdWidth(false);
}
}
{
// /////ONLY WORKS WITH NONE WRAPPED ALIGNMENTS
// ////////////////////////////////////////////
- int idWidth = getVisibleIdWidth();
+ int idWidth = getVisibleIdWidth(false);
FontMetrics fm = getFontMetrics(av.getFont());
int scaleHeight = av.charHeight + fm.getDescent();
import jalview.datamodel.PDBEntry;
import jalview.io.*;
import jalview.schemes.*;
+import jalview.util.Platform;
public class AppJmol extends GStructureViewer implements Runnable,
SequenceStructureBinding, ViewSetProvider
openNewJmol(ap, new PDBEntry[] { pdbentry }, new SequenceI[][] { seq });
}
private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys, SequenceI[][] seqs) {
- boolean promptUser=pdbentrys.length==1;
progressBar = ap.alignFrame;
jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(), pdbentrys, seqs, null, null);
addAlignmentPanel(ap);
setSize(400, 400); // probably should be a configurable/dynamic default here
initMenus();
worker=null;
- String filelist="";
-// for (PDBEntry pe: pdbentrys)
-// {
-// if (pe.getFile()==null)
{
addingStructures = false;
worker = new Thread(this);
worker.start();
-// break;
}
-// filelist+=" \""+pe.getFile()+"\"";
-
-/* }
- if (worker==null)
- {
- initJmol("load"+(pdbentrys.length>1 ? " APPEND" : "") + filelist);
- }
-*/
this.addInternalFrameListener(new InternalFrameAdapter()
{
public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
{
// just transfer the file name from the first sequence's first
// PDBEntry
- jmb.pdbentry[pi].setFile(file = ((PDBEntry) pdbseq
- .getSequenceAt(0).getPDBId().elementAt(0)).getFile());
- files.append(" \"" + file + "\"");
+ file = new File(((PDBEntry) pdbseq
+ .getSequenceAt(0).getPDBId().elementAt(0)).getFile()).getAbsolutePath();
+ jmb.pdbentry[pi].setFile(file);
+
+ files.append(" \"" + Platform.escapeString(file) + "\"");
}
else
{
}
if (file != null)
{
- files.append(" \"" + file + "\"");
+ files.append(" \"" + Platform.escapeString(file) + "\"");
}
}
}
public void dragFrame(JComponent f, int newX, int newY)
{
+ if (newY<0)
+ {
+ newY=0;
+ }
delegate.dragFrame(f, newX, newY);
}
public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
int newHeight)
{
+ Rectangle b=desktop.getBounds();
+ if (newY<0)
+ {
+ newY=0;
+ }
delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
}
//sp.getViewport().setView(desktop);
//getContentPane().add(sp, BorderLayout.CENTER);
getContentPane().add(desktop, BorderLayout.CENTER);
- desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+ desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+
// This line prevents Windows Look&Feel resizing all new windows to maximum
// if previous window was maximised
desktop.setDesktopManager(new MyDesktopManager(
new DefaultDesktopManager()));
+
Rectangle dims = getLastKnownDimensions("");
if (dims != null)
{
}
});
- this.addMouseListener(new MouseAdapter()
+ MouseAdapter ma;
+ this.addMouseListener(ma=new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
}
}
});
+ desktop.addMouseListener(ma);
+
this.addFocusListener(new FocusListener()
{
}
}
}
-
}
/**
import jalview.schemabinding.version2.*;
import jalview.schemes.*;
import jalview.structure.StructureSelectionManager;
+import jalview.util.Platform;
import jalview.util.jarInputStreamProvider;
/**
for (int smap = 0; smap < jmol.jmb.sequence[peid].length; smap++)
{
- if (jal.findIndex(jmol.jmb.sequence[peid][smap]) > -1)
+// if (jal.findIndex(jmol.jmb.sequence[peid][smap]) > -1)
+ if (jds==jmol.jmb.sequence[peid][smap])
{
StructureState state = new StructureState();
state.setVisible(true);
}
;
out.close();
-
- alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
- return outFile.getAbsolutePath();
+ String t=outFile.getAbsolutePath();
+ alreadyLoadedPDB.put(pdbId, t);
+ return t;
}
else
{
}
if (ids[p].getFile() != null)
{
+ File mapkey=new File(ids[p].getFile());
Object[] seqstrmaps = (Object[]) ((Hashtable) jmoldat[2])
- .get(ids[p].getFile());
+ .get(mapkey);
if (seqstrmaps == null)
{
((Hashtable) jmoldat[2]).put(
- new File(ids[p].getFile()).toString(),
+ mapkey,
seqstrmaps = new Object[]
{ pdbFile, ids[p].getId(), new Vector(),
new Vector() });
Object[] svattrib = entry.getValue();
int[] geom = (int[]) svattrib[0];
String state = (String) svattrib[1];
- Hashtable<String, Object[]> oldFiles = (Hashtable<String, Object[]>) svattrib[2];
+ Hashtable<File, Object[]> oldFiles = (Hashtable<File, Object[]>) svattrib[2];
final boolean useinJmolsuperpos = ((boolean[]) svattrib[3])[0], usetoColourbyseq = ((boolean[]) svattrib[3])[1], jmolColouring = ((boolean[]) svattrib[3])[2];
int x = geom[0], y = geom[1], width = geom[2], height = geom[3];
// collate the pdbfile -> sequence mappings from this view
{
newFileLoc = new StringBuffer();
}
+ do {
+ // look for next filename in load statement
newFileLoc.append(state.substring(cp,
ncp = (state.indexOf("\"", ncp + 1) + 1)));
String oldfilenam = state.substring(ncp,
// recover the new mapping data for this old filename
// have to normalize filename - since Jmol and jalview do filename
// translation differently.
- Object[] filedat = oldFiles.get(new File(oldfilenam)
- .toString());
- newFileLoc.append(((String) filedat[0]));
+ Object[] filedat = oldFiles.get(new File(oldfilenam));
+ newFileLoc.append(Platform.escapeString((String) filedat[0]));
pdbfilenames.addElement((String) filedat[0]);
pdbids.addElement((String) filedat[1]);
seqmaps.addElement((SequenceI[]) ((Vector<SequenceI>) filedat[2])
newFileLoc.append("\"");
cp = ecp + 1; // advance beyond last \" and set cursor so we can
// look for next file statement.
+ } while ((ncp=state.indexOf("/*file*/",cp))>-1);
}
if (cp > 0)
{
.print("Ignoring incomplete Jmol state for PDB ids: ");
newFileLoc = new StringBuffer(state);
newFileLoc.append("; load append ");
- for (String id : oldFiles.keySet())
+ for (File id : oldFiles.keySet())
{
// add this and any other pdb files that should be present in
// the viewer
// add mapping for sequences in this view to an already open Jmol
// instance
- for (String id : oldFiles.keySet())
+ for (File id : oldFiles.keySet())
{
// add this and any other pdb files that should be present in the
// viewer
epsRendering.addItem("Text");
epsRendering.setSelectedItem(Cache.getDefault("EPS_RENDERING",
"Prompt each time"));
-
+ autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
+ userIdWidth.setEnabled(autoIdWidth.isSelected());
+ userIdWidthlabel.setEnabled(autoIdWidth.isSelected());
+ Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
+ userIdWidth.setText(wi == null ? "" : wi.toString());
blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
Boolean.toString(modellerOutput.isSelected()));
jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
+ Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
+ Boolean.toString(autoIdWidth.isSelected()));
+ userIdWidth_actionPerformed();
+ Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
+ userIdWidth.getText());
+
Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
Boolean.toString(autoCalculateConsCheck.isSelected()));
Cache.applicationProperties.setProperty("SORT_BY_TREE",
maxColour.repaint();
}
+ @Override
+ protected void userIdWidth_actionPerformed()
+ {
+ try
+ {
+ String val = userIdWidth.getText().trim();
+ if (val.length() > 0)
+ {
+ Integer iw = Integer.parseInt(val);
+ if (iw.intValue() < 12)
+ {
+ throw new NumberFormatException();
+ }
+ userIdWidth.setText(iw.toString());
+ }
+ } catch (NumberFormatException x)
+ {
+ JOptionPane
+ .showInternalMessageDialog(
+ Desktop.desktop,
+ "The user defined width for the\nannotation and sequence ID columns\nin exported figures must be\nat least 12 pixels wide.",
+ "Invalid ID Column width",
+ JOptionPane.WARNING_MESSAGE);
+ userIdWidth.setText("");
+ }
+ }
+
+ @Override
+ protected void autoIdWidth_actionPerformed()
+ {
+ userIdWidth.setEnabled(!autoIdWidth.isSelected());
+ userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
+ }
+
}
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
-import com.sun.tools.corba.se.idl.InvalidArgument;
-
import net.miginfocom.swing.MigLayout;
import jalview.jbgui.GRestInputParamEditDialog;
{
if (cs != null)
{
- resBoxColour = cs.findColour(seq.getCharAt(i), i, seq.getIndex());
+ resBoxColour = cs.findColour(seq.getCharAt(i), i, seq);
}
else if (forOverview
&& !jalview.util.Comparison.isGap(seq.getCharAt(i)))
{
try
{
- col = oldColourScheme.findColour(aa.charAt(0), -1, -1);
+ col = oldColourScheme.findColour(aa.charAt(0), -1, null);
} catch (Exception ex)
{
}
package jalview.io;
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
+
+import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
return items.get("cons");
}
}
-
-
+ /**
+ * TCOFFEE score colourscheme
+ */
+ static final Color[] colors = {
+ new Color( 102, 102, 255 ), // #6666FF
+ new Color( 0, 255, 0), // #00FF00
+ new Color( 102, 255, 0), // #66FF00
+ new Color( 204, 255, 0), // #CCFF00
+ new Color( 255, 255, 0), // #FFFF00
+ new Color( 255, 204, 0), // #FFCC00
+ new Color( 255, 153, 0), // #FF9900
+ new Color( 255, 102, 0), // #FF6600
+ new Color( 255, 51, 0), // #FF3300
+ new Color( 255, 34, 0) // #FF2000
+ };
+ public final static String TCOFFEE_SCORE="TCoffeeScore";
+ /**
+ * generate annotation for this TCoffee score set on the given alignment
+ * @param al alignment to annotate
+ * @param matchids if true, annotate sequences based on matching sequence names
+ * @return true if alignment annotation was modified, false otherwise.
+ */
+ public boolean annotateAlignment(AlignmentI al, boolean matchids)
+ {
+ boolean added=false;
+ int i=0;
+ SequenceIdMatcher sidmatcher = new SequenceIdMatcher(al.getSequencesArray());
+ byte[][] scoreMatrix=getScoresArray();
+ // for 2.8 - we locate any existing TCoffee annotation and remove it first before adding this.
+ for (Map.Entry<String,StringBuilder> id:scores.entrySet())
+ {
+ byte[] srow=scoreMatrix[i];
+ SequenceI s;
+ if (matchids)
+ {
+ s=sidmatcher.findIdMatch(id.getKey());
+ } else {
+ s=al.getSequenceAt(i);
+ }
+ i++;
+ if (s==null && i!=scores.size() && !id.getKey().equals("cons"))
+ {
+ System.err.println("No "+(matchids ? "match ":" sequences left ")+" for TCoffee score set : "+id.getKey());
+ continue;
+ }
+ int jSize=al.getWidth()< srow.length ? al.getWidth() : srow.length;
+ Annotation[] annotations=new Annotation[al.getWidth()];
+ for (int j=0;j<jSize;j++) {
+ byte val = srow[j];
+ annotations[j]=new Annotation(s==null ? ""+val:null,s==null ? ""+val:null,(char) val,val*1f,val >= 0 && val < colors.length ? colors[val] : Color.white);
+ }
+ AlignmentAnnotation aa=null;
+ if (s!=null)
+ {
+ // TODO - set per sequence score
+ aa=new AlignmentAnnotation(TCOFFEE_SCORE, "Score for "+id.getKey(), annotations);
+
+ aa.setSequenceRef(s);
+ aa.visible=false;
+ aa.belowAlignment=false;
+ } else {
+ aa=new AlignmentAnnotation("T-COFFEE", "TCoffee column reliability score", annotations);
+ aa.belowAlignment=true;
+ aa.visible=true;
+
+ }
+ al.addAnnotation(aa);
+ added=true;
+ }
+ return added;
+ }
+
}
JLabel epsLabel = new JLabel();
protected JComboBox epsRendering = new JComboBox();
+
+ protected JLabel userIdWidthlabel = new JLabel();
+ protected JCheckBox autoIdWidth = new JCheckBox();
+ protected JTextField userIdWidth = new JTextField();
+
JLabel jLabel1 = new JLabel();
sortByTree.setText("Sort With New Tree");
sortByTree.setToolTipText("When selected, any trees calculated or loaded onto the alignment will automatically sort the alignment.");
sortByTree.setBounds(new Rectangle(22, 136, 168, 23));
+
+ autoIdWidth.setFont(JvSwingUtils.getLabelFont());
+ autoIdWidth.setText("Automatically set ID width");
+ autoIdWidth.setToolTipText("<html>"+JvSwingUtils.wrapTooltip("Adjusts the width of the generated EPS or PNG file to ensure even the longest sequence ID or annotation label is displayed")+"</html>");
+ autoIdWidth.setBounds(new Rectangle(228, 96,188,23));
+ autoIdWidth.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ autoIdWidth_actionPerformed();
+ }
+ });
+ userIdWidthlabel.setFont(JvSwingUtils.getLabelFont());
+ userIdWidthlabel.setText("Figure ID column width");
+ userIdWidth
+ .setToolTipText("<html>"+JvSwingUtils
+ .wrapTooltip("Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if 'Automatically set ID width' is set")+"</html>");
+ userIdWidthlabel
+ .setToolTipText("<html>"+JvSwingUtils
+ .wrapTooltip("Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if 'Automatically set ID width' is set")+"</html>");
+ userIdWidthlabel.setBounds(new Rectangle(236, 120,168,23));
+ userIdWidth.setFont(JvSwingUtils.getTextAreaFont());
+ userIdWidth.setText("");
+ userIdWidth.setBounds(new Rectangle(232,144,84,23));
+ userIdWidth.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ userIdWidth_actionPerformed();
+ }
+ });
modellerOutput.setFont(JvSwingUtils.getLabelFont());
modellerOutput.setText("Use Modeller Output");
modellerOutput.setBounds(new Rectangle(228, 226, 168, 23));
+
dasPanel.setLayout(borderLayout4);
wsPanel.setLayout(borderLayout5);
wrap.setFont(JvSwingUtils.getLabelFont());
jPanel11.add(pfamjv);
jPanel11.add(pileupjv);
jPanel11.add(pirjv);
+ exportTab.add(autoIdWidth);
+ exportTab.add(userIdWidth);
+ exportTab.add(userIdWidthlabel);
exportTab.add(modellerOutput);
tabbedPane.add(calcTab, "Editing");
calcTab.add(autoCalculateConsCheck);
exportTab.add(jPanel11);
}
+ protected void autoIdWidth_actionPerformed()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ protected void userIdWidth_actionPerformed()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
protected void maxColour_actionPerformed()
{
// TODO Auto-generated method stub
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.GraphLine;
+import jalview.datamodel.SequenceI;
import java.awt.Color;
* @return DOCUMENT ME!
*/
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour = Color.white;
if (colourScheme != null)
{
- currentColour = colourScheme.findColour(c, j, sequenceIndex);
+ currentColour = colourScheme.findColour(c, j, seq);
}
else if (range != 0)
{
import jalview.analysis.AAFrequency;
import java.awt.Color;
-
+import jalview.datamodel.SequenceI;
public class Blosum62ColourScheme extends ResidueColourScheme
{
public Blosum62ColourScheme()
}
@Override
- public Color findColour(char res, int j, int sequenceIndex)
+ public Color findColour(char res, int j, SequenceI seq)
{
if ('a' <= res && res <= 'z')
{
}
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour;
import java.awt.Color;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceI;
+
public interface ColourSchemeI
{
public Color findColour(char c);
- public Color findColour(char c, int j, int sequenceIndex);
+ public Color findColour(char c, int j, SequenceI seq);
public void setConsensus(java.util.Hashtable[] h);
public void setThreshold(int ct, boolean ignoreGaps);
+ public void alignmentChanged(AnnotatedCollectionI alignment);
+
}
}
/**
- * DOCUMENT ME!
+ * Construct an instance of ColourSchemeI corresponding to the given colourscheme index
*
* @param seqs
- * DOCUMENT ME!
+ * sequences to be coloured by colourscheme
* @param width
- * DOCUMENT ME!
+ * geometry of alignment
* @param index
- * DOCUMENT ME!
+ * colourscheme number
*
- * @return DOCUMENT ME!
+ * @return null or an instance of the colourscheme configured to colour given sequence set
*/
public static ColourSchemeI getColour(java.util.Vector seqs, int width,
int index)
{
+ // TODO 3.0 2.8 refactor signature to take an alignmentI like container so colourschemes based on annotation can be initialised
ColourSchemeI cs = null;
switch (index)
*/
package jalview.schemes;
+import jalview.datamodel.SequenceI;
+
import java.awt.Color;
/**
* @return DOCUMENT ME!
*/
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour;
if ((threshold == 0) || aboveThreshold(c, j))
import jalview.analysis.AAFrequency;
import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
import java.awt.Color;
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
if ('a' <= c && c <= 'z')
{
import jalview.analysis.AAFrequency;
import jalview.analysis.Conservation;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceI;
import java.awt.Color;
import java.util.Hashtable;
}
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour;
return currentColour;
}
+ @Override public void alignmentChanged(AnnotatedCollectionI alignment) {};
/**
* Get the percentage threshold for this colour scheme
*/
package jalview.schemes;
+import jalview.datamodel.SequenceI;
+
import java.awt.Color;
/**
* @return DOCUMENT ME!
*/
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
if (threshold > 0)
{
package jalview.schemes;
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
import jalview.io.TCoffeeScoreFile;
import java.awt.Color;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.TreeMap;
/**
* Defines the color score for T-Coffee MSA
};
- byte[][] scoreMatrix = null;
-
+ IdentityHashMap<SequenceI, Color[]> seqMap;
/**
- * Initialize the color sheme based on the content of the T-Coffee score file
+ * the color scheme needs to look at the alignment to get and cache T-COFFEE scores
*
- * @param scoreFile
+ * @param alignment - annotated sequences to be searched
*/
- public TCoffeeColourScheme(TCoffeeScoreFile scoreFile) {
-
- scoreMatrix = scoreFile != null ? scoreFile.getScoresArray() : null;
-
+ public TCoffeeColourScheme(AnnotatedCollectionI alignment) {
+ alignmentChanged(alignment);
+ }
+ @Override public void alignmentChanged(AnnotatedCollectionI alignment)
+ {
+ // assume only one set of TCOFFEE scores - but could have more than one potentially.
+ ArrayList<AlignmentAnnotation> annots = new ArrayList<AlignmentAnnotation>();
+ // Search alignment to get all tcoffee annotation and pick one set of annotation to use to colour seqs.
+ seqMap = new IdentityHashMap<SequenceI, Color[]>();
+ for (AlignmentAnnotation al:alignment.getAlignmentAnnotation())
+ {
+ if (al.sequenceRef!=null && !al.belowAlignment && al.label!=null && (al.label==TCoffeeScoreFile.TCOFFEE_SCORE || al.label.equals(TCoffeeScoreFile.TCOFFEE_SCORE)))
+ {
+ annots.add(al);
+ Color[] scores=new Color[al.annotations.length];
+ int i=0;
+ for (Annotation an:al.annotations)
+ {
+ scores[i++]=(an!=null) ? an.colour : Color.white;
+ }
+ seqMap.put(al.sequenceRef, scores);
+ }
+ }
}
-
@Override
- public Color findColour(char c, int j, int sequenceIndex) {
-
- if( scoreMatrix == null ) {
- return Color.white;
- }
-
- if( sequenceIndex<0 || sequenceIndex >= scoreMatrix.length ) {
- System.out.printf("Sequence index out of range for the T-Coffee color scheme. Index: %s\n", sequenceIndex);
- return Color.white;
- }
+ public Color findColour(char c, int j, SequenceI seq) {
+ Color[] cols;
- byte[] seqScores = scoreMatrix[sequenceIndex];
- if( j < 0 || j>= seqScores.length ) {
- System.out.printf("Residue index out of range for the T-Coffee color scheme. Sequence %s - residue: %s\n", sequenceIndex, j);
- return Color.white;
- }
-
- byte val = seqScores[j];
- return val >= 0 && val < colors.length ? colors[val] : Color.white;
+ if( seqMap==null || (cols=seqMap.get(seq))==null) {
+ return Color.white;
+ }
+
+ if( j < 0 || j>= cols.length ) {
+ return Color.white;
+ }
+ return cols[j];
}
}
import java.awt.Color;
import java.util.StringTokenizer;
+import jalview.datamodel.SequenceI;
public class UserColourScheme extends ResidueColourScheme
{
}
@Override
- public Color findColour(char c, int j, int sequenceIndex)
+ public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour;
int index = ResidueProperties.aaIndex[c];
// TODO: determine nominal limits for most platforms.\r
return 2046; // this is the max length for a windows NT system.\r
}\r
+\r
+ /**\r
+ * escape a string according to the local platform's escape character\r
+ * @param file\r
+ * @return escaped file\r
+ */\r
+ public static String escapeString(String file)\r
+ {\r
+ StringBuffer f=new StringBuffer();\r
+ int p=0,lastp=0;\r
+ while ((p=file.indexOf('\\',lastp))>-1)\r
+ {\r
+ f.append(file.subSequence(lastp,p));\r
+ f.append("\\\\");\r
+ lastp=p+1;\r
+ }\r
+ f.append(file.substring(lastp));\r
+ return f.toString();\r
+ }\r
}\r
import com.stevesoft.pat.Regex;
import com.sun.org.apache.xml.internal.serialize.OutputFormat.DTD;
-import com.sun.tools.doclets.internal.toolkit.util.DocFinder.Output;
public class RestServiceDescription
{