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