From: jprocter Date: Wed, 24 Jan 2007 17:08:58 +0000 (+0000) Subject: Map arbitrary series of non-overlapping integer intervals on one range to another... X-Git-Tag: Release_2_3~455 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=eb57149512e6f339336a19d88a6da081c5f35843;p=jalview.git Map arbitrary series of non-overlapping integer intervals on one range to another on another range - with an integer ratio for each range --- diff --git a/src/jalview/util/MapList.java b/src/jalview/util/MapList.java new file mode 100644 index 0000000..d76ec33 --- /dev/null +++ b/src/jalview/util/MapList.java @@ -0,0 +1,278 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package jalview.util; + +import java.util.*; + +/** + * MapList + * Simple way of bijectively mapping a non-contiguous linear range to another non-contiguous linear range + * Use at your own risk! + * TODO: efficient implementation of private posMap method + * TODO: test/ensure that sense of from and to ratio start position is conserved (codon start position recovery) + * TODO: optimize to use int[][] arrays rather than vectors. + */ +public class MapList +{ + public Vector fromShifts; + public Vector toShifts; + int fromRatio; // number of steps in fromShifts to one toRatio unit + int toRatio; // number of steps in toShifts to one fromRatio + public MapList(int from[], int to[], int fromRatio, int toRatio) + { + fromShifts = new Vector(); + for (int i=0;ito) { + from = intv[1]; + to=intv[0]; + } + while (iv.hasNext()) { + intv = (int[]) iv.next(); + if (intv[0]to) + to=intv[0]; + if (intv[1]>to) + to=intv[1]; + } + int tF=0,tT=0; + int mp[][] = new int[to-from+2][]; + for (int i=0;itT) { + tT=m[0]; + } + } + } + mp[i] = m; + } + int[][] map=new int[][] { new int[]{from, to, tF, tT}, new int[to-from+2]}; + + map[0][2] = tF; + map[0][3] = tT; + + for (int i=0;i=intv[0] && pos<=intv[1]) { + return new int[] { count+pos-intv[0]+1, +1 }; + } else { + count+=intv[1]-intv[0]+1; + } + } else { + if (pos>=intv[1] && pos<=intv[0]) { + return new int[] { count+intv[0]-pos+1, -1 }; + } else { + count+=intv[0]-intv[1]+1; + } + } + } + return null; + } + /** + * count out pos positions into a series of intervals and return the position + * @param intVals + * @param pos + * @return position pos in interval set + */ + private int[] countToPos(Iterator intVals, int pos) { + int count=0,diff=0,intv[]={0,0}; + while (intVals.hasNext()) { + intv = (int[])intVals.next(); + diff = intv[1]-intv[0]; + if (diff>=0) { + if (pos<=count+1+diff) { + return new int[] { pos-count-1+intv[0],+1 }; + } else { + count+=1+diff; + } + } else { + if (pos<=count+1-diff) { + return new int[] { intv[0]-(pos-count-1),-1 }; + } else { + count+=1-diff; + } + } + } + return null;//(diff<0) ? (intv[1]-1) : (intv[0]+1); + } + public static void testMap(MapList ml, int fromS,int fromE) { + for (int from=1; from<=25; from++) { + int[] too=ml.shiftFrom(from); + System.out.print("ShiftFrom("+from+")=="); + if (too==null) + System.out.print("NaN\n"); + else { + System.out.print(too[0]+" % "+too[1]); + System.out.print("\t+--+\t"); + int[] toofrom=ml.shiftTo(too[0]); + if (toofrom!=null) + System.out.println("ShiftTo("+too[0]+")=="+toofrom[0]+" % "+toofrom[1]); + else + System.out.println("ShiftTo("+too[0]+")=="+"NaN! - not Bijective Mapping!"); + } + } + int mmap[][] = ml.makeFromMap(); + System.out.println("FromMap : ("+mmap[0][0]+" "+mmap[0][1]+" "+mmap[0][2]+" "+mmap[0][3]+" "); + for (int i=1;i<=mmap[1].length; i++) { + if (mmap[1][i-1]==-1) { + System.out.print(i+"=XXX"); + + } else { + System.out.print(i+"="+(mmap[0][2]+mmap[1][i-1])); + } + if (i % 20==0) + System.out.print("\n"); + else + System.out.print(","); + } + System.out.print("\n"); + } + public static void main(String argv[]) { + MapList ml=new MapList(new int[] { 1,5,10,15,25,20}, + new int[] { 51,1}, 1, 3); + MapList ml1=new MapList(new int[] { 1,3,17,4}, + new int[] { 51,1}, 1, 3); + + // test internal consistency + int to[] = new int[51]; + MapList.testMap(ml, 1, 25); + /* + for (int from=1; from<=51; from++) { + int[] too=ml.shiftTo(from); + int[] toofrom=ml.shiftFrom(too[0]); + System.out.println("ShiftFrom("+from+")=="+too[0]+" % "+too[1]+"\t+-+\tShiftTo("+too[0]+")=="+toofrom[0]+" % "+toofrom[1]); + }*/ + System.out.print("Success?\n"); // if we get here - something must be working! + } +}