JAL-1668 First version JAL-1668
[jalview.git] / src / jalview / gui / StructureChooser.java
1 package jalview.gui;
2
3 import jalview.datamodel.DBRefEntry;
4 import jalview.datamodel.PDBEntry;
5 import jalview.datamodel.SequenceI;
6 import jalview.jbgui.GStructureChooser;
7 import jalview.util.MessageManager;
8 import jalview.ws.dbsources.PDBRestClient;
9 import jalview.ws.uimodel.PDBSearchRequest;
10 import jalview.ws.uimodel.PDBSearchResponse;
11 import jalview.ws.uimodel.PDBSummaryListModel;
12 import jalview.ws.uimodel.PDBSummaryListModel.PDBDocField;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.HashSet;
17 import java.util.List;
18
19 import javax.swing.JOptionPane;
20 import javax.swing.SwingUtilities;
21
22 @SuppressWarnings("serial")
23 public class StructureChooser extends GStructureChooser
24 {
25
26
27   private SequenceI sequence;
28
29
30   public StructureChooser(AlignmentPanel ap, final SequenceI sequence)
31   {
32     this.ap = ap;
33     this.sequence = sequence;
34     fetchStructures();
35   }
36
37   @Override
38   public void ok_ActionPerformed()
39   {
40     jListFoundStructures.setSelectedValue("op1x", true);
41   }
42
43   public void pdbFromFile_actionPerformed()
44   {
45     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
46             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
47     chooser.setFileView(new jalview.io.JalviewFileView());
48     chooser.setDialogTitle(MessageManager.formatMessage(
49             "label.select_pdb_file_for", new String[]
50             { sequence.getDisplayId(false) }));
51     chooser.setToolTipText(MessageManager.formatMessage(
52             "label.load_pdb_file_associate_with_sequence", new String[]
53             { sequence.getDisplayId(false) }));
54
55     int value = chooser.showOpenDialog(null);
56
57     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
58     {
59       String choice = chooser.getSelectedFile().getPath();
60       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
61       new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,
62               jalview.io.AppletFormatAdapter.FILE, sequence, true,
63               Desktop.instance);
64     }
65
66   }
67
68   public void discoverPDB_actionPerformed()
69   {
70
71     final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
72     { sequence }
73             : ap.av.getSequenceSelection());
74     Thread discpdb = new Thread(new Runnable()
75     {
76       @Override
77       public void run()
78       {
79
80         new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
81                 .fetchDBRefs(false);
82       }
83
84     });
85     discpdb.start();
86   }
87
88   // rpdbview.addActionListener(new ActionListener()
89   // {
90   //
91   // @Override
92   // public void actionPerformed(ActionEvent e)
93   // {
94   // new StructureViewer(ap.getStructureSelectionManager())
95   // .viewStructures(ap, pr, ap.av.collateForPDB(pr));
96   // }
97   // });
98
99   public void enterPDB_actionPerformed()
100   {
101     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
102             MessageManager.getString("label.enter_pdb_id"),
103             MessageManager.getString("label.enter_pdb_id"),
104             JOptionPane.QUESTION_MESSAGE);
105     if (id != null && id.length() > 0)
106     {
107       PDBEntry entry = new PDBEntry();
108       entry.setId(id.toUpperCase());
109       sequence.getDatasetSequence().addPDBId(entry);
110     }
111   }
112
113   public static void main(String[] args)
114   {
115     SwingUtilities.invokeLater(new Runnable()
116     {
117       public void run()
118       {
119         new StructureChooser(null, null);
120       }
121     });
122   }
123
124   @SuppressWarnings("unchecked")
125   protected void populateFilterOptions()
126   {
127     filterOptions.addItem(new FilterOptions("- Filter Criteria -", "",
128             VIEWS_AUTO));
129     filterOptions.addItem(new FilterOptions("All", "all", VIEWS_AUTO));
130     filterOptions
131             .addItem(new FilterOptions("Best Coverage", "", VIEWS_AUTO));
132     filterOptions.addItem(new FilterOptions("Best Resolution", "",
133             VIEWS_AUTO));
134     filterOptions
135             .addItem(new FilterOptions("Best Quality", "", VIEWS_AUTO));
136     filterOptions.addItem(new FilterOptions("Enter PDB Id", "", VIEWS_ID));
137     filterOptions.addItem(new FilterOptions("From File", "", VIEWS_FILE));
138   }
139
140   protected void updateCurrentView()
141   {
142     String currentView = ((FilterOptions) filterOptions.getSelectedItem())
143             .getView();
144     switchableViewsLayout.show(switchableViewsPanel, currentView);
145   }
146
147   private void fetchStructures()
148   {
149     long startTime = System.currentTimeMillis();
150     final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
151     { sequence }
152             : ap.av.getSequenceSelection());
153     int foundStructures = 0;
154     PDBSearchRequest request = new PDBSearchRequest();
155     request.setAllowEmptySeq(false);
156     request.setResponseSize(500);
157     request.setSearchTarget("(text:");
158     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
159     wantedFields.add(PDBDocField.MOLECULE_TYPE);
160     wantedFields.add(PDBDocField.PDB_ID);
161     wantedFields.add(PDBDocField.GENUS);
162     wantedFields.add(PDBDocField.GENE_NAME);
163     wantedFields.add(PDBDocField.TITLE);
164     request.setWantedFields(wantedFields);
165     
166     Collection<PDBSummaryListModel> searchSummaries = new HashSet<PDBSummaryListModel>();
167     // searchSummaries.
168     for (SequenceI seq : sequences)
169     {
170       // System.out.println("Selected : " + seq.getName());
171       request.setSearchTerm(buildQuery(seq) + ")");
172
173       PDBRestClient pdbRestCleint = new PDBRestClient();
174
175       PDBSearchResponse resultList = pdbRestCleint
176               .executeRequest(request);
177       if (resultList.getSearchSummary() != null
178               && !resultList.getSearchSummary().isEmpty())
179       {
180         searchSummaries.addAll(resultList.getSearchSummary());
181       }
182     }
183
184     foundStructures = searchSummaries.size();
185     if (searchSummaries != null)
186     {
187       jListFoundStructures.setModel(PDBSearchResponse
188               .getListModel(searchSummaries));
189     }
190
191     String totalTime = (System.currentTimeMillis() - startTime)
192             + " milli secs";
193     mainFrame.setTitle("Structure Chooser - " + foundStructures
194             + " Found (" + totalTime + ")");
195   }
196
197   private String buildQuery(SequenceI seq)
198   {
199     String query = seq.getName();
200     StringBuilder queryBuilder = new StringBuilder();
201     int count = 0;
202     if (seq.getDBRef() != null && seq.getDBRef().length != 0)
203     {
204       for (DBRefEntry dbRef : seq.getDBRef())
205       {
206         System.out.println("dbref : " + dbRef.getAccessionId());
207         queryBuilder.append("text:").append(dbRef.getAccessionId())
208                 .append(" OR ");
209         ++count;
210         if (count > 10)
211         {
212           break;
213         }
214       }
215       // int beginIndex = queryBuilder. firstIndexOf("text");
216       int endIndex = queryBuilder.lastIndexOf(" OR ");
217       query = queryBuilder.toString().substring(5, endIndex);
218     }
219     System.out.println("------------> " + query);
220     return query;
221   }
222
223   public class FilterOptions
224   {
225     private String name;
226
227     private String value;
228
229     private String view;
230
231     public FilterOptions(String name, String value, String view)
232     {
233       this.name = name;
234       this.value = value;
235       this.view = view;
236     }
237
238     public String getName()
239     {
240       return name;
241     }
242
243     public void setName(String name)
244     {
245       this.name = name;
246     }
247
248     public String getValue()
249     {
250       return value;
251     }
252
253     public void setValue(String value)
254     {
255       this.value = value;
256     }
257
258     public String getView()
259     {
260       return view;
261     }
262
263     public void setView(String view)
264     {
265       this.view = view;
266     }
267
268     public String toString()
269     {
270       return this.name;
271     }
272   }
273 }