-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.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(new Integer(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(new Integer(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(new Integer(se[0]));
+ posList.addElement(new Integer(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(new Integer(pos));
+ posList.add(new Integer(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())
+ {
+ jalview.bin.Cache.log
+ .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(
+ MessageManager
+ .getString("error.implementation_error_maplist_is_null"));
+ }
+ 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))
+
+ }
+ }
+
+}