+ @Override
+ public int compare(FTSData o1, FTSData o2)
+ {
+ int o1_s = (Integer) o1.getSummaryData()[idx_ups];
+ int o1_e = (Integer) o1.getSummaryData()[idx_upe];
+ int o1_cat = scoreCategory((String) o1.getSummaryData()[idx_mcat]);
+ int o2_s = (Integer) o2.getSummaryData()[idx_ups];
+ int o2_e = (Integer) o2.getSummaryData()[idx_upe];
+ int o2_cat = scoreCategory((String) o2.getSummaryData()[idx_mcat]);
+
+ if (o1_cat == o2_cat)
+ {
+ if (o1_s == o2_s)
+ {
+ int o1_xtent = o1_e - o1_s;
+ int o2_xtent = o2_e - o2_s;
+ if (o1_xtent == o2_xtent)
+ {
+ if (o1_cat == scoreCategory(EXP_CATEGORIES.get(0)))
+ {
+ // experimental structures, so rank on quality
+ double o1_res = (Double) o1.getSummaryData()[idx_resol];
+ double o2_res = (Double) o2.getSummaryData()[idx_resol];
+ return (o2_res < o1_res) ? 1 : (o2_res == o1_res) ? 0 : -1;
+ }
+ else
+ {
+ // models, so rank on qmean
+ float o1_mq = (Float) o1.getSummaryData()[idx_mqual];
+ float o2_mq = (Float) o2.getSummaryData()[idx_mqual];
+ return (o2_mq < o1_mq) ? 1 : (o2_mq == o1_mq) ? 0 : -1;
+ }
+ }
+ else
+ {
+ return o1_xtent - o2_xtent;
+ }
+ }
+ else
+ {
+ return o1_s - o2_s;
+ }
+ }
+ else
+ {
+ return o2_cat - o1_cat;
+ }
+ }