2 * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
3 * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
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.Map;
26 import uk.ac.vamsas.objects.core.MapType;
27 import uk.ac.vamsas.objects.core.Mapped;
28 import uk.ac.vamsas.objects.core.RangeType;
29 import uk.ac.vamsas.objects.core.Seg;
30 import jalview.datamodel.DBRefEntry;
31 import jalview.datamodel.Mapping;
32 import jalview.io.VamsasAppDatastore;
34 * Enhances DatastoreItem objects with additional functions to do with RangeType objects
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);
55 public Rangetype(VamsasAppDatastore datastore, Object jvobj, Class vClass)
57 super(datastore, jvobj, vClass);
61 * get real bounds of a RangeType's specification. start and end are an
62 * inclusive range within which all segments and positions lie. TODO: refactor
66 * @return int[] { start, end}
68 protected int[] getBounds(RangeType dseta)
73 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
76 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
78 if (dseta.getSegCount() > 0)
80 se = getSegRange(dseta.getSeg(0), true);
81 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
83 int nse[] = getSegRange(dseta.getSeg(s), true);
94 if (dseta.getPosCount() > 0)
96 // could do a polarity for pos range too. and pass back indication of
98 int pos = dseta.getPos(0).getI();
101 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
103 pos = dseta.getPos(p).getI();
120 * map from a rangeType's internal frame to the referenced object's coordinate
124 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
126 protected int[] getMapping(RangeType dseta)
128 Vector posList = new Vector();
132 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
135 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
137 if (dseta.getSegCount() > 0)
139 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
141 se = getSegRange(dseta.getSeg(s), false);
142 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
143 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
145 posList.add(new Integer(p));
149 else if (dseta.getPosCount() > 0)
151 int pos = dseta.getPos(0).getI();
153 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
155 pos = dseta.getPos(p).getI();
156 posList.add(new Integer(pos));
160 if (posList != null && posList.size() > 0)
162 int[] range = new int[posList.size()];
163 for (int i = 0; i < range.length; i++)
165 range[i] = ((Integer) posList.elementAt(i)).intValue();
173 protected int[] getIntervals(RangeType range)
175 int[] intervals = null;
176 Vector posList = new Vector();
180 if (range.getSegCount() > 0 && range.getPosCount() > 0)
183 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
185 if (range.getSegCount() > 0)
187 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
189 se = getSegRange(range.getSeg(s), false);
190 posList.addElement(new Integer(se[0]));
191 posList.addElement(new Integer(se[1]));
194 else if (range.getPosCount() > 0)
196 int pos = range.getPos(0).getI();
198 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
200 pos = range.getPos(p).getI();
201 posList.add(new Integer(pos));
202 posList.add(new Integer(pos));
206 if (posList != null && posList.size() > 0)
208 intervals = new int[posList.size()];
209 java.util.Enumeration e = posList.elements();
211 while (e.hasMoreElements())
213 intervals[i++] = ((Integer) e.nextElement()).intValue();
220 * initialise a range type object from a set of start/end inclusive intervals
225 protected void initRangeType(RangeType mrt, int[] range)
227 for (int i = 0; i < range.length; i += 2)
229 Seg vSeg = new Seg();
230 vSeg.setStart(range[i]);
231 vSeg.setEnd(range[i + 1]);
232 vSeg.setInclusive(true);
240 * where the from range is the local mapped range, and the to
241 * range is the 'mapped' range in the MapRangeType
248 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
251 jalview.util.MapList ml = null;
252 int[] localRange = getIntervals(maprange.getLocal());
253 int[] mappedRange = getIntervals(maprange.getMapped());
254 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
256 long mu = maprange.getMapped().hasUnit() ? maprange.getMapped()
257 .getUnit() : mappedu;
258 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
263 protected jalview.util.MapList parsemapType(MapType map)
265 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
267 jalview.bin.Cache.log
268 .warn("using default mapping length of 1:1 for map "
269 + (map.isRegistered() ? map.getVorbaId().toString()
270 : ("<no Id registered> " + map.toString())));
272 return parsemapType(map, 1, 1);
276 * initialise a MapType object from a MapList object.
282 protected void initMapType(MapType maprange, jalview.util.MapList ml,
285 initMapType(maprange, ml, setUnits, false);
294 * reverse MapList mapping for Local and Mapped ranges and
297 protected void initMapType(MapType maprange, jalview.util.MapList ml,
298 boolean setUnits, boolean reverse)
303 "Implementation error. MapList is null for initMapType.");
305 maprange.setLocal(new Local());
306 maprange.setMapped(new Mapped());
309 initRangeType(maprange.getLocal(), ml.getFromRanges());
310 initRangeType(maprange.getMapped(), ml.getToRanges());
314 initRangeType(maprange.getLocal(), ml.getToRanges());
315 initRangeType(maprange.getMapped(), ml.getFromRanges());
321 maprange.getLocal().setUnit(ml.getFromRatio());
322 maprange.getMapped().setUnit(ml.getToRatio());
326 maprange.getLocal().setUnit(ml.getToRatio());
327 maprange.getMapped().setUnit(ml.getFromRatio());