+ public int[] locateMappedRange(int from, int to)
+ {
+ if (map != null)
+ {
+
+ if (from <= to)
+ {
+ from = (map.getFromLowest() < from) ? from : map.getFromLowest();
+ to = (map.getFromHighest() > to) ? to : map.getFromHighest();
+ if (from > to)
+ return null;
+ }
+ else
+ {
+ from = (map.getFromHighest() > from) ? from : map.getFromHighest();
+ to = (map.getFromLowest() < to) ? to : map.getFromLowest();
+ if (from < to)
+ return null;
+ }
+ return map.locateInTo(from, to);
+ }
+ return new int[]
+ { from, to };
+ }
+
+ /**
+ * return a new mapping object with a maplist modifed to only map the visible
+ * regions defined by viscontigs.
+ *
+ * @param viscontigs
+ * @return
+ */
+ public Mapping intersectVisContigs(int[] viscontigs)
+ {
+ Mapping copy = new Mapping(this);
+ if (map != null)
+ {
+ int vpos = 0;
+ int apos = 0;
+ Vector toRange = new Vector();
+ Vector fromRange = new Vector();
+ for (int vc = 0; vc < viscontigs.length; vc += 2)
+ {
+ // find a mapped range in this visible region
+ int[] mpr = locateMappedRange(1+viscontigs[vc], viscontigs[vc + 1]-1);
+ if (mpr != null)
+ {
+ for (int m = 0; m < mpr.length; m += 2)
+ {
+ toRange.addElement(new int[]
+ { mpr[m], mpr[m + 1] });
+ int[] xpos = locateRange(mpr[m], mpr[m + 1]);
+ for (int x = 0; x < xpos.length; x += 2)
+ {
+ fromRange.addElement(new int[]
+ { xpos[x], xpos[x + 1] });
+ }
+ }
+ }
+ }
+ int[] from = new int[fromRange.size()*2];
+ int[] to = new int[toRange.size()*2];
+ int[] r;
+ for (int f=0,fSize=fromRange.size(); f<fSize; f++)
+ {
+ r = (int[]) fromRange.elementAt(f);
+ from[f*2] = r[0];
+ from[f*2+1] = r[1];
+ }
+ for (int f=0,fSize=toRange.size(); f<fSize; f++)
+ {
+ r = (int[]) toRange.elementAt(f);
+ to[f*2] = r[0];
+ to[f*2+1] = r[1];
+ }
+ copy.setMap(new MapList(from, to, map.getFromRatio(), map.getToRatio()));
+ }
+ return copy;
+ }
+ public static void main(String[] args)
+ {
+ /**
+ * trite test of the intersectVisContigs method
+ * for a simple DNA -> Protein exon map and a range of visContigs
+ */
+ MapList fk = new MapList(new int[] { 1,6,8,13,15,23}, new int[] { 1,7}, 3, 1);
+ Mapping m = new Mapping(fk);
+ Mapping m_1 = m.intersectVisContigs(new int[] {fk.getFromLowest(), fk.getFromHighest()});
+ Mapping m_2 = m.intersectVisContigs(new int[] {1,7,11,20});
+ System.out.println(""+m_1.map.getFromRanges());
+
+
+ }
+ /**
+ * get the sequence being mapped to - if any
+ * @return null or a dataset sequence
+ */
+ public SequenceI getTo()
+ {
+ return to;
+ }
+ /**
+ * set the dataset sequence being mapped to if any
+ * @param tto
+ */
+ public void setTo(SequenceI tto)
+ {
+ to = tto;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#finalize()
+ */
+ protected void finalize() throws Throwable
+ {
+ map = null;
+ to = null;
+ super.finalize();