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.Cache;
24 import jalview.io.VamsasAppDatastore;
25 import jalview.util.MapList;
26 import jalview.util.MessageManager;
28 import java.util.List;
29 import java.util.Vector;
31 import uk.ac.vamsas.client.Vobject;
32 import uk.ac.vamsas.objects.core.Local;
33 import uk.ac.vamsas.objects.core.MapType;
34 import uk.ac.vamsas.objects.core.Mapped;
35 import uk.ac.vamsas.objects.core.RangeType;
36 import uk.ac.vamsas.objects.core.Seg;
39 * Enhances DatastoreItem objects with additional functions to do with RangeType
45 public abstract class Rangetype extends DatastoreItem
53 public Rangetype(VamsasAppDatastore datastore)
58 public Rangetype(VamsasAppDatastore datastore, Vobject vobj, Class jvClass)
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("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();
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("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("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
190 if (range.getSegCount() > 0)
192 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
194 se = getSegRange(range.getSeg(s), false);
195 posList.addElement(new Integer(se[0]));
196 posList.addElement(new Integer(se[1]));
199 else if (range.getPosCount() > 0)
201 int pos = range.getPos(0).getI();
203 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
205 pos = range.getPos(p).getI();
206 posList.add(new Integer(pos));
207 posList.add(new Integer(pos));
211 if (posList != null && posList.size() > 0)
213 intervals = new int[posList.size()];
214 java.util.Enumeration e = posList.elements();
216 while (e.hasMoreElements())
218 intervals[i++] = ((Integer) e.nextElement()).intValue();
225 * initialise a range type object from a set of start/end inclusive intervals
230 protected void initRangeType(RangeType mrt, List<int[]> ranges)
232 for (int[] range : ranges)
234 Seg vSeg = new Seg();
235 vSeg.setStart(range[0]);
236 vSeg.setEnd(range[1]);
237 vSeg.setInclusive(true);
245 * where the from range is the local mapped range, and the to range
246 * is the 'mapped' range in the MapRangeType
247 * @param default unit for local
248 * @param default unit for mapped
251 protected MapList parsemapType(MapType maprange, int localu,
255 int[] localRange = getIntervals(maprange.getLocal());
256 int[] mappedRange = getIntervals(maprange.getMapped());
257 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
259 long mu = maprange.getMapped().hasUnit() ? maprange.getMapped()
260 .getUnit() : mappedu;
261 ml = new MapList(localRange, mappedRange, (int) lu,
266 protected MapList parsemapType(MapType map)
268 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
271 .warn("using default mapping length of 1:1 for map "
272 + (map.isRegistered() ? map.getVorbaId().toString()
273 : ("<no Id registered> " + map.toString())));
275 return parsemapType(map, 1, 1);
279 * initialise a MapType object from a MapList object.
285 protected void initMapType(MapType maprange, MapList ml,
288 initMapType(maprange, ml, setUnits, false);
297 * - reverse MapList mapping for Local and Mapped ranges and units
299 protected void initMapType(MapType maprange, MapList ml,
300 boolean setUnits, boolean reverse)
304 throw new Error(MessageManager.getString("error.implementation_error_maplist_is_null"));
306 maprange.setLocal(new Local());
307 maprange.setMapped(new Mapped());
310 initRangeType(maprange.getLocal(), ml.getFromRanges());
311 initRangeType(maprange.getMapped(), ml.getToRanges());
315 initRangeType(maprange.getLocal(), ml.getToRanges());
316 initRangeType(maprange.getMapped(), ml.getFromRanges());
322 maprange.getLocal().setUnit(ml.getFromRatio());
323 maprange.getMapped().setUnit(ml.getToRatio());
327 maprange.getLocal().setUnit(ml.getToRatio());
328 maprange.getMapped().setUnit(ml.getFromRatio());
330 // TODO: and verify - raise an implementation fault notice if local/mapped
331 // range % Local/Mapped Ratio != 0
332 // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))