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