From 152aa52bc19a393141cfc19f5852d1fbcd239f16 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 22 Sep 2010 09:59:51 +0000 Subject: [PATCH] Fix and documentation for JAL-657 --- help/html/features/seqfetch.html | 79 +++++++++++++++++---------- help/html/features/seqfetcher.gif | Bin 14914 -> 8702 bytes src/jalview/gui/SequenceFetcher.java | 98 ++++++++++++++++++++++------------ 3 files changed, 115 insertions(+), 62 deletions(-) diff --git a/help/html/features/seqfetch.html b/help/html/features/seqfetch.html index d8415c7..c4d671a 100755 --- a/help/html/features/seqfetch.html +++ b/help/html/features/seqfetch.html @@ -16,36 +16,59 @@ * * You should have received a copy of the GNU General Public License along with Jalview. If not, see . --> -Sequence Fetcher + +Sequence Fetcher +

Sequence Fetcher

-

Jalview can retrieve sequences from certain databases using either the -WSDBFetch service provided by the European Bioinformatics Institute, and, since Jalview 2.4, DAS servers capable of the sequence command (configured in DAS settings).

-The Jalview Sequence Fetcher Dialog Box -

The Sequence Fetcher dialog box can be opened via the "File" - menu on the main desktop in order to retrieve sequences as a new - alignment, or opened via the "File" menu of an existing alignment - to import additional sequences. Please note, there will be a short delay when the sequence fetcher is first opened, - whilst Jalview compiles the list of available sequence datasources from the - currently defined DAS server registry. +

Jalview can retrieve sequences from certain databases using +either the WSDBFetch service provided by the European Bioinformatics +Institute, and, since Jalview 2.4, DAS servers capable of the sequence +command (configured in DAS settings).

+The Jalview Sequence Fetcher Dialog Box +

The Sequence Fetcher dialog box can be opened via the +"File" menu on the main desktop in order to retrieve sequences +as a new alignment, or opened via the "File" menu of an +existing alignment to import additional sequences. Please note, there +will be a short delay when the sequence fetcher is first opened, whilst +Jalview compiles the list of available sequence datasources from the +currently defined DAS server registry.

+

First, select the database you want to retrieve sequences from. +Then, enter one or more accession ids (as a semi-colon separated list), +or press the "Example" button to paste the example accession +for the currently selected database into the retrieval box. Finally, +press "OK" to initiate the retrieval.

+

Fetching Individual PDB Chains
+If you are retrieving sequences from the PDB, you can retrieve specific +chains by appending a colon and the chain id to the PDB id. For example +:
+

 1GAQ:A
+
+When retrieving from DAS sequence sources, coordinate range arguments +can be passed to the server using the standard DAS sequence command +format ( +:<start>,<end> +) +

+

Retrieving parts of large sequence records
+Some sequence sources allow a range query to be appended to the sequence +ID - e.g. 'Mito:1,85779'. If you know a source understands this type of +query format, then you should untick the checkbox for 'replace commas +with semi-colons' so the range query can be passed to the server +(otherwise the query will be split up into two 'Mito:1' and '85779'). In +some cases, a source that supports range queries usually include a range +qualification in its example query. In this case, Jalview will +automatically disable the 'replace commas with semi-colons' option.
+Support for range queries was added in Jalview 2.6

+

If you use the WSDBFetch sequence fetcher services (EMBL, +Uniprot, PDB and PFAM) in work for publication, please cite:

+

Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., +Tate J., Velankar S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez +R.
+SOAP-based services provided by the European Bioinformatics Institute.
+Nucleic Acids Res. 33(1):W25-W28 (2005)
+

-

First, select the database you want to retrieve sequences from. Then, enter - one or more accession ids (as a semi-colon separated list), or press the - "Example" button to paste the example accession for the currently selected database into the retrieval box. - Finally, press "OK" to initiate the retrieval.

-

- If you are retrieving sequences from the PDB, you can retrieve - specific chains by appending a colon and the chain id to the PDB - id. For example :

 1GAQ:A

When retrieving from DAS sequence sources, - coordinate range arguments can be passed to the server using the standard DAS - sequence command format (:<start>,<end>)

-

If you use the WSDBFetch sequence fetcher services (EMBL, Uniprot, PDB and PFAM) - in work for publication, please cite:

-

Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., Tate J., Velankar - S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez R.
- SOAP-based services provided by the European Bioinformatics Institute.
- Nucleic Acids Res. 33(1):W25-W28 (2005)
-
-

diff --git a/help/html/features/seqfetcher.gif b/help/html/features/seqfetcher.gif index 809d7196f3b31b7b9858dc05dbaee915a1f8fbcc..652976fff4224a70c4dfff76ba3fc01c1c0135ba 100644 GIT binary patch literal 8702 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 AUjP6A diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index c5a9235..af8c108 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -57,8 +57,11 @@ public class SequenceFetcher extends JPanel implements Runnable private static jalview.ws.SequenceFetcher sfetch = null; private static String dasRegistry = null; - private static boolean _initingFetcher=false; - private static Thread initingThread=null; + + private static boolean _initingFetcher = false; + + private static Thread initingThread = null; + /** * Blocking method that initialises and returns the shared instance of the * SequenceFetcher client @@ -70,29 +73,39 @@ public class SequenceFetcher extends JPanel implements Runnable public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton( final IProgressIndicator guiWindow) { - if (_initingFetcher && initingThread!=null && initingThread.isAlive()) + if (_initingFetcher && initingThread != null && initingThread.isAlive()) { if (guiWindow != null) { - guiWindow.setProgressBar("Waiting for Sequence Database Fetchers to initialise", + guiWindow.setProgressBar( + "Waiting for Sequence Database Fetchers to initialise", Thread.currentThread().hashCode()); } - // initting happening on another thread - so wait around to see if it finishes. - while (_initingFetcher && initingThread!=null && initingThread.isAlive()) + // initting happening on another thread - so wait around to see if it + // finishes. + while (_initingFetcher && initingThread != null + && initingThread.isAlive()) { - try {Thread.sleep(10);} catch (Exception e){}; + try + { + Thread.sleep(10); + } catch (Exception e) + { + } + ; } if (guiWindow != null) { - guiWindow.setProgressBar("Waiting for Sequence Database Fetchers to initialise", + guiWindow.setProgressBar( + "Waiting for Sequence Database Fetchers to initialise", Thread.currentThread().hashCode()); } } if (sfetch == null || dasRegistry != DasSourceBrowser.getDasRegistryURL()) { - _initingFetcher=true; - initingThread=Thread.currentThread(); + _initingFetcher = true; + initingThread = Thread.currentThread(); /** * give a visual indication that sequence fetcher construction is occuring */ @@ -109,8 +122,8 @@ public class SequenceFetcher extends JPanel implements Runnable initingThread.hashCode()); } sfetch = sf; - _initingFetcher=false; - initingThread=null; + _initingFetcher = false; + initingThread = null; } return sfetch; } @@ -198,11 +211,11 @@ public class SequenceFetcher extends JPanel implements Runnable frame.setContentPane(this); if (new jalview.util.Platform().isAMac()) { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 240); } else { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140); + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); } } @@ -220,8 +233,12 @@ public class SequenceFetcher extends JPanel implements Runnable dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11)); jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - jLabel1 - .setText("Separate multiple accession ids with semi colon \";\""); + jLabel1.setText("Separate multiple accession ids with semi colon \";\""); + + replacePunctuation.setHorizontalAlignment(SwingConstants.CENTER); + replacePunctuation + .setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); + replacePunctuation.setText("Replace commas with semi-colons"); ok.setText("OK"); ok.addActionListener(new ActionListener() { @@ -284,10 +301,13 @@ public class SequenceFetcher extends JPanel implements Runnable { db = sfetch.getSourceProxy((String) sources.get(database .getSelectedItem())); - dbeg.setText("Example query: " + db.getTestQuery()); + String eq = db.getTestQuery(); + dbeg.setText("Example query: " + eq); + replacePunctuation.setEnabled(!(eq != null && eq.indexOf(",") > -1)); } catch (Exception ex) { dbeg.setText(""); + replacePunctuation.setEnabled(true); } jPanel2.repaint(); } @@ -295,7 +315,10 @@ public class SequenceFetcher extends JPanel implements Runnable dbeg.setText(""); jPanel2.add(database, java.awt.BorderLayout.NORTH); jPanel2.add(dbeg, java.awt.BorderLayout.CENTER); - jPanel2.add(jLabel1, java.awt.BorderLayout.SOUTH); + JPanel jPanel2a = new JPanel(new BorderLayout()); + jPanel2a.add(jLabel1, java.awt.BorderLayout.NORTH); + jPanel2a.add(replacePunctuation, java.awt.BorderLayout.SOUTH); + jPanel2.add(jPanel2a, java.awt.BorderLayout.SOUTH); // jPanel2.setPreferredSize(new Dimension()) jPanel3.add(jScrollPane1, java.awt.BorderLayout.CENTER); this.add(jPanel1, java.awt.BorderLayout.SOUTH); @@ -331,6 +354,8 @@ public class SequenceFetcher extends JPanel implements Runnable JLabel jLabel1 = new JLabel(); + JCheckBox replacePunctuation = new JCheckBox(); + JButton ok = new JButton(); JButton clear = new JButton(); @@ -393,9 +418,19 @@ public class SequenceFetcher extends JPanel implements Runnable { error += "Please select the source database\n"; } - // TODO: make this transformation optional and configurable - com.stevesoft.pat.Regex empty = new com.stevesoft.pat.Regex( - "(\\s|[,; ])+", ";"); // \\s+", ""); + // TODO: make this transformation more configurable + com.stevesoft.pat.Regex empty; + if (replacePunctuation.isEnabled() && replacePunctuation.isSelected()) + { + empty = new com.stevesoft.pat.Regex( + // replace commas and spaces with a semicolon + "(\\s|[,; ])+", ";"); + } + else + { + // just turn spaces and semicolons into single semicolons + empty = new com.stevesoft.pat.Regex("(\\s|[; ])+", ";"); + } textArea.setText(empty.replaceAll(textArea.getText())); // see if there's anthing to search with if (!new com.stevesoft.pat.Regex("[A-Za-z0-9_.]").search(textArea @@ -414,9 +449,9 @@ public class SequenceFetcher extends JPanel implements Runnable Enumeration en = new StringTokenizer(textArea.getText(), ";"); try { - guiWindow.setProgressBar("Fetching Sequences from " - + database.getSelectedItem(), Thread.currentThread() - .hashCode()); + guiWindow.setProgressBar( + "Fetching Sequences from " + database.getSelectedItem(), + Thread.currentThread().hashCode()); DbSourceProxy proxy = sfetch.getSourceProxy((String) sources .get(source)); if (proxy.getAccessionSeparator() == null) @@ -445,10 +480,8 @@ public class SequenceFetcher extends JPanel implements Runnable indres = proxy.getSequenceRecords(item); } catch (OutOfMemoryError oome) { - new OOMWarning( - "fetching " + item + " from " - + database.getSelectedItem(),oome, - this); + new OOMWarning("fetching " + item + " from " + + database.getSelectedItem(), oome, this); } if (indres != null) { @@ -484,13 +517,10 @@ public class SequenceFetcher extends JPanel implements Runnable aresult = proxy.getSequenceRecords(multiacc.toString()); } catch (OutOfMemoryError oome) { - new OOMWarning( - "fetching " + multiacc + " from " - + database.getSelectedItem(),oome, - this); + new OOMWarning("fetching " + multiacc + " from " + + database.getSelectedItem(), oome, this); } - - + } } catch (Exception e) -- 1.7.10.2