1 package jalview.gui.structurechooser;
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.LinkedHashSet;
7 import java.util.Objects;
10 import javax.swing.JTable;
11 import javax.swing.table.TableModel;
13 import jalview.datamodel.DBRefEntry;
14 import jalview.datamodel.DBRefSource;
15 import jalview.datamodel.PDBEntry;
16 import jalview.datamodel.SequenceI;
17 import jalview.fts.api.FTSData;
18 import jalview.fts.api.FTSDataColumnI;
19 import jalview.fts.api.FTSRestClientI;
20 import jalview.fts.core.FTSDataColumnPreferences;
21 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
22 import jalview.fts.core.FTSRestRequest;
23 import jalview.fts.core.FTSRestResponse;
24 import jalview.fts.service.pdb.PDBFTSRestClient;
25 import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient;
26 import jalview.jbgui.GStructureChooser.FilterOption;
29 * logic for querying the PDBe API for structures of sequences
33 public class ThreeDBStructureChooserQuerySource
34 extends StructureChooserQuerySource
37 private static int MAX_QLENGTH = 7820;
39 public ThreeDBStructureChooserQuerySource()
41 pdbRestClient = TDBeaconsFTSRestClient.getInstance();
42 docFieldPrefs = new FTSDataColumnPreferences(
43 PreferenceSource.STRUCTURE_CHOOSER,
44 TDBeaconsFTSRestClient.getInstance());
50 * Builds a query string for a given sequences using its DBRef entries
51 * 3d Beacons is only useful for uniprot IDs
53 * the sequences to build a query for
54 * @return the built query string
57 public String buildQuery(SequenceI seq)
59 boolean isPDBRefsFound = false;
60 boolean isUniProtRefsFound = false;
61 StringBuilder queryBuilder = new StringBuilder();
62 Set<String> seqRefs = new LinkedHashSet<>();
65 * note PDBs as DBRefEntry so they are not duplicated in query
67 Set<String> pdbids = new HashSet<>();
69 List<DBRefEntry> refs = seq.getDBRefs();
70 if (refs != null && refs.size() != 0)
72 for (int ib = 0, nb = refs.size(); ib < nb; ib++)
74 DBRefEntry dbRef = refs.get(ib);
75 if (isValidSeqName(getDBRefId(dbRef))
76 && queryBuilder.length() < MAX_QLENGTH)
78 if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) && dbRef.isCanonical())
80 // TODO: pick best Uniprot accession
81 isUniProtRefsFound=true;
82 return getDBRefId(dbRef);
94 * Ensures sequence ref names are not less than 3 characters and does not
95 * contain a database name
100 static boolean isValidSeqName(String seqName)
102 // System.out.println("seqName : " + seqName);
103 String ignoreList = "pdb,uniprot,swiss-prot";
104 if (seqName.length() < 3)
108 if (seqName.contains(":"))
112 seqName = seqName.toLowerCase();
113 for (String ignoredEntry : ignoreList.split(","))
115 if (seqName.contains(ignoredEntry))
123 static String getDBRefId(DBRefEntry dbRef)
125 String ref = dbRef.getAccessionId().replaceAll("GO:", "");
130 * FTSRestClient specific query builder to recover associated structure data
131 * records for a sequence
134 * - seq to generate a query for
135 * @param wantedFields
136 * - fields to retrieve
137 * @param selectedFilterOpt
138 * - criterion for ranking results (e.g. resolution)
140 * - sort ascending or descending
144 public FTSRestResponse fetchStructuresMetaData(SequenceI seq,
145 Collection<FTSDataColumnI> wantedFields,
146 FilterOption selectedFilterOpt, boolean b) throws Exception
148 FTSRestResponse resultList;
149 FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
150 resultList = pdbRestClient.executeRequest(pdbRequest);
152 lastPdbRequest = pdbRequest;
157 private FTSRestRequest getTDBeaconsRequest(SequenceI seq, Collection<FTSDataColumnI> wantedFields)
159 FTSRestRequest pdbRequest = new FTSRestRequest();
160 pdbRequest.setAllowEmptySeq(false);
161 pdbRequest.setResponseSize(500);
162 pdbRequest.setWantedFields(wantedFields);
163 String query = buildQuery(seq);
167 pdbRequest.setSearchTerm(query + ".json");
168 pdbRequest.setAssociatedSequence(seq);
174 * FTSRestClient specific query builder to pick top ranked entry from a
175 * fetchStructuresMetaData query
178 * - seq to generate a query for
179 * @param wantedFields
180 * - fields to retrieve
181 * @param selectedFilterOpt
182 * - criterion for ranking results (e.g. resolution)
184 * - sort ascending or descending
188 public FTSRestResponse selectFirstRankedQuery(SequenceI seq,
189 Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
190 boolean b) throws Exception
193 FTSRestResponse resultList;
194 FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
195 if (pdbRequest == null) {
198 pdbRequest.setResponseSize(1);
199 resultList = pdbRestClient.executeRequest(pdbRequest);
201 // TODO: client side filtering - sort results and pick top one (or N)
203 lastPdbRequest = pdbRequest;
208 public PDBEntry[] collectSelectedRows(JTable restable, int[] selectedRows,
209 List<SequenceI> selectedSeqsToView)
211 int refSeqColIndex = restable.getColumn("Ref Sequence")
214 PDBEntry[] pdbEntriesToView=new PDBEntry[selectedRows.length];
216 int idColumnIndex = restable.getColumn("Model id").getModelIndex();
217 int urlColumnIndex = restable.getColumn("Url").getModelIndex();
218 int typeColumnIndex = restable.getColumn("Provider").getModelIndex();
219 int categoryColumnIndex = restable.getColumn("Model Category").getModelIndex();
221 for (int row : selectedRows)
223 // unique id - could be a horrible hash
225 String pdbIdStr = restable.getValueAt(row,idColumnIndex)
227 String urlStr = restable.getValueAt(row,urlColumnIndex)
229 String typeColumn = restable.getValueAt(row,typeColumnIndex)
231 SequenceI selectedSeq = (SequenceI) restable.getValueAt(row,
233 selectedSeqsToView.add(selectedSeq);
234 PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr);
235 if (pdbEntry == null)
237 pdbEntry = getFindEntry(pdbIdStr,
238 selectedSeq.getAllPDBEntries());
241 if (pdbEntry == null)
243 pdbEntry = new PDBEntry();
244 pdbEntry.setId(pdbIdStr);
245 pdbEntry.setType(PDBEntry.Type.MMCIF);
246 if (!"PDBe".equalsIgnoreCase(typeColumn))
248 pdbEntry.setRetrievalUrl(urlStr);
250 selectedSeq.getDatasetSequence().addPDBId(pdbEntry);
252 pdbEntriesToView[count++] = pdbEntry;
254 return pdbEntriesToView;