2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.io.vamsas;
23 import jalview.bin.Console;
24 import jalview.io.VamsasAppDatastore;
25 import jalview.util.MessageManager;
27 import java.util.List;
28 import java.util.Vector;
30 import uk.ac.vamsas.client.Vobject;
31 import uk.ac.vamsas.objects.core.Local;
32 import uk.ac.vamsas.objects.core.MapType;
33 import uk.ac.vamsas.objects.core.Mapped;
34 import uk.ac.vamsas.objects.core.RangeType;
35 import uk.ac.vamsas.objects.core.Seg;
38 * Enhances DatastoreItem objects with additional functions to do with RangeType
44 public abstract class Rangetype extends DatastoreItem
52 public Rangetype(VamsasAppDatastore datastore)
57 public Rangetype(VamsasAppDatastore datastore, Vobject vobj,
60 super(datastore, vobj, jvClass);
63 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
65 super(datastore, jvobj, vClass);
69 * get real bounds of a RangeType's specification. start and end are an
70 * inclusive range within which all segments and positions lie. TODO: refactor
74 * @return int[] { start, end}
76 protected int[] getBounds(RangeType dseta)
81 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
83 throw new Error(MessageManager.getString(
84 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
86 if (dseta.getSegCount() > 0)
88 se = getSegRange(dseta.getSeg(0), true);
89 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
91 int nse[] = getSegRange(dseta.getSeg(s), true);
102 if (dseta.getPosCount() > 0)
104 // could do a polarity for pos range too. and pass back indication of
106 int pos = dseta.getPos(0).getI();
107 se = new int[] { pos, pos };
108 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
110 pos = dseta.getPos(p).getI();
127 * map from a rangeType's internal frame to the referenced object's coordinate
131 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
133 protected int[] getMapping(RangeType dseta)
135 Vector posList = new Vector();
139 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
141 throw new Error(MessageManager.getString(
142 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
144 if (dseta.getSegCount() > 0)
146 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
148 se = getSegRange(dseta.getSeg(s), false);
149 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
150 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
152 posList.add(Integer.valueOf(p));
156 else if (dseta.getPosCount() > 0)
158 int pos = dseta.getPos(0).getI();
160 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
162 pos = dseta.getPos(p).getI();
163 posList.add(Integer.valueOf(pos));
167 if (posList != null && posList.size() > 0)
169 int[] range = new int[posList.size()];
170 for (int i = 0; i < range.length; i++)
172 range[i] = ((Integer) posList.elementAt(i)).intValue();
180 protected int[] getIntervals(RangeType range)
182 int[] intervals = null;
183 Vector posList = new Vector();
187 if (range.getSegCount() > 0 && range.getPosCount() > 0)
189 throw new Error(MessageManager.getString(
190 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
192 if (range.getSegCount() > 0)
194 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
196 se = getSegRange(range.getSeg(s), false);
197 posList.addElement(Integer.valueOf(se[0]));
198 posList.addElement(Integer.valueOf(se[1]));
201 else if (range.getPosCount() > 0)
203 int pos = range.getPos(0).getI();
205 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
207 pos = range.getPos(p).getI();
208 posList.add(Integer.valueOf(pos));
209 posList.add(Integer.valueOf(pos));
213 if (posList != null && posList.size() > 0)
215 intervals = new int[posList.size()];
216 java.util.Enumeration e = posList.elements();
218 while (e.hasMoreElements())
220 intervals[i++] = ((Integer) e.nextElement()).intValue();
227 * initialise a range type object from a set of start/end inclusive intervals
232 protected void initRangeType(RangeType mrt, List<int[]> ranges)
234 for (int[] range : ranges)
236 Seg vSeg = new Seg();
237 vSeg.setStart(range[0]);
238 vSeg.setEnd(range[1]);
239 vSeg.setInclusive(true);
247 * where the from range is the local mapped range, and the to range
248 * is the 'mapped' range in the MapRangeType
255 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
258 jalview.util.MapList ml = null;
259 int[] localRange = getIntervals(maprange.getLocal());
260 int[] mappedRange = getIntervals(maprange.getMapped());
261 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
263 long mu = maprange.getMapped().hasUnit()
264 ? maprange.getMapped().getUnit()
266 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
271 protected jalview.util.MapList parsemapType(MapType map)
273 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
275 Console.warn("using default mapping length of 1:1 for map "
276 + (map.isRegistered() ? map.getVorbaId().toString()
277 : ("<no Id registered> " + map.toString())));
279 return parsemapType(map, 1, 1);
283 * initialise a MapType object from a MapList object.
289 protected void initMapType(MapType maprange, jalview.util.MapList ml,
292 initMapType(maprange, ml, setUnits, false);
301 * - reverse MapList mapping for Local and Mapped ranges and units
303 protected void initMapType(MapType maprange, jalview.util.MapList ml,
304 boolean setUnits, boolean reverse)
309 "Implementation error. MapList is null for initMapType.");
311 maprange.setLocal(new Local());
312 maprange.setMapped(new Mapped());
315 initRangeType(maprange.getLocal(), ml.getFromRanges());
316 initRangeType(maprange.getMapped(), ml.getToRanges());
320 initRangeType(maprange.getLocal(), ml.getToRanges());
321 initRangeType(maprange.getMapped(), ml.getFromRanges());
327 maprange.getLocal().setUnit(ml.getFromRatio());
328 maprange.getMapped().setUnit(ml.getToRatio());
332 maprange.getLocal().setUnit(ml.getToRatio());
333 maprange.getMapped().setUnit(ml.getFromRatio());
335 // TODO: and verify - raise an implementation fault notice if local/mapped
336 // range % Local/Mapped Ratio != 0
337 // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))