JAL-2154 propagate from contig to CDS after constructing CDS sequence, and only propa...
authorJim Procter <jprocter@issues.jalview.org>
Tue, 23 Aug 2016 17:42:53 +0000 (18:42 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Tue, 23 Aug 2016 17:42:53 +0000 (18:42 +0100)
src/jalview/analysis/AlignmentUtils.java

index b57fbbf..c4e51b1 100644 (file)
@@ -1708,6 +1708,8 @@ public class AlignmentUtils
             mappings.add(cdsToProteinMapping);
           }
 
+          propagateDBRefsToCDS(cdsSeqDss, dnaSeq.getDatasetSequence(),
+                  proteinProduct, aMapping);
           /*
            * add another mapping from original 'from' range to CDS
            */
@@ -1879,8 +1881,6 @@ public class AlignmentUtils
     SequenceI newSeq = new Sequence(seqId, newSeqChars, 1, newPos);
     // newSeq.setDescription(mapFromId);
 
-    propagateDBRefsToCDS(newSeq, seq, mapping);
-
     return newSeq;
   }
 
@@ -1894,11 +1894,12 @@ public class AlignmentUtils
    * @return list of DBRefEntrys added.
    */
   public static List<DBRefEntry> propagateDBRefsToCDS(SequenceI cdsSeq,
-          SequenceI contig, Mapping mapping)
+          SequenceI contig, SequenceI proteinProduct, Mapping mapping)
   {
 
     // gather direct refs from contig congrent with mapping
     List<DBRefEntry> direct = new ArrayList<DBRefEntry>();
+    HashSet<String> directSources = new HashSet<String>();
     if (contig.getDBRefs() != null)
     {
       for (DBRefEntry dbr : contig.getDBRefs())
@@ -1910,24 +1911,51 @@ public class AlignmentUtils
           if (mapping.getMap().equals(map))
           {
             direct.add(dbr);
+            directSources.add(dbr.getSource());
           }
         }
       }
     }
-
+    DBRefEntry[] onSource = DBRefUtils.selectRefs(
+            proteinProduct.getDBRefs(),
+            directSources.toArray(new String[0]));
     List<DBRefEntry> propagated = new ArrayList<DBRefEntry>();
 
     // and generate appropriate mappings
     for (DBRefEntry cdsref : direct)
     {
-      Mapping cdsmap = cdsref.getMap();
+      // clone maplist and mapping
       MapList cdsposmap = new MapList(Arrays.asList(new int[][] { new int[]
-      { cdsSeq.getStart(), cdsSeq.getEnd() } }), cdsmap.getMap()
+      { cdsSeq.getStart(), cdsSeq.getEnd() } }), cdsref.getMap().getMap()
               .getToRanges(), 3, 1);
+      Mapping cdsmap = new Mapping(cdsref.getMap().getTo(), cdsref.getMap()
+              .getMap());
 
+      // create dbref
       DBRefEntry newref = new DBRefEntry(cdsref.getSource(),
               cdsref.getVersion(), cdsref.getAccessionId(), new Mapping(
                       cdsmap.getTo(), cdsposmap));
+
+      // and see if we can map to the protein product for this mapping.
+      // onSource is the filtered set of accessions on protein that we are
+      // tranferring, so we assume accession is the same.
+      if (cdsmap.getTo() == null && onSource != null)
+      {
+        List<DBRefEntry> sourceRefs = DBRefUtils.searchRefs(onSource,
+                cdsref.getAccessionId());
+        if (sourceRefs != null)
+        {
+          for (DBRefEntry srcref : sourceRefs)
+          {
+            if (srcref.getSource().equalsIgnoreCase(cdsref.getSource()))
+            {
+              // we have found a complementary dbref on the protein product, so
+              // update mapping's getTo
+              newref.getMap().setTo(proteinProduct);
+            }
+          }
+        }
+      }
       cdsSeq.addDBRef(newref);
       propagated.add(newref);
     }