X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=2beb3d95dfa5d58b14bbbdf62c299c413bf68b24;hb=237972562c84b83dbd287071cdd839d97aaf7d4b;hp=aa494f531e7217fe9f4304273bb3f07187e9fa58;hpb=713db61b4724485414159cfc145f9ffa4a24bb6d;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index aa494f5..2beb3d9 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -1,6 +1,6 @@ /* * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * 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 @@ -29,7 +29,6 @@ import java.io.File; import jalview.io.*; import java.util.*; - public class SequenceFetcher extends JPanel implements Runnable { @@ -45,6 +44,7 @@ public class SequenceFetcher database.addItem("EMBL"); database.addItem("EMBLCDS"); database.addItem("PDB"); + database.addItem("PFAM"); try { @@ -57,12 +57,15 @@ public class SequenceFetcher frame = new JInternalFrame(); frame.setContentPane(this); - if(System.getProperty("os.name").startsWith("Mac")) - Desktop.addInternalFrame(frame, ((af==null) ? - "New " : "Additional ")+"Sequence Fetcher (WSDBfetch@EBI)", 400, 140); + if (System.getProperty("os.name").startsWith("Mac")) + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140); else - Desktop.addInternalFrame(frame, ((af==null) ? - "New " : "Additional ")+"Sequence Fetcher (WSDBfetch@EBI)", 400, 125); + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 125); + } + + private String getFrameTitle() + { + return ( (alignFrame == null) ? "New " : "Additional ") + "Sequence Fetcher"; } private void jbInit() @@ -84,12 +87,12 @@ public class SequenceFetcher ok_actionPerformed(e); } }); - cancel.setText("Cancel"); - cancel.addActionListener(new ActionListener() + close.setText("Close"); + close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - cancel_actionPerformed(e); + close_actionPerformed(e); } }); textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); @@ -101,7 +104,7 @@ public class SequenceFetcher } }); jPanel1.add(ok); - jPanel1.add(cancel); + jPanel1.add(close); this.add(jLabel1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, @@ -116,18 +119,18 @@ public class SequenceFetcher new Insets(0, 4, 0, 0), 1, 0)); this.add(textfield, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0 , GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, - new Insets(0, 0, 0, 6), 200, 1)); + GridBagConstraints.NONE, + new Insets(0, 0, 0, 6), 211, 1)); } JComboBox database = new JComboBox(); JLabel jLabel1 = new JLabel(); JButton ok = new JButton(); - JButton cancel = new JButton(); + JButton close = new JButton(); JPanel jPanel1 = new JPanel(); JTextField textfield = new JTextField(); GridBagLayout gridBagLayout1 = new GridBagLayout(); - public void cancel_actionPerformed(ActionEvent e) + public void close_actionPerformed(ActionEvent e) { try { @@ -139,22 +142,21 @@ public class SequenceFetcher public void ok_actionPerformed(ActionEvent e) { - frame.setTitle("Sequence Fetcher (WSDBfetch@EBI) - Fetching Sequence..."); database.setEnabled(false); textfield.setEnabled(false); ok.setEnabled(false); - cancel.setEnabled(false); + close.setEnabled(false); Thread worker = new Thread(this); worker.start(); } - private void resetDialog() { + private void resetDialog() + { database.setEnabled(true); textfield.setEnabled(true); ok.setEnabled(true); - cancel.setEnabled(true); - frame.setTitle("Sequence Fetcher (WSDBfetch@EBI)"); + close.setEnabled(true); } public void run() @@ -162,89 +164,130 @@ 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+",""); + com.stevesoft.pat.Regex empty = new com.stevesoft.pat.Regex("\\s+", ""); textfield.setText(empty.replaceAll(textfield.getText())); - if (textfield.getText().length()==0) - error+="Please enter a (semi-colon separated list of) database id(s)"; - if (error.length()>0) { + if (textfield.getText().length() == 0) + error += "Please enter a (semi-colon separated list of) database id(s)"; + if (error.length() > 0) + { showErrorMessage(error); resetDialog(); return; } - result = new StringBuffer(); + result = new StringBuffer(); if (database.getSelectedItem().equals("Uniprot")) { getUniprotFile(textfield.getText()); } else if (database.getSelectedItem().equals("EMBL") - || database.getSelectedItem().equals("EMBLCDS")) + || database.getSelectedItem().equals("EMBLCDS")) { - EBIFetchClient dbFetch = new EBIFetchClient(); - String[] reply = dbFetch.fetchData( - database.getSelectedItem().toString().toLowerCase( - ) + ":" + textfield.getText(), - "fasta", "raw"); + StringTokenizer st = new StringTokenizer(textfield.getText(), ";"); + while(st.hasMoreTokens()) + { + EBIFetchClient dbFetch = new EBIFetchClient(); + + String[] reply = dbFetch.fetchData( + database.getSelectedItem().toString().toLowerCase( + ) + ":" + st.nextToken(), + "fasta", "raw"); +// + if (reply != null) + { + for (int i = 0; i < reply.length; i++) + result.append(reply[i] + "\n"); + } + } - for (int i = 0; i < reply.length; i++) - result.append(reply[i] + "\n"); + if(result!=null) + { + System.out.println(result.toString()); - parseResult(result.toString()); + parseResult(result.toString(), null); + } } else if (database.getSelectedItem().equals("PDB")) { - result = getPDBFile(textfield.getText().toUpperCase()); - if (result!=null) - parseResult(result.toString()); + StringTokenizer qset = new StringTokenizer(textfield.getText(), ";"); + String query; + while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null)) + { + StringBuffer respart = getPDBFile(query.toUpperCase()); + if(respart!=null) + result.append(respart); + } + + + if (result.length()>0) + parseResult(result.toString(), null); } + 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()); - else - textfield.setText(""); + resetDialog(); + return; } void getUniprotFile(String id) { EBIFetchClient ebi = new EBIFetchClient(); - File file = ebi.fetchDataAsFile("uniprot:"+id,"xml", null); - SequenceFeatureFetcher sff = new SequenceFeatureFetcher(); - Vector entries = sff.getUniprotEntries(file); + File file = ebi.fetchDataAsFile("uniprot:" + id, "xml", null); - if(entries!=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" ); + + StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot"); Enumeration en2 = entry.getAccession().elements(); - while(en2.hasMoreElements()) + while (en2.hasMoreElements()) { name.append("|"); name.append(en2.nextElement()); } en2 = entry.getName().elements(); - while(en2.hasMoreElements()) + while (en2.hasMoreElements()) { name.append("|"); name.append(en2.nextElement()); } - if(entry.getProteinName()!=null) - name.append(" "+entry.getProteinName().elementAt(0)); + if (entry.getProtein() != null) + { + name.append(" " + entry.getProtein().getName().elementAt(0)); + } - result.append(name +"\n"+entry.getUniprotSequence().getContent()); + result.append(name + "\n" + entry.getUniprotSequence().getContent() + + "\n"); } //Then read in the features and apply them to the dataset - SequenceI [] sequence = parseResult(result.toString()); - for(int i=0; i -1) { - StringBuffer result = new StringBuffer(); - String chain = null; - if (id.indexOf(":") > -1) - { - chain = id.substring(id.indexOf(":") + 1); - id = id.substring(0, id.indexOf(":")); - } + chain = id.substring(id.indexOf(":") + 1); + id = id.substring(0, id.indexOf(":")); + } - EBIFetchClient ebi = new EBIFetchClient(); - String[] reply = ebi.fetchData("pdb:" + id, "pdb", "raw"); - if (reply==null) - return null; - try - { - PDBfile pdbfile = new PDBfile(reply); - for (int i = 0; i < pdbfile.chains.size(); i++) - { - if (chain == null || - ( (PDBChain) pdbfile.chains.elementAt(i)).id. - toUpperCase().equals(chain)) - result.append("\n>PDB|" + id + "|" + - ( (PDBChain) pdbfile.chains.elementAt(i)).sequence. - getName() + - "\n" - + - ( (PDBChain) pdbfile.chains.elementAt(i)).sequence. - getSequence()); - } - } - catch (Exception ex) // Problem parsing PDB file + 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++) { - jalview.bin.Cache.log.warn("Exception when retrieving " + textfield.getText() + " from " + - database.getSelectedItem(), ex); - return null; + if (chain == null || + ( (PDBChain) pdbfile.chains.elementAt(i)).id. + toUpperCase().equals(chain)) + + result.append("\n>PDB|" + id + "|" + + ( (PDBChain) pdbfile.chains.elementAt(i)).sequence. + getName() + + "\n" + + + ( (PDBChain) pdbfile.chains.elementAt(i)).sequence. + getSequence()); } - - return result; + } + catch (Exception ex) // Problem parsing PDB file + { + jalview.bin.Cache.log.warn("Exception when retrieving " + + textfield.getText() + " from " + + database.getSelectedItem(), ex); + return null; } - SequenceI[] parseResult(String result) + return result; + } + + SequenceI[] parseResult(String result, String title) + { + String format = new IdentifyFile().Identify(result, "Paste"); + SequenceI[] sequences = null; + + if (FormatAdapter.isValidFormat(format)) { - String format = IdentifyFile.Identify(result, "Paste"); - SequenceI[] sequences = null; + sequences = null; + try{ sequences = new FormatAdapter().readFile(result.toString(), "Paste", + format);} + catch(Exception ex){} - if (FormatAdapter.formats.contains(format)) + if (sequences != null && sequences.length > 0) { - sequences = new FormatAdapter().readFile(result.toString(), "Paste", format); - if (sequences != null && sequences.length>0) + if (alignFrame == null) { - if(alignFrame==null) + AlignFrame af = new AlignFrame(new Alignment(sequences), + AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT +); + af.currentFileFormat = format; + 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"); + + try { - AlignFrame af = new AlignFrame(new Alignment(sequences)); - af.currentFileFormat = format; - Desktop.addInternalFrame(af, "Retrieved from "+database.getSelectedItem(), - AlignFrame.NEW_WINDOW_WIDTH, - AlignFrame.NEW_WINDOW_HEIGHT); - af.statusBar.setText("Successfully pasted alignment file"); - try - { - af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); - } - catch (Exception ex) - {} + af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); } - else + catch (Exception ex) + {} + } + else + { + for (int i = 0; i < sequences.length; i++) { - for (int i = 0; i < sequences.length; i++) - { - alignFrame.viewport.alignment.addSequence(sequences[i]); - - //////////////////////////// - //Datset needs extension; - ///////////////////////////// - Sequence ds = new Sequence(sequences[i].getName(), - AlignSeq.extractGaps("-. ", - sequences[i].getSequence()), - sequences[i].getStart(), - sequences[i].getEnd()); - sequences[i].setDatasetSequence(ds); - alignFrame.viewport.alignment.getDataset().addSequence(ds); - } - alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment. - getHeight()); - alignFrame.viewport.alignment.getWidth(); - alignFrame.viewport.firePropertyChange("alignment", null, - alignFrame.viewport.getAlignment().getSequences()); - + alignFrame.viewport.alignment.addSequence(sequences[i]); + + //////////////////////////// + //Dataset needs extension; + ///////////////////////////// + Sequence ds = new Sequence(sequences[i].getName(), + AlignSeq.extractGaps("-. ", + sequences[i].getSequence()), + sequences[i].getStart(), + sequences[i].getEnd()); + sequences[i].setDatasetSequence(ds); + alignFrame.viewport.alignment.getDataset().addSequence(ds); } + alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment. + getHeight()); + alignFrame.viewport.alignment.getWidth(); + alignFrame.viewport.firePropertyChange("alignment", null, + alignFrame.viewport. + getAlignment().getSequences()); - if (database.getSelectedItem().equals("PDB")) + } + + if (database.getSelectedItem().equals("PDB")) + { + // Parse out the ids from the structured names + boolean errors = false; + for (int i = 0; i < sequences.length; i++) { - for (int i = 0; i < sequences.length; i++) + PDBEntry entry = new PDBEntry(); + com.stevesoft.pat.Regex idbits = new com.stevesoft.pat.Regex( + "PDB\\|([0-9A-z]{4})\\|(.)"); + if (idbits.search(sequences[i].getName())) { - PDBEntry entry = new PDBEntry(); - entry.setId(textfield.getText()); + String pdbid = idbits.substring(1); + String pdbccode = idbits.substring(2); + // Construct the PDBEntry + entry.setId(pdbid); + if (entry.getProperty() == null) + entry.setProperty(new Hashtable()); + entry.getProperty().put("chains", + pdbccode + + "=" + sequences[i].getStart() + + "-" + sequences[i].getEnd()); sequences[i].getDatasetSequence().addPDBId(entry); + + // 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",pdbid); + sequences[i].getDatasetSequence().addDBRef(dbentry); + } + else + { + // don't add an entry for this chain, but this is probably a bug + // that the user should know about. + jalview.bin.Cache.log.warn( + "No PDBEntry constructed for sequence " + i + " : " + + sequences[i].getName()); + errors = true; } } - + if (errors) + jalview.bin.Cache.log.warn( + "Query string that resulted in PDBEntry construction failure was :\n" + + textfield.getText()); } - else - showErrorMessage( "Error retrieving "+textfield.getText() - +" from "+database.getSelectedItem()); + } + else + showErrorMessage("Error retrieving " + textfield.getText() + + " from " + database.getSelectedItem()); + } - return sequences; + return sequences; } - void showErrorMessage(String error) + void showErrorMessage(final String error) { - JOptionPane.showInternalMessageDialog(Desktop.desktop, - error, "Error Retrieving Data", JOptionPane.WARNING_MESSAGE); + resetDialog(); + javax.swing.SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + JOptionPane.showInternalMessageDialog(Desktop.desktop, + error, "Error Retrieving Data", + JOptionPane.WARNING_MESSAGE); + } + }); } } - - -