1 package uk.ac.vamsas.objects.utils;
\r
3 import java.util.Vector;
\r
6 import uk.ac.vamsas.objects.core.RangeType;
\r
7 import uk.ac.vamsas.objects.core.Seg;
\r
12 * get start<end range of segment, adjusting for inclusivity flag and
\r
16 * @param ensureDirection when true - always ensure start is less than end.
\r
17 * @return int[] { start, end, direction} where direction==1 for range running from end to start.
\r
19 public static int[] getSegRange(Seg visSeg, boolean ensureDirection)
\r
21 boolean incl = visSeg.getInclusive();
\r
22 // adjust for inclusive flag.
\r
23 int pol = (visSeg.getStart() <= visSeg.getEnd()) ? 1 : -1; // polarity of
\r
25 int start = visSeg.getStart() + (incl ? 0 : pol);
\r
26 int end = visSeg.getEnd() + (incl ? 0 : -pol);
\r
27 if (ensureDirection && pol == -1)
\r
29 // jalview doesn't deal with inverted ranges, yet.
\r
36 start, end, pol < 0 ? 1 : 0};
\r
40 * get real bounds of a RangeType's specification. start and end are an
\r
41 * inclusive range within which all segments and positions lie.
\r
42 * TODO: refactor to vamsas utils
\r
44 * @return int[] { start, end}
\r
46 public static int[] getBounds(RangeType dseta)
\r
51 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
\r
53 throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
\r
55 if (dseta.getSegCount() > 0)
\r
57 se = getSegRange(dseta.getSeg(0), true);
\r
58 for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++)
\r
60 int nse[] = getSegRange(dseta.getSeg(s), true);
\r
71 if (dseta.getPosCount() > 0)
\r
73 // could do a polarity for pos range too. and pass back indication of discontinuities.
\r
74 int pos = dseta.getPos(0).getI();
\r
78 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
\r
80 pos = dseta.getPos(p).getI();
\r
97 * map from a rangeType's internal frame to the referenced object's coordinate frame.
\r
99 * @return int [] { ref(pos)...} for all pos in rangeType's frame.
\r
101 public static int[] getMapping(RangeType dseta)
\r
103 Vector posList = new Vector();
\r
107 if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
\r
109 throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
\r
111 if (dseta.getSegCount() > 0)
\r
113 for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++)
\r
115 se = getSegRange(dseta.getSeg(s), false);
\r
116 int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
\r
117 for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
\r
119 posList.add(new Integer(p));
\r
123 else if (dseta.getPosCount() > 0)
\r
125 int pos = dseta.getPos(0).getI();
\r
127 for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
\r
129 pos = dseta.getPos(p).getI();
\r
130 posList.add(new Integer(pos));
\r
134 if (posList != null && posList.size() > 0)
\r
136 int[] range = new int[posList.size()];
\r
137 for (int i = 0; i < range.length; i++)
\r
139 range[i] = ( (Integer) posList.elementAt(i)).intValue();
\r