2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b1)
3 * Copyright (C) 2015 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, Class jvClass)
58 super(datastore, vobj, jvClass);
61 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
63 super(datastore, jvobj, vClass);
67 * get real bounds of a RangeType's specification. start and end are an
68 * inclusive range within which all segments and positions lie. TODO: refactor
72 * @return int[] { start, end}
74 protected int[] getBounds(RangeType dseta)
79 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
83 .getString("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)
142 .getString("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(new Integer(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(new Integer(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)
191 .getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
193 if (range.getSegCount() > 0)
195 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
197 se = getSegRange(range.getSeg(s), false);
198 posList.addElement(new Integer(se[0]));
199 posList.addElement(new Integer(se[1]));
202 else if (range.getPosCount() > 0)
204 int pos = range.getPos(0).getI();
206 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
208 pos = range.getPos(p).getI();
209 posList.add(new Integer(pos));
210 posList.add(new Integer(pos));
214 if (posList != null && posList.size() > 0)
216 intervals = new int[posList.size()];
217 java.util.Enumeration e = posList.elements();
219 while (e.hasMoreElements())
221 intervals[i++] = ((Integer) e.nextElement()).intValue();
228 * initialise a range type object from a set of start/end inclusive intervals
233 protected void initRangeType(RangeType mrt, List<int[]> ranges)
235 for (int[] range : ranges)
237 Seg vSeg = new Seg();
238 vSeg.setStart(range[0]);
239 vSeg.setEnd(range[1]);
240 vSeg.setInclusive(true);
248 * where the from range is the local mapped range, and the to range
249 * is the 'mapped' range in the MapRangeType
250 * @param default unit for local
251 * @param default unit for mapped
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() ? maprange.getMapped()
263 .getUnit() : mappedu;
264 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
269 protected jalview.util.MapList parsemapType(MapType map)
271 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
273 jalview.bin.Cache.log
274 .warn("using default mapping length of 1:1 for map "
275 + (map.isRegistered() ? map.getVorbaId().toString()
276 : ("<no Id registered> " + map.toString())));
278 return parsemapType(map, 1, 1);
282 * initialise a MapType object from a MapList object.
288 protected void initMapType(MapType maprange, jalview.util.MapList ml,
291 initMapType(maprange, ml, setUnits, false);
300 * - reverse MapList mapping for Local and Mapped ranges and units
302 protected void initMapType(MapType maprange, jalview.util.MapList ml,
303 boolean setUnits, boolean reverse)
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))