X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2Fstructurechooser%2FThreeDBStructureChooserQuerySource.java;h=7a311f87c8c206d2ab406e88401eb06be185c78f;hb=41b0e9331ac71787c1280aa1d809f54c575fbf97;hp=e5f96be4be2f63159f383d0e7fe0bcc72e022cda;hpb=e36731274aafe1e930805c19a0f60372c4c6392a;p=jalview.git diff --git a/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java b/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java index e5f96be..7a311f8 100644 --- a/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java +++ b/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java @@ -3,11 +3,11 @@ package jalview.gui.structurechooser; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import javax.swing.JTable; @@ -25,7 +25,6 @@ import jalview.fts.core.FTSRestRequest; import jalview.fts.core.FTSRestResponse; import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient; import jalview.jbgui.FilterOption; -import jalview.util.MessageManager; /** * logic for querying the 3DBeacons API for structures of sequences @@ -36,6 +35,14 @@ public class ThreeDBStructureChooserQuerySource extends StructureChooserQuerySource { + private Set tdBeaconsFilters = null, defaultFilters = null; + + public static final String FILTER_TDBEACONS_COVERAGE = "3d_beacons_coverage"; + + public static final String FILTER_FIRST_BEST_COVERAGE = "3d_beacons_first_best_coverage"; + + private static final String FILTER_SOURCE_PREFIX = "only_"; + private static int MAX_QLENGTH = 7820; protected FTSRestRequest lastTdbRequest; @@ -46,11 +53,14 @@ public class ThreeDBStructureChooserQuerySource public ThreeDBStructureChooserQuerySource() { + defaultFilters = new LinkedHashSet(); + defaultFilters.add(FILTER_TDBEACONS_COVERAGE); + defaultFilters.add(FILTER_FIRST_BEST_COVERAGE); + tdbRestClient = TDBeaconsFTSRestClient.getInstance(); docFieldPrefs = new FTSDataColumnPreferences( PreferenceSource.STRUCTURE_CHOOSER, TDBeaconsFTSRestClient.getInstance()); - } /** @@ -75,26 +85,38 @@ public class ThreeDBStructureChooserQuerySource Set pdbids = new HashSet<>(); List refs = seq.getDBRefs(); + int ib = checkUniprotRefs(refs); + if (ib>-1) + { + return getDBRefId(refs.get(ib)); + } + return null; + } + + /** + * Searches DBRefEntry for uniprot refs + * @param seq + * @return -2 if no uniprot refs, -1 if no canonical ref., otherwise index of Uniprot canonical DBRefEntry + */ + public static int checkUniprotRefs(List refs) + { + boolean hasUniprot = false; if (refs != null && refs.size() != 0) { for (int ib = 0, nb = refs.size(); ib < nb; ib++) { DBRefEntry dbRef = refs.get(ib); - if (isValidSeqName(getDBRefId(dbRef)) - && queryBuilder.length() < MAX_QLENGTH) + if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT)) { - if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) - && dbRef.isCanonical()) + hasUniprot = true; + if (dbRef.isCanonical()) { - // TODO: pick best Uniprot accession - isUniProtRefsFound = true; - return getDBRefId(dbRef); - + return ib; } } } } - return null; + return hasUniprot ? -1 : -2; } /** @@ -116,7 +138,7 @@ public class ThreeDBStructureChooserQuerySource { return false; } - seqName = seqName.toLowerCase(); + seqName = seqName.toLowerCase(Locale.ROOT); for (String ignoredEntry : ignoreList.split(",")) { if (seqName.contains(ignoredEntry)) @@ -153,11 +175,40 @@ public class ThreeDBStructureChooserQuerySource FilterOption selectedFilterOpt, boolean b) throws Exception { FTSRestResponse resultList; - FTSRestRequest tdbRequest = getTDBeaconsRequest(seq, wantedFields); - resultList = tdbRestClient.executeRequest(tdbRequest); - - lastTdbRequest = tdbRequest; + if (selectedFilterOpt != null + && tdBeaconsFilter(selectedFilterOpt.getValue())) + { + FTSRestRequest tdbRequest = getTDBeaconsRequest(seq, wantedFields); + resultList = tdbRestClient.executeRequest(tdbRequest); + + lastTdbRequest = tdbRequest; + if (resultList!=null) + { // Query the PDB and add additional metadata + FTSRestResponse pdbResponse = fetchStructuresMetaDataFor( + getPDBQuerySource(), resultList); + FTSRestResponse joinedResp = joinResponses(resultList, pdbResponse); + } + return resultList; + } + // use the PDBFTS directly + resultList = getPDBQuerySource().fetchStructuresMetaData(seq, + wantedFields, selectedFilterOpt, b); + lastTdbRequest = getPDBQuerySource().lastPdbRequest; + lastPdbRequest = lastTdbRequest; // both queries the same - indicates we + // rank using PDBe return resultList; + + } + + PDBStructureChooserQuerySource pdbQuerySource = null; + + private PDBStructureChooserQuerySource getPDBQuerySource() + { + if (pdbQuerySource == null) + { + pdbQuerySource = new PDBStructureChooserQuerySource(); + } + return pdbQuerySource; } private FTSRestRequest getTDBeaconsRequest(SequenceI seq, @@ -180,26 +231,89 @@ public class ThreeDBStructureChooserQuerySource @Override public List getAvailableFilterOptions(String VIEWS_FILTER) { - List filters = new ArrayList(); - filters.add( - new FilterOption(MessageManager.getString("label.best_quality"), - "overall_quality", VIEWS_FILTER, false)); - filters.add(new FilterOption( - MessageManager.getString("label.best_resolution"), "resolution", - VIEWS_FILTER, false)); - filters.add(new FilterOption( - MessageManager.getString("label.most_protein_chain"), - "number_of_protein_chains", VIEWS_FILTER, false)); - filters.add(new FilterOption( - MessageManager.getString("label.most_bound_molecules"), - "number_of_bound_molecules", VIEWS_FILTER, false)); - filters.add(new FilterOption( - MessageManager.getString("label.most_polymer_residues"), - "number_of_polymer_residues", VIEWS_FILTER, true)); + List filters = getPDBQuerySource() + .getAvailableFilterOptions(VIEWS_FILTER); + tdBeaconsFilters = new LinkedHashSet(); + tdBeaconsFilters.addAll(defaultFilters); + filters.add(0, new FilterOption("Best 3D-Beacons Coverage", + FILTER_FIRST_BEST_COVERAGE, VIEWS_FILTER, false, this)); + filters.add(1, new FilterOption("Multiple 3D-Beacons Coverage", + FILTER_TDBEACONS_COVERAGE, VIEWS_FILTER, true, this)); return filters; } + @Override + public void updateAvailableFilterOptions(String VIEWS_FILTER, + List xtantOptions, Collection tdbEntries) + { + if (tdbEntries != null && lastTdbRequest != null) + { + int prov_idx = lastTdbRequest.getFieldIndex("Provider"); + boolean hasPDBe=false; + for (FTSData row : tdbEntries) + { + String provider = (String) row.getSummaryData()[prov_idx]; + FilterOption providerOpt = new FilterOption( + "3DB Provider - " + provider, + FILTER_SOURCE_PREFIX + provider, VIEWS_FILTER, false, this); + if (!xtantOptions.contains(providerOpt)) + { + xtantOptions.add(1, providerOpt); + tdBeaconsFilters.add(FILTER_SOURCE_PREFIX + provider); + if ("PDBe".equalsIgnoreCase(provider)) + { + hasPDBe=true; + } + } + } + if (!hasPDBe) + { + // remove the PDBe options from the available filters + int op=0; + while (op wantedFields, String fieldToFilterBy, boolean b) throws Exception { + if (fieldToFilterBy != null && tdBeaconsFilter(fieldToFilterBy)) + { + TDBResultAnalyser analyser = new TDBResultAnalyser(seq, + collectedResults, lastTdbRequest, fieldToFilterBy, + remove_prefix(fieldToFilterBy)); - TDBResultAnalyser analyser= new TDBResultAnalyser(seq,collectedResults, lastTdbRequest); - - - FTSRestResponse resultList = new FTSRestResponse(); + FTSRestResponse resultList = new FTSRestResponse(); - List filteredResponse = analyser.getFilteredResponse(); - - List selectedStructures = analyser.selectStructures(filteredResponse); - resultList.setNumberOfItemsFound(selectedStructures.size()); - resultList.setSearchSummary(selectedStructures); - return resultList; + List filteredResponse = analyser.getFilteredResponse(); + + List selectedStructures = analyser + .selectStructures(filteredResponse); + resultList.setNumberOfItemsFound(selectedStructures.size()); + resultList.setSearchSummary(selectedStructures); + return resultList; + } + // Fall back to PDBe rankings + return getPDBQuerySource().selectFirstRankedQuery(seq, collectedResults, + wantedFields, fieldToFilterBy, b); } @Override @@ -245,31 +366,35 @@ public class ThreeDBStructureChooserQuerySource int idColumnIndex = restable.getColumn("Model id").getModelIndex(); int urlColumnIndex = restable.getColumn("Url").getModelIndex(); int typeColumnIndex = restable.getColumn("Provider").getModelIndex(); + int humanUrl = restable.getColumn("Page URL").getModelIndex(); int categoryColumnIndex = restable.getColumn("Model Category") .getModelIndex(); - final int up_start_idx = restable.getColumn("Uniprot Start").getModelIndex(); - final int up_end_idx = restable.getColumn("Uniprot End").getModelIndex(); - int i=0; - + final int up_start_idx = restable.getColumn("Uniprot Start") + .getModelIndex(); + final int up_end_idx = restable.getColumn("Uniprot End") + .getModelIndex(); + int i = 0; + // bleugh! Integer[] sellist = new Integer[selectedRows.length]; - for (Integer row: selectedRows) + for (Integer row : selectedRows) { sellist[i++] = row; } // Sort rows by coverage - Arrays.sort(sellist,new Comparator() + Arrays.sort(sellist, new Comparator() { @Override public int compare(Integer o1, Integer o2) { - int o1_xt = ((Integer)restable.getValueAt(o1, up_end_idx)) - (Integer)restable.getValueAt(o1, up_start_idx); - int o2_xt = ((Integer)restable.getValueAt(o2, up_end_idx)) - (Integer)restable.getValueAt(o2, up_start_idx); - return o2_xt-o1_xt; + int o1_xt = ((Integer) restable.getValueAt(o1, up_end_idx)) + - (Integer) restable.getValueAt(o1, up_start_idx); + int o2_xt = ((Integer) restable.getValueAt(o2, up_end_idx)) + - (Integer) restable.getValueAt(o2, up_start_idx); + return o2_xt - o1_xt; } }); - for (int row : sellist) { // unique id - could be a horrible hash @@ -278,6 +403,8 @@ public class ThreeDBStructureChooserQuerySource String urlStr = restable.getValueAt(row, urlColumnIndex).toString(); String typeColumn = restable.getValueAt(row, typeColumnIndex) .toString(); + String modelPage = humanUrl < 1 ? null + : (String) restable.getValueAt(row, humanUrl); SequenceI selectedSeq = (SequenceI) restable.getValueAt(row, refSeqColIndex); selectedSeqsToView.add(selectedSeq); @@ -291,11 +418,17 @@ public class ThreeDBStructureChooserQuerySource { pdbEntry = new PDBEntry(); pdbEntry.setId(pdbIdStr); - pdbEntry.setType(PDBEntry.Type.MMCIF); + boolean hasCif = urlStr.toLowerCase(Locale.ENGLISH).endsWith("cif"); + boolean probablyPdb = urlStr.toLowerCase(Locale.ENGLISH) + .contains("pdb"); + pdbEntry.setType(hasCif ? PDBEntry.Type.MMCIF + : probablyPdb ? PDBEntry.Type.PDB : PDBEntry.Type.FILE); if (!"PDBe".equalsIgnoreCase(typeColumn)) { pdbEntry.setRetrievalUrl(urlStr); } + pdbEntry.setProvider(typeColumn); + pdbEntry.setProviderPage(modelPage); selectedSeq.getDatasetSequence().addPDBId(pdbEntry); } pdbEntriesToView[count++] = pdbEntry; @@ -347,7 +480,10 @@ public class ThreeDBStructureChooserQuerySource { String pdb_Query = buildPDBFTSQueryFor(upResponse); - + if (pdb_Query.length() == 0) + { + return null; + } FTSRestResponse resultList; FTSRestRequest pdbRequest = new FTSRestRequest(); pdbRequest.setAllowEmptySeq(false); @@ -357,6 +493,7 @@ public class ThreeDBStructureChooserQuerySource pdbRequest.setWantedFields( pdbquery.getDocFieldPrefs().getStructureSummaryFields()); pdbRequest.setSearchTerm(pdb_Query + ")"); + resultList = pdbquery.executePDBFTSRestRequest(pdbRequest); lastPdbRequest = pdbRequest; @@ -366,30 +503,48 @@ public class ThreeDBStructureChooserQuerySource public FTSRestResponse joinResponses(FTSRestResponse upResponse, FTSRestResponse pdbResponse) { + boolean hasPdbResp = lastPdbRequest != null; + int idx_provider = getLastFTSRequest().getFieldIndex("Provider"); // join on int idx_modelId = getLastFTSRequest().getFieldIndex("Model id"); - int pdbIdx = lastPdbRequest.getFieldIndex("pdb_id"); - for (FTSData row : upResponse.getSearchSummary()) + int pdbIdx = hasPdbResp ? lastPdbRequest.getFieldIndex("PDB Id") : -1; + int pdbTitle_idx = hasPdbResp ? lastPdbRequest.getFieldIndex("Title") + : -1; + int tdbTitle_idx = getLastFTSRequest().getFieldIndex("Title"); + + List joinedRows = new ArrayList(); + for (final FTSData row : upResponse.getSearchSummary()) { String id = (String) row.getSummaryData()[idx_modelId]; String provider = (String) row.getSummaryData()[idx_provider]; if ("PDBe".equalsIgnoreCase(provider)) { - for (FTSData pdbrow : pdbResponse.getSearchSummary()) + if (!hasPdbResp) + { + System.out.println( + "Warning: seems like we couldn't get to the PDBe search interface."); + } + else { - String pdbid = (String) pdbrow.getSummaryData()[pdbIdx]; - if (id.equalsIgnoreCase(pdbid)) + for (final FTSData pdbrow : pdbResponse.getSearchSummary()) { - // often multiple entries per PDB ID so we bail after first - // get wanted fields - // append to FTSRestResponse array + String pdbid = (String) pdbrow.getSummaryData()[pdbIdx]; + if (id.equalsIgnoreCase(pdbid)) + { + row.getSummaryData()[tdbTitle_idx] = pdbrow + .getSummaryData()[pdbTitle_idx]; + } } } + + } + else + { + row.getSummaryData()[tdbTitle_idx] = "Model from TDB"; } } - // TODO Auto-generated method stub - return null; + return upResponse; } } \ No newline at end of file