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, 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)
81 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
83 if (dseta.getSegCount() > 0)
85 se = getSegRange(dseta.getSeg(0), true);
86 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
88 int nse[] = getSegRange(dseta.getSeg(s), true);
99 if (dseta.getPosCount() > 0)
101 // could do a polarity for pos range too. and pass back indication of
103 int pos = dseta.getPos(0).getI();
106 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
108 pos = dseta.getPos(p).getI();
125 * map from a rangeType's internal frame to the referenced object's coordinate
129 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
131 protected int[] getMapping(RangeType dseta)
133 Vector posList = new Vector();
137 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
139 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
141 if (dseta.getSegCount() > 0)
143 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
145 se = getSegRange(dseta.getSeg(s), false);
146 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
147 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
149 posList.add(new Integer(p));
153 else if (dseta.getPosCount() > 0)
155 int pos = dseta.getPos(0).getI();
157 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
159 pos = dseta.getPos(p).getI();
160 posList.add(new Integer(pos));
164 if (posList != null && posList.size() > 0)
166 int[] range = new int[posList.size()];
167 for (int i = 0; i < range.length; i++)
169 range[i] = ((Integer) posList.elementAt(i)).intValue();
177 protected int[] getIntervals(RangeType range)
179 int[] intervals = null;
180 Vector posList = new Vector();
184 if (range.getSegCount() > 0 && range.getPosCount() > 0)
186 throw new Error(MessageManager.getString("error.invalid_vamsas_rangetype_cannot_resolve_lists"));
188 if (range.getSegCount() > 0)
190 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
192 se = getSegRange(range.getSeg(s), false);
193 posList.addElement(new Integer(se[0]));
194 posList.addElement(new Integer(se[1]));
197 else if (range.getPosCount() > 0)
199 int pos = range.getPos(0).getI();
201 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
203 pos = range.getPos(p).getI();
204 posList.add(new Integer(pos));
205 posList.add(new Integer(pos));
209 if (posList != null && posList.size() > 0)
211 intervals = new int[posList.size()];
212 java.util.Enumeration e = posList.elements();
214 while (e.hasMoreElements())
216 intervals[i++] = ((Integer) e.nextElement()).intValue();
223 * initialise a range type object from a set of start/end inclusive intervals
228 protected void initRangeType(RangeType mrt, List<int[]> ranges)
230 for (int[] range : ranges)
232 Seg vSeg = new Seg();
233 vSeg.setStart(range[0]);
234 vSeg.setEnd(range[1]);
235 vSeg.setInclusive(true);
243 * where the from range is the local mapped range, and the to range
244 * is the 'mapped' range in the MapRangeType
245 * @param default unit for local
246 * @param default unit for mapped
249 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
252 jalview.util.MapList ml = null;
253 int[] localRange = getIntervals(maprange.getLocal());
254 int[] mappedRange = getIntervals(maprange.getMapped());
255 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
257 long mu = maprange.getMapped().hasUnit() ? maprange.getMapped()
258 .getUnit() : mappedu;
259 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
264 protected jalview.util.MapList parsemapType(MapType map)
266 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
268 jalview.bin.Cache.log
269 .warn("using default mapping length of 1:1 for map "
270 + (map.isRegistered() ? map.getVorbaId().toString()
271 : ("<no Id registered> " + map.toString())));
273 return parsemapType(map, 1, 1);
277 * initialise a MapType object from a MapList object.
283 protected void initMapType(MapType maprange, jalview.util.MapList ml,
286 initMapType(maprange, ml, setUnits, false);
295 * - reverse MapList mapping for Local and Mapped ranges and units
297 protected void initMapType(MapType maprange, jalview.util.MapList ml,
298 boolean setUnits, boolean reverse)
302 throw new Error(MessageManager.getString("error.implementation_error_maplist_is_null"));
304 maprange.setLocal(new Local());
305 maprange.setMapped(new Mapped());
308 initRangeType(maprange.getLocal(), ml.getFromRanges());
309 initRangeType(maprange.getMapped(), ml.getToRanges());
313 initRangeType(maprange.getLocal(), ml.getToRanges());
314 initRangeType(maprange.getMapped(), ml.getFromRanges());
320 maprange.getLocal().setUnit(ml.getFromRatio());
321 maprange.getMapped().setUnit(ml.getToRatio());
325 maprange.getLocal().setUnit(ml.getToRatio());
326 maprange.getMapped().setUnit(ml.getFromRatio());
328 // TODO: and verify - raise an implementation fault notice if local/mapped
329 // range % Local/Mapped Ratio != 0
330 // if (uk.ac.vamsas.objects.utils.Range.getIntervals(range))