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;
extends StructureChooserQuerySource
{
+ private static final String FILTER_TDBEACONS_COVERAGE = "3d_beacons_coverage";
+
private static int MAX_QLENGTH = 7820;
protected FTSRestRequest lastTdbRequest;
PreferenceSource.STRUCTURE_CHOOSER,
TDBeaconsFTSRestClient.getInstance());
- }
+ }
/**
* Builds a query string for a given sequences using its DBRef entries 3d
FilterOption selectedFilterOpt, boolean b) throws Exception
{
FTSRestResponse resultList;
+ if (tdBeaconsFilter(selectedFilterOpt.getValue())) {
FTSRestRequest tdbRequest = getTDBeaconsRequest(seq, wantedFields);
resultList = tdbRestClient.executeRequest(tdbRequest);
lastTdbRequest = tdbRequest;
+
+ // 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,
@Override
public List<FilterOption> getAvailableFilterOptions(String VIEWS_FILTER)
{
- List<FilterOption> filters = new ArrayList<FilterOption>();
- 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<FilterOption> filters = getPDBQuerySource().getAvailableFilterOptions(VIEWS_FILTER);
+
+ filters.add(0,
+ new FilterOption("3D-Beacons Coverage",
+ FILTER_TDBEACONS_COVERAGE, VIEWS_FILTER, true, this));
return filters;
}
+ private boolean tdBeaconsFilter(String fieldToFilterBy)
+ {
+ return FILTER_TDBEACONS_COVERAGE.equals(fieldToFilterBy);
+ }
+ @Override
+ public boolean needsRefetch(FilterOption selectedFilterOpt)
+ {
+ return tdBeaconsFilter(selectedFilterOpt.getValue()) && lastPdbRequest!=lastTdbRequest;
+ }
/**
* FTSRestClient specific query builder to pick top ranked entry from a
* fetchStructuresMetaData query
* @throws Exception
*/
public FTSRestResponse selectFirstRankedQuery(SequenceI seq,
+ Collection<FTSData> collectedResults,
Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
boolean b) throws Exception
{
-
- FTSRestResponse resultList;
- FTSRestRequest pdbRequest = getTDBeaconsRequest(seq, wantedFields);
- if (pdbRequest == null)
+ if (tdBeaconsFilter(fieldToFilterBy))
{
- return null;
- }
- pdbRequest.setResponseSize(1);
- resultList = tdbRestClient.executeRequest(pdbRequest);
+ TDBResultAnalyser analyser = new TDBResultAnalyser(seq,
+ collectedResults, lastTdbRequest);
- // TODO: client side filtering - sort results and pick top one (or N)
+ FTSRestResponse resultList = new FTSRestResponse();
- lastTdbRequest = pdbRequest;
- return resultList;
+ List<FTSData> filteredResponse = analyser.getFilteredResponse();
+
+ List<FTSData> 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
public PDBEntry[] collectSelectedRows(JTable restable, int[] selectedRows,
List<SequenceI> selectedSeqsToView)
int typeColumnIndex = restable.getColumn("Provider").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;
+
+ // bleugh!
+ Integer[] sellist = new Integer[selectedRows.length];
+ for (Integer row: selectedRows)
+ {
+ sellist[i++] = row;
+ }
+ // Sort rows by coverage
+ Arrays.sort(sellist,new Comparator<Integer>()
+ {
+ @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;
+ }
+ });
- for (int row : selectedRows)
+
+ for (int row : sellist)
{
// unique id - could be a horrible hash
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 = lastPdbRequest.getFieldIndex("PDB Id");
+ int pdbTitle_idx = lastPdbRequest.getFieldIndex("Title");
+ int tdbTitle_idx = getLastFTSRequest().getFieldIndex("Title");
+
+ List<FTSData> joinedRows = new ArrayList<FTSData>();
+ 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())
+ for (final FTSData pdbrow : pdbResponse.getSearchSummary())
{
String pdbid = (String) pdbrow.getSummaryData()[pdbIdx];
if (id.equalsIgnoreCase(pdbid))
{
- // often multiple entries per PDB ID so we bail after first
- // get wanted fields
- // append to FTSRestResponse array
+ 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