JAL-3529 preferentially output source dbrefs or principle db for sequence type before...
authorJim Procter <jprocter@issues.jalview.org>
Fri, 14 Feb 2020 14:27:03 +0000 (14:27 +0000)
committerJim Procter <jprocter@issues.jalview.org>
Fri, 14 Feb 2020 14:27:03 +0000 (14:27 +0000)
src/jalview/io/StockholmFile.java

index 0e73af1..c3b0a69 100644 (file)
@@ -28,12 +28,14 @@ import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
 import jalview.datamodel.Mapping;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ResidueProperties;
 import jalview.util.Comparison;
+import jalview.util.DBRefUtils;
 import jalview.util.Format;
 import jalview.util.MessageManager;
 
@@ -930,6 +932,11 @@ public class StockholmFile extends AlignFile
     return annot;
   }
 
+  private String dbref_to_ac_record(DBRefEntry ref)
+  {
+    return ref.getSource().toString() + " ; "
+            + ref.getAccessionId().toString();
+  }
   @Override
   public String print(SequenceI[] s, boolean jvSuffix)
   {
@@ -944,6 +951,7 @@ public class StockholmFile extends AlignFile
     Hashtable dataRef = null;
     while ((in < s.length) && (s[in] != null))
     {
+      boolean isAA = s[in].isProtein();
       String tmp = printId(s[in], jvSuffix);
       max = Math.max(max, s[in].getLength());
 
@@ -953,17 +961,33 @@ public class StockholmFile extends AlignFile
       }
       if (s[in].getDBRefs() != null)
       {
-        for (int idb = 0; idb < s[in].getDBRefs().length; idb++)
+        if (dataRef == null)
+        {
+          dataRef = new Hashtable();
+        }
+        List<DBRefEntry> primrefs = s[in].getPrimaryDBRefs();
+        if (primrefs.size() >= 1)
+        {
+          dataRef.put(tmp, dbref_to_ac_record(primrefs.get(0)));
+        }
+        else
         {
-          if (dataRef == null)
+          for (int idb = 0; idb < s[in].getDBRefs().length; idb++)
           {
-            dataRef = new Hashtable();
+            DBRefEntry dbref = s[in].getDBRefs()[idb];
+            dataRef.put(tmp, dbref_to_ac_record(dbref));
+            // if we put in a uniprot or EMBL record then we're done:
+            if (isAA && DBRefSource.UNIPROT
+                    .equals(DBRefUtils.getCanonicalName(dbref.getSource())))
+            {
+              break;
+            }
+            if (!isAA && DBRefSource.EMBL
+                    .equals(DBRefUtils.getCanonicalName(dbref.getSource())))
+            {
+              break;
+            }
           }
-
-          String datAs1 = s[in].getDBRefs()[idb].getSource().toString()
-                  + " ; "
-                  + s[in].getDBRefs()[idb].getAccessionId().toString();
-          dataRef.put(tmp, datAs1);
         }
       }
       in++;