2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
3 * Copyright (C) 2014 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 java.util.Vector;
25 import uk.ac.vamsas.client.Vobject;
26 import uk.ac.vamsas.objects.core.Local;
27 import uk.ac.vamsas.objects.core.MapType;
28 import uk.ac.vamsas.objects.core.Mapped;
29 import uk.ac.vamsas.objects.core.RangeType;
30 import uk.ac.vamsas.objects.core.Seg;
31 import jalview.io.VamsasAppDatastore;
32 import jalview.util.MessageManager;
35 * Enhances DatastoreItem objects with additional functions to do with RangeType
41 public abstract class Rangetype extends DatastoreItem
49 public Rangetype(VamsasAppDatastore datastore)
54 public Rangetype(VamsasAppDatastore datastore, Vobject vobj, Class jvClass)
56 super(datastore, vobj, jvClass);
59 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
61 super(datastore, jvobj, vClass);
65 * get real bounds of a RangeType's specification. start and end are an
66 * inclusive range within which all segments and positions lie. TODO: refactor
70 * @return int[] { start, end}
72 protected int[] getBounds(RangeType dseta)
77 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
79 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
81 if (dseta.getSegCount() > 0)
83 se = getSegRange(dseta.getSeg(0), true);
84 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
86 int nse[] = getSegRange(dseta.getSeg(s), true);
97 if (dseta.getPosCount() > 0)
99 // could do a polarity for pos range too. and pass back indication of
101 int pos = dseta.getPos(0).getI();
104 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
106 pos = dseta.getPos(p).getI();
123 * map from a rangeType's internal frame to the referenced object's coordinate
127 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
129 protected int[] getMapping(RangeType dseta)
131 Vector posList = new Vector();
135 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
137 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
139 if (dseta.getSegCount() > 0)
141 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
143 se = getSegRange(dseta.getSeg(s), false);
144 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
145 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
147 posList.add(new Integer(p));
151 else if (dseta.getPosCount() > 0)
153 int pos = dseta.getPos(0).getI();
155 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
157 pos = dseta.getPos(p).getI();
158 posList.add(new Integer(pos));
162 if (posList != null && posList.size() > 0)
164 int[] range = new int[posList.size()];
165 for (int i = 0; i < range.length; i++)
167 range[i] = ((Integer) posList.elementAt(i)).intValue();
175 protected int[] getIntervals(RangeType range)
177 int[] intervals = null;
178 Vector posList = new Vector();
182 if (range.getSegCount() > 0 && range.getPosCount() > 0)
184 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
186 if (range.getSegCount() > 0)
188 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
190 se = getSegRange(range.getSeg(s), false);
191 posList.addElement(new Integer(se[0]));
192 posList.addElement(new Integer(se[1]));
195 else if (range.getPosCount() > 0)
197 int pos = range.getPos(0).getI();
199 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
201 pos = range.getPos(p).getI();
202 posList.add(new Integer(pos));
203 posList.add(new Integer(pos));
207 if (posList != null && posList.size() > 0)
209 intervals = new int[posList.size()];
210 java.util.Enumeration e = posList.elements();
212 while (e.hasMoreElements())
214 intervals[i++] = ((Integer) e.nextElement()).intValue();
221 * initialise a range type object from a set of start/end inclusive intervals
226 protected void initRangeType(RangeType mrt, int[] range)
228 for (int i = 0; i < range.length; i += 2)
230 Seg vSeg = new Seg();
231 vSeg.setStart(range[i]);
232 vSeg.setEnd(range[i + 1]);
233 vSeg.setInclusive(true);
241 * where the from range is the local mapped range, and the to range
242 * is the 'mapped' range in the MapRangeType
243 * @param default unit for local
244 * @param default unit for mapped
247 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
250 jalview.util.MapList ml = null;
251 int[] localRange = getIntervals(maprange.getLocal());
252 int[] mappedRange = getIntervals(maprange.getMapped());
253 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
255 long mu = maprange.getMapped().hasUnit() ? maprange.getMapped()
256 .getUnit() : mappedu;
257 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
262 protected jalview.util.MapList parsemapType(MapType map)
264 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
266 jalview.bin.Cache.log
267 .warn("using default mapping length of 1:1 for map "
268 + (map.isRegistered() ? map.getVorbaId().toString()
269 : ("<no Id registered> " + map.toString())));
271 return parsemapType(map, 1, 1);
275 * initialise a MapType object from a MapList object.
281 protected void initMapType(MapType maprange, jalview.util.MapList ml,
284 initMapType(maprange, ml, setUnits, false);
293 * - reverse MapList mapping for Local and Mapped ranges and units
295 protected void initMapType(MapType maprange, jalview.util.MapList ml,
296 boolean setUnits, boolean reverse)
300 throw new Error(MessageManager.getString("error.implementation_error_maplist_is_null"));
302 maprange.setLocal(new Local());
303 maprange.setMapped(new Mapped());
306 initRangeType(maprange.getLocal(), ml.getFromRanges());
307 initRangeType(maprange.getMapped(), ml.getToRanges());
311 initRangeType(maprange.getLocal(), ml.getToRanges());
312 initRangeType(maprange.getMapped(), ml.getFromRanges());
318 maprange.getLocal().setUnit(ml.getFromRatio());
319 maprange.getMapped().setUnit(ml.getToRatio());
323 maprange.getLocal().setUnit(ml.getToRatio());
324 maprange.getMapped().setUnit(ml.getFromRatio());
326 // TODO: and verify - raise an implementation fault notice if local/mapped
327 // range % Local/Mapped Ratio != 0
328 // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))