2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
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 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
17 * The Jalview Authors are detailed in the 'AUTHORS' file.
19 package jalview.io.vamsas;
21 import java.util.Vector;
23 import uk.ac.vamsas.client.Vobject;
24 import uk.ac.vamsas.objects.core.Local;
25 import uk.ac.vamsas.objects.core.MapType;
26 import uk.ac.vamsas.objects.core.Mapped;
27 import uk.ac.vamsas.objects.core.RangeType;
28 import uk.ac.vamsas.objects.core.Seg;
29 import jalview.io.VamsasAppDatastore;
32 * Enhances DatastoreItem objects with additional functions to do with RangeType
38 public abstract class Rangetype extends DatastoreItem
46 public Rangetype(VamsasAppDatastore datastore)
51 public Rangetype(VamsasAppDatastore datastore, Vobject vobj, Class jvClass)
53 super(datastore, vobj, jvClass);
56 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
58 super(datastore, jvobj, vClass);
62 * get real bounds of a RangeType's specification. start and end are an
63 * inclusive range within which all segments and positions lie. TODO: refactor
67 * @return int[] { start, end}
69 protected int[] getBounds(RangeType dseta)
74 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
77 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
79 if (dseta.getSegCount() > 0)
81 se = getSegRange(dseta.getSeg(0), true);
82 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
84 int nse[] = getSegRange(dseta.getSeg(s), true);
95 if (dseta.getPosCount() > 0)
97 // could do a polarity for pos range too. and pass back indication of
99 int pos = dseta.getPos(0).getI();
102 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
104 pos = dseta.getPos(p).getI();
121 * map from a rangeType's internal frame to the referenced object's coordinate
125 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
127 protected int[] getMapping(RangeType dseta)
129 Vector posList = new Vector();
133 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
136 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
138 if (dseta.getSegCount() > 0)
140 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
142 se = getSegRange(dseta.getSeg(s), false);
143 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
144 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
146 posList.add(new Integer(p));
150 else if (dseta.getPosCount() > 0)
152 int pos = dseta.getPos(0).getI();
154 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
156 pos = dseta.getPos(p).getI();
157 posList.add(new Integer(pos));
161 if (posList != null && posList.size() > 0)
163 int[] range = new int[posList.size()];
164 for (int i = 0; i < range.length; i++)
166 range[i] = ((Integer) posList.elementAt(i)).intValue();
174 protected int[] getIntervals(RangeType range)
176 int[] intervals = null;
177 Vector posList = new Vector();
181 if (range.getSegCount() > 0 && range.getPosCount() > 0)
184 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
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)
301 "Implementation error. MapList is null for initMapType.");
303 maprange.setLocal(new Local());
304 maprange.setMapped(new Mapped());
307 initRangeType(maprange.getLocal(), ml.getFromRanges());
308 initRangeType(maprange.getMapped(), ml.getToRanges());
312 initRangeType(maprange.getLocal(), ml.getToRanges());
313 initRangeType(maprange.getMapped(), ml.getFromRanges());
319 maprange.getLocal().setUnit(ml.getFromRatio());
320 maprange.getMapped().setUnit(ml.getToRatio());
324 maprange.getLocal().setUnit(ml.getToRatio());
325 maprange.getMapped().setUnit(ml.getFromRatio());
327 // TODO: and verify - raise an implementation fault notice if local/mapped
328 // range % Local/Mapped Ratio != 0
329 // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))