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.api.FTSRestClientI;
18 import jalview.fts.core.FTSDataColumnPreferences;
19 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
20 import jalview.fts.core.FTSRestRequest;
21 import jalview.fts.core.FTSRestResponse;
22 import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient;
23 import jalview.jbgui.FilterOption;
24 import jalview.util.MessageManager;
27 * logic for querying the 3DBeacons API for structures of sequences
31 public class ThreeDBStructureChooserQuerySource
32 extends StructureChooserQuerySource
35 private static int MAX_QLENGTH = 7820;
37 protected FTSRestRequest lastTdbRequest;
39 protected FTSRestClientI tdbRestClient;
41 public ThreeDBStructureChooserQuerySource()
43 tdbRestClient = TDBeaconsFTSRestClient.getInstance();
44 docFieldPrefs = new FTSDataColumnPreferences(
45 PreferenceSource.STRUCTURE_CHOOSER,
46 TDBeaconsFTSRestClient.getInstance());
52 * Builds a query string for a given sequences using its DBRef entries
53 * 3d Beacons is only useful for uniprot IDs
55 * the sequences to build a query for
56 * @return the built query string
59 public String buildQuery(SequenceI seq)
61 boolean isPDBRefsFound = false;
62 boolean isUniProtRefsFound = false;
63 StringBuilder queryBuilder = new StringBuilder();
64 Set<String> seqRefs = new LinkedHashSet<>();
67 * note PDBs as DBRefEntry so they are not duplicated in query
69 Set<String> pdbids = new HashSet<>();
71 List<DBRefEntry> refs = seq.getDBRefs();
72 if (refs != null && refs.size() != 0)
74 for (int ib = 0, nb = refs.size(); ib < nb; ib++)
76 DBRefEntry dbRef = refs.get(ib);
77 if (isValidSeqName(getDBRefId(dbRef))
78 && queryBuilder.length() < MAX_QLENGTH)
80 if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) && dbRef.isCanonical())
82 // TODO: pick best Uniprot accession
83 isUniProtRefsFound=true;
84 return getDBRefId(dbRef);
96 * Ensures sequence ref names are not less than 3 characters and does not
97 * contain a database name
102 static boolean isValidSeqName(String seqName)
104 // System.out.println("seqName : " + seqName);
105 String ignoreList = "pdb,uniprot,swiss-prot";
106 if (seqName.length() < 3)
110 if (seqName.contains(":"))
114 seqName = seqName.toLowerCase();
115 for (String ignoredEntry : ignoreList.split(","))
117 if (seqName.contains(ignoredEntry))
125 static String getDBRefId(DBRefEntry dbRef)
127 String ref = dbRef.getAccessionId().replaceAll("GO:", "");
132 * FTSRestClient specific query builder to recover associated structure data
133 * records for a sequence
136 * - seq to generate a query for
137 * @param wantedFields
138 * - fields to retrieve
139 * @param selectedFilterOpt
140 * - criterion for ranking results (e.g. resolution)
142 * - sort ascending or descending
146 public FTSRestResponse fetchStructuresMetaData(SequenceI seq,
147 Collection<FTSDataColumnI> wantedFields,
148 FilterOption selectedFilterOpt, boolean b) throws Exception
150 FTSRestResponse resultList;
151 FTSRestRequest tdbRequest = getTDBeaconsRequest(seq, wantedFields);
152 resultList = tdbRestClient.executeRequest(tdbRequest);
154 lastTdbRequest = tdbRequest;
159 private FTSRestRequest getTDBeaconsRequest(SequenceI seq, Collection<FTSDataColumnI> wantedFields)
161 FTSRestRequest pdbRequest = new FTSRestRequest();
162 pdbRequest.setAllowEmptySeq(false);
163 pdbRequest.setResponseSize(500);
164 pdbRequest.setWantedFields(wantedFields);
165 String query = buildQuery(seq);
169 pdbRequest.setSearchTerm(query + ".json");
170 pdbRequest.setAssociatedSequence(seq);
175 public List<FilterOption> getAvailableFilterOptions(String VIEWS_FILTER)
177 List<FilterOption> filters = new ArrayList<FilterOption>();
178 filters.add(new FilterOption(
179 MessageManager.getString("label.best_quality"),
180 "overall_quality", VIEWS_FILTER, false));
181 filters.add(new FilterOption(
182 MessageManager.getString("label.best_resolution"),
183 "resolution", VIEWS_FILTER, false));
184 filters.add(new FilterOption(
185 MessageManager.getString("label.most_protein_chain"),
186 "number_of_protein_chains", VIEWS_FILTER, false));
187 filters.add(new FilterOption(
188 MessageManager.getString("label.most_bound_molecules"),
189 "number_of_bound_molecules", VIEWS_FILTER, false));
190 filters.add(new FilterOption(
191 MessageManager.getString("label.most_polymer_residues"),
192 "number_of_polymer_residues", VIEWS_FILTER, true));
197 * FTSRestClient specific query builder to pick top ranked entry from a
198 * fetchStructuresMetaData query
201 * - seq to generate a query for
202 * @param wantedFields
203 * - fields to retrieve
204 * @param selectedFilterOpt
205 * - criterion for ranking results (e.g. resolution)
207 * - sort ascending or descending
211 public FTSRestResponse selectFirstRankedQuery(SequenceI seq,
212 Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
213 boolean b) throws Exception
216 FTSRestResponse resultList;
217 FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
218 if (pdbRequest == null) {
221 pdbRequest.setResponseSize(1);
222 resultList = tdbRestClient.executeRequest(pdbRequest);
224 // TODO: client side filtering - sort results and pick top one (or N)
226 lastTdbRequest = pdbRequest;
231 public PDBEntry[] collectSelectedRows(JTable restable, int[] selectedRows,
232 List<SequenceI> selectedSeqsToView)
234 int refSeqColIndex = restable.getColumn("Ref Sequence")
237 PDBEntry[] pdbEntriesToView=new PDBEntry[selectedRows.length];
239 int idColumnIndex = restable.getColumn("Model id").getModelIndex();
240 int urlColumnIndex = restable.getColumn("Url").getModelIndex();
241 int typeColumnIndex = restable.getColumn("Provider").getModelIndex();
242 int categoryColumnIndex = restable.getColumn("Model Category").getModelIndex();
244 for (int row : selectedRows)
246 // unique id - could be a horrible hash
248 String pdbIdStr = restable.getValueAt(row,idColumnIndex)
250 String urlStr = restable.getValueAt(row,urlColumnIndex)
252 String typeColumn = restable.getValueAt(row,typeColumnIndex)
254 SequenceI selectedSeq = (SequenceI) restable.getValueAt(row,
256 selectedSeqsToView.add(selectedSeq);
257 PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr);
258 if (pdbEntry == null)
260 pdbEntry = getFindEntry(pdbIdStr,
261 selectedSeq.getAllPDBEntries());
264 if (pdbEntry == null)
266 pdbEntry = new PDBEntry();
267 pdbEntry.setId(pdbIdStr);
268 pdbEntry.setType(PDBEntry.Type.MMCIF);
269 if (!"PDBe".equalsIgnoreCase(typeColumn))
271 pdbEntry.setRetrievalUrl(urlStr);
273 selectedSeq.getDatasetSequence().addPDBId(pdbEntry);
275 pdbEntriesToView[count++] = pdbEntry;
277 return pdbEntriesToView;
282 protected FTSRestRequest getLastFTSRequest()
284 return lastTdbRequest;