2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
3 * Copyright (C) 2008 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.objects.core.Local;
24 import uk.ac.vamsas.objects.core.Map;
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.datamodel.Mapping;
30 import jalview.io.VamsasAppDatastore;
32 public class Rangetype extends DatastoreItem
40 public Rangetype(VamsasAppDatastore datastore)
46 * get real bounds of a RangeType's specification. start and end are an
47 * inclusive range within which all segments and positions lie. TODO: refactor
51 * @return int[] { start, end}
53 protected int[] getBounds(RangeType dseta)
58 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
61 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
63 if (dseta.getSegCount() > 0)
65 se = getSegRange(dseta.getSeg(0), true);
66 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
68 int nse[] = getSegRange(dseta.getSeg(s), true);
79 if (dseta.getPosCount() > 0)
81 // could do a polarity for pos range too. and pass back indication of
83 int pos = dseta.getPos(0).getI();
86 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
88 pos = dseta.getPos(p).getI();
105 * map from a rangeType's internal frame to the referenced object's coordinate
109 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
111 protected int[] getMapping(RangeType dseta)
113 Vector posList = new Vector();
117 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
120 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
122 if (dseta.getSegCount() > 0)
124 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
126 se = getSegRange(dseta.getSeg(s), false);
127 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
128 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
130 posList.add(new Integer(p));
134 else if (dseta.getPosCount() > 0)
136 int pos = dseta.getPos(0).getI();
138 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
140 pos = dseta.getPos(p).getI();
141 posList.add(new Integer(pos));
145 if (posList != null && posList.size() > 0)
147 int[] range = new int[posList.size()];
148 for (int i = 0; i < range.length; i++)
150 range[i] = ((Integer) posList.elementAt(i)).intValue();
158 protected int[] getIntervals(RangeType range)
160 int[] intervals = null;
161 Vector posList = new Vector();
165 if (range.getSegCount() > 0 && range.getPosCount() > 0)
168 "Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
170 if (range.getSegCount() > 0)
172 for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
174 se = getSegRange(range.getSeg(s), false);
175 posList.addElement(new Integer(se[0]));
176 posList.addElement(new Integer(se[1]));
179 else if (range.getPosCount() > 0)
181 int pos = range.getPos(0).getI();
183 for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
185 pos = range.getPos(p).getI();
186 posList.add(new Integer(pos));
187 posList.add(new Integer(pos));
191 if (posList != null && posList.size() > 0)
193 intervals = new int[posList.size()];
194 java.util.Enumeration e = posList.elements();
196 while (e.hasMoreElements())
198 intervals[i++] = ((Integer) e.nextElement()).intValue();
205 * initialise a range type object from a set of start/end inclusive intervals
210 protected void initRangeType(RangeType mrt, int[] range)
212 for (int i = 0; i < range.length; i += 2)
214 Seg vSeg = new Seg();
215 vSeg.setStart(range[i]);
216 vSeg.setEnd(range[i + 1]);
217 vSeg.setInclusive(true);
225 * where the from range is the local mapped range, and the to
226 * range is the 'mapped' range in the MapRangeType
233 protected jalview.util.MapList parsemapType(MapType maprange, int localu,
236 jalview.util.MapList ml = null;
237 int[] localRange = getIntervals(maprange.getLocal());
238 int[] mappedRange = getIntervals(maprange.getMapped());
239 long lu = maprange.getLocal().hasUnit() ? maprange.getLocal().getUnit()
241 long mu = maprange.getMapped().hasUnit() ? maprange.getMapped()
242 .getUnit() : mappedu;
243 ml = new jalview.util.MapList(localRange, mappedRange, (int) lu,
248 protected jalview.util.MapList parsemapType(MapType map)
250 if (!map.getLocal().hasUnit() || map.getMapped().hasUnit())
252 jalview.bin.Cache.log
253 .warn("using default mapping length of 1:1 for map "
254 + (map.isRegistered() ? map.getVorbaId().toString()
255 : ("<no Id registered> " + map.toString())));
257 return parsemapType(map, 1, 1);
261 * initialise a MapType object from a MapList object.
267 protected void initMapType(MapType maprange, jalview.util.MapList ml,
270 initMapType(maprange, ml, setUnits, false);
279 * reverse MapList mapping for Local and Mapped ranges and
282 protected void initMapType(MapType maprange, jalview.util.MapList ml,
283 boolean setUnits, boolean reverse)
288 "Implementation error. MapList is null for initMapType.");
290 maprange.setLocal(new Local());
291 maprange.setMapped(new Mapped());
294 initRangeType(maprange.getLocal(), ml.getFromRanges());
295 initRangeType(maprange.getMapped(), ml.getToRanges());
299 initRangeType(maprange.getLocal(), ml.getToRanges());
300 initRangeType(maprange.getMapped(), ml.getFromRanges());
306 maprange.getLocal().setUnit(ml.getFromRatio());
307 maprange.getMapped().setUnit(ml.getToRatio());
311 maprange.getLocal().setUnit(ml.getToRatio());
312 maprange.getMapped().setUnit(ml.getFromRatio());