1 package jalview.gui.structurechooser;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashSet;
6 import java.util.LinkedHashSet;
10 import javax.swing.JTable;
12 import jalview.datamodel.DBRefEntry;
13 import jalview.datamodel.DBRefSource;
14 import jalview.datamodel.PDBEntry;
15 import jalview.datamodel.SequenceI;
16 import jalview.fts.api.FTSDataColumnI;
17 import jalview.fts.core.FTSDataColumnPreferences;
18 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
19 import jalview.fts.core.FTSRestRequest;
20 import jalview.fts.core.FTSRestResponse;
21 import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient;
22 import jalview.jbgui.FilterOption;
23 import jalview.util.MessageManager;
26 * logic for querying the PDBe API for structures of sequences
30 public class ThreeDBStructureChooserQuerySource
31 extends StructureChooserQuerySource
34 private static int MAX_QLENGTH = 7820;
36 public ThreeDBStructureChooserQuerySource()
38 pdbRestClient = TDBeaconsFTSRestClient.getInstance();
39 docFieldPrefs = new FTSDataColumnPreferences(
40 PreferenceSource.STRUCTURE_CHOOSER,
41 TDBeaconsFTSRestClient.getInstance());
47 * Builds a query string for a given sequences using its DBRef entries
48 * 3d Beacons is only useful for uniprot IDs
50 * the sequences to build a query for
51 * @return the built query string
54 public String buildQuery(SequenceI seq)
56 boolean isPDBRefsFound = false;
57 boolean isUniProtRefsFound = false;
58 StringBuilder queryBuilder = new StringBuilder();
59 Set<String> seqRefs = new LinkedHashSet<>();
62 * note PDBs as DBRefEntry so they are not duplicated in query
64 Set<String> pdbids = new HashSet<>();
66 List<DBRefEntry> refs = seq.getDBRefs();
67 if (refs != null && refs.size() != 0)
69 for (int ib = 0, nb = refs.size(); ib < nb; ib++)
71 DBRefEntry dbRef = refs.get(ib);
72 if (isValidSeqName(getDBRefId(dbRef))
73 && queryBuilder.length() < MAX_QLENGTH)
75 if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) && dbRef.isCanonical())
77 // TODO: pick best Uniprot accession
78 isUniProtRefsFound=true;
79 return getDBRefId(dbRef);
91 * Ensures sequence ref names are not less than 3 characters and does not
92 * contain a database name
97 static boolean isValidSeqName(String seqName)
99 // System.out.println("seqName : " + seqName);
100 String ignoreList = "pdb,uniprot,swiss-prot";
101 if (seqName.length() < 3)
105 if (seqName.contains(":"))
109 seqName = seqName.toLowerCase();
110 for (String ignoredEntry : ignoreList.split(","))
112 if (seqName.contains(ignoredEntry))
120 static String getDBRefId(DBRefEntry dbRef)
122 String ref = dbRef.getAccessionId().replaceAll("GO:", "");
127 * FTSRestClient specific query builder to recover associated structure data
128 * records for a sequence
131 * - seq to generate a query for
132 * @param wantedFields
133 * - fields to retrieve
134 * @param selectedFilterOpt
135 * - criterion for ranking results (e.g. resolution)
137 * - sort ascending or descending
141 public FTSRestResponse fetchStructuresMetaData(SequenceI seq,
142 Collection<FTSDataColumnI> wantedFields,
143 FilterOption selectedFilterOpt, boolean b) throws Exception
145 FTSRestResponse resultList;
146 FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
147 resultList = pdbRestClient.executeRequest(pdbRequest);
149 lastPdbRequest = pdbRequest;
154 private FTSRestRequest getTDBeaconsRequest(SequenceI seq, Collection<FTSDataColumnI> wantedFields)
156 FTSRestRequest pdbRequest = new FTSRestRequest();
157 pdbRequest.setAllowEmptySeq(false);
158 pdbRequest.setResponseSize(500);
159 pdbRequest.setWantedFields(wantedFields);
160 String query = buildQuery(seq);
164 pdbRequest.setSearchTerm(query + ".json");
165 pdbRequest.setAssociatedSequence(seq);
170 public List<FilterOption> getAvailableFilterOptions(String VIEWS_FILTER)
172 List<FilterOption> filters = new ArrayList<FilterOption>();
173 filters.add(new FilterOption(
174 MessageManager.getString("label.best_quality"),
175 "overall_quality", VIEWS_FILTER, false));
176 filters.add(new FilterOption(
177 MessageManager.getString("label.best_resolution"),
178 "resolution", VIEWS_FILTER, false));
179 filters.add(new FilterOption(
180 MessageManager.getString("label.most_protein_chain"),
181 "number_of_protein_chains", VIEWS_FILTER, false));
182 filters.add(new FilterOption(
183 MessageManager.getString("label.most_bound_molecules"),
184 "number_of_bound_molecules", VIEWS_FILTER, false));
185 filters.add(new FilterOption(
186 MessageManager.getString("label.most_polymer_residues"),
187 "number_of_polymer_residues", VIEWS_FILTER, true));
192 * FTSRestClient specific query builder to pick top ranked entry from a
193 * fetchStructuresMetaData query
196 * - seq to generate a query for
197 * @param wantedFields
198 * - fields to retrieve
199 * @param selectedFilterOpt
200 * - criterion for ranking results (e.g. resolution)
202 * - sort ascending or descending
206 public FTSRestResponse selectFirstRankedQuery(SequenceI seq,
207 Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
208 boolean b) throws Exception
211 FTSRestResponse resultList;
212 FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
213 if (pdbRequest == null) {
216 pdbRequest.setResponseSize(1);
217 resultList = pdbRestClient.executeRequest(pdbRequest);
219 // TODO: client side filtering - sort results and pick top one (or N)
221 lastPdbRequest = pdbRequest;
226 public PDBEntry[] collectSelectedRows(JTable restable, int[] selectedRows,
227 List<SequenceI> selectedSeqsToView)
229 int refSeqColIndex = restable.getColumn("Ref Sequence")
232 PDBEntry[] pdbEntriesToView=new PDBEntry[selectedRows.length];
234 int idColumnIndex = restable.getColumn("Model id").getModelIndex();
235 int urlColumnIndex = restable.getColumn("Url").getModelIndex();
236 int typeColumnIndex = restable.getColumn("Provider").getModelIndex();
237 int categoryColumnIndex = restable.getColumn("Model Category").getModelIndex();
239 for (int row : selectedRows)
241 // unique id - could be a horrible hash
243 String pdbIdStr = restable.getValueAt(row,idColumnIndex)
245 String urlStr = restable.getValueAt(row,urlColumnIndex)
247 String typeColumn = restable.getValueAt(row,typeColumnIndex)
249 SequenceI selectedSeq = (SequenceI) restable.getValueAt(row,
251 selectedSeqsToView.add(selectedSeq);
252 PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr);
253 if (pdbEntry == null)
255 pdbEntry = getFindEntry(pdbIdStr,
256 selectedSeq.getAllPDBEntries());
259 if (pdbEntry == null)
261 pdbEntry = new PDBEntry();
262 pdbEntry.setId(pdbIdStr);
263 pdbEntry.setType(PDBEntry.Type.MMCIF);
264 if (!"PDBe".equalsIgnoreCase(typeColumn))
266 pdbEntry.setRetrievalUrl(urlStr);
268 selectedSeq.getDatasetSequence().addPDBId(pdbEntry);
270 pdbEntriesToView[count++] = pdbEntry;
272 return pdbEntriesToView;