Don't parse input id, leave it as it is
[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.ActionListener;\r
6 import java.awt.event.ActionEvent;\r
7 import MCview.PDBfile;\r
8 import jalview.io.EBIFetchClient;\r
9 import MCview.PDBChain;\r
10 import jalview.datamodel.Alignment;\r
11 import jalview.io.FormatAdapter;\r
12 import jalview.datamodel.SequenceI;\r
13 import jalview.io.IdentifyFile;\r
14 import jalview.analysis.AlignSeq;\r
15 import jalview.datamodel.*;\r
16 \r
17 public class SequenceFetcher\r
18     extends JPanel implements Runnable\r
19 {\r
20   JInternalFrame frame;\r
21   AlignFrame alignFrame;\r
22   public SequenceFetcher(AlignFrame af)\r
23   {\r
24     alignFrame = af;\r
25     database.addItem("-- Select Database --");\r
26     database.addItem("Uniprot");\r
27     database.addItem("EMBL");\r
28     database.addItem("EMBLCDS");\r
29     database.addItem("PDB");\r
30 \r
31     try\r
32     {\r
33       jbInit();\r
34     }\r
35     catch (Exception ex)\r
36     {\r
37       ex.printStackTrace();\r
38     }\r
39 \r
40     frame = new JInternalFrame();\r
41     frame.setContentPane(this);\r
42     if(System.getProperty("os.name").startsWith("Mac"))\r
43       Desktop.addInternalFrame(frame, "Sequence Fetcher", 390, 135);\r
44     else\r
45       Desktop.addInternalFrame(frame, "Sequence Fetcher", 390, 120);\r
46   }\r
47 \r
48   private void jbInit()\r
49       throws Exception\r
50   {\r
51     this.setLayout(gridBagLayout1);\r
52     database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
53     jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));\r
54     jLabel1.setText(\r
55         "Separate multiple accession ids with semi colon \";\"");\r
56     ok.setText("OK");\r
57     ok.addActionListener(new ActionListener()\r
58     {\r
59       public void actionPerformed(ActionEvent e)\r
60       {\r
61         ok_actionPerformed(e);\r
62       }\r
63     });\r
64     cancel.setText("Cancel");\r
65     cancel.addActionListener(new ActionListener()\r
66     {\r
67       public void actionPerformed(ActionEvent e)\r
68       {\r
69         cancel_actionPerformed(e);\r
70       }\r
71     });\r
72     textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
73     textfield.addActionListener(new ActionListener()\r
74     {\r
75       public void actionPerformed(ActionEvent e)\r
76       {\r
77         ok_actionPerformed(e);\r
78       }\r
79     });\r
80     jPanel1.add(ok);\r
81     jPanel1.add(cancel);\r
82     this.add(jLabel1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0\r
83                                              , GridBagConstraints.WEST,\r
84                                              GridBagConstraints.NONE,\r
85                                              new Insets(7, 4, 0, 6), 77, 6));\r
86     this.add(textfield, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0\r
87                                                , GridBagConstraints.WEST,\r
88                                                GridBagConstraints.HORIZONTAL,\r
89                                                new Insets(0, 0, 0, 6), 221, 1));\r
90     this.add(jPanel1, new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0\r
91                                              , GridBagConstraints.WEST,\r
92                                              GridBagConstraints.BOTH,\r
93                                              new Insets(7, -2, 7, 12), 241, -2));\r
94     this.add(database, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0\r
95                                               , GridBagConstraints.CENTER,\r
96                                               GridBagConstraints.NONE,\r
97                                               new Insets(0, 4, 0, 0), 1, 0));\r
98   }\r
99 \r
100   JComboBox database = new JComboBox();\r
101   JLabel jLabel1 = new JLabel();\r
102   JButton ok = new JButton();\r
103   JButton cancel = new JButton();\r
104   JPanel jPanel1 = new JPanel();\r
105   JTextField textfield = new JTextField();\r
106   GridBagLayout gridBagLayout1 = new GridBagLayout();\r
107   public void cancel_actionPerformed(ActionEvent e)\r
108   {\r
109     try\r
110     {\r
111       frame.setClosed(true);\r
112     }\r
113     catch (Exception ex)\r
114     {}\r
115   }\r
116 \r
117   public void ok_actionPerformed(ActionEvent e)\r
118   {\r
119     frame.setTitle("WSDBfetch@EBI Sequence Fetcher - Fetching Sequence...");\r
120     database.setEnabled(false);\r
121     textfield.setEnabled(false);\r
122     ok.setEnabled(false);\r
123     cancel.setEnabled(false);\r
124 \r
125     Thread worker = new Thread(this);\r
126     worker.start();\r
127   }\r
128 \r
129   public void run()\r
130   {\r
131     String error = null;\r
132     StringBuffer result = new StringBuffer();\r
133       if (database.getSelectedItem().equals("Uniprot")\r
134           || database.getSelectedItem().equals("EMBL")\r
135           || database.getSelectedItem().equals("EMBLCDS"))\r
136       {\r
137         EBIFetchClient dbFetch = new EBIFetchClient();\r
138         String[] reply = dbFetch.fetchData(\r
139             database.getSelectedItem().toString().toLowerCase(\r
140             ) + ":" + textfield.getText(),\r
141             "fasta", "raw");\r
142 \r
143         for (int i = 0; i < reply.length; i++)\r
144           result.append(reply[i] + "\n");\r
145       }\r
146       else if (database.getSelectedItem().equals("PDB"))\r
147       {\r
148         String id = textfield.getText().toUpperCase();\r
149         String chain=null;\r
150         if(id.indexOf(":")>-1)\r
151         {\r
152           chain = id.substring(id.indexOf(":")+1);\r
153           id = id.substring(0,id.indexOf(":"));\r
154           System.out.println(id+" "+chain);\r
155         }\r
156 \r
157         EBIFetchClient ebi = new EBIFetchClient();\r
158         String[] reply = ebi.fetchData("pdb:" + id, "pdb",\r
159                                        "raw");\r
160         try{\r
161           PDBfile pdbfile = new PDBfile(reply);\r
162           for (int i = 0; i < pdbfile.chains.size(); i++)\r
163           {\r
164             if( chain == null || ((PDBChain)pdbfile.chains.elementAt(i)).id.toUpperCase().equals(chain))\r
165             result.append("\n>PDB|" + id+"|"+\r
166                           ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.\r
167                           getName() +\r
168                           "\n"\r
169                           +\r
170                           ( (PDBChain) pdbfile.chains.elementAt(i)).sequence.\r
171                           getSequence());\r
172           }\r
173         }catch(Exception ex)// Problem parsing PDB file\r
174         {\r
175           error = "Error retrieving "+textfield.getText()+" from "+database.getSelectedItem();\r
176         }\r
177       }\r
178 \r
179     if (result.length() > 0 && error==null)\r
180     {\r
181       String format = IdentifyFile.Identify(result.toString(), "Paste");\r
182       SequenceI[] sequences = null;\r
183 \r
184       if (FormatAdapter.formats.contains(format))\r
185       {\r
186         sequences = new FormatAdapter().readFile(result.toString(), "Paste", format);\r
187         if (sequences != null && sequences.length>0)\r
188         {\r
189           if(alignFrame==null)\r
190           {\r
191             AlignFrame af = new AlignFrame(new Alignment(sequences));\r
192             af.currentFileFormat = format;\r
193             Desktop.addInternalFrame(af, "Cut & Paste input - " + format,\r
194                                      AlignFrame.NEW_WINDOW_WIDTH,\r
195                                      AlignFrame.NEW_WINDOW_HEIGHT);\r
196             af.statusBar.setText("Successfully pasted alignment file");\r
197             try\r
198             {\r
199               af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));\r
200             }\r
201             catch (Exception ex)\r
202             {}\r
203           }\r
204           else\r
205           {\r
206             for (int i = 0; i < sequences.length; i++)\r
207             {\r
208               alignFrame.viewport.alignment.addSequence(sequences[i]);\r
209 \r
210               ////////////////////////////\r
211               //Datset needs extension;\r
212               /////////////////////////////\r
213               Sequence ds = new Sequence(sequences[i].getName(),\r
214                                          AlignSeq.extractGaps("-. ",\r
215                   sequences[i].getSequence()),\r
216                                          sequences[i].getStart(),\r
217                                          sequences[i].getEnd());\r
218               sequences[i].setDatasetSequence(ds);\r
219               alignFrame.viewport.alignment.getDataset().addSequence(ds);\r
220             }\r
221             alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment.\r
222                                           getHeight());\r
223             alignFrame.viewport.alignment.getWidth();\r
224             alignFrame.viewport.firePropertyChange("alignment", null,\r
225                 alignFrame.viewport.getAlignment().getSequences());\r
226 \r
227           }\r
228 \r
229           if (database.getSelectedItem().equals("PDB"))\r
230           {\r
231             for (int i = 0; i < sequences.length; i++)\r
232             {\r
233               PDBEntry entry = new PDBEntry();\r
234               entry.setId(textfield.getText());\r
235               sequences[i].getDatasetSequence().addPDBId(entry);\r
236             }\r
237           }\r
238 \r
239         }\r
240         else\r
241           error = "Error retrieving "+textfield.getText()+" from "+database.getSelectedItem();\r
242 \r
243 \r
244 \r
245       }\r
246     }\r
247 \r
248     if(error!=null)\r
249           showErrorMessage(error);\r
250 \r
251     database.setEnabled(true);\r
252     textfield.setEnabled(true);\r
253     ok.setEnabled(true);\r
254     cancel.setEnabled(true);\r
255     frame.setTitle("WSDBfetch@EBI Sequence Fetcher");\r
256   }\r
257 \r
258   void showErrorMessage(String error)\r
259   {\r
260     JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
261          error, "Error Retrieving Data", JOptionPane.WARNING_MESSAGE);\r
262   }\r
263 }\r
264 \r
265 \r
266 \r
267 \r