Merge branch 'develop' into spike/JAL-4047/JAL-4048_columns_in_sequenceID
[jalview.git] / src / jalview / datamodel / Sequence.java
index 5ae7195..7a5d5bc 100755 (executable)
@@ -33,12 +33,15 @@ import java.util.Vector;
 
 import fr.orsay.lri.varna.models.rna.RNA;
 import jalview.analysis.AlignSeq;
+import jalview.analysis.AlignmentUtils;
+import jalview.analysis.SeqsetUtils;
 import jalview.datamodel.features.SequenceFeatures;
 import jalview.datamodel.features.SequenceFeaturesI;
 import jalview.util.Comparison;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 import jalview.util.StringUtils;
+import jalview.ws.datamodel.alphafold.MappableContactMatrix;
 
 /**
  * 
@@ -171,7 +174,7 @@ public class Sequence extends ASequence implements SequenceI
   {
     if (name == null)
     {
-      System.err.println(
+      jalview.bin.Console.errPrintln(
               "POSSIBLE IMPLEMENTATION ERROR: null sequence name passed to constructor.");
       name = "";
     }
@@ -349,6 +352,11 @@ public class Sequence extends ASequence implements SequenceI
         {
           // only copy the given annotation
           AlignmentAnnotation newann = new AlignmentAnnotation(sqann[i]);
+          ContactMatrixI cm = seq.getContactMatrixFor(sqann[i]);
+          if (cm!=null)
+          {
+            addContactListFor(newann, cm);
+          }
           addAlignmentAnnotation(newann);
         }
       }
@@ -379,7 +387,7 @@ public class Sequence extends ASequence implements SequenceI
   {
     if (sf.getType() == null)
     {
-      System.err.println(
+      jalview.bin.Console.errPrintln(
               "SequenceFeature type may not be null: " + sf.toString());
       return false;
     }
@@ -1626,14 +1634,19 @@ public class Sequence extends ASequence implements SequenceI
                                     // sequence-column mapping
           datasetSequence.addAlignmentAnnotation(_aa);
 
-          // transfer contact matrices
-          ContactMatrixI cm = getContactMatrixFor(aa);
-          if (cm != null)
-          {
-            datasetSequence.addContactListFor(_aa, cm);
+          if (_cmholder != null)
+          { // transfer contact matrices
+            ContactMatrixI cm = _cmholder.getContactMatrixFor(aa);
+            if (cm != null)
+            {
+              datasetSequence.addContactListFor(_aa, cm);
+              datasetSequence.addContactListFor(aa, cm);
+            }
           }
         }
       }
+      // all matrices should have been transferred. so we clear the local holder
+      _cmholder=null;
     }
     return datasetSequence;
   }
@@ -1741,6 +1754,13 @@ public class Sequence extends ASequence implements SequenceI
       transferAnnotation(entry.getDatasetSequence(), mp);
       return;
     }
+    // transfer from entry to sequence
+    // if entry has a description and sequence doesn't, then transfer
+    if (entry.getDescription()!=null && (description==null || description.trim().length()==0))
+    {
+      description = entry.getDescription();
+    }
+    
     // transfer any new features from entry onto sequence
     if (entry.getSequenceFeatures() != null)
     {
@@ -2118,39 +2138,70 @@ public class Sequence extends ASequence implements SequenceI
   ////
   //// Contact Matrix Holder Boilerplate
   ////
-  ContactMapHolderI cmholder = new ContactMapHolder();
+  ContactMapHolderI _cmholder = null;
 
+  private ContactMapHolderI getContactMapHolder()
+  {
+    if (datasetSequence!=null) {
+      return ((Sequence)datasetSequence).getContactMapHolder();
+    }
+    if (_cmholder==null)
+    {
+      _cmholder=new ContactMapHolder();
+    }
+    return _cmholder;
+  }
   @Override
   public Collection<ContactMatrixI> getContactMaps()
   {
-    return cmholder.getContactMaps();
+    return getContactMapHolder().getContactMaps();
   }
 
   @Override
   public ContactMatrixI getContactMatrixFor(AlignmentAnnotation ann)
   {
-    return cmholder.getContactMatrixFor(ann);
+    return getContactMapHolder().getContactMatrixFor(ann);
   }
 
   @Override
   public ContactListI getContactListFor(AlignmentAnnotation _aa, int column)
   {
-    return cmholder.getContactListFor(_aa, column);
+    return getContactMapHolder().getContactListFor(_aa, column);
   }
 
   @Override
   public AlignmentAnnotation addContactList(ContactMatrixI cm)
   {
-    AlignmentAnnotation aa = cmholder.addContactList(cm);
+    AlignmentAnnotation aa;
+    
+    if (datasetSequence != null)
+    {
+      aa = datasetSequence.addContactList(cm);
+      // clone the annotation for the local sequence
+      aa = new AlignmentAnnotation(aa);
+      aa.restrict(start, end);
+      aa.adjustForAlignment();
+      getContactMapHolder().addContactListFor(aa,cm);
+      addAlignmentAnnotation(aa);
+      return aa;
+    }
+    
+    // construct new annotation for matrix on dataset sequence
+    aa = getContactMapHolder().addContactList(cm);
 
     Annotation _aa[] = new Annotation[getLength()];
-    Annotation dummy = new Annotation(0.0f);
-    for (int i = 0; i < _aa.length; _aa[i++] = dummy)
+
+    for (int i = 0; i < _aa.length; _aa[i++] = new Annotation(0.0f))
     {
       ;
     }
     aa.annotations = _aa;
     aa.setSequenceRef(this);
+    if (cm instanceof MappableContactMatrix
+            && !((MappableContactMatrix) cm).hasReferenceSeq())
+    {
+      ((MappableContactMatrix) cm).setRefSeq(this);
+    }
     aa.createSequenceMapping(this, getStart(), false);
     addAlignmentAnnotation(aa);
     return aa;
@@ -2160,6 +2211,6 @@ public class Sequence extends ASequence implements SequenceI
   public void addContactListFor(AlignmentAnnotation annotation,
           ContactMatrixI cm)
   {
-    cmholder.addContactListFor(annotation, cm);
+    getContactMapHolder().addContactListFor(annotation, cm);
   }
 }