1 package jalview.gui.structurechooser;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.BitSet;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.Comparator;
11 import jalview.datamodel.SequenceI;
12 import jalview.fts.api.FTSData;
13 import jalview.fts.core.FTSRestRequest;
15 public class TDBResultAnalyser
19 * model categories - update as needed. warnings output if unknown types
22 * Order denotes 'trust'
24 private static List<String> EXP_CATEGORIES = Arrays
26 { "EXPERIMENTALLY DETERMINED", "DEEP-LEARNING",
29 private SequenceI seq;
31 private Collection<FTSData> collectedResults;
33 private FTSRestRequest lastTdbRequest;
41 private int idx_mqual;
43 private int idx_resol;
48 private String filter=null;
50 * limit to particular source
52 private String sourceFilter=null;
54 private int idx_mprov;
56 public TDBResultAnalyser(SequenceI seq,
57 Collection<FTSData> collectedResults,
58 FTSRestRequest lastTdbRequest, String fieldToFilterBy, String string)
61 this.collectedResults = collectedResults;
62 this.lastTdbRequest = lastTdbRequest;
63 this.filter = fieldToFilterBy;
64 this.sourceFilter = string;
65 idx_ups = lastTdbRequest.getFieldIndex("Uniprot Start");
66 idx_upe = lastTdbRequest.getFieldIndex("Uniprot End");
67 idx_mcat = lastTdbRequest.getFieldIndex("Model Category");
68 idx_mprov = lastTdbRequest.getFieldIndex("Provider");
69 idx_mqual = lastTdbRequest.getFieldIndex("Confidence");
70 idx_resol = lastTdbRequest.getFieldIndex("Resolution");
72 private final int scoreCategory(String cat)
75 int idx = EXP_CATEGORIES.indexOf(cat.toUpperCase());
78 System.out.println("Unknown category: '" + cat + "'");
80 return -EXP_CATEGORIES.size() - idx;
84 * sorts records discovered by 3D beacons and excludes any that don't
85 * intersect with the sequence's start/end rage
89 public List<FTSData> getFilteredResponse()
91 List<FTSData> filteredResponse = new ArrayList<FTSData>();
93 // ignore anything outside the sequence region
94 for (FTSData row : collectedResults)
96 int up_s = (Integer) row.getSummaryData()[idx_ups];
97 int up_e = (Integer) row.getSummaryData()[idx_upe];
98 String provider = (String) row.getSummaryData()[idx_mprov];
99 if (sourceFilter == null || sourceFilter.equals(provider))
101 if (seq == row.getSummaryData()[0] && up_e > seq.getStart()
102 && up_s < seq.getEnd())
104 filteredResponse.add(row);
108 // sort according to decreasing length,
110 Collections.sort(filteredResponse, new Comparator<FTSData>()
113 public int compare(FTSData o1, FTSData o2)
115 Object[] o1data = o1.getSummaryData();
116 Object[] o2data = o2.getSummaryData();
117 int o1_s = (Integer) o1data[idx_ups];
118 int o1_e = (Integer) o1data[idx_upe];
119 int o1_cat = scoreCategory((String) o1data[idx_mcat]);
120 int o2_s = (Integer) o2data[idx_ups];
121 int o2_e = (Integer) o2data[idx_upe];
122 int o2_cat = scoreCategory((String) o2data[idx_mcat]);
124 if (o1_cat == o2_cat)
128 int o1_xtent = o1_e - o1_s;
129 int o2_xtent = o2_e - o2_s;
130 if (o1_xtent == o2_xtent)
132 if (o1_cat == scoreCategory(EXP_CATEGORIES.get(0)))
134 // experimental structures, so rank on quality
135 double o1_res = (Double) o1data[idx_resol];
136 double o2_res = (Double) o2data[idx_resol];
137 return (o2_res < o1_res) ? 1 : (o2_res == o1_res) ? 0 : -1;
141 // models, so rank on qmean
142 float o1_mq = (Float) o1data[idx_mqual];
143 float o2_mq = (Float) o2data[idx_mqual];
144 return (o2_mq < o1_mq) ? 1 : (o2_mq == o1_mq) ? 0 : -1;
149 return o1_xtent - o2_xtent;
159 return o2_cat - o1_cat;
164 public boolean equals(Object obj)
166 return super.equals(obj);
169 return filteredResponse;
173 * return list of structures to be marked as selected for this sequence according to given criteria
174 * @param filteredStructures - sorted, filtered structures from getFilteredResponse
177 public List<FTSData> selectStructures(List<FTSData> filteredStructures)
179 List<FTSData> selected = new ArrayList<FTSData>();
180 BitSet cover = new BitSet();
181 cover.set(seq.getStart(),seq.getEnd());
182 // walk down the list of structures, selecting some to add to selected
183 for (FTSData structure:filteredStructures)
185 Object[] odata=structure.getSummaryData();
186 int o1_s = (Integer) odata[idx_ups];
187 int o1_e = (Integer) odata[idx_upe];
188 int o1_cat = scoreCategory((String) odata[idx_mcat]);
189 BitSet scover = new BitSet();
190 // measure intersection
191 scover.set(o1_s,o1_e);
193 if (scover.cardinality()>4)
195 selected.add(structure);
196 // clear the range covered by this structure
197 cover.andNot(scover);
200 // final step is to sort on length - this might help the superposition process
201 Collections.sort(selected,new Comparator<FTSData>()
204 public int compare(FTSData o1, FTSData o2)
206 Object[] o1data = o1.getSummaryData();
207 Object[] o2data = o2.getSummaryData();
208 int o1_xt = ((Integer) o1data[idx_upe]) - ((Integer) o1data[idx_ups]);
209 int o1_cat = scoreCategory((String) o1data[idx_mcat]);
210 int o2_xt = ((Integer) o2data[idx_upe]-(Integer) o2data[idx_ups]);
211 int o2_cat = scoreCategory((String) o2data[idx_mcat]);
215 if (filter.equals(ThreeDBStructureChooserQuerySource.FILTER_FIRST_BEST_COVERAGE))
217 return selected.subList(0, 1);