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.io.VamsasAppDatastore;
24 import jalview.util.MessageManager;
26 import java.util.List;
27 import java.util.Vector;
29 import uk.ac.vamsas.client.Vobject;
30 import uk.ac.vamsas.objects.core.Local;
31 import uk.ac.vamsas.objects.core.MapType;
32 import uk.ac.vamsas.objects.core.Mapped;
33 import uk.ac.vamsas.objects.core.RangeType;
34 import uk.ac.vamsas.objects.core.Seg;
37 * Enhances DatastoreItem objects with additional functions to do with RangeType
43 public abstract class Rangetype extends DatastoreItem
51 public Rangetype(VamsasAppDatastore datastore)
56 public Rangetype(VamsasAppDatastore datastore, Vobject vobj,
59 super(datastore, vobj, jvClass);
62 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
64 super(datastore, jvobj, vClass);
68 * get real bounds of a RangeType's specification. start and end are an
69 * inclusive range within which all segments and positions lie. TODO: refactor
73 * @return int[] { start, end}
75 protected int[] getBounds(RangeType dseta)
80 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
82 throw new Error(MessageManager.getString(
83 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
85 if (dseta.getSegCount() > 0)
87 se = getSegRange(dseta.getSeg(0), true);
88 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
90 int nse[] = getSegRange(dseta.getSeg(s), true);
101 if (dseta.getPosCount() > 0)
103 // could do a polarity for pos range too. and pass back indication of
105 int pos = dseta.getPos(0).getI();
106 se = new int[] { pos, pos };
107 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
109 pos = dseta.getPos(p).getI();
126 * map from a rangeType's internal frame to the referenced object's coordinate
130 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
132 protected int[] getMapping(RangeType dseta)
134 Vector posList = new Vector();
138 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
140 throw new Error(MessageManager.getString(
141 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
143 if (dseta.getSegCount() > 0)
145 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
147 se = getSegRange(dseta.getSeg(s), false);
148 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
149 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
151 posList.add(new Integer(p));
155 else if (dseta.getPosCount() > 0)
157 int pos = dseta.getPos(0).getI();
159 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
161 pos = dseta.getPos(p).getI();
162 posList.add(new Integer(pos));
166 if (posList != null && posList.size() > 0)
168 int[] range = new int[posList.size()];
169 for (int i = 0; i < range.length; i++)
171 range[i] = ((Integer) posList.elementAt(i)).intValue();
179 protected int[] getIntervals(RangeType range)
181 int[] intervals = null;
182 Vector posList = new Vector();
186 if (range.getSegCount() > 0 && range.getPosCount() > 0)
188 throw new Error(MessageManager.getString(
189 "error.invalid_vamsas_rangetype_cannot_resolve_lists"));
191 if (range.getSegCount() > 0)
193 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
195 se = getSegRange(range.getSeg(s), false);
196 posList.addElement(new Integer(se[0]));
197 posList.addElement(new Integer(se[1]));
200 else if (range.getPosCount() > 0)
202 int pos = range.getPos(0).getI();
204 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
206 pos = range.getPos(p).getI();
207 posList.add(new Integer(pos));
208 posList.add(new Integer(pos));
212 if (posList != null && posList.size() > 0)
214 intervals = new int[posList.size()];
215 java.util.Enumeration e = posList.elements();
217 while (e.hasMoreElements())
219 intervals[i++] = ((Integer) e.nextElement()).intValue();
226 * initialise a range type object from a set of start/end inclusive intervals
231 protected void initRangeType(RangeType mrt, List<int[]> ranges)
233 for (int[] range : ranges)
235 Seg vSeg = new Seg();
236 vSeg.setStart(range[0]);
237 vSeg.setEnd(range[1]);
238 vSeg.setInclusive(true);
246 * where the from range is the local mapped range, and the to range
247 * is the 'mapped' range in the MapRangeType
254 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
257 jalview.util.MapList ml = null;
258 int[] localRange = getIntervals(maprange.getLocal());
259 int[] mappedRange = getIntervals(maprange.getMapped());
260 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
262 long mu = maprange.getMapped().hasUnit()
263 ? maprange.getMapped().getUnit()
265 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
270 protected jalview.util.MapList parsemapType(MapType map)
272 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
274 jalview.bin.Cache.log
275 .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)
308 throw new Error(MessageManager
309 .getString("error.implementation_error_maplist_is_null"));
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))