JAL-1714 improved the new PDB Sequence fetcher by enabling it query multiple PDB...
[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.List;
37
38 import javax.swing.table.DefaultTableModel;
39
40 @SuppressWarnings("serial")
41 public class PDBSearchPanel extends GPDBSearchPanel
42 {
43   private SequenceFetcher seqFetcher;
44
45   private IProgressIndicator progressIdicator;
46
47   private Collection<PDBDocField> wantedFields;
48
49   public PDBSearchPanel(SequenceFetcher seqFetcher)
50   {
51     this.seqFetcher = seqFetcher;
52     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
53             .getProgressIndicator();
54   }
55
56
57   /**
58    * Action performed when an input is detected on txt_search field.
59    */
60   @Override
61   public void txt_search_ActionPerformed()
62   {
63     boolean allowEmptySequence = false;
64     mainFrame.setTitle(MessageManager
65             .getString("label.pdb_sequence_getcher"));
66     tbl_summary.setModel(new DefaultTableModel());
67     if (txt_search.getText().trim().length() > 0)
68     {
69       long startTime = System.currentTimeMillis();
70
71       String searchTarget = ((PDBDocField) cmb_searchTarget
72               .getSelectedItem()).getCode();
73
74       wantedFields = PDBDocFieldPreferences
75               .getSearchSummaryFields();
76
77       String searchTerm = decodeSearchTerm(txt_search.getText(),
78               searchTarget);
79
80       PDBRestRequest request = new PDBRestRequest();
81       request.setAllowEmptySeq(allowEmptySequence);
82       request.setResponseSize(100);
83       request.setFieldToSearchBy("(" + searchTarget + ":");
84       request.setSearchTerm(searchTerm + ")");
85       request.setWantedFields(wantedFields);
86       // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
87       PDBRestClient pdbRestCleint = new PDBRestClient();
88       PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
89       if (resultList.getSearchSummary() != null)
90       {
91         tbl_summary.setModel(PDBRestResponse.getTableModel(request,
92                 resultList.getSearchSummary()));
93       }
94
95       long endTime = System.currentTimeMillis();
96       int resultSetCount = resultList.getNumberOfItemsFound();
97       String result = (resultSetCount > 1) ? MessageManager
98               .getString("label.results") : MessageManager
99               .getString("label.result");
100       mainFrame.setTitle(frameTitle + " - " + resultSetCount + " " + result
101               + " (" + (endTime - startTime) + " milli secs)");
102     }
103   }
104
105   public static String decodeSearchTerm(String enteredText,
106           String targetField)
107   {
108     String foundSearchTerms = enteredText;
109     StringBuilder foundSearchTermsBuilder = new StringBuilder();
110     if (enteredText.contains(";"))
111     {
112       String[] searchTerms = enteredText.split(";");
113       for (String searchTerm : searchTerms)
114       {
115         if (searchTerm.contains(":"))
116         {
117           foundSearchTermsBuilder.append(targetField).append(":")
118                   .append(searchTerm.split(":")[0]).append(" OR ");
119         }
120         else
121         {
122           foundSearchTermsBuilder.append(targetField).append(":")
123                   .append(searchTerm).append(" OR ");
124         }
125       }
126       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
127       foundSearchTerms = foundSearchTermsBuilder.toString();
128       if (foundSearchTerms.contains(" OR "))
129       {
130         foundSearchTerms = foundSearchTerms.substring(
131                 targetField.length() + 1, endIndex);
132       }
133     }
134     else if (enteredText.contains(":"))
135     {
136       foundSearchTerms = foundSearchTerms.split(":")[0];
137     }
138     return foundSearchTerms;
139   }
140
141
142   @Override
143   public void btn_ok_ActionPerformed()
144   {
145     loadSelectedPDBSequencesToAlignment();
146   }
147
148   @Override
149   public void btn_back_ActionPerformed()
150   {
151     mainFrame.dispose();
152     new SequenceFetcher(progressIdicator);
153   }
154
155   @Override
156   public void btn_cancel_ActionPerformed()
157   {
158     mainFrame.dispose();
159   }
160
161   /**
162    * Add the discovered/selected sequences to a target alignment window
163    */
164   public void loadSelectedPDBSequencesToAlignment()
165   {
166     mainFrame.dispose();
167     StringBuilder selectedIds = new StringBuilder();
168     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
169     int[] selectedRows = tbl_summary.getSelectedRows();
170     for (int summaryRow : selectedRows)
171     {
172       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
173               .toString();
174
175       String searchTerm = txt_search.getText();
176       selectedIds.append(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm))
177               .append(";");
178     }
179
180     String ids = selectedIds.toString();
181     // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
182     seqFetcher.textArea.setText(ids);
183     Thread worker = new Thread(seqFetcher);
184     worker.start();
185   }
186
187   public static String getPDBIdwithSpecifiedChain(String pdbId,
188           String searchTerm)
189   {
190     String pdbIdWithChainCode = "";
191     if (searchTerm.contains(";"))
192     {
193       String[] foundTerms = searchTerm.split(";");
194       for (String foundTerm : foundTerms)
195       {
196         if (foundTerm.contains(pdbId))
197         {
198           pdbIdWithChainCode = foundTerm;
199         }
200       }
201     }
202     else if (searchTerm.contains(pdbId))
203     {
204       pdbIdWithChainCode = searchTerm;
205     }
206     else
207     {
208       pdbIdWithChainCode = pdbId;
209     }
210     return pdbIdWithChainCode;
211   }
212
213   /**
214    * Populates search target combo-box options
215    */
216   public void populateCmbSearchTargetOptions()
217   {
218     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
219     searchableTargets.add(PDBDocField.PDB_ID);
220     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
221     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
222     searchableTargets.add(PDBDocField.MOLECULE_NAME);
223     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
224     searchableTargets.add(PDBDocField.GENE_NAME);
225     searchableTargets.add(PDBDocField.GENUS);
226     searchableTargets.add(PDBDocField.ALL);
227
228     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
229     {
230       @Override
231       public int compare(PDBDocField o1, PDBDocField o2)
232       {
233         return o1.getName().compareTo(o2.getName());
234       }
235     });
236
237     for (PDBDocField searchTarget : searchableTargets)
238     {
239       cmb_searchTarget.addItem(searchTarget);
240     }
241   }
242
243 }