X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=3fa00f5d491c1a6583f1b56db8bde4cbfe0b5035;hb=797df64fa2a0a30773d0f48f5494d4155e5a8be3;hp=b4370b7f73f4001318e11eb4d1fb132dc727ad12;hpb=0a1d49ccc421184b23bcb45cee901f5313913aa1;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index b4370b7..3fa00f5 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -1,90 +1,267 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2006 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 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle + * + * This file is part of Jalview. + * + * Jalview 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 3 of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . */ package jalview.gui; -import javax.swing.*; +import java.io.*; +import java.util.*; + import java.awt.*; import java.awt.event.*; -import jalview.io.EBIFetchClient; + +import javax.swing.*; + import MCview.*; import jalview.datamodel.*; -import jalview.analysis.AlignSeq; +import jalview.datamodel.xdb.embl.*; import java.io.File; import jalview.io.*; -import java.util.*; +import jalview.ws.DBRefFetcher; +import jalview.ws.ebi.EBIFetchClient; +import jalview.ws.seqfetcher.ASequenceFetcher; +import jalview.ws.seqfetcher.DbSourceProxy; -public class SequenceFetcher - extends JPanel implements Runnable +import java.awt.Rectangle; +import java.awt.BorderLayout; +import java.awt.Dimension; + +public class SequenceFetcher extends JPanel implements Runnable { + // ASequenceFetcher sfetch; JInternalFrame frame; + + IProgressIndicator guiWindow; + AlignFrame alignFrame; + StringBuffer result; + final String noDbSelected = "-- Select Database --"; - public SequenceFetcher(AlignFrame af) + + Hashtable sources = new Hashtable(); + + private static jalview.ws.SequenceFetcher sfetch = null; + + private static String dasRegistry = null; + + private static boolean _initingFetcher = false; + + private static Thread initingThread = null; + + /** + * Blocking method that initialises and returns the shared instance of the + * SequenceFetcher client + * + * @param guiWindow + * - where the initialisation delay message should be shown + * @return the singleton instance of the sequence fetcher client + */ + public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton( + final IProgressIndicator guiWindow) { - alignFrame = af; - database.addItem(noDbSelected); - database.addItem("Uniprot"); - database.addItem("EMBL"); - database.addItem("EMBLCDS"); - database.addItem("PDB"); - database.addItem("PFAM"); + if (_initingFetcher && initingThread != null && initingThread.isAlive()) + { + if (guiWindow != null) + { + 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()) + { + try + { + Thread.sleep(10); + } catch (Exception e) + { + } + ; + } + if (guiWindow != null) + { + guiWindow.setProgressBar( + "Waiting for Sequence Database Fetchers to initialise", + Thread.currentThread().hashCode()); + } + } + if (sfetch == null + || dasRegistry != DasSourceBrowser.getDasRegistryURL()) + { + _initingFetcher = true; + initingThread = Thread.currentThread(); + /** + * give a visual indication that sequence fetcher construction is occuring + */ + if (guiWindow != null) + { + guiWindow.setProgressBar("Initialising Sequence Database Fetchers", + Thread.currentThread().hashCode()); + } + dasRegistry = DasSourceBrowser.getDasRegistryURL(); + jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher(); + if (guiWindow != null) + { + guiWindow.setProgressBar("Initialising Sequence Database Fetchers", + Thread.currentThread().hashCode()); + } + sfetch = sf; + _initingFetcher = false; + initingThread = null; + } + return sfetch; + } + + public SequenceFetcher(IProgressIndicator guiIndic) + { + final IProgressIndicator guiWindow = guiIndic; + final SequenceFetcher us = this; + // launch initialiser thread + Thread sf = new Thread(new Runnable() + { + + public void run() + { + if (getSequenceFetcherSingleton(guiWindow) != null) + { + us.initGui(guiWindow); + } + else + { + javax.swing.SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + JOptionPane + .showInternalMessageDialog( + Desktop.desktop, + "Could not create the sequence fetcher client. Check error logs for details.", + "Couldn't create SequenceFetcher", + JOptionPane.ERROR_MESSAGE); + } + }); + + // raise warning dialog + } + } + }); + sf.start(); + } + + /** + * called by thread spawned by constructor + * + * @param guiWindow + */ + private void initGui(IProgressIndicator guiWindow) + { + this.guiWindow = guiWindow; + if (guiWindow instanceof AlignFrame) + { + alignFrame = (AlignFrame) guiWindow; + } + database.addItem(noDbSelected); + /* + * Dynamically generated database list will need a translation function from + * internal source to externally distinct names. UNIPROT and UP_NAME are + * identical DB sources, and should be collapsed. + */ + + String dbs[] = sfetch.getOrderedSupportedSources(); + for (int i = 0; i < dbs.length; i++) + { + if (!sources.containsValue(dbs[i])) + { + String name = sfetch.getSourceProxy(dbs[i]).getDbName(); + // duplicate source names are thrown away, here. + if (!sources.containsKey(name)) + { + database.addItem(name); + } + // overwrite with latest version of the retriever for this source + sources.put(name, dbs[i]); + } + } try { jbInit(); - } - catch (Exception ex) + } catch (Exception ex) { ex.printStackTrace(); } frame = new JInternalFrame(); frame.setContentPane(this); - if (System.getProperty("os.name").startsWith("Mac")) - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140); + if (new jalview.util.Platform().isAMac()) + { + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 240); + } else - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 125); + { + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); + } } private String getFrameTitle() { - return ( (alignFrame == null) ? "New " : "Additional ") + "Sequence Fetcher"; + return ((alignFrame == null) ? "New " : "Additional ") + + "Sequence Fetcher"; } - private void jbInit() - throws Exception + private void jbInit() throws Exception { - this.setLayout(gridBagLayout1); + this.setLayout(borderLayout2); - database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); - database.setMinimumSize(new Dimension(160, 21)); - database.setPreferredSize(new Dimension(160, 21)); + database.setFont(JvSwingUtils.getLabelFont()); + dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11)); jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); - jLabel1.setText( - "Separate multiple accession ids with semi colon \";\""); + jLabel1.setHorizontalAlignment(SwingConstants.CENTER); + 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() { public void actionPerformed(ActionEvent e) { - ok_actionPerformed(e); + ok_actionPerformed(); + } + }); + clear.setText("Clear"); + clear.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + clear_actionPerformed(); + } + }); + + example.setText("Example"); + example.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + example_actionPerformed(); } }); close.setText("Close"); @@ -95,55 +272,130 @@ public class SequenceFetcher close_actionPerformed(e); } }); - textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); - textfield.addActionListener(new ActionListener() + textArea.setFont(JvSwingUtils.getLabelFont()); + textArea.setLineWrap(true); + textArea.addKeyListener(new KeyAdapter() { - public void actionPerformed(ActionEvent e) + public void keyPressed(KeyEvent e) { - ok_actionPerformed(e); + if (e.getKeyCode() == KeyEvent.VK_ENTER) + ok_actionPerformed(); } }); + jPanel3.setLayout(borderLayout1); + borderLayout1.setVgap(5); jPanel1.add(ok); + jPanel1.add(example); + jPanel1.add(clear); jPanel1.add(close); - this.add(jLabel1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0 - , GridBagConstraints.WEST, - GridBagConstraints.NONE, - new Insets(7, 4, 0, 6), 77, 6)); - this.add(jPanel1, new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0 - , GridBagConstraints.WEST, - GridBagConstraints.BOTH, - new Insets(7, -2, 7, 12), 241, -2)); - this.add(database, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0 - , GridBagConstraints.WEST, - GridBagConstraints.NONE, - new Insets(0, 4, 0, 0), 1, 0)); - this.add(textfield, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0 - , GridBagConstraints.CENTER, - GridBagConstraints.NONE, - new Insets(0, 0, 0, 6), 211, 1)); + jPanel3.add(jPanel2, java.awt.BorderLayout.CENTER); + jPanel2.setLayout(borderLayout3); + + database.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + DbSourceProxy db = null; + try + { + db = sfetch.getSourceProxy((String) sources.get(database + .getSelectedItem())); + 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(); + } + }); + dbeg.setText(""); + jPanel2.add(database, java.awt.BorderLayout.NORTH); + jPanel2.add(dbeg, java.awt.BorderLayout.CENTER); + 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); + this.add(jPanel3, java.awt.BorderLayout.CENTER); + this.add(jPanel2, java.awt.BorderLayout.NORTH); + jScrollPane1.getViewport().add(textArea); + + } + + protected void example_actionPerformed() + { + DbSourceProxy db = null; + try + { + db = sfetch.getSourceProxy((String) sources.get(database + .getSelectedItem())); + textArea.setText(db.getTestQuery()); + } catch (Exception ex) + { + } + jPanel3.repaint(); + } + + protected void clear_actionPerformed() + { + textArea.setText(""); + jPanel3.repaint(); } + JLabel dbeg = new JLabel(); + JComboBox database = new JComboBox(); + JLabel jLabel1 = new JLabel(); + + JCheckBox replacePunctuation = new JCheckBox(); + JButton ok = new JButton(); + + JButton clear = new JButton(); + + JButton example = new JButton(); + JButton close = new JButton(); + JPanel jPanel1 = new JPanel(); - JTextField textfield = new JTextField(); - GridBagLayout gridBagLayout1 = new GridBagLayout(); + + JTextArea textArea = new JTextArea(); + + JScrollPane jScrollPane1 = new JScrollPane(); + + JPanel jPanel2 = new JPanel(); + + JPanel jPanel3 = new JPanel(); + + JPanel jPanel4 = new JPanel(); + + BorderLayout borderLayout1 = new BorderLayout(); + + BorderLayout borderLayout2 = new BorderLayout(); + + BorderLayout borderLayout3 = new BorderLayout(); + public void close_actionPerformed(ActionEvent e) { try { frame.setClosed(true); + } catch (Exception ex) + { } - catch (Exception ex) - {} } - public void ok_actionPerformed(ActionEvent e) + public void ok_actionPerformed() { database.setEnabled(false); - textfield.setEnabled(false); + textArea.setEnabled(false); ok.setEnabled(false); close.setEnabled(false); @@ -154,7 +406,7 @@ public class SequenceFetcher private void resetDialog() { database.setEnabled(true); - textfield.setEnabled(true); + textArea.setEnabled(true); ok.setEnabled(true); close.setEnabled(true); } @@ -163,313 +415,407 @@ public class SequenceFetcher { String error = ""; if (database.getSelectedItem().equals(noDbSelected)) + { error += "Please select the source database\n"; - com.stevesoft.pat.Regex empty = new com.stevesoft.pat.Regex("\\s+", ""); - textfield.setText(empty.replaceAll(textfield.getText())); - if (textfield.getText().length() == 0) + } + // 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 + .getText())) + { error += "Please enter a (semi-colon separated list of) database id(s)"; + } if (error.length() > 0) { showErrorMessage(error); resetDialog(); return; } - - result = new StringBuffer(); - if (database.getSelectedItem().equals("Uniprot")) - { - getUniprotFile(textfield.getText()); - } - else if (database.getSelectedItem().equals("EMBL") - || database.getSelectedItem().equals("EMBLCDS")) + ArrayList aresultq=new ArrayList(); + ArrayList aresult = new ArrayList(); + Object source = database.getSelectedItem(); + Enumeration en = new StringTokenizer(textArea.getText(), ";"); + boolean isAliSource=false; + try { - StringTokenizer st = new StringTokenizer(textfield.getText(), ";"); - while(st.hasMoreTokens()) + guiWindow.setProgressBar( + "Fetching Sequences from " + database.getSelectedItem(), + Thread.currentThread().hashCode()); + DbSourceProxy proxy = sfetch.getSourceProxy((String) sources + .get(source)); + isAliSource = proxy.isA(DBRefSource.ALIGNMENTDB); + if (proxy.getAccessionSeparator() == null) { - EBIFetchClient dbFetch = new EBIFetchClient(); - - String[] reply = dbFetch.fetchData( - database.getSelectedItem().toString().toLowerCase( - ) + ":" + st.nextToken(), - "fasta", "raw"); -// - if (reply != null) + while (en.hasMoreElements()) { - for (int i = 0; i < reply.length; i++) - result.append(reply[i] + "\n"); - } - } - - if(result!=null && result.length()>1) // arbitrary minimum length for a seuqence file - { - System.out.println(result.toString()); - - parseResult(result.toString(), null); - } - } - else if (database.getSelectedItem().equals("PDB")) - { - StringTokenizer qset = new StringTokenizer(textfield.getText(), ";"); - String query; - SequenceI[] seqs = null; - while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null)) - { - SequenceI[] seqparts = getPDBFile(query.toUpperCase()); - if (seqparts!=null) { - if (seqs==null) { - seqs = seqparts; - } else { - SequenceI[] newseqs = new SequenceI[seqs.length+seqparts.length]; - int i=0; - for (;i0) { - if (parseResult(new Alignment(seqs), null, null)!=null) - result.append("# Successfully parsed the PDB File Queries into an Alignment"); - } - } - else if( database.getSelectedItem().equals("PFAM")) - { - try{ - result.append(new FastaFile( - "http://www.sanger.ac.uk/cgi-bin/Pfam/getalignment.pl?format=fal&acc=" - + textfield.getText().toUpperCase(), "URL").print() - ); - - if(result.length()>0) - parseResult( result.toString(), textfield.getText().toUpperCase() ); - - }catch(java.io.IOException ex) - { result = null; } - } - - if (result == null || result.length() == 0) - showErrorMessage("Error retrieving " + textfield.getText() - + " from " + database.getSelectedItem()); - - resetDialog(); - return; - } - - void getUniprotFile(String id) - { - EBIFetchClient ebi = new EBIFetchClient(); - File file = ebi.fetchDataAsFile("uniprot:" + id, "xml", null); - - DBRefFetcher dbref = new DBRefFetcher(); - Vector entries = dbref.getUniprotEntries(file); - - if (entries != null) - { - //First, make the new sequences - Enumeration en = entries.elements(); - while (en.hasMoreElements()) + else { - UniprotEntry entry = (UniprotEntry) en.nextElement(); - - StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot"); - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) + StringBuffer multiacc = new StringBuffer(); + while (en.hasMoreElements()) { - name.append("|"); - name.append(en2.nextElement()); + multiacc.append(en.nextElement()); + if (en.hasMoreElements()) + { + multiacc.append(proxy.getAccessionSeparator()); + } } - en2 = entry.getName().elements(); - while (en2.hasMoreElements()) + try { - name.append("|"); - name.append(en2.nextElement()); - } - - if (entry.getProtein() != null) + aresultq.add(multiacc.toString()); + aresult.add(proxy.getSequenceRecords(multiacc.toString())); + } catch (OutOfMemoryError oome) { - name.append(" " + entry.getProtein().getName().elementAt(0)); + new OOMWarning("fetching " + multiacc + " from " + + database.getSelectedItem(), oome, this); } - result.append(name + "\n" + entry.getUniprotSequence().getContent() + - "\n"); - } - //Then read in the features and apply them to the dataset - Alignment al = parseResult(result.toString(), null); - for (int i = 0; i < entries.size(); i++) - { - UniprotEntry entry = (UniprotEntry) entries.elementAt(i); - Enumeration e = entry.getDbReference().elements(); - Vector onlyPdbEntries = new Vector(); - while (e.hasMoreElements()) - { - PDBEntry pdb = (PDBEntry) e.nextElement(); - if (!pdb.getType().equals("PDB")) - continue; - - onlyPdbEntries.addElement(pdb); - } - - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) + } catch (Exception e) + { + showErrorMessage("Error retrieving " + textArea.getText() + " from " + + database.getSelectedItem()); + // error +="Couldn't retrieve sequences from "+database.getSelectedItem(); + System.err.println("Retrieval failed for source ='" + + database.getSelectedItem() + "' and query\n'" + + textArea.getText() + "'\n"); + e.printStackTrace(); + } catch (OutOfMemoryError e) + { + // resets dialog box - so we don't use OOMwarning here. + showErrorMessage("Out of Memory when retrieving " + + textArea.getText() + + " from " + + database.getSelectedItem() + + "\nPlease see the Jalview FAQ for instructions for increasing the memory available to Jalview.\n"); + e.printStackTrace(); + } catch (Error e) + { + showErrorMessage("Serious Error retrieving " + textArea.getText() + + " from " + database.getSelectedItem()); + e.printStackTrace(); + } + if (aresult != null && aresult.size()>0) + { + AlignmentI ar=null; + if (isAliSource) { + // new window for each result + while (aresult.size()>0) { - al.getSequenceAt(i).getDatasetSequence().addDBRef(new DBRefEntry(DBRefSource.UNIPROT, - "0", - en2.nextElement().toString())); + parseResult(aresult.remove(0), aresultq.remove(0)+" "+getDefaultRetrievalTitle(), null); } - - - - - al.getSequenceAt(i).getDatasetSequence().setPDBId(onlyPdbEntries); - if (entry.getFeature() != null) + } else { + // concatenate all results in one window + while (aresult.size()>0) { - e = entry.getFeature().elements(); - while (e.hasMoreElements()) - { - SequenceFeature sf = (SequenceFeature) e.nextElement(); - sf.setFeatureGroup("Uniprot"); - al.getSequenceAt(i).getDatasetSequence().addSequenceFeature( sf ); - } + if (ar==null) { ar = aresult.remove(0);} + else { ar.append(aresult.remove(0)); }; } - } + parseResult(ar, null, null); + } } + // only remove visual delay after we finished parsing. + guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); + resetDialog(); } - SequenceI[] getPDBFile(String id) + /* + * result = new StringBuffer(); if + * (database.getSelectedItem().equals("Uniprot")) { + * getUniprotFile(textArea.getText()); } else if + * (database.getSelectedItem().equals("EMBL") || + * database.getSelectedItem().equals("EMBLCDS")) { String DBRefSource = + * database.getSelectedItem().equals("EMBLCDS") ? + * jalview.datamodel.DBRefSource.EMBLCDS : jalview.datamodel.DBRefSource.EMBL; + * + * StringTokenizer st = new StringTokenizer(textArea.getText(), ";"); + * SequenceI[] seqs = null; while(st.hasMoreTokens()) { EBIFetchClient dbFetch + * = new EBIFetchClient(); String qry = + * database.getSelectedItem().toString().toLowerCase( ) + ":" + + * st.nextToken(); File reply = dbFetch.fetchDataAsFile( qry, "emblxml",null); + * + * jalview.datamodel.xdb.embl.EmblFile efile=null; if (reply != null && + * reply.exists()) { efile = + * jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply); } if (efile!=null) + * { for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) { EmblEntry + * entry = (EmblEntry) i.next(); SequenceI[] seqparts = + * entry.getSequences(false,true, DBRefSource); if (seqparts!=null) { + * SequenceI[] newseqs = null; int si=0; if (seqs==null) { newseqs = new + * SequenceI[seqparts.length]; } else { newseqs = new + * SequenceI[seqs.length+seqparts.length]; + * + * for (;si0) { if (parseResult(new Alignment(seqs), null, + * null)!=null) { result.append("# Successfully parsed the + * "+database.getSelectedItem()+" Queries into an Alignment"); } } } else if + * (database.getSelectedItem().equals("PDB")) { StringTokenizer qset = new + * StringTokenizer(textArea.getText(), ";"); String query; SequenceI[] seqs = + * null; while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null)) { + * SequenceI[] seqparts = getPDBFile(query.toUpperCase()); if (seqparts != + * null) { if (seqs == null) { seqs = seqparts; } else { SequenceI[] newseqs = + * new SequenceI[seqs.length+seqparts.length]; int i=0; for (; i < + * seqs.length; i++) { newseqs[i] = seqs[i]; seqs[i] = null; } for (int + * j=0;j 0) { if (parseResult(new + * Alignment(seqs), null, null)!=null) { result.append( "# Successfully parsed + * the PDB File Queries into an + * Alignment"); } } } else if( database.getSelectedItem().equals("PFAM")) { + * try { result.append(new FastaFile( + * "http://www.sanger.ac.uk/cgi-bin/Pfam/getalignment.pl?format=fal&acc=" + + * textArea.getText().toUpperCase(), "URL").print() ); + * + * if(result.length()>0) { parseResult( result.toString(), + * textArea.getText().toUpperCase() ); } } catch (java.io.IOException ex) { + * result = null; } } + * + * if (result == null || result.length() == 0) { showErrorMessage("Error + * retrieving " + textArea.getText() + " from " + database.getSelectedItem()); + * } + * + * resetDialog(); return; } + * + * void getUniprotFile(String id) { EBIFetchClient ebi = new EBIFetchClient(); + * File file = ebi.fetchDataAsFile("uniprot:" + id, "xml", null); + * + * DBRefFetcher dbref = new DBRefFetcher(); Vector entries = + * dbref.getUniprotEntries(file); + * + * if (entries != null) { //First, make the new sequences Enumeration en = + * entries.elements(); while (en.hasMoreElements()) { UniprotEntry entry = + * (UniprotEntry) en.nextElement(); + * + * StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot"); Enumeration + * en2 = entry.getAccession().elements(); while (en2.hasMoreElements()) { + * name.append("|"); name.append(en2.nextElement()); } en2 = + * entry.getName().elements(); while (en2.hasMoreElements()) { + * name.append("|"); name.append(en2.nextElement()); } + * + * if (entry.getProtein() != null) { name.append(" " + + * entry.getProtein().getName().elementAt(0)); } + * + * result.append(name + "\n" + entry.getUniprotSequence().getContent() + + * "\n"); } + * + * //Then read in the features and apply them to the dataset Alignment al = + * parseResult(result.toString(), null); for (int i = 0; i < entries.size(); + * i++) { UniprotEntry entry = (UniprotEntry) entries.elementAt(i); + * Enumeration e = entry.getDbReference().elements(); Vector onlyPdbEntries = + * new Vector(); while (e.hasMoreElements()) { PDBEntry pdb = (PDBEntry) + * e.nextElement(); if (!pdb.getType().equals("PDB")) { continue; } + * + * onlyPdbEntries.addElement(pdb); } + * + * Enumeration en2 = entry.getAccession().elements(); while + * (en2.hasMoreElements()) { + * al.getSequenceAt(i).getDatasetSequence().addDBRef(new DBRefEntry( + * DBRefSource.UNIPROT, "0", en2.nextElement().toString())); } + * + * + * + * + * al.getSequenceAt(i).getDatasetSequence().setPDBId(onlyPdbEntries); if + * (entry.getFeature() != null) { e = entry.getFeature().elements(); while + * (e.hasMoreElements()) { SequenceFeature sf = (SequenceFeature) + * e.nextElement(); sf.setFeatureGroup("Uniprot"); + * al.getSequenceAt(i).getDatasetSequence().addSequenceFeature( sf ); } } } } + * } + * + * SequenceI[] getPDBFile(String id) { Vector result = new Vector(); String + * chain = null; if (id.indexOf(":") > -1) { chain = + * id.substring(id.indexOf(":") + 1); id = id.substring(0, id.indexOf(":")); } + * + * EBIFetchClient ebi = new EBIFetchClient(); String file = + * ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw"). getAbsolutePath(); if (file + * == null) { return null; } try { PDBfile pdbfile = new PDBfile(file, + * jalview.io.AppletFormatAdapter.FILE); for (int i = 0; i < + * pdbfile.chains.size(); i++) { if (chain == null || ( (PDBChain) + * pdbfile.chains.elementAt(i)).id. toUpperCase().equals(chain)) { PDBChain + * pdbchain = (PDBChain) pdbfile.chains.elementAt(i); // Get the Chain's + * Sequence - who's dataset includes any special features added from the PDB + * file SequenceI sq = pdbchain.sequence; // Specially formatted name for the + * PDB chain sequences retrieved from the PDB + * sq.setName("PDB|"+id+"|"+sq.getName()); // Might need to add more metadata + * to the PDBEntry object // like below /* PDBEntry entry = new PDBEntry(); // + * Construct the PDBEntry entry.setId(id); if (entry.getProperty() == null) + * entry.setProperty(new Hashtable()); entry.getProperty().put("chains", + * pdbchain.id + "=" + sq.getStart() + "-" + sq.getEnd()); + * sq.getDatasetSequence().addPDBId(entry); // Add PDB DB Refs // We make a + * DBRefEtntry because we have obtained the PDB file from a verifiable source + * // JBPNote - PDB DBRefEntry should also carry the chain and mapping + * information DBRefEntry dbentry = new + * DBRefEntry(jalview.datamodel.DBRefSource.PDB, "0", id + pdbchain.id); + * sq.addDBRef(dbentry); // and add seuqence to the retrieved set + * result.addElement(sq.deriveSequence()); } } + * + * if (result.size() < 1) { throw new Exception("WsDBFetch for PDB id resulted + * in zero result size"); } } catch (Exception ex) // Problem parsing PDB file + * { jalview.bin.Cache.log.warn("Exception when retrieving " + + * textArea.getText() + " from " + database.getSelectedItem(), ex); return + * null; } + * + * + * SequenceI[] results = new SequenceI[result.size()]; for (int i = 0, j = + * result.size(); i < j; i++) { results[i] = (SequenceI) result.elementAt(i); + * result.setElementAt(null,i); } return results; } + */ + AlignmentI parseResult(String result, String title) { - Vector result = new Vector(); - String chain = null; - if (id.indexOf(":") > -1) + String format = new IdentifyFile().Identify(result, "Paste"); + Alignment sequences = null; + if (FormatAdapter.isValidFormat(format)) { - chain = id.substring(id.indexOf(":") + 1); - id = id.substring(0, id.indexOf(":")); - } + sequences = null; + try + { + sequences = new FormatAdapter().readFile(result.toString(), + "Paste", format); + } catch (Exception ex) + { + } - EBIFetchClient ebi = new EBIFetchClient(); - String file = ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw").getAbsolutePath(); - if (file == null) - return null; - try - { - PDBfile pdbfile = new PDBfile(file, jalview.io.AppletFormatAdapter.FILE); - for (int i = 0; i < pdbfile.chains.size(); i++) + if (sequences != null) { - if (chain == null || - ( (PDBChain) pdbfile.chains.elementAt(i)).id. - toUpperCase().equals(chain)) { - PDBChain pdbchain = (PDBChain) pdbfile.chains.elementAt(i); - // Get the Chain's Sequence - who's dataset includes any special features added from the PDB file - SequenceI sq = pdbchain.sequence; - // Specially formatted name for the PDB chain sequences retrieved from the PDB - sq.setName("PDB|"+id+"|"+sq.getName()); - // Might need to add more metadata to the PDBEntry object - // like below - /* - * PDBEntry entry = new PDBEntry(); - // Construct the PDBEntry - entry.setId(id); - if (entry.getProperty() == null) - entry.setProperty(new Hashtable()); - entry.getProperty().put("chains", - pdbchain.id - + "=" + sq.getStart() - + "-" + sq.getEnd()); - sq.getDatasetSequence().addPDBId(entry); - */ - // Add PDB DB Refs - // We make a DBRefEtntry because we have obtained the PDB file from a verifiable source - // JBPNote - PDB DBRefEntry should also carry the chain and mapping information - DBRefEntry dbentry = new DBRefEntry(jalview.datamodel.DBRefSource.PDB,"0",id+pdbchain.id); - sq.addDBRef(dbentry); - // and add seuqence to the retrieved set - result.addElement(sq.deriveSequence()); - } + return parseResult(sequences, title, format); } } - catch (Exception ex) // Problem parsing PDB file + else { - jalview.bin.Cache.log.warn("Exception when retrieving " + - textfield.getText() + " from " + - database.getSelectedItem(), ex); - return null; - } - SequenceI[] results = new SequenceI[result.size()]; - for (int i=0,j=result.size();i 0) + AlignmentI parseResult(AlignmentI al, String title, + String currentFileFormat) + { + + if (al != null && al.getHeight() > 0) + { + if (alignFrame == null) { - if (alignFrame == null) + AlignFrame af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + if (currentFileFormat != null) { - AlignFrame af = new AlignFrame(al, - AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); - if (currentFileFormat!=null) - af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT FORMAT FOR NON-FormatAdapter Sourced Alignments? - - if(title==null) - title = "Retrieved from " + database.getSelectedItem(); - - Desktop.addInternalFrame(af, - title, - AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); - - af.statusBar.setText("Successfully pasted alignment file"); + af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT + // FORMAT FOR + // NON-FormatAdapter Sourced + // Alignments? + } - try - { - af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); - } - catch (Exception ex) - {} + if (title == null) + { + title = getDefaultRetrievalTitle(); } - else + SequenceFeature[] sfs = null; + for (Enumeration sq = al.getSequences().elements(); sq + .hasMoreElements();) { - for (int i = 0; i < al.getHeight(); i++) + if ((sfs = ((SequenceI) sq.nextElement()).getDatasetSequence() + .getSequenceFeatures()) != null) { - alignFrame.viewport.alignment.addSequence(al.getSequenceAt(i)); // this also creates dataset sequence entries + if (sfs.length > 0) + { + af.setShowSeqFeatures(true); + break; + } } - alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment. - getHeight()); - alignFrame.viewport.alignment.getWidth(); - alignFrame.viewport.firePropertyChange("alignment", null, - alignFrame.viewport. - getAlignment().getSequences()); + + } + Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + + af.statusBar.setText("Successfully pasted alignment file"); + + try + { + af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", + false)); + } catch (Exception ex) + { } } + else + { + for (int i = 0; i < al.getHeight(); i++) + { + alignFrame.viewport.alignment.addSequence(al.getSequenceAt(i)); // this + // also + // creates + // dataset + // sequence + // entries + } + alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment + .getHeight()); + alignFrame.viewport.alignment.getWidth(); + alignFrame.viewport.firePropertyChange("alignment", null, + alignFrame.viewport.getAlignment().getSequences()); + } + } return al; } @@ -480,11 +826,9 @@ public class SequenceFetcher { public void run() { - JOptionPane.showInternalMessageDialog(Desktop.desktop, - error, "Error Retrieving Data", - JOptionPane.WARNING_MESSAGE); + JOptionPane.showInternalMessageDialog(Desktop.desktop, error, + "Error Retrieving Data", JOptionPane.WARNING_MESSAGE); } }); } } -