ensure codon mappings and database references are merged back onto alignment
authorjprocter <Jim Procter>
Thu, 30 Aug 2007 16:01:38 +0000 (16:01 +0000)
committerjprocter <Jim Procter>
Thu, 30 Aug 2007 16:01:38 +0000 (16:01 +0000)
src/jalview/gui/Jalview2XML.java

index e57e748..62a05df 100755 (executable)
@@ -188,6 +188,7 @@ public class Jalview2XML
       jout.close();
     } catch (Exception ex)
     {
+      //TODO: inform user of the problem - they need to know if their data was not saved !
       ex.printStackTrace();
     }
   }
@@ -1399,7 +1400,6 @@ public class Jalview2XML
     {
       // older jalview projects do not have a dataset id.
       al.setDataset(null);
-      // addDatasetRef(al.getDataset());
     }
     else
     {
@@ -1440,7 +1440,10 @@ public class Jalview2XML
             al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
           }
         }
-
+        if (vamsasSeq[i].getDBRefCount() > 0)
+        {
+          addDBRefs(al.getSequenceAt(i).getDatasetSequence(), vamsasSeq[i]);
+        }
         if (JSEQ[i].getPdbidsCount() > 0)
         {
           Pdbids[] ids = JSEQ[i].getPdbids();
@@ -1464,10 +1467,6 @@ public class Jalview2XML
             al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
           }
         }
-        if (vamsasSeq[i].getDBRefCount() > 0)
-        {
-          addDBRefs(al.getSequenceAt(i).getDatasetSequence(), vamsasSeq[i]);
-        }
       }
     }
 
@@ -2139,79 +2138,105 @@ public class Jalview2XML
     for (int i = 0, iSize = vamsasSet.getSequenceCount(); i < iSize; i++)
     {
       Sequence vamsasSeq = vamsasSet.getSequence(i);
-      jalview.datamodel.Sequence sq = null;
-      String sqid = vamsasSeq.getDsseqid();
+      ensureJalviewDatasetSequence(vamsasSeq, ds, dseqs);
+    }
+    // create a new dataset
+    if (ds == null)
+    {
+      SequenceI[] dsseqs = new SequenceI[dseqs.size()];
+      dseqs.copyInto(dsseqs);
+      ds = new jalview.datamodel.Alignment(dsseqs);
+      addDatasetRef(vamsasSet.getDatasetId(), ds);
+    }
+    // set the dataset for the newly imported alignment.
+    if (al.getDataset() == null)
+    {
+      al.setDataset(ds);
+    }
+  }
+  
+
+  /**
+   * 
+   * @param vamsasSeq sequence definition to create/merge dataset sequence for
+   * @param ds dataset alignment 
+   * @param dseqs vector to add new dataset sequence to
+   */
+  private void ensureJalviewDatasetSequence(Sequence vamsasSeq, AlignmentI ds, Vector dseqs)
+  {
+    jalview.datamodel.Sequence sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq.getId());
+    jalview.datamodel.SequenceI dsq = null;
+    if (sq!=null && sq.getDatasetSequence()!=null)
+    {
+      dsq = (jalview.datamodel.SequenceI) sq.getDatasetSequence();
+    }
+    
+    String sqid = vamsasSeq.getDsseqid();
+    if (dsq==null)
+    {
+      // need to create or add a new dataset sequence reference to this sequence
       if (sqid != null)
       {
-        sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq
-                .getDsseqid());
+        dsq = (jalview.datamodel.SequenceI) seqRefIds.get(sqid);
       }
-      if (sq == null)
+      // check again
+      if (dsq == null)
       {
-        sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq.getId());
-        jalview.datamodel.SequenceI dsq = sq.createDatasetSequence();
+        // make a new dataset sequence
+        dsq = sq.createDatasetSequence();
         if (sqid == null)
         {
           // make up a new dataset reference for this sequence
           sqid = "" + dsq.hashCode();
         }
-        ((SequenceI) dsq).setVamsasId(uniqueSetSuffix + sqid);
+        dsq.setVamsasId(uniqueSetSuffix + sqid);
         seqRefIds.put(sqid, dsq);
         if (ds == null)
         {
-          dseqs.addElement(dsq);
+          if (dseqs!=null)
+          {
+            dseqs.addElement(dsq);
+          }
         }
         else
         {
           ds.addSequence(dsq);
         }
-       
-      }
-      // TODO: refactor: This is a low-level sequence operation - effectively merging one dataset sequence into another.
-      // check that dataset sequence really is the union of all references to it
-      boolean pre = sq.getStart() < sq.getDatasetSequence().getStart();
-      boolean post = sq.getEnd() > sq.getDatasetSequence().getEnd();
-      if (pre || post)
-      {
-        SequenceI dsq = sq.getDatasetSequence();
-        StringBuffer sb = new StringBuffer();
-        String newres = jalview.analysis.AlignSeq.extractGaps(
-                jalview.util.Comparison.GapChars, sq.getSequenceAsString());
-        synchronized (dsq)
-        {
-          sb.append(dsq.getSequence());
-          if (pre)
-          {
-            sb.insert(0, newres
-                    .substring(0, dsq.getStart() - sq.getStart()));
-            dsq.setStart(sq.getStart());
-          }
-          if (post)
-          {
-            sb.append(newres.substring(newres.length() - sq.getEnd()
-                    - dsq.getEnd()));
-            dsq.setEnd(sq.getEnd());
-          }
-          dsq.setSequence(sb.toString());
-        }
-        System.err
-                .println("DEBUG Notice:  Merged dataset sequence ("
-                        + (pre ? "prepended" : "") + " "
-                        + (post ? "appended" : ""));
+      } else {
+        // make this dataset sequence sq's dataset sequence
+        sq.setDatasetSequence(dsq);
       }
     }
-    // create a new dataset
-    if (ds == null)
+    // TODO: refactor this as a merge dataset sequence function
+    // now check that sq (the dataset sequence) sequence really is the union of all references to it
+    boolean pre = sq.getStart() < dsq.getStart();
+    boolean post = sq.getEnd() > dsq.getEnd();
+    if (pre || post)
     {
-      SequenceI[] dsseqs = new SequenceI[dseqs.size()];
-      dseqs.copyInto(dsseqs);
-      ds = new jalview.datamodel.Alignment(dsseqs);
-      addDatasetRef(vamsasSet.getDatasetId(), ds);
-    }
-    // set the dataset for the newly imported alignment.
-    if (al.getDataset() == null)
-    {
-      al.setDataset(ds);
+      StringBuffer sb = new StringBuffer();
+      String newres = jalview.analysis.AlignSeq.extractGaps(
+              jalview.util.Comparison.GapChars, sq.getSequenceAsString());
+      synchronized (dsq)
+      {
+        sb.append(dsq.getSequence());
+        if (pre)
+        {
+          sb.insert(0, newres
+                  .substring(0, dsq.getStart() - sq.getStart()));
+          dsq.setStart(sq.getStart());
+        }
+        if (post)
+        {
+          sb.append(newres.substring(newres.length() - sq.getEnd()
+                  - dsq.getEnd()));
+          dsq.setEnd(sq.getEnd());
+        }
+        dsq.setSequence(sb.toString());
+      }
+      System.err
+              .println("DEBUG Notice:  Merged dataset sequence ("
+                      + (pre ? "prepended" : "") + " "
+                      + (post ? "appended" : ""));
     }
   }
 
@@ -2299,18 +2324,38 @@ public class Jalview2XML
       else
       {
         /**
-         * make a new sequence and add it to refIds hash
+         * local sequence definition
          */
         Sequence ms = mc.getSequence();
-        jalview.datamodel.Sequence djs = new jalview.datamodel.Sequence(ms
+        jalview.datamodel.Sequence djs=null;
+        String sqid = ms.getDsseqid();
+        if (sqid!=null && sqid.length()>0)
+        {
+          /*
+           * recover dataset sequence
+           */
+          djs = (jalview.datamodel.Sequence) seqRefIds.get(sqid);
+        } else {
+          System.err.println("Warning - making up dataset sequence id for DbRef sequence map reference");
+          sqid = ""+ms.hashCode(); // make up a new hascode for undefined dataset sequence hash (unlikely to happen)
+        }
+        
+        if (djs==null) {
+          /**
+           * make a new dataset sequence and add it to refIds hash
+           */
+          djs = new jalview.datamodel.Sequence(ms
                 .getName(), ms.getSequence());
-        djs.setStart(jmap.getMap().getToLowest());
-        djs.setEnd(jmap.getMap().getToHighest());
-        djs.setVamsasId(uniqueSetSuffix + ms.getId());
-        jmap.setTo(djs);
-        seqRefIds.put(ms.getId(), djs);
+          djs.setStart(jmap.getMap().getToLowest());
+          djs.setEnd(jmap.getMap().getToHighest());
+          djs.setVamsasId(uniqueSetSuffix + sqid);
+          jmap.setTo(djs);
+          seqRefIds.put(sqid, djs);
+          
+        }
         jalview.bin.Cache.log.debug("about to recurse on addDBRefs.");
         addDBRefs(djs, ms);
+        
       }
     }
     return (jmap);