X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=ce366c83fd2005db916e60547264d0513dba13c3;hb=254bc65bde4afa36c3c6c66a7608ac85692503d5;hp=f4e289b05f4070d7406cca38c72157bc6a547ee1;hpb=451619e33c0a90c8130c7d79ffa38161af1c6e0f;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index f4e289b..ce366c8 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) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Copyright (C) 2007 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 @@ -18,16 +18,16 @@ */ 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 java.io.File; import jalview.io.*; -import java.util.*; public class SequenceFetcher extends JPanel implements Runnable @@ -58,14 +58,19 @@ public class SequenceFetcher 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"; + return ( (alignFrame == null) ? "New " : "Additional ") + + "Sequence Fetcher"; } private void jbInit() @@ -163,11 +168,15 @@ 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) + { error += "Please enter a (semi-colon separated list of) database id(s)"; + } if (error.length() > 0) { showErrorMessage(error); @@ -184,7 +193,7 @@ public class SequenceFetcher || database.getSelectedItem().equals("EMBLCDS")) { StringTokenizer st = new StringTokenizer(textfield.getText(), ";"); - while(st.hasMoreTokens()) + while (st.hasMoreTokens()) { EBIFetchClient dbFetch = new EBIFetchClient(); @@ -196,11 +205,13 @@ public class SequenceFetcher if (reply != null) { 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 + if (result != null && result.length() > 1) // arbitrary minimum length for a seuqence file { System.out.println(result.toString()); @@ -211,35 +222,69 @@ public class SequenceFetcher { StringTokenizer qset = new StringTokenizer(textfield.getText(), ";"); String query; - while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null)) + SequenceI[] seqs = null; + while (qset.hasMoreTokens() && ( (query = qset.nextToken()) != null)) { - StringBuffer respart = getPDBFile(query.toUpperCase()); - if(respart!=null) - result.append(respart); + 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 < seqparts.length; i++, j++) + { + newseqs[i] = seqparts[j]; + } + seqs = newseqs; + } + result.append("# Success for " + query.toUpperCase() + "\n"); + } + } + if (seqs != null && seqs.length > 0) + { + if (parseResult(new Alignment(seqs), null, null) != null) + { + result.append( + "# Successfully parsed the PDB File Queries into an Alignment"); + } } - - - if (result.length()>0) - parseResult(result.toString(), null); } - else if( database.getSelectedItem().equals("PFAM")) + else if (database.getSelectedItem().equals("PFAM")) { - try{ + try + { result.append(new FastaFile( - "http://www.sanger.ac.uk/cgi-bin/Pfam/getalignment.pl?format=fal&acc=" - + textfield.getText().toUpperCase(), "URL").print() - ); + "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() ); + if (result.length() > 0) + { + parseResult(result.toString(), textfield.getText().toUpperCase()); + } - }catch(java.io.IOException ex) - { result = null; } + } + catch (java.io.IOException ex) + { + result = null; + } } if (result == null || result.length() == 0) + { showErrorMessage("Error retrieving " + textfield.getText() + " from " + database.getSelectedItem()); + } resetDialog(); return; @@ -277,7 +322,7 @@ public class SequenceFetcher if (entry.getProtein() != null) { - name.append(" " + entry.getProtein().getName().elementAt(0)); + name.append(" " + entry.getProtein().getName().elementAt(0)); } result.append(name + "\n" + entry.getUniprotSequence().getContent() + @@ -286,7 +331,7 @@ public class SequenceFetcher } //Then read in the features and apply them to the dataset - SequenceI[] sequence = parseResult(result.toString(), null); + Alignment al = parseResult(result.toString(), null); for (int i = 0; i < entries.size(); i++) { UniprotEntry entry = (UniprotEntry) entries.elementAt(i); @@ -296,7 +341,9 @@ public class SequenceFetcher { PDBEntry pdb = (PDBEntry) e.nextElement(); if (!pdb.getType().equals("PDB")) + { continue; + } onlyPdbEntries.addElement(pdb); } @@ -304,15 +351,13 @@ public class SequenceFetcher Enumeration en2 = entry.getAccession().elements(); while (en2.hasMoreElements()) { - sequence[i].getDatasetSequence().addDBRef(new DBRefEntry(DBRefSource.UNIPROT, - "0", - en2.nextElement().toString())); + al.getSequenceAt(i).getDatasetSequence().addDBRef(new DBRefEntry( + DBRefSource.UNIPROT, + "0", + en2.nextElement().toString())); } - - - - sequence[i].getDatasetSequence().setPDBId(onlyPdbEntries); + al.getSequenceAt(i).getDatasetSequence().setPDBId(onlyPdbEntries); if (entry.getFeature() != null) { e = entry.getFeature().elements(); @@ -320,16 +365,16 @@ public class SequenceFetcher { SequenceFeature sf = (SequenceFeature) e.nextElement(); sf.setFeatureGroup("Uniprot"); - sequence[i].getDatasetSequence().addSequenceFeature( sf ); + al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf); } } } } } - StringBuffer getPDBFile(String id) + SequenceI[] getPDBFile(String id) { - StringBuffer result = new StringBuffer(); + Vector result = new Vector(); String chain = null; if (id.indexOf(":") > -1) { @@ -338,9 +383,12 @@ public class SequenceFetcher } EBIFetchClient ebi = new EBIFetchClient(); - String file = ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw").getAbsolutePath(); + String file = ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw"). + getAbsolutePath(); if (file == null) + { return null; + } try { PDBfile pdbfile = new PDBfile(file, jalview.io.AppletFormatAdapter.FILE); @@ -349,14 +397,35 @@ public class SequenceFetcher 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. - getSequenceAsString()); + { + 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()); + } } } catch (Exception ex) // Problem parsing PDB file @@ -366,124 +435,93 @@ public class SequenceFetcher database.getSelectedItem(), ex); return null; } - - return result; + 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; } - SequenceI[] parseResult(String result, String title) + Alignment parseResult(String result, String title) { String format = new IdentifyFile().Identify(result, "Paste"); - SequenceI[] sequences = null; - + Alignment sequences = null; if (FormatAdapter.isValidFormat(format)) { sequences = null; - try{ sequences = new FormatAdapter().readFile(result.toString(), "Paste", - format);} - catch(Exception ex){} + try + { + sequences = new FormatAdapter().readFile(result.toString(), "Paste", + format); + } + catch (Exception ex) + {} + + if (sequences != null) + { + return parseResult(sequences, title, format); + } + } + else + { + showErrorMessage("Error retrieving " + textfield.getText() + + " from " + database.getSelectedItem()); + } + + return null; + } + + Alignment parseResult(Alignment al, String title, String currentFileFormat) + { - if (sequences != null && sequences.length > 0) + 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(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 - { - af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); - } - catch (Exception ex) - {} + af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT FORMAT FOR NON-FormatAdapter Sourced Alignments? } - 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].getSequenceAsString()), - 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 (title == null) + { + title = "Retrieved from " + database.getSelectedItem(); } - if (database.getSelectedItem().equals("PDB")) + Desktop.addInternalFrame(af, + title, + AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + + af.statusBar.setText("Successfully pasted alignment file"); + + try { - // 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(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()); + af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); } - + catch (Exception ex) + {} } else - showErrorMessage("Error retrieving " + textfield.getText() - + " from " + database.getSelectedItem()); + { + 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 sequences; - + return al; } void showErrorMessage(final String error) @@ -495,9 +533,8 @@ public class SequenceFetcher { JOptionPane.showInternalMessageDialog(Desktop.desktop, error, "Error Retrieving Data", - JOptionPane.WARNING_MESSAGE); + JOptionPane.WARNING_MESSAGE); } }); } } -