JAL-2349 store/restore mappable contact matrix in project and fix up interactive...
authorJames Procter <j.procter@dundee.ac.uk>
Sun, 14 May 2023 12:35:16 +0000 (13:35 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Sun, 14 May 2023 12:35:16 +0000 (13:35 +0100)
79 files changed:
schemas/vamsas.xsd
src/jalview/datamodel/ColumnSelection.java
src/jalview/gui/AnnotationPanel.java
src/jalview/project/Jalview2XML.java
src/jalview/renderer/ContactGeometry.java
src/jalview/ws/datamodel/MappableContactMatrixI.java
src/jalview/ws/datamodel/alphafold/MappableContactMatrix.java [new file with mode: 0644]
src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java
src/jalview/xml/binding/embl/EntrySetType.java
src/jalview/xml/binding/embl/EntryType.java
src/jalview/xml/binding/embl/ObjectFactory.java
src/jalview/xml/binding/embl/ROOT.java
src/jalview/xml/binding/embl/XrefType.java
src/jalview/xml/binding/jalview/AlcodonFrame.java
src/jalview/xml/binding/jalview/Annotation.java
src/jalview/xml/binding/jalview/AnnotationColourScheme.java
src/jalview/xml/binding/jalview/AnnotationElement.java
src/jalview/xml/binding/jalview/DoubleMatrix.java
src/jalview/xml/binding/jalview/DoubleVector.java
src/jalview/xml/binding/jalview/Feature.java
src/jalview/xml/binding/jalview/FeatureMatcher.java
src/jalview/xml/binding/jalview/FeatureMatcherSet.java
src/jalview/xml/binding/jalview/FilterBy.java
src/jalview/xml/binding/jalview/JalviewModel.java
src/jalview/xml/binding/jalview/JalviewUserColours.java
src/jalview/xml/binding/jalview/MapListType.java
src/jalview/xml/binding/jalview/Mapping.java
src/jalview/xml/binding/jalview/MatrixType.java
src/jalview/xml/binding/jalview/NoValueColour.java
src/jalview/xml/binding/jalview/ObjectFactory.java
src/jalview/xml/binding/jalview/PcaDataType.java
src/jalview/xml/binding/jalview/Pdbentry.java
src/jalview/xml/binding/jalview/Property.java
src/jalview/xml/binding/jalview/Sequence.java
src/jalview/xml/binding/jalview/SequenceSet.java
src/jalview/xml/binding/jalview/SequenceType.java
src/jalview/xml/binding/jalview/ThresholdType.java
src/jalview/xml/binding/jalview/VAMSAS.java
src/jalview/xml/binding/jalview/WebServiceParameterSet.java
src/jalview/xml/binding/jalview/package-info.java
src/jalview/xml/binding/uniprot/CitationType.java
src/jalview/xml/binding/uniprot/CofactorType.java
src/jalview/xml/binding/uniprot/CommentType.java
src/jalview/xml/binding/uniprot/ConsortiumType.java
src/jalview/xml/binding/uniprot/DbReferenceType.java
src/jalview/xml/binding/uniprot/Entry.java
src/jalview/xml/binding/uniprot/EventType.java
src/jalview/xml/binding/uniprot/EvidenceType.java
src/jalview/xml/binding/uniprot/EvidencedStringType.java
src/jalview/xml/binding/uniprot/FeatureType.java
src/jalview/xml/binding/uniprot/GeneLocationType.java
src/jalview/xml/binding/uniprot/GeneNameType.java
src/jalview/xml/binding/uniprot/GeneType.java
src/jalview/xml/binding/uniprot/ImportedFromType.java
src/jalview/xml/binding/uniprot/InteractantType.java
src/jalview/xml/binding/uniprot/IsoformType.java
src/jalview/xml/binding/uniprot/KeywordType.java
src/jalview/xml/binding/uniprot/LocationType.java
src/jalview/xml/binding/uniprot/MoleculeType.java
src/jalview/xml/binding/uniprot/NameListType.java
src/jalview/xml/binding/uniprot/ObjectFactory.java
src/jalview/xml/binding/uniprot/OrganismNameType.java
src/jalview/xml/binding/uniprot/OrganismType.java
src/jalview/xml/binding/uniprot/PersonType.java
src/jalview/xml/binding/uniprot/PhysiologicalReactionType.java
src/jalview/xml/binding/uniprot/PositionType.java
src/jalview/xml/binding/uniprot/PropertyType.java
src/jalview/xml/binding/uniprot/ProteinExistenceType.java
src/jalview/xml/binding/uniprot/ProteinType.java
src/jalview/xml/binding/uniprot/ReactionType.java
src/jalview/xml/binding/uniprot/ReferenceType.java
src/jalview/xml/binding/uniprot/SequenceType.java
src/jalview/xml/binding/uniprot/SourceDataType.java
src/jalview/xml/binding/uniprot/SourceType.java
src/jalview/xml/binding/uniprot/StatusType.java
src/jalview/xml/binding/uniprot/SubcellularLocationType.java
src/jalview/xml/binding/uniprot/Uniprot.java
src/jalview/xml/binding/uniprot/package-info.java
test/jalview/project/Jalview2xmlTests.java

index abfabb1..b72e3c7 100755 (executable)
                        </xs:element>
                        <xs:element name="property" type="vamsas:property"
                                minOccurs="0" maxOccurs="unbounded" />
+                       <xs:element name="mapping" type="vamsas:mapListType"
+                               minOccurs="0" maxOccurs="1">
+                       <xs:annotation>
+                               <xs:documentation>mapping from the matrix row and column positions to
+                                       associated reference frame</xs:documentation>
+                               </xs:annotation>
+                       </xs:element>
                </xs:sequence>
 
                <xs:attribute name="type" type="xs:string" use="required" />
index 6ee324f..4882597 100644 (file)
@@ -278,6 +278,23 @@ public class ColumnSelection
   }
 
   /**
+   * add a series of start,end (inclusive) ranges to the column selection 
+   * @param rng [start_0, end_0, start_1, end_1, ... ]
+   * @param baseOne - when true, ranges are base 1 and will be mapped to base 0
+   */
+  public void addRangeOfElements(int[] rng,boolean baseOne)
+  {
+    int base=baseOne ? -1 : 0;
+    for (int c = 0; c < rng.length; c += 2)
+    {
+      for (int p = rng[c]; p <= rng[c + 1]; p++)
+      {
+        selection.add(base+p);
+      }
+    }
+    
+  }
+  /**
    * clears column selection
    */
   public void clear()
index 3bf24b4..2177a26 100755 (executable)
@@ -656,7 +656,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       to = Math.max(cXci.cStart, cXci.cEnd);
 
       // double click selects the whole group
-      if (evt.getClickCount()==2)
+      if (evt.getClickCount() == 2)
       {
         ContactMatrixI matrix = av.getContactMatrix(clicked);
 
@@ -667,6 +667,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
           {
             SequenceI rseq = clicked.sequenceRef;
             BitSet grp = matrix.getGroupsFor(currentX);
+            // TODO: cXci needs to be mapped to real groups
             for (int c = fr; c <= to; c++)
             {
               BitSet additionalGrp = matrix.getGroupsFor(c);
@@ -697,16 +698,18 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       {
         // select corresponding range in segment under mouse
         {
-          for (int c = fr; c <= to; c++)
+          int[] rng = forCurrentX.getMappedPositionsFor(fr, to);
+          if (rng != null)
           {
-            av.getColumnSelection().addElement(c);
+            av.getColumnSelection().addRangeOfElements(rng, true);
           }
           av.getColumnSelection().addElement(currentX);
         }
         // PAE SPECIFIC
         // and also select everything lower than the max range adjacent
         // (kind of works)
-        if (evt.isControlDown() && PAEContactMatrix.PAEMATRIX.equals(clicked.getCalcId()))
+        if (evt.isControlDown()
+                && PAEContactMatrix.PAEMATRIX.equals(clicked.getCalcId()))
         {
           int c = fr - 1;
           ContactRange cr = forCurrentX.getRangeFor(fr, to);
@@ -724,28 +727,39 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
             if (// cr.getMin() <= cval &&
             cval <= thresh)
             {
-              av.getColumnSelection().addElement(c--);
-            }
-            else
-            {
-              break;
+              int[] cols = forCurrentX.getMappedPositionsFor(c, c);
+              if (cols != null)
+              {
+                av.getColumnSelection().addRangeOfElements(cols, true);
+              }
+              else
+              {
+                break;
+              }
             }
+            c--;
           }
-          c = to;
-          while (c < forCurrentX.getContactHeight())
-          {
-            cval = forCurrentX.getContactAt(c);
-            if (// cr.getMin() <= cval &&
-            cval <= thresh)
+            c = to;
+            while (c < forCurrentX.getContactHeight())
             {
-              av.getColumnSelection().addElement(c++);
-            }
-            else
-            {
-              break;
+              cval = forCurrentX.getContactAt(c);
+              if (// cr.getMin() <= cval &&
+              cval <= thresh)
+              {
+                int[] cols = forCurrentX.getMappedPositionsFor(c, c);
+                if (cols != null)
+                {
+                  av.getColumnSelection().addRangeOfElements(cols, true);
+                }
+              }
+              else
+              {
+                break;
+              }
+              c++;
+
             }
           }
-        }
       }
     }
     ap.paintAlignment(false, false);
@@ -1044,38 +1058,56 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
               rowIndex[1] - deltaY);
 
       // mark rectangular region formed by drag
-      jalview.bin.Console.trace("Matrix Selection from last(" + fromXc + ",["
-              + lastXci.cStart + "," + lastXci.cEnd + "]) to cur(" + toXc
-              + ",[" + cXci.cStart + "," + cXci.cEnd + "])");
+      jalview.bin.Console.trace("Matrix Selection from last(" + fromXc
+              + ",[" + lastXci.cStart + "," + lastXci.cEnd + "]) to cur("
+              + toXc + ",[" + cXci.cStart + "," + cXci.cEnd + "])");
       int fr, to;
       fr = Math.min(lastXci.cStart, lastXci.cEnd);
       to = Math.max(lastXci.cStart, lastXci.cEnd);
-      jalview.bin.Console.trace("Marking " + fr + " to " + to);
-      for (int c = fr; c <= to; c++)
+      int[] mappedPos = forFromX.getMappedPositionsFor(fr, to);
+      if (mappedPos != null)
       {
-        if (cma.sequenceRef != null)
+        jalview.bin.Console.trace("Marking " + fr + " to " + to
+                + " mapping to sequence positions " + mappedPos[0] + " to "
+                + mappedPos[1]);
+        for (int pair = 0; pair < mappedPos.length; pair += 2)
         {
-          int col = cma.sequenceRef.findIndex(c);
-          av.getColumnSelection().addElement(col);
-        }
-        else
-        {
-          av.getColumnSelection().addElement(c);
+          for (int c = mappedPos[pair]; c <= mappedPos[pair + 1]; c++)
+//          {
+//            if (cma.sequenceRef != null)
+//            {
+//              int col = cma.sequenceRef.findIndex(cma.sequenceRef.getStart()+c);
+//              av.getColumnSelection().addElement(col);
+//            }
+//            else
+            {
+              av.getColumnSelection().addElement(c);
+            }
         }
       }
+      // and again for most recent corner of drag
       fr = Math.min(cXci.cStart, cXci.cEnd);
       to = Math.max(cXci.cStart, cXci.cEnd);
-      jalview.bin.Console.trace("Marking " + fr + " to " + to);
-      for (int c = fr; c <= to; c++)
+      mappedPos = forFromX.getMappedPositionsFor(fr, to);
+      if (mappedPos != null)
       {
-        if (cma.sequenceRef != null)
+        for (int pair = 0; pair < mappedPos.length; pair += 2)
         {
-          int col = cma.sequenceRef.findIndex(c);
-          av.getColumnSelection().addElement(col);
-        }
-        else
-        {
-          av.getColumnSelection().addElement(c);
+          jalview.bin.Console.trace("Marking " + fr + " to " + to
+                  + " mapping to sequence positions " + mappedPos[pair] + " to "
+                  + mappedPos[pair+1]);
+          for (int c = mappedPos[pair]; c <= mappedPos[pair + 1]; c++)
+          {
+//            if (cma.sequenceRef != null)
+//            {
+//              int col = cma.sequenceRef.findIndex(cma.sequenceRef.getStart()+c);
+//              av.getColumnSelection().addElement(col);
+//            }
+//            else
+            {
+              av.getColumnSelection().addElement(c);
+            }
+          }
         }
       }
       fr = Math.min(lastX, currentX);
@@ -1248,12 +1280,28 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         ContactRange cr = clist.getRangeFor(ci.cStart, ci.cEnd);
         tooltip = "Contact from " + clist.getPosition() + ", [" + ci.cStart
                 + " - " + ci.cEnd + "]" + "<br/>Mean:" + cr.getMean();
+        
         int col = ann.sequenceRef.findPosition(column);
+        int[][] highlightPos;
+        int[] mappedPos = clist.getMappedPositionsFor(ci.cStart, ci.cEnd);
+        if (mappedPos != null)
+        {
+          highlightPos = new int[1 + mappedPos.length][2];
+          highlightPos[0] = new int[] { col, col };
+          for (int p = 0, h = 0; p < mappedPos.length; h++, p += 2)
+          {
+            highlightPos[h][0] = ann.sequenceRef
+                    .findPosition(mappedPos[p] - 1);
+            highlightPos[h][1] = ann.sequenceRef
+                    .findPosition(mappedPos[p + 1] - 1);
+          }
+        }
+        else
+        {
+          highlightPos = new int[][] { new int[] { col, col } };
+        }
         ap.getStructureSelectionManager()
-                .highlightPositionsOn(ann.sequenceRef, new int[][]
-                { new int[] { col, col },
-                    new int[]
-                    { ci.cStart, ci.cEnd } }, null);
+                .highlightPositionsOn(ann.sequenceRef, highlightPos, null);
       }
     }
     return tooltip;
index ddf2afd..333c62b 100644 (file)
@@ -152,6 +152,7 @@ import jalview.viewmodel.ViewportRanges;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
 import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
+import jalview.ws.datamodel.MappableContactMatrixI;
 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.dm.AAConSettings;
@@ -194,6 +195,7 @@ import jalview.xml.binding.jalview.JalviewModel.Viewport.HiddenColumns;
 import jalview.xml.binding.jalview.JalviewModel.Viewport.Overview;
 import jalview.xml.binding.jalview.JalviewUserColours;
 import jalview.xml.binding.jalview.JalviewUserColours.Colour;
+import jalview.xml.binding.jalview.MapListType;
 import jalview.xml.binding.jalview.MapListType.MapListFrom;
 import jalview.xml.binding.jalview.MapListType.MapListTo;
 import jalview.xml.binding.jalview.Mapping;
@@ -2337,6 +2339,38 @@ public class Jalview2XML
               }
               
               // set/get properties
+              if (cm instanceof MappableContactMatrixI)
+              {
+                jalview.util.MapList mlst = ((MappableContactMatrixI) cm)
+                        .getMapFor(annotation.sequenceRef);
+                if (mlst != null)
+                {
+                  MapListType mp = new MapListType();
+                  List<int[]> r = mlst.getFromRanges();
+                  for (int[] range : r)
+                  {
+                    MapListFrom mfrom = new MapListFrom();
+                    mfrom.setStart(range[0]);
+                    mfrom.setEnd(range[1]);
+                    // mp.addMapListFrom(mfrom);
+                    mp.getMapListFrom().add(mfrom);
+                  }
+                  r = mlst.getToRanges();
+                  for (int[] range : r)
+                  {
+                    MapListTo mto = new MapListTo();
+                    mto.setStart(range[0]);
+                    mto.setEnd(range[1]);
+                    // mp.addMapListTo(mto);
+                    mp.getMapListTo().add(mto);
+                  }
+                  mp.setMapFromUnit(
+                          BigInteger.valueOf(mlst.getFromRatio()));
+                  mp.setMapToUnit(BigInteger.valueOf(mlst.getToRatio()));
+                  xmlmat.setMapping(mp);
+                }
+              }
+              // and add to model
               an.getContactmatrix().add(xmlmat);
             }
           }
@@ -2664,7 +2698,7 @@ public class Jalview2XML
     }
     return vamsasSeq;
   }
-
+  
   private Mapping createVamsasMapping(jalview.datamodel.Mapping jmp,
           SequenceI parentseq, SequenceI jds, boolean recurse)
   {
@@ -3972,9 +4006,32 @@ public class Jalview2XML
                           .fromFloatStringToContacts(xmlmat.getElements(),
                                   xmlmat.getCols().intValue(),
                                   xmlmat.getRows().intValue());
+                  jalview.util.MapList mapping = null;
+                  if (xmlmat.getMapping()!=null)
+                  {
+                    MapListType m = xmlmat.getMapping();
+                    // Mapping m = dr.getMapping();
+                    int fr[] = new int[m.getMapListFrom().size() * 2];
+                    Iterator<MapListFrom> from = m.getMapListFrom().iterator();// enumerateMapListFrom();
+                    for (int _i = 0; from.hasNext(); _i += 2)
+                    {
+                      MapListFrom mf = from.next();
+                      fr[_i] = mf.getStart();
+                      fr[_i + 1] = mf.getEnd();
+                    }
+                    int fto[] = new int[m.getMapListTo().size() * 2];
+                    Iterator<MapListTo> to = m.getMapListTo().iterator();// enumerateMapListTo();
+                    for (int _i = 0; to.hasNext(); _i += 2)
+                    {
+                      MapListTo mf = to.next();
+                      fto[_i] = mf.getStart();
+                      fto[_i + 1] = mf.getEnd();
+                    }
 
+                    mapping = new jalview.util.MapList(fr, fto, m.getMapFromUnit().intValue(),m.getMapToUnit().intValue());
+                  }
                   PAEContactMatrix newpae = new PAEContactMatrix(
-                          jaa.sequenceRef, elements);
+                          jaa.sequenceRef, mapping, elements);
                   List<BitSet> newgroups=new ArrayList<BitSet>();
                   if (xmlmat.getGroups().size()>0)
                   {
index 2eb325c..ad741ff 100644 (file)
@@ -78,33 +78,38 @@ public class ContactGeometry
    * @return true if the range on the matrix specified by ci intersects with selected columns in the ContactListI's reference frame.
    */
   
-  boolean intersects(contactInterval ci,ColumnSelection columnSelection, HiddenColumns hiddenColumns,  boolean visibleOnly) {
+  boolean intersects(contactInterval ci, ColumnSelection columnSelection,
+          HiddenColumns hiddenColumns, boolean visibleOnly)
+  {
     boolean rowsel = false;
-    final int[] mappedRange = contacts.getMappedPositionsFor(ci.cStart, ci.cEnd);
-    if (mappedRange==null)
+    final int[] mappedRange = contacts.getMappedPositionsFor(ci.cStart,
+            ci.cEnd);
+    if (mappedRange == null)
     {
       return false;
     }
-    boolean containsHidden=false;
-    if (visibleOnly && hiddenColumns!=null && hiddenColumns.hasHiddenColumns())
+    for (int p = 0; p < mappedRange.length && !rowsel; p += 2)
     {
-      // TODO: turn into function on hiddenColumns and create test !!
-      Iterator<int[]> viscont = hiddenColumns
-              .getVisContigsIterator(mappedRange[0], mappedRange[1], false);
-      containsHidden = !viscont.hasNext();
-      if (!containsHidden)
+      boolean containsHidden = false;
+      if (visibleOnly && hiddenColumns != null
+              && hiddenColumns.hasHiddenColumns())
       {
-        for (int[] interval=viscont.next();viscont.hasNext();
-        rowsel |= columnSelection.intersects(interval[0],interval[1]))
-          ;
+        // TODO: turn into function on hiddenColumns and create test !!
+        Iterator<int[]> viscont = hiddenColumns.getVisContigsIterator(
+                mappedRange[p], mappedRange[p + 1], false);
+        containsHidden = !viscont.hasNext();
+        if (!containsHidden)
+        {
+          for (int[] interval = viscont.next(); viscont
+                  .hasNext(); rowsel |= columnSelection
+                          .intersects(interval[p], interval[p + 1]))
+            ;
+        }
       }
-    }
-    else
-    {
-      // if containsHidden is true mappedRange is not visible
-      if (containsHidden)
+      else
       {
-        rowsel = columnSelection.intersects(mappedRange[0], mappedRange[1]);
+        rowsel = columnSelection.intersects(mappedRange[p],
+                mappedRange[p + 1]);
       }
     }
     return rowsel;
index 4abaa5d..052bc2f 100644 (file)
@@ -4,6 +4,7 @@ import jalview.datamodel.ContactListI;
 import jalview.datamodel.ContactMatrixI;
 import jalview.datamodel.Mapping;
 import jalview.datamodel.SequenceI;
+import jalview.util.MapList;
 
 public interface MappableContactMatrixI extends ContactMatrixI
 {
@@ -28,4 +29,14 @@ public interface MappableContactMatrixI extends ContactMatrixI
   
   ContactListI getMappableContactList(SequenceI localFrame, int column);
 
+  /**
+   * 
+   * Similar to AlignedCodonFrame.getMappingBetween 
+   * 
+   * @param sequenceRef - a reference sequence mappable to this contactMatrix - may be null
+   * @return null or the MapList mapping to the coordinates of the reference sequence (or if hasReferenceSeq() is false, and sequenceRef is null, any mapping present)
+   * 
+   */
+  MapList getMapFor(SequenceI sequenceRef);
+
 }
diff --git a/src/jalview/ws/datamodel/alphafold/MappableContactMatrix.java b/src/jalview/ws/datamodel/alphafold/MappableContactMatrix.java
new file mode 100644 (file)
index 0000000..ae2b37c
--- /dev/null
@@ -0,0 +1,318 @@
+package jalview.ws.datamodel.alphafold;
+
+import java.util.ArrayList;
+
+import jalview.datamodel.ContactListI;
+import jalview.datamodel.ContactListImpl;
+import jalview.datamodel.ContactListProviderI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.SequenceI;
+import jalview.util.MapList;
+import jalview.ws.datamodel.MappableContactMatrixI;
+
+public abstract class MappableContactMatrix<T extends MappableContactMatrix<T>> implements MappableContactMatrixI
+{
+  SequenceI refSeq = null;
+  MapList toSeq = null;
+
+  /**
+   * the length that refSeq is expected to be (excluding gaps, of course)
+   */
+  int length;
+
+
+  @Override
+  public boolean hasReferenceSeq()
+  {
+    return (refSeq != null);
+  }
+
+  @Override
+  public SequenceI getReferenceSeq()
+  {
+    return refSeq;
+  }
+  @Override
+  public MapList getMapFor(SequenceI mapSeq)
+  {
+    if (refSeq!=null)
+    {
+      while (mapSeq!=refSeq && mapSeq.getDatasetSequence()!=null)
+      {
+        mapSeq = mapSeq.getDatasetSequence();
+      }
+      if (mapSeq!=refSeq)
+      {
+        return null;
+      }
+    } else {
+      if (mapSeq!=null) {
+        // our MapList does not concern this seq
+        return null;
+      }
+    }
+    
+    return toSeq;
+  }
+
+  protected void setRefSeq(SequenceI _refSeq)
+  {
+    refSeq = _refSeq;
+    while (refSeq.getDatasetSequence() != null)
+    {
+      refSeq = refSeq.getDatasetSequence();
+    }
+    length = _refSeq.getEnd() - _refSeq.getStart() + 1;
+//    if (length!=refSeq.getLength() || _refSeq.getStart()!=1)
+    {
+      toSeq = new MapList(new int[] { _refSeq.getStart(), _refSeq.getEnd()}, new int[] { 0,length-1}, 1,1);
+    }
+  }
+
+  public T liftOver(SequenceI newRefSeq, Mapping sp2sq)
+  {
+    if (sp2sq.getMappedWidth() != sp2sq.getWidth())
+    {
+      // TODO: employ getWord/MappedWord to transfer annotation between cDNA and
+      // Protein reference frames
+      throw new Error(
+              "liftOver currently not implemented for transfer of annotation between different types of seqeunce");
+    }
+    boolean mapIsTo = (sp2sq != null) ? (sp2sq.getTo() == refSeq) : false;
+
+    /**
+     * map from matrix to toSeq's coordinate frame
+     */
+    int[] refMap = toSeq.locateInFrom(0, length - 1);
+    ArrayList<Integer> newFromMap = new ArrayList<Integer>();
+    int last = -1;
+    for (int i = 0; i < refMap.length; i += 2)
+    {
+      /*
+       * for each contiguous range in toSeq, locate corresponding range in sequence mapped to toSeq by sp2sq
+       */
+      int[] sp2map = mapIsTo
+              ? sp2sq.getMap().locateInFrom(refMap[i], refMap[i + 1])
+              : sp2sq.getMap().locateInTo(refMap[i], refMap[i + 1]);
+      if (sp2map == null)
+      {
+        continue;
+      }
+
+      for (int spm = 0; spm < sp2map.length; spm += 2)
+      {
+
+        if (last > -1)
+        {
+          if (sp2map[spm] != last + 1)
+          {
+            newFromMap.add(sp2map[spm]);
+          }
+          else
+          {
+            newFromMap.remove(newFromMap.size() - 1);
+          }
+        }
+        else
+        {
+          newFromMap.add(sp2map[spm]);
+        }
+        last = sp2map[spm + 1];
+        newFromMap.add(last);
+      }
+    }
+    if ((newFromMap.size() % 2) != 0)
+    {
+      // should have had an even number of int ranges!
+      throw new Error("PAEMatrix liftover failed.");
+    }
+    int fromIntMap[] = new int[newFromMap.size()];
+    int ipos = 0;
+    for (Integer i : newFromMap)
+    {
+      fromIntMap[ipos++] = i;
+    }
+    MapList newFromMapList = new MapList(fromIntMap,
+            new int[]
+            { 0, length - 1 }, 1, 1);
+
+    T newCM = newMappableContactMatrix(newRefSeq, newFromMapList);
+    return newCM;
+  }
+
+  protected abstract T  newMappableContactMatrix(SequenceI newRefSeq,
+          MapList newFromMapList);
+  @Override
+  public ContactListI getMappableContactList(final SequenceI localFrame,
+          final int column)
+  {
+    final int _column;
+    final int _lcolumn;
+    if (localFrame==null)
+    {
+      throw new Error("Unimplemented when no local sequence given.");
+    }
+    // return a ContactListI for column
+    // column is index into localFrame
+    // 1. map column to corresponding column in matrix
+
+    _lcolumn=localFrame.findPosition(column);
+    
+    if (toSeq != null)
+    {
+      SequenceI lf = localFrame, uf = refSeq;
+
+      // just look for dataset sequences and check they are the same.
+      // in future we could use DBRefMappings/whatever.
+      while (lf.getDatasetSequence() != null
+              || uf.getDatasetSequence() != null)
+      {
+        if (lf.getDatasetSequence() != null)
+        {
+          lf = lf.getDatasetSequence();
+        }
+        if (uf.getDatasetSequence() != null)
+        {
+          uf = uf.getDatasetSequence();
+        }
+      }
+      if (lf != uf)
+      {
+        // could try harder to find a mapping
+        throw new Error("This Matrix associated with '" + refSeq.getName()
+                + "' is not mappable for the given localFrame sequence. ("
+                + localFrame.getName() + ")");
+      }
+      // check the mapping to see if localFrame _lcolumn exists
+      int[] word = toSeq.locateInTo(_lcolumn, _lcolumn);
+      if (word == null)
+      {
+        return null;
+      }
+      _column = word[0];
+    }
+    else
+    {
+      // no mapping 
+      _column = _lcolumn;
+    }
+
+    // TODO - remove ? this may be a redundant check 
+    if (_column < 0 || ((toSeq != null && _column > toSeq.getToHighest())
+            || (toSeq == null && getHeight() <= _column)))
+    {
+      return null;
+    }
+
+    // 2. resolve ranges in matrix corresponding to range in localFrame
+    final int[] matrixRange = toSeq == null
+            ? new int[]
+            { localFrame.getStart(), localFrame.getEnd() }
+            : toSeq.locateInTo(localFrame.getStart(), localFrame.getEnd());
+
+    int h = 0;
+    for (int p = 0; p < matrixRange.length; p += 2)
+    {
+      h += 1+Math.abs(matrixRange[p + 1] - matrixRange[p]);
+    }
+    final int rangeHeight = h;
+    // 3. Construct ContactListImpl instance for just those segments.
+    
+    return new ContactListImpl(new ContactListProviderI()
+    {
+      
+      public int getColumn()
+      {
+        return column;
+      }
+      @Override
+      public int getPosition()
+      {
+        return _column;
+      }
+      
+      @Override
+      public int getContactHeight()
+      {
+        return rangeHeight;
+      }
+      
+      @Override
+      public double getContactAt(int mcolumn)
+      {
+        if (mcolumn<0 || mcolumn>=rangeHeight)
+        {
+          return -1;
+        }
+        return getElementAt(_column, locateInRange(mcolumn));
+        
+        // this code maps from mcolumn to localFrame - but that isn't what's needed
+//        int loccolumn = localFrame.findPosition(mcolumn);
+//        int[] lcolumn=(toSeq==null) ? new int[] {mcolumn} : toSeq.locateInTo(loccolumn,loccolumn);
+//        if (lcolumn==null || lcolumn[0] < 0 || lcolumn[0] >= rangeHeight)
+//        {
+//          return -1;
+//        }
+//        return getElementAt(_column,lcolumn[0]);
+      }
+      /**
+       * @return the mcolumn'th position in the matrixRange window on the matrix
+       */
+      private int locateInRange(int mcolumn)
+      {
+
+        int h=0,p=0;
+        while (h < mcolumn && p+2 < matrixRange.length) 
+        {
+          h += 1+Math.abs(matrixRange[p + 1] - matrixRange[p]);
+          p+=2;
+        } 
+        return matrixRange[p]+mcolumn-h;
+      }
+      
+      @Override
+      public int[] getMappedPositionsFor(int cStart, int cEnd)
+      {
+        if (!hasReferenceSeq())
+        {
+          return ContactListProviderI.super.getMappedPositionsFor(cStart, cEnd);
+        }
+        // map into segment of matrix being shown
+        int realCstart = locateInRange(cStart);
+        int realCend = locateInRange(cEnd);
+        
+        // TODO account for discontinuities in the mapping
+
+        int[] mappedPositions = toSeq.locateInFrom(realCstart,realCend);
+        if (mappedPositions!=null) {
+          int s=-1,e=-1; 
+          for (int p=0;p<mappedPositions.length;p++)
+          {
+            if (s==-1 && mappedPositions[p]>=localFrame.getStart())
+            {
+              s=p; // remember first position within local frame
+            }
+            if (e==-1 || mappedPositions[p]<=localFrame.getEnd())
+            {
+              // update end pointer
+              e=p;
+              // compute local map
+              mappedPositions[p] = localFrame.findIndex(mappedPositions[p]);
+            }
+          }
+        }
+        return mappedPositions;
+      }
+    });
+  }
+
+  /**
+   * get a specific element of the contact matrix in its data-local coordinates
+   * rather than the mapped frame. Implementations are allowed to throw RunTimeExceptions if _column/i are out of bounds
+   * 
+   * @param _column
+   * @param i
+   * @return
+   */
+  protected abstract double getElementAt(int _column, int i);
+}
index 9d7891d..d496097 100644 (file)
@@ -209,21 +209,21 @@ public class PAEContactMatrix extends MappableContactMatrix<PAEContactMatrix> im
   @Override
   public ContactListI getContactList(final int column)
   {
-    final int _column;
-    if (toSeq != null)
-    {
-      int[] word = toSeq.locateInTo(column, column);
-      if (word == null)
-      {
-        return null;
-      }
-      _column = word[0];
-    }
-    else
-    {
-      _column = column;
-    }
-    if (_column < 0 || _column >= elements.length)
+//    final int _column;
+//    if (toSeq != null)
+//    {
+//      int[] word = toSeq.locateInTo(column, column);
+//      if (word == null)
+//      {
+//        return null;
+//      }
+//      _column = word[0];
+//    }
+//    else
+//    {
+//      _column = column;
+//    }
+    if (column < 0 || column >= elements.length)
     {
       return null;
     }
@@ -233,7 +233,7 @@ public class PAEContactMatrix extends MappableContactMatrix<PAEContactMatrix> im
       @Override
       public int getPosition()
       {
-        return _column;
+        return column;
       }
 
       @Override
@@ -245,12 +245,11 @@ public class PAEContactMatrix extends MappableContactMatrix<PAEContactMatrix> im
       @Override
       public double getContactAt(int mcolumn)
       {
-        int[] column=(toSeq==null) ? new int[] {mcolumn} : toSeq.locateInTo(mcolumn,mcolumn);
-        if (column==null || column[0] < 0 || column[0] >= elements[_column].length)
+        if (mcolumn < 0 || mcolumn >= elements[column].length)
         {
           return -1;
         }
-        return elements[_column][column[0]];
+        return elements[column][mcolumn];
       }
     });
   }
index 0479a34..7126be6 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:45 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 6336ef1..8b2e704 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:45 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e1a917a..71e220b 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:45 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 958cdbc..e26f5ae 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:45 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 244d0fe..cb5eccf 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:45 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 2a40e11..60a5177 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 8d99141..5e3d599 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 27e0cc6..facd6dc 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index c5f75e0..4aaf5ce 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 9be9876..c1d812c 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 6546be9..a5ec2f9 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index a124e62..55198a7 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 61e66ce..99b0635 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 24190b8..7fd9a50 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 3a9428c..0020675 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 22b2533..69b1022 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index b62cf15..70a9afb 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 7a86123..c0db23c 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 10d3d5b..8cd3dbf 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index d884100..ac79fa8 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
@@ -32,6 +32,7 @@ import javax.xml.bind.annotation.XmlType;
  *         &lt;element name="groups" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
  *         &lt;element name="newick" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
  *         &lt;element name="property" type="{www.vamsas.ac.uk/jalview/version2}property" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;element name="mapping" type="{www.vamsas.ac.uk/jalview/version2}mapListType" minOccurs="0"/>
  *       &lt;/sequence>
  *       &lt;attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
  *       &lt;attribute name="rows" use="required" type="{http://www.w3.org/2001/XMLSchema}integer" />
@@ -51,7 +52,8 @@ import javax.xml.bind.annotation.XmlType;
     "elements",
     "groups",
     "newick",
-    "property"
+    "property",
+    "mapping"
 })
 public class MatrixType {
 
@@ -60,6 +62,7 @@ public class MatrixType {
     protected List<String> groups;
     protected List<String> newick;
     protected List<Property> property;
+    protected MapListType mapping;
     @XmlAttribute(name = "type", required = true)
     protected String type;
     @XmlAttribute(name = "rows", required = true)
@@ -185,6 +188,30 @@ public class MatrixType {
     }
 
     /**
+     * Gets the value of the mapping property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link MapListType }
+     *     
+     */
+    public MapListType getMapping() {
+        return mapping;
+    }
+
+    /**
+     * Sets the value of the mapping property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link MapListType }
+     *     
+     */
+    public void setMapping(MapListType value) {
+        this.mapping = value;
+    }
+
+    /**
      * Gets the value of the type property.
      * 
      * @return
index 22b78a5..e77537f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index f034a2a..031d125 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 06aecab..9f8962f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 401022a..bd170de 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 3c0879d..25a297e 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index d02fd03..b9739cd 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index a915d94..a091950 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index fa65d58..3ccb382 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 192caf8..9afd22b 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index dd41877..3e17b63 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index d3c2098..dcc30ed 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 
index 2cfefda..3e94a3f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:44 PM GMT 
+// Generated on: 2023.05.13 at 06:58:41 PM BST 
 //
 
 @javax.xml.bind.annotation.XmlSchema(namespace = "www.vamsas.ac.uk/jalview/version2", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
index de12eb2..d43091a 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e9244e9..87a8e48 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e0692c9..2e6218f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 71db504..d0c560f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 73ccfa8..506eafa 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 21963a8..d13e87e 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 0b4d4bd..765bbad 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 59c9857..4297a04 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 0fa25a6..f2b903b 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index f818e2e..902430d 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index f2d5638..bd93656 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 71af71f..945ced2 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 5fa628e..060e9f1 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 3d6c308..956457c 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index c9cadc2..7e93624 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index ea55664..9724599 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index f6409ee..5763865 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 62e9999..0af69c5 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 8b52523..6bc898d 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index be68867..c68a0dd 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e2bb255..67c20b8 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index bc5c8c5..6306288 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index bb76add..6d110c1 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 1354092..bdc6631 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e674452..36c5d97 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index a00d698..f867ab3 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index c9f169c..f54fa28 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index c34a0f5..f106f83 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 7b106fb..6f4c235 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 8d9d51d..2ea12e3 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index e5f9fde..cc21c86 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 49cd130..4c6c67c 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 9796260..370323c 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 9293a64..886f33f 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index dd3308b..919bc93 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 97522e2..18da1a7 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index 14f96df..cb1c9d3 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 
index a7bc67c..dbe9ff7 100644 (file)
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2023.03.17 at 05:31:46 PM GMT 
+// Generated on: 2023.05.13 at 06:58:42 PM BST 
 //
 
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://uniprot.org/uniprot", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
index 81756e0..343df05 100644 (file)
@@ -100,6 +100,7 @@ import jalview.util.MapList;
 import jalview.util.matcher.Condition;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
+import jalview.ws.datamodel.MappableContactMatrixI;
 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 
 @Test(singleThreaded = true)
@@ -1590,13 +1591,22 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     ContactMatrixI restoredMat = newSeq
             .getContactMatrixFor(newSeq.getAnnotation()[0]);
     Assert.assertNotNull(restoredMat);
+    MapList oldMap = ((MappableContactMatrixI) dummyMat).getMapFor(sq);
+    MapList newMap = ((MappableContactMatrixI) restoredMat).getMapFor(newSeq);
+    Assert.assertEquals(oldMap.getFromRanges(),newMap.getFromRanges());
+    Assert.assertEquals(oldMap.getToRanges(),newMap.getToRanges());
+    Assert.assertEquals(oldMap.getFromRatio(),newMap.getFromRatio());
+    Assert.assertEquals(oldMap.getToRatio(),newMap.getToRatio());
+    
     for (i = sq.getLength() - 1; i >= 0; i--)
     {
       ContactListI oldCM = dummyMat.getContactList(i),
               newCM = restoredMat.getContactList(i);
       for (int j = oldCM.getContactHeight(); j >= 0; j--)
       {
-        Assert.assertEquals(oldCM.getContactAt(j), newCM.getContactAt(j));
+        double old_j=oldCM.getContactAt(j);
+        double new_j=newCM.getContactAt(j);
+        Assert.assertEquals(old_j,new_j);
       }
     }
     Assert.assertEquals(restoredMat.hasGroups(), dummyMat.hasGroups());