aa85232c750a69bc3888233329d43ff0c9f310de
[jalview.git] / src / jalview / gui / SequenceFetcher.java
1 package jalview.gui;\r
2 \r
3 import javax.swing.*;\r
4 import java.awt.*;\r
5 import java.awt.event.*;\r
6 import jalview.io.EBIFetchClient;\r
7 import MCview.*;\r
8 import jalview.datamodel.*;\r
9 import jalview.analysis.AlignSeq;\r
10 import java.io.File;\r
11 import jalview.io.*;\r
12 import java.util.*;\r
13 \r
14 \r
15 public class SequenceFetcher\r
16     extends JPanel implements Runnable\r
17 {\r
18   JInternalFrame frame;\r
19   AlignFrame alignFrame;\r
20   StringBuffer result;\r
21   public SequenceFetcher(AlignFrame af)\r
22   {\r
23     alignFrame = af;\r
24     database.addItem("-- Select Database --");\r
25     database.addItem("Uniprot");\r
26     database.addItem("EMBL");\r
27     database.addItem("EMBLCDS");\r
28     database.addItem("PDB");\r
29 \r
30     try\r
31     {\r
32       jbInit();\r
33     }\r
34     catch (Exception ex)\r
35     {\r
36       ex.printStackTrace();\r
37     }\r
38 \r
39     frame = new JInternalFrame();\r
40     frame.setContentPane(this);\r
41     if(System.getProperty("os.name").startsWith("Mac"))\r
42       Desktop.addInternalFrame(frame, "Sequence Fetcher (WSDBfetch@EBI)", 400, 140);\r
43     else\r
44       Desktop.addInternalFrame(frame, "Sequence Fetcher (WSDBfetch@EBI)", 400, 120);\r
45   }\r
46 \r
47   private void jbInit()\r
48       throws Exception\r
49   {\r
50     this.setLayout(gridBagLayout1);\r
51     DefaultListCellRenderer dlcr = new DefaultListCellRenderer();\r
52     dlcr.setHorizontalAlignment(DefaultListCellRenderer.CENTER);\r
53     database.setRenderer(dlcr);\r
54 \r
55     database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
56     database.setMinimumSize(new Dimension(160, 21));\r
57     database.setPreferredSize(new Dimension(160, 21));\r
58     jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));\r
59     jLabel1.setText(\r
60         "Separate multiple accession ids with semi colon \";\"");\r
61     ok.setText("OK");\r
62     ok.addActionListener(new ActionListener()\r
63     {\r
64       public void actionPerformed(ActionEvent e)\r
65       {\r
66         ok_actionPerformed(e);\r
67       }\r
68     });\r
69     cancel.setText("Cancel");\r
70     cancel.addActionListener(new ActionListener()\r
71     {\r
72       public void actionPerformed(ActionEvent e)\r
73       {\r
74         cancel_actionPerformed(e);\r
75       }\r
76     });\r
77     textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
78     textfield.addActionListener(new ActionListener()\r
79     {\r
80       public void actionPerformed(ActionEvent e)\r
81       {\r
82         ok_actionPerformed(e);\r
83       }\r
84     });\r
85     jPanel1.add(ok);\r
86     jPanel1.add(cancel);\r
87     this.add(jLabel1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0\r
88                                              , GridBagConstraints.WEST,\r
89                                              GridBagConstraints.NONE,\r
90                                              new Insets(7, 4, 0, 6), 77, 6));\r
91     this.add(jPanel1, new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0\r
92                                              , GridBagConstraints.WEST,\r
93                                              GridBagConstraints.BOTH,\r
94                                              new Insets(7, -2, 7, 12), 241, -2));\r
95     this.add(database, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0\r
96                                               , GridBagConstraints.WEST,\r
97                                               GridBagConstraints.NONE,\r
98                                               new Insets(0, 4, 0, 0), 1, 0));\r
99     this.add(textfield, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0\r
100                                                , GridBagConstraints.CENTER,\r
101                                                GridBagConstraints.HORIZONTAL,\r
102                                                new Insets(0, 0, 0, 6), 200, 1));\r
103   }\r
104 \r
105   JComboBox database = new JComboBox();\r
106   JLabel jLabel1 = new JLabel();\r
107   JButton ok = new JButton();\r
108   JButton cancel = new JButton();\r
109   JPanel jPanel1 = new JPanel();\r
110   JTextField textfield = new JTextField();\r
111   GridBagLayout gridBagLayout1 = new GridBagLayout();\r
112   public void cancel_actionPerformed(ActionEvent e)\r
113   {\r
114     try\r
115     {\r
116       frame.setClosed(true);\r
117     }\r
118     catch (Exception ex)\r
119     {}\r
120   }\r
121 \r
122   public void ok_actionPerformed(ActionEvent e)\r
123   {\r
124     frame.setTitle("Sequence Fetcher (WSDBfetch@EBI) - Fetching Sequence...");\r
125     database.setEnabled(false);\r
126     textfield.setEnabled(false);\r
127     ok.setEnabled(false);\r
128     cancel.setEnabled(false);\r
129 \r
130     Thread worker = new Thread(this);\r
131     worker.start();\r
132   }\r
133 \r
134   public void run()\r
135   {\r
136    result = new StringBuffer();\r
137     if (database.getSelectedItem().equals("Uniprot"))\r
138     {\r
139       getUniprotFile(textfield.getText());\r
140     }\r
141     else if (database.getSelectedItem().equals("EMBL")\r
142         || database.getSelectedItem().equals("EMBLCDS"))\r
143     {\r
144       EBIFetchClient dbFetch = new EBIFetchClient();\r
145       String[] reply = dbFetch.fetchData(\r
146           database.getSelectedItem().toString().toLowerCase(\r
147           ) + ":" + textfield.getText(),\r
148           "fasta", "raw");\r
149 \r
150       for (int i = 0; i < reply.length; i++)\r
151         result.append(reply[i] + "\n");\r
152 \r
153       parseResult(result.toString());\r
154     }\r
155     else if (database.getSelectedItem().equals("PDB"))\r
156     {\r
157       result = getPDBFile(textfield.getText().toUpperCase());\r
158       parseResult(result.toString());\r
159     }\r
160 \r
161 \r
162     if (result == null || result.length() == 0)\r
163       showErrorMessage("Error retrieving " + textfield.getText()\r
164                        + " from " + database.getSelectedItem());\r
165 \r
166 \r
167       database.setEnabled(true);\r
168       textfield.setEnabled(true);\r
169       ok.setEnabled(true);\r
170       cancel.setEnabled(true);\r
171       frame.setTitle("Sequence Fetcher (WSDBfetch@EBI)");\r
172   }\r
173 \r
174   void getUniprotFile(String id)\r
175   {\r
176     EBIFetchClient ebi = new EBIFetchClient();\r
177     File file = ebi.fetchDataAsFile("uniprot:"+id,"xml", null);\r
178     SequenceFeatureFetcher sff = new SequenceFeatureFetcher();\r
179     Vector entries = sff.getUniprotEntries(file);\r
180 \r
181     if(entries!=null)\r
182     {\r
183       //First, make the new sequences\r
184       Enumeration en = entries.elements();\r
185       while (en.hasMoreElements())\r
186       {\r
187         UniprotEntry entry = (UniprotEntry) en.nextElement();\r
188         StringBuffer name = new StringBuffer( ">Uniprot/Swiss-Prot" );\r
189         Enumeration en2 = entry.getAccession().elements();\r
190         while(en2.hasMoreElements())\r
191         {\r
192           name.append("|");\r
193           name.append(en2.nextElement());\r
194         }\r
195         en2 = entry.getName().elements();\r
196         while(en2.hasMoreElements())\r
197         {\r
198           name.append("|");\r
199           name.append(en2.nextElement());\r
200         }\r
201 \r
202         if(entry.getProteinName()!=null)\r
203           name.append(" "+entry.getProteinName().elementAt(0));\r
204 \r
205         result.append(name +"\n"+entry.getUniprotSequence().getContent());\r
206 \r
207       }\r
208 \r
209       //Then read in the features and apply them to the dataset\r
210       SequenceI [] sequence = parseResult(result.toString());\r
211       for(int i=0; i<entries.size(); i++)\r
212       {\r
213         UniprotEntry entry = (UniprotEntry) entries.elementAt(i);\r
214         Enumeration e = entry.getDbReference().elements();\r
215         Vector onlyPdbEntries = new Vector();\r
216         while (e.hasMoreElements())\r
217         {\r
218           PDBEntry pdb = (PDBEntry) e.nextElement();\r
219           if (!pdb.getType().equals("PDB"))\r
220             continue;\r
221 \r
222           onlyPdbEntries.addElement(pdb);\r
223         }\r
224 \r
225         sequence[i].getDatasetSequence().setPDBId(onlyPdbEntries);\r
226         sequence[i].getDatasetSequence().setSequenceFeatures(entry.getFeature());\r
227 \r
228       }\r
229     }\r
230   }\r
231 \r
232     StringBuffer getPDBFile(String id)\r
233     {\r
234       StringBuffer result = new StringBuffer();\r
235       String chain = null;\r
236       if (id.indexOf(":") > -1)\r
237       {\r
238         chain = id.substring(id.indexOf(":") + 1);\r
239         id = id.substring(0, id.indexOf(":"));\r
240       }\r
241 \r
242       EBIFetchClient ebi = new EBIFetchClient();\r
243       String[] reply = ebi.fetchData("pdb:" + id, "pdb", "raw");\r
244       try\r
245       {\r
246         PDBfile pdbfile = new PDBfile(reply);\r
247         for (int i = 0; i < pdbfile.chains.size(); i++)\r
248         {\r
249           if (chain == null ||\r
250               ( (PDBChain) pdbfile.chains.elementAt(i)).id.\r
251               toUpperCase().equals(chain))\r
252             result.append("\n>PDB|" + id + "|" +\r
253                           ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.\r
254                           getName() +\r
255                           "\n"\r
256                           +\r
257                           ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.\r
258                           getSequence());\r
259         }\r
260       }\r
261       catch (Exception ex) // Problem parsing PDB file\r
262       {\r
263         showErrorMessage("Error retrieving " + textfield.getText() + " from " +\r
264             database.getSelectedItem());\r
265         return null;\r
266       }\r
267 \r
268       return result;\r
269     }\r
270 \r
271     SequenceI[] parseResult(String result)\r
272     {\r
273       String format = IdentifyFile.Identify(result, "Paste");\r
274       SequenceI[] sequences = null;\r
275 \r
276       if (FormatAdapter.formats.contains(format))\r
277       {\r
278         sequences = new FormatAdapter().readFile(result.toString(), "Paste", format);\r
279         if (sequences != null && sequences.length>0)\r
280         {\r
281           if(alignFrame==null)\r
282           {\r
283             AlignFrame af = new AlignFrame(new Alignment(sequences));\r
284             af.currentFileFormat = format;\r
285             Desktop.addInternalFrame(af, "Retrieved from "+database.getSelectedItem(),\r
286                                      AlignFrame.NEW_WINDOW_WIDTH,\r
287                                      AlignFrame.NEW_WINDOW_HEIGHT);\r
288             af.statusBar.setText("Successfully pasted alignment file");\r
289             try\r
290             {\r
291               af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));\r
292             }\r
293             catch (Exception ex)\r
294             {}\r
295           }\r
296           else\r
297           {\r
298             for (int i = 0; i < sequences.length; i++)\r
299             {\r
300               alignFrame.viewport.alignment.addSequence(sequences[i]);\r
301 \r
302               ////////////////////////////\r
303               //Datset needs extension;\r
304               /////////////////////////////\r
305               Sequence ds = new Sequence(sequences[i].getName(),\r
306                                          AlignSeq.extractGaps("-. ",\r
307                   sequences[i].getSequence()),\r
308                                          sequences[i].getStart(),\r
309                                          sequences[i].getEnd());\r
310               sequences[i].setDatasetSequence(ds);\r
311               alignFrame.viewport.alignment.getDataset().addSequence(ds);\r
312             }\r
313             alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment.\r
314                                           getHeight());\r
315             alignFrame.viewport.alignment.getWidth();\r
316             alignFrame.viewport.firePropertyChange("alignment", null,\r
317             alignFrame.viewport.getAlignment().getSequences());\r
318 \r
319           }\r
320 \r
321           if (database.getSelectedItem().equals("PDB"))\r
322           {\r
323             for (int i = 0; i < sequences.length; i++)\r
324             {\r
325               PDBEntry entry = new PDBEntry();\r
326               entry.setId(textfield.getText());\r
327               sequences[i].getDatasetSequence().addPDBId(entry);\r
328             }\r
329           }\r
330 \r
331         }\r
332         else\r
333           showErrorMessage( "Error retrieving "+textfield.getText()\r
334                             +" from "+database.getSelectedItem());\r
335       }\r
336 \r
337       return sequences;\r
338 \r
339   }\r
340 \r
341   void showErrorMessage(String error)\r
342   {\r
343     JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
344          error, "Error Retrieving Data", JOptionPane.WARNING_MESSAGE);\r
345   }\r
346 }\r
347 \r
348 \r
349 \r
350 \r