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