Merge branch 'features/JAL-1714_specify-mulitple-id_PDB-query' into Release_2_9_Branch
[jalview.git] / src / jalview / gui / PDBSearchPanel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3  * Copyright (C) 2014 The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.gui;
23
24 import jalview.jbgui.GPDBSearchPanel;
25 import jalview.jbgui.PDBDocFieldPreferences;
26 import jalview.util.MessageManager;
27 import jalview.ws.dbsources.PDBRestClient;
28 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
29 import jalview.ws.uimodel.PDBRestRequest;
30 import jalview.ws.uimodel.PDBRestResponse;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Collections;
35 import java.util.Comparator;
36 import java.util.HashSet;
37 import java.util.List;
38
39 import javax.swing.table.DefaultTableModel;
40
41 @SuppressWarnings("serial")
42 public class PDBSearchPanel extends GPDBSearchPanel
43 {
44   private SequenceFetcher seqFetcher;
45
46   private IProgressIndicator progressIdicator;
47
48   private Collection<PDBDocField> wantedFields;
49
50   public PDBSearchPanel(SequenceFetcher seqFetcher)
51   {
52     this.seqFetcher = seqFetcher;
53     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
54             .getProgressIndicator();
55   }
56
57
58   /**
59    * Action performed when an input is detected on txt_search field.
60    */
61   @Override
62   public void txt_search_ActionPerformed()
63   {
64     btn_ok.setEnabled(false);
65     boolean allowEmptySequence = false;
66     mainFrame.setTitle(MessageManager
67             .getString("label.pdb_sequence_getcher"));
68     tbl_summary.setModel(new DefaultTableModel());
69     if (txt_search.getText().trim().length() > 0)
70     {
71       long startTime = System.currentTimeMillis();
72
73       String searchTarget = ((PDBDocField) cmb_searchTarget
74               .getSelectedItem()).getCode();
75
76       wantedFields = PDBDocFieldPreferences
77               .getSearchSummaryFields();
78
79       String searchTerm = decodeSearchTerm(txt_search.getText(),
80               searchTarget);
81
82       PDBRestRequest request = new PDBRestRequest();
83       request.setAllowEmptySeq(allowEmptySequence);
84       request.setResponseSize(100);
85       request.setFieldToSearchBy("(" + searchTarget + ":");
86       request.setSearchTerm(searchTerm + ")");
87       request.setWantedFields(wantedFields);
88       // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
89       PDBRestClient pdbRestCleint = new PDBRestClient();
90       PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
91       if (resultList.getSearchSummary() != null)
92       {
93         tbl_summary.setModel(PDBRestResponse.getTableModel(request,
94                 resultList.getSearchSummary()));
95       }
96
97       long endTime = System.currentTimeMillis();
98       int resultSetCount = resultList.getNumberOfItemsFound();
99       String result = (resultSetCount > 1) ? MessageManager
100               .getString("label.results") : MessageManager
101               .getString("label.result");
102       mainFrame.setTitle(frameTitle + " - " + resultSetCount + " " + result
103               + " (" + (endTime - startTime) + " milli secs)");
104     }
105   }
106
107   public static String decodeSearchTerm(String enteredText,
108           String targetField)
109   {
110     String foundSearchTerms = enteredText;
111     StringBuilder foundSearchTermsBuilder = new StringBuilder();
112     if (enteredText.contains(";"))
113     {
114       String[] searchTerms = enteredText.split(";");
115       for (String searchTerm : searchTerms)
116       {
117         if (searchTerm.contains(":"))
118         {
119           foundSearchTermsBuilder.append(targetField).append(":")
120                   .append(searchTerm.split(":")[0]).append(" OR ");
121         }
122         else
123         {
124           foundSearchTermsBuilder.append(targetField).append(":")
125                   .append(searchTerm).append(" OR ");
126         }
127       }
128       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
129       foundSearchTerms = foundSearchTermsBuilder.toString();
130       if (foundSearchTerms.contains(" OR "))
131       {
132         foundSearchTerms = foundSearchTerms.substring(
133                 targetField.length() + 1, endIndex);
134       }
135     }
136     else if (enteredText.contains(":"))
137     {
138       foundSearchTerms = foundSearchTerms.split(":")[0];
139     }
140     return foundSearchTerms;
141   }
142
143
144   @Override
145   public void btn_ok_ActionPerformed()
146   {
147     loadSelectedPDBSequencesToAlignment();
148   }
149
150   @Override
151   public void btn_back_ActionPerformed()
152   {
153     mainFrame.dispose();
154     new SequenceFetcher(progressIdicator);
155   }
156
157   @Override
158   public void btn_cancel_ActionPerformed()
159   {
160     mainFrame.dispose();
161   }
162
163   /**
164    * Add the discovered/selected sequences to a target alignment window
165    */
166   public void loadSelectedPDBSequencesToAlignment()
167   {
168     mainFrame.dispose();
169     StringBuilder selectedIds = new StringBuilder();
170     HashSet<String> selectedIdsSet = new HashSet<String>();
171     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
172     int[] selectedRows = tbl_summary.getSelectedRows();
173     for (int summaryRow : selectedRows)
174     {
175       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
176               .toString();
177       String searchTerm = txt_search.getText();
178       selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
179     }
180
181     for (String selectedId : selectedIdsSet)
182     {
183       selectedIds.append(selectedId).append(";");
184     }
185
186     String ids = selectedIds.toString();
187     System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
188     seqFetcher.textArea.setText(ids);
189     Thread worker = new Thread(seqFetcher);
190     worker.start();
191   }
192
193   public static String getPDBIdwithSpecifiedChain(String pdbId,
194           String searchTerm)
195   {
196     String pdbIdWithChainCode = "";
197     if (searchTerm.contains(";"))
198     {
199       String[] foundTerms = searchTerm.split(";");
200       for (String foundTerm : foundTerms)
201       {
202         if (foundTerm.contains(pdbId))
203         {
204           pdbIdWithChainCode = foundTerm;
205         }
206       }
207     }
208     else if (searchTerm.contains(pdbId))
209     {
210       pdbIdWithChainCode = searchTerm;
211     }
212     else
213     {
214       pdbIdWithChainCode = pdbId;
215     }
216     return pdbIdWithChainCode;
217   }
218
219   /**
220    * Populates search target combo-box options
221    */
222   public void populateCmbSearchTargetOptions()
223   {
224     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
225     searchableTargets.add(PDBDocField.PDB_ID);
226     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
227     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
228     searchableTargets.add(PDBDocField.MOLECULE_NAME);
229     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
230     searchableTargets.add(PDBDocField.GENE_NAME);
231     searchableTargets.add(PDBDocField.GENUS);
232     searchableTargets.add(PDBDocField.ALL);
233
234     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
235     {
236       @Override
237       public int compare(PDBDocField o1, PDBDocField o2)
238       {
239         return o1.getName().compareTo(o2.getName());
240       }
241     });
242
243     for (PDBDocField searchTarget : searchableTargets)
244     {
245       cmb_searchTarget.addItem(searchTarget);
246     }
247   }
248
249 }