JAL-3949 Complete new abstracted logging framework in jalview.log. Updated log calls...
[jalview.git] / src / jalview / io / vamsas / Rangetype.java
index f6a6ecc..786a46b 100644 (file)
-package jalview.io.vamsas;\r
-\r
-\r
-import java.util.Vector;\r
-\r
-import uk.ac.vamsas.objects.core.Local;\r
-import uk.ac.vamsas.objects.core.Map;\r
-import uk.ac.vamsas.objects.core.MapType;\r
-import uk.ac.vamsas.objects.core.Mapped;\r
-import uk.ac.vamsas.objects.core.RangeType;\r
-import uk.ac.vamsas.objects.core.Seg;\r
-import jalview.datamodel.Mapping;\r
-import jalview.io.VamsasAppDatastore;\r
-\r
-public class Rangetype extends DatastoreItem\r
-{\r
-\r
-  public Rangetype()\r
-  {\r
-    super();\r
-  }\r
-\r
-  public Rangetype(VamsasAppDatastore datastore)\r
-  {\r
-    super(datastore);\r
-  }\r
-\r
-  /**\r
-   * get real bounds of a RangeType's specification. start and end are an\r
-   * inclusive range within which all segments and positions lie.\r
-   * TODO: refactor to vamsas utils\r
-   * @param dseta\r
-   * @return int[] { start, end}\r
-   */\r
-  protected int[] getBounds(RangeType dseta)\r
-  {\r
-    if (dseta != null)\r
-    {\r
-      int[] se = null;\r
-      if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)\r
-      {\r
-        throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");\r
-      }\r
-      if (dseta.getSegCount() > 0)\r
-      {\r
-        se = getSegRange(dseta.getSeg(0), true);\r
-        for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)\r
-        {\r
-          int nse[] = getSegRange(dseta.getSeg(s), true);\r
-          if (se[0] > nse[0])\r
-          {\r
-            se[0] = nse[0];\r
-          }\r
-          if (se[1] < nse[1])\r
-          {\r
-            se[1] = nse[1];\r
-          }\r
-        }\r
-      }\r
-      if (dseta.getPosCount() > 0)\r
-      {\r
-        // could do a polarity for pos range too. and pass back indication of discontinuities.\r
-        int pos = dseta.getPos(0).getI();\r
-        se = new int[]\r
-            {\r
-            pos, pos};\r
-        for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)\r
-        {\r
-          pos = dseta.getPos(p).getI();\r
-          if (se[0] > pos)\r
-          {\r
-            se[0] = pos;\r
-          }\r
-          if (se[1] < pos)\r
-          {\r
-            se[1] = pos;\r
-          }\r
-        }\r
-      }\r
-      return se;\r
-    }\r
-    return null;\r
-  }\r
-\r
-  /**\r
-   * map from a rangeType's internal frame to the referenced object's coordinate frame.\r
-   * @param dseta\r
-   * @return int [] { ref(pos)...} for all pos in rangeType's frame.\r
-   */\r
-  protected int[] getMapping(RangeType dseta)\r
-  {\r
-    Vector posList = new Vector();\r
-    if (dseta != null)\r
-    {\r
-      int[] se = null;\r
-      if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)\r
-      {\r
-        throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");\r
-      }\r
-      if (dseta.getSegCount() > 0)\r
-      {\r
-        for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)\r
-        {\r
-          se = getSegRange(dseta.getSeg(s), false);\r
-          int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);\r
-          for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)\r
-          {\r
-            posList.add(new Integer(p));\r
-          }\r
-        }\r
-      }\r
-      else if (dseta.getPosCount() > 0)\r
-      {\r
-        int pos = dseta.getPos(0).getI();\r
-  \r
-        for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)\r
-        {\r
-          pos = dseta.getPos(p).getI();\r
-          posList.add(new Integer(pos));\r
-        }\r
-      }\r
-    }\r
-    if (posList != null && posList.size() > 0)\r
-    {\r
-      int[] range = new int[posList.size()];\r
-      for (int i = 0; i < range.length; i++)\r
-      {\r
-        range[i] = ( (Integer) posList.elementAt(i)).intValue();\r
-      }\r
-      posList.clear();\r
-      return range;\r
-    }\r
-    return null;\r
-  }\r
-\r
-  protected int[] getIntervals(RangeType range)\r
-  {\r
-    int[] intervals=null;\r
-    Vector posList = new Vector();\r
-    if (range != null)\r
-    {\r
-      int[] se = null;\r
-      if (range.getSegCount() > 0 && range.getPosCount() > 0)\r
-      {\r
-        throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");\r
-      }\r
-      if (range.getSegCount() > 0)\r
-      {\r
-        for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)\r
-        {\r
-          se = getSegRange(range.getSeg(s), false);\r
-          posList.addElement(new Integer(se[0]));\r
-          posList.addElement(new Integer(se[1]));\r
-        }\r
-      }\r
-      else if (range.getPosCount() > 0)\r
-      {\r
-        int pos = range.getPos(0).getI();\r
-  \r
-        for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)\r
-        {\r
-          pos = range.getPos(p).getI();\r
-          posList.add(new Integer(pos));\r
-          posList.add(new Integer(pos));\r
-        }\r
-      }\r
-    }\r
-    if (posList != null && posList.size() > 0)\r
-    {\r
-      intervals=new int[posList.size()];\r
-      java.util.Enumeration e = posList.elements();\r
-      int i=0;\r
-      while (e.hasMoreElements())\r
-      {\r
-        intervals[i++] = ((Integer)e.nextElement()).intValue();\r
-      }\r
-    }\r
-    return intervals;\r
-  }\r
-  /**\r
-   * initialise a range type object from a set of start/end inclusive intervals\r
-   * @param mrt\r
-   * @param range\r
-   */\r
-  protected void initRangeType(RangeType mrt, int[] range)\r
-  {\r
-    for (int i=0; i<range.length; i+=2)\r
-    {\r
-      Seg vSeg = new Seg();\r
-      vSeg.setStart(range[i]);\r
-      vSeg.setEnd(range[i+1]);\r
-      vSeg.setInclusive(true);\r
-      mrt.addSeg(vSeg);\r
-    }\r
-  }\r
-\r
-  /**\r
-   * \r
-   * @param maprange where the from range is the local mapped range, and the to range is the 'mapped' range in the MapRangeType\r
-   * @param default unit for local\r
-   * @param default unit for mapped\r
-   * @return MapList\r
-   */\r
-  protected jalview.util.MapList parsemapType(MapType maprange, int localu, int mappedu)\r
-  {\r
-    jalview.util.MapList ml = null;\r
-    int[] localRange = getIntervals(maprange.getLocal());\r
-    int[] mappedRange = getIntervals(maprange.getMapped());\r
-    long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit() : localu;\r
-    long mu = maprange.getMapped().hasUnit() ? maprange.getMapped().getUnit() : mappedu;\r
-    ml = new jalview.util.MapList(localRange, mappedRange, (int)lu, (int)mu);\r
-    return ml;\r
-  }\r
-  protected jalview.util.MapList parsemapType(MapType map)\r
-  {\r
-    if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())\r
-    {\r
-      jalview.bin.Cache.log.warn("using default mapping length of 1:1 for map "\r
-              +(map.isRegistered() ? map.getVorbaId().toString() : ("<no Id registered> "+map.toString())));\r
-    }\r
-    return parsemapType(map, 1, 1); \r
-  }\r
-\r
-  /**\r
-   * initialise a MapType object from a MapList object.\r
-   * @param maprange\r
-   * @param ml\r
-   * @param setUnits\r
-   */\r
-  protected void initMapType(MapType maprange, jalview.util.MapList ml, boolean setUnits)\r
-  {\r
-    initMapType(maprange, ml, setUnits, false);\r
-  }\r
-  /**\r
-   * \r
-   * @param maprange\r
-   * @param ml\r
-   * @param setUnits\r
-   * @param reverse - reverse MapList mapping for Local and Mapped ranges and units \r
-   */\r
-  protected void initMapType(MapType maprange, jalview.util.MapList ml, boolean setUnits, boolean reverse)\r
-  {\r
-    if (ml==null)\r
-    {\r
-      throw new Error("Implementation error. MapList is null for initMapType.");\r
-    }\r
-    maprange.setLocal(new Local());\r
-    maprange.setMapped(new Mapped());\r
-    if (!reverse)\r
-      {\r
-      initRangeType(maprange.getLocal(), ml.getFromRanges());\r
-      initRangeType(maprange.getMapped(), ml.getToRanges());\r
-      } else {\r
-        initRangeType(maprange.getLocal(), ml.getToRanges());\r
-        initRangeType(maprange.getMapped(), ml.getFromRanges());\r
-      }\r
-    if (setUnits)\r
-    {\r
-      if (!reverse)\r
-      { \r
-        maprange.getLocal().setUnit(ml.getFromRatio());\r
-        maprange.getMapped().setUnit(ml.getToRatio());\r
-      } else {\r
-        maprange.getLocal().setUnit(ml.getToRatio());\r
-        maprange.getMapped().setUnit(ml.getFromRatio());\r
-      }\r
-    }\r
-  }\r
-\r
-}
\ No newline at end of file
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io.vamsas;
+
+import jalview.bin.Cache;
+import jalview.io.VamsasAppDatastore;
+import jalview.util.MessageManager;
+
+import java.util.List;
+import java.util.Vector;
+
+import uk.ac.vamsas.client.Vobject;
+import uk.ac.vamsas.objects.core.Local;
+import uk.ac.vamsas.objects.core.MapType;
+import uk.ac.vamsas.objects.core.Mapped;
+import uk.ac.vamsas.objects.core.RangeType;
+import uk.ac.vamsas.objects.core.Seg;
+
+/**
+ * Enhances DatastoreItem objects with additional functions to do with RangeType
+ * objects
+ * 
+ * @author JimP
+ * 
+ */
+public abstract class Rangetype extends DatastoreItem
+{
+
+  public Rangetype()
+  {
+    super();
+  }
+
+  public Rangetype(VamsasAppDatastore datastore)
+  {
+    super(datastore);
+  }
+
+  public Rangetype(VamsasAppDatastore datastore, Vobject vobj,
+          Class jvClass)
+  {
+    super(datastore, vobj, jvClass);
+  }
+
+  public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
+  {
+    super(datastore, jvobj, vClass);
+  }
+
+  /**
+   * get real bounds of a RangeType's specification. start and end are an
+   * inclusive range within which all segments and positions lie. TODO: refactor
+   * to vamsas utils
+   * 
+   * @param dseta
+   * @return int[] { start, end}
+   */
+  protected int[] getBounds(RangeType dseta)
+  {
+    if (dseta != null)
+    {
+      int[] se = null;
+      if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
+      {
+        throw new Error(MessageManager.getString(
+                "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
+      }
+      if (dseta.getSegCount() > 0)
+      {
+        se = getSegRange(dseta.getSeg(0), true);
+        for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
+        {
+          int nse[] = getSegRange(dseta.getSeg(s), true);
+          if (se[0] > nse[0])
+          {
+            se[0] = nse[0];
+          }
+          if (se[1] < nse[1])
+          {
+            se[1] = nse[1];
+          }
+        }
+      }
+      if (dseta.getPosCount() > 0)
+      {
+        // could do a polarity for pos range too. and pass back indication of
+        // discontinuities.
+        int pos = dseta.getPos(0).getI();
+        se = new int[] { pos, pos };
+        for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
+        {
+          pos = dseta.getPos(p).getI();
+          if (se[0] > pos)
+          {
+            se[0] = pos;
+          }
+          if (se[1] < pos)
+          {
+            se[1] = pos;
+          }
+        }
+      }
+      return se;
+    }
+    return null;
+  }
+
+  /**
+   * map from a rangeType's internal frame to the referenced object's coordinate
+   * frame.
+   * 
+   * @param dseta
+   * @return int [] { ref(pos)...} for all pos in rangeType's frame.
+   */
+  protected int[] getMapping(RangeType dseta)
+  {
+    Vector posList = new Vector();
+    if (dseta != null)
+    {
+      int[] se = null;
+      if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
+      {
+        throw new Error(MessageManager.getString(
+                "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
+      }
+      if (dseta.getSegCount() > 0)
+      {
+        for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
+        {
+          se = getSegRange(dseta.getSeg(s), false);
+          int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
+          for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
+          {
+            posList.add(Integer.valueOf(p));
+          }
+        }
+      }
+      else if (dseta.getPosCount() > 0)
+      {
+        int pos = dseta.getPos(0).getI();
+
+        for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
+        {
+          pos = dseta.getPos(p).getI();
+          posList.add(Integer.valueOf(pos));
+        }
+      }
+    }
+    if (posList != null && posList.size() > 0)
+    {
+      int[] range = new int[posList.size()];
+      for (int i = 0; i < range.length; i++)
+      {
+        range[i] = ((Integer) posList.elementAt(i)).intValue();
+      }
+      posList.clear();
+      return range;
+    }
+    return null;
+  }
+
+  protected int[] getIntervals(RangeType range)
+  {
+    int[] intervals = null;
+    Vector posList = new Vector();
+    if (range != null)
+    {
+      int[] se = null;
+      if (range.getSegCount() > 0 && range.getPosCount() > 0)
+      {
+        throw new Error(MessageManager.getString(
+                "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
+      }
+      if (range.getSegCount() > 0)
+      {
+        for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
+        {
+          se = getSegRange(range.getSeg(s), false);
+          posList.addElement(Integer.valueOf(se[0]));
+          posList.addElement(Integer.valueOf(se[1]));
+        }
+      }
+      else if (range.getPosCount() > 0)
+      {
+        int pos = range.getPos(0).getI();
+
+        for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
+        {
+          pos = range.getPos(p).getI();
+          posList.add(Integer.valueOf(pos));
+          posList.add(Integer.valueOf(pos));
+        }
+      }
+    }
+    if (posList != null && posList.size() > 0)
+    {
+      intervals = new int[posList.size()];
+      java.util.Enumeration e = posList.elements();
+      int i = 0;
+      while (e.hasMoreElements())
+      {
+        intervals[i++] = ((Integer) e.nextElement()).intValue();
+      }
+    }
+    return intervals;
+  }
+
+  /**
+   * initialise a range type object from a set of start/end inclusive intervals
+   * 
+   * @param mrt
+   * @param ranges
+   */
+  protected void initRangeType(RangeType mrt, List<int[]> ranges)
+  {
+    for (int[] range : ranges)
+    {
+      Seg vSeg = new Seg();
+      vSeg.setStart(range[0]);
+      vSeg.setEnd(range[1]);
+      vSeg.setInclusive(true);
+      mrt.addSeg(vSeg);
+    }
+  }
+
+  /**
+   * 
+   * @param maprange
+   *          where the from range is the local mapped range, and the to range
+   *          is the 'mapped' range in the MapRangeType
+   * @param default
+   *          unit for local
+   * @param default
+   *          unit for mapped
+   * @return MapList
+   */
+  protected jalview.util.MapList parsemapType(MapType maprange, int localu,
+          int mappedu)
+  {
+    jalview.util.MapList ml = null;
+    int[] localRange = getIntervals(maprange.getLocal());
+    int[] mappedRange = getIntervals(maprange.getMapped());
+    long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
+            : localu;
+    long mu = maprange.getMapped().hasUnit()
+            ? maprange.getMapped().getUnit()
+            : mappedu;
+    ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
+            (int) mu);
+    return ml;
+  }
+
+  protected jalview.util.MapList parsemapType(MapType map)
+  {
+    if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
+    {
+      Cache.warn("using default mapping length of 1:1 for map "
+                      + (map.isRegistered() ? map.getVorbaId().toString()
+                              : ("<no Id registered> " + map.toString())));
+    }
+    return parsemapType(map, 1, 1);
+  }
+
+  /**
+   * initialise a MapType object from a MapList object.
+   * 
+   * @param maprange
+   * @param ml
+   * @param setUnits
+   */
+  protected void initMapType(MapType maprange, jalview.util.MapList ml,
+          boolean setUnits)
+  {
+    initMapType(maprange, ml, setUnits, false);
+  }
+
+  /**
+   * 
+   * @param maprange
+   * @param ml
+   * @param setUnits
+   * @param reverse
+   *          - reverse MapList mapping for Local and Mapped ranges and units
+   */
+  protected void initMapType(MapType maprange, jalview.util.MapList ml,
+          boolean setUnits, boolean reverse)
+  {
+    if (ml == null)
+    {
+      throw new Error(
+              "Implementation error. MapList is null for initMapType.");
+    }
+    maprange.setLocal(new Local());
+    maprange.setMapped(new Mapped());
+    if (!reverse)
+    {
+      initRangeType(maprange.getLocal(), ml.getFromRanges());
+      initRangeType(maprange.getMapped(), ml.getToRanges());
+    }
+    else
+    {
+      initRangeType(maprange.getLocal(), ml.getToRanges());
+      initRangeType(maprange.getMapped(), ml.getFromRanges());
+    }
+    if (setUnits)
+    {
+      if (!reverse)
+      {
+        maprange.getLocal().setUnit(ml.getFromRatio());
+        maprange.getMapped().setUnit(ml.getToRatio());
+      }
+      else
+      {
+        maprange.getLocal().setUnit(ml.getToRatio());
+        maprange.getMapped().setUnit(ml.getFromRatio());
+      }
+      // TODO: and verify - raise an implementation fault notice if local/mapped
+      // range % Local/Mapped Ratio != 0
+      // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))
+
+    }
+  }
+
+}