package uk.ac.vamsas.objects.utils; import java.util.Vector; import uk.ac.vamsas.objects.core.Local; import uk.ac.vamsas.objects.core.MapType; import uk.ac.vamsas.objects.core.Mapped; import uk.ac.vamsas.objects.core.RangeType; import uk.ac.vamsas.objects.core.Seg; /** * Utilities for working with RangeType and MapType objects. * Derived from bitter experience. * @author JimP * */ public class Range { /** * get start 0 && dseta.getPosCount() > 0) { throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!"); } if (dseta.getSegCount() > 0) { se = getSegRange(dseta.getSeg(0), true); for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++) { int nse[] = getSegRange(dseta.getSeg(s), true); if (se[0] > nse[0]) { se[0] = nse[0]; } if (se[1] < nse[1]) { se[1] = nse[1]; } } } if (dseta.getPosCount() > 0) { // could do a polarity for pos range too. and pass back indication of discontinuities. int pos = dseta.getPos(0).getI(); se = new int[] { pos, pos}; for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++) { pos = dseta.getPos(p).getI(); if (se[0] > pos) { se[0] = pos; } if (se[1] < pos) { se[1] = pos; } } } return se; } return null; } /** * map from a rangeType's internal frame to the referenced object's coordinate frame. * @param dseta * @return int [] { ref(pos)...} for all pos in rangeType's frame. */ public static int[] getMapping(RangeType dseta) { Vector posList = new Vector(); if (dseta != null) { int[] se = null; if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0) { throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!"); } if (dseta.getSegCount() > 0) { for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++) { se = getSegRange(dseta.getSeg(s), false); int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1); for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1) { posList.add(new Integer(p)); } } } else if (dseta.getPosCount() > 0) { int pos = dseta.getPos(0).getI(); for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++) { pos = dseta.getPos(p).getI(); posList.add(new Integer(pos)); } } } if (posList != null && posList.size() > 0) { int[] range = new int[posList.size()]; for (int i = 0; i < range.length; i++) { range[i] = ( (Integer) posList.elementAt(i)).intValue(); } posList.clear(); return range; } return null; } public static int[] getIntervals(RangeType range) { int[] intervals=null; Vector posList = new Vector(); if (range != null) { int[] se = null; if (range.getSegCount() > 0 && range.getPosCount() > 0) { throw new Error("Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!"); } if (range.getSegCount() > 0) { for (int s = 0, sSize = range.getSegCount(); s < sSize; s++) { se = getSegRange(range.getSeg(s), false); posList.addElement(new Integer(se[0])); posList.addElement(new Integer(se[1])); } } else if (range.getPosCount() > 0) { int pos = range.getPos(0).getI(); for (int p = 0, pSize = range.getPosCount(); p < pSize; p++) { pos = range.getPos(p).getI(); posList.add(new Integer(pos)); posList.add(new Integer(pos)); } } } if (posList != null && posList.size() > 0) { intervals=new int[posList.size()]; java.util.Enumeration e = posList.elements(); int i=0; while (e.hasMoreElements()) { intervals[i++] = ((Integer)e.nextElement()).intValue(); } } return intervals; } /** * initialise a range type object from a set of start/end inclusive intervals * @param mrt * @param range */ public static void initRangeType(RangeType mrt, int[] range) { for (int i=0; i