/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 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 */ package jalview.gui; import javax.swing.*; import java.awt.*; import java.awt.event.*; import jalview.io.EBIFetchClient; import MCview.*; import jalview.datamodel.*; import jalview.analysis.AlignSeq; import java.io.File; import jalview.io.*; import java.util.*; public class SequenceFetcher extends JPanel implements Runnable { JInternalFrame frame; AlignFrame alignFrame; StringBuffer result; final String noDbSelected = "-- Select Database --"; public SequenceFetcher(AlignFrame af) { alignFrame = af; database.addItem(noDbSelected); database.addItem("Uniprot"); database.addItem("EMBL"); database.addItem("EMBLCDS"); database.addItem("PDB"); database.addItem("PFAM"); try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } frame = new JInternalFrame(); frame.setContentPane(this); if (System.getProperty("os.name").startsWith("Mac")) Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140); else Desktop.addInternalFrame(frame, getFrameTitle(), 400, 125); } private String getFrameTitle() { return ( (alignFrame == null) ? "New " : "Additional ") + "Sequence Fetcher"; } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); database.setMinimumSize(new Dimension(160, 21)); database.setPreferredSize(new Dimension(160, 21)); jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); jLabel1.setText( "Separate multiple accession ids with semi colon \";\""); ok.setText("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok_actionPerformed(e); } }); close.setText("Close"); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close_actionPerformed(e); } }); textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); textfield.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok_actionPerformed(e); } }); jPanel1.add(ok); 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.HORIZONTAL, new Insets(0, 0, 0, 6), 200, 1)); } JComboBox database = new JComboBox(); JLabel jLabel1 = new JLabel(); JButton ok = new JButton(); JButton close = new JButton(); JPanel jPanel1 = new JPanel(); JTextField textfield = new JTextField(); GridBagLayout gridBagLayout1 = new GridBagLayout(); public void close_actionPerformed(ActionEvent e) { try { frame.setClosed(true); } catch (Exception ex) {} } public void ok_actionPerformed(ActionEvent e) { database.setEnabled(false); textfield.setEnabled(false); ok.setEnabled(false); close.setEnabled(false); Thread worker = new Thread(this); worker.start(); } private void resetDialog() { database.setEnabled(true); textfield.setEnabled(true); ok.setEnabled(true); close.setEnabled(true); } public void run() { 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) 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")) { EBIFetchClient dbFetch = new EBIFetchClient(); String[] reply = dbFetch.fetchData( database.getSelectedItem().toString().toLowerCase( ) + ":" + textfield.getText(), "fasta", "raw"); if(reply!=null) { for (int i = 0; i < reply.length; i++) result.append(reply[i] + "\n"); parseResult(result.toString(), null); } } else if (database.getSelectedItem().equals("PDB")) { 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()); 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); 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.getProteinName() != null) name.append(" " + entry.getProteinName().elementAt(0)); result.append(name + "\n" + entry.getUniprotSequence().getContent() + "\n"); } //Then read in the features and apply them to the dataset SequenceI[] sequence = 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); } sequence[i].getDatasetSequence().setPDBId(onlyPdbEntries); e = entry.getFeature().elements(); while(e.hasMoreElements()) { sequence[i].getDatasetSequence().addSequenceFeature((SequenceFeature)e.nextElement()); } } } } StringBuffer getPDBFile(String id) { StringBuffer result = new StringBuffer(); String chain = null; if (id.indexOf(":") > -1) { 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 { jalview.bin.Cache.log.warn("Exception when retrieving " + textfield.getText() + " from " + database.getSelectedItem(), ex); return null; } return result; } SequenceI[] parseResult(String result, String title) { String format = new IdentifyFile().Identify(result, "Paste"); SequenceI[] sequences = null; if (FormatAdapter.formats.contains(format)) { sequences = null; try{ sequences = new FormatAdapter().readFile(result.toString(), "Paste", format);} catch(Exception ex){} if (sequences != null && sequences.length > 0) { if (alignFrame == null) { AlignFrame af = new AlignFrame(new Alignment(sequences)); af.currentFileFormat = format; if(title==null) title = "Retrieved from " + database.getSelectedItem(); Desktop.addInternalFrame(af, title, 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) {} } else { for (int i = 0; i < sequences.length; i++) { 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")) { // Parse out the ids from the structured names boolean errors = false; 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())) { 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("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()); } return sequences; } void showErrorMessage(String error) { resetDialog(); JOptionPane.showInternalMessageDialog(Desktop.desktop, error, "Error Retrieving Data", JOptionPane.WARNING_MESSAGE); return; } }