Merge branch 'releases/Release_2_11_4_Branch'
[jalview.git] / src / jalview / gui / structurechooser / TDBResultAnalyser.java
index fcc1ffe..28861d9 100644 (file)
@@ -61,6 +61,8 @@ public class TDBResultAnalyser
 
   private int idx_mqual;
 
+  private int idx_mqualtype;
+
   private int idx_resol;
 
   /**
@@ -91,6 +93,7 @@ public class TDBResultAnalyser
     idx_mprov = lastTdbRequest.getFieldIndex("Provider");
     idx_mqual = lastTdbRequest.getFieldIndex("Confidence");
     idx_resol = lastTdbRequest.getFieldIndex("Resolution");
+    idx_mqualtype = lastTdbRequest.getFieldIndex("Confidence Score Type");
   }
 
   /**
@@ -110,7 +113,7 @@ public class TDBResultAnalyser
     int idx = EXP_CATEGORIES.indexOf(upper_cat);
     if (idx == -1)
     {
-      System.out.println("Unknown category: '" + cat + "'");
+      jalview.bin.Console.outPrintln("Unknown category: '" + cat + "'");
       EXP_CATEGORIES.add(upper_cat);
       idx = EXP_CATEGORIES.size() - 1;
     }
@@ -168,6 +171,8 @@ public class TDBResultAnalyser
         int o2_cat = scoreCategory((String) o2data[idx_mcat]);
         String o2_prov = ((String) o2data[idx_mprov])
                 .toUpperCase(Locale.ROOT);
+        String o1_qualtype = (String) o1data[idx_mqualtype],
+                o2_qualtype = (String) o2data[idx_mqualtype];
 
         if (o1_cat == o2_cat)
         {
@@ -209,6 +214,19 @@ public class TDBResultAnalyser
               }
               else
               {
+                // RANK ON QUALITY - DOWNRANK THOSE WITH NO QUALITY MEASURE
+                if (eitherNull(idx_mqualtype, o1data, o2data))
+                {
+                  return nonNullFirst(idx_mqualtype, o1data, o2data);
+                }
+                // ONLY COMPARE LIKE QUALITY SCORES
+                if (!o1_qualtype.equals(o2_qualtype))
+                {
+                  // prefer LDDT measure over others
+                  return "pLDDT".equals(o1_qualtype) ? -1
+                          : "pLDDT".equals(o2_qualtype) ? 1 : 0;
+                }
+                // OR NO VALUE FOR THE QUALITY
                 if (eitherNull(idx_mqual, o1data, o2data))
                 {
                   return nonNullFirst(idx_mqual, o1data, o2data);
@@ -216,7 +234,8 @@ public class TDBResultAnalyser
                 // models, so rank on qmean - b
                 double o1_mq = (Double) o1data[idx_mqual];
                 double o2_mq = (Double) o2data[idx_mqual];
-                return (o2_mq < o1_mq) ? 1 : (o2_mq == o1_mq) ? 0 : -1;
+                int res = (o2_mq < o1_mq) ? 1 : (o2_mq == o1_mq) ? 0 : -1;
+                return ("pLDDT".equals(o1_qualtype)) ? -res : res;
               }
             }
             else